diff options
-rw-r--r-- | heap/hp_create.c | 3 | ||||
-rw-r--r-- | include/heap.h | 2 | ||||
-rw-r--r-- | mysql-test/r/heap.result | 42 | ||||
-rw-r--r-- | mysql-test/t/heap.test | 29 | ||||
-rw-r--r-- | sql/filesort.cc | 7 | ||||
-rw-r--r-- | sql/ha_heap.cc | 12 |
6 files changed, 87 insertions, 8 deletions
diff --git a/heap/hp_create.c b/heap/hp_create.c index 17aa92c9201..55b8e1e2a33 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -168,6 +168,8 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, keyinfo->write_key= hp_write_key; keyinfo->hash_buckets= 0; } + if ((keyinfo->flag & HA_AUTO_KEY) && create_info->with_auto_increment) + share->auto_key= i + 1; } share->min_records= min_records; share->max_records= max_records; @@ -178,7 +180,6 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, share->keys= keys; share->max_key_length= max_length; share->changed= 0; - share->auto_key= create_info->auto_key; share->auto_key_type= create_info->auto_key_type; share->auto_increment= create_info->auto_increment; /* Must be allocated separately for rename to work */ diff --git a/include/heap.h b/include/heap.h index ac2b38d1f2d..51f7b0cfa6a 100644 --- a/include/heap.h +++ b/include/heap.h @@ -183,10 +183,10 @@ typedef struct st_heap_info typedef struct st_heap_create_info { - uint auto_key; uint auto_key_type; ulong max_table_size; ulonglong auto_increment; + my_bool with_auto_increment; } HP_CREATE_INFO; /* Prototypes for heap-functions */ diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index f79bcf3f1dd..db20b242962 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -665,3 +665,45 @@ length(v) 65530 drop table t1; set storage_engine=MyISAM; +create table t1 (a bigint unsigned auto_increment primary key, b int, +key (b, a)) engine=heap; +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +select * from t1; +a b +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +drop table t1; +create table t1 (a int not null, b int not null auto_increment, +primary key(a, b), key(b)) engine=heap; +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +select * from t1; +a b +1 1 +1 2 +1 3 +1 4 +1 5 +1 6 +1 7 +1 8 +drop table t1; diff --git a/mysql-test/t/heap.test b/mysql-test/t/heap.test index 6353cd78d6a..b69649585ff 100644 --- a/mysql-test/t/heap.test +++ b/mysql-test/t/heap.test @@ -406,3 +406,32 @@ drop table t1; # Reset varchar test # eval set storage_engine=$default; + +# +# Bug #8489: Strange auto_increment behaviour +# + +create table t1 (a bigint unsigned auto_increment primary key, b int, + key (b, a)) engine=heap; +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +insert t1 (b) values (1); +select * from t1; +drop table t1; +create table t1 (a int not null, b int not null auto_increment, + primary key(a, b), key(b)) engine=heap; +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +insert t1 (a) values (1); +select * from t1; +drop table t1; diff --git a/sql/filesort.cc b/sql/filesort.cc index 901e2cd72f0..c50f1daa6ef 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -475,8 +475,11 @@ static ha_rows find_all_keys(SORTPARAM *param, SQL_SELECT *select, if (*killed) { DBUG_PRINT("info",("Sort killed by user")); - (void) file->extra(HA_EXTRA_NO_CACHE); - file->ha_rnd_end(); + if (!indexfile && !quick_select) + { + (void) file->extra(HA_EXTRA_NO_CACHE); + file->ha_rnd_end(); + } DBUG_RETURN(HA_POS_ERROR); /* purecov: inspected */ } if (error == 0) diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 7dc7da4dad6..28a7b5529c9 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -457,6 +457,7 @@ int ha_heap::create(const char *name, TABLE *table_arg, char buff[FN_REFLEN]; int error; TABLE_SHARE *share= table_arg->s; + bool found_real_auto_increment= 0; for (key= parts= 0; key < keys; key++) parts+= table_arg->key_info[key].key_parts; @@ -520,19 +521,22 @@ int ha_heap::create(const char *name, TABLE *table_arg, seg->null_bit= 0; seg->null_pos= 0; } + // We have to store field->key_type() as seg->type can differ from it if (field->flags & AUTO_INCREMENT_FLAG) - { - auto_key= key + 1; auto_key_type= field->key_type(); - } } } mem_per_row+= MY_ALIGN(share->reclength + 1, sizeof(char*)); max_rows = (ha_rows) (table->in_use->variables.max_heap_table_size / mem_per_row); + if (table_arg->found_next_number_field) + { + keydef[table_arg->next_number_index].flag|= HA_AUTO_KEY; + found_real_auto_increment= table_arg->next_number_key_offset == 0; + } HP_CREATE_INFO hp_create_info; - hp_create_info.auto_key= auto_key; hp_create_info.auto_key_type= auto_key_type; + hp_create_info.with_auto_increment= found_real_auto_increment; hp_create_info.auto_increment= (create_info->auto_increment_value ? create_info->auto_increment_value - 1 : 0); hp_create_info.max_table_size=current_thd->variables.max_heap_table_size; |