List:Commits« Previous MessageNext Message »
From:ahristov Date:March 1 2006 12:46pm
Subject:bk commit into 5.1 tree (andrey:1.2215)
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.2215 06/03/01 13:46:01 andrey@lmy004. +12 -0
  manual merge

  sql/event_executor.cc
    1.42 06/03/01 13:45:54 andrey@lmy004. +3 -4
    manual merge

  sql/event.cc
    1.38 06/03/01 13:45:54 andrey@lmy004. +7 -43
    manual merge

  scripts/mysql_fix_privilege_tables.sql
    1.42 06/03/01 13:45:54 andrey@lmy004. +3 -3
    manual merge

  mysql-test/r/system_mysql_db.result
    1.40 06/03/01 13:45:54 andrey@lmy004. +1 -2
    manual merge

  mysql-test/r/events.result
    1.28 06/03/01 13:45:53 andrey@lmy004. +146 -5
    manual merge

  scripts/mysql_create_system_tables.sh
    1.39 06/03/01 13:26:29 andrey@lmy004. +0 -0
    Auto merged

  mysql-test/lib/init_db.sql
    1.26 06/03/01 13:26:29 andrey@lmy004. +0 -0
    Auto merged

  sql/table.h
    1.133 06/03/01 13:26:32 andrey@lmy004. +0 -0
    Auto merged

  sql/table.cc
    1.211 06/03/01 13:26:32 andrey@lmy004. +0 -0
    Auto merged

  sql/sql_show.cc
    1.316 06/03/01 13:26:30 andrey@lmy004. +0 -0
    Auto merged

  sql/sql_parse.cc
    1.524 06/03/01 13:26:30 andrey@lmy004. +0 -0
    Auto merged

  mysql-test/t/events.test
    1.23 06/03/01 13:26:29 andrey@lmy004. +0 -0
    Auto merged

# 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/RESYNC

--- 1.523/sql/sql_parse.cc	2006-02-20 17:39:33 +01:00
+++ 1.524/sql/sql_parse.cc	2006-03-01 13:26:30 +01:00
@@ -2111,6 +2111,7 @@ bool dispatch_command(enum enum_server_c
 
 void log_slow_statement(THD *thd)
 {
+  DBUG_ENTER("log_slow_statement");
   time_t start_of_query;
 
   /*
@@ -2142,6 +2143,7 @@ void log_slow_statement(THD *thd)
       slow_log_print(thd, thd->query, thd->query_length, start_of_query);
     }
   }
+  DBUG_VOID_RETURN;
 }
 
 
@@ -3711,7 +3713,7 @@ end_with_restore_list:
     }
     if (!strip_sp(db) || check_db_name(db))
     {
-      my_error(ER_WRONG_DB_NAME, MYF(0), lex->name);
+      my_error(ER_WRONG_DB_NAME, MYF(0), db);
       break;
     }
     /*
@@ -3723,8 +3725,8 @@ end_with_restore_list:
     */
 #ifdef HAVE_REPLICATION
     if (thd->slave_thread &&
-	(!rpl_filter->db_ok(lex->name) ||
-	 !rpl_filter->db_ok_with_wild_table(lex->name)))
+	(!rpl_filter->db_ok(db) ||
+	 !rpl_filter->db_ok_with_wild_table(db)))
     {
       my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0));
       break;
@@ -4971,7 +4973,9 @@ end_with_restore_list:
     break;
   }
   default:
+#ifndef EMBEDDED_LIBRARY
     DBUG_ASSERT(0);                             /* Impossible */
+#endif
     send_ok(thd);
     break;
   }
@@ -4989,6 +4993,7 @@ end_with_restore_list:
   */
   if (thd->one_shot_set && lex->sql_command != SQLCOM_SET_OPTION)
     reset_one_shot_variables(thd);
+  thd->reset_current_stmt_binlog_row_based();
 
   /*
     The return value for ROW_COUNT() is "implementation dependent" if the
@@ -6148,10 +6153,11 @@ TABLE_LIST *st_select_lex::add_table_to_
     /*
       table_list.next points to the last inserted TABLE_LIST->next_local'
       element
+      We don't use the offsetof() macro here to avoid warnings from gcc
     */
-    previous_table_ref= (TABLE_LIST*) (table_list.next -
-                                       offsetof(TABLE_LIST, next_local));
-    DBUG_ASSERT(previous_table_ref);
+    previous_table_ref= (TABLE_LIST*) ((char*) table_list.next -
+                                       ((char*) &(ptr->next_local) -
+                                        (char*) ptr));
     /*
       Set next_name_resolution_table of the previous table reference to point
       to the current table reference. In effect the list

--- 1.315/sql/sql_show.cc	2006-02-28 18:33:25 +01:00
+++ 1.316/sql/sql_show.cc	2006-03-01 13:26:30 +01:00
@@ -4028,9 +4028,10 @@ fill_events_copy_to_schema_table(THD *th
   sch_table->field[15]->store_time(&time, MYSQL_TIMESTAMP_DATETIME);
 
   if (et.last_executed.year)
+  {
+    sch_table->field[16]->set_notnull();
     sch_table->field[16]->store_time(&et.last_executed,MYSQL_TIMESTAMP_DATETIME);
-  else
-    sch_table->field[16]->set_null();
+  }
 
   sch_table->field[17]->store(et.comment.str, et.comment.length, scs);
 
@@ -4050,17 +4051,18 @@ int fill_schema_events(THD *thd, TABLE_L
   int ret=0;
   bool verbose= false;
   char definer[HOSTNAME_LENGTH+USERNAME_LENGTH+2];
-  bool use_prefix_scanning= true;
   uint key_len= 0;
   byte *key_buf= NULL;
   LINT_INIT(key_buf);
+  bool use_prefix_scanning= TRUE;
 
   DBUG_ENTER("fill_schema_events");
 
   strxmov(definer, thd->security_ctx->priv_user,"@",thd->security_ctx->priv_host,
           NullS);
 
-  DBUG_PRINT("info",("db=%s current_user=%s", thd->lex->select_lex.db, definer));
+  DBUG_PRINT("info",("db=%s current_user=%s",
+             thd->lex->select_lex.db?thd->lex->select_lex.db:"(null)", definer));
 
   thd->reset_n_backup_open_tables_state(&backup);
 
@@ -4070,33 +4072,68 @@ int fill_schema_events(THD *thd, TABLE_L
     ret= 1;
     goto err;
   }
-  
-  event_table->file->ha_index_init(0, 1);
 
-  /* 
-    see others' events only if you have PROCESS_ACL !!
-    thd->lex->verbose is set either if SHOW FULL EVENTS or
-    in case of SELECT FROM I_S.EVENTS
-  */
-  verbose= (thd->lex->verbose
-            && (thd->security_ctx->master_access & PROCESS_ACL));
-
-  if (verbose && thd->security_ctx->user)
-  {    
-    ret= event_table->file->index_first(event_table->record[0]);
-    use_prefix_scanning= false;
+  {
+    TABLE_LIST tmp_table;
+    bzero((char*) &tmp_table,sizeof(tmp_table));
+    tmp_table.db=(char*) "mysql";
+    tmp_table.table_name=(char*) "event";
+    verbose= !(check_grant(thd, SELECT_ACL, &tmp_table, 0, 1, 1));
+  }
+
+  if (verbose)
+  {
+    /*
+      1. SELECT I_S => use PK(0) 
+      2. SHOW EVENTS => second index(1) (db, name, definer)
+    
+    */
+    if (thd->lex->orig_sql_command == SQLCOM_SHOW_EVENTS)
+    {
+      DBUG_PRINT("info",("Using prefix scanning on UNIQUE"));
+      event_table->file->ha_index_init(1, 1);
+      DBUG_ASSERT(thd->lex->select_lex.db);
+      DBUG_PRINT("info",("Using  `%s` in the prefix", thd->lex->select_lex.db));
+      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;
+        goto err;
+      }
+    
+      key_copy(key_buf, event_table->record[0], event_table->key_info + 1,
+               key_len);
+      ret= event_table->file->index_read(event_table->record[0], key_buf,
+                                         key_len, HA_READ_PREFIX);
+    }
+    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;
+    }
   }
   else
   {
-    event_table->field[EVEX_FIELD_DEFINER]->store(definer, strlen(definer), scs);    
+    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);
     key_len= event_table->key_info->key_part[0].store_length;
 
-    if (thd->lex->select_lex.db)
+    if (thd->lex->orig_sql_command == SQLCOM_SHOW_EVENTS)
     {
+      DBUG_PRINT("info",("Using also `%s` in the prefix scanning",
+                  thd->lex->select_lex.db));
       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->key_part[1].store_length;
     }
+
     if (!(key_buf= (byte *)alloc_root(thd->mem_root, key_len)))
     {
       ret= 1;
@@ -4113,6 +4150,7 @@ 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."));
 
   while (!ret)
   {
@@ -4121,20 +4159,24 @@ int fill_schema_events(THD *thd, TABLE_L
 
     if (use_prefix_scanning)
       ret= event_table->file->
-                       index_next_same(event_table->record[0], key_buf, key_len);                                  
+                       index_next_same(event_table->record[0], key_buf, key_len);
     else
       ret= event_table->file->index_next(event_table->record[0]);
   }
+  DBUG_PRINT("info",("Scan finished"));
   // 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();
     close_thread_tables(thd);
   }
 
   thd->restore_backup_open_tables_state(&backup);
+  
+  DBUG_PRINT("info",("Return code=%d", ret));
   DBUG_RETURN(ret);
 }
 

--- 1.210/sql/table.cc	2006-02-20 17:39:33 +01:00
+++ 1.211/sql/table.cc	2006-03-01 13:26:32 +01:00
@@ -130,6 +130,24 @@ TABLE_SHARE *alloc_table_share(TABLE_LIS
     share->version=       refresh_version;
     share->flush_version= flush_version;
 
+#ifdef HAVE_ROW_BASED_REPLICATION
+    /*
+      This constant is used to mark that no table map version has been
+      assigned.  No arithmetic is done on the value: it will be
+      overwritten with a value taken from MYSQL_BIN_LOG.
+    */
+    share->table_map_version= ~(ulonglong)0;
+
+    /*
+      Since alloc_table_share() can be called without any locking (for
+      example, ha_create_table... functions), we do not assign a table
+      map id here.  Instead we assign a value that is not used
+      elsewhere, and then assign a table map id inside open_table()
+      under the protection of the LOCK_open mutex.
+    */
+    share->table_map_id= ULONG_MAX;
+#endif
+
     memcpy((char*) &share->mem_root, (char*) &mem_root, sizeof(mem_root));
     pthread_mutex_init(&share->mutex, MY_MUTEX_INIT_FAST);
     pthread_cond_init(&share->cond, NULL);
@@ -180,6 +198,15 @@ void init_tmp_table_share(TABLE_SHARE *s
   share->path.length= share->normalized_path.length= strlen(path);
   share->frm_version= 		 FRM_VER_TRUE_VARCHAR;
 
+#ifdef HAVE_ROW_BASED_REPLICATION
+  /*
+    Temporary tables are not replicated, but we set up these fields
+    anyway to be able to catch errors.
+   */
+  share->table_map_version= ~(ulonglong)0;
+  share->table_map_id= ULONG_MAX;
+#endif
+
   DBUG_VOID_RETURN;
 }
 
@@ -371,6 +398,7 @@ err_not_open:
     share->error= error;
     open_table_error(share, error, (share->open_errno= my_errno), 0);
   }
+
   DBUG_RETURN(error);
 }
 
@@ -1503,24 +1531,6 @@ int open_table_from_share(THD *thd, TABL
 
   *root_ptr= old_root;
   thd->status_var.opened_tables++;
-#ifdef HAVE_REPLICATION
-
-  /*
-     This constant is used to mark that no table map version has been
-     assigned.  No arithmetic is done on the value: it will be
-     overwritten with a value taken from MYSQL_BIN_LOG.
-  */
-  share->table_map_version= ~(ulonglong)0;
-
-  /*
-    Since openfrm() can be called without any locking (for example,
-    ha_create_table... functions), we do not assign a table map id
-    here.  Instead we assign a value that is not used elsewhere, and
-    then assign a table map id inside open_table() under the
-    protection of the LOCK_open mutex.
-   */
-  share->table_map_id= ULONG_MAX;
-#endif
 
   DBUG_RETURN (0);
 

--- 1.132/sql/table.h	2006-02-20 17:39:33 +01:00
+++ 1.133/sql/table.h	2006-03-01 13:26:32 +01:00
@@ -216,6 +216,8 @@ typedef struct st_table_share
 /* Information for one open table */
 
 struct st_table {
+  st_table() {}                               /* Remove gcc warning */
+
   TABLE_SHARE	*s;
   handler	*file;
 #ifdef NOT_YET
@@ -490,6 +492,7 @@ public:
 
 typedef struct st_table_list
 {
+  st_table_list() {}                          /* Remove gcc warning */
   /*
     List of tables local to a subquery (used by SQL_LIST). Considers
     views as leaves (unlike 'next_leaf' below). Created at parse time
@@ -722,6 +725,7 @@ class Item;
 class Field_iterator: public Sql_alloc
 {
 public:
+  Field_iterator() {}                         /* Remove gcc warning */
   virtual ~Field_iterator() {}
   virtual void set(TABLE_LIST *)= 0;
   virtual void next()= 0;

--- 1.27/mysql-test/r/events.result	2006-02-28 14:43:41 +01:00
+++ 1.28/mysql-test/r/events.result	2006-03-01 13:45:53 +01:00
@@ -186,10 +186,10 @@ SHOW CREATE EVENT root20;
 Event	sql_mode	Create Event
 root20		CREATE EVENT `events_test`.`root20` ON SCHEDULE EVERY '50 20:12:45' DAY_SECOND ON COMPLETION NOT PRESERVE ENABLE DO select 1
 set names cp1251;
+create event ðóóò21 on schedule every '50:23:59:95' day_second COMMENT 'òîâà å 1251 êîìåíòàð' do select 1;
+SHOW CREATE EVENT ðóóò21;
 Event	sql_mode	Create Event
+ðóóò21		CREATE EVENT `events_test`.`ðóóò21` ON SCHEDULE EVERY '51 0:0:35' DAY_SECOND ON COMPLETION NOT PRESERVE ENABLE COMMENT 'òîâà å 1251 êîìåíòàð' DO select 1
 insert into mysql.event (db, name, body, definer, interval_value, interval_field) values (database(), "root22", "select 1", user(), 100, "SECOND_MICROSECOND");
 show create event root22;
 ERROR 42000: This version of MySQL doesn't yet support 'MICROSECOND'
@@ -214,7 +214,7 @@ drop event root17_1;
 drop event root18;
 drop event root19;
 drop event root20;
+drop event ðóóò21;
 set names latin1;
 CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing";
 SHOW EVENTS;

--- 1.22/mysql-test/t/events.test	2006-02-28 11:46:00 +01:00
+++ 1.23/mysql-test/t/events.test	2006-03-01 13:26:29 +01:00
@@ -181,139 +181,7 @@ set names latin1;
 # SHOW CREATE EVENT test end
 #
 
-#
-# mysql.event intact checking start
-#
-# There should be at least 1 second between the ALTERs or we can't catch the change of create_time!!
-#
-CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing";
---replace_column 8 # 9 #
-SHOW EVENTS;
-ALTER TABLE mysql.event ADD dummy INT FIRST;
---error 1525
-SHOW EVENTS;
-ALTER TABLE mysql.event DROP dummy, ADD dummy2 VARCHAR(64) FIRST;
---error 1525
-SHOW EVENTS;
-ALTER TABLE mysql.event DROP dummy2;
---replace_column 8 # 9 #
-SHOW EVENTS;
-CREATE TABLE event_like LIKE mysql.event;
-INSERT INTO event_like SELECT * FROM mysql.event;
-#sleep a bit or we won't catch the change of time
---sleep 1
-ALTER TABLE mysql.event MODIFY db char(20) character set utf8 collate utf8_bin default '';
-#wait a bit or we won't see the difference because of seconds resolution
---sleep 1
-SHOW CREATE TABLE mysql.event;
---error 1526
-SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
---sleep 1
-ALTER TABLE mysql.event MODIFY db char(64) character set utf8 collate utf8_bin default '';
---sleep 1
---echo "This should work"
---replace_column 8 # 9 #
-SHOW EVENTS;
---sleep 1
-ALTER TABLE mysql.event MODIFY db char(64) character set cp1251 default '';
---error 1526
-SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
---sleep 1
-ALTER TABLE mysql.event MODIFY db varchar(64) character set utf8 collate utf8_bin default '';
---error 1526
-SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
---sleep 1
-ALTER TABLE mysql.event DROP comment, DROP starts;
---sleep 1
---error 1525
-SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
-DROP TABLE mysql.event;
-CREATE TABLE mysql.event like event_like;
-INSERT INTO  mysql.event SELECT * FROM event_like;
-DROP TABLE event_like;
---replace_column 8 # 9 #
-SHOW EVENTS;
-DROP EVENT intact_check;
-#
-# mysql.event intact checking end
-#
 
-#
-#INFORMATION_SCHEMA.EVENTS test begin
-#
-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;
-CREATE DATABASE events_test2;
-CREATE USER ev_test@localhost;
-GRANT ALL ON events_test.* to ev_test@localhost;
-GRANT ALL on events_test2.* to ev_test@localhost;
-REVOKE EVENT ON events_test2.* FROM ev_test@localhost;
-REVOKE PROCESS on *.* from ev_test@localhost;
-#now we are on con1
-connect (ev_con1,localhost,ev_test,,events_test2);
-select "NEW CONNECTION";
-SELECT USER(), DATABASE();
-SHOW GRANTS;
-
---echo "Here comes an error:";
-#NO EVENT_ACL on events_test2
---error 1044
-SHOW EVENTS;
-USE events_test;
-
---echo "Now the list should be empty:";
---replace_column 8 # 9 #
-SHOW EVENTS;
-#now create an event with the same name but we are different user
-select concat("Let's create some new events from the name of ",user());
-create event one_event on schedule every 20 second do select 123;
-create event two_event on schedule every 20 second on completion not preserve comment "two event" do select 123;
-create event three_event on schedule every 20 second on completion preserve comment "three event" do select 123;
-
---echo "Now we should see 3 events:";
---replace_column 8 # 9 #
-SHOW EVENTS;
-
---echo "This should show us only 3 events:";
---replace_column 8 # 9 #
-SHOW FULL EVENTS;
-
---echo "This should show us only 2 events:";
---replace_column 8 # 9 #
-SHOW FULL EVENTS LIKE 't%event';
-
---echo "This should show us no events:";
---replace_column 8 # 9 #
-SHOW FULL EVENTS FROM test LIKE '%';
-#ok, we are back
-connection default;
-DROP DATABASE events_test2;
-
---echo "should see 1 event:";
---replace_column 8 # 9 #
-SHOW EVENTS;
-
---echo "we should see 4 events now:";
---replace_column 8 # 9 #
-SHOW FULL 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;
-
-connection ev_con1;
-drop event one_event;
-drop event two_event;
-drop event three_event;
-disconnect ev_con1;
-connection default;
-drop user ev_test@localhost;
-drop event one_event;
-#
-##INFORMATION_SCHEMA.EVENTS test end
-#
-
---echo "Sleep a bit so the server closes the second connection"
---sleep 2
 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;

--- 1.37/sql/event.cc	2006-02-28 20:32:30 +01:00
+++ 1.38/sql/event.cc	2006-03-01 13:45:54 +01:00
@@ -66,8 +66,13 @@ QUEUE EVEX_EQ_NAME;
 MEM_ROOT evex_mem_root;
 time_t mysql_event_last_create_time= 0L;
 
+TABLE_KEY_FOR_CHECK event_table_keys[4]= {
+  { (char *) STRING_WITH_LEN("\x04\x01\x02")    },
+  { (char *) STRING_WITH_LEN("\x01\x04\x02")    },
+  { NULL, 0}
+};
 
-static TABLE_FIELD_W_TYPE event_table_fields[EVEX_FIELD_COUNT] = {
+TABLE_FIELD_W_TYPE event_table_fields[EVEX_FIELD_COUNT] = {
   {
     {(char *) STRING_WITH_LEN("db")},
     {(char *) STRING_WITH_LEN("char(64)")},
@@ -1457,9 +1462,10 @@ int
 evex_drop_db_events(THD *thd, char *db)
 {
   TABLE *table;
-  READ_RECORD read_record_info;
   int ret= 0;
   uint i;
+  uint key_len= 0;
+  byte *key_buf= NULL;
   LEX_STRING db_lex= {db, strlen(db)};
   
   DBUG_ENTER("evex_drop_db_events");  
@@ -1545,60 +1551,74 @@ skip_memory:
   */
   DBUG_PRINT("info",("Mem-cache checked, now going to db for disabled events"));
   /* only enabled events are in memory, so we go now and delete the rest */
-  init_read_record(&read_record_info, thd, table ,NULL,1,0);
-  while (!(read_record_info.read_record(&read_record_info)) && !ret)
+
+
+  table->file->ha_index_init(1, 1);
+
+  DBUG_ASSERT(db);
+  DBUG_PRINT("info",("Using  `%s` in the prefix", db));
+  table->field[EVEX_FIELD_DB]->store(db, strlen(db), system_charset_info);
+  key_len= table->key_info[1].key_part[0].store_length;
+  
+  if (!(key_buf= (byte *)alloc_root(thd->mem_root, key_len)))
   {
-    char *et_db;
+    ret= 1;
+    goto end;
+  }
+    
+  key_copy(key_buf, table->record[0], table->key_info + 1, key_len);
+  ret= table->file->index_read(table->record[0], key_buf, key_len,
+                               HA_READ_PREFIX);
+  if (ret)
+  {
+    ret= (ret == HA_ERR_END_OF_FILE || ret == HA_ERR_KEY_NOT_FOUND) ? 0 : 1;
+    goto end;
+  }
 
-    if ((et_db= get_field(thd->mem_root, table->field[EVEX_FIELD_DB])) == NULL)
+  while (!ret)
+  {
+    char *ptr;
+      
+    if ((ptr= get_field(thd->mem_root, table->field[EVEX_FIELD_STATUS]))
+         == NullS)
     {
-      ret= 2;
-      break;
+      sql_print_error("Error while loading from mysql.event. "
+                      "Table probably corrupted");
+      goto end;
     }
-    
-    LEX_STRING et_db_lex= {et_db, strlen(et_db)};
-    if (!sortcmp_lex_string(et_db_lex, db_lex, system_charset_info))
+    /*
+      When not running nothing is in memory so we have to clean
+      everything.
+      We don't delete EVENT_ENABLED events when the scheduler is running
+      because maybe this is an event which we asked to drop itself when
+      it is finished and it hasn't finished yet, so we don't touch it.
+      It will drop itself. The not running ENABLED events has been already
+      deleted from ha_delete_row() above in the loop over the QUEUE
+      (in case the executor is running).
+      'D' stands for DISABLED, 'E' for ENABLED - it's an enum
+    */
+    if ((evex_is_running && ptr[0] == 'D') || !evex_is_running)
     {
-      Event_timed ett;
-      char *ptr;
-      
-      if ((ptr= get_field(thd->mem_root, table->field[EVEX_FIELD_STATUS]))
-           == NullS)
+      char *name= get_field(thd->mem_root, table->field[EVEX_FIELD_NAME]);
+
+      if ((ret= table->file->ha_delete_row(table->record[0])))
       {
-        sql_print_error("Error while loading from mysql.event. "
-                        "Table probably corrupted");
+        my_error(ER_EVENT_DROP_FAILED, MYF(0), name);
         goto end;
       }
-      /*
-        When not running nothing is in memory so we have to clean
-        everything.
-        We don't delete EVENT_ENABLED events when the scheduler is running
-        because maybe this is an event which we asked to drop itself when
-        it is finished and it hasn't finished yet, so we don't touch it.
-        It will drop itself. The not running ENABLED events has been already
-        deleted from ha_delete_row() above in the loop over the QUEUE
-        (in case the executor is running).
-        'D' stands for DISABLED, 'E' for ENABLED - it's an enum
-      */
-      if ((evex_is_running && ptr[0] == 'D') || !evex_is_running)
-      {
-        DBUG_PRINT("info", ("Dropping %s.%s", et_db, ett.name.str));
-        if ((ret= table->file->ha_delete_row(table->record[0])))
-        {
-          my_error(ER_EVENT_DROP_FAILED, MYF(0), ett.name.str);
-          goto end;
-        }
-      }
     }
+    table->file->index_next_same(table->record[0], key_buf, key_len);    
   }
-  DBUG_PRINT("info",("Disk checked for disabled events. Finishing."));
+  // ret is guaranteed to be != 0
+  ret= (ret != HA_ERR_END_OF_FILE);
 
+  DBUG_PRINT("info",("Disk checked for disabled events. Finishing."));
 end:
   VOID(pthread_mutex_unlock(&LOCK_evex_running));
   VOID(pthread_mutex_unlock(&LOCK_event_arrays));
-  end_read_record(&read_record_info);
+  table->file->ha_index_end();
 
-  thd->version--;   /* Force close to free memory */
+  thd->version--;  // Force close to free memory
 
   close_thread_tables(thd);
 

--- 1.41/sql/event_executor.cc	2006-03-01 04:21:57 +01:00
+++ 1.42/sql/event_executor.cc	2006-03-01 13:45:54 +01:00
@@ -411,6 +411,7 @@ event_executor_main(void *arg)
   DBUG_ENTER("event_executor_main");
   DBUG_PRINT("event_executor_main", ("EVEX thread started"));
 
+  sql_print_information("SCHEDULER: Starting");
 
   /* init memory root */
   init_alloc_root(&evex_mem_root, MEM_ROOT_BLOCK_SIZE, MEM_ROOT_PREALLOC);
@@ -652,6 +653,7 @@ finish:
 err_no_thd:
   VOID(pthread_mutex_lock(&LOCK_evex_running));
   evex_is_running= false;  
+  event_executor_running_global_var= false;
   VOID(pthread_mutex_unlock(&LOCK_evex_running));
 
   free_root(&evex_mem_root, MYF(0));

--- 1.25/mysql-test/lib/init_db.sql	2006-02-20 17:39:32 +01:00
+++ 1.26/mysql-test/lib/init_db.sql	2006-03-01 13:26:29 +01:00
@@ -635,5 +635,5 @@ CREATE TABLE event (
   UNIQUE KEY db_definer_name(db, definer, name)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
 
-CREATE DATABASE IF NOT EXISTS cluster_replication;
-CREATE TABLE IF NOT EXISTS cluster_replication.binlog_index (Position BIGINT UNSIGNED NOT NULL, File VARCHAR(255) NOT NULL, epoch BIGINT UNSIGNED NOT NULL, inserts BIGINT UNSIGNED NOT NULL, updates BIGINT UNSIGNED NOT NULL, deletes BIGINT UNSIGNED NOT NULL, schemaops BIGINT UNSIGNED NOT NULL, PRIMARY KEY(epoch)) ENGINE=MYISAM;
+CREATE DATABASE IF NOT EXISTS cluster;
+CREATE TABLE IF NOT EXISTS cluster.binlog_index (Position BIGINT UNSIGNED NOT NULL, File VARCHAR(255) NOT NULL, epoch BIGINT UNSIGNED NOT NULL, inserts BIGINT UNSIGNED NOT NULL, updates BIGINT UNSIGNED NOT NULL, deletes BIGINT UNSIGNED NOT NULL, schemaops BIGINT UNSIGNED NOT NULL, PRIMARY KEY(epoch)) ENGINE=MYISAM;

--- 1.41/scripts/mysql_fix_privilege_tables.sql	2006-02-20 17:39:33 +01:00
+++ 1.42/scripts/mysql_fix_privilege_tables.sql	2006-03-01 13:45:54 +01:00
@@ -622,7 +622,7 @@ CREATE TABLE event (
                         'HIGH_NOT_PRECEDENCE'
                     ) DEFAULT '' NOT NULL,
   comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '',
-  PRIMARY KEY  (db,name),
+  PRIMARY KEY  (db,name)
   UNIQUE KEY db_definer_name(db, definer, name)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
 
@@ -631,6 +631,9 @@ CREATE TABLE event (
 # EVENT privilege
 #
 
+SET @hadEventPriv := 0;
+SELECT @hadEventPriv :=1 FROM user WHERE Event_priv LIKE '%';
+
 ALTER TABLE user add Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NOT NULL AFTER Create_user_priv;
 ALTER TABLE db add Event_priv enum('N','Y') character set utf8 DEFAULT 'N' NOT NULL;
 ALTER TABLE event DROP PRIMARY KEY;
@@ -668,6 +671,8 @@ ALTER TABLE event ADD sql_mode
                             'HIGH_NOT_PRECEDENCE'
                             ) DEFAULT '' NOT NULL AFTER on_completion;
 ALTER TABLE event ADD UNIQUE KEY db_definer_name(db, definer, name);
+UPDATE user SET Event_priv=Super_priv WHERE @hadEventPriv = 0;
+
 --
 -- TRIGGER privilege
 --
@@ -681,3 +686,9 @@ ALTER TABLE db   ADD Trigger_priv enum('
 ALTER TABLE tables_priv MODIFY Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') COLLATE utf8_general_ci DEFAULT '' NOT NULL;
 
 UPDATE user SET Trigger_priv=Super_priv WHERE @hadTriggerPriv = 0;
+
+# Activate the new, possible modified privilege tables
+# This should not be needed, but gives us some extra testing that the above
+# changes was correct
+
+flush privileges;

--- 1.39/mysql-test/r/system_mysql_db.result	2006-02-17 20:06:00 +01:00
+++ 1.40/mysql-test/r/system_mysql_db.result	2006-03-01 13:45:54 +01:00
@@ -209,6 +209,7 @@ event	CREATE TABLE `event` (
   `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`)
+  UNIQUE KEY `db_definer_name` (`db`,`definer`,`name`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Events'
 show create table general_log;
 Table	Create Table

--- 1.38/scripts/mysql_create_system_tables.sh	2006-02-20 17:39:33 +01:00
+++ 1.39/scripts/mysql_create_system_tables.sh	2006-03-01 13:26:29 +01:00
@@ -875,8 +875,8 @@ $c_pp
 $c_gl
 $c_sl
 $c_ev
-CREATE DATABASE IF NOT EXISTS cluster_replication;
-CREATE TABLE IF NOT EXISTS cluster_replication.binlog_index (Position BIGINT UNSIGNED NOT NULL, File VARCHAR(255) NOT NULL, epoch BIGINT UNSIGNED NOT NULL, inserts BIGINT UNSIGNED NOT NULL, updates BIGINT UNSIGNED NOT NULL, deletes BIGINT UNSIGNED NOT NULL, schemaops BIGINT UNSIGNED NOT NULL, PRIMARY KEY(epoch)) ENGINE=MYISAM;
+CREATE DATABASE IF NOT EXISTS cluster;
+CREATE TABLE IF NOT EXISTS cluster.binlog_index (Position BIGINT UNSIGNED NOT NULL, File VARCHAR(255) NOT NULL, epoch BIGINT UNSIGNED NOT NULL, inserts BIGINT UNSIGNED NOT NULL, updates BIGINT UNSIGNED NOT NULL, deletes BIGINT UNSIGNED NOT NULL, schemaops BIGINT UNSIGNED NOT NULL, PRIMARY KEY(epoch)) ENGINE=MYISAM;
 
 END_OF_DATA
 
Thread
bk commit into 5.1 tree (andrey:1.2215)ahristov1 Mar