Commit 203d0999 authored by unknown's avatar unknown
Browse files

Merge chilla.local:/home/mydev/mysql-4.0-bug14400

into  chilla.local:/home/mydev/mysql-4.1-bug14400


myisam/mi_rkey.c:
  Bug#14400 - Query joins wrong rows from table which is subject of
              "concurrent insert"
  Manual merge from 4.0
mysql-test/r/myisam.result:
  Bug#14400 - Query joins wrong rows from table which is subject of
              "concurrent insert"
  Manual merge from 4.0
mysql-test/t/myisam.test:
  Bug#14400 - Query joins wrong rows from table which is subject of
              "concurrent insert"
  Manual merge from 4.0
parents a32f6b89 71314617
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -92,24 +92,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, &not_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
@@ -121,8 +115,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 &&
              ha_key_cmp(keyinfo->seg, key_buff, info->lastkey, use_key_length,
                         SEARCH_FIND, &not_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);
      }
    }
  }
+28 −15
Original line number Diff line number Diff line
@@ -508,6 +508,34 @@ select c1 from t1 order by c1 limit 1;
c1
a
drop table t1;
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);
insert into t2 values (1,1),(2,1);
lock tables t1 read local, t2 read local;
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
a	a	b
1	1	1
2	2	1
insert into t2 values(2,0);
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
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;
CREATE TABLE t1 (`a` int(11) NOT NULL default '0', `b` int(11) NOT NULL default '0', UNIQUE KEY `a` USING RTREE (`a`,`b`)) ENGINE=MyISAM;
Got one of the listed errors
create table t1 (a int, b varchar(200), c text not null) checksum=1;
@@ -756,18 +784,3 @@ a b
xxxxxxxxx	bbbbbb
xxxxxxxxx	bbbbbb
DROP TABLE t1;
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);
insert into t2 values (1,1),(2,1);
lock tables t1 read local, t2 read local;
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
a	a	b
1	1	1
2	2	1
insert into t2 values(2,0);
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
a	a	b
1	1	1
2	2	1
drop table t1,t2;
+36 −16
Original line number Diff line number Diff line
@@ -485,6 +485,42 @@ insert into t1 values ('a'), ('b');
select c1 from t1 order by c1 limit 1;
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);
insert into t2 values (1,1),(2,1);
lock tables t1 read local, t2 read local;
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
insert into t2 values(2,0);
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

#
# Test RTREE index
#
@@ -715,19 +751,3 @@ SELECT * FROM t1;
DROP TABLE t1;

# End of 4.1 tests
# Bug #14400  Join could miss concurrently inserted row
#
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);
insert into t2 values (1,1),(2,1);
lock tables t1 read local, t2 read local;
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
connect (root,localhost,root,,test,$MASTER_MYPORT,master.sock);
insert into t2 values(2,0);
disconnect root;
connection default;
select straight_join * from t1,t2 force index (primary) where t1.a=t2.a;
drop table t1,t2;

# end of 4.0 tests