Loading myisam/mi_rkey.c +22 −16 Original line number Diff line number Diff line Loading @@ -78,24 +78,18 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, if (!_mi_search(info,keyinfo, key_buff, use_key_length, myisam_read_vec[search_flag], info->s->state.key_root[inx])) { if (info->lastpos >= info->state->data_file_length) /* If we searching for a partial key (or using >, >=, < or <=) and the data is outside of the data file, we need to continue searching for the first key inside the data file */ if (info->lastpos >= info->state->data_file_length && (search_flag != HA_READ_KEY_EXACT || last_used_keyseg != keyinfo->seg + keyinfo->keysegs)) { do { uint not_used; /* If we are searching for an exact key, abort if we find a bigger key. */ if (search_flag == HA_READ_KEY_EXACT && (use_key_length == USE_WHOLE_KEY || _mi_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length, SEARCH_FIND, ¬_used))) { my_errno= HA_ERR_END_OF_FILE; info->lastpos= HA_OFFSET_ERROR; break; } /* Skip rows that are inserted by other threads since we got a lock Note that this can only happen if we are not searching after an Loading @@ -107,8 +101,20 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, myisam_readnext_vec[search_flag], info->s->state.key_root[inx])) break; /* Check that the found key does still match the search. _mi_search_next() delivers the next key regardless of its value. */ if (search_flag == HA_READ_KEY_EXACT && _mi_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length, SEARCH_FIND, ¬_used)) { my_errno= HA_ERR_KEY_NOT_FOUND; info->lastpos= HA_OFFSET_ERROR; break; } while (info->lastpos >= info->state->data_file_length); } while (info->lastpos >= info->state->data_file_length); } } if (share->concurrent_insert) Loading mysql-test/r/myisam.result +13 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,16 @@ a a b 1 1 1 2 2 1 drop table t1,t2; CREATE TABLE t1 (c1 varchar(250) NOT NULL); CREATE TABLE t2 (c1 varchar(250) NOT NULL, PRIMARY KEY (c1)); INSERT INTO t1 VALUES ('test000001'), ('test000002'), ('test000003'); INSERT INTO t2 VALUES ('test000002'), ('test000003'), ('test000004'); LOCK TABLES t1 READ LOCAL, t2 READ LOCAL; SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; t1c1 t2c1 INSERT INTO t2 VALUES ('test000001'), ('test000005'); SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; t1c1 t2c1 DROP TABLE t1,t2; mysql-test/t/myisam.test +18 −0 Original line number Diff line number Diff line Loading @@ -461,6 +461,7 @@ drop table t1; # # Bug #14400 Join could miss concurrently inserted row # # Partial key. create table t1 (a int not null, primary key(a)); create table t2 (a int not null, b int not null, primary key(a,b)); insert into t1 values (1),(2),(3),(4),(5),(6); Loading @@ -473,5 +474,22 @@ disconnect root; connection default; select straight_join * from t1,t2 force index (primary) where t1.a=t2.a; drop table t1,t2; # # Full key. CREATE TABLE t1 (c1 varchar(250) NOT NULL); CREATE TABLE t2 (c1 varchar(250) NOT NULL, PRIMARY KEY (c1)); INSERT INTO t1 VALUES ('test000001'), ('test000002'), ('test000003'); INSERT INTO t2 VALUES ('test000002'), ('test000003'), ('test000004'); LOCK TABLES t1 READ LOCAL, t2 READ LOCAL; SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; connect (con1,localhost,root,,); connection con1; INSERT INTO t2 VALUES ('test000001'), ('test000005'); disconnect con1; connection default; SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; DROP TABLE t1,t2; # end of 4.0 tests Loading
myisam/mi_rkey.c +22 −16 Original line number Diff line number Diff line Loading @@ -78,24 +78,18 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, if (!_mi_search(info,keyinfo, key_buff, use_key_length, myisam_read_vec[search_flag], info->s->state.key_root[inx])) { if (info->lastpos >= info->state->data_file_length) /* If we searching for a partial key (or using >, >=, < or <=) and the data is outside of the data file, we need to continue searching for the first key inside the data file */ if (info->lastpos >= info->state->data_file_length && (search_flag != HA_READ_KEY_EXACT || last_used_keyseg != keyinfo->seg + keyinfo->keysegs)) { do { uint not_used; /* If we are searching for an exact key, abort if we find a bigger key. */ if (search_flag == HA_READ_KEY_EXACT && (use_key_length == USE_WHOLE_KEY || _mi_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length, SEARCH_FIND, ¬_used))) { my_errno= HA_ERR_END_OF_FILE; info->lastpos= HA_OFFSET_ERROR; break; } /* Skip rows that are inserted by other threads since we got a lock Note that this can only happen if we are not searching after an Loading @@ -107,8 +101,20 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len, myisam_readnext_vec[search_flag], info->s->state.key_root[inx])) break; /* Check that the found key does still match the search. _mi_search_next() delivers the next key regardless of its value. */ if (search_flag == HA_READ_KEY_EXACT && _mi_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length, SEARCH_FIND, ¬_used)) { my_errno= HA_ERR_KEY_NOT_FOUND; info->lastpos= HA_OFFSET_ERROR; break; } while (info->lastpos >= info->state->data_file_length); } while (info->lastpos >= info->state->data_file_length); } } if (share->concurrent_insert) Loading
mysql-test/r/myisam.result +13 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,16 @@ a a b 1 1 1 2 2 1 drop table t1,t2; CREATE TABLE t1 (c1 varchar(250) NOT NULL); CREATE TABLE t2 (c1 varchar(250) NOT NULL, PRIMARY KEY (c1)); INSERT INTO t1 VALUES ('test000001'), ('test000002'), ('test000003'); INSERT INTO t2 VALUES ('test000002'), ('test000003'), ('test000004'); LOCK TABLES t1 READ LOCAL, t2 READ LOCAL; SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; t1c1 t2c1 INSERT INTO t2 VALUES ('test000001'), ('test000005'); SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; t1c1 t2c1 DROP TABLE t1,t2;
mysql-test/t/myisam.test +18 −0 Original line number Diff line number Diff line Loading @@ -461,6 +461,7 @@ drop table t1; # # Bug #14400 Join could miss concurrently inserted row # # Partial key. create table t1 (a int not null, primary key(a)); create table t2 (a int not null, b int not null, primary key(a,b)); insert into t1 values (1),(2),(3),(4),(5),(6); Loading @@ -473,5 +474,22 @@ disconnect root; connection default; select straight_join * from t1,t2 force index (primary) where t1.a=t2.a; drop table t1,t2; # # Full key. CREATE TABLE t1 (c1 varchar(250) NOT NULL); CREATE TABLE t2 (c1 varchar(250) NOT NULL, PRIMARY KEY (c1)); INSERT INTO t1 VALUES ('test000001'), ('test000002'), ('test000003'); INSERT INTO t2 VALUES ('test000002'), ('test000003'), ('test000004'); LOCK TABLES t1 READ LOCAL, t2 READ LOCAL; SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; connect (con1,localhost,root,,); connection con1; INSERT INTO t2 VALUES ('test000001'), ('test000005'); disconnect con1; connection default; SELECT t1.c1 AS t1c1, t2.c1 AS t2c1 FROM t1, t2 WHERE t1.c1 = t2.c1 HAVING t1c1 != t2c1; DROP TABLE t1,t2; # end of 4.0 tests