Commit dcb66590 authored by unknown's avatar unknown
Browse files

Better bug fix for #14400 "Query joins wrong rows from table which is subject...

Better bug fix for #14400 "Query joins wrong rows from table which is subject of "concurrent insert""
The previous bug fix didn't work when using partial keys.
Don't use GNUC min/max operations are they are depricated.
Fixed valgrind warning


BitKeeper/etc/ignore:
  Added */.libs/*
include/my_global.h:
  Don't use GNUC min/max operations are they are depricated
myisam/mi_rkey.c:
  Better bug fix for #14400 "Query joins wrong rows from table which is subject of "concurrent insert""
  The previous bug fix didn't work when using partial keys.
myisam/mi_test_all.res:
  Updated results to match mi_test_all.sh
myisam/mi_test_all.sh:
  Removed confusing warning
mysql-test/r/myisam.result:
  Added test case for #14400
mysql-test/t/myisam.test:
  Added test case for #14400
sql/sql_select.cc:
  Fixed valgrind warning (in field_string::val_int())
parent 189a6879
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -549,3 +549,7 @@ support-files/my-innodb-heavy-4G.cnf
ac_available_languages_fragment
support-files/MacOSX/postflight
support-files/MacOSX/preflight
*/.deps
*.Po
*.Plo
*/.libs/*
+1 −4
Original line number Diff line number Diff line
@@ -348,10 +348,7 @@ int __void__;
#endif

/* Define some useful general macros */
#if defined(__cplusplus) && defined(__GNUC__)
#define max(a, b)	((a) >? (b))
#define min(a, b)	((a) <? (b))
#elif !defined(max)
#if !defined(max)
#define max(a, b)	((a) > (b) ? (a) : (b))
#define min(a, b)	((a) < (b) ? (a) : (b))
#endif
+30 −23
Original line number Diff line number Diff line
@@ -78,23 +78,29 @@ 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)
    {
      do
      {
        uint not_used;
        /*
      If we are searching for an exact key (including the data pointer)
      and this was added by an concurrent insert,
      then the result is "key not found".
          If we are searching for an exact key, abort if we find a bigger
          key.
        */
    if ((search_flag == HA_READ_KEY_EXACT) &&
        (info->lastpos >= info->state->data_file_length))
        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_KEY_NOT_FOUND;
          my_errno= HA_ERR_END_OF_FILE;
          info->lastpos= HA_OFFSET_ERROR;
          break;
        }
    else while (info->lastpos >= info->state->data_file_length)
    {
        /*
          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,
@@ -102,8 +108,9 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
                             info->s->state.key_root[inx]))
          break;
      }
      while (info->lastpos >= info->state->data_file_length);
    }
  }

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

+35 −35
Original line number Diff line number Diff line
@@ -5,46 +5,46 @@ myisamchk: MyISAM file test2
myisamchk: warning: Datafile is almost full,      65532 of      65534 used
MyISAM-table 'test2' is usable but should be fixed
Commands   Used count    Errors   Recover errors
open               17         0                0
write             850         0                0
update             85         0                0
delete            850         0                0
close              17         0                0
extra             102         0                0
Total            1921         0                0
open                7         0                0
write             350         0                0
update             35         0                0
delete            350         0                0
close               7         0                0
extra              42         0                0
Total             791         0                0
Commands   Used count    Errors   Recover errors
open               18         0                0
write             900         0                0
update             90         0                0
delete            900         0                0
close              18         0                0
extra             108         0                0
Total            2034         0                0
open                8         0                0
write             400         0                0
update             40         0                0
delete            400         0                0
close               8         0                0
extra              48         0                0
Total             904         0                0

real	0m1.054s
user	0m0.410s
sys	0m0.640s
real	0m0.221s
user	0m0.120s
sys	0m0.100s

real	0m1.077s
user	0m0.550s
sys	0m0.530s
real	0m0.222s
user	0m0.140s
sys	0m0.084s

real	0m1.100s
user	0m0.420s
sys	0m0.680s
real	0m0.232s
user	0m0.112s
sys	0m0.120s

real	0m0.783s
user	0m0.590s
sys	0m0.200s
real	0m0.163s
user	0m0.116s
sys	0m0.036s

real	0m0.764s
user	0m0.560s
sys	0m0.210s
real	0m0.159s
user	0m0.136s
sys	0m0.020s

real	0m0.699s
user	0m0.570s
sys	0m0.130s
real	0m0.147s
user	0m0.132s
sys	0m0.016s

real	0m0.991s
user	0m0.630s
sys	0m0.350s
real	0m0.211s
user	0m0.124s
sys	0m0.088s
+2 −1
Original line number Diff line number Diff line
@@ -79,7 +79,8 @@ myisamchk$suffix -se test1

# check of myisampack / myisamchk
myisampack$suffix --force -s test1
myisamchk$suffix -es test1
# Ignore error for index file
myisamchk$suffix -es test1 2>&1 >& /dev/null
myisamchk$suffix -rqs test1
myisamchk$suffix -es test1
myisamchk$suffix -rs test1
Loading