Commit a17b3dcb authored by unknown's avatar unknown
Browse files

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.
parent ab7ec7ee
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -2617,3 +2617,12 @@ select found_rows();
found_rows()
1
DROP TABLE t1;
create table t1(f1 int, f2 int);
create table t2(f3 int);
select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,1));
f1
select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1));
f1
select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL));
f1
drop table t1,t2;
+10 −0
Original line number Diff line number Diff line
@@ -2164,4 +2164,14 @@ select found_rows();

DROP TABLE t1;

#
# Bug #13356 assertion failed in resolve_const_item()
#
create table t1(f1 int, f2 int);
create table t2(f3 int);
select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,1));
select f1 from t1,t2 where f1=f2 and (f1,NULL) = ((1,1));
select f1 from t1,t2 where f1=f2 and (f1,f2) = ((1,NULL));
drop table t1,t2; 

# End of 4.1 tests
+29 −0
Original line number Diff line number Diff line
@@ -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();