Commit f538288b authored by ramil/ram@mysql.com/ramil.myoffice.izhnet.ru's avatar ramil/ram@mysql.com/ramil.myoffice.izhnet.ru
Browse files

Fix for bug #35392: Delete all statement does not execute properly

after few delete statements

Problem: changing a file size might require that it must be 
unmapped beforehand.
  
Fix: unmap the file before changing its size.
parent ab82eca6
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -184,3 +184,14 @@ select * from t1;
a
42
drop table t1;
CREATE TEMPORARY TABLE t1(a INT, b VARCHAR(20));
INSERT INTO t1 VALUES(1, 'val1'), (2, 'val2'), (3, 'val3');
DELETE FROM t1 WHERE a=1;
SELECT count(*) FROM t1;
count(*)
2
DELETE FROM t1;
SELECT * FROM t1;
a	b
DROP TABLE t1;
End of 5.1 tests
+14 −0
Original line number Diff line number Diff line
@@ -191,3 +191,17 @@ truncate t1;
insert into t1 values (42);
select * from t1;
drop table t1;

#
# Bug #35392: Delete all statement does not execute properly after 
# few delete statements
#
CREATE TEMPORARY TABLE t1(a INT, b VARCHAR(20));
INSERT INTO t1 VALUES(1, 'val1'), (2, 'val2'), (3, 'val3');
DELETE FROM t1 WHERE a=1;
SELECT count(*) FROM t1;
DELETE FROM t1;
SELECT * FROM t1;
DROP TABLE t1;

--echo End of 5.1 tests
+7 −4
Original line number Diff line number Diff line
@@ -53,15 +53,18 @@ int mi_delete_all_rows(MI_INFO *info)
    since it was locked then there may be key blocks in the key cache
  */
  flush_key_blocks(share->key_cache, share->kfile, FLUSH_IGNORE_CHANGED);
#ifdef HAVE_MMAP
  if (share->file_map)
    _mi_unmap_file(info);
#endif
  if (my_chsize(info->dfile, 0, 0, MYF(MY_WME)) ||
      my_chsize(share->kfile, share->base.keystart, 0, MYF(MY_WME))  )
    goto err;
  VOID(_mi_writeinfo(info,WRITEINFO_UPDATE_KEYFILE));
#ifdef HAVE_MMAP
  /* Resize mmaped area */
  rw_wrlock(&info->s->mmap_lock);
  mi_remap_file(info, (my_off_t)0);
  rw_unlock(&info->s->mmap_lock);
  /* Map again */
  if (share->file_map)
    mi_dynmap_file(info, (my_off_t) 0);
#endif
  allow_break();			/* Allow SIGHUP & SIGINT */
  DBUG_RETURN(0);