From ca88ca16d09004430bfff91f188a94c4967a4a5a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 11 May 2006 21:15:37 +0500 Subject: [PATCH 1/2] BUG#12873 - BTREE index on MEMORY table with multiple NULL values doesn't work properly Unique BTREE index on MEMORY table refuse multiple NULL values. Fixed search_flag to allow multiple null values inside unique key. heap/hp_write.c: Fixed search_flag to allow multiple null values inside unique key. mysql-test/r/heap_btree.result: Testcase for BUG#12873. mysql-test/t/heap_btree.test: Testcase for BUG#12873. --- heap/hp_write.c | 2 +- mysql-test/r/heap_btree.result | 3 +++ mysql-test/t/heap_btree.test | 8 ++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/heap/hp_write.c b/heap/hp_write.c index a60d32eecb6..bc94e3bfae4 100644 --- a/heap/hp_write.c +++ b/heap/hp_write.c @@ -105,7 +105,7 @@ int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record, custom_arg.key_length= hp_rb_make_key(keyinfo, info->recbuf, record, recpos); if (keyinfo->flag & HA_NOSAME) { - custom_arg.search_flag= SEARCH_FIND | SEARCH_SAME | SEARCH_UPDATE; + custom_arg.search_flag= SEARCH_FIND | SEARCH_UPDATE; keyinfo->rb_tree.flag= TREE_NO_DUPS; } else diff --git a/mysql-test/r/heap_btree.result b/mysql-test/r/heap_btree.result index b63eaf7e48c..4b05e8f44e1 100644 --- a/mysql-test/r/heap_btree.result +++ b/mysql-test/r/heap_btree.result @@ -256,3 +256,6 @@ SELECT INDEX_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() INDEX_LENGTH 21 DROP TABLE t1; +CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY; +INSERT INTO t1 VALUES(NULL),(NULL); +DROP TABLE t1; diff --git a/mysql-test/t/heap_btree.test b/mysql-test/t/heap_btree.test index f1b9d290885..fb715fccefe 100644 --- a/mysql-test/t/heap_btree.test +++ b/mysql-test/t/heap_btree.test @@ -176,4 +176,12 @@ UPDATE t1 SET val=1; SELECT INDEX_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='t1'; DROP TABLE t1; +# +# BUG#12873 - BTREE index on MEMORY table with multiple NULL values doesn't +# work properly +# +CREATE TABLE t1 (a INT, UNIQUE USING BTREE(a)) ENGINE=MEMORY; +INSERT INTO t1 VALUES(NULL),(NULL); +DROP TABLE t1; + # End of 4.1 tests From 7f20ecc7ec8714a473d644784efb7ca3a276b99f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 May 2006 18:37:23 +0500 Subject: [PATCH 2/2] BUG#17001 - Table and server crash on ALTER TABLE frm and data files for tables created by earlier MySQL versions becomes out of sync after certain ALTER TABLE statements: - One that changes column default value; - One that changes table comment; - One that changes table password. As a result one can expirience either server crash or data corruption/loss. This fix ensures that running ALTER TABLE on tables created by earlier MySQL versions recreates data files. sql/sql_table.cc: Ensure that running ALTER TABLE on tables created by earlier MySQL versions recreates data files. --- sql/sql_table.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index cb556acd5c7..80bddfca9f1 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3197,7 +3197,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, uint db_create_options, used_fields; enum db_type old_db_type,new_db_type; bool need_copy_table; - bool no_table_reopen= FALSE; + bool no_table_reopen= FALSE, varchar= FALSE; DBUG_ENTER("mysql_alter_table"); thd->proc_info="init"; @@ -3399,6 +3399,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, Field **f_ptr,*field; for (f_ptr=table->field ; (field= *f_ptr) ; f_ptr++) { + if (field->type() == MYSQL_TYPE_STRING) + varchar= TRUE; /* Check if field should be dropped */ Alter_drop *drop; drop_it.rewind(); @@ -3660,12 +3662,18 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, better have a negative test here, instead of positive, like alter_info->flags & ALTER_ADD_COLUMN|ALTER_ADD_INDEX|... so that ALTER TABLE won't break when somebody will add new flag + + MySQL uses frm version to determine the type of the data fields and + their layout. See Field_string::type() for details. + Thus, if the table is too old we may have to rebuild the data to + update the layout. */ need_copy_table= (alter_info->flags & ~(ALTER_CHANGE_COLUMN_DEFAULT|ALTER_OPTIONS) || (create_info->used_fields & ~(HA_CREATE_USED_COMMENT|HA_CREATE_USED_PASSWORD)) || - table->s->tmp_table); + table->s->tmp_table || + (table->s->frm_version < FRM_VER_TRUE_VARCHAR && varchar)); create_info->frm_only= !need_copy_table; /*