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
700ff439
Commit
700ff439
authored
Feb 15, 2006
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge ahristov@bk-internal.mysql.com:/home/bk/mysql-5.1-new
into lmy004.:/work/mysql-5.1-bug16410
parents
03a0eb63
9d5bf35d
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
264 additions
and
260 deletions
+264
-260
dbug/Makefile.am
dbug/Makefile.am
+1
-1
sql/event.h
sql/event.h
+22
-22
sql/event_priv.h
sql/event_priv.h
+2
-2
sql/event_timed.cc
sql/event_timed.cc
+239
-235
No files found.
dbug/Makefile.am
View file @
700ff439
...
@@ -21,7 +21,7 @@ pkglib_LIBRARIES = libdbug.a
...
@@ -21,7 +21,7 @@ pkglib_LIBRARIES = libdbug.a
noinst_HEADERS
=
dbug_long.h
noinst_HEADERS
=
dbug_long.h
libdbug_a_SOURCES
=
dbug.c sanity.c
libdbug_a_SOURCES
=
dbug.c sanity.c
EXTRA_DIST
=
example1.c example2.c example3.c
\
EXTRA_DIST
=
example1.c example2.c example3.c
\
user.r monty.doc
readme.prof
dbug_add_tags.pl
\
user.r monty.doc dbug_add_tags.pl
\
my_main.c main.c factorial.c dbug_analyze.c
my_main.c main.c factorial.c dbug_analyze.c
NROFF_INC
=
example1.r example2.r example3.r main.r
\
NROFF_INC
=
example1.r example2.r example3.r main.r
\
factorial.r output1.r output2.r output3.r
\
factorial.r output1.r output2.r output3.r
\
...
...
sql/event.h
View file @
700ff439
...
@@ -43,13 +43,13 @@
...
@@ -43,13 +43,13 @@
extern
ulong
opt_event_executor
;
extern
ulong
opt_event_executor
;
enum
enum_event_on_completion
enum
enum_event_on_completion
{
{
MYSQL_EVENT_ON_COMPLETION_DROP
=
1
,
MYSQL_EVENT_ON_COMPLETION_DROP
=
1
,
MYSQL_EVENT_ON_COMPLETION_PRESERVE
MYSQL_EVENT_ON_COMPLETION_PRESERVE
};
};
enum
enum_event_status
enum
enum_event_status
{
{
MYSQL_EVENT_ENABLED
=
1
,
MYSQL_EVENT_ENABLED
=
1
,
MYSQL_EVENT_DISABLED
MYSQL_EVENT_DISABLED
};
};
...
@@ -60,9 +60,9 @@ enum evex_table_field
...
@@ -60,9 +60,9 @@ enum evex_table_field
EVEX_FIELD_NAME
,
EVEX_FIELD_NAME
,
EVEX_FIELD_BODY
,
EVEX_FIELD_BODY
,
EVEX_FIELD_DEFINER
,
EVEX_FIELD_DEFINER
,
EVEX_FIELD_EXECUTE_AT
,
EVEX_FIELD_EXECUTE_AT
,
EVEX_FIELD_INTERVAL_EXPR
,
EVEX_FIELD_INTERVAL_EXPR
,
EVEX_FIELD_TRANSIENT_INTERVAL
,
EVEX_FIELD_TRANSIENT_INTERVAL
,
EVEX_FIELD_CREATED
,
EVEX_FIELD_CREATED
,
EVEX_FIELD_MODIFIED
,
EVEX_FIELD_MODIFIED
,
EVEX_FIELD_LAST_EXECUTED
,
EVEX_FIELD_LAST_EXECUTED
,
...
@@ -112,7 +112,7 @@ public:
...
@@ -112,7 +112,7 @@ public:
ulong
sql_mode
;
ulong
sql_mode
;
const
uchar
*
body_begin
;
const
uchar
*
body_begin
;
bool
dropped
;
bool
dropped
;
bool
free_sphead_on_delete
;
bool
free_sphead_on_delete
;
uint
flags
;
//all kind of purposes
uint
flags
;
//all kind of purposes
...
@@ -123,26 +123,26 @@ public:
...
@@ -123,26 +123,26 @@ public:
status
(
MYSQL_EVENT_ENABLED
),
sphead
(
0
),
sql_mode
(
0
),
status
(
MYSQL_EVENT_ENABLED
),
sphead
(
0
),
sql_mode
(
0
),
body_begin
(
0
),
dropped
(
false
),
free_sphead_on_delete
(
true
),
body_begin
(
0
),
dropped
(
false
),
free_sphead_on_delete
(
true
),
flags
(
0
)
flags
(
0
)
{
{
pthread_mutex_init
(
&
this
->
LOCK_running
,
MY_MUTEX_INIT_FAST
);
pthread_mutex_init
(
&
this
->
LOCK_running
,
MY_MUTEX_INIT_FAST
);
init
();
init
();
}
}
~
event_timed
()
~
event_timed
()
{
{
pthread_mutex_destroy
(
&
this
->
LOCK_running
);
pthread_mutex_destroy
(
&
this
->
LOCK_running
);
if
(
free_sphead_on_delete
)
if
(
free_sphead_on_delete
)
free_sp
();
free_sp
();
}
}
void
void
init
();
init
();
int
int
init_definer
(
THD
*
thd
);
init_definer
(
THD
*
thd
);
int
int
init_execute_at
(
THD
*
thd
,
Item
*
expr
);
init_execute_at
(
THD
*
thd
,
Item
*
expr
);
...
@@ -157,7 +157,7 @@ public:
...
@@ -157,7 +157,7 @@ public:
int
int
init_ends
(
THD
*
thd
,
Item
*
ends
);
init_ends
(
THD
*
thd
,
Item
*
ends
);
void
void
init_body
(
THD
*
thd
);
init_body
(
THD
*
thd
);
...
@@ -168,38 +168,38 @@ public:
...
@@ -168,38 +168,38 @@ public:
load_from_row
(
MEM_ROOT
*
mem_root
,
TABLE
*
table
);
load_from_row
(
MEM_ROOT
*
mem_root
,
TABLE
*
table
);
bool
bool
compute_next_execution_time
();
compute_next_execution_time
();
void
void
mark_last_executed
(
THD
*
thd
);
mark_last_executed
(
THD
*
thd
);
int
int
drop
(
THD
*
thd
);
drop
(
THD
*
thd
);
bool
bool
update_fields
(
THD
*
thd
);
update_fields
(
THD
*
thd
);
int
int
get_create_event
(
THD
*
thd
,
String
*
buf
);
get_create_event
(
THD
*
thd
,
String
*
buf
);
int
int
execute
(
THD
*
thd
,
MEM_ROOT
*
mem_root
=
NULL
);
execute
(
THD
*
thd
,
MEM_ROOT
*
mem_root
=
NULL
);
int
int
compile
(
THD
*
thd
,
MEM_ROOT
*
mem_root
=
NULL
);
compile
(
THD
*
thd
,
MEM_ROOT
*
mem_root
=
NULL
);
my_bool
my_bool
is_running
()
is_running
()
{
{
my_bool
ret
;
my_bool
ret
;
VOID
(
pthread_mutex_lock
(
&
this
->
LOCK_running
));
VOID
(
pthread_mutex_lock
(
&
this
->
LOCK_running
));
ret
=
running
;
ret
=
running
;
VOID
(
pthread_mutex_unlock
(
&
this
->
LOCK_running
));
VOID
(
pthread_mutex_unlock
(
&
this
->
LOCK_running
));
return
ret
;
return
ret
;
}
}
void
free_sp
()
void
free_sp
()
{
{
delete
sphead
;
delete
sphead
;
...
@@ -241,7 +241,7 @@ shutdown_events();
...
@@ -241,7 +241,7 @@ shutdown_events();
// auxiliary
// auxiliary
int
int
event_timed_compare
(
event_timed
**
a
,
event_timed
**
b
);
event_timed_compare
(
event_timed
**
a
,
event_timed
**
b
);
...
...
sql/event_priv.h
View file @
700ff439
...
@@ -36,8 +36,8 @@ evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
...
@@ -36,8 +36,8 @@ evex_db_find_event_aux(THD *thd, const LEX_STRING dbname,
const
LEX_STRING
rname
,
const
LEX_STRING
rname
,
const
LEX_STRING
definer
,
const
LEX_STRING
definer
,
TABLE
*
table
);
TABLE
*
table
);
int
int
event_timed_compare_q
(
void
*
vptr
,
byte
*
a
,
byte
*
b
);
event_timed_compare_q
(
void
*
vptr
,
byte
*
a
,
byte
*
b
);
int
db_drop_event
(
THD
*
thd
,
event_timed
*
et
,
bool
drop_if_exists
,
int
db_drop_event
(
THD
*
thd
,
event_timed
*
et
,
bool
drop_if_exists
,
...
...
sql/event_timed.cc
View file @
700ff439
...
@@ -23,10 +23,10 @@
...
@@ -23,10 +23,10 @@
extern
int
yyparse
(
void
*
thd
);
extern
int
yyparse
(
void
*
thd
);
/*
/*
Init all member variables
Init all member variables
SYNOPSIS
SYNOPSIS
event_timed::init()
event_timed::init()
*/
*/
void
void
...
@@ -36,7 +36,7 @@ event_timed::init()
...
@@ -36,7 +36,7 @@ event_timed::init()
dbname
.
str
=
name
.
str
=
body
.
str
=
comment
.
str
=
0
;
dbname
.
str
=
name
.
str
=
body
.
str
=
comment
.
str
=
0
;
dbname
.
length
=
name
.
length
=
body
.
length
=
comment
.
length
=
0
;
dbname
.
length
=
name
.
length
=
body
.
length
=
comment
.
length
=
0
;
set_zero_time
(
&
starts
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
starts
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
ends
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
ends
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
...
@@ -44,25 +44,25 @@ event_timed::init()
...
@@ -44,25 +44,25 @@ event_timed::init()
definer_user
.
str
=
definer_host
.
str
=
0
;
definer_user
.
str
=
definer_host
.
str
=
0
;
definer_user
.
length
=
definer_host
.
length
=
0
;
definer_user
.
length
=
definer_host
.
length
=
0
;
DBUG_VOID_RETURN
;
DBUG_VOID_RETURN
;
}
}
/*
/*
Set a name of the event
Set a name of the event
SYNOPSIS
SYNOPSIS
event_timed::init_name()
event_timed::init_name()
thd THD
thd THD
spn
the name extracted in the parser
spn
the name extracted in the parser
*/
*/
void
void
event_timed
::
init_name
(
THD
*
thd
,
sp_name
*
spn
)
event_timed
::
init_name
(
THD
*
thd
,
sp_name
*
spn
)
{
{
DBUG_ENTER
(
"event_timed::init_name"
);
DBUG_ENTER
(
"event_timed::init_name"
);
uint
n
;
/* Counter for nul trimming */
uint
n
;
/* Counter for nul trimming */
/* During parsing, we must use thd->mem_root */
/* During parsing, we must use thd->mem_root */
MEM_ROOT
*
root
=
thd
->
mem_root
;
MEM_ROOT
*
root
=
thd
->
mem_root
;
...
@@ -85,20 +85,20 @@ event_timed::init_name(THD *thd, sp_name *spn)
...
@@ -85,20 +85,20 @@ event_timed::init_name(THD *thd, sp_name *spn)
dbname
.
length
=
thd
->
db_length
;
dbname
.
length
=
thd
->
db_length
;
dbname
.
str
=
strmake_root
(
root
,
thd
->
db
,
dbname
.
length
);
dbname
.
str
=
strmake_root
(
root
,
thd
->
db
,
dbname
.
length
);
}
}
DBUG_PRINT
(
"dbname"
,
(
"len=%d db=%s"
,
dbname
.
length
,
dbname
.
str
));
DBUG_PRINT
(
"dbname"
,
(
"len=%d db=%s"
,
dbname
.
length
,
dbname
.
str
));
DBUG_PRINT
(
"name"
,
(
"len=%d name=%s"
,
name
.
length
,
name
.
str
));
DBUG_PRINT
(
"name"
,
(
"len=%d name=%s"
,
name
.
length
,
name
.
str
));
DBUG_VOID_RETURN
;
DBUG_VOID_RETURN
;
}
}
/*
/*
Set body of the event - what should be executed.
Set body of the event - what should be executed.
SYNOPSIS
SYNOPSIS
event_timed::init_body()
event_timed::init_body()
thd THD
thd THD
NOTE
NOTE
The body is extracted by copying all data between the
The body is extracted by copying all data between the
...
@@ -112,7 +112,7 @@ event_timed::init_body(THD *thd)
...
@@ -112,7 +112,7 @@ event_timed::init_body(THD *thd)
MEM_ROOT
*
root
=
thd
->
mem_root
;
MEM_ROOT
*
root
=
thd
->
mem_root
;
body
.
length
=
thd
->
lex
->
ptr
-
body_begin
;
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'
)
while
(
body
.
length
&&
body_begin
[
body
.
length
-
1
]
==
'\0'
)
body
.
length
--
;
body
.
length
--
;
...
@@ -126,17 +126,17 @@ event_timed::init_body(THD *thd)
...
@@ -126,17 +126,17 @@ event_timed::init_body(THD *thd)
/*
/*
Set time for execution for one time events.
Set time for execution for one time events.
SYNOPSIS
SYNOPSIS
event_timed::init_execute_at()
event_timed::init_execute_at()
expr when (datetime)
expr when (datetime)
RETURNS
RETURN VALUE
0 -
OK
0
OK
EVEX_PARSE_ERROR -
fix_fields failed
EVEX_PARSE_ERROR
fix_fields failed
EVEX_BAD_PARAMS -
datetime is in the past
EVEX_BAD_PARAMS
datetime is in the past
ER_WRONG_VALUE -
wrong value for execute at
ER_WRONG_VALUE
wrong value for execute at
*/
*/
int
int
...
@@ -152,9 +152,9 @@ event_timed::init_execute_at(THD *thd, Item *expr)
...
@@ -152,9 +152,9 @@ event_timed::init_execute_at(THD *thd, Item *expr)
if
(
expr
->
fix_fields
(
thd
,
&
expr
))
if
(
expr
->
fix_fields
(
thd
,
&
expr
))
DBUG_RETURN
(
EVEX_PARSE_ERROR
);
DBUG_RETURN
(
EVEX_PARSE_ERROR
);
/
/ 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
,
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
)))
if
((
not_used
=
expr
->
get_date
(
&
ltime
,
TIME_NO_ZERO_DATE
)))
...
@@ -166,8 +166,8 @@ event_timed::init_execute_at(THD *thd, Item *expr)
...
@@ -166,8 +166,8 @@ event_timed::init_execute_at(THD *thd, Item *expr)
/*
/*
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx.
CONVERT_TZ has similar problem
CONVERT_TZ has similar problem.
*/
*/
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime
,
TIME_to_timestamp
(
thd
,
&
ltime
,
&
not_used
));
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime
,
TIME_to_timestamp
(
thd
,
&
ltime
,
&
not_used
));
...
@@ -178,17 +178,17 @@ event_timed::init_execute_at(THD *thd, Item *expr)
...
@@ -178,17 +178,17 @@ event_timed::init_execute_at(THD *thd, Item *expr)
/*
/*
Set time for execution for transient events.
Set time for execution for transient events.
SYNOPSIS
SYNOPSIS
event_timed::init_interval()
event_timed::init_interval()
expr how much?
expr how much?
new_interval what is the interval
new_interval what is the interval
RETURNS
RETURNS
0 -
OK
0
OK
EVEX_PARSE_ERROR -
fix_fields failed
EVEX_PARSE_ERROR
fix_fields failed
EVEX_BAD_PARAMS -
Interval is not positive
EVEX_BAD_PARAMS
Interval is not positive
*/
*/
int
int
...
@@ -197,7 +197,7 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
...
@@ -197,7 +197,7 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
longlong
tmp
;
longlong
tmp
;
String
value
;
String
value
;
INTERVAL
interval
;
INTERVAL
interval
;
DBUG_ENTER
(
"event_timed::init_interval"
);
DBUG_ENTER
(
"event_timed::init_interval"
);
if
(
expr
->
fix_fields
(
thd
,
&
expr
))
if
(
expr
->
fix_fields
(
thd
,
&
expr
))
...
@@ -230,7 +230,7 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
...
@@ -230,7 +230,7 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
case
INTERVAL_SECOND
:
case
INTERVAL_SECOND
:
expression
=
interval
.
second
;
expression
=
interval
.
second
;
break
;
break
;
case
INTERVAL_YEAR_MONTH
:
// Allow YEAR-MONTH YYYYYMM
case
INTERVAL_YEAR_MONTH
:
// Allow YEAR-MONTH YYYYYMM
expression
=
interval
.
year
*
12
+
interval
.
month
;
expression
=
interval
.
year
*
12
+
interval
.
month
;
break
;
break
;
case
INTERVAL_DAY_HOUR
:
case
INTERVAL_DAY_HOUR
:
...
@@ -265,31 +265,31 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
...
@@ -265,31 +265,31 @@ event_timed::init_interval(THD *thd, Item *expr, interval_type new_interval)
}
}
if
(
interval
.
neg
||
expression
>
EVEX_MAX_INTERVAL_VALUE
)
if
(
interval
.
neg
||
expression
>
EVEX_MAX_INTERVAL_VALUE
)
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
this
->
interval
=
new_interval
;
this
->
interval
=
new_interval
;
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
/*
/*
Set activation time.
Set activation time.
SYNOPSIS
SYNOPSIS
event_timed::init_starts()
event_timed::init_starts()
expr how much?
expr how much?
interval what is the interval
interval what is the interval
NOTES
NOTES
Note that activation time is not execution time.
Note that activation time is not execution time.
EVERY 5 MINUTE STARTS "2004-12-12 10:00:00" means that
EVERY 5 MINUTE STARTS "2004-12-12 10:00:00" means that
the event will be executed every 5 minutes but this will
the event will be executed every 5 minutes but this will
start at the date shown above. Expressions are possible :
start at the date shown above. Expressions are possible :
DATE_ADD(NOW(), INTERVAL 1 DAY) -- start tommorow at
DATE_ADD(NOW(), INTERVAL 1 DAY) -- start tommorow at
same time.
same time.
RETURNS
RETURNS
0 -
OK
0
OK
EVEX_PARSE_ERROR -
fix_fields failed
EVEX_PARSE_ERROR
fix_fields failed
*/
*/
int
int
...
@@ -306,9 +306,9 @@ event_timed::init_starts(THD *thd, Item *new_starts)
...
@@ -306,9 +306,9 @@ event_timed::init_starts(THD *thd, Item *new_starts)
if
((
not_used
=
new_starts
->
get_date
(
&
ltime
,
TIME_NO_ZERO_DATE
)))
if
((
not_used
=
new_starts
->
get_date
(
&
ltime
,
TIME_NO_ZERO_DATE
)))
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
/
/ 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
,
thd
->
variables
.
time_zone
->
gmt_sec_to_TIME
(
&
time_tmp
,
(
my_time_t
)
thd
->
query_start
());
(
my_time_t
)
thd
->
query_start
());
DBUG_PRINT
(
"info"
,(
"now =%lld"
,
TIME_to_ulonglong_datetime
(
&
time_tmp
)));
DBUG_PRINT
(
"info"
,(
"now =%lld"
,
TIME_to_ulonglong_datetime
(
&
time_tmp
)));
DBUG_PRINT
(
"info"
,(
"starts=%lld"
,
TIME_to_ulonglong_datetime
(
&
ltime
)));
DBUG_PRINT
(
"info"
,(
"starts=%lld"
,
TIME_to_ulonglong_datetime
(
&
ltime
)));
...
@@ -317,8 +317,8 @@ event_timed::init_starts(THD *thd, Item *new_starts)
...
@@ -317,8 +317,8 @@ event_timed::init_starts(THD *thd, Item *new_starts)
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
/*
/*
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
CONVERT_TZ has similar problem
CONVERT_TZ has similar problem
*/
*/
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime
,
TIME_to_timestamp
(
thd
,
&
ltime
,
&
not_used
));
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime
,
TIME_to_timestamp
(
thd
,
&
ltime
,
&
not_used
));
...
@@ -328,28 +328,28 @@ event_timed::init_starts(THD *thd, Item *new_starts)
...
@@ -328,28 +328,28 @@ event_timed::init_starts(THD *thd, Item *new_starts)
/*
/*
Set deactivation time.
Set deactivation time.
SYNOPSIS
SYNOPSIS
event_timed::init_ends()
event_timed::init_ends()
thd
THD
thd
THD
new_ends when?
new_ends when?
NOTES
NOTES
Note that activation time is not execution time.
Note that activation time is not execution time.
EVERY 5 MINUTE ENDS "2004-12-12 10:00:00" means that
EVERY 5 MINUTE ENDS "2004-12-12 10:00:00" means that
the event will be executed every 5 minutes but this will
the event will be executed every 5 minutes but this will
end at the date shown above. Expressions are possible :
end at the date shown above. Expressions are possible :
DATE_ADD(NOW(), INTERVAL 1 DAY) -- end tommorow at
DATE_ADD(NOW(), INTERVAL 1 DAY) -- end tommorow at
same time.
same time.
RETURNS
RETURNS
0 -
OK
0
OK
EVEX_PARSE_ERROR -
fix_fields failed
EVEX_PARSE_ERROR
fix_fields failed
EVEX_BAD_PARAMS -
ENDS before STARTS
EVEX_BAD_PARAMS
ENDS before STARTS
*/
*/
int
int
event_timed
::
init_ends
(
THD
*
thd
,
Item
*
new_ends
)
event_timed
::
init_ends
(
THD
*
thd
,
Item
*
new_ends
)
{
{
TIME
ltime
;
TIME
ltime
;
...
@@ -361,16 +361,16 @@ event_timed::init_ends(THD *thd, Item *new_ends)
...
@@ -361,16 +361,16 @@ event_timed::init_ends(THD *thd, Item *new_ends)
if
(
new_ends
->
fix_fields
(
thd
,
&
new_ends
))
if
(
new_ends
->
fix_fields
(
thd
,
&
new_ends
))
DBUG_RETURN
(
EVEX_PARSE_ERROR
);
DBUG_RETURN
(
EVEX_PARSE_ERROR
);
/
/ the field was already fixed in init_ends
/
* The field was already fixed in init_ends */
if
((
not_used
=
new_ends
->
get_date
(
&
ltime
,
TIME_NO_ZERO_DATE
)))
if
((
not_used
=
new_ends
->
get_date
(
&
ltime
,
TIME_NO_ZERO_DATE
)))
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
/*
/*
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
This may result in a 1970-01-01 date if ltime is > 2037-xx-xx
.
CONVERT_TZ has similar problem
CONVERT_TZ has similar problem
.
*/
*/
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime
,
TIME_to_timestamp
(
thd
,
&
ltime
,
&
not_used
));
my_tz_UTC
->
gmt_sec_to_TIME
(
&
ltime
,
TIME_to_timestamp
(
thd
,
&
ltime
,
&
not_used
));
if
(
starts
.
year
&&
my_time_compare
(
&
starts
,
&
ltime
)
!=
-
1
)
if
(
starts
.
year
&&
my_time_compare
(
&
starts
,
&
ltime
)
!=
-
1
)
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
DBUG_RETURN
(
EVEX_BAD_PARAMS
);
...
@@ -380,12 +380,12 @@ event_timed::init_ends(THD *thd, Item *new_ends)
...
@@ -380,12 +380,12 @@ event_timed::init_ends(THD *thd, Item *new_ends)
/*
/*
Sets comment.
Sets comment.
SYNOPSIS
SYNOPSIS
event_timed::init_comment()
event_timed::init_comment()
thd THD - used for memory allocation
thd THD - used for memory allocation
comment the string.
comment the string.
*/
*/
void
void
...
@@ -401,11 +401,10 @@ event_timed::init_comment(THD *thd, LEX_STRING *set_comment)
...
@@ -401,11 +401,10 @@ event_timed::init_comment(THD *thd, LEX_STRING *set_comment)
/*
/*
Inits definer (definer_user and definer_host) during
Inits definer (definer_user and definer_host) during parsing.
parsing.
SYNOPSIS
SYNOPSIS
event_timed::init_definer()
event_timed::init_definer()
*/
*/
int
int
...
@@ -418,31 +417,31 @@ event_timed::init_definer(THD *thd)
...
@@ -418,31 +417,31 @@ event_timed::init_definer(THD *thd)
definer_host
.
str
=
strdup_root
(
thd
->
mem_root
,
thd
->
security_ctx
->
priv_host
);
definer_host
.
str
=
strdup_root
(
thd
->
mem_root
,
thd
->
security_ctx
->
priv_host
);
definer_host
.
length
=
strlen
(
thd
->
security_ctx
->
priv_host
);
definer_host
.
length
=
strlen
(
thd
->
security_ctx
->
priv_host
);
definer
.
length
=
definer_user
.
length
+
definer_host
.
length
+
1
;
definer
.
length
=
definer_user
.
length
+
definer_host
.
length
+
1
;
definer
.
str
=
alloc_root
(
thd
->
mem_root
,
definer
.
length
+
1
);
definer
.
str
=
alloc_root
(
thd
->
mem_root
,
definer
.
length
+
1
);
memcpy
(
definer
.
str
,
definer_user
.
str
,
definer_user
.
length
);
memcpy
(
definer
.
str
,
definer_user
.
str
,
definer_user
.
length
);
definer
.
str
[
definer_user
.
length
]
=
'@'
;
definer
.
str
[
definer_user
.
length
]
=
'@'
;
memcpy
(
definer
.
str
+
definer_user
.
length
+
1
,
definer_host
.
str
,
memcpy
(
definer
.
str
+
definer_user
.
length
+
1
,
definer_host
.
str
,
definer_host
.
length
);
definer_host
.
length
);
definer
.
str
[
definer
.
length
]
=
'\0'
;
definer
.
str
[
definer
.
length
]
=
'\0'
;
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
/*
/*
Loads an event from a row from mysql.event
Loads an event from a row from mysql.event
SYNOPSIS
SYNOPSIS
event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
REMARK
S
NOTE
S
This method is silent on errors and should behave like that. Callers
This method is silent on errors and should behave like that. Callers
should handle throwing of error messages. The reason is that the class
should handle throwing of error messages. The reason is that the class
should not know about how to deal with communication.
should not know about how to deal with communication.
*/
*/
int
int
...
@@ -461,7 +460,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
...
@@ -461,7 +460,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
goto
error
;
goto
error
;
et
=
this
;
et
=
this
;
if
(
table
->
s
->
fields
!=
EVEX_FIELD_COUNT
)
if
(
table
->
s
->
fields
!=
EVEX_FIELD_COUNT
)
goto
error
;
goto
error
;
...
@@ -500,18 +499,18 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
...
@@ -500,18 +499,18 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
len
=
et
->
definer
.
length
-
len
-
1
;
//1 is 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
.
str
=
strmake_root
(
mem_root
,
ptr
+
1
,
len
);
//1: because of @
et
->
definer_host
.
length
=
len
;
et
->
definer_host
.
length
=
len
;
res1
=
table
->
field
[
EVEX_FIELD_STARTS
]
->
res1
=
table
->
field
[
EVEX_FIELD_STARTS
]
->
get_date
(
&
et
->
starts
,
TIME_NO_ZERO_DATE
);
get_date
(
&
et
->
starts
,
TIME_NO_ZERO_DATE
);
res2
=
table
->
field
[
EVEX_FIELD_ENDS
]
->
res2
=
table
->
field
[
EVEX_FIELD_ENDS
]
->
get_date
(
&
et
->
ends
,
TIME_NO_ZERO_DATE
);
get_date
(
&
et
->
ends
,
TIME_NO_ZERO_DATE
);
et
->
expression
=
table
->
field
[
EVEX_FIELD_INTERVAL_EXPR
]
->
val_int
();
et
->
expression
=
table
->
field
[
EVEX_FIELD_INTERVAL_EXPR
]
->
val_int
();
/*
/*
If res1 and res2 are true then both fields are empty.
If res1 and res2 are true then both fields are empty.
Hence if EVEX_FIELD_EXECUTE_AT is empty there is an error.
Hence if EVEX_FIELD_EXECUTE_AT is empty there is an error.
*/
*/
if
(
res1
&&
res2
&&
!
et
->
expression
&&
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
if
(
res1
&&
res2
&&
!
et
->
expression
&&
table
->
field
[
EVEX_FIELD_EXECUTE_AT
]
->
get_date
(
&
et
->
execute_at
,
TIME_NO_ZERO_DATE
))
get_date
(
&
et
->
execute_at
,
TIME_NO_ZERO_DATE
))
...
@@ -554,7 +553,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
...
@@ -554,7 +553,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
// 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
)
if
((
ptr
=
get_field
(
mem_root
,
table
->
field
[
EVEX_FIELD_STATUS
]))
==
NullS
)
goto
error
;
goto
error
;
DBUG_PRINT
(
"load_from_row"
,
(
"Event [%s] is [%s]"
,
et
->
name
.
str
,
ptr
));
DBUG_PRINT
(
"load_from_row"
,
(
"Event [%s] is [%s]"
,
et
->
name
.
str
,
ptr
));
et
->
status
=
(
ptr
[
0
]
==
'E'
?
MYSQL_EVENT_ENABLED
:
MYSQL_EVENT_DISABLED
);
et
->
status
=
(
ptr
[
0
]
==
'E'
?
MYSQL_EVENT_ENABLED
:
MYSQL_EVENT_DISABLED
);
...
@@ -571,7 +570,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
...
@@ -571,7 +570,7 @@ event_timed::load_from_row(MEM_ROOT *mem_root, TABLE *table)
et
->
comment
.
length
=
strlen
(
et
->
comment
.
str
);
et
->
comment
.
length
=
strlen
(
et
->
comment
.
str
);
else
else
et
->
comment
.
length
=
0
;
et
->
comment
.
length
=
0
;
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
error:
error:
DBUG_RETURN
(
EVEX_GET_FIELD_FAILED
);
DBUG_RETURN
(
EVEX_GET_FIELD_FAILED
);
...
@@ -579,15 +578,14 @@ error:
...
@@ -579,15 +578,14 @@ error:
/*
/*
Computes the sum of a timestamp plus interval
Computes the sum of a timestamp plus interval
SYNOPSIS
SYNOPSIS
get_next_time(TIME *start, int interval_value, interval_type interval)
get_next_time(TIME *start, int interval_value, interval_type interval)
next the sum
next - the sum
start add interval_value to this time
start - add interval_value to this time
i_value quantity of time type interval to add
i_value - quantity of time type interval to add
i_type type of interval to add (SECOND, MINUTE, HOUR, WEEK ...)
i_type - type of interval to add (SECOND, MINUTE, HOUR, WEEK ...)
*/
*/
static
static
...
@@ -596,7 +594,7 @@ bool get_next_time(TIME *next, TIME *start, int i_value, interval_type i_type)
...
@@ -596,7 +594,7 @@ bool get_next_time(TIME *next, TIME *start, int i_value, interval_type i_type)
bool
ret
;
bool
ret
;
INTERVAL
interval
;
INTERVAL
interval
;
TIME
tmp
;
TIME
tmp
;
bzero
(
&
interval
,
sizeof
(
interval
));
bzero
(
&
interval
,
sizeof
(
interval
));
switch
(
i_type
)
{
switch
(
i_type
)
{
...
@@ -648,14 +646,14 @@ bool get_next_time(TIME *next, TIME *start, int i_value, interval_type i_type)
...
@@ -648,14 +646,14 @@ bool get_next_time(TIME *next, TIME *start, int i_value, interval_type i_type)
/*
/*
Computes next execution time.
Computes next execution time.
SYNOPSIS
SYNOPSIS
event_timed::compute_next_execution_time()
event_timed::compute_next_execution_time()
REMARKS:
NOTES
The time is set in execute_at, if no more executions the latter is set to
The time is set in execute_at, if no more executions the latter is set to
0000-00-00.
0000-00-00.
*/
*/
bool
bool
...
@@ -673,10 +671,10 @@ event_timed::compute_next_execution_time()
...
@@ -673,10 +671,10 @@ event_timed::compute_next_execution_time()
(
"Event %s is DISABLED"
,
name
.
str
));
(
"Event %s is DISABLED"
,
name
.
str
));
goto
ret
;
goto
ret
;
}
}
/
/if one-time no need to do computation
/
* If one-time, no need to do computation */
if
(
!
expression
)
if
(
!
expression
)
{
{
/
/let's check whether it was executed
/
* Let's check whether it was executed */
if
(
last_executed
.
year
)
if
(
last_executed
.
year
)
{
{
DBUG_PRINT
(
"compute_next_execution_time"
,
DBUG_PRINT
(
"compute_next_execution_time"
,
...
@@ -697,7 +695,7 @@ event_timed::compute_next_execution_time()
...
@@ -697,7 +695,7 @@ event_timed::compute_next_execution_time()
#ifdef ANDREY_0
#ifdef ANDREY_0
sql_print_information
(
"[%s.%s]"
,
dbname
.
str
,
name
.
str
);
sql_print_information
(
"[%s.%s]"
,
dbname
.
str
,
name
.
str
);
sql_print_information
(
"time_now : [%d-%d-%d %d:%d:%d ]"
,
sql_print_information
(
"time_now : [%d-%d-%d %d:%d:%d ]"
,
time_now
.
year
,
time_now
.
month
,
time_now
.
day
,
time_now
.
year
,
time_now
.
month
,
time_now
.
day
,
time_now
.
hour
,
time_now
.
minute
,
time_now
.
second
);
time_now
.
hour
,
time_now
.
minute
,
time_now
.
second
);
sql_print_information
(
"starts : [%d-%d-%d %d:%d:%d ]"
,
starts
.
year
,
sql_print_information
(
"starts : [%d-%d-%d %d:%d:%d ]"
,
starts
.
year
,
...
@@ -712,10 +710,10 @@ event_timed::compute_next_execution_time()
...
@@ -712,10 +710,10 @@ event_timed::compute_next_execution_time()
last_executed
.
second
);
last_executed
.
second
);
#endif
#endif
/
/if time_now is after ends don't execute anymore
/
* If time_now is after ends don't execute anymore */
if
(
ends
.
year
&&
(
tmp
=
my_time_compare
(
&
ends
,
&
time_now
))
==
-
1
)
if
(
ends
.
year
&&
(
tmp
=
my_time_compare
(
&
ends
,
&
time_now
))
==
-
1
)
{
{
/
/ time_now is after ends. don't execute anymore
/
* time_now is after ends. don't execute anymore */
set_zero_time
(
&
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
if
(
on_completion
==
MYSQL_EVENT_ON_COMPLETION_DROP
)
if
(
on_completion
==
MYSQL_EVENT_ON_COMPLETION_DROP
)
dropped
=
true
;
dropped
=
true
;
...
@@ -724,17 +722,17 @@ event_timed::compute_next_execution_time()
...
@@ -724,17 +722,17 @@ event_timed::compute_next_execution_time()
goto
ret
;
goto
ret
;
}
}
/*
/*
Here time_now is before or equals ends if the latter is set.
Here time_now is before or equals ends if the latter is set.
Let's check whether time_now is before starts.
Let's check whether time_now is before starts.
If so schedule for starts
If so schedule for starts.
*/
*/
if
(
starts
.
year
&&
(
tmp
=
my_time_compare
(
&
time_now
,
&
starts
))
<
1
)
if
(
starts
.
year
&&
(
tmp
=
my_time_compare
(
&
time_now
,
&
starts
))
<
1
)
{
{
if
(
tmp
==
0
&&
my_time_compare
(
&
starts
,
&
last_executed
)
==
0
)
if
(
tmp
==
0
&&
my_time_compare
(
&
starts
,
&
last_executed
)
==
0
)
{
{
/*
/*
time_now = starts = last_executed
time_now = starts = last_executed
do nothing or we will schedule for second time execution at starts.
do nothing or we will schedule for second time execution at starts.
*/
*/
...
@@ -749,10 +747,10 @@ event_timed::compute_next_execution_time()
...
@@ -749,10 +747,10 @@ event_timed::compute_next_execution_time()
goto
ret
;
goto
ret
;
}
}
}
}
if
(
starts
.
year
&&
ends
.
year
)
if
(
starts
.
year
&&
ends
.
year
)
{
{
/*
/*
Both starts and m_ends are set and time_now is between them (incl.)
Both starts and m_ends are set and time_now is between them (incl.)
If last_executed is set then increase with m_expression. The new TIME is
If last_executed is set then increase with m_expression. The new TIME is
after m_ends set execute_at to 0. And check for on_completion
after m_ends set execute_at to 0. And check for on_completion
...
@@ -763,14 +761,14 @@ event_timed::compute_next_execution_time()
...
@@ -763,14 +761,14 @@ event_timed::compute_next_execution_time()
else
else
{
{
TIME
next_exec
;
TIME
next_exec
;
if
(
get_next_time
(
&
next_exec
,
&
last_executed
,
expression
,
interval
))
if
(
get_next_time
(
&
next_exec
,
&
last_executed
,
expression
,
interval
))
goto
err
;
goto
err
;
/
/ There was previous execution
/
* There was previous execution */
if
(
my_time_compare
(
&
ends
,
&
next_exec
)
==
-
1
)
if
(
my_time_compare
(
&
ends
,
&
next_exec
)
==
-
1
)
{
{
/
/ Next execution after ends. No more executions
/
* Next execution after ends. No more executions */
set_zero_time
(
&
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
set_zero_time
(
&
execute_at
,
MYSQL_TIMESTAMP_DATETIME
);
if
(
on_completion
==
MYSQL_EVENT_ON_COMPLETION_DROP
)
if
(
on_completion
==
MYSQL_EVENT_ON_COMPLETION_DROP
)
dropped
=
true
;
dropped
=
true
;
...
@@ -782,20 +780,24 @@ event_timed::compute_next_execution_time()
...
@@ -782,20 +780,24 @@ event_timed::compute_next_execution_time()
}
}
else
if
(
!
starts
.
year
&&
!
ends
.
year
)
else
if
(
!
starts
.
year
&&
!
ends
.
year
)
{
{
// both starts and m_ends are not set, se we schedule for the next
/*
// based on last_executed
Both starts and m_ends are not set, so we schedule for the next
based on last_executed.
*/
if
(
last_executed
.
year
)
if
(
last_executed
.
year
)
{
{
if
(
get_next_time
(
&
execute_at
,
&
last_executed
,
expression
,
interval
))
if
(
get_next_time
(
&
execute_at
,
&
last_executed
,
expression
,
interval
))
goto
err
;
goto
err
;
}
}
else
else
//last_executed not set. Schedule the event for now
{
/* last_executed not set. Schedule the event for now */
execute_at
=
time_now
;
execute_at
=
time_now
;
}
}
}
else
else
{
{
/
/either starts or m_ends is set
/
* Either starts or m_ends is set */
if
(
starts
.
year
)
if
(
starts
.
year
)
{
{
/*
/*
...
@@ -853,10 +855,10 @@ err:
...
@@ -853,10 +855,10 @@ err:
/*
/*
Set the internal last_executed TIME struct to now. NOW is the
Set the internal last_executed TIME struct to now. NOW is the
time according to thd->query_start(), so the THD's clock.
time according to thd->query_start(), so the THD's clock.
S
ynopsis
S
YNOPSIS
event_timed::drop()
event_timed::drop()
thd
-
thread context
thd
thread context
*/
*/
void
void
...
@@ -877,17 +879,17 @@ event_timed::mark_last_executed(THD *thd)
...
@@ -877,17 +879,17 @@ event_timed::mark_last_executed(THD *thd)
/*
/*
Drops the event
Drops the event
S
ynopsis
S
YNOPSIS
event_timed::drop()
event_timed::drop()
thd
-
thread context
thd
thread context
RETURN
S :
RETURN
VALUE
0
-
OK
0
OK
-1
-
Cannot open mysql.event
-1
Cannot open mysql.event
-2
-
Cannot find the event in mysql.event (already deleted?)
-2
Cannot find the event in mysql.event (already deleted?)
others
-
return code from SE in case deletion of the event row
others
return code from SE in case deletion of the event row
failed.
failed.
*/
*/
...
@@ -904,18 +906,18 @@ event_timed::drop(THD *thd)
...
@@ -904,18 +906,18 @@ event_timed::drop(THD *thd)
/*
/*
Saves status and last_executed_at to the disk if changed.
Saves status and last_executed_at to the disk if changed.
S
ynopsis
S
YNOPSIS
event_timed::drop()
event_timed::drop()
thd - thread context
thd - thread context
R
eturns :
R
ETURN VALUE
0
-
OK
0
OK
SP_OPEN_TABLE_FAILED
-
Error while opening mysql.event for writing
SP_OPEN_TABLE_FAILED
Error while opening mysql.event for writing
EVEX_WRITE_ROW_FAILED
-
On error to write to disk
EVEX_WRITE_ROW_FAILED
On error to write to disk
others
- return code from SE in case deletion of the event row
others
return code from SE in case deletion of the event
failed.
row
failed.
*/
*/
bool
bool
...
@@ -929,11 +931,11 @@ event_timed::update_fields(THD *thd)
...
@@ -929,11 +931,11 @@ event_timed::update_fields(THD *thd)
DBUG_ENTER
(
"event_timed::update_time_fields"
);
DBUG_ENTER
(
"event_timed::update_time_fields"
);
DBUG_PRINT
(
"enter"
,
(
"name: %*s"
,
name
.
length
,
name
.
str
));
DBUG_PRINT
(
"enter"
,
(
"name: %*s"
,
name
.
length
,
name
.
str
));
/
/no need to update if nothing has changed
/
* No need to update if nothing has changed */
if
(
!
(
status_changed
||
last_executed_changed
))
if
(
!
(
status_changed
||
last_executed_changed
))
goto
done
;
goto
done
;
thd
->
reset_n_backup_open_tables_state
(
&
backup
);
thd
->
reset_n_backup_open_tables_state
(
&
backup
);
if
(
evex_open_event_table
(
thd
,
TL_WRITE
,
&
table
))
if
(
evex_open_event_table
(
thd
,
TL_WRITE
,
&
table
))
...
@@ -947,8 +949,8 @@ event_timed::update_fields(THD *thd)
...
@@ -947,8 +949,8 @@ event_timed::update_fields(THD *thd)
goto
done
;
goto
done
;
store_record
(
table
,
record
[
1
]);
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
;
table
->
timestamp_field_type
=
TIMESTAMP_NO_AUTO_SET
;
if
(
last_executed_changed
)
if
(
last_executed_changed
)
{
{
...
@@ -963,7 +965,7 @@ event_timed::update_fields(THD *thd)
...
@@ -963,7 +965,7 @@ event_timed::update_fields(THD *thd)
table
->
field
[
EVEX_FIELD_STATUS
]
->
store
((
longlong
)
status
);
table
->
field
[
EVEX_FIELD_STATUS
]
->
store
((
longlong
)
status
);
status_changed
=
false
;
status_changed
=
false
;
}
}
if
((
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
if
((
table
->
file
->
ha_update_row
(
table
->
record
[
1
],
table
->
record
[
0
])))
ret
=
EVEX_WRITE_ROW_FAILED
;
ret
=
EVEX_WRITE_ROW_FAILED
;
...
@@ -977,14 +979,16 @@ done:
...
@@ -977,14 +979,16 @@ done:
/*
/*
Get SHOW CREATE EVENT as string
Get SHOW CREATE EVENT as string
thd - Thread
SYNOPSIS
buf - String*, should be already allocated. CREATE EVENT goes inside.
event_timed::get_create_event(THD *thd, String *buf)
thd Thread
Returns:
buf String*, should be already allocated. CREATE EVENT goes inside.
0 - OK
1 - Error (for now if mysql.event has been tampered and MICROSECONDS
RETURN VALUE
interval or derivative has been put there.
0 OK
1 Error (for now if mysql.event has been tampered and MICROSECONDS
interval or derivative has been put there.
*/
*/
int
int
...
@@ -1017,9 +1021,9 @@ event_timed::get_create_event(THD *thd, String *buf)
...
@@ -1017,9 +1021,9 @@ event_timed::get_create_event(THD *thd, String *buf)
{
{
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 '"
));
buf
->
append
(
STRING_WITH_LEN
(
"AT '"
));
/*
/*
pass the buffer and the second param tells fills the buffer and returns
Pass the buffer and the second param tells fills the buffer and
the number of chars to copy
returns the number of chars to copy.
*/
*/
buf
->
append
(
dtime_buff
,
my_datetime_to_str
(
&
execute_at
,
dtime_buff
));
buf
->
append
(
dtime_buff
,
my_datetime_to_str
(
&
execute_at
,
dtime_buff
));
buf
->
append
(
STRING_WITH_LEN
(
"'"
));
buf
->
append
(
STRING_WITH_LEN
(
"'"
));
...
@@ -1041,25 +1045,24 @@ event_timed::get_create_event(THD *thd, String *buf)
...
@@ -1041,25 +1045,24 @@ event_timed::get_create_event(THD *thd, String *buf)
append_unescaped
(
buf
,
comment
.
str
,
comment
.
length
);
append_unescaped
(
buf
,
comment
.
str
,
comment
.
length
);
}
}
buf
->
append
(
STRING_WITH_LEN
(
" DO "
));
buf
->
append
(
STRING_WITH_LEN
(
" DO "
));
buf
->
append
(
body
.
str
,
body
.
length
);
buf
->
append
(
body
.
str
,
body
.
length
);
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
/*
/*
Executes the event (the underlying sp_head object);
Executes the event (the underlying sp_head object);
SYNOPSIS
SYNOPSIS
evex_fill_row()
evex_fill_row()
thd THD
thd THD
mem_root If != NULL use it to compile the event on it
mem_root If != NULL use it to compile the event on it
Returns
RETURNS
0 - success
0 success
-100 - event in execution (parallel execution is impossible)
-100 event in execution (parallel execution is impossible)
others - retcodes of sp_head::execute_procedure()
others retcodes of sp_head::execute_procedure()
*/
*/
int
int
...
@@ -1067,11 +1070,11 @@ event_timed::execute(THD *thd, MEM_ROOT *mem_root)
...
@@ -1067,11 +1070,11 @@ event_timed::execute(THD *thd, MEM_ROOT *mem_root)
{
{
List
<
Item
>
empty_item_list
;
List
<
Item
>
empty_item_list
;
int
ret
=
0
;
int
ret
=
0
;
DBUG_ENTER
(
"event_timed::execute"
);
DBUG_ENTER
(
"event_timed::execute"
);
VOID
(
pthread_mutex_lock
(
&
this
->
LOCK_running
));
VOID
(
pthread_mutex_lock
(
&
this
->
LOCK_running
));
if
(
running
)
if
(
running
)
{
{
VOID
(
pthread_mutex_unlock
(
&
this
->
LOCK_running
));
VOID
(
pthread_mutex_unlock
(
&
this
->
LOCK_running
));
DBUG_RETURN
(
-
100
);
DBUG_RETURN
(
-
100
);
...
@@ -1081,10 +1084,10 @@ event_timed::execute(THD *thd, MEM_ROOT *mem_root)
...
@@ -1081,10 +1084,10 @@ event_timed::execute(THD *thd, MEM_ROOT *mem_root)
// TODO Andrey : make this as member variable and delete in destructor
// TODO Andrey : make this as member variable and delete in destructor
empty_item_list
.
empty
();
empty_item_list
.
empty
();
if
(
!
sphead
&&
(
ret
=
compile
(
thd
,
mem_root
)))
if
(
!
sphead
&&
(
ret
=
compile
(
thd
,
mem_root
)))
goto
done
;
goto
done
;
ret
=
sphead
->
execute_procedure
(
thd
,
&
empty_item_list
);
ret
=
sphead
->
execute_procedure
(
thd
,
&
empty_item_list
);
VOID
(
pthread_mutex_lock
(
&
this
->
LOCK_running
));
VOID
(
pthread_mutex_lock
(
&
this
->
LOCK_running
));
...
@@ -1106,17 +1109,16 @@ done:
...
@@ -1106,17 +1109,16 @@ done:
/*
/*
Compiles an event before it's execution. Compiles the anonymous
Compiles an event before it's execution. Compiles the anonymous
sp_head object held by the event
sp_head object held by the event
S
ynopsis
S
YNOPSIS
event_timed::compile()
event_timed::compile()
thd - thread context, used for memory allocation mostly
thd thread context, used for memory allocation mostly
mem_root - if != NULL then this memory root is used for allocs
mem_root if != NULL then this memory root is used for allocs
instead of thd->mem_root
instead of thd->mem_root
Returns
0 - Success
EVEX_COMPILE_ERROR - Error during compilation
RETURN VALUE
0 success
EVEX_COMPILE_ERROR error during compilation
*/
*/
int
int
...
@@ -1136,21 +1138,21 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
...
@@ -1136,21 +1138,21 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
CHARSET_INFO
*
old_character_set_client
,
CHARSET_INFO
*
old_character_set_client
,
*
old_collation_connection
,
*
old_collation_connection
,
*
old_character_set_results
;
*
old_character_set_results
;
show_create
.
length
(
0
);
show_create
.
length
(
0
);
old_character_set_client
=
thd
->
variables
.
character_set_client
;
old_character_set_client
=
thd
->
variables
.
character_set_client
;
old_character_set_results
=
thd
->
variables
.
character_set_results
;
old_character_set_results
=
thd
->
variables
.
character_set_results
;
old_collation_connection
=
thd
->
variables
.
collation_connection
;
old_collation_connection
=
thd
->
variables
.
collation_connection
;
thd
->
variables
.
character_set_client
=
thd
->
variables
.
character_set_client
=
thd
->
variables
.
character_set_results
=
thd
->
variables
.
character_set_results
=
thd
->
variables
.
collation_connection
=
thd
->
variables
.
collation_connection
=
get_charset_by_csname
(
"utf8"
,
MY_CS_PRIMARY
,
MYF
(
MY_WME
));
get_charset_by_csname
(
"utf8"
,
MY_CS_PRIMARY
,
MYF
(
MY_WME
));
thd
->
update_charset
();
thd
->
update_charset
();
DBUG_ENTER
(
"event_timed::compile"
);
DBUG_ENTER
(
"event_timed::compile"
);
/
/ change the memory root for the execution time
/
* Change the memory root for the execution time */
if
(
mem_root
)
if
(
mem_root
)
{
{
tmp_mem_root
=
thd
->
mem_root
;
tmp_mem_root
=
thd
->
mem_root
;
...
@@ -1174,8 +1176,10 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
...
@@ -1174,8 +1176,10 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
{
{
DBUG_PRINT
(
"error"
,
(
"error during compile or thd->is_fatal_error=%d"
,
DBUG_PRINT
(
"error"
,
(
"error during compile or thd->is_fatal_error=%d"
,
thd
->
is_fatal_error
));
thd
->
is_fatal_error
));
// Free lex associated resources
/*
// QQ: Do we really need all this stuff here ?
Free lex associated resources
QQ: Do we really need all this stuff here?
*/
sql_print_error
(
"error during compile of %s.%s or thd->is_fatal_error=%d"
,
sql_print_error
(
"error during compile of %s.%s or thd->is_fatal_error=%d"
,
dbname
.
str
,
name
.
str
,
thd
->
is_fatal_error
);
dbname
.
str
,
name
.
str
,
thd
->
is_fatal_error
);
if
(
lex
.
sphead
)
if
(
lex
.
sphead
)
...
@@ -1189,11 +1193,13 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
...
@@ -1189,11 +1193,13 @@ event_timed::compile(THD *thd, MEM_ROOT *mem_root)
goto
done
;
goto
done
;
}
}
DBUG_PRINT
(
"note"
,
(
"success compiling %s.%s"
,
dbname
.
str
,
name
.
str
));
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
;
//copy also chistics since they will vanish otherwise we get 0x0 pointer
/*
// Todo : Handle sql_mode !!
Ccopy also chistics since they will vanish otherwise we get 0x0 pointer
TODO: Handle sql_mode!!
*/
sphead
->
set_definer
(
definer
.
str
,
definer
.
length
);
sphead
->
set_definer
(
definer
.
str
,
definer
.
length
);
sphead
->
set_info
(
0
,
0
,
&
lex
.
sp_chistics
,
0
/*sql_mode*/
);
sphead
->
set_info
(
0
,
0
,
&
lex
.
sp_chistics
,
0
/*sql_mode*/
);
sphead
->
optimize
();
sphead
->
optimize
();
...
@@ -1214,9 +1220,7 @@ done:
...
@@ -1214,9 +1220,7 @@ done:
thd
->
variables
.
collation_connection
=
old_collation_connection
;
thd
->
variables
.
collation_connection
=
old_collation_connection
;
thd
->
update_charset
();
thd
->
update_charset
();
/*
/* Change the memory root for the execution time. */
Change the memory root for the execution time.
*/
if
(
mem_root
)
if
(
mem_root
)
thd
->
mem_root
=
tmp_mem_root
;
thd
->
mem_root
=
tmp_mem_root
;
...
...
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