List:Commits« Previous MessageNext Message »
From:Davi Arnaut Date:October 30 2007 11:51pm
Subject:bk commit into 5.1 tree (davi:1.2598) BUG#30904
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of davi. When davi 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-10-30 20:51:04-02:00, davi@stripped +5 -0
  Bug#30904 SET PASSWORD statement is non-transactional
  
  The SET PASSWORD statement is non-transactional (no explicit transaction
  boundaries) in nature and hence is forbidden inside stored functions and
  triggers, but it weren't being effectively forbidden.
  
  The implemented fix is to issue a implicit commit with every SET PASSWORD
  statement, effectively prohibiting these statements in stored functions
  and triggers. 

  mysql-test/r/sp-error.result@stripped, 2007-10-30 20:51:01-02:00, davi@stripped +10 -0
    Add test case result for Bug#30904

  mysql-test/t/sp-error.test@stripped, 2007-10-30 20:51:01-02:00, davi@stripped +19 -0
    Add test case for Bug#30904

  sql/sql_lex.h@stripped, 2007-10-30 20:51:01-02:00, davi@stripped +1 -1
    Add variable to set that a statement with SET PASSWORD causes a implicit
    commit.

  sql/sql_parse.cc@stripped, 2007-10-30 20:51:02-02:00, davi@stripped +4 -0
    End active transaction in SET PASSWORD.

  sql/sql_yacc.yy@stripped, 2007-10-30 20:51:02-02:00, davi@stripped +8 -0
    Set the correct flag on SET PASSWORD if inside a SP, thus effectively
    prohibiting SET PASSWORD statements in stored functions and triggers.

diff -Nrup a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result
--- a/mysql-test/r/sp-error.result	2007-10-17 00:47:02 -02:00
+++ b/mysql-test/r/sp-error.result	2007-10-30 20:51:01 -02:00
@@ -1523,3 +1523,13 @@ ERROR 42000: You have an error in your S
 SELECT ..inexistent();
 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.inexistent()' at line 1
 USE test;
+create function f1() returns int
+begin
+set @test = 1, password = password('foo');
+return 1;
+end|
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger
+create trigger t1
+before insert on t2 for each row set password = password('foo');
+delimiter ;|
+ERROR HY000: Not allowed to set autocommit from a stored function or trigger
diff -Nrup a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test
--- a/mysql-test/t/sp-error.test	2007-10-16 19:41:27 -02:00
+++ b/mysql-test/t/sp-error.test	2007-10-30 20:51:01 -02:00
@@ -2223,6 +2223,25 @@ SELECT ..inexistent();
 USE test;
 
 #
+# Bug#30904 SET PASSWORD statement is non-transactional
+#
+
+delimiter |;
+
+--error ER_SP_CANT_SET_AUTOCOMMIT
+create function f1() returns int
+begin
+  set @test = 1, password = password('foo');
+  return 1;
+end|
+
+--error ER_SP_CANT_SET_AUTOCOMMIT
+create trigger t1
+  before insert on t2 for each row set password = password('foo');
+
+delimiter ;|
+
+#
 # BUG#NNNN: New bug synopsis
 #
 #--disable_warnings
diff -Nrup a/sql/sql_lex.h b/sql/sql_lex.h
--- a/sql/sql_lex.h	2007-10-23 12:02:25 -02:00
+++ b/sql/sql_lex.h	2007-10-30 20:51:01 -02:00
@@ -1616,7 +1616,7 @@ typedef struct st_lex : public Query_tab
   uint8 create_view_algorithm;
   uint8 create_view_check;
   bool drop_if_exists, drop_temporary, local_file, one_shot_set;
-
+  bool autocommit;
   bool verbose, no_write_to_binlog;
 
   bool tx_chain, tx_release;
diff -Nrup a/sql/sql_parse.cc b/sql/sql_parse.cc
--- a/sql/sql_parse.cc	2007-10-30 15:08:12 -02:00
+++ b/sql/sql_parse.cc	2007-10-30 20:51:02 -02:00
@@ -3053,6 +3053,10 @@ end_with_restore_list:
   case SQLCOM_SET_OPTION:
   {
     List<set_var_base> *lex_var_list= &lex->var_list;
+
+    if (lex->autocommit && end_active_trans(thd))
+      goto error;
+
     if ((check_table_access(thd, SELECT_ACL, all_tables, 0) ||
 	 open_and_lock_tables(thd, all_tables)))
       goto error;
diff -Nrup a/sql/sql_yacc.yy b/sql/sql_yacc.yy
--- a/sql/sql_yacc.yy	2007-10-30 15:08:13 -02:00
+++ b/sql/sql_yacc.yy	2007-10-30 20:51:02 -02:00
@@ -10516,6 +10516,7 @@ set:
             lex->option_type=OPT_SESSION;
             lex->var_list.empty();
             lex->one_shot_set= 0;
+            lex->autocommit= 0;
           }
           option_value_list
           {}
@@ -10558,6 +10559,7 @@ option_type_value:
               lex->option_type=OPT_SESSION;
               lex->var_list.empty();
               lex->one_shot_set= 0;
+              lex->autocommit= 0;
               lex->sphead->m_tmp_query= lip->get_tok_start();
             }
           }
@@ -10799,10 +10801,16 @@ option_value:
             user->host=null_lex_str;
             user->user.str=thd->security_ctx->priv_user;
             thd->lex->var_list.push_back(new set_var_password(user, $3));
+            thd->lex->autocommit= TRUE;
+            if (lex->sphead)
+              lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
           }
         | PASSWORD FOR_SYM user equal text_or_password
           {
             Lex->var_list.push_back(new set_var_password($3,$5));
+            Lex->autocommit= TRUE;
+            if (Lex->sphead)
+              Lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT;
           }
         ;
 
Thread
bk commit into 5.1 tree (davi:1.2598) BUG#30904Davi Arnaut31 Oct