mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.1
into mysql.com:/opt/local/work/mysql-5.1-runtime mysql-test/r/information_schema.result: Auto merged sql/CMakeLists.txt: Auto merged sql/mysql_priv.h: Auto merged sql/mysqld.cc: Auto merged sql/events.cc: Auto merged sql/sql_parse.cc: Auto merged sql/sql_show.cc: Auto merged sql/sql_yacc.yy: Auto merged mysql-test/t/events_microsec.test: SCCS merged
This commit is contained in:
commit
fee803af17
38 changed files with 590 additions and 366 deletions
|
@ -462,6 +462,7 @@ libmysqld/event.cc
|
|||
libmysqld/event_executor.cc
|
||||
libmysqld/event_scheduler.cc
|
||||
libmysqld/event_timed.cc
|
||||
libmysqld/events.cc
|
||||
libmysqld/examples/client_test.c
|
||||
libmysqld/examples/client_test.cc
|
||||
libmysqld/examples/completion_hash.cc
|
||||
|
|
|
@ -104,7 +104,7 @@ enum interval_type
|
|||
INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
|
||||
INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
|
||||
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
|
||||
|
|
|
@ -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
|
||||
../sql-common/my_time.c ../sql-common/my_user.c
|
||||
../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/gstream.cc ../sql/ha_heap.cc ../sql/ha_myisam.cc
|
||||
../sql/ha_myisammrg.cc ${mysql_se_ha_src}
|
||||
|
|
|
@ -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 \
|
||||
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 \
|
||||
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 \
|
||||
sql_tablespace.cc \
|
||||
rpl_injector.cc my_user.c partition_info.cc
|
||||
|
|
|
@ -365,19 +365,19 @@ on schedule every 10 hour
|
|||
disable
|
||||
do
|
||||
select 1;
|
||||
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space';
|
||||
event_schema event_name definer event_body
|
||||
select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
|
||||
event_schema event_name definer event_definition
|
||||
events_test white_space root@localhost select 1
|
||||
drop event white_space;
|
||||
create event white_space on schedule every 10 hour disable do
|
||||
select 2;
|
||||
select event_schema, event_name, definer, event_body from information_schema.events where event_name='white_space';
|
||||
event_schema event_name definer event_body
|
||||
select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
|
||||
event_schema event_name definer event_definition
|
||||
events_test white_space root@localhost select 2
|
||||
drop event white_space;
|
||||
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';
|
||||
event_schema event_name definer event_body
|
||||
select event_schema, event_name, definer, event_definition from information_schema.events where event_name='white_space';
|
||||
event_schema event_name definer event_definition
|
||||
events_test white_space root@localhost select 3
|
||||
drop event white_space;
|
||||
create event e1 on schedule every 1 year do set @a = 5;
|
||||
|
|
|
@ -178,4 +178,27 @@ drop procedure ee_16407_6_pendant;
|
|||
set global event_scheduler= 2;
|
||||
drop table events_smode_test;
|
||||
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;
|
||||
|
|
|
@ -4,9 +4,9 @@ CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
|
|||
SHOW EVENTS;
|
||||
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
|
||||
events_test one_event root@localhost RECURRING NULL 10 SECOND # # ENABLED
|
||||
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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
CREATE DATABASE events_test2;
|
||||
CREATE USER ev_test@localhost;
|
||||
GRANT ALL ON events_test.* to ev_test@localhost;
|
||||
|
@ -57,65 +57,65 @@ USE events_test2;
|
|||
CREATE EVENT four_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
||||
USE events_test;
|
||||
"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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
NULL events_test2 four_event ev_test@localhost SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||
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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
NULL events_test2 four_event ev_test@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||
DROP DATABASE events_test2;
|
||||
"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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three 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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
CREATE DATABASE events_test2;
|
||||
USE events_test2;
|
||||
CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
||||
"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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
NULL events_test2 five_event root@localhost SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||
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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
NULL events_test2 five_event root@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||
REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
|
||||
USE test;
|
||||
"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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three 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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
"Let's test ALTER EVENT which changes the definer"
|
||||
USE events_test;
|
||||
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
|
||||
"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';
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event ev_test@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
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';
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event ev_test@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE
|
||||
USE events_test;
|
||||
ALTER EVENT one_event COMMENT "comment";
|
||||
"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';
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE comment
|
||||
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';
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE comment
|
||||
ALTER EVENT one_event DO SELECT 12;
|
||||
"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';
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event ev_test@localhost SELECT 12 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE comment
|
||||
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';
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test one_event ev_test@localhost SQL SELECT 12 RECURRING NULL 10 SECOND ENABLED NOT PRESERVE comment
|
||||
"make the definer again root@localhost"
|
||||
ALTER EVENT one_event COMMENT "new comment";
|
||||
"test DROP by another user"
|
||||
DROP EVENT one_event;
|
||||
"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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test two_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
NULL events_test2 five_event root@localhost SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||
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;
|
||||
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
|
||||
NULL events_test two_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE two event
|
||||
NULL events_test three_event ev_test@localhost SQL SELECT 123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
|
||||
NULL events_test2 five_event root@localhost SQL SELECT 42 RECURRING NULL 20 SECOND ENABLED NOT PRESERVE
|
||||
DROP USER ev_test@localhost;
|
||||
DROP DATABASE events_test2;
|
||||
DROP DATABASE events_test;
|
||||
|
|
|
@ -31,6 +31,8 @@ SHOW VARIABLES LIKE 'log_slow_queries';
|
|||
Variable_name Value
|
||||
log_slow_queries ON
|
||||
DROP FUNCTION get_value;
|
||||
"Make it quite long"
|
||||
SET SESSION long_query_time=300;
|
||||
TRUNCATE mysql.slow_log;
|
||||
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
|
||||
user_host query_time db sql_text
|
||||
|
@ -44,7 +46,10 @@ SLEEP(2)
|
|||
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
|
||||
user_host query_time db sql_text
|
||||
USER_HOST SLEEPVAL events_test SELECT SLEEP(2)
|
||||
SET SESSION long_query_time=300;
|
||||
"Make it quite long"
|
||||
TRUNCATE mysql.slow_log;
|
||||
SET SESSION long_query_time=1;
|
||||
CREATE TABLE slow_event_test (slo_val tinyint, val tinyint);
|
||||
"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);
|
||||
|
@ -63,9 +68,9 @@ slo_val val
|
|||
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
|
||||
user_host query_time db sql_text
|
||||
"This should go to the slow log"
|
||||
DROP EVENT long_event;
|
||||
SET SESSION long_query_time=10;
|
||||
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);
|
||||
"Sleep some more time than the actual event run will take"
|
||||
"Check our table. Should see 2 rows"
|
||||
|
@ -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 SLEEPVAL events_test INSERT INTO slow_event_test SELECT @@long_query_time, SLEEP(2)
|
||||
DROP EVENT long_event2;
|
||||
SET GLOBAL long_query_time =@old_global_long_query_time;
|
||||
SET SESSION long_query_time =@old_session_long_query_time;
|
||||
"Make it quite long"
|
||||
SET SESSION long_query_time=300;
|
||||
TRUNCATE mysql.slow_log;
|
||||
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;
|
||||
|
|
|
@ -13,7 +13,9 @@ Variable_name Value
|
|||
server_id 1
|
||||
|
||||
---> connection: default
|
||||
CREATE INSTANCE mysqld3;
|
||||
CREATE INSTANCE mysqld3
|
||||
server_id = 3,
|
||||
socket = "$MYSQL_TMP_DIR/mysqld_3.sock";
|
||||
SHOW INSTANCES;
|
||||
instance_name state
|
||||
mysqld3 offline
|
||||
|
@ -22,6 +24,7 @@ mysqld1 online
|
|||
--------------------------------------------------------------------
|
||||
server_id = 1
|
||||
server_id = 2
|
||||
server_id=3
|
||||
--------------------------------------------------------------------
|
||||
CREATE INSTANCE mysqld1;
|
||||
ERROR HY000: Instance already exists
|
||||
|
@ -32,7 +35,10 @@ ERROR HY000: Instance already exists
|
|||
--------------------------------------------------------------------
|
||||
nonguarded
|
||||
--------------------------------------------------------------------
|
||||
CREATE INSTANCE mysqld4 nonguarded;
|
||||
CREATE INSTANCE mysqld4
|
||||
nonguarded,
|
||||
server_id = 4,
|
||||
socket = "$MYSQL_TMP_DIR/mysqld_4.sock";
|
||||
SHOW INSTANCES;
|
||||
instance_name state
|
||||
mysqld3 offline
|
||||
|
@ -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;
|
||||
instance_name state
|
||||
mysqld1 online
|
||||
|
@ -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;
|
||||
instance_name state
|
||||
mysqld1 online
|
||||
|
@ -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;
|
||||
instance_name state
|
||||
mysqld1 online
|
||||
|
@ -126,56 +144,67 @@ mysqld6 offline
|
|||
mysqld3 offline
|
||||
mysqld4 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;
|
||||
instance_name state
|
||||
mysqld1 online
|
||||
mysqld9a offline
|
||||
mysqld9 offline
|
||||
mysqld5 offline
|
||||
mysqld6 offline
|
||||
mysqld3 offline
|
||||
mysqld4 offline
|
||||
mysqld9 offline
|
||||
mysqld10 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;
|
||||
instance_name state
|
||||
mysqld9b offline
|
||||
mysqld9a offline
|
||||
mysqld1 online
|
||||
mysqld11 offline
|
||||
mysqld5 offline
|
||||
mysqld6 offline
|
||||
mysqld3 offline
|
||||
mysqld4 offline
|
||||
mysqld9 offline
|
||||
mysqld10 offline
|
||||
mysqld2 offline
|
||||
mysqld1 online
|
||||
CREATE INSTANCE mysqld9c test-6="abc\rdef", test-7="abc\\def";
|
||||
mysqld9 offline
|
||||
CREATE INSTANCE mysqld12
|
||||
test-6="abc\rdef",
|
||||
test-7="abc\\def",
|
||||
server_id = 12,
|
||||
socket = "$MYSQL_TMP_DIR/mysqld_12.sock";
|
||||
SHOW INSTANCES;
|
||||
instance_name state
|
||||
mysqld9b offline
|
||||
mysqld6 offline
|
||||
mysqld1 online
|
||||
mysqld9 offline
|
||||
mysqld5 offline
|
||||
mysqld9c offline
|
||||
mysqld6 offline
|
||||
mysqld3 offline
|
||||
mysqld4 offline
|
||||
mysqld9 offline
|
||||
mysqld10 offline
|
||||
mysqld2 offline
|
||||
mysqld1 online
|
||||
mysqld9a offline
|
||||
CREATE INSTANCE mysqld10 test-bad=' \ ';
|
||||
mysqld12 offline
|
||||
mysqld11 offline
|
||||
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
|
||||
SHOW INSTANCES;
|
||||
instance_name state
|
||||
mysqld9b offline
|
||||
mysqld6 offline
|
||||
mysqld1 online
|
||||
mysqld9 offline
|
||||
mysqld5 offline
|
||||
mysqld9c offline
|
||||
mysqld6 offline
|
||||
mysqld3 offline
|
||||
mysqld4 offline
|
||||
mysqld9 offline
|
||||
mysqld10 offline
|
||||
mysqld2 offline
|
||||
mysqld1 online
|
||||
mysqld9a offline
|
||||
mysqld12 offline
|
||||
mysqld11 offline
|
||||
--------------------------------------------------------------------
|
||||
test-1= hello world
|
||||
--------------------------------------------------------------------
|
||||
|
|
|
@ -13,7 +13,10 @@ UNSET mysqld1.server_id;
|
|||
ERROR HY000: The instance is active. Stop the instance first
|
||||
SET mysqld1.server_id = 11;
|
||||
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;
|
||||
UNSET mysqld3.server_id;
|
||||
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
|
|||
--------------------------------------------------------------------
|
||||
server_id = 1
|
||||
server_id=2
|
||||
server_id=3
|
||||
--------------------------------------------------------------------
|
||||
UNSET mysqld2.server_id, mysqld3.server_id, mysqld1.ccc;
|
||||
ERROR HY000: The instance is active. Stop the instance first
|
||||
--------------------------------------------------------------------
|
||||
server_id = 1
|
||||
server_id=2
|
||||
server_id=3
|
||||
--------------------------------------------------------------------
|
||||
DROP INSTANCE mysqld3;
|
||||
SET mysqld2.server_id=222;
|
||||
|
|
|
@ -756,7 +756,7 @@ information_schema.columns
|
|||
where data_type = 'longtext';
|
||||
table_schema table_name column_name
|
||||
information_schema COLUMNS COLUMN_TYPE
|
||||
information_schema EVENTS EVENT_BODY
|
||||
information_schema EVENTS EVENT_DEFINITION
|
||||
information_schema EVENTS SQL_MODE
|
||||
information_schema PARTITIONS PARTITION_EXPRESSION
|
||||
information_schema PARTITIONS SUBPARTITION_EXPRESSION
|
||||
|
|
|
@ -13,9 +13,9 @@
|
|||
#events_stress : 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.
|
||||
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_life_cycle : Bug#20368 2006-06-10 alik im_life_cycle test fails
|
||||
#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_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_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
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
create database if not exists events_test;
|
||||
use events_test;
|
||||
|
||||
|
@ -327,15 +330,15 @@ on schedule every 10 hour
|
|||
disable
|
||||
do
|
||||
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;
|
||||
create event white_space on schedule every 10 hour disable do
|
||||
|
||||
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;
|
||||
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;
|
||||
#
|
||||
# END: BUG #17453: Creating Event crash the server
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
create database if not exists events_test;
|
||||
use events_test;
|
||||
|
||||
|
@ -172,4 +175,38 @@ set sql_mode=@old_sql_mode;
|
|||
#
|
||||
# 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;
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
CREATE DATABASE IF NOT EXISTS events_test;
|
||||
use events_test;
|
||||
#
|
||||
|
@ -6,7 +9,7 @@ use events_test;
|
|||
CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
|
||||
--replace_column 8 # 9 #
|
||||
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 USER 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;
|
|||
connection default;
|
||||
USE events_test;
|
||||
--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;
|
||||
--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;
|
||||
CREATE DATABASE events_test2;
|
||||
|
@ -64,27 +67,27 @@ CREATE EVENT five_event ON SCHEDULE EVERY 20 SECOND DO SELECT 42;
|
|||
|
||||
connection ev_con1;
|
||||
--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;
|
||||
REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
|
||||
connection ev_con1;
|
||||
USE test;
|
||||
--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"
|
||||
USE events_test;
|
||||
ALTER EVENT one_event ON SCHEDULE EVERY 10 SECOND;
|
||||
--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;
|
||||
USE events_test;
|
||||
ALTER EVENT one_event COMMENT "comment";
|
||||
connection ev_con1;
|
||||
--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;
|
||||
--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;
|
||||
--echo "make the definer again root@localhost"
|
||||
ALTER EVENT one_event COMMENT "new comment";
|
||||
|
@ -93,7 +96,7 @@ connection ev_con1;
|
|||
DROP EVENT one_event;
|
||||
connection default;
|
||||
--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;
|
||||
connection default;
|
||||
DROP USER ev_test@localhost;
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
create database if not exists events_test;
|
||||
use events_test;
|
||||
--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());
|
|||
SET @old_session_long_query_time:=@@long_query_time;
|
||||
SHOW VARIABLES LIKE 'log_slow_queries';
|
||||
DROP FUNCTION get_value;
|
||||
--echo "Make it quite long"
|
||||
SET SESSION long_query_time=300;
|
||||
TRUNCATE mysql.slow_log;
|
||||
--replace_column 1 USER_HOST
|
||||
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
|
||||
|
@ -61,7 +66,10 @@ SET SESSION long_query_time=1;
|
|||
SELECT SLEEP(2);
|
||||
--replace_column 1 USER_HOST 2 SLEEPVAL
|
||||
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;
|
||||
SET SESSION long_query_time=1;
|
||||
CREATE TABLE slow_event_test (slo_val tinyint, val tinyint);
|
||||
--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);
|
||||
|
@ -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"
|
||||
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
|
||||
--echo "This should go to the slow log"
|
||||
DROP EVENT long_event;
|
||||
SET SESSION long_query_time=10;
|
||||
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);
|
||||
--echo "Sleep some more time than the actual event run will take"
|
||||
--sleep 3
|
||||
|
@ -87,9 +95,11 @@ SELECT * FROM slow_event_test;
|
|||
--replace_column 1 USER_HOST 2 SLEEPVAL
|
||||
SELECT user_host, query_time, db, sql_text FROM mysql.slow_log;
|
||||
DROP EVENT long_event2;
|
||||
SET GLOBAL long_query_time =@old_global_long_query_time;
|
||||
SET SESSION long_query_time =@old_session_long_query_time;
|
||||
--echo "Make it quite long"
|
||||
SET SESSION long_query_time=300;
|
||||
TRUNCATE mysql.slow_log;
|
||||
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;
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
--disable_warnings
|
||||
create database if not exists events_test;
|
||||
--enable_warnings
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
CREATE DATABASE IF NOT EXISTS events_test;
|
||||
USE events_test;
|
||||
CREATE TABLE table_1(a int);
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
CREATE DATABASE IF NOT EXISTS events_test;
|
||||
#
|
||||
# DROP DATABASE test start (bug #16406)
|
||||
|
|
|
@ -21,6 +21,9 @@
|
|||
# - DROP INSTANCE fails for active instance.
|
||||
# - 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
|
||||
|
@ -69,7 +72,9 @@ SHOW VARIABLES LIKE 'server_id';
|
|||
# Check that CREATE INSTANCE succeeds for non-existing instance and also check
|
||||
# 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;
|
||||
|
||||
|
@ -99,7 +104,10 @@ CREATE INSTANCE mysqld3;
|
|||
--exec grep nonguarded $MYSQLTEST_VARDIR/im.cnf;
|
||||
--echo --------------------------------------------------------------------
|
||||
|
||||
CREATE INSTANCE mysqld4 nonguarded;
|
||||
CREATE INSTANCE mysqld4
|
||||
nonguarded,
|
||||
server_id = 4,
|
||||
socket = "$MYSQL_TMP_DIR/mysqld_4.sock";
|
||||
|
||||
SHOW INSTANCES;
|
||||
|
||||
|
@ -115,7 +123,11 @@ SHOW INSTANCES;
|
|||
--exec grep test-B $MYSQLTEST_VARDIR/im.cnf || true;
|
||||
--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;
|
||||
|
||||
|
@ -135,7 +147,11 @@ SHOW INSTANCES;
|
|||
--exec grep test-C $MYSQLTEST_VARDIR/im.cnf || true;
|
||||
--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;
|
||||
|
||||
|
@ -183,22 +199,37 @@ SHOW INSTANCES;
|
|||
--exec grep test-4 $MYSQLTEST_VARDIR/im.cnf || true;
|
||||
--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;
|
||||
|
||||
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'
|
||||
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;
|
||||
|
||||
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
|
||||
SHOW INSTANCES;
|
||||
|
||||
--error ER_SYNTAX_ERROR
|
||||
CREATE INSTANCE mysqld10 test-bad=' \ ';
|
||||
CREATE INSTANCE mysqld13 test-bad=' \ ';
|
||||
SHOW INSTANCES;
|
||||
|
||||
--echo --------------------------------------------------------------------
|
||||
|
|
|
@ -21,12 +21,15 @@
|
|||
# - server_id
|
||||
# - port
|
||||
# - nonguarded
|
||||
|
||||
#
|
||||
# Let's test SET statement on the option 'server_id'. It's expected that
|
||||
# originally the instances have the following server ids and states:
|
||||
# - mysqld1: server_id: 1; running (online)
|
||||
# - 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
|
||||
|
@ -76,7 +79,10 @@ SET mysqld1.server_id = 11;
|
|||
# - start it;
|
||||
# - 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;
|
||||
|
||||
# FIXME: START INSTANCE should be synchronous.
|
||||
|
|
|
@ -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
|
||||
time.cc tztime.cc uniques.cc unireg.cc item_xmlfunc.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
|
||||
${PROJECT_SOURCE_DIR}/sql/sql_yacc.cc
|
||||
${PROJECT_SOURCE_DIR}/sql/sql_yacc.h
|
||||
|
|
|
@ -64,8 +64,8 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
|||
tztime.h my_decimal.h\
|
||||
sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h \
|
||||
parse_file.h sql_view.h sql_trigger.h \
|
||||
sql_array.h sql_cursor.h event.h event_priv.h \
|
||||
sql_plugin.h authors.h sql_partition.h \
|
||||
sql_array.h sql_cursor.h events.h events_priv.h \
|
||||
sql_plugin.h authors.h sql_partition.h event_timed.h \
|
||||
partition_info.h partition_element.h event_scheduler.h \
|
||||
contributors.h
|
||||
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\
|
||||
sp_head.cc sp_pcontext.cc sp_rcontext.cc sp.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_builtin.cc sql_tablespace.cc partition_info.cc
|
||||
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
/* Copyright (C) 2004-2005 MySQL AB
|
||||
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
@ -14,8 +14,10 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include "event_priv.h"
|
||||
#include "event.h"
|
||||
#include "mysql_priv.h"
|
||||
#include "events_priv.h"
|
||||
#include "events.h"
|
||||
#include "event_timed.h"
|
||||
#include "event_scheduler.h"
|
||||
#include "sp_head.h"
|
||||
|
||||
|
@ -46,8 +48,8 @@
|
|||
The scheduler only manages execution of the events. Their creation,
|
||||
alteration and deletion is delegated to other routines found in event.cc .
|
||||
These routines interact with the scheduler :
|
||||
- CREATE EVENT -> Event_scheduler::add_event()
|
||||
- ALTER EVENT -> Event_scheduler::replace_event()
|
||||
- CREATE EVENT -> Event_scheduler::create_event()
|
||||
- ALTER EVENT -> Event_scheduler::update_event()
|
||||
- DROP EVENT -> Event_scheduler::drop_event()
|
||||
|
||||
There is one mutex in the single Event_scheduler object which controls
|
||||
|
@ -298,6 +300,35 @@ public:
|
|||
};
|
||||
|
||||
|
||||
/*
|
||||
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
|
||||
the console so it can be fetched by the logs-into-tables and
|
||||
|
@ -740,10 +771,10 @@ Event_scheduler::destroy()
|
|||
|
||||
|
||||
/*
|
||||
Adds an event to the scheduler queue
|
||||
Creates an event in the scheduler queue
|
||||
|
||||
SYNOPSIS
|
||||
Event_scheduler::add_event()
|
||||
Event_scheduler::create_event()
|
||||
et The event to add
|
||||
check_existence Whether to check if already loaded.
|
||||
|
||||
|
@ -753,11 +784,11 @@ Event_scheduler::destroy()
|
|||
*/
|
||||
|
||||
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;
|
||||
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));
|
||||
|
||||
LOCK_SCHEDULER_DATA();
|
||||
|
@ -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
|
||||
Event_scheduler::replace_event()
|
||||
|
@ -873,7 +904,7 @@ Event_scheduler::drop_event(THD *thd, Event_timed *et)
|
|||
*/
|
||||
|
||||
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_name)
|
||||
{
|
||||
|
@ -886,7 +917,7 @@ Event_scheduler::replace_event(THD *thd, Event_timed *et,
|
|||
LINT_INIT(old_name.str);
|
||||
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",
|
||||
thd, et, et->dbname.str, et->name.str, &LOCK_scheduler_data));
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
class Event_timed;
|
||||
|
||||
class THD;
|
||||
typedef bool * (*event_timed_identifier_comparator)(Event_timed*, Event_timed*);
|
||||
|
@ -26,7 +27,6 @@ events_init();
|
|||
void
|
||||
events_shutdown();
|
||||
|
||||
|
||||
class Event_scheduler
|
||||
{
|
||||
public:
|
||||
|
@ -66,14 +66,15 @@ public:
|
|||
/* Methods for queue management follow */
|
||||
|
||||
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
|
||||
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
|
||||
drop_schema_events(THD *thd, LEX_STRING *schema);
|
||||
|
|
|
@ -15,8 +15,10 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#define MYSQL_LEX 1
|
||||
#include "event_priv.h"
|
||||
#include "event.h"
|
||||
#include "mysql_priv.h"
|
||||
#include "events_priv.h"
|
||||
#include "events.h"
|
||||
#include "event_timed.h"
|
||||
#include "sp_head.h"
|
||||
|
||||
|
||||
|
@ -395,6 +397,8 @@ Event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
|
|||
break;
|
||||
case INTERVAL_MICROSECOND:
|
||||
DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
|
||||
case INTERVAL_LAST:
|
||||
DBUG_ASSERT(0);
|
||||
}
|
||||
if (interval_tmp.neg || expression > EVEX_MAX_INTERVAL_VALUE)
|
||||
DBUG_RETURN(EVEX_BAD_PARAMS);
|
||||
|
@ -834,6 +838,8 @@ bool get_next_time(TIME *next, TIME *start, TIME *time_now, TIME *last_exec,
|
|||
*/
|
||||
DBUG_RETURN(1);
|
||||
break;
|
||||
case INTERVAL_LAST:
|
||||
DBUG_ASSERT(0);
|
||||
}
|
||||
DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months));
|
||||
if (seconds)
|
||||
|
@ -1279,7 +1285,6 @@ done:
|
|||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
extern LEX_STRING interval_type_to_name[];
|
||||
|
||||
/*
|
||||
Get SHOW CREATE EVENT as string
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef _EVENT_H_
|
||||
#define _EVENT_H_
|
||||
#ifndef _EVENT_TIMED_H_
|
||||
#define _EVENT_TIMED_H_
|
||||
/* Copyright (C) 2004-2006 MySQL AB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -17,7 +17,6 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
|
||||
|
||||
#define EVEX_OK 0
|
||||
#define EVEX_KEY_NOT_FOUND -1
|
||||
#define EVEX_OPEN_TABLE_FAILED -2
|
||||
|
@ -40,83 +39,6 @@
|
|||
#define EVENT_NOT_USED (1L << 1)
|
||||
#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;
|
||||
|
||||
|
@ -291,6 +213,5 @@ public:
|
|||
void
|
||||
set_thread_id(ulong tid) { thread_id= tid; }
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* _EVENT_H_ */
|
|
@ -14,8 +14,10 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include "event_priv.h"
|
||||
#include "event.h"
|
||||
#include "mysql_priv.h"
|
||||
#include "events_priv.h"
|
||||
#include "events.h"
|
||||
#include "event_timed.h"
|
||||
#include "event_scheduler.h"
|
||||
#include "sp.h"
|
||||
#include "sp_head.h"
|
||||
|
@ -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.
|
||||
|
||||
SYNOPSIS
|
||||
my_time_compare()
|
||||
sortcmp_lex_string()
|
||||
|
||||
s - first LEX_STRING
|
||||
t - second LEX_STRING
|
||||
|
@ -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
|
||||
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,
|
|||
rows_affected)))
|
||||
{
|
||||
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);
|
||||
}
|
||||
/* 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,
|
|||
{
|
||||
Event_scheduler *scheduler= Event_scheduler::get_instance();
|
||||
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_name: NULL)))
|
||||
my_error(ER_EVENT_MODIFY_QUEUE_ERROR, MYF(0), ret);
|
97
sql/events.h
Normal file
97
sql/events.h
Normal file
|
@ -0,0 +1,97 @@
|
|||
#ifndef _EVENT_H_
|
||||
#define _EVENT_H_
|
||||
/* Copyright (C) 2004-2006 MySQL AB
|
||||
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
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 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#include "mysql_priv.h"
|
||||
|
||||
|
||||
#define EVENT_EXEC_STARTED 0
|
||||
#define EVENT_EXEC_ALREADY_EXEC 1
|
||||
#define EVENT_EXEC_CANT_FORK 2
|
||||
|
@ -27,17 +24,13 @@
|
|||
#define EVEX_NAME_FIELD_LEN 64
|
||||
#define EVEX_MAX_INTERVAL_VALUE 2147483647L
|
||||
|
||||
int
|
||||
my_time_compare(TIME *a, TIME *b);
|
||||
class Event_timed;
|
||||
|
||||
int
|
||||
evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname,
|
||||
const LEX_STRING ev_name,
|
||||
TABLE *table);
|
||||
|
||||
int
|
||||
event_timed_compare_q(void *vptr, byte* a, byte *b);
|
||||
|
||||
int
|
||||
db_drop_event(THD *thd, Event_timed *et, bool drop_if_exists,
|
||||
uint *rows_affected);
|
|
@ -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,
|
||||
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,
|
||||
const char *format_str,
|
||||
uint format_length);
|
||||
|
@ -1774,6 +1776,7 @@ void make_date(const DATE_TIME_FORMAT *format, const TIME *l_time,
|
|||
String *str);
|
||||
void make_time(const DATE_TIME_FORMAT *format, const TIME *l_time,
|
||||
String *str);
|
||||
int my_time_compare(TIME *a, TIME *b);
|
||||
|
||||
int test_if_number(char *str,int *res,bool allow_wildcards);
|
||||
void change_byte(byte *,uint,char,char);
|
||||
|
@ -1791,6 +1794,7 @@ void filesort_free_buffers(TABLE *table);
|
|||
void change_double_for_sort(double nr,byte *to);
|
||||
double my_double_round(double value, int dec, bool truncate);
|
||||
int get_quick_record(SQL_SELECT *select);
|
||||
|
||||
int calc_weekday(long daynr,bool sunday_first_day_of_week);
|
||||
uint calc_week(TIME *l_time, uint week_behaviour, uint *year);
|
||||
void find_date(char *pos,uint *vek,uint flag);
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
#include "stacktrace.h"
|
||||
#include "mysqld_suffix.h"
|
||||
#include "mysys_err.h"
|
||||
#include "event.h"
|
||||
#include "events.h"
|
||||
|
||||
#include "ha_myisam.h"
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include "mysql_priv.h"
|
||||
#include <mysys_err.h>
|
||||
#include "sp.h"
|
||||
#include "event.h"
|
||||
#include "events.h"
|
||||
#include <my_dir.h>
|
||||
#include <m_ctype.h>
|
||||
#ifdef __WIN__
|
||||
|
|
|
@ -26,7 +26,8 @@
|
|||
#include "sp_head.h"
|
||||
#include "sp.h"
|
||||
#include "sp_cache.h"
|
||||
#include "event.h"
|
||||
#include "events.h"
|
||||
#include "event_timed.h"
|
||||
|
||||
#ifdef HAVE_OPENSSL
|
||||
/*
|
||||
|
@ -3835,7 +3836,9 @@ end_with_restore_list:
|
|||
uint rows_affected= 1;
|
||||
DBUG_ASSERT(lex->et);
|
||||
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));
|
||||
res= true;
|
||||
|
@ -3843,7 +3846,10 @@ end_with_restore_list:
|
|||
}
|
||||
|
||||
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;
|
||||
|
||||
if (end_active_trans(thd))
|
||||
|
|
108
sql/sql_show.cc
108
sql/sql_show.cc
|
@ -26,13 +26,38 @@
|
|||
#include "sql_trigger.h"
|
||||
#include "authors.h"
|
||||
#include "contributors.h"
|
||||
#include "event.h"
|
||||
#include "events.h"
|
||||
#include "event_timed.h"
|
||||
#include <my_dir.h>
|
||||
|
||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||
#include "ha_partition.h"
|
||||
#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[]={
|
||||
"select","insert","update","delete","create","drop","reload","shutdown",
|
||||
"process","file","grant","references","index","alter"};
|
||||
|
@ -4116,6 +4141,8 @@ static interval_type get_real_interval_type(interval_type i_type)
|
|||
case INTERVAL_SECOND_MICROSECOND:
|
||||
case INTERVAL_MICROSECOND:
|
||||
return INTERVAL_MICROSECOND;
|
||||
case INTERVAL_LAST:
|
||||
DBUG_ASSERT(0);
|
||||
}
|
||||
DBUG_ASSERT(0);
|
||||
return INTERVAL_SECOND;
|
||||
|
@ -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 */
|
||||
|
||||
sch_table->field[1]->store(et.dbname.str, et.dbname.length, scs);
|
||||
sch_table->field[2]->store(et.name.str, et.name.length, scs);
|
||||
sch_table->field[3]->store(et.definer.str, et.definer.length, scs);
|
||||
sch_table->field[4]->store(et.body.str, et.body.length, scs);
|
||||
sch_table->field[ISE_EVENT_SCHEMA]->
|
||||
store(et.dbname.str, et.dbname.length,scs);
|
||||
sch_table->field[ISE_EVENT_NAME]->
|
||||
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;
|
||||
ulong sql_mode_len=0;
|
||||
ulong sql_mode_len= 0;
|
||||
sql_mode_str=
|
||||
sys_var_thd_sql_mode::symbolic_mode_representation(thd, et.sql_mode,
|
||||
&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)
|
||||
{
|
||||
String show_str;
|
||||
/* 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,
|
||||
et.expression))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
sch_table->field[7]->set_notnull();
|
||||
sch_table->field[7]->store(show_str.ptr(), show_str.length(), scs);
|
||||
sch_table->field[ISE_INTERVAL_VALUE]->set_notnull();
|
||||
sch_table->field[ISE_INTERVAL_VALUE]->
|
||||
store(show_str.ptr(), show_str.length(), scs);
|
||||
|
||||
LEX_STRING *ival= &interval_type_to_name[et.interval];
|
||||
sch_table->field[8]->set_notnull();
|
||||
sch_table->field[8]->store(ival->str, ival->length, scs);
|
||||
sch_table->field[ISE_INTERVAL_FIELD]->set_notnull();
|
||||
sch_table->field[ISE_INTERVAL_FIELD]->store(ival->str, ival->length, scs);
|
||||
|
||||
/* starts & ends */
|
||||
sch_table->field[10]->set_notnull();
|
||||
sch_table->field[10]->store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME);
|
||||
/* starts & ends . STARTS is always set - see sql_yacc.yy */
|
||||
sch_table->field[ISE_STARTS]->set_notnull();
|
||||
sch_table->field[ISE_STARTS]->
|
||||
store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME);
|
||||
|
||||
if (!et.ends_null)
|
||||
{
|
||||
sch_table->field[11]->set_notnull();
|
||||
sch_table->field[11]->store_time(&et.ends, MYSQL_TIMESTAMP_DATETIME);
|
||||
sch_table->field[ISE_ENDS]->set_notnull();
|
||||
sch_table->field[ISE_ENDS]->
|
||||
store_time(&et.ends, MYSQL_TIMESTAMP_DATETIME);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//type
|
||||
sch_table->field[5]->store(STRING_WITH_LEN("ONE TIME"), scs);
|
||||
/* type */
|
||||
sch_table->field[ISE_EVENT_TYPE]->store(STRING_WITH_LEN("ONE TIME"), scs);
|
||||
|
||||
sch_table->field[6]->set_notnull();
|
||||
sch_table->field[6]->store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME);
|
||||
sch_table->field[ISE_EXECUTE_AT]->set_notnull();
|
||||
sch_table->field[ISE_EXECUTE_AT]->
|
||||
store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME);
|
||||
}
|
||||
|
||||
/* status */
|
||||
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
|
||||
sch_table->field[12]->store(STRING_WITH_LEN("DISABLED"), scs);
|
||||
sch_table->field[ISE_STATUS]->store(STRING_WITH_LEN("DISABLED"), scs);
|
||||
|
||||
/* on_completion */
|
||||
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
|
||||
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;
|
||||
number_to_datetime(et.created, &time, 0, ¬_used);
|
||||
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, ¬_used);
|
||||
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)
|
||||
{
|
||||
sch_table->field[16]->set_notnull();
|
||||
sch_table->field[16]->store_time(&et.last_executed,MYSQL_TIMESTAMP_DATETIME);
|
||||
sch_table->field[ISE_LAST_EXECUTED]->set_notnull();
|
||||
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))
|
||||
DBUG_RETURN(1);
|
||||
|
@ -5173,7 +5216,8 @@ ST_FIELD_INFO events_fields_info[]=
|
|||
{"EVENT_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Db"},
|
||||
{"EVENT_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, "Name"},
|
||||
{"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"},
|
||||
{"EXECUTE_AT", 0, MYSQL_TYPE_TIMESTAMP, 0, 1, "Execute at"},
|
||||
{"INTERVAL_VALUE", 256, MYSQL_TYPE_STRING, 0, 1, "Interval value"},
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#include "sp_pcontext.h"
|
||||
#include "sp_rcontext.h"
|
||||
#include "sp.h"
|
||||
#include "event.h"
|
||||
#include "event_timed.h"
|
||||
#include <myisam.h>
|
||||
#include <myisammrg.h>
|
||||
|
||||
|
|
56
sql/time.cc
56
sql/time.cc
|
@ -24,6 +24,30 @@
|
|||
/* Some functions to calculate dates */
|
||||
|
||||
#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 */
|
||||
/* 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,
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue