summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2005-09-28 00:58:12 +0400
committerunknown <evgen@moonbone.local>2005-09-28 00:58:12 +0400
commita17b3dcbe3d86eaaaabe627139ed09c35828d61c (patch)
treee05cb19624737e0de739d19431a2384437485cb1 /sql
parentab7ec7ee8f4ac8c751c6f0d84d8314154146bf10 (diff)
downloadmariadb-git-a17b3dcbe3d86eaaaabe627139ed09c35828d61c.tar.gz
Fix bug#13356 resolve_const_item() wasn't able to handle Item_row items.
resolve_const_item() assumed to be not called for Item_row items. For ensuring that DBUG_ASSERT(0) was set there. This patch adds section for Item_row items. If it can it recursively calls resolve_const_item() for each item the Item_row contains. If any of the contained items is null then whole Item_row substitued by Item_null. Otherwise it just returns. sql/item.cc: Fix bug#13356 resolve_const_item() wasn't able to handle Item_row items. Added section to resolve_const_item() for Item_row items. If it can it recursively calls resolve_const_item() for each item the Item_row contains. If any of the contained items is null then Item_row is substituted by Item_null. Otherwise it just returns. Comment moved closer to function it belongs to. mysql-test/t/select.test: Test case for bug#13356 resolve_const_item() wasn't able to handle Item_row items. mysql-test/r/select.result: Test case for bug#13356 resolve_const_item() wasn't able to handle Item_row items.
Diffstat (limited to 'sql')
-rw-r--r--sql/item.cc29
1 files changed, 29 insertions, 0 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 010189c321c..03ab38fc970 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -2870,6 +2870,35 @@ void resolve_const_item(THD *thd, Item **ref, Item *comp_item)
new_item= (null_value ? (Item*) new Item_null(name) :
(Item*) new Item_int(name, result, length));
}
+ else if (res_type == ROW_RESULT)
+ {
+ new_item= 0;
+ /*
+ If item and comp_item are both Item_rows and have same number of cols
+ then process items in Item_row one by one. If Item_row contain nulls
+ substitute it by Item_null. Otherwise just return.
+ */
+ if (item->result_type() == comp_item->result_type() &&
+ ((Item_row*)item)->cols() == ((Item_row*)comp_item)->cols())
+ {
+ Item_row *item_row= (Item_row*)item,*comp_item_row= (Item_row*)comp_item;
+ if (item_row->null_inside())
+ new_item= (Item*) new Item_null(name);
+ else
+ {
+ int i= item_row->cols() - 1;
+ for (; i >= 0; i--)
+ {
+ if (item_row->maybe_null && item_row->el(i)->is_null())
+ {
+ new_item= (Item*) new Item_null(name);
+ break;
+ }
+ resolve_const_item(thd, item_row->addr(i), comp_item_row->el(i));
+ }
+ }
+ }
+ }
else
{ // It must REAL_RESULT
double result=item->val();