List:Commits« Previous MessageNext Message »
From:marc.alff Date:December 21 2007 10:53pm
Subject:bk commit into 5.0 tree (malff:1.2583) BUG#33465
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of malff. When malff 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-12-21 15:53:02-07:00, malff@stripped. +9 -0
  Bug#33465 (Temporarily disable fix for bug 26503)
  
  Before this fix, updating the logic in stored procedure using illegal labels in
  exception handler was a mandatory pre-requisite to upgrade from 5.0.39 or older
  to 5.0.40 or newer (or respectively: 5.1.16 or older to 5.1.17 or newer).
  
  With this fix, a server start option --disable-fix-26503=TRUE allows
  to postpone this mandatory upgrade of user code to a later time.
  
  This option is critical when upgrading to a recent server code is needed
  in emergency.

  mysql-test/r/sp_26503_disabled.result@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +149 -0
    added option --disable-fix-26503
    

  mysql-test/r/sp_26503_disabled.result@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +0 -0

  mysql-test/r/sp_26503_enabled.result@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +65 -0
    added option --disable-fix-26503
    

  mysql-test/r/sp_26503_enabled.result@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +0 -0

  mysql-test/t/sp_26503_disabled-master.opt@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +1 -0
    added option --disable-fix-26503
    

  mysql-test/t/sp_26503_disabled-master.opt@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +0 -0

  mysql-test/t/sp_26503_disabled.test@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +96 -0
    added option --disable-fix-26503
    

  mysql-test/t/sp_26503_disabled.test@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +0 -0

  mysql-test/t/sp_26503_enabled-master.opt@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +1 -0
    added option --disable-fix-26503
    

  mysql-test/t/sp_26503_enabled-master.opt@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +0 -0

  mysql-test/t/sp_26503_enabled.test@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +90 -0
    added option --disable-fix-26503
    

  mysql-test/t/sp_26503_enabled.test@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +0 -0

  sql/mysql_priv.h@stripped, 2007-12-21 15:52:53-07:00, malff@stripped. +1 -0
    added option --disable-fix-26503

  sql/mysqld.cc@stripped, 2007-12-21 15:52:58-07:00, malff@stripped. +15 -1
    added option --disable-fix-26503

  sql/sp_pcontext.cc@stripped, 2007-12-21 15:52:59-07:00, malff@stripped. +13 -0
    added option --disable-fix-26503

diff -Nrup a/mysql-test/r/sp_26503_disabled.result b/mysql-test/r/sp_26503_disabled.result
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/r/sp_26503_disabled.result	2007-12-21 15:52:59 -07:00
@@ -0,0 +1,149 @@
+use test;
+drop procedure if exists proc_26503_error_1;
+drop procedure if exists proc_26503_error_2;
+drop procedure if exists proc_26503_error_3;
+drop procedure if exists proc_26503_error_4;
+create procedure proc_26503_error_1()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+begin
+iterate retry;
+end;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+create procedure proc_26503_error_2()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+iterate retry;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+create procedure proc_26503_error_3()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+begin
+leave retry;
+end;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+create procedure proc_26503_error_4()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+leave retry;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+call proc_26503_error_1();
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+call proc_26503_error_2();
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+call proc_26503_error_3();
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+call proc_26503_error_4();
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+do something
+drop procedure proc_26503_error_1;
+drop procedure proc_26503_error_2;
+drop procedure proc_26503_error_3;
+drop procedure proc_26503_error_4;
diff -Nrup a/mysql-test/r/sp_26503_enabled.result b/mysql-test/r/sp_26503_enabled.result
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/r/sp_26503_enabled.result	2007-12-21 15:52:59 -07:00
@@ -0,0 +1,65 @@
+use test;
+drop procedure if exists proc_26503_error_1;
+drop procedure if exists proc_26503_error_2;
+drop procedure if exists proc_26503_error_3;
+drop procedure if exists proc_26503_error_4;
+create procedure proc_26503_error_1()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+begin
+iterate retry;
+end;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+ERROR 42000: ITERATE with no matching label: retry
+create procedure proc_26503_error_2()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+iterate retry;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+ERROR 42000: ITERATE with no matching label: retry
+create procedure proc_26503_error_3()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+begin
+leave retry;
+end;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+ERROR 42000: LEAVE with no matching label: retry
+create procedure proc_26503_error_4()
+begin
+declare x int default 0;
+retry:
+repeat
+begin
+declare continue handler for sqlexception
+leave retry;
+select "do something";
+set x = x + 1;
+end;
+until x = 10 end repeat retry;
+end//
+ERROR 42000: LEAVE with no matching label: retry
diff -Nrup a/mysql-test/t/sp_26503_disabled-master.opt b/mysql-test/t/sp_26503_disabled-master.opt
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/sp_26503_disabled-master.opt	2007-12-21 15:52:59 -07:00
@@ -0,0 +1 @@
+--disable-fix-26503=TRUE
diff -Nrup a/mysql-test/t/sp_26503_disabled.test b/mysql-test/t/sp_26503_disabled.test
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/sp_26503_disabled.test	2007-12-21 15:52:59 -07:00
@@ -0,0 +1,96 @@
+
+use test;
+
+#
+# Bug#26503 (Illegal SQL exception handler code causes the server to crash)
+#
+
+--disable_warnings
+drop procedure if exists proc_26503_error_1;
+drop procedure if exists proc_26503_error_2;
+drop procedure if exists proc_26503_error_3;
+drop procedure if exists proc_26503_error_4;
+--enable_warnings
+
+delimiter //;
+
+create procedure proc_26503_error_1()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+      begin
+        iterate retry;
+      end;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+create procedure proc_26503_error_2()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+        iterate retry;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+create procedure proc_26503_error_3()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+      begin
+        leave retry;
+      end;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+create procedure proc_26503_error_4()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+        leave retry;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+delimiter ;//
+
+call proc_26503_error_1();
+call proc_26503_error_2();
+call proc_26503_error_3();
+call proc_26503_error_4();
+
+drop procedure proc_26503_error_1;
+drop procedure proc_26503_error_2;
+drop procedure proc_26503_error_3;
+drop procedure proc_26503_error_4;
+
diff -Nrup a/mysql-test/t/sp_26503_enabled-master.opt b/mysql-test/t/sp_26503_enabled-master.opt
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/sp_26503_enabled-master.opt	2007-12-21 15:52:59 -07:00
@@ -0,0 +1 @@
+--disable-fix-26503=FALSE
diff -Nrup a/mysql-test/t/sp_26503_enabled.test b/mysql-test/t/sp_26503_enabled.test
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/mysql-test/t/sp_26503_enabled.test	2007-12-21 15:52:59 -07:00
@@ -0,0 +1,90 @@
+
+use test;
+
+#
+# Bug#26503 (Illegal SQL exception handler code causes the server to crash)
+#
+
+--disable_warnings
+drop procedure if exists proc_26503_error_1;
+drop procedure if exists proc_26503_error_2;
+drop procedure if exists proc_26503_error_3;
+drop procedure if exists proc_26503_error_4;
+--enable_warnings
+
+delimiter //;
+
+--error ER_SP_LILABEL_MISMATCH
+create procedure proc_26503_error_1()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+      begin
+        iterate retry;
+      end;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+--error ER_SP_LILABEL_MISMATCH
+create procedure proc_26503_error_2()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+        iterate retry;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+--error ER_SP_LILABEL_MISMATCH
+create procedure proc_26503_error_3()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+      begin
+        leave retry;
+      end;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+--error ER_SP_LILABEL_MISMATCH
+create procedure proc_26503_error_4()
+begin
+  declare x int default 0;
+
+retry:
+  repeat
+    begin
+      declare continue handler for sqlexception
+        leave retry;
+
+      select "do something";
+      set x = x + 1;
+    end;
+  until x = 10 end repeat retry;
+end//
+
+delimiter ;//
+
diff -Nrup a/sql/mysql_priv.h b/sql/mysql_priv.h
--- a/sql/mysql_priv.h	2007-12-13 03:49:12 -07:00
+++ b/sql/mysql_priv.h	2007-12-21 15:52:53 -07:00
@@ -1374,6 +1374,7 @@ extern I_List<i_string> binlog_do_db, bi
 extern const char* any_db;
 extern struct my_option my_long_options[];
 extern const LEX_STRING view_type;
+extern bool opt_disable_fix_26503;
 
 /* optional things, have_* variables */
 
diff -Nrup a/sql/mysqld.cc b/sql/mysqld.cc
--- a/sql/mysqld.cc	2007-12-13 22:53:52 -07:00
+++ b/sql/mysqld.cc	2007-12-21 15:52:58 -07:00
@@ -364,6 +364,8 @@ my_bool locked_in_memory;
 bool opt_using_transactions, using_update_log;
 bool volatile abort_loop;
 bool volatile shutdown_in_progress;
+bool opt_disable_fix_26503= FALSE;
+
 /**
    @brief 'grant_option' is used to indicate if privileges needs
    to be checked, in which case the lock, LOCK_grant, is used
@@ -4866,7 +4868,8 @@ enum options_mysqld
   OPT_INNODB_ROLLBACK_ON_TIMEOUT,
   OPT_SECURE_FILE_PRIV,
   OPT_KEEP_FILES_ON_CREATE,
-  OPT_INNODB_ADAPTIVE_HASH_INDEX
+  OPT_INNODB_ADAPTIVE_HASH_INDEX,
+  OPT_DISABLE_FIX_26503
 };
 
 
@@ -5019,6 +5022,17 @@ Disable with --skip-bdb (will save memor
    (gptr*) &des_key_file, (gptr*) &des_key_file, 0, GET_STR, REQUIRED_ARG,
    0, 0, 0, 0, 0, 0},
 #endif /* HAVE_OPENSSL */
+  {"disable-fix-26503", OPT_DISABLE_FIX_26503,
+   "Deprecated option. With disable-fix-26503=TRUE, the server will accept"
+   " illegal label jumps in exception handlers in stored procedures."
+   " Note that bug#26503 is not fixed, and the server may crash or execute"
+   " invalid SQL logic."
+   " The primary reason for this option is to delay fixing illegal stored procedures"
+   " to a later time (See bug#26503 for details), while allowing emergency unplanned upgrades."
+   " This option is not intended for long term use, illegal user SQL code should be fixed.",
+   (gptr*) &opt_disable_fix_26503,
+   (gptr*) &opt_disable_fix_26503,
+   0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
 #ifdef HAVE_REPLICATION
   {"disconnect-slave-event-count", OPT_DISCONNECT_SLAVE_EVENT_COUNT,
    "Option used by mysql-test for debugging and testing of replication.",
diff -Nrup a/sql/sp_pcontext.cc b/sql/sp_pcontext.cc
--- a/sql/sp_pcontext.cc	2007-03-14 12:02:30 -06:00
+++ b/sql/sp_pcontext.cc	2007-12-21 15:52:59 -07:00
@@ -305,6 +305,19 @@ sp_pcontext::find_label(char *name)
   */
   if (m_parent && (m_label_scope == LABEL_DEFAULT_SCOPE))
     return m_parent->find_label(name);
+
+  if (m_parent && (m_label_scope == LABEL_HANDLER_SCOPE) &&
+      opt_disable_fix_26503)
+  {
+    lab= m_parent->find_label(name);
+    if (lab)
+    {
+      sql_print_error("Allowing illegal use of label <%s> with option disable-fix-26503",
+                      name);
+      return lab;
+    }
+  }
+
   return NULL;
 }
 
Thread
bk commit into 5.0 tree (malff:1.2583) BUG#33465marc.alff21 Dec