diff options
author | unknown <monty@mysql.com> | 2004-03-26 14:44:52 +0200 |
---|---|---|
committer | unknown <monty@mysql.com> | 2004-03-26 14:44:52 +0200 |
commit | cc11f6f351e8056dabf47cf47f8a29aa3b6261a2 (patch) | |
tree | 5a81f759a80325c592c9d532356639e7dd272728 | |
parent | 922818a79809d789976e64a8b4faabd305863a7c (diff) | |
download | mariadb-git-cc11f6f351e8056dabf47cf47f8a29aa3b6261a2.tar.gz |
Allow keys with 0 segements in MyISAM
This fixed a bug in SELECT DISTINCT when all selected parts where constants. (Bug #3203)
myisam/mi_create.c:
Allow keys with 0 segements.
mysql-test/r/myisam.result:
Test for problem with SELECT DISTINCT
mysql-test/t/myisam.test:
Test for problem with SELECT DISTINCT
-rw-r--r-- | myisam/mi_create.c | 8 | ||||
-rw-r--r-- | mysql-test/r/myisam.result | 22 | ||||
-rw-r--r-- | mysql-test/t/myisam.test | 14 |
3 files changed, 43 insertions, 1 deletions
diff --git a/myisam/mi_create.c b/myisam/mi_create.c index 9f39c6f522e..328450c70db 100644 --- a/myisam/mi_create.c +++ b/myisam/mi_create.c @@ -366,7 +366,13 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, my_errno=HA_WRONG_CREATE_OPTION; goto err; } - if ((keydef->flag & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME) + /* + key_segs may be 0 in the case when we only want to be able to + add on row into the table. This can happen with some DISTINCT queries + in MySQL + */ + if ((keydef->flag & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME && + key_segs) share.state.rec_per_key_part[key_segs-1]=1L; length+=key_length; keydef->block_length= MI_BLOCK_SIZE(length,pointer,MI_MAX_KEYPTR_SIZE); diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index cc541388a5c..1fd64377f12 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -431,3 +431,25 @@ a concat(b,'.') 1 a. 3 a . drop table t1; +create table t1 (a int not null); +create table t2 (a int not null, primary key (a)); +insert into t1 values (1); +insert into t2 values (1),(2); +select sql_big_result distinct t1.a from t1,t2 order by t2.a; +a +1 +select distinct t1.a from t1,t2 order by t2.a; +a +1 +select sql_big_result distinct t1.a from t1,t2; +a +1 +explain select sql_big_result distinct t1.a from t1,t2 order by t2.a; +table type possible_keys key key_len ref rows Extra +t1 system NULL NULL NULL NULL 1 Using temporary +t2 index NULL PRIMARY 4 NULL 2 Using index; Distinct +explain select distinct t1.a from t1,t2 order by t2.a; +table type possible_keys key key_len ref rows Extra +t1 system NULL NULL NULL NULL 1 Using temporary +t2 index NULL PRIMARY 4 NULL 2 Using index; Distinct +drop table t1,t2; diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 7302e5dfdda..59b86309d77 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -422,3 +422,17 @@ update t1 set b='b ' where a > 1; delete from t1 where b='b'; select a,concat(b,'.') from t1; drop table t1; + +# +# Test keys with 0 segments. (Bug #3203) +# +create table t1 (a int not null); +create table t2 (a int not null, primary key (a)); +insert into t1 values (1); +insert into t2 values (1),(2); +select sql_big_result distinct t1.a from t1,t2 order by t2.a; +select distinct t1.a from t1,t2 order by t2.a; +select sql_big_result distinct t1.a from t1,t2; +explain select sql_big_result distinct t1.a from t1,t2 order by t2.a; +explain select distinct t1.a from t1,t2 order by t2.a; +drop table t1,t2; |