From b8227de1bfb491eb42c6aa9aa06315a4e51c27fb Mon Sep 17 00:00:00 2001 From: "mikael@c-870ae253.1238-1-64736c10.cust.bredbandsbolaget.se" <> Date: Mon, 8 May 2006 21:41:10 -0400 Subject: [PATCH] BUG#19140: Create index caused crash --- mysql-test/r/ndb_partition_key.result | 4 ++++ mysql-test/r/partition.result | 5 +++++ mysql-test/t/ndb_partition_key.test | 7 +++++++ mysql-test/t/partition.test | 14 ++++++++++++++ sql/sql_partition.cc | 4 ++-- sql/sql_table.cc | 10 ++++++++-- 6 files changed, 40 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/ndb_partition_key.result b/mysql-test/r/ndb_partition_key.result index 503283df532..6654afbcd26 100644 --- a/mysql-test/r/ndb_partition_key.result +++ b/mysql-test/r/ndb_partition_key.result @@ -197,3 +197,7 @@ ENGINE=NDB PARTITION BY KEY(c3); ALTER TABLE t1 ADD COLUMN c4 INT AFTER c1; DROP TABLE t1; +CREATE TABLE t1 (a int) +PARTITION BY KEY(a) +(PARTITION p0 ENGINE = NDB); +DROP TABLE t1; diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index 0da071374ea..28b99056758 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -886,4 +886,9 @@ s1 2 3 drop table t1; +create table t1 (a int) engine=memory +partition by key(a); +insert into t1 values (1); +create index inx1 on t1(a); +drop table t1; End of 5.1 tests diff --git a/mysql-test/t/ndb_partition_key.test b/mysql-test/t/ndb_partition_key.test index ce939663ab8..bf7e54d1b2c 100644 --- a/mysql-test/t/ndb_partition_key.test +++ b/mysql-test/t/ndb_partition_key.test @@ -196,3 +196,10 @@ CREATE TABLE t1 ( ALTER TABLE t1 ADD COLUMN c4 INT AFTER c1; DROP TABLE t1; + +CREATE TABLE t1 (a int) +PARTITION BY KEY(a) +(PARTITION p0 ENGINE = NDB); +DROP TABLE t1; + + diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index 272cdc27af6..a10c3d6c089 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -9,6 +9,11 @@ drop table if exists t1; --enable_warnings +create table t1 (a int) +partition by key(a) +(partition p0 engine = MEMORY); +drop table t1; + # # Partition by key no partition defined => OK # @@ -1009,4 +1014,13 @@ select auto_increment from information_schema.tables where table_name='t1'; select * from t1; drop table t1; +# +# BUG 19140 Partitions: Create index for partitioned table crashes +# +create table t1 (a int) engine=memory +partition by key(a); +insert into t1 values (1); +create index inx1 on t1(a); +drop table t1; + --echo End of 5.1 tests diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 0442ad724d2..a327d49c641 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -4509,7 +4509,7 @@ the generated partition syntax in a correct manner. if (alter_info->flags & ALTER_REMOVE_PARTITIONING) { DBUG_PRINT("info", ("Remove partitioning")); - if (!(thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE)) + if (!(create_info->used_fields & HA_CREATE_USED_ENGINE)) { DBUG_PRINT("info", ("No explicit engine used")); create_info->db_type= table->part_info->default_engine_type; @@ -4526,7 +4526,7 @@ the generated partition syntax in a correct manner. beneath. */ thd->work_part_info= table->part_info; - if (thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE && + if (create_info->used_fields & HA_CREATE_USED_ENGINE && create_info->db_type != table->part_info->default_engine_type) { /* diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 412682fc3b0..8f5994fc3ee 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3105,8 +3105,8 @@ bool mysql_create_table_internal(THD *thd, } DBUG_PRINT("info", ("db_type = %d", ha_legacy_type(part_info->default_engine_type))); - if (part_info->check_partition_info( &engine_type, file, - create_info->max_rows)) + if (part_info->check_partition_info(&engine_type, file, + create_info->max_rows)) goto err; part_info->default_engine_type= engine_type; @@ -3165,6 +3165,12 @@ bool mysql_create_table_internal(THD *thd, } else if (create_info->db_type != engine_type) { + /* + We come here when we don't use a partitioned handler. + Since we use a partitioned table it must be "native partitioned". + We have switched engine from defaults, most likely only specified + engines in partition clauses. + */ delete file; if (!(file= get_new_handler((TABLE_SHARE*) 0, thd->mem_root, engine_type))) {