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
780d6344
Commit
780d6344
authored
Feb 28, 2006
by
andrey@lmy004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix for bug#16537
(post-review pre-push changes) coding style (mostly trailing spaces removed)
parent
8fe55c09
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
180 additions
and
183 deletions
+180
-183
mysql-test/r/events.result
mysql-test/r/events.result
+4
-4
sql/event.cc
sql/event.cc
+98
-100
sql/event_executor.cc
sql/event_executor.cc
+60
-59
sql/event_timed.cc
sql/event_timed.cc
+18
-20
No files found.
mysql-test/r/events.result
View file @
780d6344
...
...
@@ -40,7 +40,7 @@ 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
events_test event_starts_test root@localhost RECURRING NULL 10 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
...
...
@@ -69,21 +69,21 @@ 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
events_test event_starts_test root@localhost RECURRING NULL 20 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
events_test event_starts_test root@localhost RECURRING NULL 20 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
events_test event_starts_test root@localhost RECURRING NULL 20 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;
...
...
sql/event.cc
View file @
780d6344
...
...
@@ -69,7 +69,7 @@ time_t mysql_event_last_create_time= 0L;
static
TABLE_FIELD_W_TYPE
event_table_fields
[
EVEX_FIELD_COUNT
]
=
{
{
{(
char
*
)
STRING_WITH_LEN
(
"db"
)},
{(
char
*
)
STRING_WITH_LEN
(
"db"
)},
{(
char
*
)
STRING_WITH_LEN
(
"char(64)"
)},
{(
char
*
)
STRING_WITH_LEN
(
"utf8"
)}
},
...
...
@@ -120,6 +120,7 @@ static TABLE_FIELD_W_TYPE event_table_fields[EVEX_FIELD_COUNT] = {
{
{(
char
*
)
STRING_WITH_LEN
(
"last_executed"
)},
{(
char
*
)
STRING_WITH_LEN
(
"datetime"
)},
{
NULL
,
0
}
},
{
{(
char
*
)
STRING_WITH_LEN
(
"starts"
)},
...
...
@@ -162,25 +163,25 @@ static TABLE_FIELD_W_TYPE event_table_fields[EVEX_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
(
"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"
)}
};
...
...
@@ -188,10 +189,10 @@ LEX_STRING interval_type_to_name[] = {
/*
Inits the scheduler queue - prioritized queue from mysys/queue.c
Synopsis
evex_queue_init()
queue - pointer the the memory to be initialized as queue. has to be
allocated from the caller
...
...
@@ -211,10 +212,10 @@ evex_queue_init(EVEX_QUEUE_TYPE *queue)
/*
Compares 2 LEX strings regarding case.
Synopsis
my_time_compare()
s - first LEX_STRING
t - second LEX_STRING
cs - charset
...
...
@@ -223,7 +224,7 @@ evex_queue_init(EVEX_QUEUE_TYPE *queue)
-1 - s < t
0 - s == t
1 - s > t
Notes
TIME.second_part is not considered during comparison
*/
...
...
@@ -237,18 +238,18 @@ 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
RETURNS:
-1 - a < b
0 - a == b
1 - a > b
Notes
TIME.second_part is not considered during comparison
*/
...
...
@@ -276,18 +277,18 @@ my_time_compare(TIME *a, TIME *b)
/*
Compares the execute_at members of 2 event_timed instances
Synopsis
event_timed_compare()
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
*/
...
...
@@ -303,14 +304,14 @@ event_timed_compare(event_timed *a, event_timed *b)
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
...
...
@@ -333,18 +334,16 @@ event_timed_compare_q(void *vptr, byte* a, byte *b)
For
YEAR_MONTH - expression is in months
DAY_MINUTE - expression is in minutes
Synopsis
event_reconstruct_interval_expression()
buf - preallocated String buffer to add the value to
interval - the interval type (for instance YEAR_MONTH)
expression - the value in the lowest entity
RETURNS
0 - OK
1 - Error
*/
int
...
...
@@ -369,7 +368,7 @@ event_reconstruct_interval_expression(String *buf,
goto
common_1_lev_code
;
case
INTERVAL_HOUR_MINUTE
:
case
INTERVAL_MINUTE_SECOND
:
multipl
=
60
;
multipl
=
60
;
common_1_lev_code:
buf
->
append
(
'\''
);
end
=
longlong10_to_str
(
expression
/
multipl
,
tmp_buff
,
10
);
...
...
@@ -473,9 +472,9 @@ common_1_lev_code:
table The table pointer
RETURN
1
Cannot lock table
1
Cannot lock table
2 The table is corrupted - different number of fields
0
OK
0
OK
*/
int
...
...
@@ -590,11 +589,11 @@ evex_db_find_event_by_name(THD *thd, const LEX_STRING dbname,
thd THD
table the row to fill out
et Event's data
Returns
0 - ok
EVEX_GENERAL_ERROR - bad data
EVEX_GET_FIELD_FAILED - field count does not match. table corrupted?
EVEX_GET_FIELD_FAILED - field count does not match. table corrupted?
DESCRIPTION
Used both when an event is created and when it is altered.
...
...
@@ -607,9 +606,9 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
DBUG_ENTER
(
"evex_fill_row"
);
DBUG_PRINT
(
"info"
,
(
"dbname=[%s]"
,
et
->
dbname
.
str
));
DBUG_PRINT
(
"info"
,
(
"name =[%s]"
,
et
->
name
.
str
));
DBUG_PRINT
(
"info"
,
(
"body =[%s]"
,
et
->
body
.
str
));
DBUG_PRINT
(
"info"
,
(
"dbname=[%s]"
,
et
->
dbname
.
str
));
DBUG_PRINT
(
"info"
,
(
"name =[%s]"
,
et
->
name
.
str
));
DBUG_PRINT
(
"info"
,
(
"body =[%s]"
,
et
->
body
.
str
));
if
(
table
->
field
[
field_num
=
EVEX_FIELD_DB
]
->
store
(
et
->
dbname
.
str
,
et
->
dbname
.
length
,
system_charset_info
))
...
...
@@ -619,7 +618,7 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
store
(
et
->
name
.
str
,
et
->
name
.
length
,
system_charset_info
))
goto
trunc_err
;
/
/ both ON_COMPLETION and STATUS are NOT NULL thus not calling set_notnull()
/
* both ON_COMPLETION and STATUS are NOT NULL thus not calling set_notnull() */
table
->
field
[
EVEX_FIELD_ON_COMPLETION
]
->
store
((
longlong
)
et
->
on_completion
);
table
->
field
[
EVEX_FIELD_STATUS
]
->
store
((
longlong
)
et
->
status
);
...
...
@@ -653,7 +652,7 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
if
(
!
et
->
starts_null
)
{
table
->
field
[
EVEX_FIELD_STARTS
]
->
set_notnull
();
// set NULL flag to OFF
table
->
field
[
EVEX_FIELD_STARTS
]
->
set_notnull
();
table
->
field
[
EVEX_FIELD_STARTS
]
->
store_time
(
&
et
->
starts
,
MYSQL_TIMESTAMP_DATETIME
);
}
...
...
@@ -674,13 +673,15 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
set_notnull
();
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
store_time
(
&
et
->
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
MYSQL_TIMESTAMP_DATETIME
);
}
else
{
DBUG_ASSERT
(
is_update
);
// it is normal to be here when the action is update
// this is an error if the action is create. something is borked
/*
it is normal to be here when the action is update
this is an error if the action is create. something is borked
*/
}
((
Field_timestamp
*
)
table
->
field
[
EVEX_FIELD_MODIFIED
])
->
set_time
();
...
...
@@ -709,12 +710,12 @@ trunc_err:
et event_timed object containing information for the event
create_if_not - if an warning should be generated in case event exists
rows_affected - how many rows were affected
Return value
0 - OK
EVEX_GENERAL_ERROR - Failure
DESCRIPTION
Creates an event. Relies on evex_fill_row which is shared with
Creates an event. Relies on evex_fill_row which is shared with
db_update_event. The name of the event is inside "et".
*/
...
...
@@ -737,16 +738,16 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
my_error
(
ER_EVENT_OPEN_TABLE_FAILED
,
MYF
(
0
));
goto
err
;
}
DBUG_PRINT
(
"info"
,
(
"check existance of an event with the same name"
));
if
(
!
evex_db_find_event_aux
(
thd
,
et
,
table
))
{
if
(
create_if_not
)
{
push_warning_printf
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_NOTE
,
ER_EVENT_ALREADY_EXISTS
,
ER
(
ER_EVENT_ALREADY_EXISTS
),
et
->
name
.
str
);
goto
ok
;
ER_EVENT_ALREADY_EXISTS
,
ER
(
ER_EVENT_ALREADY_EXISTS
),
et
->
name
.
str
);
goto
ok
;
}
my_error
(
ER_EVENT_ALREADY_EXISTS
,
MYF
(
0
),
et
->
name
.
str
);
goto
err
;
...
...
@@ -758,8 +759,8 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
my_error
(
ER_BAD_DB_ERROR
,
MYF
(
0
));
goto
err
;
}
restore_record
(
table
,
s
->
default_values
);
// Get default values for fields
restore_record
(
table
,
s
->
default_values
);
// Get default values for fields
if
(
system_charset_info
->
cset
->
numchars
(
system_charset_info
,
et
->
dbname
.
str
,
et
->
dbname
.
str
+
et
->
dbname
.
length
)
...
...
@@ -785,7 +786,7 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
if
(
!
(
et
->
expression
)
&&
!
(
et
->
execute_at
.
year
))
{
DBUG_PRINT
(
"error"
,
(
"neither expression nor execute_at are set!"
));
my_error
(
ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
,
MYF
(
0
));
my_error
(
ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
,
MYF
(
0
));
goto
err
;
}
...
...
@@ -799,7 +800,10 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
((
Field_timestamp
*
)
table
->
field
[
EVEX_FIELD_CREATED
])
->
set_time
();
// evex_fill_row() calls my_error() in case of error so no need to handle it here
/*
evex_fill_row() calls my_error() in case of error so no need to
handle it here
*/
if
((
ret
=
evex_fill_row
(
thd
,
table
,
et
,
false
)))
goto
err
;
...
...
@@ -809,16 +813,16 @@ db_create_event(THD *thd, event_timed *et, my_bool create_if_not,
goto
err
;
}
#ifdef USE_THIS_CODE_AS_TEMPLATE_WHEN_EVENT_REPLICATION_IS_AGREED
#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:
if
(
dbchanged
)
...
...
@@ -844,7 +848,7 @@ err:
thd THD
sp_name the name of the event to alter
et event's data
NOTES
sp_name is passed since this is the name of the event to
alter in case of RENAME TO.
...
...
@@ -869,7 +873,7 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
goto
err
;
}
/
/ first look whether we overwrite
/
* first look whether we overwrite */
if
(
new_name
)
{
if
(
!
sortcmp_lex_string
(
et
->
name
,
new_name
->
m_name
,
system_charset_info
)
&&
...
...
@@ -895,19 +899,18 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
if
(
EVEX_KEY_NOT_FOUND
==
evex_db_find_event_aux
(
thd
,
et
,
table
))
{
my_error
(
ER_EVENT_DOES_NOT_EXIST
,
MYF
(
0
),
et
->
name
.
str
);
goto
err
;
goto
err
;
}
store_record
(
table
,
record
[
1
]);
/
/ Don't update create on row update.
/
* Don't update create on row update. */
table
->
timestamp_field_type
=
TIMESTAMP_NO_AUTO_SET
;
/
/ evex_fill_row() calls my_error() in case of error so no need to handle it here
/
* evex_fill_row() calls my_error() in case of error so no need to handle it here */
if
((
ret
=
evex_fill_row
(
thd
,
table
,
et
,
true
)))
goto
err
;
if
(
new_name
)
{
table
->
field
[
EVEX_FIELD_DB
]
->
...
...
@@ -922,7 +925,7 @@ db_update_event(THD *thd, event_timed *et, sp_name *new_name)
goto
err
;
}
/
/ close mysql.event or we crash later when loading the event from disk
/
* close mysql.event or we crash later when loading the event from disk */
close_thread_tables
(
thd
);
DBUG_RETURN
(
0
);
...
...
@@ -944,7 +947,7 @@ err:
definer who owns the event
ett event's data if event is found
tbl TABLE object to use when not NULL
NOTES
1) Use sp_name for look up, return in **ett if found
2) tbl is not closed at exit
...
...
@@ -999,7 +1002,7 @@ done:
delete
et
;
et
=
0
;
}
/
/ don't close the table if we haven't opened it ourselves
/
* don't close the table if we haven't opened it ourselves */
if
(
!
tbl
&&
table
)
close_thread_tables
(
thd
);
*
ett
=
et
;
...
...
@@ -1017,11 +1020,10 @@ done:
spn the name of the event to alter
definer who is the owner
use_lock whether to obtain a lock on LOCK_event_arrays or not
RETURN VALUE
0 - OK
< 0 - error (in this case underlying functions call my_error()).
*/
static
int
...
...
@@ -1040,7 +1042,7 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, LEX_STRING definer,
thd
->
mem_root
=
&
evex_mem_root
;
thd
->
reset_n_backup_open_tables_state
(
&
backup
);
/
/ no need to use my_error() here because db_find_event() has done it
/
* no need to use my_error() here because db_find_event() has done it */
ret
=
db_find_event
(
thd
,
spn
,
&
definer
,
&
ett
,
NULL
,
NULL
);
thd
->
restore_backup_open_tables_state
(
&
backup
);
if
(
ret
)
...
...
@@ -1092,7 +1094,7 @@ done:
ALTER EVENT.
RETURNS
0
-
OK (always)
0 OK (always)
*/
static
int
...
...
@@ -1115,7 +1117,7 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock,
for
(
i
=
0
;
i
<
evex_queue_num_elements
(
EVEX_EQ_NAME
);
++
i
)
{
event_timed
*
et
=
evex_queue_element
(
&
EVEX_EQ_NAME
,
i
,
event_timed
*
);
DBUG_PRINT
(
"info"
,
(
"[%s.%s]==[%s.%s]?"
,
db
->
str
,
name
->
str
,
et
->
dbname
.
str
,
DBUG_PRINT
(
"info"
,
(
"[%s.%s]==[%s.%s]?"
,
db
->
str
,
name
->
str
,
et
->
dbname
.
str
,
et
->
name
.
str
));
if
(
!
sortcmp_lex_string
(
*
name
,
et
->
name
,
system_charset_info
)
&&
!
sortcmp_lex_string
(
*
db
,
et
->
dbname
,
system_charset_info
))
...
...
@@ -1135,7 +1137,7 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock,
}
DBUG_PRINT
(
"evex_remove_from_cache"
,
(
"delete from queue"
));
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
i
);
/
/ ok, we have cleaned
/
* ok, we have cleaned */
ret
=
0
;
goto
done
;
}
...
...
@@ -1159,7 +1161,7 @@ done:
create_options Options specified when in the query. We are
interested whether there is IF NOT EXISTS
rows_affected How many rows were affected
NOTES
- in case there is an event with the same name (db) and
IF NOT EXISTS is specified, an warning is put into the W stack.
...
...
@@ -1189,7 +1191,7 @@ evex_create_event(THD *thd, event_timed *et, uint create_options,
VOID
(
pthread_mutex_unlock
(
&
LOCK_evex_running
));
done:
/
/ No need to close the table, it will be closed in sql_parse::do_command
/
* No need to close the table, it will be closed in sql_parse::do_command */
DBUG_RETURN
(
ret
);
}
...
...
@@ -1203,7 +1205,7 @@ done:
thd THD
et event's data
new_name set in case of RENAME TO.
NOTES
et contains data about dbname and event name.
new_name is the new name of the event, if not null (this means
...
...
@@ -1263,7 +1265,6 @@ done:
et event's name
drop_if_exists if set and the event not existing => warning onto the stack
rows_affected affected number of rows is returned heres
*/
int
db_drop_event
(
THD
*
thd
,
event_timed
*
et
,
bool
drop_if_exists
,
...
...
@@ -1296,8 +1297,8 @@ int db_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
if
(
drop_if_exists
)
{
push_warning_printf
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_NOTE
,
ER_SP_DOES_NOT_EXIST
,
ER
(
ER_SP_DOES_NOT_EXIST
),
"Event"
,
et
->
name
.
str
);
ER_SP_DOES_NOT_EXIST
,
ER
(
ER_SP_DOES_NOT_EXIST
),
"Event"
,
et
->
name
.
str
);
ret
=
0
;
}
else
my_error
(
ER_EVENT_DOES_NOT_EXIST
,
MYF
(
0
),
et
->
name
.
str
);
...
...
@@ -1342,7 +1343,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
if
(
evex_is_running
)
ret
=
evex_remove_from_cache
(
&
et
->
dbname
,
&
et
->
name
,
true
,
true
);
VOID
(
pthread_mutex_unlock
(
&
LOCK_evex_running
));
if
(
ret
==
1
)
ret
=
0
;
else
if
(
ret
==
0
)
...
...
@@ -1362,11 +1363,10 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
thd THD
spn the name of the event (db, name)
definer the definer of the event
RETURNS
0 - OK
1 - Error during writing to the wire
*/
int
...
...
@@ -1384,14 +1384,14 @@ evex_show_create_event(THD *thd, sp_name *spn, LEX_STRING definer)
thd
->
restore_backup_open_tables_state
(
&
backup
);
if
(
!
ret
&&
et
)
{
{
Protocol
*
protocol
=
thd
->
protocol
;
char
show_str_buf
[
768
];
String
show_str
(
show_str_buf
,
sizeof
(
show_str_buf
),
system_charset_info
);
List
<
Item
>
field_list
;
byte
*
sql_mode_str
;
ulong
sql_mode_len
=
0
;
show_str
.
length
(
0
);
show_str
.
set_charset
(
system_charset_info
);
...
...
@@ -1417,19 +1417,18 @@ evex_show_create_event(THD *thd, sp_name *spn, LEX_STRING definer)
protocol
->
store
((
char
*
)
sql_mode_str
,
sql_mode_len
,
system_charset_info
);
protocol
->
store
(
show_str
.
c_ptr
(),
show_str
.
length
(),
system_charset_info
);
ret
=
protocol
->
write
();
send_eof
(
thd
);
}
DBUG_RETURN
(
ret
);
}
/*
evex_drop_db_events - Drops all events in the selected database
thd - Thread
db - ASCIIZ the name of the database
...
...
@@ -1453,7 +1452,6 @@ evex_show_create_event(THD *thd, sp_name *spn, LEX_STRING definer)
spawned and can_spawn() is the right method.
- event_timed::can_spawn() returns false -> being runned ATM
just set the flags so it should drop itself.
*/
int
...
...
@@ -1509,7 +1507,7 @@ evex_drop_db_events(THD *thd, char *db)
else
if
(
ret
==
EVEX_KEY_NOT_FOUND
)
{
sql_print_error
(
"Expected to find event %s.%s of %s on disk-not there."
,
et
->
dbname
.
str
,
et
->
name
.
str
,
et
->
definer
.
str
);
et
->
dbname
.
str
,
et
->
name
.
str
,
et
->
definer
.
str
);
}
et
->
free_sp
();
delete
et
;
...
...
@@ -1525,7 +1523,7 @@ evex_drop_db_events(THD *thd, char *db)
}
DBUG_PRINT
(
"info"
,(
"%d elements in the queue"
,
evex_queue_num_elements
(
EVEX_EQ_NAME
)));
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
i
);
//
1
is top
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
i
);
//
0
is top
DBUG_PRINT
(
"info"
,(
"%d elements in the queue"
,
evex_queue_num_elements
(
EVEX_EQ_NAME
)));
/*
...
...
@@ -1602,7 +1600,7 @@ end:
VOID
(
pthread_mutex_unlock
(
&
LOCK_event_arrays
));
end_read_record
(
&
read_record_info
);
thd
->
version
--
;
// Force close to free memory
thd
->
version
--
;
/* Force close to free memory */
close_thread_tables
(
thd
);
...
...
sql/event_executor.cc
View file @
780d6344
...
...
@@ -38,9 +38,9 @@ extern ulong thread_created;
extern
const
char
*
my_localhost
;
extern
pthread_attr_t
connection_attrib
;
pthread_mutex_t
LOCK_event_arrays
,
// mutex for when working with the queue
LOCK_workers_count
,
// mutex for when inc/dec uint workers_count
LOCK_evex_running
;
// mutes for managing bool evex_is_running
pthread_mutex_t
LOCK_event_arrays
,
// mutex for when working with the queue
LOCK_workers_count
,
// mutex for when inc/dec uint workers_count
LOCK_evex_running
;
// mutes for managing bool evex_is_running
bool
evex_is_running
=
false
;
...
...
@@ -135,7 +135,7 @@ evex_check_system_tables()
bool
not_used
;
Open_tables_state
backup
;
/
/ thd is 0x0 during boot of the server. Later it's !=0x0
/
* thd is 0x0 during boot of the server. Later it's !=0x0 */
if
(
!
thd
)
return
;
...
...
@@ -151,7 +151,7 @@ evex_check_system_tables()
else
{
table_check_intact
(
tables
.
table
,
MYSQL_DB_FIELD_COUNT
,
mysql_db_table_fields
,
&
mysql_db_table_last_check
,
ER_CANNOT_LOAD_FROM_TABLE
);
&
mysql_db_table_last_check
,
ER_CANNOT_LOAD_FROM_TABLE
);
close_thread_tables
(
thd
);
}
...
...
@@ -182,7 +182,7 @@ evex_check_system_tables()
SYNOPSIS
init_events()
NOTES
Inits the mutexes used by the scheduler. Done at server start.
*/
...
...
@@ -194,7 +194,7 @@ init_events()
DBUG_ENTER
(
"init_events"
);
DBUG_PRINT
(
"info"
,(
"Starting events main thread"
));
evex_check_system_tables
();
evex_init_mutexes
();
...
...
@@ -206,7 +206,7 @@ init_events()
if
(
event_executor_running_global_var
)
{
#ifndef DBUG_FAULTY_THR
/
/TODO Andrey: Change the error code returned!
/
* TODO Andrey: Change the error code returned! */
if
(
pthread_create
(
&
th
,
&
connection_attrib
,
event_executor_main
,(
void
*
)
NULL
))
DBUG_RETURN
(
ER_SLAVE_THREAD
);
#else
...
...
@@ -223,7 +223,7 @@ init_events()
SYNOPSIS
shutdown_events()
NOTES
Destroys the mutexes.
*/
...
...
@@ -232,10 +232,10 @@ void
shutdown_events
()
{
DBUG_ENTER
(
"shutdown_events"
);
if
(
evex_mutexes_initted
)
{
evex_mutexes_initted
=
FALSE
;
evex_mutexes_initted
=
FALSE
;
VOID
(
pthread_mutex_lock
(
&
LOCK_evex_running
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_evex_running
));
...
...
@@ -253,11 +253,11 @@ shutdown_events()
SYNOPSIS
init_event_thread()
thd - the THD of the thread. Has to be allocated by the caller.
NOTES
1. The host of the thead is my_localhost
2. thd->net is initted with NULL - no communication.
Returns
0 - OK
-1 - Error
...
...
@@ -304,7 +304,7 @@ init_event_thread(THD* thd)
/*
This function waits till the time next event in the queue should be
executed.
Returns
WAIT_STATUS_READY There is an event to be executed right now
WAIT_STATUS_EMPTY_QUEUE No events or the last event was dropped.
...
...
@@ -339,14 +339,14 @@ executor_wait_till_next_event_exec(THD *thd)
if
(
et
->
dropped
)
et
->
drop
(
thd
);
delete
et
;
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
1
);
// 1 is top
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
0
);
// 0 is top, internally 1
VOID
(
pthread_mutex_unlock
(
&
LOCK_event_arrays
));
sql_print_information
(
"Event found disabled, dropping."
);
DBUG_RETURN
(
1
);
}
DBUG_PRINT
(
"evex main thread"
,(
"computing time to sleep till next exec"
));
/
/ set the internal clock of thd
/
* set the internal clock of thd */
thd
->
end_time
();
my_tz_UTC
->
gmt_sec_to_TIME
(
&
time_now
,
thd
->
query_start
());
t2sleep
=
evex_time_diff
(
&
et
->
execute_at
,
&
time_now
);
...
...
@@ -387,8 +387,8 @@ executor_wait_till_next_event_exec(THD *thd)
SYNOPSIS
event_executor_main()
arg
-
unused
arg unused
NOTES
1. The host of the thead is my_localhost
2. thd->net is initted with NULL - no communication.
...
...
@@ -404,14 +404,13 @@ event_executor_main(void *arg)
TIME
time_now
;
DBUG_ENTER
(
"event_executor_main"
);
DBUG_PRINT
(
"event_executor_main"
,
(
"EVEX thread started"
));
DBUG_PRINT
(
"event_executor_main"
,
(
"EVEX thread started"
));
/
/ init memory root
/
* init memory root */
init_alloc_root
(
&
evex_mem_root
,
MEM_ROOT_BLOCK_SIZE
,
MEM_ROOT_PREALLOC
);
/
/ needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff
/
* needs to call my_thread_init(), otherwise we get a coredump in DBUG_ stuff*/
my_thread_init
();
if
(
sizeof
(
my_time_t
)
!=
sizeof
(
time_t
))
...
...
@@ -422,14 +421,14 @@ event_executor_main(void *arg)
goto
err_no_thd
;
}
/
/TODO Andrey: Check for NULL
if
(
!
(
thd
=
new
THD
))
// note that contructor of THD uses DBUG_ !
/
* note that contructor of THD uses DBUG_ ! */
if
(
!
(
thd
=
new
THD
))
{
sql_print_error
(
"SCHEDULER: Cannot create THD for the main thread."
);
goto
err_no_thd
;
}
thd
->
thread_stack
=
(
char
*
)
&
thd
;
// remember where our stack is
thd
->
thread_stack
=
(
char
*
)
&
thd
;
// remember where our stack is
pthread_detach_this_thread
();
if
(
init_event_thread
(
thd
))
...
...
@@ -472,7 +471,7 @@ event_executor_main(void *arg)
{
TIME
time_now
;
event_timed
*
et
;
cnt
++
;
DBUG_PRINT
(
"info"
,
(
"EVEX External Loop %d thd->k"
,
cnt
));
...
...
@@ -488,7 +487,7 @@ event_executor_main(void *arg)
my_sleep
(
1000000
);
// sleep 1s
continue
;
}
restart_ticking:
switch
(
executor_wait_till_next_event_exec
(
thd
))
{
case
WAIT_STATUS_READY
:
// time to execute the event on top
...
...
@@ -498,7 +497,7 @@ restart_ticking:
DBUG_PRINT
(
"evex main thread"
,(
"no more events"
));
continue
;
break
;
case
WAIT_STATUS_NEW_TOP_EVENT
:
// new event on top in the queue
case
WAIT_STATUS_NEW_TOP_EVENT
:
// new event on top in the queue
DBUG_PRINT
(
"evex main thread"
,(
"restart ticking"
));
goto
restart_ticking
;
case
WAIT_STATUS_STOP_EXECUTOR
:
...
...
@@ -584,10 +583,10 @@ restart_ticking:
}
DBUG_PRINT
(
"evex main thread"
,(
"unlocking"
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_event_arrays
));
}
/
/ while
}
/
* while */
finish:
/
/ First manifest that this thread does not work and then destroy
/
* First manifest that this thread does not work and then destroy */
VOID
(
pthread_mutex_lock
(
&
LOCK_evex_running
));
evex_is_running
=
false
;
evex_main_thread_id
=
0
;
...
...
@@ -611,7 +610,7 @@ finish:
break
;
}
VOID
(
pthread_mutex_unlock
(
&
LOCK_workers_count
));
my_sleep
(
1000000
);
// 1s
my_sleep
(
1000000
);
// 1s
}
/*
...
...
@@ -627,9 +626,9 @@ finish:
delete
et
;
}
VOID
(
pthread_mutex_unlock
(
&
LOCK_event_arrays
));
/
/ ... then we can thrash the whole queue at once
/
* ... then we can thrash the whole queue at once */
evex_queue_destroy
(
&
EVEX_EQ_NAME
);
thd
->
proc_info
=
"Clearing"
;
DBUG_ASSERT
(
thd
->
net
.
buff
!=
0
);
net_end
(
&
thd
->
net
);
// destructor will not free it, because we are weird
...
...
@@ -657,7 +656,7 @@ err_no_thd:
my_thread_end
();
pthread_exit
(
0
);
#endif
DBUG_RETURN
(
0
);
// Can't return anything here
DBUG_RETURN
(
0
);
// Can't return anything here
}
...
...
@@ -667,7 +666,7 @@ err_no_thd:
SYNOPSIS
event_executor_worker()
arg
- t
he event_timed object to be processed
arg
T
he event_timed object to be processed
*/
pthread_handler_t
...
...
@@ -684,12 +683,12 @@ event_executor_worker(void *event_void)
#ifndef DBUG_FAULTY_THR
my_thread_init
();
if
(
!
(
thd
=
new
THD
))
/
/ note that contructor of THD uses DBUG_ !
if
(
!
(
thd
=
new
THD
))
/
* note that contructor of THD uses DBUG_ ! */
{
sql_print_error
(
"SCHEDULER: Cannot create a THD structure in an worker."
);
goto
err_no_thd
;
}
thd
->
thread_stack
=
(
char
*
)
&
thd
;
// remember where our stack is
thd
->
thread_stack
=
(
char
*
)
&
thd
;
// remember where our stack is
thd
->
mem_root
=
&
worker_mem_root
;
pthread_detach_this_thread
();
...
...
@@ -699,7 +698,7 @@ event_executor_worker(void *event_void)
thd
->
init_for_queries
();
/
/ make this thread visible it has no vio -> show processlist needs this flag
/
* make this thread visible it has no vio -> show processlist needs this flag */
thd
->
system_thread
=
1
;
VOID
(
pthread_mutex_lock
(
&
LOCK_thread_count
));
...
...
@@ -749,7 +748,7 @@ err:
DBUG_ASSERT
(
thd
->
net
.
buff
!=
0
);
net_end
(
&
thd
->
net
);
// destructor will not free it, because we are weird
THD_CHECK_SENTRY
(
thd
);
VOID
(
pthread_mutex_lock
(
&
LOCK_thread_count
));
THD_CHECK_SENTRY
(
thd
);
delete
thd
;
...
...
@@ -780,9 +779,9 @@ err_no_thd:
thd - Thread context. Used for memory allocation in some cases.
RETURNS
0
-
OK
!0
-
Error
0 OK
!0 Error
NOTES
Reports the error to the console
*/
...
...
@@ -795,7 +794,7 @@ evex_load_events_from_db(THD *thd)
MYSQL_LOCK
*
lock
;
int
ret
=
-
1
;
uint
count
=
0
;
DBUG_ENTER
(
"evex_load_events_from_db"
);
if
((
ret
=
evex_open_event_table
(
thd
,
TL_READ
,
&
table
)))
...
...
@@ -830,7 +829,7 @@ evex_load_events_from_db(THD *thd)
delete
et
;
continue
;
}
DBUG_PRINT
(
"evex_load_events_from_db"
,
(
"Event %s loaded from row. Time to compile"
,
et
->
name
.
str
));
...
...
@@ -846,8 +845,8 @@ evex_load_events_from_db(THD *thd)
default:
break
;
}
/
/ let's find when to be executed
/
* let's find when to be executed */
if
(
et
->
compute_next_execution_time
())
{
sql_print_error
(
"SCHEDULER: Error while computing execution time of %s.%s."
...
...
@@ -868,8 +867,9 @@ evex_load_events_from_db(THD *thd)
end:
VOID
(
pthread_mutex_unlock
(
&
LOCK_event_arrays
));
end_read_record
(
&
read_record_info
);
thd
->
version
--
;
// Force close to free memory
/* Force close to free memory */
thd
->
version
--
;
close_thread_tables
(
thd
);
if
(
!
ret
)
...
...
@@ -889,15 +889,15 @@ end:
event_executor_worker()
thd - Thread context (unused)
car - the new value
Returns
0
-
OK (always)
0 OK (always)
*/
bool
sys_var_event_executor
::
update
(
THD
*
thd
,
set_var
*
var
)
{
/
/ here start the thread if not running.
/
* here start the thread if not running. */
DBUG_ENTER
(
"sys_var_event_executor::update"
);
VOID
(
pthread_mutex_lock
(
&
LOCK_evex_running
));
*
value
=
var
->
save_result
.
ulong_value
;
...
...
@@ -929,12 +929,12 @@ static sql_print_xxx_func sql_print_xxx_handlers[3] =
Prints the stack of infos, warnings, errors from thd to
the console so it can be fetched by the logs-into-tables and
checked later.
Synopsis
evex_print_warnings
thd - thread used during the execution of the event
et - the event itself
Returns
0 - OK (always)
...
...
@@ -942,19 +942,20 @@ static sql_print_xxx_func sql_print_xxx_handlers[3] =
bool
evex_print_warnings
(
THD
*
thd
,
event_timed
*
et
)
{
{
MYSQL_ERROR
*
err
;
DBUG_ENTER
(
"evex_show_warnings"
);
char
msg_buf
[
1024
];
char
prefix_buf
[
512
];
String
prefix
(
prefix_buf
,
sizeof
(
prefix_buf
),
system_charset_info
);
prefix
.
length
(
0
);
List_iterator_fast
<
MYSQL_ERROR
>
it
(
thd
->
warn_list
);
while
((
err
=
it
++
))
{
String
err_msg
(
msg_buf
,
sizeof
(
msg_buf
),
system_charset_info
);
err_msg
.
length
(
0
);
// set it to 0 or we start adding at the end
/* set it to 0 or we start adding at the end. That's the trick ;) */
err_msg
.
length
(
0
);
if
(
!
prefix
.
length
())
{
prefix
.
append
(
"SCHEDULER: ["
);
...
...
@@ -968,7 +969,7 @@ evex_print_warnings(THD *thd, event_timed *et)
append_identifier
(
thd
,
&
prefix
,
et
->
name
.
str
,
et
->
name
.
length
);
prefix
.
append
(
"] "
,
2
);
}
err_msg
.
append
(
prefix
);
err_msg
.
append
(
err
->
msg
,
strlen
(
err
->
msg
),
system_charset_info
);
err_msg
.
append
(
"]"
);
...
...
sql/event_timed.cc
View file @
780d6344
...
...
@@ -116,7 +116,7 @@ event_timed::init_body(THD *thd)
body_begin
,
thd
->
lex
->
ptr
));
body
.
length
=
thd
->
lex
->
ptr
-
body_begin
;
/
/ Trim nuls at the end
/
* Trim nuls at the end */
while
(
body
.
length
&&
body_begin
[
body
.
length
-
1
]
==
'\0'
)
body
.
length
--
;
...
...
@@ -161,13 +161,12 @@ event_timed::init_execute_at(THD *thd, Item *expr)
/* no starts and/or ends in case of execute_at */
DBUG_PRINT
(
"info"
,
(
"starts_null && ends_null should be 1 is %d"
,
(
starts_null
&&
ends_null
)))
(
starts_null
&&
ends_null
)));
DBUG_ASSERT
(
starts_null
&&
ends_null
);
/
/ let's check whether time is in the past
/
* let's check whether time is in the past */
thd
->
variables
.
time_zone
->
gmt_sec_to_TIME
(
&
time_tmp
,
(
my_time_t
)
thd
->
query_start
());
(
my_time_t
)
thd
->
query_start
());
if
((
not_used
=
expr
->
get_date
(
&
ltime
,
TIME_NO_ZERO_DATE
)))
DBUG_RETURN
(
ER_WRONG_VALUE
);
...
...
@@ -252,14 +251,14 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
case
INTERVAL_DAY_MINUTE
:
expression
=
(
interval
.
day
*
24
+
interval
.
hour
)
*
60
+
interval
.
minute
;
break
;
case
INTERVAL_HOUR_SECOND
:
/
/ day is anyway 0
case
INTERVAL_HOUR_SECOND
:
/
* day is anyway 0 */
case
INTERVAL_DAY_SECOND
:
/* DAY_SECOND having problems because of leap seconds? */
expression
=
((
interval
.
day
*
24
+
interval
.
hour
)
*
60
+
interval
.
minute
)
*
60
+
interval
.
second
;
break
;
case
INTERVAL_MINUTE_MICROSECOND
:
/
/ day and hour are 0
case
INTERVAL_HOUR_MICROSECOND
:
// day is anyway 0
case
INTERVAL_MINUTE_MICROSECOND
:
/
* day and hour are 0 */
case
INTERVAL_HOUR_MICROSECOND
:
/* day is anyway 0 */
case
INTERVAL_DAY_MICROSECOND
:
DBUG_RETURN
(
EVEX_MICROSECOND_UNSUP
);
expression
=
((((
interval
.
day
*
24
)
+
interval
.
hour
)
*
60
+
interval
.
minute
)
*
60
+
...
...
@@ -398,7 +397,7 @@ event_timed::init_ends(THD *thd, Item *new_ends)
Check whether ENDS is not in the past.
*/
DBUG_PRINT
(
"info"
,
(
"ENDS after NOW?"
));
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime_now
,
thd
->
query_start
());
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime_now
,
thd
->
query_start
());
if
(
my_time_compare
(
&
ltime_now
,
&
ltime
)
==
1
)
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
...
...
@@ -534,8 +533,8 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
et
->
definer_user
.
str
=
strmake_root
(
mem_root
,
et
->
definer
.
str
,
len
);
et
->
definer_user
.
length
=
len
;
len
=
et
->
definer
.
length
-
len
-
1
;
//1 is because of @
et
->
definer_host
.
str
=
strmake_root
(
mem_root
,
ptr
+
1
,
len
);
/
/1: because of @
len
=
et
->
definer
.
length
-
len
-
1
;
//1 is because of @
et
->
definer_host
.
str
=
strmake_root
(
mem_root
,
ptr
+
1
,
len
);
/
* 1:because of @*/
et
->
definer_host
.
length
=
len
;
et
->
starts_null
=
table
->
field
[
EVEX_FIELD_STARTS
]
->
is_null
();
...
...
@@ -597,20 +596,20 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
#endif
last_executed_changed
=
false
;
/
/ ToDo : Andrey . Find a way not to allocate ptr on event_mem_root
/
* ToDo : Andrey . Find a way not to allocate ptr on event_mem_root */
if
((
ptr
=
get_field
(
mem_root
,
table
->
field
[
EVEX_FIELD_STATUS
]))
==
NullS
)
goto
error
;
DBUG_PRINT
(
"load_from_row"
,
(
"Event [%s] is [%s]"
,
et
->
name
.
str
,
ptr
));
et
->
status
=
(
ptr
[
0
]
==
'E'
?
MYSQL_EVENT_ENABLED
:
MYSQL_EVENT_DISABLED
);
/
/ ToDo : Andrey . Find a way not to allocate ptr on event_mem_root
/
* ToDo : Andrey . Find a way not to allocate ptr on event_mem_root */
if
((
ptr
=
get_field
(
mem_root
,
table
->
field
[
EVEX_FIELD_ON_COMPLETION
]))
==
NullS
)
goto
error
;
et
->
on_completion
=
(
ptr
[
0
]
==
'D'
?
MYSQL_EVENT_ON_COMPLETION_DROP
:
MYSQL_EVENT_ON_COMPLETION_PRESERVE
);
MYSQL_EVENT_ON_COMPLETION_PRESERVE
);
et
->
comment
.
str
=
get_field
(
mem_root
,
table
->
field
[
EVEX_FIELD_COMMENT
]);
if
(
et
->
comment
.
str
!=
NullS
)
...
...
@@ -796,7 +795,7 @@ event_timed::compute_next_execution_time()
goto
ret
;
}
}
if
(
!
starts_null
&&
!
ends_null
)
{
/*
...
...
@@ -931,7 +930,7 @@ event_timed::mark_last_executed(THD *thd)
thd
->
end_time
();
my_tz_UTC
->
gmt_sec_to_TIME
(
&
time_now
,
(
my_time_t
)
thd
->
query_start
());
last_executed
=
time_now
;
/
/ was execute_at
last_executed
=
time_now
;
/
* was execute_at */
#ifdef ANDREY_0
last_executed
=
execute_at
;
#endif
...
...
@@ -1086,7 +1085,7 @@ event_timed::get_create_event(THD *thd, String *buf)
}
else
{
char
dtime_buff
[
20
*
2
+
32
];
/
/ +32 to make my_snprintf_{8bit|ucs2} happy
char
dtime_buff
[
20
*
2
+
32
];
/
* +32 to make my_snprintf_{8bit|ucs2} happy */
buf
->
append
(
STRING_WITH_LEN
(
"AT '"
));
/*
Pass the buffer and the second param tells fills the buffer and
...
...
@@ -1427,7 +1426,7 @@ extern pthread_attr_t connection_attrib;
/*
Checks whether is possible and forks a thread. Passes self as argument.
Returns
EVENT_EXEC_STARTED - OK
EVENT_EXEC_ALREADY_EXEC - Thread not forked, already working
...
...
@@ -1498,7 +1497,6 @@ event_timed::spawn_thread_finish(THD *thd)
Returns
0 - ok
1 - not locked by this thread
*/
...
...
@@ -1524,5 +1522,5 @@ event_timed::spawn_unlock(THD *thd)
}
}
VOID
(
pthread_mutex_unlock
(
&
this
->
LOCK_running
));
return
ret
;
return
ret
;
}
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