Commit e9c25d93 authored by unknown's avatar unknown

Fix for BUG#5033 "When using temporary tables truncate does NOT reset the auto_increment counter"

(ok'd by CTO to fix it in 4.0).
Fix to make mysql-test-run work with all Valgrind versions.


mysql-test/mysql-test-run.sh:
  fixing mysql-test-run.sh so that it works indifferently with Valgrind 1.x, 2.x
  (versions <= 2.0.0 refuse --tool option; versions >=2.1.2 require it; 2.1.0 accepts it).
  I hope the shell code is portable enough; anyway Valgrind only runs on Linux...
  I tested it with 2.0.0, 2.1.0, 2.1.2.
mysql-test/r/truncate.result:
  result update
mysql-test/t/truncate.test:
  testing if TRUNCATE resets autoinc counter for temp tables (BUG#5033); testing difference with DELETE FROM.
sql/sql_delete.cc:
  in mysql_truncate(), always reset the autoinc counter, as manual says (even if it's a temp table, which was BUG#5033).
parent 38b8c985
...@@ -349,9 +349,11 @@ while test $# -gt 0; do ...@@ -349,9 +349,11 @@ while test $# -gt 0; do
VALGRIND=`which valgrind` # this will print an error if not found VALGRIND=`which valgrind` # this will print an error if not found
# Give good warning to the user and stop # Give good warning to the user and stop
if [ -z "$VALGRIND" ] ; then if [ -z "$VALGRIND" ] ; then
$ECHO "You need to have the 'valgrind' program in your PATH to run mysql-test-run with option --valgrind. Valgrind's home page is http://developer.kde.org/~sewardj ." $ECHO "You need to have the 'valgrind' program in your PATH to run mysql-test-run with option --valgrind. Valgrind's home page is http://valgrind.kde.org ."
exit 1 exit 1
fi fi
# >=2.1.2 requires the --tool option, some versions write to stdout, some to stderr
valgrind --help 2>&1 | grep "\-\-tool" > /dev/null && VALGRIND="$VALGRIND --tool=memcheck"
VALGRIND="$VALGRIND --alignment=8 --leak-check=yes --num-callers=16" VALGRIND="$VALGRIND --alignment=8 --leak-check=yes --num-callers=16"
EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc --skip-bdb" EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT --skip-safemalloc --skip-bdb"
EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc --skip-bdb" EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT --skip-safemalloc --skip-bdb"
......
...@@ -31,4 +31,25 @@ SELECT * from t1; ...@@ -31,4 +31,25 @@ SELECT * from t1;
a a
1 1
2 2
delete from t1;
insert into t1 (a) values (NULL),(NULL);
SELECT * from t1;
a
3
4
drop table t1;
create temporary table t1 (a integer auto_increment primary key);
insert into t1 (a) values (NULL),(NULL);
truncate table t1;
insert into t1 (a) values (NULL),(NULL);
SELECT * from t1;
a
1
2
delete from t1;
insert into t1 (a) values (NULL),(NULL);
SELECT * from t1;
a
3
4
drop table t1; drop table t1;
...@@ -23,7 +23,7 @@ drop table t1; ...@@ -23,7 +23,7 @@ drop table t1;
truncate non_existing_table; truncate non_existing_table;
# #
# test autoincrement with TRUNCATE # test autoincrement with TRUNCATE; verifying difference with DELETE
# #
create table t1 (a integer auto_increment primary key); create table t1 (a integer auto_increment primary key);
...@@ -31,5 +31,19 @@ insert into t1 (a) values (NULL),(NULL); ...@@ -31,5 +31,19 @@ insert into t1 (a) values (NULL),(NULL);
truncate table t1; truncate table t1;
insert into t1 (a) values (NULL),(NULL); insert into t1 (a) values (NULL),(NULL);
SELECT * from t1; SELECT * from t1;
delete from t1;
insert into t1 (a) values (NULL),(NULL);
SELECT * from t1;
drop table t1; drop table t1;
# Verifying that temp tables are handled the same way
create temporary table t1 (a integer auto_increment primary key);
insert into t1 (a) values (NULL),(NULL);
truncate table t1;
insert into t1 (a) values (NULL),(NULL);
SELECT * from t1;
delete from t1;
insert into t1 (a) values (NULL),(NULL);
SELECT * from t1;
drop table t1;
...@@ -545,15 +545,13 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) ...@@ -545,15 +545,13 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
int error; int error;
DBUG_ENTER("mysql_truncate"); DBUG_ENTER("mysql_truncate");
bzero((char*) &create_info,sizeof(create_info));
/* If it is a temporary table, close and regenerate it */ /* If it is a temporary table, close and regenerate it */
if (!dont_send_ok && (table_ptr=find_temporary_table(thd,table_list->db, if (!dont_send_ok && (table_ptr=find_temporary_table(thd,table_list->db,
table_list->real_name))) table_list->real_name)))
{ {
TABLE *table= *table_ptr; TABLE *table= *table_ptr;
HA_CREATE_INFO create_info;
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK); table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
bzero((char*) &create_info,sizeof(create_info));
create_info.auto_increment_value= table->file->auto_increment_value;
db_type table_type=table->db_type; db_type table_type=table->db_type;
strmov(path,table->path); strmov(path,table->path);
...@@ -596,7 +594,6 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok) ...@@ -596,7 +594,6 @@ int mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
bzero((char*) &create_info,sizeof(create_info));
*fn_ext(path)=0; // Remove the .frm extension *fn_ext(path)=0; // Remove the .frm extension
error= ha_create_table(path,&create_info,1) ? -1 : 0; error= ha_create_table(path,&create_info,1) ? -1 : 0;
query_cache_invalidate3(thd, table_list, 0); query_cache_invalidate3(thd, table_list, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment