From: Date: October 30 2007 11:51pm Subject: bk commit into 5.1 tree (davi:1.2598) BUG#30904 List-Archive: http://lists.mysql.com/commits/36722 X-Bug: 30904 Message-Id: <20071030225110.402F8C4C20@endora.local> 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 *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; } ;