MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:<gshchepa Date:March 14 2008 7:12pm
Subject:bk commit into 5.0 tree (gshchepa:1.2598) BUG#34763
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of gshchepa.  When gshchepa 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, 2008-03-14 23:11:59+04:00, gshchepa@stripped +4 -0
  Fixed bug #34763.
  
  Queries like:
  
    SELECT ROW(1, 2) IN (SELECT t1.a, 2)
      FROM t1 GROUP BY t1.a
  
  or 
  
    SELECT ROW(1, 2) IN (SELECT t1.a, 2 FROM t2)
      FROM t1 GROUP BY t1.a
  
  lead to assertion failure in the
  Item_in_subselect::row_value_transformer method in debugging
  build, or to unexpected error message in release build:
  
    ERROR 1247 (42S22): Reference '<list ref>' not supported (forward
                        reference in item list)
  
  Unexpected error message and assertion failure have been
  eliminated.

  mysql-test/r/subselect3.result@stripped, 2008-03-14 22:55:55+04:00, gshchepa@stripped +12 -1
    Added test case for bug #34763.

  mysql-test/t/subselect3.test@stripped, 2008-03-14 22:55:58+04:00, gshchepa@stripped +18 -1
    Added test case for bug #34763.

  sql/item.cc@stripped, 2008-03-14 22:55:59+04:00, gshchepa@stripped +9 -6
    Fixed bug #34763.
    The Item_ref::fix_fields method has been modified to silently
    ignore not fixed outer references: by the definition, those
    references should be fixed later by the call to the
    fix_inner_refs function.

  sql/item_subselect.cc@stripped, 2008-03-14 22:56:00+04:00, gshchepa@stripped +10 -2
    Fixed bug #34763.
    The Item_in_subselect::row_value_transformer method has been
    modified to eliminate assertion failure on not fixed outer
    references: by the definition those references are allowed in
    this context and should be fixed later by the call to the
    fix_inner_refs function.

diff -Nrup a/mysql-test/r/subselect3.result b/mysql-test/r/subselect3.result
--- a/mysql-test/r/subselect3.result	2007-11-21 13:40:04 +04:00
+++ b/mysql-test/r/subselect3.result	2008-03-14 22:55:55 +04:00
@@ -758,5 +758,16 @@ EXPLAIN SELECT a FROM t1 WHERE a NOT IN 
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	4	Using where
 2	DEPENDENT SUBQUERY	t2	unique_subquery	PRIMARY	PRIMARY	4	func	1	Using index; Using where
-DROP TABLE t1;
+DROP TABLE t1, t2;
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES(1);
+CREATE TABLE t2 (placeholder CHAR(11));
+INSERT INTO t2 VALUES("placeholder");
+SELECT ROW(1, 2) IN (SELECT t1.a, 2)         FROM t1 GROUP BY t1.a;
+ROW(1, 2) IN (SELECT t1.a, 2)
+1
+SELECT ROW(1, 2) IN (SELECT t1.a, 2 FROM t2) FROM t1 GROUP BY t1.a;
+ROW(1, 2) IN (SELECT t1.a, 2 FROM t2)
+1
+DROP TABLE t1, t2;
 End of 5.0 tests
diff -Nrup a/mysql-test/t/subselect3.test b/mysql-test/t/subselect3.test
--- a/mysql-test/t/subselect3.test	2007-06-02 03:42:03 +05:00
+++ b/mysql-test/t/subselect3.test	2008-03-14 22:55:58 +04:00
@@ -586,6 +586,23 @@ SELECT a FROM t1 WHERE a NOT IN (65,66);
 SELECT a FROM t1 WHERE a NOT IN (SELECT a FROM t2);
 EXPLAIN SELECT a FROM t1 WHERE a NOT IN (SELECT a FROM t2);
 
-DROP TABLE t1;
+DROP TABLE t1, t2;
+
+#
+# Bug #34763: item_subselect.cc:1235:Item_in_subselect::row_value_transformer:
+#             Assertion failed, unexpected error message:
+#             ERROR 1247 (42S22): Reference '<list ref>' not supported (forward
+#             reference in item list)
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES(1);
+
+CREATE TABLE t2 (placeholder CHAR(11));
+INSERT INTO t2 VALUES("placeholder");
+
+SELECT ROW(1, 2) IN (SELECT t1.a, 2)         FROM t1 GROUP BY t1.a;
+SELECT ROW(1, 2) IN (SELECT t1.a, 2 FROM t2) FROM t1 GROUP BY t1.a;
+
+DROP TABLE t1, t2;
 
 --echo End of 5.0 tests
diff -Nrup a/sql/item.cc b/sql/item.cc
--- a/sql/item.cc	2008-02-17 17:57:06 +04:00
+++ b/sql/item.cc	2008-03-14 22:55:59 +04:00
@@ -5451,13 +5451,16 @@ bool Item_ref::fix_fields(THD *thd, Item
   DBUG_ASSERT(*ref);
   /*
     Check if this is an incorrect reference in a group function or forward
-    reference. Do not issue an error if this is an unnamed reference inside an
-    aggregate function.
+    reference. Do not issue an error if this is:
+      1. outer reference (will be fixed later by the fix_inner_refs function);
+      2. an unnamed reference inside an aggregate function.
   */
-  if (((*ref)->with_sum_func && name &&
-       !(current_sel->linkage != GLOBAL_OPTIONS_TYPE &&
-         current_sel->having_fix_field)) ||
-      !(*ref)->fixed)
+  if (!((*ref)->type() == REF_ITEM &&
+       ((Item_ref *)(*ref))->ref_type() == OUTER_REF) &&
+      (((*ref)->with_sum_func && name &&
+        !(current_sel->linkage != GLOBAL_OPTIONS_TYPE &&
+          current_sel->having_fix_field)) ||
+       !(*ref)->fixed))
   {
     my_error(ER_ILLEGAL_REFERENCE, MYF(0),
              name, ((*ref)->with_sum_func?
diff -Nrup a/sql/item_subselect.cc b/sql/item_subselect.cc
--- a/sql/item_subselect.cc	2007-11-20 01:06:48 +04:00
+++ b/sql/item_subselect.cc	2008-03-14 22:56:00 +04:00
@@ -1232,7 +1232,11 @@ Item_in_subselect::row_value_transformer
     Item *item_having_part2= 0;
     for (uint i= 0; i < cols_num; i++)
     {
-      DBUG_ASSERT(left_expr->fixed && select_lex->ref_pointer_array[i]->fixed);
+      DBUG_ASSERT(left_expr->fixed &&
+                  select_lex->ref_pointer_array[i]->fixed ||
+                  (select_lex->ref_pointer_array[i]->type() == REF_ITEM &&
+                   ((Item_ref*)(select_lex->ref_pointer_array[i]))->ref_type() ==
+                    Item_ref::OUTER_REF));
       if (select_lex->ref_pointer_array[i]->
           check_cols(left_expr->element_index(i)->cols()))
         DBUG_RETURN(RES_ERROR);
@@ -1306,7 +1310,11 @@ Item_in_subselect::row_value_transformer
     for (uint i= 0; i < cols_num; i++)
     {
       Item *item, *item_isnull;
-      DBUG_ASSERT(left_expr->fixed && select_lex->ref_pointer_array[i]->fixed);
+      DBUG_ASSERT(left_expr->fixed &&
+                  select_lex->ref_pointer_array[i]->fixed ||
+                  (select_lex->ref_pointer_array[i]->type() == REF_ITEM &&
+                   ((Item_ref*)(select_lex->ref_pointer_array[i]))->ref_type() ==
+                    Item_ref::OUTER_REF));
       if (select_lex->ref_pointer_array[i]->
           check_cols(left_expr->element_index(i)->cols()))
         DBUG_RETURN(RES_ERROR);
Thread
bk commit into 5.0 tree (gshchepa:1.2598) BUG#34763gshchepa14 Mar