Below is the list of changes that have just been committed into a local
5.1 repository of andrey. When andrey does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2141 06/02/20 16:06:05 andrey@lmy004. +9 -0
fix for bug #16411 Events: Microsecond intervals are allowed
WL#1034
mysql-test/r/events_microsec.result
1.1 06/02/20 16:05:53 andrey@lmy004. +56 -0
sql/sql_yacc.yy
1.463 06/02/20 16:05:53 andrey@lmy004. +2 -0
bail out if any MICROSECOND interval is specified
sql/sql_show.cc
1.309 06/02/20 16:05:53 andrey@lmy004. +2 -1
use new error code name
mysql-test/r/events_microsec.result
1.0 06/02/20 16:05:53 andrey@lmy004. +0 -0
BitKeeper file /work/mysql-5.1-bug16411/mysql-test/r/events_microsec.result
sql/share/errmsg.txt
1.84 06/02/20 16:05:52 andrey@lmy004. +1 -1
rename error code, it's generic
sql/event_timed.cc
1.34 06/02/20 16:05:52 andrey@lmy004. +29 -14
forbid MICROSECOND intervals for events
sql/event_executor.cc
1.31 06/02/20 16:05:52 andrey@lmy004. +14 -5
- use new ER_ code name
- handle EVEX_MICROSECOND_UNSUP error code
sql/event.h
1.23 06/02/20 16:05:52 andrey@lmy004. +1 -0
add new error code
sql/event.cc
1.31 06/02/20 16:05:52 andrey@lmy004. +3 -2
- handle also INTERVAL_MICROSECOND, was missing.
- use renamed ER_ code which is generic
mysql-test/r/events.result
1.22 06/02/20 16:05:52 andrey@lmy004. +1 -1
output fix
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: andrey
# Host: lmy004.
# Root: /work/mysql-5.1-bug16411
--- 1.308/sql/sql_show.cc 2006-02-17 20:06:00 +01:00
+++ 1.309/sql/sql_show.cc 2006-02-20 16:05:53 +01:00
@@ -3940,7 +3940,7 @@ fill_events_copy_to_schema_table(THD *th
if (et.load_from_row(thd->mem_root, event_table))
{
- my_error(ER_EVENT_CANNOT_LOAD_FROM_TABLE, MYF(0));
+ my_error(ER_CANNOT_LOAD_FROM_TABLE, MYF(0));
DBUG_RETURN(1);
}
@@ -3968,6 +3968,7 @@ fill_events_copy_to_schema_table(THD *th
if (event_reconstruct_interval_expression(&show_str, et.interval,
et.expression))
DBUG_RETURN(1);
+
sch_table->field[7]->set_notnull();
sch_table->field[7]->store(show_str.c_ptr(), show_str.length(), scs);
--- 1.462/sql/sql_yacc.yy 2006-02-17 20:00:41 +01:00
+++ 1.463/sql/sql_yacc.yy 2006-02-20 16:05:53 +01:00
@@ -1419,6 +1419,8 @@ ev_schedule_time: EVERY_SYM expr interva
break;
case EVEX_BAD_PARAMS:
my_error(ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG, MYF(0));
+ case EVEX_MICROSECOND_UNSUP:
+ my_error(ER_NOT_SUPPORTED_YET, MYF(0), "MICROSECOND");
YYABORT;
break;
}
--- 1.21/mysql-test/r/events.result 2006-02-16 13:11:06 +01:00
+++ 1.22/mysql-test/r/events.result 2006-02-20 16:05:52 +01:00
@@ -204,7 +204,7 @@ event CREATE TABLE `event` (
`on_completion` enum('DROP','PRESERVE') NOT NULL default 'DROP',
`sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') NOT NULL default '',
`comment` char(64) character set utf8 collate utf8_bin NOT NULL default '',
- PRIMARY KEY (`definer`,`db`,`name`)
+ PRIMARY KEY (`definer`,`db`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Events'
SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
ERROR HY000: Cannot load from mysql.event. Table probably corrupted. See error log.
--- New file ---
+++ mysql-test/r/events_microsec.result 06/02/20 16:05:53
create database if not exists events_test;
use events_test;
CREATE EVENT micro_test ON SCHEDULE EVERY 100 MICROSECOND DO SELECT 1;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
CREATE EVENT micro_test ON SCHEDULE EVERY 100 DAY_MICROSECOND DO SELECT 1;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
CREATE EVENT micro_test ON SCHEDULE EVERY 100 HOUR_MICROSECOND DO SELECT 1;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
CREATE EVENT micro_test ON SCHEDULE EVERY 100 MINUTE_MICROSECOND DO SELECT 1;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
CREATE EVENT micro_test ON SCHEDULE EVERY 100 SECOND_MICROSECOND DO SELECT 1;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
"Now create normal event and change it on SQL level"
CREATE EVENT micro_test2 ON SCHEDULE EVERY 1 MONTH DO SELECT 1;
UPDATE mysql.event SET interval_field='MICROSECOND' WHERE db=database() AND definer=user() AND name='micro_test2';
SHOW CREATE EVENT micro_test2;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
SET GLOBAL event_scheduler=0;
"Should not be running:"
SHOW VARIABLES like 'event_scheduler';
Variable_name Value
event_scheduler OFF
UPDATE mysql.event SET interval_field='DAY_MICROSECOND' WHERE db=database() AND definer=user() AND name='micro_test2';
SHOW CREATE EVENT micro_test2;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
SET GLOBAL event_scheduler=0;
"Should not be running:"
SHOW VARIABLES like 'event_scheduler';
Variable_name Value
event_scheduler OFF
UPDATE mysql.event SET interval_field='SECOND_MICROSECOND' WHERE db=database() AND definer=user() AND name='micro_test2';
SHOW CREATE EVENT micro_test2;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
SET GLOBAL event_scheduler=0;
"Should not be running:"
SHOW VARIABLES like 'event_scheduler';
Variable_name Value
event_scheduler OFF
UPDATE mysql.event SET interval_field='HOUR_MICROSECOND' WHERE db=database() AND definer=user() AND name='micro_test2';
SHOW CREATE EVENT micro_test2;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
SET GLOBAL event_scheduler=0;
"Should not be running:"
SHOW VARIABLES like 'event_scheduler';
Variable_name Value
event_scheduler OFF
UPDATE mysql.event SET interval_field='MINUTE_MICROSECOND' WHERE db=database() AND definer=user() AND name='micro_test2';
SHOW CREATE EVENT micro_test2;
ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
SET GLOBAL event_scheduler=0;
"Should not be running:"
SHOW VARIABLES like 'event_scheduler';
Variable_name Value
event_scheduler OFF
DROP EVENT micro_test2;
drop database events_test;
--- 1.30/sql/event.cc 2006-02-16 13:11:06 +01:00
+++ 1.31/sql/event.cc 2006-02-20 16:05:52 +01:00
@@ -438,6 +438,7 @@ common_1_lev_code:
case INTERVAL_HOUR_MICROSECOND:
case INTERVAL_MINUTE_MICROSECOND:
case INTERVAL_SECOND_MICROSECOND:
+ case INTERVAL_MICROSECOND:
my_error(ER_NOT_SUPPORTED_YET, MYF(0), "MICROSECOND");
return 1;
break;
@@ -494,7 +495,7 @@ evex_open_event_table(THD *thd, enum thr
if (table_check_intact(tables.table, EVEX_FIELD_COUNT, event_table_fields,
&mysql_event_last_create_time,
- ER_EVENT_CANNOT_LOAD_FROM_TABLE))
+ ER_CANNOT_LOAD_FROM_TABLE))
{
close_thread_tables(thd);
DBUG_RETURN(2);
@@ -976,7 +977,7 @@ db_find_event(THD *thd, sp_name *name, L
*/
if ((ret= et->load_from_row(root, table)))
{
- my_error(ER_EVENT_CANNOT_LOAD_FROM_TABLE, MYF(0));
+ my_error(ER_CANNOT_LOAD_FROM_TABLE, MYF(0));
goto done;
}
--- 1.22/sql/event.h 2006-02-16 05:20:55 +01:00
+++ 1.23/sql/event.h 2006-02-20 16:05:52 +01:00
@@ -35,6 +35,7 @@
#define EVEX_BODY_TOO_LONG SP_BODY_TOO_LONG
#define EVEX_BAD_PARAMS -21
#define EVEX_NOT_RUNNING -22
+#define EVEX_MICROSECOND_UNSUP -23
#define EVENT_EXEC_NO_MORE (1L << 0)
#define EVENT_NOT_USED (1L << 1)
--- 1.30/sql/event_executor.cc 2006-02-16 01:27:30 +01:00
+++ 1.31/sql/event_executor.cc 2006-02-20 16:05:52 +01:00
@@ -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_EVENT_CANNOT_LOAD_FROM_TABLE);
+ &mysql_db_table_last_check,ER_CANNOT_LOAD_FROM_TABLE);
close_thread_tables(thd);
}
@@ -723,6 +723,8 @@ event_executor_worker(void *event_void)
sql_print_information("SCHEDULER: COMPILE ERROR for event %s.%s of",
event->dbname.str, event->name.str,
event->definer.str);
+ else if (ret == EVEX_MICROSECOND_UNSUP)
+ sql_print_information("SCHEDULER: MICROSECOND is supported");
}
event->spawn_thread_finish(thd);
@@ -775,7 +777,7 @@ err_no_thd:
RETURNS
0 - OK
- -1 - Error
+ !0 - Error
NOTES
Reports the error to the console
@@ -828,11 +830,17 @@ evex_load_events_from_db(THD *thd)
DBUG_PRINT("evex_load_events_from_db",
("Event %s loaded from row. Time to compile", et->name.str));
- if ((ret= et->compile(thd, &evex_mem_root)))
- {
+ switch (ret= et->compile(thd, &evex_mem_root)) {
+ case EVEX_MICROSECOND_UNSUP:
+ sql_print_error("SCHEDULER: mysql.event is tampered. MICROSECOND is not "
+ "supported but found in mysql.event");
+ goto end;
+ case EVEX_COMPILE_ERROR:
sql_print_error("SCHEDULER: Error while compiling %s.%s. Aborting load.",
et->dbname.str, et->name.str);
goto end;
+ default:
+ break;
}
// let's find when to be executed
@@ -860,7 +868,8 @@ end:
thd->version--; // Force close to free memory
close_thread_tables(thd);
- sql_print_information("SCHEDULER: Loaded %d event%s", count, (count == 1)?"":"s");
+ if (!ret)
+ sql_print_information("SCHEDULER: Loaded %d event%s", count, (count == 1)?"":"s");
DBUG_PRINT("info", ("Status code %d. Loaded %d event(s)", ret, count));
DBUG_RETURN(ret);
--- 1.33/sql/event_timed.cc 2006-02-16 13:11:06 +01:00
+++ 1.34/sql/event_timed.cc 2006-02-20 16:05:52 +01:00
@@ -186,9 +186,10 @@ event_timed::init_execute_at(THD *thd, I
new_interval what is the interval
RETURNS
- 0 OK
- EVEX_PARSE_ERROR fix_fields failed
- EVEX_BAD_PARAMS Interval is not positive
+ 0 OK
+ EVEX_PARSE_ERROR fix_fields failed
+ EVEX_BAD_PARAMS Interval is not positive
+ EVEX_MICROSECOND_UNSUP Microseconds are not supported.
*/
int
@@ -248,6 +249,7 @@ event_timed::init_interval(THD *thd, Ite
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 +
interval.second) * 1000000L + interval.second_part;
break;
@@ -258,10 +260,11 @@ event_timed::init_interval(THD *thd, Ite
expression= interval.minute * 60 + interval.second;
break;
case INTERVAL_SECOND_MICROSECOND:
+ DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
expression= interval.second * 1000000L + interval.second_part;
break;
- default:
- break;
+ case INTERVAL_MICROSECOND:
+ DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
}
if (interval.neg || expression > EVEX_MAX_INTERVAL_VALUE)
DBUG_RETURN(EVEX_BAD_PARAMS);
@@ -996,9 +999,10 @@ extern LEX_STRING interval_type_to_name[
buf String*, should be already allocated. CREATE EVENT goes inside.
RETURN VALUE
- 0 OK
- 1 Error (for now if mysql.event has been tampered and MICROSECONDS
- interval or derivative has been put there.
+ 0 OK
+ EVEX_MICROSECOND_UNSUP Error (for now if mysql.event has been
+ tampered and MICROSECONDS interval or
+ derivative has been put there.
*/
int
@@ -1014,7 +1018,7 @@ event_timed::get_create_event(THD *thd,
if (expression &&
event_reconstruct_interval_expression(&expr_buf, interval, expression))
- DBUG_RETURN(1);
+ DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
buf->append(STRING_WITH_LEN("CREATE EVENT "));
append_identifier(thd, buf, dbname.str, dbname.length);
@@ -1215,8 +1219,9 @@ event_timed::restore_security_context(TH
instead of thd->mem_root
RETURN VALUE
- 0 success
- EVEX_COMPILE_ERROR error during compilation
+ 0 success
+ EVEX_COMPILE_ERROR error during compilation
+ EVEX_MICROSECOND_UNSUP mysql.event was tampered
*/
int
@@ -1238,7 +1243,20 @@ event_timed::compile(THD *thd, MEM_ROOT
*old_collation_connection,
*old_character_set_results;
+ DBUG_ENTER("event_timed::compile");
+
show_create.length(0);
+
+ switch (get_create_event(thd, &show_create)) {
+ case EVEX_MICROSECOND_UNSUP:
+ sql_print_error("Scheduler");
+ DBUG_RETURN(EVEX_MICROSECOND_UNSUP);
+ case 0:
+ break;
+ default:
+ DBUG_ASSERT(0);
+ }
+
old_character_set_client= thd->variables.character_set_client;
old_character_set_results= thd->variables.character_set_results;
old_collation_connection= thd->variables.collation_connection;
@@ -1250,7 +1268,6 @@ event_timed::compile(THD *thd, MEM_ROOT
thd->update_charset();
- DBUG_ENTER("event_timed::compile");
/* Change the memory root for the execution time */
if (mem_root)
{
@@ -1263,8 +1280,6 @@ event_timed::compile(THD *thd, MEM_ROOT
old_db_length= thd->db_length;
thd->db= dbname.str;
thd->db_length= dbname.length;
-
- get_create_event(thd, &show_create);
thd->query= show_create.c_ptr();
thd->query_length= show_create.length();
--- 1.83/sql/share/errmsg.txt 2006-02-17 20:03:30 +01:00
+++ 1.84/sql/share/errmsg.txt 2006-02-20 16:05:52 +01:00
@@ -5781,7 +5781,7 @@ ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
eng "No datetime expression provided"
ER_COL_COUNT_DOESNT_MATCH_CORRUPTED
eng "Column count of mysql.%s is wrong. Expected %d, found %d. Table probably corrupted"
-ER_EVENT_CANNOT_LOAD_FROM_TABLE
+ER_CANNOT_LOAD_FROM_TABLE
eng "Cannot load from mysql.%s. Table probably corrupted. See error log."
ER_EVENT_CANNOT_DELETE
eng "Failed to delete the event from mysql.event"
| Thread |
|---|
| • bk commit into 5.1 tree (andrey:1.2141) BUG#16411 | ahristov | 20 Feb |