diff options
author | unknown <evgen@moonbone.local> | 2005-09-28 00:58:12 +0400 |
---|---|---|
committer | unknown <evgen@moonbone.local> | 2005-09-28 00:58:12 +0400 |
commit | a17b3dcbe3d86eaaaabe627139ed09c35828d61c (patch) | |
tree | e05cb19624737e0de739d19431a2384437485cb1 /sql | |
parent | ab7ec7ee8f4ac8c751c6f0d84d8314154146bf10 (diff) | |
download | mariadb-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.cc | 29 |
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(); |