diff options
Diffstat (limited to 'sql/item_row.cc')
-rw-r--r-- | sql/item_row.cc | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/sql/item_row.cc b/sql/item_row.cc index 85a81a50256..355228e45df 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -18,7 +18,7 @@ #include "assert.h" Item_row::Item_row(List<Item> &arg): - Item(), array_holder(1), used_tables_cache(0), const_item_cache(1) + Item(), used_tables_cache(0), array_holder(1), const_item_cache(1) { //TODO: think placing 2-3 component items in item (as it done for function) @@ -41,7 +41,7 @@ void Item_row::illegal_method_call(const char *method) DBUG_ENTER("Item_row::illegal_method_call"); DBUG_PRINT("error", ("!!! %s method was called for row item", method)); DBUG_ASSERT(0); - my_error(ER_CARDINALITY_COL, MYF(0), arg_count); + my_error(ER_CARDINALITY_COL, MYF(0), 1); DBUG_VOID_RETURN; } @@ -54,7 +54,16 @@ bool Item_row::fix_fields(THD *thd, TABLE_LIST *tabl, Item **ref) if (items[i]->fix_fields(thd, tabl, items+i)) return 1; used_tables_cache |= items[i]->used_tables(); - const_item_cache&= items[i]->const_item(); + if (const_item_cache&= items[i]->const_item() && !with_null) + { + if (items[i]->cols() > 1) + with_null|= items[i]->null_inside(); + else + { + items[i]->val_int(); + with_null|= items[i]->null_value; + } + } maybe_null|= items[i]->maybe_null; } return 0; @@ -82,21 +91,24 @@ bool Item_row::check_cols(uint c) return 0; } -bool Item_row::null_inside() +void Item_row::bring_value() { for (uint i= 0; i < arg_count; i++) - { - if (items[i]->cols() > 1) - { - if (items[i]->null_inside()) - return 1; - } - else - { - items[i]->val_int(); - if (items[i]->null_value) - return 1; - } - } + items[i]->bring_value(); +} + +void Item_row::set_outer_resolving() +{ + for (uint i= 0; i < arg_count; i++) + items[i]->set_outer_resolving(); +} + +bool Item_row::check_loop(uint id) +{ + if (Item::check_loop(id)) + return 1; + for (uint i= 0; i < arg_count; i++) + if (items[i]->check_loop(id)) + return 1; return 0; } |