diff options
author | Alexander Barkov <bar@mariadb.com> | 2020-05-18 11:29:43 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2020-05-19 10:55:39 +0400 |
commit | 06fb78c6acf0cf22ab756e5b89652aa6a5e8485e (patch) | |
tree | 454663c5bdea1e0194f076b25e62574996935e4f /sql/sql_tvc.cc | |
parent | 4869e7f4a8d1e997936de775536bf3708cf99529 (diff) | |
download | mariadb-git-06fb78c6acf0cf22ab756e5b89652aa6a5e8485e.tar.gz |
MDEV-21995 Server crashes in Item_field::real_type_handler with table value constructor
1. Code simplification:
Item_default_value handled all these values:
a. DEFAULT(field)
b. DEFAULT
c. IGNORE
and had various conditions to distinguish (a) from (b) and from (c).
Introducing a new abstract class Item_contextually_typed_value_specification,
to handle (b) and (c), so the hierarchy now looks as follows:
Item
Item_result_field
Item_ident
Item_field
Item_default_value - DEFAULT(field)
Item_contextually_typed_value_specification
Item_default_specification - DEFAULT
Item_ignore_specification - IGNORE
2. Introducing a new virtual method is_evaluable_expression() to
determine if an Item is:
- a normal expression, so its val_xxx()/get_date() methods can be called
- or a just an expression substitute, whose value methods cannot be called.
3. Disallowing Items that are not evalualble expressions in table value
constructors.
Diffstat (limited to 'sql/sql_tvc.cc')
-rw-r--r-- | sql/sql_tvc.cc | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/sql/sql_tvc.cc b/sql/sql_tvc.cc index 92cd229eebb..def519035d9 100644 --- a/sql/sql_tvc.cc +++ b/sql/sql_tvc.cc @@ -59,7 +59,8 @@ bool fix_fields_for_tvc(THD *thd, List_iterator_fast<List_item> &li) while replacing their values to NAME_CONST()s. So fix only those that have not been. */ - if (item->fix_fields_if_needed(thd, 0)) + if (item->fix_fields_if_needed(thd, 0) || + item->check_is_evaluable_expression_or_error()) DBUG_RETURN(true); } } |