summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heap/hp_create.c3
-rw-r--r--include/heap.h2
-rw-r--r--mysql-test/r/heap.result42
-rw-r--r--mysql-test/t/heap.test29
-rw-r--r--sql/filesort.cc7
-rw-r--r--sql/ha_heap.cc12
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;