List:Commits« Previous MessageNext Message »
From:Ingo Struewing Date:November 5 2007 3:25pm
Subject:bk commit into 5.1 tree (istruewing:1.2571) BUG#31210
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of istruewing. When istruewing 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@stripped, 2007-11-05 16:25:40+01:00, istruewing@stripped +17 -0
  Bug#31210 - INSERT DELAYED crashes server when used on
              partitioned table
  
  Trying INSERT DELAYED on a partitioned table, that has not been
  used right before, crashes the server. When a table is used for
  select or update, it is kept open for some time. This period I
  mean with "right before".
  
  Information about partitioning of a table is stored in form of
  a string in the .frm file. Parsing of this string requires a
  correctly set up lexical analyzer (lex). The partitioning code
  uses a new temporary instance of a lex. But it does still refer
  to the previously active lex. The delayd insert thread does not
  initialize its lex though...
  
  Added initialization for thd->lex before open table in the delayed
  thread and at all other places where it is necessary to call
  lex_start() if all tables would be partitioned and need to parse
  the .frm file.

  mysql-test/r/partition_hash.result@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +4 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Added test result

  mysql-test/t/partition_hash.test@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +8 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Added test

  sql/event_scheduler.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/events.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/ha_ndbcluster_binlog.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/slave.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/sql_acl.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +2 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/sql_base.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +3 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Asserted that lex is initialized in open_table().

  sql/sql_connect.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/sql_insert.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +6 -1
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Added initialization for thd->lex before open table.

  sql/sql_lex.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +2 -1
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Added 'is_lex_started' to test if lex is initialized.

  sql/sql_lex.h@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Added 'is_lex_started' to test if lex is initialized.

  sql/sql_plugin.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/sql_servers.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/sql_udf.cc@stripped, 2007-11-05 16:25:38+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

  sql/table.cc@stripped, 2007-11-05 16:25:39+01:00, istruewing@stripped +3 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Asserted that lex is initialized in open_table_from_share().

  sql/tztime.cc@stripped, 2007-11-05 16:25:39+01:00, istruewing@stripped +1 -0
    Bug#31210 - INSERT DELAYED crashes server when used on
                partitioned table
    Initialized lex for later use in open_table().

diff -Nrup a/mysql-test/r/partition_hash.result b/mysql-test/r/partition_hash.result
--- a/mysql-test/r/partition_hash.result	2007-04-04 16:26:24 +02:00
+++ b/mysql-test/r/partition_hash.result	2007-11-05 16:25:38 +01:00
@@ -183,3 +183,7 @@ c1	c2	c3
 182	abc	2002-11-09
 184	abc	2002-11-22
 drop table t1;
+CREATE TABLE t1 (c1 INT) ENGINE=MyISAM PARTITION BY HASH(c1) PARTITIONS 1;
+INSERT DELAYED INTO t1 VALUES (1);
+ERROR HY000: Table storage engine for 't1' doesn't have this option
+DROP TABLE t1;
diff -Nrup a/mysql-test/t/partition_hash.test b/mysql-test/t/partition_hash.test
--- a/mysql-test/t/partition_hash.test	2007-07-02 18:08:23 +02:00
+++ b/mysql-test/t/partition_hash.test	2007-11-05 16:25:38 +01:00
@@ -144,3 +144,11 @@ select * from t1 where c3 between '2002-
 
 drop table t1;
 
+#
+# Bug#31210 - INSERT DELAYED crashes server when used on partitioned table
+#
+CREATE TABLE t1 (c1 INT) ENGINE=MyISAM PARTITION BY HASH(c1) PARTITIONS 1;
+--error ER_ILLEGAL_HA
+INSERT DELAYED INTO t1 VALUES (1);
+DROP TABLE t1;
+
diff -Nrup a/sql/event_scheduler.cc b/sql/event_scheduler.cc
--- a/sql/event_scheduler.cc	2007-08-15 17:08:40 +02:00
+++ b/sql/event_scheduler.cc	2007-11-05 16:25:38 +01:00
@@ -127,6 +127,7 @@ post_init_event_thread(THD *thd)
     thd->cleanup();
     return TRUE;
   }
+  lex_start(thd);
 
   pthread_mutex_lock(&LOCK_thread_count);
   threads.append(thd);
diff -Nrup a/sql/events.cc b/sql/events.cc
--- a/sql/events.cc	2007-08-15 17:08:40 +02:00
+++ b/sql/events.cc	2007-11-05 16:25:38 +01:00
@@ -884,6 +884,7 @@ Events::init(my_bool opt_noacl)
   */
   thd->thread_stack= (char*) &thd;
   thd->store_globals();
+  lex_start(thd);
 
   /*
     We will need Event_db_repository anyway, even if the scheduler is
diff -Nrup a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc
--- a/sql/ha_ndbcluster_binlog.cc	2007-09-07 11:15:04 +02:00
+++ b/sql/ha_ndbcluster_binlog.cc	2007-11-05 16:25:38 +01:00
@@ -3621,6 +3621,7 @@ pthread_handler_t ndb_binlog_thread_func
     pthread_exit(0);
     DBUG_RETURN(NULL);
   }
+  lex_start(thd);
 
   thd->init_for_queries();
   thd->command= COM_DAEMON;
diff -Nrup a/sql/slave.cc b/sql/slave.cc
--- a/sql/slave.cc	2007-08-29 23:28:34 +02:00
+++ b/sql/slave.cc	2007-11-05 16:25:38 +01:00
@@ -1510,6 +1510,7 @@ static int init_slave_thread(THD* thd, S
     delete thd;
     DBUG_RETURN(-1);
   }
+  lex_start(thd);
 
   if (thd_type == SLAVE_THD_SQL)
     thd->proc_info= "Waiting for the next event in relay log";
diff -Nrup a/sql/sql_acl.cc b/sql/sql_acl.cc
--- a/sql/sql_acl.cc	2007-08-13 15:11:13 +02:00
+++ b/sql/sql_acl.cc	2007-11-05 16:25:38 +01:00
@@ -277,6 +277,7 @@ my_bool acl_init(bool dont_read_acl_tabl
     DBUG_RETURN(1); /* purecov: inspected */
   thd->thread_stack= (char*) &thd;
   thd->store_globals();
+  lex_start(thd);
   /*
     It is safe to call acl_reload() since acl_* arrays and hashes which
     will be freed there are global static objects and thus are initialized
@@ -3493,6 +3494,7 @@ my_bool grant_init()
     DBUG_RETURN(1);				/* purecov: deadcode */
   thd->thread_stack= (char*) &thd;
   thd->store_globals();
+  lex_start(thd);
   return_val=  grant_reload(thd);
   delete thd;
   /* Remember that we don't have a THD */
diff -Nrup a/sql/sql_base.cc b/sql/sql_base.cc
--- a/sql/sql_base.cc	2007-09-14 19:29:17 +02:00
+++ b/sql/sql_base.cc	2007-11-05 16:25:38 +01:00
@@ -2248,6 +2248,9 @@ TABLE *open_table(THD *thd, TABLE_LIST *
   HASH_SEARCH_STATE state;
   DBUG_ENTER("open_table");
 
+  /* Parsing of partitioning information from .frm needs thd->lex set up. */
+  DBUG_ASSERT(thd->lex->is_lex_started);
+
   /* find a unused table in the open table cache */
   if (refresh)
     *refresh=0;
diff -Nrup a/sql/sql_connect.cc b/sql/sql_connect.cc
--- a/sql/sql_connect.cc	2007-08-27 22:31:26 +02:00
+++ b/sql/sql_connect.cc	2007-11-05 16:25:38 +01:00
@@ -1087,6 +1087,7 @@ pthread_handler_t handle_one_connection(
   {
     NET *net= &thd->net;
 
+    lex_start(thd);
     if (login_connection(thd))
       goto end_thread;
 
diff -Nrup a/sql/sql_insert.cc b/sql/sql_insert.cc
--- a/sql/sql_insert.cc	2007-08-31 01:05:45 +02:00
+++ b/sql/sql_insert.cc	2007-11-05 16:25:38 +01:00
@@ -2264,7 +2264,12 @@ pthread_handler_t handle_delayed_insert(
     goto err;
   }
 
-  /* open table */
+  /*
+    Open table requires an initialized lex in case the table is
+    partitioned. The .frm file contains a partial SQL string which is
+    parsed using a lex, that depends on initialized thd->lex.
+  */
+  lex_start(thd);
   if (!(di->table=open_ltable(thd, &di->table_list, TL_WRITE_DELAYED, 0)))
   {
     thd->fatal_error();				// Abort waiting inserts
diff -Nrup a/sql/sql_lex.cc b/sql/sql_lex.cc
--- a/sql/sql_lex.cc	2007-09-19 17:02:56 +02:00
+++ b/sql/sql_lex.cc	2007-11-05 16:25:38 +01:00
@@ -362,6 +362,7 @@ void lex_start(THD *thd)
   lex->server_options.owner= 0;
   lex->server_options.port= -1;
 
+  lex->is_lex_started= TRUE;
   DBUG_VOID_RETURN;
 }
 
@@ -2138,7 +2139,7 @@ void Query_tables_list::destroy_query_ta
 
 st_lex::st_lex()
   :result(0), yacc_yyss(0), yacc_yyvs(0),
-   sql_command(SQLCOM_END), option_type(OPT_DEFAULT)
+   sql_command(SQLCOM_END), option_type(OPT_DEFAULT), is_lex_started(0)
 {
 
   my_init_dynamic_array2(&plugins, sizeof(plugin_ref),
diff -Nrup a/sql/sql_lex.h b/sql/sql_lex.h
--- a/sql/sql_lex.h	2007-09-12 21:44:47 +02:00
+++ b/sql/sql_lex.h	2007-11-05 16:25:38 +01:00
@@ -1703,6 +1703,7 @@ typedef struct st_lex : public Query_tab
   st_alter_tablespace *alter_tablespace_info;
   
   bool escape_used;
+  bool is_lex_started; /* If lex_start() did run. For debugging. */
 
   st_lex();
 
diff -Nrup a/sql/sql_plugin.cc b/sql/sql_plugin.cc
--- a/sql/sql_plugin.cc	2007-10-05 02:34:23 +02:00
+++ b/sql/sql_plugin.cc	2007-11-05 16:25:38 +01:00
@@ -1329,6 +1329,7 @@ static void plugin_load(MEM_ROOT *tmp_ro
   }
   new_thd->thread_stack= (char*) &tables;
   new_thd->store_globals();
+  lex_start(new_thd);
   new_thd->db= my_strdup("mysql", MYF(0));
   new_thd->db_length= 5;
   bzero((uchar*)&tables, sizeof(tables));
diff -Nrup a/sql/sql_servers.cc b/sql/sql_servers.cc
--- a/sql/sql_servers.cc	2007-08-13 15:11:14 +02:00
+++ b/sql/sql_servers.cc	2007-11-05 16:25:38 +01:00
@@ -140,6 +140,7 @@ bool servers_init(bool dont_read_servers
     DBUG_RETURN(TRUE);
   thd->thread_stack= (char*) &thd;
   thd->store_globals();
+  lex_start(thd);
   /*
     It is safe to call servers_reload() since servers_* arrays and hashes which
     will be freed there are global static objects and thus are initialized
diff -Nrup a/sql/sql_udf.cc b/sql/sql_udf.cc
--- a/sql/sql_udf.cc	2007-08-13 15:11:14 +02:00
+++ b/sql/sql_udf.cc	2007-11-05 16:25:38 +01:00
@@ -135,6 +135,7 @@ void udf_init()
   initialized = 1;
   new_thd->thread_stack= (char*) &new_thd;
   new_thd->store_globals();
+  lex_start(new_thd);
   new_thd->set_db(db, sizeof(db)-1);
 
   bzero((uchar*) &tables,sizeof(tables));
diff -Nrup a/sql/table.cc b/sql/table.cc
--- a/sql/table.cc	2007-08-31 11:55:53 +02:00
+++ b/sql/table.cc	2007-11-05 16:25:39 +01:00
@@ -1608,6 +1608,9 @@ int open_table_from_share(THD *thd, TABL
   DBUG_PRINT("enter",("name: '%s.%s'  form: 0x%lx", share->db.str,
                       share->table_name.str, (long) outparam));
 
+  /* Parsing of partitioning information from .frm needs thd->lex set up. */
+  DBUG_ASSERT(thd->lex->is_lex_started);
+
   error= 1;
   bzero((char*) outparam, sizeof(*outparam));
   outparam->in_use= thd;
diff -Nrup a/sql/tztime.cc b/sql/tztime.cc
--- a/sql/tztime.cc	2007-08-13 15:11:14 +02:00
+++ b/sql/tztime.cc	2007-11-05 16:25:39 +01:00
@@ -1575,6 +1575,7 @@ my_tz_init(THD *org_thd, const char *def
     DBUG_RETURN(1);
   thd->thread_stack= (char*) &thd;
   thd->store_globals();
+  lex_start(thd);
 
   /* Init all memory structures that require explicit destruction */
   if (hash_init(&tz_names, &my_charset_latin1, 20,
Thread
bk commit into 5.1 tree (istruewing:1.2571) BUG#31210Ingo Struewing5 Nov
  • Re: bk commit into 5.1 tree (istruewing:1.2571) BUG#31210Mattias Jonsson9 Nov
    • Re: bk commit into 5.1 tree (istruewing:1.2571) BUG#31210Ingo Strüwing9 Nov
  • Re: bk commit into 5.1 tree (istruewing:1.2571) BUG#31210Konstantin Osipov12 Nov
    • Re: bk commit into 5.1 tree (istruewing:1.2571) BUG#31210Ingo Strüwing12 Nov