List:Commits« Previous MessageNext Message »
From:igor Date:April 11 2007 7:56am
Subject:bk commit into 4.1 tree (igor:1.2634) BUG#27484
View as plain text  
Below is the list of changes that have just been committed into a local
4.1 repository of igor. When igor does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-04-10 22:56:38-07:00, igor@stripped +3 -0
  Fixed bug #27484: a crash when incompatible row expressions with nested rows
  are used as arguments of the IN predicate.
  Added a function to check compatibility of row expressions. Made sure that this
  function to be called for Item_func_in objects by fix_length_and_dec().

  mysql-test/r/row.result@stripped, 2007-04-10 22:56:36-07:00, igor@stripped +18 -0
    Added a test case for bug #27484.

  mysql-test/t/row.test@stripped, 2007-04-10 22:56:36-07:00, igor@stripped +25 -0
    Added a test case for bug #27484.

  sql/item_cmpfunc.cc@stripped, 2007-04-10 22:56:36-07:00, igor@stripped +28 -4
    Fixed bug #27484: a crash when incompatible row expressions with nested rows
    are used as arguments of the IN predicate.
    Added a function to check compatibility of row expressions. Made sure that this
    function to be called for Item_func_in objects by fix_length_and_dec().

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	igor
# Host:	olga.mysql.com
# Root:	/home/igor/dev-opt/mysql-4.1-opt-bug27484

--- 1.220/sql/item_cmpfunc.cc	2007-04-10 22:56:42 -07:00
+++ 1.221/sql/item_cmpfunc.cc	2007-04-10 22:56:42 -07:00
@@ -61,6 +61,22 @@
 }
 
 
+static int cmp_row_type(Item* item1, Item* item2)
+{
+  uint n= item1->cols();
+  if (item2->check_cols(n))
+    return 1;
+  for (uint i=0; i<n; i++)
+  {
+    if (item2->el(i)->check_cols(item1->el(i)->cols()) ||
+          item1->el(i)->result_type() == ROW_RESULT &&
+          cmp_row_type(item1->el(i), item2->el(i)))
+      return 1;
+  }
+  return 0;
+}
+
+
 /*
   Aggregates result types from the array of items.
 
@@ -77,12 +93,17 @@
     Aggregation itself is performed by the item_cmp_type() function.
 */
 
-static void agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
+static int agg_cmp_type(THD *thd, Item_result *type, Item **items, uint nitems)
 {
   uint i;
   type[0]= items[0]->result_type();
   for (i= 1 ; i < nitems ; i++)
+  {
     type[0]= item_cmp_type(type[0], items[i]->result_type());
+    if (type[0] == ROW_RESULT && cmp_row_type(items[0], items[i]))
+      return 1;     // error found: invalid usage of rows
+  }
+  return 0;
 }
 
 static void my_coll_agg_error(DTCollation &c1, DTCollation &c2,
@@ -984,7 +1005,8 @@
   */
   if (!args[0] || !args[1] || !args[2])
     return;
-  agg_cmp_type(thd, &cmp_type, args, 3);
+  if ( agg_cmp_type(thd, &cmp_type, args, 3))
+    return;
   if (cmp_type == STRING_RESULT &&
       agg_arg_charsets(cmp_collation, args, 3, MY_COLL_CMP_CONV))
    return;
@@ -1532,7 +1554,8 @@
     for (nagg= 0; nagg < ncases/2 ; nagg++)
       agg[nagg+1]= args[nagg*2];
     nagg++;
-    agg_cmp_type(current_thd, &cmp_type, agg, nagg);
+    if (agg_cmp_type(current_thd, &cmp_type, agg, nagg))
+      return;
     if ((cmp_type == STRING_RESULT) &&
         agg_arg_charsets(cmp_collation, agg, nagg, MY_COLL_CMP_CONV))
     return;
@@ -2013,7 +2036,8 @@
   uint const_itm= 1;
   THD *thd= current_thd;
   
-  agg_cmp_type(thd, &cmp_type, args, arg_count);
+  if (agg_cmp_type(thd, &cmp_type, args, arg_count))
+    return;
 
   if (cmp_type == STRING_RESULT &&
       agg_arg_charsets(cmp_collation, args, arg_count, MY_COLL_CMP_CONV))

--- 1.18/mysql-test/r/row.result	2007-04-10 22:56:42 -07:00
+++ 1.19/mysql-test/r/row.result	2007-04-10 22:56:42 -07:00
@@ -170,3 +170,21 @@
 SELECT ROW(NULL,10) <=> ROW(3,NULL);
 ROW(NULL,10) <=> ROW(3,NULL)
 0
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2)));
+ERROR 21000: Operand should contain 3 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3)));
+ERROR 21000: Operand should contain 2 column(s)
+SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0));
+ERROR 21000: Operand should contain 1 column(s)
+SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2));
+ERROR 21000: Operand should contain 1 column(s)

--- 1.17/mysql-test/t/row.test	2007-04-10 22:56:42 -07:00
+++ 1.18/mysql-test/t/row.test	2007-04-10 22:56:42 -07:00
@@ -83,4 +83,29 @@
 SELECT ROW(2,10) <=> ROW(3,4);
 SELECT ROW(NULL,10) <=> ROW(3,NULL);
 
+#
+# Bug #27484: nested row expressions in IN predicate
+#
+
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,1),ROW(1,ROW(2,3)));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),ROW(1,ROW(2,2,2)));
+--error 1241
+SELECT ROW(1,ROW(2,3,4)) IN (ROW(1,ROW(2,3,4)),ROW(1,ROW(2,2)));
+
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN (ROW(1,ROW(2,3)),(SELECT 1,1),ROW(1,ROW(2,4)));
+--error 1241
+SELECT ROW(1,ROW(2,3)) IN ((SELECT 1,1),ROW(1,ROW(2,3)));
+
+--error 1241
+SELECT ROW(2,1) IN (ROW(21,2),ROW(ROW(1,1,3),0));
+--error 1241
+SELECT ROW(2,1) IN (ROW(ROW(1,1,3),0),ROW(21,2));
+
 # End of 4.1 tests
Thread
bk commit into 4.1 tree (igor:1.2634) BUG#27484igor11 Apr