List:Commits« Previous MessageNext Message »
From:ahristov Date:April 19 2006 3:32pm
Subject:bk commit into 5.1 tree (andrey:1.2369) BUG#16992
View as plain text  
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, &not_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, &microsec_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#16992ahristov19 Apr