mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
fix auto-increment in sub-key and insert ... select
This commit is contained in:
parent
e0ba590fc9
commit
6a933b2e08
6 changed files with 26 additions and 6 deletions
|
@ -100,6 +100,7 @@ typedef struct st_mi_create_info
|
||||||
ulong raid_chunksize;
|
ulong raid_chunksize;
|
||||||
uint old_options;
|
uint old_options;
|
||||||
uint8 language;
|
uint8 language;
|
||||||
|
my_bool with_auto_increment;
|
||||||
} MI_CREATE_INFO;
|
} MI_CREATE_INFO;
|
||||||
|
|
||||||
struct st_myisam_info; /* For referense */
|
struct st_myisam_info; /* For referense */
|
||||||
|
|
|
@ -3694,8 +3694,8 @@ void mi_disable_non_unique_index(MI_INFO *info, ha_rows rows)
|
||||||
MI_KEYDEF *key=share->keyinfo;
|
MI_KEYDEF *key=share->keyinfo;
|
||||||
for (i=0 ; i < share->base.keys ; i++,key++)
|
for (i=0 ; i < share->base.keys ; i++,key++)
|
||||||
{
|
{
|
||||||
if (!(key->flag & HA_NOSAME) && ! mi_too_big_key_for_sort(key,rows) &&
|
if (!(key->flag & (HA_NOSAME|HA_AUTO_KEY)) &&
|
||||||
info->s->base.auto_key != i+1)
|
! mi_too_big_key_for_sort(key,rows))
|
||||||
{
|
{
|
||||||
share->state.key_map&= ~ ((ulonglong) 1 << i);
|
share->state.key_map&= ~ ((ulonglong) 1 << i);
|
||||||
info->update|= HA_STATE_CHANGED;
|
info->update|= HA_STATE_CHANGED;
|
||||||
|
|
|
@ -304,7 +304,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
if (keydef->flag & HA_BINARY_PACK_KEY)
|
if (keydef->flag & HA_BINARY_PACK_KEY)
|
||||||
options|=HA_OPTION_PACK_KEYS; /* Using packed keys */
|
options|=HA_OPTION_PACK_KEYS; /* Using packed keys */
|
||||||
|
|
||||||
if (keydef->flag & HA_AUTO_KEY)
|
if (keydef->flag & HA_AUTO_KEY && ci->with_auto_increment)
|
||||||
share.base.auto_key=i+1;
|
share.base.auto_key=i+1;
|
||||||
for (j=0, keyseg=keydef->seg ; j < keydef->keysegs ; j++, keyseg++)
|
for (j=0, keyseg=keydef->seg ; j < keydef->keysegs ; j++, keyseg++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,6 +84,16 @@ ordid ord
|
||||||
3 sdj
|
3 sdj
|
||||||
1 zzz
|
1 zzz
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (sid char(5), id int(2) NOT NULL auto_increment, key(sid, id));
|
||||||
|
create table t2 (sid char(20), id int(2));
|
||||||
|
insert into t2 values ('skr',NULL),('skr',NULL),('test',NULL);
|
||||||
|
insert into t1 select * from t2;
|
||||||
|
select * from t1;
|
||||||
|
sid id
|
||||||
|
skr 1
|
||||||
|
skr 2
|
||||||
|
test 1
|
||||||
|
drop table t1,t2;
|
||||||
create table t1 (a int not null primary key auto_increment);
|
create table t1 (a int not null primary key auto_increment);
|
||||||
insert into t1 values (0);
|
insert into t1 values (0);
|
||||||
update t1 set a=0;
|
update t1 set a=0;
|
||||||
|
|
|
@ -52,6 +52,13 @@ insert into t1 values (NULL,'sdj'),(NULL,'sdj'),(NULL,"abc"),(NULL,'abc'),(NULL,
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (sid char(5), id int(2) NOT NULL auto_increment, key(sid, id));
|
||||||
|
create table t2 (sid char(20), id int(2));
|
||||||
|
insert into t2 values ('skr',NULL),('skr',NULL),('test',NULL);
|
||||||
|
insert into t1 select * from t2;
|
||||||
|
select * from t1;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test of auto_increment columns when they are set to 0
|
# Test of auto_increment columns when they are set to 0
|
||||||
#
|
#
|
||||||
|
@ -62,3 +69,4 @@ update t1 set a=0;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
check table t1;
|
check table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
|
@ -1021,7 +1021,7 @@ int ha_myisam::create(const char *name, register TABLE *table_arg,
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
uint i,j,recpos,minpos,fieldpos,temp_length,length;
|
uint i,j,recpos,minpos,fieldpos,temp_length,length;
|
||||||
bool found_auto_increment=0;
|
bool found_auto_increment=0, found_real_auto_increment=0;
|
||||||
enum ha_base_keytype type;
|
enum ha_base_keytype type;
|
||||||
char buff[FN_REFLEN];
|
char buff[FN_REFLEN];
|
||||||
KEY *pos;
|
KEY *pos;
|
||||||
|
@ -1091,11 +1091,11 @@ int ha_myisam::create(const char *name, register TABLE *table_arg,
|
||||||
keydef[i].seg[j].null_bit=0;
|
keydef[i].seg[j].null_bit=0;
|
||||||
keydef[i].seg[j].null_pos=0;
|
keydef[i].seg[j].null_pos=0;
|
||||||
}
|
}
|
||||||
if (j == 0 && field->flags & AUTO_INCREMENT_FLAG &&
|
if (field->flags & AUTO_INCREMENT_FLAG && !found_auto_increment)
|
||||||
!found_auto_increment)
|
|
||||||
{
|
{
|
||||||
keydef[i].flag|=HA_AUTO_KEY;
|
keydef[i].flag|=HA_AUTO_KEY;
|
||||||
found_auto_increment=1;
|
found_auto_increment=1;
|
||||||
|
found_real_auto_increment=(j==0);
|
||||||
}
|
}
|
||||||
if (field->type() == FIELD_TYPE_BLOB)
|
if (field->type() == FIELD_TYPE_BLOB)
|
||||||
{
|
{
|
||||||
|
@ -1177,6 +1177,7 @@ int ha_myisam::create(const char *name, register TABLE *table_arg,
|
||||||
bzero((char*) &create_info,sizeof(create_info));
|
bzero((char*) &create_info,sizeof(create_info));
|
||||||
create_info.max_rows=table_arg->max_rows;
|
create_info.max_rows=table_arg->max_rows;
|
||||||
create_info.reloc_rows=table_arg->min_rows;
|
create_info.reloc_rows=table_arg->min_rows;
|
||||||
|
create_info.with_auto_increment=found_real_auto_increment;
|
||||||
create_info.auto_increment=(info->auto_increment_value ?
|
create_info.auto_increment=(info->auto_increment_value ?
|
||||||
info->auto_increment_value -1 :
|
info->auto_increment_value -1 :
|
||||||
(ulonglong) 0);
|
(ulonglong) 0);
|
||||||
|
|
Loading…
Reference in a new issue