[Commits] Rev 3736: Fixed bug mdev-5410. in file:///home/igor/maria/maria-5.3-mdev5410/

Igor Babaev igor at askmonty.org
Thu Dec 12 23:55:34 EET 2013


At file:///home/igor/maria/maria-5.3-mdev5410/

------------------------------------------------------------
revno: 3736
revision-id: igor at askmonty.org-20131212215533-9n040xfc9onhho5o
parent: igor at askmonty.org-20131211181308-k5nwfqsl8pfolwcc
committer: Igor Babaev <igor at askmonty.org>
branch nick: maria-5.3-mdev5410
timestamp: Thu 2013-12-12 13:55:33 -0800
message:
  Fixed bug mdev-5410.
  The fix for bug #27937 was incomplete: it did not handle correctly the queries
  containing UNION with global ORDER BY in subselects.
-------------- next part --------------
=== modified file 'mysql-test/r/ps.result'
--- a/mysql-test/r/ps.result	2012-08-22 14:45:25 +0000
+++ b/mysql-test/r/ps.result	2013-12-12 21:55:33 +0000
@@ -3284,4 +3284,27 @@
 Handler_read_rnd_next	0
 deallocate prepare st;
 drop table t1;
+#
+# Bug mdev-5410: crash at the execution of PS with subselect
+#                formed by UNION with global ORDER BY
+#
+CREATE TABLE t1 (a int DEFAULT NULL);
+INSERT INTO t1 VALUES (2), (4);
+CREATE TABLE t2 (b int DEFAULT NULL);
+INSERT INTO t2 VALUES (1), (3);
+PREPARE stmt FROM "
+SELECT c1 FROM (SELECT (SELECT a FROM t1 WHERE t1.a <= t2.b
+                        UNION ALL
+                        SELECT a FROM t1 WHERE t1.a+3<= t2.b
+                        ORDER BY a DESC) AS c1 FROM t2) t3;
+";
+EXECUTE stmt;
+c1
+NULL
+2
+EXECUTE stmt;
+c1
+NULL
+2
+DROP TABLE t1,t2;
 # End of 5.3 tests

=== modified file 'mysql-test/t/ps.test'
--- a/mysql-test/t/ps.test	2012-08-22 14:45:25 +0000
+++ b/mysql-test/t/ps.test	2013-12-12 21:55:33 +0000
@@ -3308,4 +3308,26 @@
 deallocate prepare st;
 drop table t1;
 
+--echo #
+--echo # Bug mdev-5410: crash at the execution of PS with subselect
+--echo #                formed by UNION with global ORDER BY
+--echo #
+
+CREATE TABLE t1 (a int DEFAULT NULL);
+INSERT INTO t1 VALUES (2), (4);
+CREATE TABLE t2 (b int DEFAULT NULL);
+INSERT INTO t2 VALUES (1), (3);
+ 
+PREPARE stmt FROM "
+SELECT c1 FROM (SELECT (SELECT a FROM t1 WHERE t1.a <= t2.b
+                        UNION ALL
+                        SELECT a FROM t1 WHERE t1.a+3<= t2.b
+                        ORDER BY a DESC) AS c1 FROM t2) t3;
+";
+
+EXECUTE stmt;
+EXECUTE stmt;
+
+DROP TABLE t1,t2;
+ 
 --echo # End of 5.3 tests

=== modified file 'sql/sql_lex.h'
--- a/sql/sql_lex.h	2013-05-03 13:07:13 +0000
+++ b/sql/sql_lex.h	2013-12-12 21:55:33 +0000
@@ -584,7 +584,7 @@
   void print(String *str, enum_query_type query_type);
 
   bool add_fake_select_lex(THD *thd);
-  void init_prepare_fake_select_lex(THD *thd);
+  void init_prepare_fake_select_lex(THD *thd, bool first_execution);
   inline bool is_prepared() { return prepared; }
   bool change_result(select_result_interceptor *result,
                      select_result_interceptor *old_result);

=== modified file 'sql/sql_union.cc'
--- a/sql/sql_union.cc	2013-12-11 18:13:08 +0000
+++ b/sql/sql_union.cc	2013-12-12 21:55:33 +0000
@@ -184,13 +184,15 @@
   SYNOPSIS
     st_select_lex_unit::init_prepare_fake_select_lex()
     thd		- thread handler
+    first_execution - TRUE at the first execution of the union 
 
   RETURN
     options of SELECT
 */
 
 void
-st_select_lex_unit::init_prepare_fake_select_lex(THD *thd_arg) 
+st_select_lex_unit::init_prepare_fake_select_lex(THD *thd_arg,
+                                                  bool first_execution) 
 {
   thd_arg->lex->current_select= fake_select_lex;
   fake_select_lex->table_list.link_in_list(&result_table_list,
@@ -198,7 +200,13 @@
   fake_select_lex->context.table_list= 
     fake_select_lex->context.first_name_resolution_table= 
     fake_select_lex->get_table_list();
-  if (!fake_select_lex->first_execution)
+  /*
+    The flag fake_select_lex->first_execution indicates whether this is
+    called at the first execution of the statement, while first_execution
+    shows whether this is called at the first execution of the union that
+    may form just a subselect.
+  */    
+  if (!fake_select_lex->first_execution && first_execution)
   {
     for (ORDER *order= global_parameters->order_list.first;
          order;
@@ -472,7 +480,7 @@
       {
         /* Validate the global parameters of this union */
 
-	init_prepare_fake_select_lex(thd);
+	init_prepare_fake_select_lex(thd, TRUE);
         /* Should be done only once (the only item_list per statement) */
         DBUG_ASSERT(fake_select_lex->join == 0);
 	if (!(fake_select_lex->join= new JOIN(thd, item_list, thd->options,
@@ -612,6 +620,7 @@
   SELECT_LEX *select_cursor=first_select();
   ulonglong add_rows=0;
   ha_rows examined_rows= 0;
+  bool first_execution= !executed;
   DBUG_ENTER("st_select_lex_unit::exec");
 
   if (executed && !uncacheable && !describe)
@@ -714,7 +723,7 @@
     if (!thd->is_fatal_error)				// Check if EOM
     {
       set_limit(global_parameters);
-      init_prepare_fake_select_lex(thd);
+      init_prepare_fake_select_lex(thd, first_execution);
       JOIN *join= fake_select_lex->join;
       if (!join)
       {



More information about the commits mailing list