summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--myisam/mi_create.c8
-rw-r--r--mysql-test/r/myisam.result22
-rw-r--r--mysql-test/t/myisam.test14
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;