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.2369 06/04/19 16:31:52 andrey@lmy004. +5 -0
post review fixes of fix for bug #16992 ("Information_schema.events troubles)
EVENT_ACL is not needed to see own events. SELECT_ACL on mysql.event is needed
to see the events system wide of all users.
sql/sql_show.cc
1.324 06/04/19 16:31:42 andrey@lmy004. +70 -26
- add missing function docs
- fix the code according to the review comment -> SELECT FROM I_S.EVENTS should not
do PK but table scan.
sql/event_timed.cc
1.49 06/04/19 16:31:42 andrey@lmy004. +3 -2
a bit more debug info
mysql-test/t/events_i_s.test
1.2 06/04/19 16:31:42 andrey@lmy004. +4 -4
update test, so it uses ORDER BY because I_S.EVENTS will be ordered no more
mysql-test/t/events.test
1.29 06/04/19 16:31:41 andrey@lmy004. +1 -1
fix test
mysql-test/r/events_i_s.result
1.2 06/04/19 16:31:41 andrey@lmy004. +4 -4
update result
# 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-bug16992-new
--- 1.323/sql/sql_show.cc 2006-04-18 15:46:37 +03:00
+++ 1.324/sql/sql_show.cc 2006-04-19 16:31:42 +03:00
@@ -3965,14 +3965,30 @@ static interval_type get_real_interval_t
extern LEX_STRING interval_type_to_name[];
+
+/*
+ Loads an event from mysql.event and copies it's data to a row of
+ I_S.EVENTS
+
+ Synopsis
+ fill_events_copy_to_schema_table()
+ thd Thread
+ sch_table The schema table (mysql.event)
+ event_table The event table to use for loading.
+
+ Returns
+ 0 OK
+ 1 Error
+*/
+
static int
fill_events_copy_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
{
const char *wild= thd->lex->wild ? thd->lex->wild->ptr() : NullS;
CHARSET_INFO *scs= system_charset_info;
TIME time;
- Event_timed et;
DBUG_ENTER("fill_events_copy_to_schema_tab");
+ Event_timed et;
restore_record(sch_table, s->default_values);
@@ -3998,10 +4014,10 @@ fill_events_copy_to_schema_table(THD *th
ulong sql_mode_len=0;
sql_mode_str=
sys_var_thd_sql_mode::symbolic_mode_representation(thd, et.sql_mode,
- &sql_mode_len);
+ &sql_mode_len);
sch_table->field[9]->store((const char*)sql_mode_str, sql_mode_len, scs);
}
-
+
if (et.expression)
{
String show_str;
@@ -4019,7 +4035,7 @@ fill_events_copy_to_schema_table(THD *th
sch_table->field[8]->set_notnull();
sch_table->field[8]->store(ival->str, ival->length, scs);
- //starts & ends
+ /* starts & ends */
sch_table->field[10]->set_notnull();
sch_table->field[10]->store_time(&et.starts, MYSQL_TIMESTAMP_DATETIME);
@@ -4031,25 +4047,25 @@ fill_events_copy_to_schema_table(THD *th
}
else
{
- //type
+ /* type */
sch_table->field[5]->store(STRING_WITH_LEN("ONE TIME"), scs);
sch_table->field[6]->set_notnull();
sch_table->field[6]->store_time(&et.execute_at, MYSQL_TIMESTAMP_DATETIME);
}
- //status
+ /* status */
if (et.status == MYSQL_EVENT_ENABLED)
sch_table->field[12]->store(STRING_WITH_LEN("ENABLED"), scs);
else
sch_table->field[12]->store(STRING_WITH_LEN("DISABLED"), scs);
- //on_completion
+ /* on_completion */
if (et.on_completion == MYSQL_EVENT_ON_COMPLETION_DROP)
sch_table->field[13]->store(STRING_WITH_LEN("NOT PRESERVE"), scs);
else
sch_table->field[13]->store(STRING_WITH_LEN("PRESERVE"), scs);
-
+
int not_used=0;
number_to_datetime(et.created, &time, 0, ¬_used);
DBUG_ASSERT(not_used==0);
@@ -4074,16 +4090,32 @@ fill_events_copy_to_schema_table(THD *th
}
+/*
+ Fills I_S.EVENTS with data loaded from mysql.event. Also used by
+ SHOW EVENTS
+
+ Synopsis
+ fill_schema_events()
+ thd Thread
+ tables The schema table
+ cond Unused
+
+ Returns
+ 0 OK
+ 1 Error
+*/
+
int fill_schema_events(THD *thd, TABLE_LIST *tables, COND *cond)
{
TABLE *table= tables->table;
CHARSET_INFO *scs= system_charset_info;
TABLE *event_table= NULL;
+ READ_RECORD read_record_info;
Open_tables_state backup;
int ret=0;
bool verbose= false;
char definer[HOSTNAME_LENGTH+USERNAME_LENGTH+2];
- bool use_prefix_scanning= true;
+ bool use_index_scan= true;
uint key_len= 0;
byte *key_buf= NULL;
LINT_INIT(key_buf);
@@ -4116,8 +4148,9 @@ int fill_schema_events(THD *thd, TABLE_L
if (verbose)
{
/*
- 1. SELECT I_S => use PK(0)
- Reasoning:
+ 1. SELECT I_S => use table scan. I_S.EVENTS does not guarantee order
+ thus we won't order it. OTOH SHOW EVENTS will be
+ ordered.
2. SHOW EVENTS => second index(1) (db)
Reasoning: Events are per schema, therefore a scan over an index
will save use from doing a table scan and comparing
@@ -4125,7 +4158,6 @@ int fill_schema_events(THD *thd, TABLE_L
Name is used. Because here we have verbose we have to
see all events of every user in the schema. If not
a verbose mode then db+definer is used but for PK.
-
*/
if (thd->lex->orig_sql_command == SQLCOM_SHOW_EVENTS)
{
@@ -4136,7 +4168,7 @@ int fill_schema_events(THD *thd, TABLE_L
event_table->field[EVEX_FIELD_DB]->
store(thd->lex->select_lex.db, strlen(thd->lex->select_lex.db),
scs);
key_len= event_table->key_info[1].key_part[0].store_length;
-
+
if (!(key_buf= (byte *)alloc_root(thd->mem_root, key_len)))
{
ret= 1;
@@ -4150,15 +4182,16 @@ int fill_schema_events(THD *thd, TABLE_L
}
else
{
- DBUG_PRINT("info",("Not using prefix scanning but using PK."));
- event_table->file->ha_index_init(0, 1);
- ret= event_table->file->index_first(event_table->record[0]);
- use_prefix_scanning= FALSE;
+ DBUG_PRINT("info",("Not using index scan but table scan."));
+ use_index_scan= false;
+ init_read_record(&read_record_info, thd, event_table, NULL, 1, 0);
+ if (-1== (ret= read_record_info.read_record(&read_record_info)))
+ ret= HA_ERR_END_OF_FILE;
}
}
else
{
- DBUG_PRINT("info",("Using prefix scanning on PK"));
+ DBUG_PRINT("info", ("Using prefix scanning on PK"));
event_table->file->ha_index_init(0, 1);
event_table->field[EVEX_FIELD_DEFINER]->store(definer, strlen(definer), scs);
@@ -4178,7 +4211,7 @@ int fill_schema_events(THD *thd, TABLE_L
ret= 1;
goto err;
}
-
+
key_copy(key_buf, event_table->record[0], event_table->key_info, key_len);
ret= event_table->file->index_read(event_table->record[0], key_buf, key_len,
HA_READ_PREFIX);
@@ -4189,32 +4222,43 @@ int fill_schema_events(THD *thd, TABLE_L
ret= (ret == HA_ERR_END_OF_FILE || ret == HA_ERR_KEY_NOT_FOUND) ? 0 : 1;
goto err;
}
- DBUG_PRINT("info",("Found some rows, let's retrieve them."));
+ DBUG_PRINT("info",("Found some rows, let's retrieve them. ret=%d", ret));
while (!ret)
{
if ((ret= fill_events_copy_to_schema_table(thd, table, event_table)))
goto err;
- if (use_prefix_scanning)
+ if (use_index_scan)
ret= event_table->file->
index_next_same(event_table->record[0], key_buf, key_len);
else
- ret= event_table->file->index_next(event_table->record[0]);
+ {
+ /*
+ rr_sequential, in read_record(), returns 137==HA_ERR_END_OF_FILE,
+ but rr_handle_error returns -1 for that reason. Thus, read_record()
+ returns -1 eventually.
+ */
+ if (-1 ==(ret= read_record_info.read_record(&read_record_info)))
+ ret= HA_ERR_END_OF_FILE;
+ }
}
- DBUG_PRINT("info",("Scan finished"));
- // ret is guaranteed to be != 0
+ DBUG_PRINT("info",("Scan finished. ret=%d", ret));
+ /* ret is guaranteed to be != 0 */
ret= (ret != HA_ERR_END_OF_FILE);
err:
if (event_table)
{
DBUG_PRINT("info",("Closing index"));
- event_table->file->ha_index_end();
+ if (use_index_scan)
+ event_table->file->ha_index_end();
+ else
+ end_read_record(&read_record_info);
close_thread_tables(thd);
}
thd->restore_backup_open_tables_state(&backup);
-
+
DBUG_PRINT("info",("Return code=%d", ret));
DBUG_RETURN(ret);
}
--- 1.1/mysql-test/r/events_i_s.result 2006-03-24 16:44:18 +02:00
+++ 1.2/mysql-test/r/events_i_s.result 2006-04-19 16:31:41 +03:00
@@ -7,7 +7,7 @@ CREATE EVENT one_event ON SCHEDULE EVERY
SHOW EVENTS;
Db Name Definer Type Execute at Interval value Interval field Starts Ends Status
events_test one_event root@localhost RECURRING NULL 10 SECOND # # ENABLED
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT from
information_schema.events;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT
PRESERVE
CREATE DATABASE events_test2;
@@ -99,7 +99,7 @@ events_test2 three_event ev_test@localho
events_test2 root_event_1 root@localhost RECURRING NULL 10 HOUR # # ENABLED
events_test2 root_event_2 root@localhost RECURRING NULL 20 MINUTE # # ENABLED
"we should see 6 events now (additional one from events_test schema:";
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
NULL events_test2 one_event ev_test@localhost SELECT
123 RECURRING NULL 20 SECOND DISABLED NOT PRESERVE
NULL events_test2 three_event ev_test@localhost SELECT
123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
@@ -109,7 +109,7 @@ NULL events_test2 root_event_1 root@loca
NULL events_test2 root_event_2 root@localhost SELECT
4567 RECURRING NULL 20 MINUTE ENABLED NOT PRESERVE
REVOKE SELECT ON mysql.event FROM ev_test@localhost;
"we should see only 3 events now, we don't have SELECT on mysql.event anymore:";
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
NULL events_test2 one_event ev_test@localhost SELECT
123 RECURRING NULL 20 SECOND DISABLED NOT PRESERVE
NULL events_test2 three_event ev_test@localhost SELECT
123 RECURRING NULL 20 SECOND ENABLED PRESERVE three event
@@ -117,7 +117,7 @@ NULL events_test2 two_event ev_test@loca
DROP DATABASE events_test2;
USE events_test;
"we should see only 2 events now, 3 of ev_test@localhost were dropped with DROP
DATABASE";
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT
NULL events_test one_event root@localhost SELECT 123 RECURRING NULL 10 SECOND ENABLED NOT
PRESERVE
DROP USER ev_test@localhost;
--- 1.28/mysql-test/t/events.test 2006-04-18 15:46:36 +03:00
+++ 1.29/mysql-test/t/events.test 2006-04-19 16:31:41 +03:00
@@ -247,7 +247,7 @@ DROP EVENT intact_check;
create event e_26 on schedule at '2017-01-01 00:00:00' disable do set @a = 5;
select db, name, body, definer, convert_tz(execute_at, 'UTC', 'SYSTEM'), on_completion
from mysql.event;
drop event e_26;
---error ER_WRONG_VALUE
+--error 1504
create event e_26 on schedule at NULL disabled do set @a = 5;
--error 1504
create event e_26 on schedule at 'definitely not a datetime' disabled do set @a = 5;
--- 1.1/mysql-test/t/events_i_s.test 2006-03-24 16:44:19 +02:00
+++ 1.2/mysql-test/t/events_i_s.test 2006-04-19 16:31:42 +03:00
@@ -13,7 +13,7 @@ SELECT USER(), DATABASE();
CREATE EVENT one_event ON SCHEDULE EVERY 10 SECOND DO SELECT 123;
--replace_column 8 # 9 #
SHOW EVENTS;
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT from
information_schema.events;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
CREATE DATABASE events_test2;
CREATE USER ev_test@localhost;
GRANT EVENT ON events_test.* to ev_test@localhost;
@@ -93,19 +93,19 @@ connection ev_con1;
SHOW EVENTS;
--echo "we should see 6 events now (additional one from events_test schema:";
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
connection default;
REVOKE SELECT ON mysql.event FROM ev_test@localhost;
connection ev_con1;
--echo "we should see only 3 events now, we don't have SELECT on mysql.event anymore:";
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
disconnect ev_con1;
connection default;
DROP DATABASE events_test2;
USE events_test;
--echo "we should see only 2 events now, 3 of ev_test@localhost were dropped with DROP
DATABASE";
-SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS;
+SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_TYPE,
EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM
INFORMATION_SCHEMA.EVENTS ORDER BY DEFINER, EVENT_SCHEMA, EVENT_NAME;
DROP USER ev_test@localhost;
DROP EVENT one_event;
#
--- 1.48/sql/event_timed.cc 2006-04-07 10:13:20 +03:00
+++ 1.49/sql/event_timed.cc 2006-04-19 16:31:42 +03:00
@@ -715,7 +715,7 @@ bool get_next_time(TIME *next, TIME *sta
DBUG_PRINT("info", ("seconds=%ld months=%ld", seconds, months));
if (seconds)
{
- longlong seconds_diff;
+ longlong seconds_diff= 0;
long microsec_diff;
if (calc_time_diff(time_now, start, 1, &seconds_diff, µsec_diff))
@@ -730,7 +730,8 @@ bool get_next_time(TIME *next, TIME *sta
event two times for the same time
get the next exec if the modulus is not
*/
- DBUG_PRINT("info", ("multiplier=%d", multiplier));
+ DBUG_PRINT("info", ("multiplier=%d seconds_diff=%d", multiplier,
+ seconds_diff));
if (seconds_diff % seconds || (!seconds_diff && last_exec->year))
++multiplier;
interval.second= seconds * multiplier;
| Thread |
|---|
| • bk commit into 5.1 tree (andrey:1.2369) BUG#16992 | ahristov | 19 Apr |