diff options
-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; |