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
77406529
Commit
77406529
authored
Jan 20, 2006
by
andrey@lmy004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix for bug#16431 (Events: An event which alters itself disappears)
WL#1034 (Internal CRON)
parent
b9a0a5dd
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
62 additions
and
17 deletions
+62
-17
mysql-test/r/events.result
mysql-test/r/events.result
+17
-0
mysql-test/t/events.test
mysql-test/t/events.test
+10
-0
sql/event.cc
sql/event.cc
+12
-6
sql/event_executor.cc
sql/event_executor.cc
+6
-0
sql/event_timed.cc
sql/event_timed.cc
+17
-11
No files found.
mysql-test/r/events.result
View file @
77406529
...
@@ -12,6 +12,23 @@ alter event event3 rename to event2;
...
@@ -12,6 +12,23 @@ alter event event3 rename to event2;
drop event 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;
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;
drop event event2;
create event e_43 on schedule every 1 second do set @a = 5;
set global event_scheduler = 1;
select sleep(2);
sleep(2)
0
alter event e_43 do alter event e_43 do set @a = 4;
select sleep(3);
sleep(3)
0
select db, name, body, status, interval_field, interval_value from mysql.event;
db name body status interval_field interval_value
events_test e_43 set @a = 4 ENABLED SECOND 1
drop event e_43;
select sleep(1);
sleep(1)
0
set global event_scheduler = 0;
create table t_event3 (a int, b float);
create table t_event3 (a int, b float);
drop event if exists event3;
drop event if exists event3;
Warnings:
Warnings:
...
...
mysql-test/t/events.test
View file @
77406529
...
@@ -14,6 +14,16 @@ drop event event2;
...
@@ -14,6 +14,16 @@ 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
;
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
;
drop
event
event2
;
create
event
e_43
on
schedule
every
1
second
do
set
@
a
=
5
;
set
global
event_scheduler
=
1
;
select
sleep
(
2
);
alter
event
e_43
do
alter
event
e_43
do
set
@
a
=
4
;
select
sleep
(
3
);
select
db
,
name
,
body
,
status
,
interval_field
,
interval_value
from
mysql
.
event
;
drop
event
e_43
;
select
sleep
(
1
);
set
global
event_scheduler
=
0
;
create
table
t_event3
(
a
int
,
b
float
);
create
table
t_event3
(
a
int
,
b
float
);
drop
event
if
exists
event3
;
drop
event
if
exists
event3
;
create
event
event3
on
schedule
every
50
+
10
minute
starts
date_add
(
"20010101"
,
interval
5
minute
)
ends
date_add
(
"20151010"
,
interval
5
day
)
comment
"portokala_comment"
DO
insert
into
t_event3
values
(
unix_timestamp
(),
rand
());
create
event
event3
on
schedule
every
50
+
10
minute
starts
date_add
(
"20010101"
,
interval
5
minute
)
ends
date_add
(
"20151010"
,
interval
5
day
)
comment
"portokala_comment"
DO
insert
into
t_event3
values
(
unix_timestamp
(),
rand
());
...
...
sql/event.cc
View file @
77406529
...
@@ -237,8 +237,9 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
...
@@ -237,8 +237,9 @@ evex_fill_row(THD *thd, TABLE *table, event_timed *et, my_bool is_update)
DBUG_RETURN
(
EVEX_GET_FIELD_FAILED
);
DBUG_RETURN
(
EVEX_GET_FIELD_FAILED
);
}
}
DBUG_PRINT
(
"info"
,
(
"dbname.len=%d"
,
et
->
dbname
.
length
));
DBUG_PRINT
(
"info"
,
(
"dbname.len=[%s]"
,
et
->
dbname
.
str
));
DBUG_PRINT
(
"info"
,
(
"name.len=%d"
,
et
->
name
.
length
));
DBUG_PRINT
(
"info"
,
(
"name.len=[%s]"
,
et
->
name
.
str
));
DBUG_PRINT
(
"info"
,
(
"body=[%s]"
,
et
->
body
.
str
));
if
(
table
->
field
[
field_num
=
EVEX_FIELD_DB
]
->
if
(
table
->
field
[
field_num
=
EVEX_FIELD_DB
]
->
store
(
et
->
dbname
.
str
,
et
->
dbname
.
length
,
system_charset_info
))
store
(
et
->
dbname
.
str
,
et
->
dbname
.
length
,
system_charset_info
))
...
@@ -674,7 +675,8 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock)
...
@@ -674,7 +675,8 @@ evex_load_and_compile_event(THD * thd, sp_name *spn, bool use_lock)
static
int
static
int
evex_remove_from_cache
(
LEX_STRING
*
db
,
LEX_STRING
*
name
,
bool
use_lock
)
evex_remove_from_cache
(
LEX_STRING
*
db
,
LEX_STRING
*
name
,
bool
use_lock
,
bool
is_drop
)
{
{
uint
i
;
uint
i
;
...
@@ -697,14 +699,18 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock)
...
@@ -697,14 +699,18 @@ evex_remove_from_cache(LEX_STRING *db, LEX_STRING *name, bool use_lock)
{
{
if
(
!
et
->
is_running
())
if
(
!
et
->
is_running
())
{
{
DBUG_PRINT
(
"evex_remove_from_cache"
,
(
"not running - free and delete"
));
et
->
free_sp
();
et
->
free_sp
();
delete
et
;
delete
et
;
}
}
else
else
{
{
DBUG_PRINT
(
"evex_remove_from_cache"
,
(
"running.defer mem free. is_drop=%d"
,
is_drop
));
et
->
flags
|=
EVENT_EXEC_NO_MORE
;
et
->
flags
|=
EVENT_EXEC_NO_MORE
;
et
->
dropped
=
true
;
et
->
dropped
=
is_drop
;
}
}
DBUG_PRINT
(
"evex_remove_from_cache"
,
(
"delete from queue"
));
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
i
);
evex_queue_delete_element
(
&
EVEX_EQ_NAME
,
i
);
// ok, we have cleaned
// ok, we have cleaned
goto
done
;
goto
done
;
...
@@ -805,7 +811,7 @@ evex_update_event(THD *thd, event_timed *et, sp_name *new_name,
...
@@ -805,7 +811,7 @@ evex_update_event(THD *thd, event_timed *et, sp_name *new_name,
UNLOCK_MUTEX_AND_BAIL_OUT
(
LOCK_evex_running
,
done
);
UNLOCK_MUTEX_AND_BAIL_OUT
(
LOCK_evex_running
,
done
);
VOID
(
pthread_mutex_lock
(
&
LOCK_event_arrays
));
VOID
(
pthread_mutex_lock
(
&
LOCK_event_arrays
));
evex_remove_from_cache
(
&
et
->
dbname
,
&
et
->
name
,
false
);
evex_remove_from_cache
(
&
et
->
dbname
,
&
et
->
name
,
false
,
false
);
if
(
et
->
status
==
MYSQL_EVENT_ENABLED
)
if
(
et
->
status
==
MYSQL_EVENT_ENABLED
)
{
{
if
(
new_name
)
if
(
new_name
)
...
@@ -874,7 +880,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
...
@@ -874,7 +880,7 @@ evex_drop_event(THD *thd, event_timed *et, bool drop_if_exists,
VOID
(
pthread_mutex_lock
(
&
LOCK_evex_running
));
VOID
(
pthread_mutex_lock
(
&
LOCK_evex_running
));
if
(
evex_is_running
)
if
(
evex_is_running
)
ret
=
evex_remove_from_cache
(
&
et
->
dbname
,
&
et
->
name
,
true
);
ret
=
evex_remove_from_cache
(
&
et
->
dbname
,
&
et
->
name
,
true
,
true
);
VOID
(
pthread_mutex_unlock
(
&
LOCK_evex_running
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_evex_running
));
done:
done:
...
...
sql/event_executor.cc
View file @
77406529
...
@@ -492,12 +492,18 @@ event_executor_worker(void *event_void)
...
@@ -492,12 +492,18 @@ event_executor_worker(void *event_void)
sql_print_information
(
" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d"
,
sql_print_information
(
" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d"
,
event
->
dbname
.
str
,
event
->
name
.
str
,
event
->
dbname
.
str
,
event
->
name
.
str
,
(
int
)
event
->
expression
,
ret
);
(
int
)
event
->
expression
,
ret
);
if
(
ret
==
EVEX_COMPILE_ERROR
)
sql_print_information
(
" EVEX COMPILE ERROR for event %s.%s"
,
event
->
dbname
.
str
,
event
->
name
.
str
);
DBUG_PRINT
(
"info"
,
(
" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d"
,
DBUG_PRINT
(
"info"
,
(
" EVEX EXECUTED event %s.%s [EXPR:%d]. RetCode=%d"
,
event
->
dbname
.
str
,
event
->
name
.
str
,
event
->
dbname
.
str
,
event
->
name
.
str
,
(
int
)
event
->
expression
,
ret
));
(
int
)
event
->
expression
,
ret
));
}
}
if
((
event
->
flags
&
EVENT_EXEC_NO_MORE
)
||
event
->
status
==
MYSQL_EVENT_DISABLED
)
if
((
event
->
flags
&
EVENT_EXEC_NO_MORE
)
||
event
->
status
==
MYSQL_EVENT_DISABLED
)
{
{
DBUG_PRINT
(
"event_executor_worker"
,
(
"%s exec no more. to drop=%d"
,
event
->
name
.
str
,
event
->
dropped
));
if
(
event
->
dropped
)
if
(
event
->
dropped
)
event
->
drop
(
thd
);
event
->
drop
(
thd
);
delete
event
;
delete
event
;
...
...
sql/event_timed.cc
View file @
77406529
...
@@ -806,16 +806,18 @@ event_timed::get_show_create_event(THD *thd, uint *length)
...
@@ -806,16 +806,18 @@ event_timed::get_show_create_event(THD *thd, uint *length)
{
{
char
*
dst
,
*
ret
;
char
*
dst
,
*
ret
;
uint
len
,
tmp_len
;
uint
len
,
tmp_len
;
DBUG_ENTER
(
"get_show_create_event"
);
DBUG_PRINT
(
"ret_info"
,(
"body_len=[%d]body=[%s]"
,
body
.
length
,
body
.
str
));
len
=
strlen
(
"CREATE EVENT `"
)
+
dbname
.
length
+
strlen
(
"
.
"
)
+
name
.
length
+
len
=
strlen
(
"CREATE EVENT `"
)
+
dbname
.
length
+
strlen
(
"
`.`
"
)
+
name
.
length
+
strlen
(
"` ON SCHEDULE EVERY 5 MINUTE DO "
)
+
body
.
length
+
strlen
(
";"
);
strlen
(
"` ON SCHEDULE EVERY 5 MINUTE DO "
)
+
body
.
length
;
//
+ strlen(";");
ret
=
dst
=
(
char
*
)
alloc_root
(
thd
->
mem_root
,
len
+
1
);
ret
=
dst
=
(
char
*
)
alloc_root
(
thd
->
mem_root
,
len
+
1
);
memcpy
(
dst
,
"CREATE EVENT `"
,
tmp_len
=
strlen
(
"CREATE EVENT `"
));
memcpy
(
dst
,
"CREATE EVENT `"
,
tmp_len
=
strlen
(
"CREATE EVENT `"
));
dst
+=
tmp_len
;
dst
+=
tmp_len
;
memcpy
(
dst
,
dbname
.
str
,
tmp_len
=
dbname
.
length
);
memcpy
(
dst
,
dbname
.
str
,
tmp_len
=
dbname
.
length
);
dst
+=
tmp_len
;
dst
+=
tmp_len
;
memcpy
(
dst
,
"
."
,
tmp_len
=
strlen
(
".
"
));
memcpy
(
dst
,
"
`.`"
,
tmp_len
=
strlen
(
"`.`
"
));
dst
+=
tmp_len
;
dst
+=
tmp_len
;
memcpy
(
dst
,
name
.
str
,
tmp_len
=
name
.
length
);
memcpy
(
dst
,
name
.
str
,
tmp_len
=
name
.
length
);
dst
+=
tmp_len
;
dst
+=
tmp_len
;
...
@@ -825,13 +827,14 @@ event_timed::get_show_create_event(THD *thd, uint *length)
...
@@ -825,13 +827,14 @@ event_timed::get_show_create_event(THD *thd, uint *length)
memcpy
(
dst
,
body
.
str
,
tmp_len
=
body
.
length
);
memcpy
(
dst
,
body
.
str
,
tmp_len
=
body
.
length
);
dst
+=
tmp_len
;
dst
+=
tmp_len
;
memcpy
(
dst
,
";"
,
1
);
//
memcpy(dst, ";", 1);
++
dst
;
//
++dst;
*
dst
=
'\0'
;
*
dst
=
'\0'
;
*
length
=
len
;
*
length
=
len
;
return
ret
;
DBUG_PRINT
(
"ret_info"
,(
"len=%d"
,
*
length
));
DBUG_RETURN
(
ret
);
}
}
...
@@ -944,8 +947,12 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
...
@@ -944,8 +947,12 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
lex
.
et_compile_phase
=
TRUE
;
lex
.
et_compile_phase
=
TRUE
;
if
(
yyparse
((
void
*
)
thd
)
||
thd
->
is_fatal_error
)
if
(
yyparse
((
void
*
)
thd
)
||
thd
->
is_fatal_error
)
{
{
DBUG_PRINT
(
"error"
,
(
"error during compile or thd->is_fatal_error=%d"
,
thd
->
is_fatal_error
));
// Free lex associated resources
// Free lex associated resources
// QQ: Do we really need all this stuff here ?
// QQ: Do we really need all this stuff here ?
sql_print_error
(
"error during compile of %s.%s or thd->is_fatal_error=%d"
,
dbname
.
str
,
name
.
str
,
thd
->
is_fatal_error
);
if
(
lex
.
sphead
)
if
(
lex
.
sphead
)
{
{
if
(
&
lex
!=
thd
->
lex
)
if
(
&
lex
!=
thd
->
lex
)
...
@@ -953,13 +960,10 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
...
@@ -953,13 +960,10 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
delete
lex
.
sphead
;
delete
lex
.
sphead
;
lex
.
sphead
=
0
;
lex
.
sphead
=
0
;
}
}
// QQ: anything else ?
lex_end
(
&
lex
);
thd
->
lex
=
old_lex
;
ret
=
EVEX_COMPILE_ERROR
;
ret
=
EVEX_COMPILE_ERROR
;
goto
done
;
goto
done
;
}
}
DBUG_PRINT
(
"note"
,
(
"success compiling %s.%s"
,
dbname
.
str
,
name
.
str
));
sphead
=
lex
.
et
->
sphead
;
sphead
=
lex
.
et
->
sphead
;
sphead
->
m_db
=
dbname
;
sphead
->
m_db
=
dbname
;
...
@@ -973,6 +977,8 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
...
@@ -973,6 +977,8 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
lex
.
et
->
free_sphead_on_delete
=
false
;
lex
.
et
->
free_sphead_on_delete
=
false
;
delete
lex
.
et
;
delete
lex
.
et
;
lex_end
(
&
lex
);
lex_end
(
&
lex
);
DBUG_PRINT
(
"note"
,
(
"return old data on its place. set back NAMES"
));
thd
->
lex
=
old_lex
;
thd
->
lex
=
old_lex
;
thd
->
query
=
old_query
;
thd
->
query
=
old_query
;
thd
->
query_length
=
old_query_len
;
thd
->
query_length
=
old_query_len
;
...
...
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