fix for bug#16394 "Events: Crash if schedule contains SELECT"
Parsing of CREATE/ALTER EVENT statement was crashing because of early initialization done during parsing, instead in the after parsing phase. Moreover, we don't want SUBqueries in CREATE/ALTER EVENT therefore we disable them, though it is possible to make them work. It can be emulated inside SP with a cursor and SP variable (CREATE/ALTER EVENT can still accept variables as values). mysql-test/r/events_bugs.result: update result mysql-test/t/events_bugs.test: tests for bug#16384 sql/sql_yacc.yy: disallow subqueries when SQLCOM_CREATE_EVENT | SQLCOM_ALTER_EVENT The fix is not big, though lex->forbid_subqueries could have been introduced. Easier is just to set the sql_command and check in both rules where subqueries enter.
This commit is contained in:
parent
9fa9378b2e
commit
8d961c45e2
@ -190,4 +190,12 @@ events_test mysqltest_user1 mysqltest_user1@localhost RECURRING ENABLED
|
||||
drop event events_test.mysqltest_user1;
|
||||
drop user mysqltest_user1@localhost;
|
||||
drop database mysqltest_db1;
|
||||
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
||||
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 'select s1 from ttx) do drop table t' at line 1
|
||||
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
||||
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 'select s1 from ttx) second do drop table t' at line 1
|
||||
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
||||
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 'select s1 from ttx) do drop table t' at line 1
|
||||
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
||||
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 'select s1 from ttx) do drop table t' at line 1
|
||||
drop database events_test;
|
||||
|
@ -198,4 +198,19 @@ drop database mysqltest_db1;
|
||||
# END - 18897: Events: unauthorized action possible with alter event rename
|
||||
#
|
||||
|
||||
#
|
||||
# START - BUG#16394: Events: Crash if schedule contains SELECT
|
||||
#
|
||||
--error ER_PARSE_ERROR
|
||||
create event e_53 on schedule at (select s1 from ttx) do drop table t;
|
||||
--error ER_PARSE_ERROR
|
||||
create event e_53 on schedule every (select s1 from ttx) second do drop table t;
|
||||
--error ER_PARSE_ERROR
|
||||
create event e_53 on schedule every 5 second starts (select s1 from ttx) do drop table t;
|
||||
--error ER_PARSE_ERROR
|
||||
create event e_53 on schedule every 5 second ends (select s1 from ttx) do drop table t;
|
||||
#
|
||||
# END - BUG#16394: Events: Crash if schedule contains SELECT
|
||||
#
|
||||
|
||||
drop database events_test;
|
||||
|
@ -1303,6 +1303,9 @@ event_tail:
|
||||
*/
|
||||
$<ulong_num>$= YYTHD->client_capabilities & CLIENT_MULTI_QUERIES;
|
||||
YYTHD->client_capabilities &= (~CLIENT_MULTI_QUERIES);
|
||||
|
||||
/* We need that for disallowing subqueries */
|
||||
Lex->sql_command= SQLCOM_CREATE_EVENT;
|
||||
}
|
||||
ON SCHEDULE_SYM ev_schedule_time
|
||||
opt_ev_on_completion
|
||||
@ -4638,6 +4641,9 @@ alter:
|
||||
*/
|
||||
$<ulong_num>$= YYTHD->client_capabilities & CLIENT_MULTI_QUERIES;
|
||||
YYTHD->client_capabilities &= ~CLIENT_MULTI_QUERIES;
|
||||
|
||||
/* we need that for disallowing subqueries */
|
||||
Lex->sql_command= SQLCOM_ALTER_EVENT;
|
||||
}
|
||||
ev_alter_on_schedule_completion
|
||||
opt_ev_rename_to
|
||||
@ -4653,15 +4659,15 @@ alter:
|
||||
*/
|
||||
YYTHD->client_capabilities |= $<ulong_num>4;
|
||||
|
||||
/*
|
||||
sql_command is set here because some rules in ev_sql_stmt
|
||||
can overwrite it
|
||||
*/
|
||||
if (!($5 || $6 || $7 || $8 || $9))
|
||||
{
|
||||
yyerror(ER(ER_SYNTAX_ERROR));
|
||||
YYABORT;
|
||||
}
|
||||
/*
|
||||
sql_command is set here because some rules in ev_sql_stmt
|
||||
can overwrite it
|
||||
*/
|
||||
Lex->sql_command= SQLCOM_ALTER_EVENT;
|
||||
}
|
||||
| ALTER TABLESPACE alter_tablespace_info
|
||||
@ -6959,8 +6965,10 @@ select_derived2:
|
||||
{
|
||||
LEX *lex= Lex;
|
||||
lex->derived_tables|= DERIVED_SUBQUERY;
|
||||
if (lex->sql_command == (int)SQLCOM_HA_READ ||
|
||||
lex->sql_command == (int)SQLCOM_KILL)
|
||||
if (lex->sql_command == SQLCOM_HA_READ ||
|
||||
lex->sql_command == SQLCOM_KILL ||
|
||||
lex->sql_command == SQLCOM_CREATE_EVENT ||
|
||||
lex->sql_command == SQLCOM_ALTER_EVENT)
|
||||
{
|
||||
yyerror(ER(ER_SYNTAX_ERROR));
|
||||
YYABORT;
|
||||
@ -10592,8 +10600,10 @@ subselect_start:
|
||||
'(' SELECT_SYM
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
if (lex->sql_command == (int)SQLCOM_HA_READ ||
|
||||
lex->sql_command == (int)SQLCOM_KILL)
|
||||
if (lex->sql_command == SQLCOM_HA_READ ||
|
||||
lex->sql_command == SQLCOM_KILL ||
|
||||
lex->sql_command == SQLCOM_CREATE_EVENT ||
|
||||
lex->sql_command == SQLCOM_ALTER_EVENT)
|
||||
{
|
||||
yyerror(ER(ER_SYNTAX_ERROR));
|
||||
YYABORT;
|
||||
|
Loading…
x
Reference in New Issue
Block a user