Commit b63e25d5 authored by unknown's avatar unknown

Merge mysql.com:/home/mydev/mysql-5.0-bug14980

into  mysql.com:/home/mydev/mysql-5.1-bug14980


include/my_base.h:
  Auto merged
mysql-test/r/myisam.result:
  Auto merged
storage/myisam/mi_delete.c:
  Auto merged
storage/myisam/mi_key.c:
  Auto merged
storage/myisam/mi_rnext_same.c:
  Auto merged
storage/myisam/mi_unique.c:
  Auto merged
storage/myisam/mi_update.c:
  Auto merged
storage/myisam/mi_write.c:
  Auto merged
parents 54715b8b cefb1dc2
...@@ -423,7 +423,7 @@ enum ha_base_keytype { ...@@ -423,7 +423,7 @@ enum ha_base_keytype {
#define HA_STATE_BUFF_SAVED 512 /* If current keybuff is info->buff */ #define HA_STATE_BUFF_SAVED 512 /* If current keybuff is info->buff */
#define HA_STATE_ROW_CHANGED 1024 /* To invalide ROW cache */ #define HA_STATE_ROW_CHANGED 1024 /* To invalide ROW cache */
#define HA_STATE_EXTEND_BLOCK 2048 #define HA_STATE_EXTEND_BLOCK 2048
#define HA_STATE_RNEXT_SAME 4096 /* rnext_same was called */ #define HA_STATE_RNEXT_SAME 4096 /* rnext_same occupied lastkey2 */
/* myisampack expects no more than 32 field types. */ /* myisampack expects no more than 32 field types. */
enum en_fieldtype { enum en_fieldtype {
......
...@@ -729,6 +729,24 @@ select * from t1 where bob is null and cip=1; ...@@ -729,6 +729,24 @@ select * from t1 where bob is null and cip=1;
cip time score bob cip time score bob
1 00:01:00 0 NULL 1 00:01:00 0 NULL
drop table t1; drop table t1;
create table t1 (
id1 int not null auto_increment,
id2 int not null default '0',
t text not null,
primary key (id1),
key x (id2, t(32))
) engine=myisam;
insert into t1 (id2, t) values
(10, 'abc'), (10, 'abc'), (10, 'abc'),
(20, 'abc'), (20, 'abc'), (20, 'def'),
(10, 'abc'), (10, 'abc');
select count(*) from t1 where id2 = 10;
count(*)
5
select count(id1) from t1 where id2 = 10;
count(id1)
5
drop table t1;
set storage_engine=MyISAM; set storage_engine=MyISAM;
drop table if exists t1,t2,t3; drop table if exists t1,t2,t3;
--- Testing varchar --- --- Testing varchar ---
......
...@@ -678,6 +678,25 @@ select * from t1 where bob is null and cip=1; ...@@ -678,6 +678,25 @@ select * from t1 where bob is null and cip=1;
create index bug on t1 (bob(22), cip, time); create index bug on t1 (bob(22), cip, time);
select * from t1 where bob is null and cip=1; select * from t1 where bob is null and cip=1;
drop table t1; drop table t1;
#
# Bug#14980 - COUNT(*) incorrect on MyISAM table with certain INDEX
#
create table t1 (
id1 int not null auto_increment,
id2 int not null default '0',
t text not null,
primary key (id1),
key x (id2, t(32))
) engine=myisam;
insert into t1 (id2, t) values
(10, 'abc'), (10, 'abc'), (10, 'abc'),
(20, 'abc'), (20, 'abc'), (20, 'def'),
(10, 'abc'), (10, 'abc');
select count(*) from t1 where id2 = 10;
select count(id1) from t1 where id2 = 10;
drop table t1;
# End of 4.1 tests # End of 4.1 tests
# #
......
...@@ -88,6 +88,8 @@ int mi_delete(MI_INFO *info,const byte *record) ...@@ -88,6 +88,8 @@ int mi_delete(MI_INFO *info,const byte *record)
_mi_make_key(info,i,old_key,record,info->lastpos))) _mi_make_key(info,i,old_key,record,info->lastpos)))
goto err; goto err;
} }
/* The above changed info->lastkey2. Inform mi_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME;
} }
} }
......
...@@ -444,6 +444,10 @@ static int _mi_put_key_in_record(register MI_INFO *info, uint keynr, ...@@ -444,6 +444,10 @@ static int _mi_put_key_in_record(register MI_INFO *info, uint keynr,
(char*) &blob_ptr,sizeof(char*)); (char*) &blob_ptr,sizeof(char*));
memcpy(blob_ptr,key,length); memcpy(blob_ptr,key,length);
blob_ptr+=length; blob_ptr+=length;
/* The above changed info->lastkey2. Inform mi_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME;
_my_store_blob_length(record+keyseg->start, _my_store_blob_length(record+keyseg->start,
(uint) keyseg->bit_start,length); (uint) keyseg->bit_start,length);
key+=length; key+=length;
......
...@@ -40,7 +40,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf) ...@@ -40,7 +40,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
if (info->s->concurrent_insert) if (info->s->concurrent_insert)
rw_rdlock(&info->s->key_root_lock[inx]); rw_rdlock(&info->s->key_root_lock[inx]);
switch (keyinfo->key_alg) switch (keyinfo->key_alg)
{ {
#ifdef HAVE_RTREE_KEYS #ifdef HAVE_RTREE_KEYS
...@@ -102,4 +102,4 @@ int mi_rnext_same(MI_INFO *info, byte *buf) ...@@ -102,4 +102,4 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
} /* mi_rnext */ } /* mi_rnext_same */
...@@ -30,6 +30,9 @@ my_bool mi_check_unique(MI_INFO *info, MI_UNIQUEDEF *def, byte *record, ...@@ -30,6 +30,9 @@ my_bool mi_check_unique(MI_INFO *info, MI_UNIQUEDEF *def, byte *record,
mi_unique_store(record+key->seg->start, unique_hash); mi_unique_store(record+key->seg->start, unique_hash);
_mi_make_key(info,def->key,key_buff,record,0); _mi_make_key(info,def->key,key_buff,record,0);
/* The above changed info->lastkey2. Inform mi_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME;
if (_mi_search(info,info->s->keyinfo+def->key,key_buff,MI_UNIQUE_HASH_LENGTH, if (_mi_search(info,info->s->keyinfo+def->key,key_buff,MI_UNIQUE_HASH_LENGTH,
SEARCH_FIND,info->s->state.key_root[def->key])) SEARCH_FIND,info->s->state.key_root[def->key]))
{ {
......
...@@ -111,6 +111,10 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec) ...@@ -111,6 +111,10 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
{ {
uint new_length=_mi_make_key(info,i,new_key,newrec,pos); uint new_length=_mi_make_key(info,i,new_key,newrec,pos);
uint old_length=_mi_make_key(info,i,old_key,oldrec,pos); uint old_length=_mi_make_key(info,i,old_key,oldrec,pos);
/* The above changed info->lastkey2. Inform mi_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME;
if (new_length != old_length || if (new_length != old_length ||
memcmp((byte*) old_key,(byte*) new_key,new_length)) memcmp((byte*) old_key,(byte*) new_key,new_length))
{ {
......
...@@ -132,6 +132,10 @@ int mi_write(MI_INFO *info, byte *record) ...@@ -132,6 +132,10 @@ int mi_write(MI_INFO *info, byte *record)
goto err; goto err;
} }
} }
/* The above changed info->lastkey2. Inform mi_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME;
if (local_lock_tree) if (local_lock_tree)
rw_unlock(&share->key_root_lock[i]); rw_unlock(&share->key_root_lock[i]);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment