summaryrefslogtreecommitdiff
path: root/sql/item_row.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/item_row.cc')
-rw-r--r--sql/item_row.cc46
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;
}