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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
8fe55c09
Commit
8fe55c09
authored
Feb 28, 2006
by
andrey@lmy004
Browse files
Options
Browse Files
Download
Plain Diff
manual merge
parents
91d09f46
483a6d06
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
213 additions
and
85 deletions
+213
-85
mysql-test/r/events.result
mysql-test/r/events.result
+48
-0
mysql-test/t/events.test
mysql-test/t/events.test
+32
-0
sql/event.cc
sql/event.cc
+28
-24
sql/event.h
sql/event.h
+3
-0
sql/event_executor.cc
sql/event_executor.cc
+6
-4
sql/event_timed.cc
sql/event_timed.cc
+81
-43
sql/sql_show.cc
sql/sql_show.cc
+12
-14
sql/sql_yacc.yy
sql/sql_yacc.yy
+3
-0
No files found.
mysql-test/r/events.result
View file @
8fe55c09
...
...
@@ -37,6 +37,54 @@ alter event event3 rename to event2;
drop event event2;
create event event2 on schedule every 2 second starts now() ends date_add(now(), interval 5 hour) comment "some" DO begin end;
drop event event2;
CREATE EVENT event_starts_test ON SCHEDULE EVERY 10 SECOND COMMENT "" DO SELECT 1;
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 10 INTERVAL_SECOND # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
0 1
ALTER EVENT event_starts_test ON SCHEDULE AT '2020-02-02 20:00:02';
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost ONE TIME 2020-02-02 17:00:02 NULL NULL # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
1 1
ALTER EVENT event_starts_test COMMENT "non-empty comment";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost ONE TIME 2020-02-02 17:00:02 NULL NULL # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
1 1 non-empty comment
ALTER EVENT event_starts_test COMMENT "";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost ONE TIME 2020-02-02 17:00:02 NULL NULL # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
1 1
DROP EVENT event_starts_test;
CREATE EVENT event_starts_test ON SCHEDULE EVERY 20 SECOND STARTS '2020-02-02 20:00:02' ENDS '2022-02-02 20:00:02' DO SELECT 2;
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 20 INTERVAL_SECOND # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
0 0
ALTER EVENT event_starts_test COMMENT "non-empty comment";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 20 INTERVAL_SECOND # # ENABLED
SELECT starts IS NULL, ends IS NULL, comment FROM mysql.event WHERE db='events_test' AND name='event_starts_test';
starts IS NULL ends IS NULL comment
0 0 non-empty comment
ALTER EVENT event_starts_test COMMENT "";
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test event_starts_test root@localhost RECURRING NULL 20 INTERVAL_SECOND # # ENABLED
DROP EVENT event_starts_test;
create event e_43 on schedule every 1 second do set @a = 5;
set global event_scheduler = 1;
alter event e_43 do alter event e_43 do set @a = 4;
...
...
mysql-test/t/events.test
View file @
8fe55c09
...
...
@@ -48,6 +48,38 @@ drop event event2;
create
event
event2
on
schedule
every
2
second
starts
now
()
ends
date_add
(
now
(),
interval
5
hour
)
comment
"some"
DO
begin
end
;
drop
event
event2
;
# BUG #16537 (Events: mysql.event.starts is null)
CREATE
EVENT
event_starts_test
ON
SCHEDULE
EVERY
10
SECOND
COMMENT
""
DO
SELECT
1
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
SELECT
starts
IS
NULL
,
ends
IS
NULL
,
comment
FROM
mysql
.
event
WHERE
db
=
'events_test'
AND
name
=
'event_starts_test'
;
ALTER
EVENT
event_starts_test
ON
SCHEDULE
AT
'2020-02-02 20:00:02'
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
SELECT
starts
IS
NULL
,
ends
IS
NULL
,
comment
FROM
mysql
.
event
WHERE
db
=
'events_test'
AND
name
=
'event_starts_test'
;
ALTER
EVENT
event_starts_test
COMMENT
"non-empty comment"
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
SELECT
starts
IS
NULL
,
ends
IS
NULL
,
comment
FROM
mysql
.
event
WHERE
db
=
'events_test'
AND
name
=
'event_starts_test'
;
ALTER
EVENT
event_starts_test
COMMENT
""
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
SELECT
starts
IS
NULL
,
ends
IS
NULL
,
comment
FROM
mysql
.
event
WHERE
db
=
'events_test'
AND
name
=
'event_starts_test'
;
DROP
EVENT
event_starts_test
;
CREATE
EVENT
event_starts_test
ON
SCHEDULE
EVERY
20
SECOND
STARTS
'2020-02-02 20:00:02'
ENDS
'2022-02-02 20:00:02'
DO
SELECT
2
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
SELECT
starts
IS
NULL
,
ends
IS
NULL
,
comment
FROM
mysql
.
event
WHERE
db
=
'events_test'
AND
name
=
'event_starts_test'
;
ALTER
EVENT
event_starts_test
COMMENT
"non-empty comment"
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
SELECT
starts
IS
NULL
,
ends
IS
NULL
,
comment
FROM
mysql
.
event
WHERE
db
=
'events_test'
AND
name
=
'event_starts_test'
;
ALTER
EVENT
event_starts_test
COMMENT
""
;
--
replace_column
8
# 9 #
SHOW
EVENTS
;
DROP
EVENT
event_starts_test
;
#
#
create
event
e_43
on
schedule
every
1
second
do
set
@
a
=
5
;
set
global
event_scheduler
=
1
;
--
sleep
2
...
...
sql/event.cc
View file @
8fe55c09
...
...
@@ -637,20 +637,6 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
goto
trunc_err
;
}
if
(
et
->
starts
.
year
)
{
table
->
field
[
EVEX_FIELD_STARTS
]
->
set_notnull
();
// set NULL flag to OFF
table
->
field
[
EVEX_FIELD_STARTS
]
->
store_time
(
&
et
->
starts
,
MYSQL_TIMESTAMP_DATETIME
);
}
if
(
et
->
ends
.
year
)
{
table
->
field
[
EVEX_FIELD_ENDS
]
->
set_notnull
();
table
->
field
[
EVEX_FIELD_ENDS
]
->
store_time
(
&
et
->
ends
,
MYSQL_TIMESTAMP_DATETIME
);
}
if
(
et
->
expression
)
{
table
->
field
[
EVEX_FIELD_INTERVAL_EXPR
]
->
set_notnull
();
...
...
@@ -664,18 +650,31 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
table
->
field
[
EVEX_FIELD_TRANSIENT_INTERVAL
]
->
store
((
longlong
)
et
->
interval
+
1
);
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
set_null
();
if
(
!
et
->
starts_null
)
{
table
->
field
[
EVEX_FIELD_STARTS
]
->
set_notnull
();
// set NULL flag to OFF
table
->
field
[
EVEX_FIELD_STARTS
]
->
store_time
(
&
et
->
starts
,
MYSQL_TIMESTAMP_DATETIME
);
}
if
(
!
et
->
ends_null
)
{
table
->
field
[
EVEX_FIELD_ENDS
]
->
set_notnull
();
table
->
field
[
EVEX_FIELD_ENDS
]
->
store_time
(
&
et
->
ends
,
MYSQL_TIMESTAMP_DATETIME
);
}
}
else
if
(
et
->
execute_at
.
year
)
{
// fix_fields already called in init_execute_at
table
->
field
[
EVEX_FIELD_INTERVAL_EXPR
]
->
set_null
();
table
->
field
[
EVEX_FIELD_TRANSIENT_INTERVAL
]
->
set_null
();
table
->
field
[
EVEX_FIELD_STARTS
]
->
set_null
();
table
->
field
[
EVEX_FIELD_ENDS
]
->
set_null
();
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
set_notnull
();
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
store_time
(
&
et
->
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
table
->
field
[
EVEX_FIELD_TRANSIENT_INTERVAL
]
->
set_null
();
}
else
{
...
...
@@ -686,14 +685,17 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
((
Field_timestamp
*
)
table
->
field
[
EVEX_FIELD_MODIFIED
])
->
set_time
();
if
(
et
->
comment
.
length
)
if
(
table
->
field
[
field_num
=
EVEX_FIELD_COMMENT
]
->
store
(
et
->
comment
.
str
,
et
->
comment
.
length
,
system_charset_info
))
if
(
et
->
comment
.
str
)
{
if
(
table
->
field
[
field_num
=
EVEX_FIELD_COMMENT
]
->
store
(
et
->
comment
.
str
,
et
->
comment
.
length
,
system_charset_info
))
goto
trunc_err
;
}
DBUG_RETURN
(
0
);
trunc_err:
my_error
(
ER_EVENT_DATA_TOO_LONG
,
MYF
(
0
));
my_error
(
ER_EVENT_DATA_TOO_LONG
,
MYF
(
0
)
,
table
->
field
[
field_num
]
->
field_name
);
DBUG_RETURN
(
EVEX_GENERAL_ERROR
);
}
...
...
@@ -806,14 +808,16 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
my_error
(
ER_EVENT_STORE_FAILED
,
MYF
(
0
),
et
->
name
.
str
,
ret
);
goto
err
;
}
#ifdef USE_THIS_CODE_AS_TEMPLATE_WHEN_EVENT_REPLICATION_IS_AGREED
if
(
mysql_bin_log
.
is_open
())
{
thd
->
clear_error
();
/
* Such a statement can always go directly to binlog, no trans cache */
/
/ Such a statement can always go directly to binlog, no trans cache
thd
->
binlog_query
(
THD
::
MYSQL_QUERY_TYPE
,
thd
->
query
,
thd
->
query_length
,
FALSE
,
FALSE
);
}
#endif
*
rows_affected
=
1
;
ok:
...
...
sql/event.h
View file @
8fe55c09
...
...
@@ -103,6 +103,9 @@ public:
TIME
starts
;
TIME
ends
;
TIME
execute_at
;
my_bool
starts_null
;
my_bool
ends_null
;
my_bool
execute_at_null
;
longlong
expression
;
interval_type
interval
;
...
...
sql/event_executor.cc
View file @
8fe55c09
...
...
@@ -523,8 +523,7 @@ restart_ticking:
et
=
evex_queue_first_element
(
&
EVEX_EQ_NAME
,
event_timed
*
);
DBUG_PRINT
(
"evex main thread"
,(
"got event from the queue"
));
if
(
et
->
execute_at
.
year
>
1969
&&
my_time_compare
(
&
time_now
,
&
et
->
execute_at
)
==
-
1
)
if
(
!
et
->
execute_at_null
&&
my_time_compare
(
&
time_now
,
&
et
->
execute_at
)
==
-
1
)
{
DBUG_PRINT
(
"evex main thread"
,(
"still not the time for execution"
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_event_arrays
));
...
...
@@ -571,8 +570,11 @@ restart_ticking:
#else
event_executor_worker
((
void
*
)
et
);
#endif
if
((
et
->
execute_at
.
year
&&
!
et
->
expression
)
||
TIME_to_ulonglong_datetime
(
&
et
->
execute_at
)
==
0
)
/*
1. For one-time event : year is > 0 and expression is 0
2. For recurring, expression is != -=> check execute_at_null in this case
*/
if
((
et
->
execute_at
.
year
&&
!
et
->
expression
)
||
et
->
execute_at_null
)
et
->
flags
|=
EVENT_EXEC_NO_MORE
;
if
((
et
->
flags
&
EVENT_EXEC_NO_MORE
)
||
et
->
status
==
MYSQL_EVENT_DISABLED
)
...
...
sql/event_timed.cc
View file @
8fe55c09
This diff is collapsed.
Click to expand it.
sql/sql_show.cc
View file @
8fe55c09
...
...
@@ -3957,7 +3957,7 @@ fill_events_copy_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
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
/
* [9] is SQL_MODE */
{
byte
*
sql_mode_str
;
ulong
sql_mode_len
=
0
;
...
...
@@ -3972,9 +3972,9 @@ fill_events_copy_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
String
show_str
;
//type
sch_table
->
field
[
5
]
->
store
(
STRING_WITH_LEN
(
"RECURRING"
),
scs
);
/
/execute_at
/
* execute_at */
sch_table
->
field
[
6
]
->
set_null
();
/
/interval_value
/
* interval_value */
//interval_type
if
(
event_reconstruct_interval_expression
(
&
show_str
,
et
.
interval
,
et
.
expression
))
...
...
@@ -3986,26 +3986,24 @@ fill_events_copy_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
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
);
//starts & ends
//starts & ends
sch_table
->
field
[
10
]
->
set_notnull
();
sch_table
->
field
[
10
]
->
store_time
(
&
et
.
starts
,
MYSQL_TIMESTAMP_DATETIME
);
sch_table
->
field
[
11
]
->
set_notnull
();
sch_table
->
field
[
11
]
->
store_time
(
&
et
.
ends
,
MYSQL_TIMESTAMP_DATETIME
);
if
(
!
et
.
ends_null
)
{
sch_table
->
field
[
11
]
->
set_notnull
();
sch_table
->
field
[
11
]
->
store_time
(
&
et
.
ends
,
MYSQL_TIMESTAMP_DATETIME
);
}
}
else
{
//type
sch_table
->
field
[
5
]
->
store
(
STRING_WITH_LEN
(
"ONE TIME"
),
scs
);
//execute_at
sch_table
->
field
[
6
]
->
set_notnull
();
sch_table
->
field
[
6
]
->
store_time
(
&
et
.
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
//interval
sch_table
->
field
[
7
]
->
set_null
();
//interval_type
sch_table
->
field
[
8
]
->
set_null
();
//starts & ends
sch_table
->
field
[
10
]
->
set_null
();
sch_table
->
field
[
11
]
->
set_null
();
}
//status
...
...
sql/sql_yacc.yy
View file @
8fe55c09
...
...
@@ -1476,6 +1476,9 @@ opt_ev_status: /* empty */ { $$= 0; }
;
ev_starts: /* empty */
{
Lex->et->init_starts(YYTHD, new Item_func_now_local());
}
| STARTS_SYM expr
{
LEX *lex= Lex;
...
...
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