Commit 5e0a6927 authored by konstantin@mysql.com's avatar konstantin@mysql.com

Merge bk-internal.mysql.com:/home/bk/mysql-5.1

into  mysql.com:/opt/local/work/mysql-5.1-runtime
parents 22285bb7 23340f3f
...@@ -462,6 +462,7 @@ libmysqld/event.cc ...@@ -462,6 +462,7 @@ libmysqld/event.cc
libmysqld/event_executor.cc libmysqld/event_executor.cc
libmysqld/event_scheduler.cc libmysqld/event_scheduler.cc
libmysqld/event_timed.cc libmysqld/event_timed.cc
libmysqld/events.cc
libmysqld/examples/client_test.c libmysqld/examples/client_test.c
libmysqld/examples/client_test.cc libmysqld/examples/client_test.cc
libmysqld/examples/completion_hash.cc libmysqld/examples/completion_hash.cc
......
...@@ -104,7 +104,7 @@ enum interval_type ...@@ -104,7 +104,7 @@ enum interval_type
INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE, INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND, INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND, INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND,
INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND, INTERVAL_LAST
}; };
C_MODE_END C_MODE_END
......
...@@ -29,7 +29,7 @@ ADD_LIBRARY(mysqldemb emb_qcache.cc libmysqld.c lib_sql.cc ...@@ -29,7 +29,7 @@ ADD_LIBRARY(mysqldemb emb_qcache.cc libmysqld.c lib_sql.cc
../libmysql/libmysql.c ../sql/password.c ../sql-common/client.c ../libmysql/libmysql.c ../sql/password.c ../sql-common/client.c
../sql-common/my_time.c ../sql-common/my_user.c ../sql-common/my_time.c ../sql-common/my_user.c
../sql-common/pack.c ../sql/derror.cc ../sql/event_executor.cc ../sql-common/pack.c ../sql/derror.cc ../sql/event_executor.cc
../sql/event_timed.cc ../sql/event.cc ../sql/discover.cc ../sql/event_timed.cc ../sql/events.cc ../sql/discover.cc
../sql/field_conv.cc ../sql/field.cc ../sql/filesort.cc ../sql/field_conv.cc ../sql/field.cc ../sql/filesort.cc
../sql/gstream.cc ../sql/ha_heap.cc ../sql/ha_myisam.cc ../sql/gstream.cc ../sql/ha_heap.cc ../sql/ha_myisam.cc
../sql/ha_myisammrg.cc ${mysql_se_ha_src} ../sql/ha_myisammrg.cc ${mysql_se_ha_src}
......
...@@ -68,7 +68,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \ ...@@ -68,7 +68,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \ spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \
sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \ sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \
parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \ parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \
event_scheduler.cc event.cc event_timed.cc \ event_scheduler.cc events.cc event_timed.cc \
rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \ rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \
sql_tablespace.cc \ sql_tablespace.cc \
rpl_injector.cc my_user.c partition_info.cc rpl_injector.cc my_user.c partition_info.cc
......
...@@ -365,19 +365,19 @@ on schedule every 10 hour ...@@ -365,19 +365,19 @@ on schedule every 10 hour
disable disable
do do
select 1; select 1;
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space'; select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
event_schema event_name definer event_body event_schema event_name definer event_definition
events_test white_space root@localhost select 1 events_test white_space root@localhost select 1
drop event white_space; drop event white_space;
create event white_space on schedule every 10 hour disable do create event white_space on schedule every 10 hour disable do
select 2; select 2;
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space'; select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
event_schema event_name definer event_body event_schema event_name definer event_definition
events_test white_space root@localhost select 2 events_test white_space root@localhost select 2
drop event white_space; drop event white_space;
create event white_space on schedule every 10 hour disable do select 3; create event white_space on schedule every 10 hour disable do select 3;
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space'; select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
event_schema event_name definer event_body event_schema event_name definer event_definition
events_test white_space root@localhost select 3 events_test white_space root@localhost select 3
drop event white_space; drop event white_space;
create event e1 on schedule every 1 year do set @a = 5; create event e1 on schedule every 1 year do set @a = 5;
......
...@@ -178,4 +178,27 @@ drop procedure ee_16407_6_pendant; ...@@ -178,4 +178,27 @@ drop procedure ee_16407_6_pendant;
set global event_scheduler= 2; set global event_scheduler= 2;
drop table events_smode_test; drop table events_smode_test;
set sql_mode=@old_sql_mode; set sql_mode=@old_sql_mode;
set global event_scheduler=2;
delete from mysql.user where User like 'mysqltest_%';
delete from mysql.db where User like 'mysqltest_%';
flush privileges;
drop database if exists mysqltest_db1;
create user mysqltest_user1@localhost;
create database mysqltest_db1;
grant event on events_test.* to mysqltest_user1@localhost;
create event mysqltest_user1 on schedule every 10 second do select 42;
alter event mysqltest_user1 rename to mysqltest_db1.mysqltest_user1;
ERROR 42000: Access denied for user 'mysqltest_user1'@'localhost' to database 'mysqltest_db1'
"Let's test now rename when there is no select DB"
select database();
database()
NULL
alter event events_test.mysqltest_user1 rename to mysqltest_user1;
ERROR 3D000: No database selected
select event_schema, event_name, definer, event_type, status from information_schema.events;
event_schema event_name definer event_type status
events_test mysqltest_user1 mysqltest_user1@localhost RECURRING ENABLED
drop event events_test.mysqltest_user1;
drop user mysqltest_user1@localhost;
drop database mysqltest_db1;
drop database events_test; drop database events_test;
This diff is collapsed.
...@@ -31,6 +31,8 @@ SHOW VARIABLES LIKE 'log_slow_queries'; ...@@ -31,6 +31,8 @@ SHOW VARIABLES LIKE 'log_slow_queries';
Variable_name Value Variable_name Value
log_slow_queries ON log_slow_queries ON
DROP FUNCTION get_value; DROP FUNCTION get_value;
"Make it quite long"
SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log; TRUNCATE mysql.slow_log;
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
user_host query_time db sql_text user_host query_time db sql_text
...@@ -44,7 +46,10 @@ SLEEP(2) ...@@ -44,7 +46,10 @@ SLEEP(2)
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
user_host query_time db sql_text user_host query_time db sql_text
USER_HOST SLEEPVAL events_test SELECT SLEEP(2) USER_HOST SLEEPVAL events_test SELECT SLEEP(2)
SET SESSION long_query_time=300;
"Make it quite long"
TRUNCATE mysql.slow_log; TRUNCATE mysql.slow_log;
SET SESSION long_query_time=1;
CREATE TABLE slow_event_test (slo_val tinyint, val tinyint); CREATE TABLE slow_event_test (slo_val tinyint, val tinyint);
"This won't go to the slow log" "This won't go to the slow log"
CREATE EVENT long_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(3); CREATE EVENT long_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(3);
...@@ -63,9 +68,9 @@ slo_val val ...@@ -63,9 +68,9 @@ slo_val val
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
user_host query_time db sql_text user_host query_time db sql_text
"This should go to the slow log" "This should go to the slow log"
DROP EVENT long_event;
SET SESSION long_query_time=10; SET SESSION long_query_time=10;
SET GLOBAL long_query_time=1; SET GLOBAL long_query_time=1;
DROP EVENT long_event;
CREATE EVENT long_event2 ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2); CREATE EVENT long_event2 ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2);
"Sleep some more time than the actual event run will take" "Sleep some more time than the actual event run will take"
"Check our table. Should see 2 rows" "Check our table. Should see 2 rows"
...@@ -78,8 +83,10 @@ SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; ...@@ -78,8 +83,10 @@ SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
user_host query_time db sql_text user_host query_time db sql_text
USER_HOST SLEEPVAL events_test INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2) USER_HOST SLEEPVAL events_test INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2)
DROP EVENT long_event2; DROP EVENT long_event2;
SET GLOBAL long_query_time =@old_global_long_query_time; "Make it quite long"
SET SESSION long_query_time =@old_session_long_query_time; SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log; TRUNCATE mysql.slow_log;
DROP TABLE slow_event_test; DROP TABLE slow_event_test;
SET GLOBAL long_query_time =@old_global_long_query_time;
SET SESSION long_query_time =@old_session_long_query_time;
drop database events_test; drop database events_test;
...@@ -13,7 +13,9 @@ Variable_name Value ...@@ -13,7 +13,9 @@ Variable_name Value
server_id 1 server_id 1
---> connection: default ---> connection: default
CREATE INSTANCE mysqld3; CREATE INSTANCE mysqld3
server_id = 3,
socket = "$MYSQL_TMP_DIR/mysqld_3.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld3 offline mysqld3 offline
...@@ -22,6 +24,7 @@ mysqld1 online ...@@ -22,6 +24,7 @@ mysqld1 online
-------------------------------------------------------------------- --------------------------------------------------------------------
server_id = 1 server_id = 1
server_id = 2 server_id = 2
server_id=3
-------------------------------------------------------------------- --------------------------------------------------------------------
CREATE INSTANCE mysqld1; CREATE INSTANCE mysqld1;
ERROR HY000: Instance already exists ERROR HY000: Instance already exists
...@@ -32,7 +35,10 @@ ERROR HY000: Instance already exists ...@@ -32,7 +35,10 @@ ERROR HY000: Instance already exists
-------------------------------------------------------------------- --------------------------------------------------------------------
nonguarded nonguarded
-------------------------------------------------------------------- --------------------------------------------------------------------
CREATE INSTANCE mysqld4 nonguarded; CREATE INSTANCE mysqld4
nonguarded,
server_id = 4,
socket = "$MYSQL_TMP_DIR/mysqld_4.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld3 offline mysqld3 offline
...@@ -46,7 +52,11 @@ nonguarded ...@@ -46,7 +52,11 @@ nonguarded
-------------------------------------------------------------------- --------------------------------------------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
CREATE INSTANCE mysqld5 test-A = 000, test-B = test; CREATE INSTANCE mysqld5
test-A = 000,
test-B = test,
server_id = 5,
socket = "$MYSQL_TMP_DIR/mysqld_5.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld1 online mysqld1 online
...@@ -61,7 +71,11 @@ test-B=test ...@@ -61,7 +71,11 @@ test-B=test
-------------------------------------------------------------------- --------------------------------------------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
CREATE INSTANCE mysqld6 test-C1 = 10 , test-C2 = 02 ; CREATE INSTANCE mysqld6
test-C1 = 10 ,
test-C2 = 02 ,
server_id = 6,
socket = "$MYSQL_TMP_DIR/mysqld_6.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld1 online mysqld1 online
...@@ -116,7 +130,11 @@ mysqld4 offline ...@@ -116,7 +130,11 @@ mysqld4 offline
-------------------------------------------------------------------- --------------------------------------------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
-------------------------------------------------------------------- --------------------------------------------------------------------
CREATE INSTANCE mysqld9 test-1=" hello world ", test-2=' '; CREATE INSTANCE mysqld9
test-1=" hello world ",
test-2=' ',
server_id = 9,
socket = "$MYSQL_TMP_DIR/mysqld_9.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld1 online mysqld1 online
...@@ -126,56 +144,67 @@ mysqld6 offline ...@@ -126,56 +144,67 @@ mysqld6 offline
mysqld3 offline mysqld3 offline
mysqld4 offline mysqld4 offline
mysqld9 offline mysqld9 offline
CREATE INSTANCE mysqld9a test-3='\b\babc\sdef'; CREATE INSTANCE mysqld10
test-3='\b\babc\sdef',
server_id = 10,
socket = "$MYSQL_TMP_DIR/mysqld_10.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld1 online mysqld1 online
mysqld9a offline mysqld9 offline
mysqld5 offline mysqld5 offline
mysqld6 offline mysqld6 offline
mysqld3 offline mysqld3 offline
mysqld4 offline mysqld4 offline
mysqld9 offline mysqld10 offline
mysqld2 offline mysqld2 offline
CREATE INSTANCE mysqld9b test-4='abc\tdef', test-5='abc\ndef'; CREATE INSTANCE mysqld11
test-4='abc\tdef',
test-5='abc\ndef',
server_id = 11,
socket = "$MYSQL_TMP_DIR/mysqld_11.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld9b offline mysqld1 online
mysqld9a offline mysqld11 offline
mysqld5 offline mysqld5 offline
mysqld6 offline mysqld6 offline
mysqld3 offline mysqld3 offline
mysqld4 offline mysqld4 offline
mysqld9 offline mysqld10 offline
mysqld2 offline mysqld2 offline
mysqld1 online mysqld9 offline
CREATE INSTANCE mysqld9c test-6="abc\rdef", test-7="abc\\def"; CREATE INSTANCE mysqld12
test-6="abc\rdef",
test-7="abc\\def",
server_id = 12,
socket = "$MYSQL_TMP_DIR/mysqld_12.sock";
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld9b offline mysqld1 online
mysqld6 offline mysqld9 offline
mysqld5 offline mysqld5 offline
mysqld9c offline mysqld6 offline
mysqld3 offline mysqld3 offline
mysqld4 offline mysqld4 offline
mysqld9 offline mysqld10 offline
mysqld2 offline mysqld2 offline
mysqld1 online mysqld12 offline
mysqld9a offline mysqld11 offline
CREATE INSTANCE mysqld10 test-bad=' \ '; CREATE INSTANCE mysqld13 test-bad=' \ ';
ERROR 42000: You have an error in your command syntax. Check the manual that corresponds to your MySQL Instance Manager version for the right syntax to use ERROR 42000: You have an error in your command syntax. Check the manual that corresponds to your MySQL Instance Manager version for the right syntax to use
SHOW INSTANCES; SHOW INSTANCES;
instance_name state instance_name state
mysqld9b offline mysqld1 online
mysqld6 offline mysqld9 offline
mysqld5 offline mysqld5 offline
mysqld9c offline mysqld6 offline
mysqld3 offline mysqld3 offline
mysqld4 offline mysqld4 offline
mysqld9 offline mysqld10 offline
mysqld2 offline mysqld2 offline
mysqld1 online mysqld12 offline
mysqld9a offline mysqld11 offline
-------------------------------------------------------------------- --------------------------------------------------------------------
test-1= hello world test-1= hello world
-------------------------------------------------------------------- --------------------------------------------------------------------
......
...@@ -13,7 +13,10 @@ UNSET mysqld1.server_id; ...@@ -13,7 +13,10 @@ UNSET mysqld1.server_id;
ERROR HY000: The instance is active. Stop the instance first ERROR HY000: The instance is active. Stop the instance first
SET mysqld1.server_id = 11; SET mysqld1.server_id = 11;
ERROR HY000: The instance is active. Stop the instance first ERROR HY000: The instance is active. Stop the instance first
CREATE INSTANCE mysqld3 datadir = '/'; CREATE INSTANCE mysqld3
datadir = '/',
server_id = 3,
socket = "$MYSQL_TMP_DIR/mysqld_3.sock";
START INSTANCE mysqld3; START INSTANCE mysqld3;
UNSET mysqld3.server_id; UNSET mysqld3.server_id;
ERROR HY000: The instance is active. Stop the instance first ERROR HY000: The instance is active. Stop the instance first
...@@ -101,12 +104,14 @@ ERROR HY000: Bad instance name. Check that the instance with such a name exists ...@@ -101,12 +104,14 @@ ERROR HY000: Bad instance name. Check that the instance with such a name exists
-------------------------------------------------------------------- --------------------------------------------------------------------
server_id = 1 server_id = 1
server_id=2 server_id=2
server_id=3
-------------------------------------------------------------------- --------------------------------------------------------------------
UNSET mysqld2.server_id, mysqld3.server_id, mysqld1.ccc; UNSET mysqld2.server_id, mysqld3.server_id, mysqld1.ccc;
ERROR HY000: The instance is active. Stop the instance first ERROR HY000: The instance is active. Stop the instance first
-------------------------------------------------------------------- --------------------------------------------------------------------
server_id = 1 server_id = 1
server_id=2 server_id=2
server_id=3
-------------------------------------------------------------------- --------------------------------------------------------------------
DROP INSTANCE mysqld3; DROP INSTANCE mysqld3;
SET mysqld2.server_id=222; SET mysqld2.server_id=222;
......
...@@ -756,7 +756,7 @@ information_schema.columns ...@@ -756,7 +756,7 @@ information_schema.columns
where data_type = 'longtext'; where data_type = 'longtext';
table_schema table_name column_name table_schema table_name column_name
information_schema COLUMNS COLUMN_TYPE information_schema COLUMNS COLUMN_TYPE
information_schema EVENTS EVENT_BODY information_schema EVENTS EVENT_DEFINITION
information_schema EVENTS SQL_MODE information_schema EVENTS SQL_MODE
information_schema PARTITIONS PARTITION_EXPRESSION information_schema PARTITIONS PARTITION_EXPRESSION
information_schema PARTITIONS SUBPARTITION_EXPRESSION information_schema PARTITIONS SUBPARTITION_EXPRESSION
......
...@@ -13,9 +13,9 @@ ...@@ -13,9 +13,9 @@
#events_stress : BUG#17619 2006-02-21 andrey Race conditions #events_stress : BUG#17619 2006-02-21 andrey Race conditions
#events : BUG#17619 2006-02-21 andrey Race conditions #events : BUG#17619 2006-02-21 andrey Race conditions
#events_scheduling : BUG#19170 2006-04-26 andrey Test case of 19170 fails on some platforms. Has to be checked. #events_scheduling : BUG#19170 2006-04-26 andrey Test case of 19170 fails on some platforms. Has to be checked.
im_instance_conf : Bug#20294 2006-06-06 monty Instance manager test im_instance_conf fails randomly #im_instance_conf : Bug#20294 2006-06-06 monty Instance manager test im_instance_conf fails randomly
im_options : Bug#20294 2006-06-06 monty Instance manager test im_instance_conf fails randomly #im_options : Bug#20294 2006-06-06 monty Instance manager test im_instance_conf fails randomly
im_life_cycle : Bug#20368 2006-06-10 alik im_life_cycle test fails #im_life_cycle : Bug#20368 2006-06-10 alik im_life_cycle test fails
ndb_autodiscover : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog ndb_autodiscover : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
ndb_autodiscover2 : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog ndb_autodiscover2 : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t binlog
#ndb_binlog_discover : BUG#19395 2006-04-28 tomas/knielsen mysqld does not always detect cluster shutdown #ndb_binlog_discover : BUG#19395 2006-04-28 tomas/knielsen mysqld does not always detect cluster shutdown
......
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
create database if not exists events_test; create database if not exists events_test;
use events_test; use events_test;
...@@ -327,15 +330,15 @@ on schedule every 10 hour ...@@ -327,15 +330,15 @@ on schedule every 10 hour
disable disable
do do
select 1; select 1;
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space'; select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
drop event white_space; drop event white_space;
create event white_space on schedule every 10 hour disable do create event white_space on schedule every 10 hour disable do
select 2; select 2;
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space'; select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
drop event white_space; drop event white_space;
create event white_space on schedule every 10 hour disable do select 3; create event white_space on schedule every 10 hour disable do select 3;
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space'; select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
drop event white_space; drop event white_space;
# #
# END: BUG #17453: Creating Event crash the server # END: BUG #17453: Creating Event crash the server
......
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
create database if not exists events_test; create database if not exists events_test;
use events_test; use events_test;
...@@ -172,4 +175,38 @@ set sql_mode=@old_sql_mode; ...@@ -172,4 +175,38 @@ set sql_mode=@old_sql_mode;
# #
# End - 16407: Events: Changes in sql_mode won't be taken into account # End - 16407: Events: Changes in sql_mode won't be taken into account
# #
#
# START - 18897: Events: unauthorized action possible with alter event rename
#
set global event_scheduler=2;
--disable_warnings
delete from mysql.user where User like 'mysqltest_%';
delete from mysql.db where User like 'mysqltest_%';
flush privileges;
drop database if exists mysqltest_db1;
--enable_warnings
create user mysqltest_user1@localhost;
create database mysqltest_db1;
grant event on events_test.* to mysqltest_user1@localhost;
connect (conn2,localhost,mysqltest_user1,,events_test);
create event mysqltest_user1 on schedule every 10 second do select 42;
--error ER_DBACCESS_DENIED_ERROR
alter event mysqltest_user1 rename to mysqltest_db1.mysqltest_user1;
--echo "Let's test now rename when there is no select DB"
disconnect conn2;
connect (conn2,localhost,mysqltest_user1,,*NO-ONE*);
select database();
--error ER_NO_DB_ERROR
alter event events_test.mysqltest_user1 rename to mysqltest_user1;
select event_schema, event_name, definer, event_type, status from information_schema.events;
drop event events_test.mysqltest_user1;
disconnect conn2;
connection default;
drop user mysqltest_user1@localhost;
drop database mysqltest_db1;
#
# END - 18897: Events: unauthorized action possible with alter event rename
#
drop database events_test; drop database events_test;
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
CREATE DATABASE IF NOT EXISTS events_test; CREATE DATABASE IF NOT EXISTS events_test;
use events_test; use events_test;
# #
...@@ -6,7 +9,7 @@ use events_test; ...@@ -6,7 +9,7 @@ use events_test;
CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123; CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
--replace_column 8 # 9 # --replace_column 8 # 9 #
SHOW EVENTS; SHOW EVENTS;
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT from information_schema.events; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT from information_schema.events;
CREATE DATABASE events_test2; CREATE DATABASE events_test2;
CREATE USER ev_test@localhost; CREATE USER ev_test@localhost;
GRANT ALL ON events_test.* to ev_test@localhost; GRANT ALL ON events_test.* to ev_test@localhost;
...@@ -52,10 +55,10 @@ CREATE EVENT four_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42; ...@@ -52,10 +55,10 @@ CREATE EVENT four_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
connection default; connection default;
USE events_test; USE events_test;
--echo "We should see 4 events : one_event, two_event, three_event & four_event" --echo "We should see 4 events : one_event, two_event, three_event & four_event"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
DROP DATABASE events_test2; DROP DATABASE events_test2;
--echo "We should see 3 events : one_event, two_event, three_event" --echo "We should see 3 events : one_event, two_event, three_event"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
connection default; connection default;
CREATE DATABASE events_test2; CREATE DATABASE events_test2;
...@@ -64,27 +67,27 @@ CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42; ...@@ -64,27 +67,27 @@ CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
connection ev_con1; connection ev_con1;
--echo "Should see 4 events - one, two, three & five" --echo "Should see 4 events - one, two, three & five"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
connection default; connection default;
REVOKE EVENT ON events_test2.* FROM ev_test@localhost; REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
connection ev_con1; connection ev_con1;
USE test; USE test;
--echo "Should see 3 events - one, two & three" --echo "Should see 3 events - one, two & three"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
--echo "Let's test ALTER EVENT which changes the definer" --echo "Let's test ALTER EVENT which changes the definer"
USE events_test; USE events_test;
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND; ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
--echo "The definer should be ev_test@localhost" --echo "The definer should be ev_test@localhost"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event';
connection default; connection default;
USE events_test; USE events_test;
ALTER EVENT one_event COMMENT "comment"; ALTER EVENT one_event COMMENT "comment";
connection ev_con1; connection ev_con1;
--echo "The definer should be root@localhost" --echo "The definer should be root@localhost"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event';
ALTER EVENT one_event DO SELECT 12; ALTER EVENT one_event DO SELECT 12;
--echo "The definer should be ev_test@localhost" --echo "The definer should be ev_test@localhost"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event';
connection default; connection default;
--echo "make the definer again root@localhost" --echo "make the definer again root@localhost"
ALTER EVENT one_event COMMENT "new comment"; ALTER EVENT one_event COMMENT "new comment";
...@@ -93,7 +96,7 @@ connection ev_con1; ...@@ -93,7 +96,7 @@ connection ev_con1;
DROP EVENT one_event; DROP EVENT one_event;
connection default; connection default;
--echo "One event should not be there" --echo "One event should not be there"
SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS; SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS;
disconnect ev_con1; disconnect ev_con1;
connection default; connection default;
DROP USER ev_test@localhost; DROP USER ev_test@localhost;
......
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
create database if not exists events_test; create database if not exists events_test;
use events_test; use events_test;
--echo "We use procedure here because its statements won't be logged into the general log" --echo "We use procedure here because its statements won't be logged into the general log"
...@@ -51,6 +54,8 @@ SET @old_global_long_query_time:=(select get_value()); ...@@ -51,6 +54,8 @@ SET @old_global_long_query_time:=(select get_value());
SET @old_session_long_query_time:=@@long_query_time; SET @old_session_long_query_time:=@@long_query_time;
SHOW VARIABLES LIKE 'log_slow_queries'; SHOW VARIABLES LIKE 'log_slow_queries';
DROP FUNCTION get_value; DROP FUNCTION get_value;
--echo "Make it quite long"
SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log; TRUNCATE mysql.slow_log;
--replace_column 1 USER_HOST --replace_column 1 USER_HOST
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
...@@ -61,7 +66,10 @@ SET SESSION long_query_time=1; ...@@ -61,7 +66,10 @@ SET SESSION long_query_time=1;
SELECT SLEEP(2); SELECT SLEEP(2);
--replace_column 1 USER_HOST 2 SLEEPVAL --replace_column 1 USER_HOST 2 SLEEPVAL
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
SET SESSION long_query_time=300;
--echo "Make it quite long"
TRUNCATE mysql.slow_log; TRUNCATE mysql.slow_log;
SET SESSION long_query_time=1;
CREATE TABLE slow_event_test (slo_val tinyint, val tinyint); CREATE TABLE slow_event_test (slo_val tinyint, val tinyint);
--echo "This won't go to the slow log" --echo "This won't go to the slow log"
CREATE EVENT long_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(3); CREATE EVENT long_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(3);
...@@ -75,9 +83,9 @@ SELECT * FROM slow_event_test; ...@@ -75,9 +83,9 @@ SELECT * FROM slow_event_test;
--echo "Check slow log. Should not see anything because 3 is under the threshold of 4 for GLOBAL, though over SESSION which is 2" --echo "Check slow log. Should not see anything because 3 is under the threshold of 4 for GLOBAL, though over SESSION which is 2"
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
--echo "This should go to the slow log" --echo "This should go to the slow log"
DROP EVENT long_event;
SET SESSION long_query_time=10; SET SESSION long_query_time=10;
SET GLOBAL long_query_time=1; SET GLOBAL long_query_time=1;
DROP EVENT long_event;
CREATE EVENT long_event2 ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2); CREATE EVENT long_event2 ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2);
--echo "Sleep some more time than the actual event run will take" --echo "Sleep some more time than the actual event run will take"
--sleep 3 --sleep 3
...@@ -87,9 +95,11 @@ SELECT * FROM slow_event_test; ...@@ -87,9 +95,11 @@ SELECT * FROM slow_event_test;
--replace_column 1 USER_HOST 2 SLEEPVAL --replace_column 1 USER_HOST 2 SLEEPVAL
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log; SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
DROP EVENT long_event2; DROP EVENT long_event2;
SET GLOBAL long_query_time =@old_global_long_query_time; --echo "Make it quite long"
SET SESSION long_query_time =@old_session_long_query_time; SET SESSION long_query_time=300;
TRUNCATE mysql.slow_log; TRUNCATE mysql.slow_log;
DROP TABLE slow_event_test; DROP TABLE slow_event_test;
SET GLOBAL long_query_time =@old_global_long_query_time;
SET SESSION long_query_time =@old_session_long_query_time;
drop database events_test; drop database events_test;
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
--disable_warnings --disable_warnings
create database if not exists events_test; create database if not exists events_test;
--enable_warnings --enable_warnings
......
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
CREATE DATABASE IF NOT EXISTS events_test; CREATE DATABASE IF NOT EXISTS events_test;
USE events_test; USE events_test;
CREATE TABLE table_1(a int); CREATE TABLE table_1(a int);
......
# Can't test with embedded server that doesn't support grants
-- source include/not_embedded.inc
CREATE DATABASE IF NOT EXISTS events_test; CREATE DATABASE IF NOT EXISTS events_test;
# #
# DROP DATABASE test start (bug #16406) # DROP DATABASE test start (bug #16406)
......
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
# - DROP INSTANCE fails for active instance. # - DROP INSTANCE fails for active instance.
# - DROP INSTANCE updates both config file and internal configuration cache; # - DROP INSTANCE updates both config file and internal configuration cache;
# #
# NOTE: each CREATE INSTANCE statement must specify socket-file-name, otherwise
# this results of the test can be affected by another running test suite.
#
########################################################################### ###########################################################################
--source include/im_check_os.inc --source include/im_check_os.inc
...@@ -69,7 +72,9 @@ SHOW VARIABLES LIKE 'server_id'; ...@@ -69,7 +72,9 @@ SHOW VARIABLES LIKE 'server_id';
# Check that CREATE INSTANCE succeeds for non-existing instance and also check # Check that CREATE INSTANCE succeeds for non-existing instance and also check
# that both config file and internal configuration cache have been updated. # that both config file and internal configuration cache have been updated.
CREATE INSTANCE mysqld3; CREATE INSTANCE mysqld3
server_id = 3,
socket = "$MYSQL_TMP_DIR/mysqld_3.sock";
SHOW INSTANCES; SHOW INSTANCES;
...@@ -99,7 +104,10 @@ CREATE INSTANCE mysqld3; ...@@ -99,7 +104,10 @@ CREATE INSTANCE mysqld3;
--exec grep nonguarded $MYSQLTEST_VARDIR/im.cnf; --exec grep nonguarded $MYSQLTEST_VARDIR/im.cnf;
--echo -------------------------------------------------------------------- --echo --------------------------------------------------------------------
CREATE INSTANCE mysqld4 nonguarded; CREATE INSTANCE mysqld4
nonguarded,
server_id = 4,
socket = "$MYSQL_TMP_DIR/mysqld_4.sock";
SHOW INSTANCES; SHOW INSTANCES;
...@@ -115,7 +123,11 @@ SHOW INSTANCES; ...@@ -115,7 +123,11 @@ SHOW INSTANCES;
--exec grep test-B $MYSQLTEST_VARDIR/im.cnf || true; --exec grep test-B $MYSQLTEST_VARDIR/im.cnf || true;
--echo -------------------------------------------------------------------- --echo --------------------------------------------------------------------
CREATE INSTANCE mysqld5 test-A = 000, test-B = test; CREATE INSTANCE mysqld5
test-A = 000,
test-B = test,
server_id = 5,
socket = "$MYSQL_TMP_DIR/mysqld_5.sock";
SHOW INSTANCES; SHOW INSTANCES;
...@@ -135,7 +147,11 @@ SHOW INSTANCES; ...@@ -135,7 +147,11 @@ SHOW INSTANCES;
--exec grep test-C $MYSQLTEST_VARDIR/im.cnf || true; --exec grep test-C $MYSQLTEST_VARDIR/im.cnf || true;
--echo -------------------------------------------------------------------- --echo --------------------------------------------------------------------
CREATE INSTANCE mysqld6 test-C1 = 10 , test-C2 = 02 ; CREATE INSTANCE mysqld6
test-C1 = 10 ,
test-C2 = 02 ,
server_id = 6,
socket = "$MYSQL_TMP_DIR/mysqld_6.sock";
SHOW INSTANCES; SHOW INSTANCES;
...@@ -183,22 +199,37 @@ SHOW INSTANCES; ...@@ -183,22 +199,37 @@ SHOW INSTANCES;
--exec grep test-4 $MYSQLTEST_VARDIR/im.cnf || true; --exec grep test-4 $MYSQLTEST_VARDIR/im.cnf || true;
--echo -------------------------------------------------------------------- --echo --------------------------------------------------------------------
CREATE INSTANCE mysqld9 test-1=" hello world ", test-2=' '; CREATE INSTANCE mysqld9
test-1=" hello world ",
test-2=' ',
server_id = 9,
socket = "$MYSQL_TMP_DIR/mysqld_9.sock";
SHOW INSTANCES; SHOW INSTANCES;
CREATE INSTANCE mysqld9a test-3='\b\babc\sdef'; CREATE INSTANCE mysqld10
test-3='\b\babc\sdef',
server_id = 10,
socket = "$MYSQL_TMP_DIR/mysqld_10.sock";
# test-3='abc def' # test-3='abc def'
SHOW INSTANCES; SHOW INSTANCES;
CREATE INSTANCE mysqld9b test-4='abc\tdef', test-5='abc\ndef'; CREATE INSTANCE mysqld11
test-4='abc\tdef',
test-5='abc\ndef',
server_id = 11,
socket = "$MYSQL_TMP_DIR/mysqld_11.sock";
SHOW INSTANCES; SHOW INSTANCES;
CREATE INSTANCE mysqld9c test-6="abc\rdef", test-7="abc\\def"; CREATE INSTANCE mysqld12
test-6="abc\rdef",
test-7="abc\\def",
server_id = 12,
socket = "$MYSQL_TMP_DIR/mysqld_12.sock";
# test-6=abc # test-6=abc
SHOW INSTANCES; SHOW INSTANCES;
--error ER_SYNTAX_ERROR --error ER_SYNTAX_ERROR
CREATE INSTANCE mysqld10 test-bad=' \ '; CREATE INSTANCE mysqld13 test-bad=' \ ';
SHOW INSTANCES; SHOW INSTANCES;
--echo -------------------------------------------------------------------- --echo --------------------------------------------------------------------
......
...@@ -21,12 +21,15 @@ ...@@ -21,12 +21,15 @@
# - server_id # - server_id
# - port # - port
# - nonguarded # - nonguarded
#
# Let's test SET statement on the option 'server_id'. It's expected that # Let's test SET statement on the option 'server_id'. It's expected that
# originally the instances have the following server ids and states: # originally the instances have the following server ids and states:
# - mysqld1: server_id: 1; running (online) # - mysqld1: server_id: 1; running (online)
# - mysqld2: server_id: 2; stopped (offline) # - mysqld2: server_id: 2; stopped (offline)
# #
# NOTE: each CREATE INSTANCE statement must specify socket-file-name, otherwise
# this results of the test can be affected by another running test suite.
#
########################################################################### ###########################################################################
--source include/im_check_os.inc --source include/im_check_os.inc
...@@ -76,7 +79,10 @@ SET mysqld1.server_id = 11; ...@@ -76,7 +79,10 @@ SET mysqld1.server_id = 11;
# - start it; # - start it;
# - try to set/unset options; # - try to set/unset options;
CREATE INSTANCE mysqld3 datadir = '/'; CREATE INSTANCE mysqld3
datadir = '/',
server_id = 3,
socket = "$MYSQL_TMP_DIR/mysqld_3.sock";
START INSTANCE mysqld3; START INSTANCE mysqld3;
# FIXME: START INSTANCE should be synchronous. # FIXME: START INSTANCE should be synchronous.
......
...@@ -52,7 +52,7 @@ ADD_EXECUTABLE(mysqld ../sql-common/client.c derror.cc des_key_file.cc ...@@ -52,7 +52,7 @@ ADD_EXECUTABLE(mysqld ../sql-common/client.c derror.cc des_key_file.cc
sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc sql_update.cc sql_view.cc strfunc.cc table.cc thr_malloc.cc
time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.cc time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.cc
rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_timed.cc rpl_tblmap.cc sql_binlog.cc event_scheduler.cc event_timed.cc
sql_tablespace.cc event.cc ../sql-common/my_user.c sql_tablespace.cc events.cc ../sql-common/my_user.c
partition_info.cc rpl_injector.cc partition_info.cc rpl_injector.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc ${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h ${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
......
...@@ -64,8 +64,8 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ ...@@ -64,8 +64,8 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
tztime.h my_decimal.h\ tztime.h my_decimal.h\
sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h \ sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h \
parse_file.h sql_view.h sql_trigger.h \ parse_file.h sql_view.h sql_trigger.h \
sql_array.h sql_cursor.h event.h event_priv.h \ sql_array.h sql_cursor.h events.h events_priv.h \
sql_plugin.h authors.h sql_partition.h \ sql_plugin.h authors.h sql_partition.h event_timed.h \
partition_info.h partition_element.h event_scheduler.h \ partition_info.h partition_element.h event_scheduler.h \
contributors.h contributors.h
mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
...@@ -104,7 +104,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \ ...@@ -104,7 +104,7 @@ mysqld_SOURCES = sql_lex.cc sql_handler.cc sql_partition.cc \
tztime.cc my_time.c my_user.c my_decimal.cc\ tztime.cc my_time.c my_user.c my_decimal.cc\
sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.cc \ sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.cc \
sp_cache.cc parse_file.cc sql_trigger.cc \ sp_cache.cc parse_file.cc sql_trigger.cc \
event_scheduler.cc event.cc event_timed.cc \ event_scheduler.cc events.cc event_timed.cc \
sql_plugin.cc sql_binlog.cc \ sql_plugin.cc sql_binlog.cc \
sql_builtin.cc sql_tablespace.cc partition_info.cc sql_builtin.cc sql_tablespace.cc partition_info.cc
......
...@@ -14,8 +14,10 @@ ...@@ -14,8 +14,10 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "event_priv.h" #include "mysql_priv.h"
#include "event.h" #include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "event_scheduler.h" #include "event_scheduler.h"
#include "sp_head.h" #include "sp_head.h"
...@@ -46,8 +48,8 @@ ...@@ -46,8 +48,8 @@
The scheduler only manages execution of the events. Their creation, The scheduler only manages execution of the events. Their creation,
alteration and deletion is delegated to other routines found in event.cc . alteration and deletion is delegated to other routines found in event.cc .
These routines interact with the scheduler : These routines interact with the scheduler :
- CREATE EVENT -> Event_scheduler::add_event() - CREATE EVENT -> Event_scheduler::create_event()
- ALTER EVENT -> Event_scheduler::replace_event() - ALTER EVENT -> Event_scheduler::update_event()
- DROP EVENT -> Event_scheduler::drop_event() - DROP EVENT -> Event_scheduler::drop_event()
There is one mutex in the single Event_scheduler object which controls There is one mutex in the single Event_scheduler object which controls
...@@ -298,6 +300,35 @@ class Worker_thread_param ...@@ -298,6 +300,35 @@ class Worker_thread_param
}; };
/*
Compares the execute_at members of 2 Event_timed instances.
Used as callback for the prioritized queue when shifting
elements inside.
SYNOPSIS
event_timed_compare_q()
vptr - not used (set it to NULL)
a - first Event_timed object
b - second Event_timed object
RETURN VALUE
-1 - a->execute_at < b->execute_at
0 - a->execute_at == b->execute_at
1 - a->execute_at > b->execute_at
NOTES
execute_at.second_part is not considered during comparison
*/
static int
event_timed_compare_q(void *vptr, byte* a, byte *b)
{
return my_time_compare(&((Event_timed *)a)->execute_at,
&((Event_timed *)b)->execute_at);
}
/* /*
Prints the stack of infos, warnings, errors from thd to Prints the stack of infos, warnings, errors from thd to
the console so it can be fetched by the logs-into-tables and the console so it can be fetched by the logs-into-tables and
...@@ -740,10 +771,10 @@ Event_scheduler::destroy() ...@@ -740,10 +771,10 @@ Event_scheduler::destroy()
/* /*
Adds an event to the scheduler queue Creates an event in the scheduler queue
SYNOPSIS SYNOPSIS
Event_scheduler::add_event() Event_scheduler::create_event()
et The event to add et The event to add
check_existence Whether to check if already loaded. check_existence Whether to check if already loaded.
...@@ -753,11 +784,11 @@ Event_scheduler::destroy() ...@@ -753,11 +784,11 @@ Event_scheduler::destroy()
*/ */
enum Event_scheduler::enum_error_code enum Event_scheduler::enum_error_code
Event_scheduler::add_event(THD *thd, Event_timed *et, bool check_existence) Event_scheduler::create_event(THD *thd, Event_timed *et, bool check_existence)
{ {
enum enum_error_code res; enum enum_error_code res;
Event_timed *et_new; Event_timed *et_new;
DBUG_ENTER("Event_scheduler::add_event"); DBUG_ENTER("Event_scheduler::create_event");
DBUG_PRINT("enter", ("thd=%p et=%p lock=%p",thd,et,&LOCK_scheduler_data)); DBUG_PRINT("enter", ("thd=%p et=%p lock=%p",thd,et,&LOCK_scheduler_data));
LOCK_SCHEDULER_DATA(); LOCK_SCHEDULER_DATA();
...@@ -859,7 +890,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et) ...@@ -859,7 +890,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et)
/* /*
Replaces an event in the scheduler queue Updates an event from the scheduler queue
SYNOPSIS SYNOPSIS
Event_scheduler::replace_event() Event_scheduler::replace_event()
...@@ -873,7 +904,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et) ...@@ -873,7 +904,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et)
*/ */
enum Event_scheduler::enum_error_code enum Event_scheduler::enum_error_code
Event_scheduler::replace_event(THD *thd, Event_timed *et, Event_scheduler::update_event(THD *thd, Event_timed *et,
LEX_STRING *new_schema, LEX_STRING *new_schema,
LEX_STRING *new_name) LEX_STRING *new_name)
{ {
...@@ -886,7 +917,7 @@ Event_scheduler::replace_event(THD *thd, Event_timed *et, ...@@ -886,7 +917,7 @@ Event_scheduler::replace_event(THD *thd, Event_timed *et,
LINT_INIT(old_name.str); LINT_INIT(old_name.str);
LINT_INIT(old_name.length); LINT_INIT(old_name.length);
DBUG_ENTER("Event_scheduler::replace_event"); DBUG_ENTER("Event_scheduler::update_event");
DBUG_PRINT("enter", ("thd=%p et=%p et=[%s.%s] lock=%p", DBUG_PRINT("enter", ("thd=%p et=%p et=[%s.%s] lock=%p",
thd, et, et->dbname.str, et->name.str, &LOCK_scheduler_data)); thd, et, et->dbname.str, et->name.str, &LOCK_scheduler_data));
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
class Event_timed;
class THD; class THD;
typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*); typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*);
...@@ -26,7 +27,6 @@ events_init(); ...@@ -26,7 +27,6 @@ events_init();
void void
events_shutdown(); events_shutdown();
class Event_scheduler class Event_scheduler
{ {
public: public:
...@@ -66,14 +66,15 @@ class Event_scheduler ...@@ -66,14 +66,15 @@ class Event_scheduler
/* Methods for queue management follow */ /* Methods for queue management follow */
enum enum_error_code enum enum_error_code
add_event(THD *thd, Event_timed *et, bool check_existence); create_event(THD *thd, Event_timed *et, bool check_existence);
enum enum_error_code
update_event(THD *thd, Event_timed *et, LEX_STRING *new_schema,
LEX_STRING *new_name);
bool bool
drop_event(THD *thd, Event_timed *et); drop_event(THD *thd, Event_timed *et);
enum enum_error_code
replace_event(THD *thd, Event_timed *et, LEX_STRING *new_schema,
LEX_STRING *new_name);
int int
drop_schema_events(THD *thd, LEX_STRING *schema); drop_schema_events(THD *thd, LEX_STRING *schema);
......
...@@ -15,8 +15,10 @@ ...@@ -15,8 +15,10 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define MYSQL_LEX 1 #define MYSQL_LEX 1
#include "event_priv.h" #include "mysql_priv.h"
#include "event.h" #include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "sp_head.h" #include "sp_head.h"
...@@ -395,6 +397,8 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval) ...@@ -395,6 +397,8 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
break; break;
case INTERVAL_MICROSECOND: case INTERVAL_MICROSECOND:
DBUG_RETURN(EVEX_MICROSECOND_UNSUP); DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
case INTERVAL_LAST:
DBUG_ASSERT(0);
} }
if (interval_tmp.neg || expression > EVEX_MAX_INTERVAL_VALUE) if (interval_tmp.neg || expression > EVEX_MAX_INTERVAL_VALUE)
DBUG_RETURN(EVEX_BAD_PARAMS); DBUG_RETURN(EVEX_BAD_PARAMS);
...@@ -834,6 +838,8 @@ bool get_next_time(TIME *next, TIME *start, TIME *time_now, TIME *last_exec, ...@@ -834,6 +838,8 @@ bool get_next_time(TIME *next, TIME *start, TIME *time_now, TIME *last_exec,
*/ */
DBUG_RETURN(1); DBUG_RETURN(1);
break; break;
case INTERVAL_LAST:
DBUG_ASSERT(0);
} }
DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months)); DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months));
if (seconds) if (seconds)
...@@ -1279,7 +1285,6 @@ Event_timed::update_fields(THD *thd) ...@@ -1279,7 +1285,6 @@ Event_timed::update_fields(THD *thd)
DBUG_RETURN(ret); DBUG_RETURN(ret);
} }
extern LEX_STRING interval_type_to_name[];
/* /*
Get SHOW CREATE EVENT as string Get SHOW CREATE EVENT as string
......
#ifndef _EVENT_H_ #ifndef _EVENT_TIMED_H_
#define _EVENT_H_ #define _EVENT_TIMED_H_
/* Copyright (C) 2004-2006 MySQL AB /* Copyright (C) 2004-2006 MySQL AB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#define EVEX_OK 0 #define EVEX_OK 0
#define EVEX_KEY_NOT_FOUND -1 #define EVEX_KEY_NOT_FOUND -1
#define EVEX_OPEN_TABLE_FAILED -2 #define EVEX_OPEN_TABLE_FAILED -2
...@@ -40,83 +39,6 @@ ...@@ -40,83 +39,6 @@
#define EVENT_NOT_USED (1L << 1) #define EVENT_NOT_USED (1L << 1)
#define EVENT_FREE_WHEN_FINISHED (1L << 2) #define EVENT_FREE_WHEN_FINISHED (1L << 2)
class Event_timed;
class Events
{
public:
static ulong opt_event_scheduler;
static TYPELIB opt_typelib;
enum enum_table_field
{
FIELD_DB = 0,
FIELD_NAME,
FIELD_BODY,
FIELD_DEFINER,
FIELD_EXECUTE_AT,
FIELD_INTERVAL_EXPR,
FIELD_TRANSIENT_INTERVAL,
FIELD_CREATED,
FIELD_MODIFIED,
FIELD_LAST_EXECUTED,
FIELD_STARTS,
FIELD_ENDS,
FIELD_STATUS,
FIELD_ON_COMPLETION,
FIELD_SQL_MODE,
FIELD_COMMENT,
FIELD_COUNT /* a cool trick to count the number of fields :) */
};
static int
create_event(THD *thd, Event_timed *et, uint create_options,
uint *rows_affected);
static int
update_event(THD *thd, Event_timed *et, sp_name *new_name,
uint *rows_affected);
static int
drop_event(THD *thd, Event_timed *et, bool drop_if_exists,
uint *rows_affected);
static int
open_event_table(THD *thd, enum thr_lock_type lock_type, TABLE **table);
static int
show_create_event(THD *thd, sp_name *spn);
static int
reconstruct_interval_expression(String *buf, interval_type interval,
longlong expression);
static int
drop_schema_events(THD *thd, char *db);
static int
dump_internal_status(THD *thd);
static int
init();
static void
shutdown();
static void
init_mutexes();
static void
destroy_mutexes();
private:
/* Prevent use of these */
Events(const Events &);
void operator=(Events &);
};
class sp_head; class sp_head;
...@@ -292,5 +214,4 @@ class Event_timed ...@@ -292,5 +214,4 @@ class Event_timed
set_thread_id(ulong tid) { thread_id= tid; } set_thread_id(ulong tid) { thread_id= tid; }
}; };
#endif /* _EVENT_H_ */ #endif /* _EVENT_H_ */
...@@ -14,8 +14,10 @@ ...@@ -14,8 +14,10 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "event_priv.h" #include "mysql_priv.h"
#include "event.h" #include "events_priv.h"
#include "events.h"
#include "event_timed.h"
#include "event_scheduler.h" #include "event_scheduler.h"
#include "sp.h" #include "sp.h"
#include "sp_head.h" #include "sp_head.h"
...@@ -160,35 +162,11 @@ TABLE_FIELD_W_TYPE event_table_fields[Events::FIELD_COUNT] = { ...@@ -160,35 +162,11 @@ TABLE_FIELD_W_TYPE event_table_fields[Events::FIELD_COUNT] = {
}; };
LEX_STRING interval_type_to_name[] = {
{(char *) STRING_WITH_LEN("YEAR")},
{(char *) STRING_WITH_LEN("QUARTER")},
{(char *) STRING_WITH_LEN("MONTH")},
{(char *) STRING_WITH_LEN("DAY")},
{(char *) STRING_WITH_LEN("HOUR")},
{(char *) STRING_WITH_LEN("MINUTE")},
{(char *) STRING_WITH_LEN("WEEK")},
{(char *) STRING_WITH_LEN("SECOND")},
{(char *) STRING_WITH_LEN("MICROSECOND")},
{(char *) STRING_WITH_LEN("YEAR_MONTH")},
{(char *) STRING_WITH_LEN("DAY_HOUR")},
{(char *) STRING_WITH_LEN("DAY_MINUTE")},
{(char *) STRING_WITH_LEN("DAY_SECOND")},
{(char *) STRING_WITH_LEN("HOUR_MINUTE")},
{(char *) STRING_WITH_LEN("HOUR_SECOND")},
{(char *) STRING_WITH_LEN("MINUTE_SECOND")},
{(char *) STRING_WITH_LEN("DAY_MICROSECOND")},
{(char *) STRING_WITH_LEN("HOUR_MICROSECOND")},
{(char *) STRING_WITH_LEN("MINUTE_MICROSECOND")},
{(char *) STRING_WITH_LEN("SECOND_MICROSECOND")}
};
/* /*
Compares 2 LEX strings regarding case. Compares 2 LEX strings regarding case.
SYNOPSIS SYNOPSIS
my_time_compare() sortcmp_lex_string()
s - first LEX_STRING s - first LEX_STRING
t - second LEX_STRING t - second LEX_STRING
...@@ -210,68 +188,6 @@ int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs) ...@@ -210,68 +188,6 @@ int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs)
} }
/*
Compares 2 TIME structures
SYNOPSIS
my_time_compare()
a - first TIME
b - second time
RETURN VALUE
-1 - a < b
0 - a == b
1 - a > b
NOTES
TIME.second_part is not considered during comparison
*/
int
my_time_compare(TIME *a, TIME *b)
{
my_ulonglong a_t= TIME_to_ulonglong_datetime(a);
my_ulonglong b_t= TIME_to_ulonglong_datetime(b);
if (a_t > b_t)
return 1;
else if (a_t < b_t)
return -1;
return 0;
}
/*
Compares the execute_at members of 2 Event_timed instances.
Used as callback for the prioritized queue when shifting
elements inside.
SYNOPSIS
event_timed_compare()
vptr - not used (set it to NULL)
a - first Event_timed object
b - second Event_timed object
RETURNS:
-1 - a->execute_at < b->execute_at
0 - a->execute_at == b->execute_at
1 - a->execute_at > b->execute_at
Notes
execute_at.second_part is not considered during comparison
*/
int
event_timed_compare_q(void *vptr, byte* a, byte *b)
{
return my_time_compare(&((Event_timed *)a)->execute_at,
&((Event_timed *)b)->execute_at);
}
/* /*
Reconstructs interval expression from interval type and expression Reconstructs interval expression from interval type and expression
value that is in form of a value of the smalles entity: value that is in form of a value of the smalles entity:
...@@ -1002,7 +918,8 @@ Events::create_event(THD *thd, Event_timed *et, uint create_options, ...@@ -1002,7 +918,8 @@ Events::create_event(THD *thd, Event_timed *et, uint create_options,
rows_affected))) rows_affected)))
{ {
Event_scheduler *scheduler= Event_scheduler::get_instance(); Event_scheduler *scheduler= Event_scheduler::get_instance();
if (scheduler->initialized() && (ret= scheduler->add_event(thd, et, true))) if (scheduler->initialized() &&
(ret= scheduler->create_event(thd, et, true)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret); my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
} }
/* No need to close the table, it will be closed in sql_parse::do_command */ /* No need to close the table, it will be closed in sql_parse::do_command */
...@@ -1047,7 +964,7 @@ Events::update_event(THD *thd, Event_timed *et, sp_name *new_name, ...@@ -1047,7 +964,7 @@ Events::update_event(THD *thd, Event_timed *et, sp_name *new_name,
{ {
Event_scheduler *scheduler= Event_scheduler::get_instance(); Event_scheduler *scheduler= Event_scheduler::get_instance();
if (scheduler->initialized() && if (scheduler->initialized() &&
(ret= scheduler->replace_event(thd, et, (ret= scheduler->update_event(thd, et,
new_name? &new_name->m_db: NULL, new_name? &new_name->m_db: NULL,
new_name? &new_name->m_name: NULL))) new_name? &new_name->m_name: NULL)))
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret); my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
......
/* Copyright (C) 2004-2005 MySQL AB #ifndef _EVENT_H_
#define _EVENT_H_
/* Copyright (C) 2004-2006 MySQL AB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -13,3 +15,83 @@ ...@@ -13,3 +15,83 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
class Event_timed;
class Events
{
public:
static ulong opt_event_scheduler;
static TYPELIB opt_typelib;
enum enum_table_field
{
FIELD_DB = 0,
FIELD_NAME,
FIELD_BODY,
FIELD_DEFINER,
FIELD_EXECUTE_AT,
FIELD_INTERVAL_EXPR,
FIELD_TRANSIENT_INTERVAL,
FIELD_CREATED,
FIELD_MODIFIED,
FIELD_LAST_EXECUTED,
FIELD_STARTS,
FIELD_ENDS,
FIELD_STATUS,
FIELD_ON_COMPLETION,
FIELD_SQL_MODE,
FIELD_COMMENT,
FIELD_COUNT /* a cool trick to count the number of fields :) */
};
static int
create_event(THD *thd, Event_timed *et, uint create_options,
uint *rows_affected);
static int
update_event(THD *thd, Event_timed *et, sp_name *new_name,
uint *rows_affected);
static int
drop_event(THD *thd, Event_timed *et, bool drop_if_exists,
uint *rows_affected);
static int
open_event_table(THD *thd, enum thr_lock_type lock_type, TABLE **table);
static int
show_create_event(THD *thd, sp_name *spn);
static int
reconstruct_interval_expression(String *buf, interval_type interval,
longlong expression);
static int
drop_schema_events(THD *thd, char *db);
static int
dump_internal_status(THD *thd);
static int
init();
static void
shutdown();
static void
init_mutexes();
static void
destroy_mutexes();
private:
/* Prevent use of these */
Events(const Events &);
void operator=(Events &);
};
#endif /* _EVENT_H_ */
...@@ -16,9 +16,6 @@ ...@@ -16,9 +16,6 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysql_priv.h"
#define EVENT_EXEC_STARTED 0 #define EVENT_EXEC_STARTED 0
#define EVENT_EXEC_ALREADY_EXEC 1 #define EVENT_EXEC_ALREADY_EXEC 1
#define EVENT_EXEC_CANT_FORK 2 #define EVENT_EXEC_CANT_FORK 2
...@@ -27,17 +24,13 @@ ...@@ -27,17 +24,13 @@
#define EVEX_NAME_FIELD_LEN 64 #define EVEX_NAME_FIELD_LEN 64
#define EVEX_MAX_INTERVAL_VALUE 2147483647L #define EVEX_MAX_INTERVAL_VALUE 2147483647L
int class Event_timed;
my_time_compare(TIME *a, TIME *b);
int int
evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname, evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname,
const LEX_STRING ev_name, const LEX_STRING ev_name,
TABLE *table); TABLE *table);
int
event_timed_compare_q(void *vptr, byte* a, byte *b);
int int
db_drop_event(THD *thd, Event_timed *et, bool drop_if_exists, db_drop_event(THD *thd, Event_timed *et, bool drop_if_exists,
uint *rows_affected); uint *rows_affected);
......
...@@ -1759,6 +1759,8 @@ bool date_add_interval(TIME *ltime, interval_type int_type, INTERVAL interval); ...@@ -1759,6 +1759,8 @@ bool date_add_interval(TIME *ltime, interval_type int_type, INTERVAL interval);
bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, bool calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign,
longlong *seconds_out, long *microseconds_out); longlong *seconds_out, long *microseconds_out);
extern LEX_STRING interval_type_to_name[];
extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type, extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type,
const char *format_str, const char *format_str,
uint format_length); uint format_length);
...@@ -1774,6 +1776,7 @@ void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time, ...@@ -1774,6 +1776,7 @@ void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str); String *str);
void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time, void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time,
String *str); String *str);
int my_time_compare(TIME *a, TIME *b);
int test_if_number(char *str,int *res,bool allow_wildcards); int test_if_number(char *str,int *res,bool allow_wildcards);
void change_byte(byte *,uint,char,char); void change_byte(byte *,uint,char,char);
...@@ -1791,6 +1794,7 @@ void filesort_free_buffers(TABLE *table); ...@@ -1791,6 +1794,7 @@ void filesort_free_buffers(TABLE *table);
void change_double_for_sort(double nr,byte *to); void change_double_for_sort(double nr,byte *to);
double my_double_round(double value, int dec, bool truncate); double my_double_round(double value, int dec, bool truncate);
int get_quick_record(SQL_SELECT *select); int get_quick_record(SQL_SELECT *select);
int calc_weekday(long daynr,bool sunday_first_day_of_week); int calc_weekday(long daynr,bool sunday_first_day_of_week);
uint calc_week(TIME *l_time, uint week_behaviour, uint *year); uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
void find_date(char *pos,uint *vek,uint flag); void find_date(char *pos,uint *vek,uint flag);
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "stacktrace.h" #include "stacktrace.h"
#include "mysqld_suffix.h" #include "mysqld_suffix.h"
#include "mysys_err.h" #include "mysys_err.h"
#include "event.h" #include "events.h"
#include "ha_myisam.h" #include "ha_myisam.h"
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include "mysql_priv.h" #include "mysql_priv.h"
#include <mysys_err.h> #include <mysys_err.h>
#include "sp.h" #include "sp.h"
#include "event.h" #include "events.h"
#include <my_dir.h> #include <my_dir.h>
#include <m_ctype.h> #include <m_ctype.h>
#ifdef __WIN__ #ifdef __WIN__
......
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
#include "sp_head.h" #include "sp_head.h"
#include "sp.h" #include "sp.h"
#include "sp_cache.h" #include "sp_cache.h"
#include "event.h" #include "events.h"
#include "event_timed.h"
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
/* /*
...@@ -3835,7 +3836,9 @@ mysql_execute_command(THD *thd) ...@@ -3835,7 +3836,9 @@ mysql_execute_command(THD *thd)
uint rows_affected= 1; uint rows_affected= 1;
DBUG_ASSERT(lex->et); DBUG_ASSERT(lex->et);
do { do {
if (! lex->et->dbname.str) if (! lex->et->dbname.str ||
(lex->sql_command == SQLCOM_ALTER_EVENT && lex->spname &&
!lex->spname->m_db.str))
{ {
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
res= true; res= true;
...@@ -3843,7 +3846,10 @@ mysql_execute_command(THD *thd) ...@@ -3843,7 +3846,10 @@ mysql_execute_command(THD *thd)
} }
if (check_access(thd, EVENT_ACL, lex->et->dbname.str, 0, 0, 0, if (check_access(thd, EVENT_ACL, lex->et->dbname.str, 0, 0, 0,
is_schema_db(lex->et->dbname.str))) is_schema_db(lex->et->dbname.str)) ||
(lex->sql_command == SQLCOM_ALTER_EVENT && lex->spname &&
(check_access(thd, EVENT_ACL, lex->spname->m_db.str, 0, 0, 0,
is_schema_db(lex->spname->m_db.str)))))
break; break;
if (end_active_trans(thd)) if (end_active_trans(thd))
......
...@@ -26,13 +26,38 @@ ...@@ -26,13 +26,38 @@
#include "sql_trigger.h" #include "sql_trigger.h"
#include "authors.h" #include "authors.h"
#include "contributors.h" #include "contributors.h"
#include "event.h" #include "events.h"
#include "event_timed.h"
#include <my_dir.h> #include <my_dir.h>
#ifdef WITH_PARTITION_STORAGE_ENGINE #ifdef WITH_PARTITION_STORAGE_ENGINE
#include "ha_partition.h" #include "ha_partition.h"
#endif #endif
enum enum_i_s_events_fields
{
ISE_EVENT_CATALOG= 0,
ISE_EVENT_SCHEMA,
ISE_EVENT_NAME,
ISE_DEFINER,
ISE_EVENT_BODY,
ISE_EVENT_DEFINITION,
ISE_EVENT_TYPE,
ISE_EXECUTE_AT,
ISE_INTERVAL_VALUE,
ISE_INTERVAL_FIELD,
ISE_SQL_MODE,
ISE_STARTS,
ISE_ENDS,
ISE_STATUS,
ISE_ON_COMPLETION,
ISE_CREATED,
ISE_LAST_ALTERED,
ISE_LAST_EXECUTED,
ISE_EVENT_COMMENT
};
static const char *grant_names[]={ static const char *grant_names[]={
"select","insert","update","delete","create","drop","reload","shutdown", "select","insert","update","delete","create","drop","reload","shutdown",
"process","file","grant","references","index","alter"}; "process","file","grant","references","index","alter"};
...@@ -4116,6 +4141,8 @@ static interval_type get_real_interval_type(interval_type i_type) ...@@ -4116,6 +4141,8 @@ static interval_type get_real_interval_type(interval_type i_type)
case INTERVAL_SECOND_MICROSECOND: case INTERVAL_SECOND_MICROSECOND:
case INTERVAL_MICROSECOND: case INTERVAL_MICROSECOND:
return INTERVAL_MICROSECOND; return INTERVAL_MICROSECOND;
case INTERVAL_LAST:
DBUG_ASSERT(0);
} }
DBUG_ASSERT(0); DBUG_ASSERT(0);
return INTERVAL_SECOND; return INTERVAL_SECOND;
...@@ -4171,85 +4198,101 @@ copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table) ...@@ -4171,85 +4198,101 @@ copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
/* ->field[0] is EVENT_CATALOG and is by default NULL */ /* ->field[0] is EVENT_CATALOG and is by default NULL */
sch_table->field[1]->store(et.dbname.str, et.dbname.length, scs); sch_table->field[ISE_EVENT_SCHEMA]->
sch_table->field[2]->store(et.name.str, et.name.length, scs); store(et.dbname.str, et.dbname.length,scs);
sch_table->field[3]->store(et.definer.str, et.definer.length, scs); sch_table->field[ISE_EVENT_NAME]->
sch_table->field[4]->store(et.body.str, et.body.length, scs); store(et.name.str, et.name.length, scs);
sch_table->field[ISE_DEFINER]->
store(et.definer.str, et.definer.length, scs);
sch_table->field[ISE_EVENT_BODY]->
store(STRING_WITH_LEN("SQL"), scs);
sch_table->field[ISE_EVENT_DEFINITION]->
store(et.body.str, et.body.length, scs);
/* [9] is SQL_MODE */ /* SQL_MODE */
{ {
byte *sql_mode_str; byte *sql_mode_str;
ulong sql_mode_len=0; ulong sql_mode_len= 0;
sql_mode_str= sql_mode_str=
sys_var_thd_sql_mode::symbolic_mode_representation(thd, et.sql_mode, sys_var_thd_sql_mode::symbolic_mode_representation(thd, et.sql_mode,
&sql_mode_len); &sql_mode_len);
sch_table->field[9]->store((const char*)sql_mode_str, sql_mode_len, scs); sch_table->field[ISE_SQL_MODE]->
store((const char*)sql_mode_str, sql_mode_len, scs);
} }
if (et.expression) if (et.expression)
{ {
String show_str; String show_str;
/* type */ /* type */
sch_table->field[5]->store(STRING_WITH_LEN("RECURRING"), scs); sch_table->field[ISE_EVENT_TYPE]->store(STRING_WITH_LEN("RECURRING"), scs);
if (Events::reconstruct_interval_expression(&show_str, et.interval, if (Events::reconstruct_interval_expression(&show_str, et.interval,
et.expression)) et.expression))
DBUG_RETURN(1); DBUG_RETURN(1);
sch_table->field[7]->set_notnull(); sch_table->field[ISE_INTERVAL_VALUE]->set_notnull();
sch_table->field[7]->store(show_str.ptr(), show_str.length(), scs); sch_table->field[ISE_INTERVAL_VALUE]->
store(show_str.ptr(), show_str.length(), scs);
LEX_STRING *ival= &interval_type_to_name[et.interval]; LEX_STRING *ival= &interval_type_to_name[et.interval];
sch_table->field[8]->set_notnull(); sch_table->field[ISE_INTERVAL_FIELD]->set_notnull();
sch_table->field[8]->store(ival->str, ival->length, scs); sch_table->field[ISE_INTERVAL_FIELD]->store(ival->str, ival->length, scs);
/* starts & ends */ /* starts & ends . STARTS is always set - see sql_yacc.yy */
sch_table->field[10]->set_notnull(); sch_table->field[ISE_STARTS]->set_notnull();
sch_table->field[10]->store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME); sch_table->field[ISE_STARTS]->
store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME);
if (!et.ends_null) if (!et.ends_null)
{ {
sch_table->field[11]->set_notnull(); sch_table->field[ISE_ENDS]->set_notnull();
sch_table->field[11]->store_time(&et.ends, MYSQL_TIMESTAMP_DATETIME); sch_table->field[ISE_ENDS]->
store_time(&et.ends, MYSQL_TIMESTAMP_DATETIME);
} }
} }
else else
{ {
//type /* type */
sch_table->field[5]->store(STRING_WITH_LEN("ONE TIME"), scs); sch_table->field[ISE_EVENT_TYPE]->store(STRING_WITH_LEN("ONE TIME"), scs);
sch_table->field[6]->set_notnull(); sch_table->field[ISE_EXECUTE_AT]->set_notnull();
sch_table->field[6]->store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME); sch_table->field[ISE_EXECUTE_AT]->
store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME);
} }
/* status */ /* status */
if (et.status == Event_timed::ENABLED) if (et.status == Event_timed::ENABLED)
sch_table->field[12]->store(STRING_WITH_LEN("ENABLED"), scs); sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("ENABLED"), scs);
else else
sch_table->field[12]->store(STRING_WITH_LEN("DISABLED"), scs); sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("DISABLED"), scs);
/* on_completion */ /* on_completion */
if (et.on_completion == Event_timed::ON_COMPLETION_DROP) if (et.on_completion == Event_timed::ON_COMPLETION_DROP)
sch_table->field[13]->store(STRING_WITH_LEN("NOT PRESERVE"), scs); sch_table->field[ISE_ON_COMPLETION]->
store(STRING_WITH_LEN("NOT PRESERVE"), scs);
else else
sch_table->field[13]->store(STRING_WITH_LEN("PRESERVE"), scs); sch_table->field[ISE_ON_COMPLETION]->
store(STRING_WITH_LEN("PRESERVE"), scs);
int not_used=0; int not_used=0;
number_to_datetime(et.created, &time, 0, &not_used); number_to_datetime(et.created, &time, 0, &not_used);
DBUG_ASSERT(not_used==0); DBUG_ASSERT(not_used==0);
sch_table->field[14]->store_time(&time, MYSQL_TIMESTAMP_DATETIME); sch_table->field[ISE_CREATED]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
number_to_datetime(et.modified, &time, 0, &not_used); number_to_datetime(et.modified, &time, 0, &not_used);
DBUG_ASSERT(not_used==0); DBUG_ASSERT(not_used==0);
sch_table->field[15]->store_time(&time, MYSQL_TIMESTAMP_DATETIME); sch_table->field[ISE_LAST_ALTERED]->
store_time(&time, MYSQL_TIMESTAMP_DATETIME);
if (et.last_executed.year) if (et.last_executed.year)
{ {
sch_table->field[16]->set_notnull(); sch_table->field[ISE_LAST_EXECUTED]->set_notnull();
sch_table->field[16]->store_time(&et.last_executed,MYSQL_TIMESTAMP_DATETIME); sch_table->field[ISE_LAST_EXECUTED]->
store_time(&et.last_executed, MYSQL_TIMESTAMP_DATETIME);
} }
sch_table->field[17]->store(et.comment.str, et.comment.length, scs); sch_table->field[ISE_EVENT_COMMENT]->
store(et.comment.str, et.comment.length, scs);
if (schema_table_store_record(thd, sch_table)) if (schema_table_store_record(thd, sch_table))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -5173,7 +5216,8 @@ ST_FIELD_INFO events_fields_info[]= ...@@ -5173,7 +5216,8 @@ ST_FIELD_INFO events_fields_info[]=
{"EVENT_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Db"}, {"EVENT_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Db"},
{"EVENT_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Name"}, {"EVENT_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Name"},
{"DEFINER", 77, MYSQL_TYPE_STRING, 0, 0, "Definer"}, {"DEFINER", 77, MYSQL_TYPE_STRING, 0, 0, "Definer"},
{"EVENT_BODY", 65535, MYSQL_TYPE_STRING, 0, 0, 0}, {"EVENT_BODY", 8, MYSQL_TYPE_STRING, 0, 0, 0},
{"EVENT_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 0, 0},
{"EVENT_TYPE", 9, MYSQL_TYPE_STRING, 0, 0, "Type"}, {"EVENT_TYPE", 9, MYSQL_TYPE_STRING, 0, 0, "Type"},
{"EXECUTE_AT", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Execute at"}, {"EXECUTE_AT", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Execute at"},
{"INTERVAL_VALUE", 256, MYSQL_TYPE_STRING, 0, 1, "Interval value"}, {"INTERVAL_VALUE", 256, MYSQL_TYPE_STRING, 0, 1, "Interval value"},
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "sp_pcontext.h" #include "sp_pcontext.h"
#include "sp_rcontext.h" #include "sp_rcontext.h"
#include "sp.h" #include "sp.h"
#include "event.h" #include "event_timed.h"
#include <myisam.h> #include <myisam.h>
#include <myisammrg.h> #include <myisammrg.h>
......
...@@ -24,6 +24,30 @@ ...@@ -24,6 +24,30 @@
/* Some functions to calculate dates */ /* Some functions to calculate dates */
#ifndef TESTTIME #ifndef TESTTIME
LEX_STRING interval_type_to_name[INTERVAL_LAST] = {
{ C_STRING_WITH_LEN("YEAR")},
{ C_STRING_WITH_LEN("QUARTER")},
{ C_STRING_WITH_LEN("MONTH")},
{ C_STRING_WITH_LEN("DAY")},
{ C_STRING_WITH_LEN("HOUR")},
{ C_STRING_WITH_LEN("MINUTE")},
{ C_STRING_WITH_LEN("WEEK")},
{ C_STRING_WITH_LEN("SECOND")},
{ C_STRING_WITH_LEN("MICROSECOND")},
{ C_STRING_WITH_LEN("YEAR_MONTH")},
{ C_STRING_WITH_LEN("DAY_HOUR")},
{ C_STRING_WITH_LEN("DAY_MINUTE")},
{ C_STRING_WITH_LEN("DAY_SECOND")},
{ C_STRING_WITH_LEN("HOUR_MINUTE")},
{ C_STRING_WITH_LEN("HOUR_SECOND")},
{ C_STRING_WITH_LEN("MINUTE_SECOND")},
{ C_STRING_WITH_LEN("DAY_MICROSECOND")},
{ C_STRING_WITH_LEN("HOUR_MICROSECOND")},
{ C_STRING_WITH_LEN("MINUTE_MICROSECOND")},
{ C_STRING_WITH_LEN("SECOND_MICROSECOND")}
};
/* Calc weekday from daynr */ /* Calc weekday from daynr */
/* Returns 0 for monday, 1 for tuesday .... */ /* Returns 0 for monday, 1 for tuesday .... */
...@@ -910,4 +934,36 @@ calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, longlong *seconds_out, ...@@ -910,4 +934,36 @@ calc_time_diff(TIME *l_time1, TIME *l_time2, int l_sign, longlong *seconds_out,
} }
/*
Compares 2 TIME structures
SYNOPSIS
my_time_compare()
a - first time
b - second time
RETURN VALUE
-1 - a < b
0 - a == b
1 - a > b
NOTES
TIME.second_part is not considered during comparison
*/
int
my_time_compare(TIME *a, TIME *b)
{
my_ulonglong a_t= TIME_to_ulonglong_datetime(a);
my_ulonglong b_t= TIME_to_ulonglong_datetime(b);
if (a_t > b_t)
return 1;
else if (a_t < b_t)
return -1;
return 0;
}
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment