List:Internals« Previous MessageNext Message »
From:pem Date:September 13 2005 5:49pm
Subject:bk commit into 5.0 tree (pem:1.1950) BUG#12712
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of pem. When pem 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
  1.1950 05/09/13 17:16:12 pem@stripped +7 -0
  Fixed BUG#12712: SET AUTOCOMMIT should fail within SP/functions/triggers
    Second version after review. Allow 'set autocommit' in procedures, but not
    functions or triggers. Can return error in run-time (when a function calls
    a procedure).

  sql/sql_yacc.yy
    1.422 05/09/13 17:16:05 pem@stripped +9 -0
    Disallow setting AUTOCOMMIT in stored function and triggers.

  sql/sp_head.h
    1.69 05/09/13 17:16:05 pem@stripped +4 -1
    New flag: has 'set autocommit', and testing for this in is_not_allowed_in_function().

  sql/share/errmsg.txt
    1.43 05/09/13 17:16:05 pem@stripped +2 -0
    New error message for disallowing the setting of autocommit in stored functions and
triggers.

  sql/set_var.h
    1.71 05/09/13 17:16:05 pem@stripped +1 -0
    Made sys_autocommit external, to allow testing in sql_yacc.yy.

  sql/set_var.cc
    1.140 05/09/13 17:16:05 pem@stripped +4 -4
    Made sys_autocommit external, to allow testing in sql_yacc.yy.

  mysql-test/t/sp-error.test
    1.87 05/09/13 17:16:05 pem@stripped +58 -0
    New test case for BUG#12712.

  mysql-test/r/sp-error.result
    1.83 05/09/13 17:16:04 pem@stripped +47 -0
    New test case for BUG#12712.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	pem
# Host:	mysql.comhem.se
# Root:	/usr/home/pem/mysql-5.0

--- 1.421/sql/sql_yacc.yy	2005-09-13 12:50:11 +02:00
+++ 1.422/sql/sql_yacc.yy	2005-09-13 17:16:05 +02:00
@@ -8004,6 +8004,15 @@
             if (tmp == &sys_time_zone &&
                 lex->add_time_zone_tables_to_query_tables(YYTHD))
               YYABORT;
+            else
+              if (spc && tmp == &sys_autocommit)
+              {
+                /*
+                  We don't allow setting AUTOCOMMIT from a stored function
+		  or trigger.
+                */
+                lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
+              }
 	  }
 	  else
 	  {

--- 1.42/sql/share/errmsg.txt	2005-09-03 01:25:41 +02:00
+++ 1.43/sql/share/errmsg.txt	2005-09-13 17:16:05 +02:00
@@ -5403,3 +5403,5 @@
         eng "The definition of table '%-.64s' prevents operation %s on table '%-.64s'."
 ER_PS_NO_RECURSION
         eng "The prepared statement contains a stored routine call that refers to that
same statement. It's not allowed to execute a prepared statement in such a recursive
manner"
+ER_SP_CANT_SET_AUTOCOMMIT
+	eng "Not allowed to set autocommit from a stored function or trigger"

--- 1.139/sql/set_var.cc	2005-09-07 12:36:58 +02:00
+++ 1.140/sql/set_var.cc	2005-09-13 17:16:05 +02:00
@@ -447,10 +447,10 @@
 
 /* Variables that are bits in THD */
 
-static sys_var_thd_bit	sys_autocommit("autocommit", 0,
-				       set_option_autocommit,
-				       OPTION_NOT_AUTOCOMMIT,
-				       1);
+sys_var_thd_bit sys_autocommit("autocommit", 0,
+                               set_option_autocommit,
+                               OPTION_NOT_AUTOCOMMIT,
+                               1);
 static sys_var_thd_bit	sys_big_tables("big_tables", 0,
 				       set_option_bit,
 				       OPTION_BIG_TABLES);

--- 1.70/sql/set_var.h	2005-09-07 12:36:58 +02:00
+++ 1.71/sql/set_var.h	2005-09-13 17:16:05 +02:00
@@ -905,6 +905,7 @@
 extern sys_var_str sys_init_connect;
 extern sys_var_str sys_init_slave;
 extern sys_var_thd_time_zone sys_time_zone;
+extern sys_var_thd_bit sys_autocommit;
 CHARSET_INFO *get_old_charset_by_name(const char *old_name);
 gptr find_named(I_List<NAMED_LIST> *list, const char *name, uint length,
 		NAMED_LIST **found);

--- 1.82/mysql-test/r/sp-error.result	2005-09-07 21:03:50 +02:00
+++ 1.83/mysql-test/r/sp-error.result	2005-09-13 17:16:04 +02:00
@@ -786,3 +786,50 @@
 ERROR 0A000: HANDLER is not allowed in stored procedures
 SELECT bug12995()|
 ERROR 42000: FUNCTION test.bug12995 does not exist
+drop procedure if exists bug12712;
+drop function if exists bug12712;
+create procedure bug12712()
+set session autocommit = 0;
+select @@autocommit;
+@@autocommit
+1
+set @au = @@autocommit;
+call bug12712();
+select @@autocommit;
+@@autocommit
+0
+set session autocommit = @au;
+create function bug12712()
+returns int
+begin
+call bug12712();
+return 0;
+end|
+set @x = bug12712()|
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger
+drop procedure bug12712|
+drop function bug12712|
+create function bug12712()
+returns int
+begin
+set session autocommit = 0;
+return 0;
+end|
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger
+create function bug12712()
+returns int
+begin
+set @@autocommit = 0;
+return 0;
+end|
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger
+create function bug12712()
+returns int
+begin
+set local autocommit = 0;
+return 0;
+end|
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger
+create trigger bug12712
+before insert on t1 for each row set session autocommit = 0;
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger

--- 1.86/mysql-test/t/sp-error.test	2005-09-07 21:03:50 +02:00
+++ 1.87/mysql-test/t/sp-error.test	2005-09-13 17:16:05 +02:00
@@ -1130,6 +1130,64 @@
 SELECT bug12995()|
 delimiter ;|
 
+
+#
+# BUG#12712: SET AUTOCOMMIT should fail within SP/functions/triggers
+#
+--disable_warnings
+drop procedure if exists bug12712;
+drop function if exists bug12712;
+--enable_warnings
+# Can...
+create procedure bug12712()
+  set session autocommit = 0;
+
+select @@autocommit;
+set @au = @@autocommit;
+call bug12712();
+select @@autocommit;
+set session autocommit = @au;
+
+delimiter |;
+create function bug12712()
+  returns int
+begin
+  call bug12712();
+  return 0;
+end|
+
+# Can't...
+--error ER_SP_CANT_SET_AUTOCOMMIT
+set @x = bug12712()|
+drop procedure bug12712|
+drop function bug12712|
+--error ER_SP_CANT_SET_AUTOCOMMIT
+create function bug12712()
+    returns int
+begin
+  set session autocommit = 0;
+  return 0;
+end|
+--error ER_SP_CANT_SET_AUTOCOMMIT
+create function bug12712()
+    returns int
+begin
+  set @@autocommit = 0;
+  return 0;
+end|
+--error ER_SP_CANT_SET_AUTOCOMMIT
+create function bug12712()
+    returns int
+begin
+  set local autocommit = 0;
+  return 0;
+end|
+delimiter ;|
+--error ER_SP_CANT_SET_AUTOCOMMIT
+create trigger bug12712
+  before insert on t1 for each row set session autocommit = 0;
+
+
 #
 # BUG#NNNN: New bug synopsis
 #

--- 1.68/sql/sp_head.h	2005-09-07 17:39:41 +02:00
+++ 1.69/sql/sp_head.h	2005-09-13 17:16:05 +02:00
@@ -114,7 +114,8 @@
     IN_HANDLER= 4,              // Is set if the parser is in a handler body
     MULTI_RESULTS= 8,           // Is set if a procedure with SELECT(s)
     CONTAINS_DYNAMIC_SQL= 16,   // Is set if a procedure with PREPARE/EXECUTE
-    IS_INVOKED= 32              // Is set if this sp_head is being used.
+    IS_INVOKED= 32,             // Is set if this sp_head is being used
+    HAS_SET_AUTOCOMMIT_STMT = 64 // Is set if a procedure with 'set autocommit'
   };
 
   int m_type;			// TYPE_ENUM_FUNCTION or TYPE_ENUM_PROCEDURE
@@ -282,6 +283,8 @@
       my_error(ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0), "Dynamic SQL");
     else if (m_flags & MULTI_RESULTS)
       my_error(ER_SP_NO_RETSET, MYF(0), where);
+    else if (m_flags & HAS_SET_AUTOCOMMIT_STMT)
+      my_error(ER_SP_CANT_SET_AUTOCOMMIT, MYF(0));
     return test(m_flags & (CONTAINS_DYNAMIC_SQL|MULTI_RESULTS));
   }
 private:
Thread
bk commit into 5.0 tree (pem:1.1950) BUG#12712pem13 Sep