From fe784fac00494c1d48f0c245d0d4c23bfb717680 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Oct 2007 22:04:09 +0200 Subject: Bug #30695: An apostrophe ' in the comment of the ADD PARTITION causes the Server to crash. Accessing partitioned table with an apostrophe in partition options like DATA DIRECTORY, INDEX DIRECTORY or COMMENT causes server crash. Partition options were saved in .frm file without escaping. When accessing such table it is not possible to properly restore partition information. Crashed because there was no check for partition info parser failure. Fixed by escaping quoted text in the partition info when writing it to the frm-file and added a check that it was able to parse the partition info before using it NOTE: If the comment is written by an earlier version of the server, the corrupted frm-file is not fixed, but left corrupted, you have to manually drop the table and recreate it. mysql-test/r/partition.result: bug #30695: An apostrophe ' in the comment of the ADD PARTITION causes the Server to crash. testresult mysql-test/t/partition.test: bug #30695: An apostrophe ' in the comment of the ADD PARTITION causes the Server to crash. testcase sql/sql_partition.cc: Bug #30695: An apostrophe ' in the comment of the ADD PARTITION causes the Server to crash. Crashes when there is an non escaped apostrophe in the partition options fixed by escaping quoted text before writing to the frm-file sql/table.cc: Bug #30695 An apostrophe ' in the comment of the ADD PARTITION causes the Server to crash problem was using a null poiter without check -> crash. added a check that the previus call succeded --- sql/table.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sql/table.cc') diff --git a/sql/table.cc b/sql/table.cc index ccddbf8134b..7cf5eeaaad6 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1782,7 +1782,8 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias, outparam, is_create_table, share->default_part_db_type, &work_part_info_used); - outparam->part_info->is_auto_partitioned= share->auto_partitioned; + if (!tmp) + outparam->part_info->is_auto_partitioned= share->auto_partitioned; DBUG_PRINT("info", ("autopartitioned: %u", share->auto_partitioned)); /* we should perform the fix_partition_func in either local or caller's arena depending on work_part_info_used value -- cgit v1.2.1 From e5b2745efc9451081c56b7a6b2f4cdfcc6dfb280 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 5 Nov 2007 16:25:40 +0100 Subject: 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: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Added test result mysql-test/t/partition_hash.test: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Added test sql/event_scheduler.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/events.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/ha_ndbcluster_binlog.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/slave.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/sql_acl.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/sql_base.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Asserted that lex is initialized in open_table(). sql/sql_connect.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/sql_insert.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Added initialization for thd->lex before open table. sql/sql_lex.cc: 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: 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: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/sql_servers.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/sql_udf.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). sql/table.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Asserted that lex is initialized in open_table_from_share(). sql/tztime.cc: Bug#31210 - INSERT DELAYED crashes server when used on partitioned table Initialized lex for later use in open_table(). --- sql/table.cc | 3 +++ 1 file changed, 3 insertions(+) (limited to 'sql/table.cc') diff --git a/sql/table.cc b/sql/table.cc index ccddbf8134b..26008f0aa19 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1608,6 +1608,9 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias, 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; -- cgit v1.2.1