From 4cbadaeaea5b47a128b2ddf8ca487dbfd978227d Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 7 Aug 2018 11:55:51 +0400 Subject: [PATCH] MDEV-16891 EVENTs created with SQL_MODE=ORACLE fail to execute --- .../suite/compat/oracle/r/events.result | 16 ++++++++++ mysql-test/suite/compat/oracle/t/events.test | 29 +++++++++++++++++++ sql/event_data_objects.cc | 10 +++++-- 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 mysql-test/suite/compat/oracle/r/events.result create mode 100644 mysql-test/suite/compat/oracle/t/events.test diff --git a/mysql-test/suite/compat/oracle/r/events.result b/mysql-test/suite/compat/oracle/r/events.result new file mode 100644 index 00000000000..7b4ad5679eb --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/events.result @@ -0,0 +1,16 @@ +set sql_mode='ORACLE'; +# +# MDEV-16891 EVENTs created with SQL_MODE=ORACLE fail to execute +# +SET GLOBAL event_scheduler=off; +SET sql_mode='ORACLE'; +CREATE TABLE t1 (a TIMESTAMP); +CREATE EVENT e1 +ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MICROSECOND +DO INSERT INTO t1 VALUES(NOW()); +SET GLOBAL event_scheduler=on; +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +DROP TABLE t1; +SET GLOBAL event_scheduler=off; diff --git a/mysql-test/suite/compat/oracle/t/events.test b/mysql-test/suite/compat/oracle/t/events.test new file mode 100644 index 00000000000..e898528636a --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/events.test @@ -0,0 +1,29 @@ +-- source include/not_embedded.inc + +set sql_mode='ORACLE'; + +--echo # +--echo # MDEV-16891 EVENTs created with SQL_MODE=ORACLE fail to execute +--echo # + +SET GLOBAL event_scheduler=off; + +SET sql_mode='ORACLE'; +CREATE TABLE t1 (a TIMESTAMP); +CREATE EVENT e1 + ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MICROSECOND + DO INSERT INTO t1 VALUES(NOW()); +SET GLOBAL event_scheduler=on; + +let $wait_timeout = 10; +let $wait_condition = + SELECT COUNT(*) = 0 + FROM INFORMATION_SCHEMA.EVENTS + WHERE event_schema = 'test' AND event_name = 'e1'; +--source include/wait_condition.inc + +SELECT COUNT(*) FROM t1; +DROP TABLE t1; + + +SET GLOBAL event_scheduler=off; diff --git a/sql/event_data_objects.cc b/sql/event_data_objects.cc index 28820f05aa3..86a710f87c6 100644 --- a/sql/event_data_objects.cc +++ b/sql/event_data_objects.cc @@ -1284,7 +1284,11 @@ Event_job_data::construct_sp_sql(THD *thd, String *sp_sql) */ sp_sql->append(STRING_WITH_LEN("() SQL SECURITY INVOKER ")); + if (thd->variables.sql_mode & MODE_ORACLE) + sp_sql->append(STRING_WITH_LEN(" AS BEGIN ")); sp_sql->append(&body); + if (thd->variables.sql_mode & MODE_ORACLE) + sp_sql->append(STRING_WITH_LEN("; END")); DBUG_RETURN(thd->is_fatal_error); } @@ -1387,9 +1391,6 @@ Event_job_data::execute(THD *thd, bool drop) goto end; } - if (construct_sp_sql(thd, &sp_sql)) - goto end; - /* Set up global thread attributes to reflect the properties of this Event. We can simply reset these instead of usual @@ -1401,6 +1402,9 @@ Event_job_data::execute(THD *thd, bool drop) thd->variables.sql_mode= sql_mode; thd->variables.time_zone= time_zone; + if (construct_sp_sql(thd, &sp_sql)) + goto end; + thd->set_query(sp_sql.c_ptr_safe(), sp_sql.length()); {