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#33465 | marc.alff | 21 Dec |