Commit a32f6b89 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 868fee4d 7d600f71
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,

  if (fast_mi_readinfo(info))
    goto err;

  if (share->concurrent_insert)
    rw_rdlock(&share->key_root_lock[inx]);

@@ -91,20 +92,38 @@ 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]))
    {
      while (info->lastpos >= info->state->data_file_length)
      if (info->lastpos >= info->state->data_file_length)
      {
        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
	  exact key, because the keys are sorted according to position
            full length exact key, because the keys are sorted
            according to position
          */

          if  (_mi_search_next(info, keyinfo, info->lastkey,
                               info->lastkey_length,
                               myisam_readnext_vec[search_flag],
                               info->s->state.key_root[inx]))
            break;
        }
        while (info->lastpos >= info->state->data_file_length);
      }
    }
  }
  if (share->concurrent_insert)
+15 −0
Original line number Diff line number Diff line
@@ -756,3 +756,18 @@ 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;
+16 −0
Original line number Diff line number Diff line
@@ -715,3 +715,19 @@ 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