diff options
author | unknown <jimw@mysql.com> | 2005-05-18 13:54:36 -0700 |
---|---|---|
committer | unknown <jimw@mysql.com> | 2005-05-18 13:54:36 -0700 |
commit | 2de8a4bc8c821d096550ba5388c6b2dfccb4263e (patch) | |
tree | da99bea4ccdeb25dbb92040037cff2c59bb9aacb | |
parent | f8a20dbeb6d53fc5d993e088c245e4f2f9b085c5 (diff) | |
parent | 9e8cad1d5a87c681b48266c96f2e1ea98052b40a (diff) | |
download | mariadb-git-2de8a4bc8c821d096550ba5388c6b2dfccb4263e.tar.gz |
Resolve merge from 4.1
mysql-test/r/grant_cache.result:
Auto merged
mysql-test/r/merge.result:
Auto merged
mysql-test/t/grant_cache.test:
Auto merged
mysql-test/t/merge.test:
Auto merged
sql/ha_myisammrg.h:
Auto merged
sql/sql_insert.cc:
Auto merged
sql/handler.h:
Resolve merge
sql/table.cc:
Resolve merge
-rw-r--r-- | mysql-test/r/grant_cache.result | 2 | ||||
-rw-r--r-- | mysql-test/r/merge.result | 10 | ||||
-rw-r--r-- | mysql-test/t/grant_cache-master.opt | 1 | ||||
-rw-r--r-- | mysql-test/t/grant_cache.test | 4 | ||||
-rw-r--r-- | mysql-test/t/merge.test | 12 | ||||
-rw-r--r-- | sql/ha_myisammrg.h | 2 | ||||
-rw-r--r-- | sql/handler.h | 1 | ||||
-rw-r--r-- | sql/sql_insert.cc | 2 | ||||
-rw-r--r-- | sql/table.cc | 9 |
9 files changed, 38 insertions, 5 deletions
diff --git a/mysql-test/r/grant_cache.result b/mysql-test/r/grant_cache.result index 2a1170ee751..925a5918c1b 100644 --- a/mysql-test/r/grant_cache.result +++ b/mysql-test/r/grant_cache.result @@ -1,5 +1,6 @@ drop table if exists test.t1,mysqltest.t1,mysqltest.t2; drop database if exists mysqltest; +set GLOBAL query_cache_size=1355776; reset query cache; flush status; show grants for current_user; @@ -206,3 +207,4 @@ delete from mysql.columns_priv where user in ("mysqltest_1","mysqltest_2","mysql flush privileges; drop table test.t1,mysqltest.t1,mysqltest.t2; drop database mysqltest; +set GLOBAL query_cache_size=default; diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 295ec80cd54..d4e19201173 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -683,3 +683,13 @@ t3 1 a 1 a A NULL NULL NULL YES BTREE t3 1 a 2 b A NULL NULL NULL YES BTREE t3 1 a 3 c A NULL NULL NULL YES BTREE drop table t1, t2, t3; +CREATE TABLE t1 ( a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10), UNIQUE (b) ) +ENGINE=MyISAM; +CREATE TABLE t2 ( a INT AUTO_INCREMENT, b VARCHAR(10), INDEX (a), INDEX (b) ) +ENGINE=MERGE UNION (t1) INSERT_METHOD=FIRST; +INSERT INTO t2 (b) VALUES (1) ON DUPLICATE KEY UPDATE b=2; +INSERT INTO t2 (b) VALUES (1) ON DUPLICATE KEY UPDATE b=3; +SELECT b FROM t2; +b +3 +DROP TABLE t1, t2; diff --git a/mysql-test/t/grant_cache-master.opt b/mysql-test/t/grant_cache-master.opt deleted file mode 100644 index cfdce628e74..00000000000 --- a/mysql-test/t/grant_cache-master.opt +++ /dev/null @@ -1 +0,0 @@ ---set-variable=query_cache_size=1355776 diff --git a/mysql-test/t/grant_cache.test b/mysql-test/t/grant_cache.test index 1e24d5c9c03..f4423a68717 100644 --- a/mysql-test/t/grant_cache.test +++ b/mysql-test/t/grant_cache.test @@ -10,6 +10,8 @@ drop table if exists test.t1,mysqltest.t1,mysqltest.t2; drop database if exists mysqltest; --enable_warnings +set GLOBAL query_cache_size=1355776; + reset query cache; flush status; connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); @@ -145,3 +147,5 @@ delete from mysql.columns_priv where user in ("mysqltest_1","mysqltest_2","mysql flush privileges; drop table test.t1,mysqltest.t1,mysqltest.t2; drop database mysqltest; + +set GLOBAL query_cache_size=default; diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test index 4c8d7cc1b74..165c16823a2 100644 --- a/mysql-test/t/merge.test +++ b/mysql-test/t/merge.test @@ -308,3 +308,15 @@ show index from t3; drop table t1, t2, t3; +# +# Bug#10400 - Improperly-defined MERGE table crashes with INSERT ... ON DUPLICATE KEY UPDATE +# +CREATE TABLE t1 ( a INT AUTO_INCREMENT PRIMARY KEY, b VARCHAR(10), UNIQUE (b) ) + ENGINE=MyISAM; +CREATE TABLE t2 ( a INT AUTO_INCREMENT, b VARCHAR(10), INDEX (a), INDEX (b) ) + ENGINE=MERGE UNION (t1) INSERT_METHOD=FIRST; +INSERT INTO t2 (b) VALUES (1) ON DUPLICATE KEY UPDATE b=2; +INSERT INTO t2 (b) VALUES (1) ON DUPLICATE KEY UPDATE b=3; +SELECT b FROM t2; +DROP TABLE t1, t2; + diff --git a/sql/ha_myisammrg.h b/sql/ha_myisammrg.h index 3bc9c11d4be..7348096b695 100644 --- a/sql/ha_myisammrg.h +++ b/sql/ha_myisammrg.h @@ -37,7 +37,7 @@ class ha_myisammrg: public handler { return (HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY | HA_READ_RND_SAME | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_FILE_BASED | - HA_CAN_INSERT_DELAYED); + HA_CAN_INSERT_DELAYED | HA_ANY_INDEX_MAY_BE_UNIQUE); } ulong index_flags(uint inx, uint part, bool all_parts) const { diff --git a/sql/handler.h b/sql/handler.h index a530406356e..3b0b9afe320 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -87,6 +87,7 @@ #define HA_NO_VARCHAR (1 << 27) #define HA_CAN_BIT_FIELD (1 << 28) /* supports bit fields */ #define HA_NEED_READ_RANGE_BUFFER (1 << 29) /* for read_multi_range */ +#define HA_ANY_INDEX_MAY_BE_UNIQUE (1 << 30) /* bits in index_flags(index_number) for what you can do with index */ diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 849c00a6043..2eeb23f97c4 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -948,7 +948,7 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info) err: if (key) - my_afree(key); + my_safe_afree(key,table->max_unique_length,MAX_KEY_LENGTH); info->last_errno= error; table->file->print_error(error,MYF(0)); DBUG_RETURN(1); diff --git a/sql/table.cc b/sql/table.cc index 82a8afd826b..d3ba4056571 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -739,8 +739,13 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, set_if_bigger(share->max_key_length,keyinfo->key_length+ keyinfo->key_parts); share->total_key_length+= keyinfo->key_length; - if (keyinfo->flags & HA_NOSAME) - set_if_bigger(share->max_unique_length, keyinfo->key_length); + /* + MERGE tables do not have unique indexes. But every key could be + an unique index on the underlying MyISAM table. (Bug #10400) + */ + if ((keyinfo->flags & HA_NOSAME) || + (ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE)) + set_if_bigger(share->max_unique_length,keyinfo->key_length); } if (primary_key < MAX_KEY && (share->keys_in_use.is_set(primary_key))) |