Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
5e0a6927
Commit
5e0a6927
authored
Jun 26, 2006
by
konstantin@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal.mysql.com:/home/bk/mysql-5.1
into mysql.com:/opt/local/work/mysql-5.1-runtime
parents
22285bb7
23340f3f
Changes
37
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
591 additions
and
352 deletions
+591
-352
.bzrignore
.bzrignore
+1
-0
include/my_time.h
include/my_time.h
+1
-1
libmysqld/CMakeLists.txt
libmysqld/CMakeLists.txt
+1
-1
libmysqld/Makefile.am
libmysqld/Makefile.am
+1
-1
mysql-test/r/events.result
mysql-test/r/events.result
+6
-6
mysql-test/r/events_bugs.result
mysql-test/r/events_bugs.result
+23
-0
mysql-test/r/events_grant.result
mysql-test/r/events_grant.result
+39
-39
mysql-test/r/events_logs_tests.result
mysql-test/r/events_logs_tests.result
+10
-3
mysql-test/r/im_instance_conf.result
mysql-test/r/im_instance_conf.result
+56
-27
mysql-test/r/im_options.result
mysql-test/r/im_options.result
+6
-1
mysql-test/r/information_schema.result
mysql-test/r/information_schema.result
+1
-1
mysql-test/t/disabled.def
mysql-test/t/disabled.def
+3
-3
mysql-test/t/events.test
mysql-test/t/events.test
+6
-3
mysql-test/t/events_bugs.test
mysql-test/t/events_bugs.test
+37
-0
mysql-test/t/events_grant.test
mysql-test/t/events_grant.test
+12
-9
mysql-test/t/events_logs_tests.test
mysql-test/t/events_logs_tests.test
+13
-3
mysql-test/t/events_microsec.test
mysql-test/t/events_microsec.test
+3
-0
mysql-test/t/events_scheduling.test
mysql-test/t/events_scheduling.test
+3
-0
mysql-test/t/events_stress.test
mysql-test/t/events_stress.test
+3
-0
mysql-test/t/im_instance_conf.imtest
mysql-test/t/im_instance_conf.imtest
+40
-9
mysql-test/t/im_options.imtest
mysql-test/t/im_options.imtest
+8
-2
sql/CMakeLists.txt
sql/CMakeLists.txt
+1
-1
sql/Makefile.am
sql/Makefile.am
+3
-3
sql/event_scheduler.cc
sql/event_scheduler.cc
+42
-11
sql/event_scheduler.h
sql/event_scheduler.h
+6
-5
sql/event_timed.cc
sql/event_timed.cc
+8
-3
sql/event_timed.h
sql/event_timed.h
+3
-82
sql/events.cc
sql/events.cc
+8
-91
sql/events.h
sql/events.h
+97
-0
sql/events_priv.h
sql/events_priv.h
+1
-8
sql/mysql_priv.h
sql/mysql_priv.h
+4
-0
sql/mysqld.cc
sql/mysqld.cc
+1
-1
sql/sql_db.cc
sql/sql_db.cc
+1
-1
sql/sql_parse.cc
sql/sql_parse.cc
+9
-3
sql/sql_show.cc
sql/sql_show.cc
+77
-33
sql/sql_yacc.yy
sql/sql_yacc.yy
+1
-1
sql/time.cc
sql/time.cc
+56
-0
No files found.
.bzrignore
View file @
5e0a6927
...
...
@@ -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
...
...
include/my_time.h
View file @
5e0a6927
...
...
@@ -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
...
...
libmysqld/CMakeLists.txt
View file @
5e0a6927
...
...
@@ -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/event
s
.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
}
...
...
libmysqld/Makefile.am
View file @
5e0a6927
...
...
@@ -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 event
s
.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
...
...
mysql-test/r/events.result
View file @
5e0a6927
...
...
@@ -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;
...
...
mysql-test/r/events_bugs.result
View file @
5e0a6927
...
...
@@ -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;
mysql-test/r/events_grant.result
View file @
5e0a6927
This diff is collapsed.
Click to expand it.
mysql-test/r/events_logs_tests.result
View file @
5e0a6927
...
...
@@ -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;
mysql-test/r/im_instance_conf.result
View file @
5e0a6927
...
...
@@ -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
mysqld9
a
offline
mysqld9 offline
mysqld5 offline
mysqld6 offline
mysqld3 offline
mysqld4 offline
mysqld
9
offline
mysqld
10
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
mysqld
9b off
line
mysqld
9a
offline
mysqld
1 on
line
mysqld
11
offline
mysqld5 offline
mysqld6 offline
mysqld3 offline
mysqld4 offline
mysqld
9
offline
mysqld
10
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
mysqld
9b off
line
mysqld
6
offline
mysqld
1 on
line
mysqld
9
offline
mysqld5 offline
mysqld
9c
offline
mysqld
6
offline
mysqld3 offline
mysqld4 offline
mysqld
9
offline
mysqld
10
offline
mysqld2 offline
mysqld1
on
line
mysqld
9a
offline
CREATE INSTANCE mysqld1
0
test-bad=' \ ';
mysqld1
2 off
line
mysqld
11
offline
CREATE INSTANCE mysqld1
3
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
mysqld
9b off
line
mysqld
6
offline
mysqld
1 on
line
mysqld
9
offline
mysqld5 offline
mysqld
9c
offline
mysqld
6
offline
mysqld3 offline
mysqld4 offline
mysqld
9
offline
mysqld
10
offline
mysqld2 offline
mysqld1
on
line
mysqld
9a
offline
mysqld1
2 off
line
mysqld
11
offline
--------------------------------------------------------------------
test-1= hello world
--------------------------------------------------------------------
...
...
mysql-test/r/im_options.result
View file @
5e0a6927
...
...
@@ -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;
...
...
mysql-test/r/information_schema.result
View file @
5e0a6927
...
...
@@ -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
...
...
mysql-test/t/disabled.def
View file @
5e0a6927
...
...
@@ -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
...
...
mysql-test/t/events.test
View file @
5e0a6927
# 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
...
...
mysql-test/t/events_bugs.test
View file @
5e0a6927
# 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
;
mysql-test/t/events_grant.test
View file @
5e0a6927
# 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
;
...
...
mysql-test/t/events_logs_tests.test
View file @
5e0a6927
# 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
;
mysql-test/t/events_microsec.test
View file @
5e0a6927
# 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
...
...
mysql-test/t/events_scheduling.test
View file @
5e0a6927
# 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
);
...
...
mysql-test/t/events_stress.test
View file @
5e0a6927
# 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)
...
...
mysql-test/t/im_instance_conf.imtest
View file @
5e0a6927
...
...
@@ -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 mysqld1
0
test-bad=' \ ';
CREATE INSTANCE mysqld1
3
test-bad=' \ ';
SHOW INSTANCES;
--echo --------------------------------------------------------------------
...
...
mysql-test/t/im_options.imtest
View file @
5e0a6927
...
...
@@ -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.
...
...
sql/CMakeLists.txt
View file @
5e0a6927
...
...
@@ -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 event
s
.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
...
...
sql/Makefile.am
View file @
5e0a6927
...
...
@@ -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 event
s.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 event
s
.cc event_timed.cc
\
sql_plugin.cc sql_binlog.cc
\
sql_builtin.cc sql_tablespace.cc partition_info.cc
...
...
sql/event_scheduler.cc
View file @
5e0a6927
...
...
@@ -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::
replac
e_event()
- CREATE EVENT -> Event_scheduler::
create
_event()
- ALTER EVENT -> Event_scheduler::
updat
e_event()
- DROP EVENT -> Event_scheduler::drop_event()
There is one mutex in the single Event_scheduler object which controls
...
...
@@ -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
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
::
replac
e_event
(
THD
*
thd
,
Event_timed
*
et
,
Event_scheduler
::
updat
e_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::
replac
e_event"
);
DBUG_ENTER
(
"Event_scheduler::
updat
e_event"
);
DBUG_PRINT
(
"enter"
,
(
"thd=%p et=%p et=[%s.%s] lock=%p"
,
thd
,
et
,
et
->
dbname
.
str
,
et
->
name
.
str
,
&
LOCK_scheduler_data
));
...
...
sql/event_scheduler.h
View file @
5e0a6927
...
...
@@ -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 @@ class Event_scheduler
/* 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
);
...
...
sql/event_timed.cc
View file @
5e0a6927
...
...
@@ -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 @@ Event_timed::update_fields(THD *thd)
DBUG_RETURN
(
ret
);
}
extern
LEX_STRING
interval_type_to_name
[];
/*
Get SHOW CREATE EVENT as string
...
...
sql/event.h
→
sql/event
_timed
.h
View file @
5e0a6927
#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 @@ class Event_timed
void
set_thread_id
(
ulong
tid
)
{
thread_id
=
tid
;
}
};
#endif
/* _EVENT_H_ */
sql/event.cc
→
sql/event
s
.cc
View file @
5e0a6927
...
...
@@ -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
->
replac
e_event
(
thd
,
et
,
(
ret
=
scheduler
->
updat
e_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
);
...
...
sql/event
_executor.cc
→
sql/event
s.h
View file @
5e0a6927
/* 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
it under the terms of the GNU General Public License as published by
...
...
@@ -13,3 +15,83 @@
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_ */
sql/event_priv.h
→
sql/event
s
_priv.h
View file @
5e0a6927
...
...
@@ -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
);
...
...
sql/mysql_priv.h
View file @
5e0a6927
...
...
@@ -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
);
...
...
sql/mysqld.cc
View file @
5e0a6927
...
...
@@ -24,7 +24,7 @@
#include "stacktrace.h"
#include "mysqld_suffix.h"
#include "mysys_err.h"
#include "event.h"
#include "event
s
.h"
#include "ha_myisam.h"
...
...
sql/sql_db.cc
View file @
5e0a6927
...
...
@@ -20,7 +20,7 @@
#include "mysql_priv.h"
#include <mysys_err.h>
#include "sp.h"
#include "event.h"
#include "event
s
.h"
#include <my_dir.h>
#include <m_ctype.h>
#ifdef __WIN__
...
...
sql/sql_parse.cc
View file @
5e0a6927
...
...
@@ -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 @@ mysql_execute_command(THD *thd)
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 @@ mysql_execute_command(THD *thd)
}
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
))
...
...
sql/sql_show.cc
View file @
5e0a6927
...
...
@@ -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
);
/* [9] is SQL_MODE */
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
);
/* 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
,
&
not_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
,
&
not_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"
},
...
...
sql/sql_yacc.yy
View file @
5e0a6927
...
...
@@ -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>
...
...
sql/time.cc
View file @
5e0a6927
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment