List:Commits« Previous MessageNext Message »
From:<gshchepa Date:August 1 2007 11:46pm
Subject:bk commit into 5.0 tree (gshchepa:1.2492) BUG#27352
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of uchum. When uchum 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-08-02 04:46:21+05:00, gshchepa@stripped +5 -0
  Fixed bug #27352.
  The SELECT query with more than 31 nested dependant SELECT queries returned
  wrong result.
  
  New error message has been added: ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT.
  It will be reported as: "Too high level of nesting for select".

  mysql-test/r/select.result@stripped, 2007-08-02 04:45:10+05:00, gshchepa@stripped +10 -0
    Updated test case for bug #27352.

  mysql-test/t/select.test@stripped, 2007-08-02 04:45:05+05:00, gshchepa@stripped +30 -0
    Updated test case for bug #27352.

  sql/share/errmsg.txt@stripped, 2007-08-02 04:45:11+05:00, gshchepa@stripped +2 -0
    Fixed bug #27352.
    New error message has been added: ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT.

  sql/sql_parse.cc@stripped, 2007-08-02 04:44:40+05:00, gshchepa@stripped +5 -0
    Fixed bug #27352.
    The Item_sum::register_sum_func method has been modified to return
    TRUE on exceeding of allowed level of SELECT nesting and to report
    corresponding error massage.

  sql/unireg.h@stripped, 2007-08-02 04:45:02+05:00, gshchepa@stripped +2 -0
    Fixed bug #27352.
    Constant definition has been added: maximal allowed level of SELECT nesting.

diff -Nrup a/mysql-test/r/select.result b/mysql-test/r/select.result
--- a/mysql-test/r/select.result	2007-04-10 21:08:06 +05:00
+++ b/mysql-test/r/select.result	2007-08-02 04:45:10 +05:00
@@ -3995,4 +3995,14 @@ id	select_type	table	type	possible_keys	
 1	SIMPLE	f1	index	inx	inx	10	NULL	7	Using where; Using index
 1	SIMPLE	f2	ref	inx	inx	5	test.f1.b	1	Using where; Using index
 DROP TABLE t1;
+CREATE TABLE t1 (c1 INT, c2 INT);
+INSERT INTO t1 VALUES (1,11), (2,22), (2,22);
+EXPLAIN SELECT c1 FROM t1 WHERE (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT COUNT(c2)))))))))))))))))))))))))))))))) > 0;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	3	Using where
+31	DEPENDENT SUBQUERY	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
+32	DEPENDENT SUBQUERY	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
+EXPLAIN SELECT c1 FROM t1 WHERE (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT COUNT(c2))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) > 0;
+ERROR HY000: Too high level of nesting for select
+DROP TABLE t1;
 End of 5.0 tests
diff -Nrup a/mysql-test/t/select.test b/mysql-test/t/select.test
--- a/mysql-test/t/select.test	2007-04-10 21:08:06 +05:00
+++ b/mysql-test/t/select.test	2007-08-02 04:45:05 +05:00
@@ -3370,4 +3370,34 @@ EXPLAIN SELECT COUNT(*) FROM t1 f1 INNER
     WHERE 1 AND f1.b NOT IN (100,2232,3343,51111);
 DROP TABLE t1;    
 
+#
+# Bug #27352: Incorrect result of nested selects instead of error reporting
+#
+
+CREATE TABLE t1 (c1 INT, c2 INT);
+INSERT INTO t1 VALUES (1,11), (2,22), (2,22);
+
+let $n= 31;
+let $q= COUNT(c2);
+while ($n)
+{
+  let $q= (SELECT $q);
+  dec $n;
+}
+--disable_warnings
+eval EXPLAIN SELECT c1 FROM t1 WHERE $q > 0;
+--enable_warnings
+
+let $n= 64;
+let $q= COUNT(c2);
+while ($n)
+{
+  let $q= (SELECT $q);
+  dec $n;
+}
+--error ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT
+eval EXPLAIN SELECT c1 FROM t1 WHERE $q > 0;
+
+DROP TABLE t1;
+
 --echo End of 5.0 tests
diff -Nrup a/sql/share/errmsg.txt b/sql/share/errmsg.txt
--- a/sql/share/errmsg.txt	2007-06-06 04:42:39 +05:00
+++ b/sql/share/errmsg.txt	2007-08-02 04:45:11 +05:00
@@ -5635,3 +5635,5 @@ ER_NON_INSERTABLE_TABLE  
 	eng "The target table %-.100s of the %s is not insertable-into"
 ER_ADMIN_WRONG_MRG_TABLE
 	eng "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist"
+ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT
+	eng "Too high level of nesting for select"
diff -Nrup a/sql/sql_parse.cc b/sql/sql_parse.cc
--- a/sql/sql_parse.cc	2007-07-17 00:40:30 +05:00
+++ b/sql/sql_parse.cc	2007-08-02 04:44:40 +05:00
@@ -5889,6 +5889,11 @@ mysql_new_select(LEX *lex, bool move_dow
   select_lex->init_query();
   select_lex->init_select();
   lex->nest_level++;
+  if (lex->nest_level > (int) MAX_SELECT_NESTING)
+  {
+    my_error(ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT,MYF(0),MAX_SELECT_NESTING);
+    return TRUE;
+  }
   select_lex->nest_level= lex->nest_level;
   /*
     Don't evaluate this subquery during statement prepare even if
diff -Nrup a/sql/unireg.h b/sql/unireg.h
--- a/sql/unireg.h	2007-07-05 15:34:11 +05:00
+++ b/sql/unireg.h	2007-08-02 04:45:02 +05:00
@@ -81,6 +81,8 @@
                            RAND_TABLE_BIT)
 #define MAX_FIELDS	4096			/* Limit in the .frm file */
 
+#define MAX_SELECT_NESTING (sizeof(nesting_map)*8-1)
+
 #define MAX_SORT_MEMORY (2048*1024-MALLOC_OVERHEAD)
 #define MIN_SORT_MEMORY (32*1024-MALLOC_OVERHEAD)
 
Thread
bk commit into 5.0 tree (gshchepa:1.2492) BUG#27352gshchepa2 Aug