From a308c9e3fae8c510f6775f9e19c41b04b3a8194e Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Wed, 6 Aug 2008 09:25:03 -0400 Subject: [PATCH 1/7] Bug#30129: mysql_install_db appears to run normally, but the databases \ are not created {Netware} The init and test sql files were not created at cross-compilation time. Now, make them in the default build rule. Additionally, remove the "fix" SQL instructions, which are unnecessary for newly initialized databases. Also, clean up the english in an error message, and BZRify nwbootstrap. --- netware/BUILD/compile-linux-tools | 3 +++ netware/BUILD/nwbootstrap | 8 +++++--- netware/Makefile.am | 3 +-- netware/mysql_install_db.c | 20 +++++++++++++++----- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/netware/BUILD/compile-linux-tools b/netware/BUILD/compile-linux-tools index 14422ea5a3f..8cca00d142f 100755 --- a/netware/BUILD/compile-linux-tools +++ b/netware/BUILD/compile-linux-tools @@ -53,6 +53,9 @@ make # so the file will be linked (cd sql; make sql_yacc.cc) +# we need initilizing SQL files. +(cd netware; make test_db.sql init_db.sql) + # copying required linux tools cp extra/comp_err extra/comp_err.linux cp libmysql/conf_to_src libmysql/conf_to_src.linux diff --git a/netware/BUILD/nwbootstrap b/netware/BUILD/nwbootstrap index e0c0b926619..7ea8b9fc4b8 100755 --- a/netware/BUILD/nwbootstrap +++ b/netware/BUILD/nwbootstrap @@ -91,8 +91,8 @@ done echo "starting build..." # check for bk and repo_dir -bk help > /dev/null -repo_dir=`bk root $repo_dir` +bzr help > /dev/null +repo_dir=`bzr root $repo_dir` cd $repo_dir doc_dir="$repo_dir/../mysqldoc" @@ -100,7 +100,7 @@ doc_dir="$repo_dir/../mysqldoc" temp_dir="$build_dir/mysql-$$.tmp" # export the bk tree -command="bk export"; +command="bzr export"; if test $revision; then command="$command -r$revision"; fi command="$command $temp_dir" echo "exporting $repo_dir..." @@ -178,6 +178,8 @@ awk 'BEGIN{x=0;} END{printf("\n");} x==1 {printf(" %s",$1); x++; next} x>1 {pri # build linux tools echo "compiling linux tools..." ./netware/BUILD/compile-linux-tools +test -f ./netware/init_db.sql # this must exist +test -f ./netware/test_db.sql # this must exist # compile if test $build diff --git a/netware/Makefile.am b/netware/Makefile.am index 2e9ff2b59d6..7ad045d433d 100644 --- a/netware/Makefile.am +++ b/netware/Makefile.am @@ -103,8 +103,7 @@ init_db.sql: $(top_srcdir)/scripts/mysql_system_tables.sql \ @echo "CREATE DATABASE mysql;" > $@; @echo "CREATE DATABASE test;" >> $@; @echo "use mysql;" >> $@; - @cat $(top_srcdir)/scripts/mysql_system_tables.sql \ - $(top_srcdir)/scripts/mysql_system_tables_fix.sql >> $@; + @cat $(top_srcdir)/scripts/mysql_system_tables.sql >> $@; # Build test_db.sql from init_db.sql plus # some test data diff --git a/netware/mysql_install_db.c b/netware/mysql_install_db.c index 65ee7873e5c..218c5024a8c 100644 --- a/netware/mysql_install_db.c +++ b/netware/mysql_install_db.c @@ -324,9 +324,10 @@ void create_paths() ******************************************************************************/ int mysql_install_db(int argc, char *argv[]) { - arg_list_t al; - int i, j, err; - char skip; + arg_list_t al; + int i, j, err; + char skip; + struct stat info; // private options static char *private_options[] = @@ -363,6 +364,15 @@ int mysql_install_db(int argc, char *argv[]) add_arg(&al, "--skip-innodb"); add_arg(&al, "--skip-bdb"); + if ((err = stat(sql_file, &info)) != 0) + { + printf("ERROR - %s:\n", strerror(errno)); + printf("\t%s\n\n", sql_file); + // free args + free_args(&al); + exit(-1); + } + // spawn mysqld err = spawn(mysqld, &al, TRUE, sql_file, out_log, err_log); @@ -395,9 +405,9 @@ int main(int argc, char **argv) // install the database if (mysql_install_db(argc, argv)) { - printf("ERROR - The database creation failed!\n"); + printf("ERROR - Failed to create the database!\n"); printf(" %s\n", strerror(errno)); - printf("See the following log for more infomration:\n"); + printf("See the following log for more information:\n"); printf("\t%s\n\n", err_log); exit(-1); } From 652fa1ad3ee4885649fbfeced56af6dc8c823b65 Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Fri, 15 Aug 2008 17:52:41 -0400 Subject: [PATCH 2/7] Fix failing test case, re: bug 38195. --- mysql-test/r/group_min_max.result | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/group_min_max.result b/mysql-test/r/group_min_max.result index 69e696849a5..d2b7e2042a6 100644 --- a/mysql-test/r/group_min_max.result +++ b/mysql-test/r/group_min_max.result @@ -2392,8 +2392,8 @@ a b 0 11 0 12 explain extended select sql_buffer_result a, max(b)+1 from t1 where a = 0 group by a; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range PRIMARY,index PRIMARY 4 NULL 5 Using where; Using index for group-by; Using temporary +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 range PRIMARY,index PRIMARY 4 NULL 6 83.33 Using where; Using index for group-by; Using temporary Warnings: Note 1003 select sql_buffer_result `test`.`t1`.`a` AS `a`,(max(`test`.`t1`.`b`) + 1) AS `max(b)+1` from `test`.`t1` where (`test`.`t1`.`a` = 0) group by `test`.`t1`.`a` drop table t1; From eb88db2485bf0eef3d59db08a7c4caf840c49d2f Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Mon, 18 Aug 2008 12:15:56 -0400 Subject: [PATCH 3/7] Fix for bug#36399: Double free bug when INFORMATION_SCHEMA plugin init function fails Problem: if an INFORMATION_SCHEMA plugin initialization fails we free some inner plugin's data (schema_table) twice during the INSTALL PLUGIN command. Fix: free it once. --- sql/sql_show.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 16a0342cb1f..005eea06e2e 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -6644,17 +6644,15 @@ int initialize_schema_table(st_plugin_int *plugin) { sql_print_error("Plugin '%s' init function returned error.", plugin->name.str); - goto err; + plugin->data= NULL; + my_free(schema_table, MYF(0)); + DBUG_RETURN(1); } /* Make sure the plugin name is not set inside the init() function. */ schema_table->table_name= plugin->name.str; } - DBUG_RETURN(0); -err: - my_free(schema_table, MYF(0)); - DBUG_RETURN(1); } int finalize_schema_table(st_plugin_int *plugin) From 747c3c2b2a7b9b592b1e39235f350d00e52319b4 Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Mon, 18 Aug 2008 13:06:27 -0400 Subject: [PATCH 4/7] Bug#30394: Empty HOME environment variable causes several utilities to crash Tilde expansion could fail when it was to expand to an empty string (such as when HOME is set to an empty string), especially on systems where size_t is unsigned. --- mysys/mf_pack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysys/mf_pack.c b/mysys/mf_pack.c index 915c11ec51d..0157a65311a 100644 --- a/mysys/mf_pack.c +++ b/mysys/mf_pack.c @@ -343,7 +343,7 @@ uint unpack_dirname(my_string to, const char *from) length-=(uint) (suffix-buff)-1; if (length+(h_length= (uint) strlen(tilde_expansion)) <= FN_REFLEN) { - if (tilde_expansion[h_length-1] == FN_LIBCHAR) + if ((h_length > 0) && (tilde_expansion[h_length-1] == FN_LIBCHAR)) h_length--; if (buff+h_length < suffix) bmove(buff+h_length,suffix,length); From 81470ec3e51f8374763aa52d93a1c8fac8339664 Mon Sep 17 00:00:00 2001 From: Chad MILLER Date: Mon, 18 Aug 2008 13:28:46 -0400 Subject: [PATCH 5/7] Bug#27526: BUILD/check_cpu misbehaving on Debian testing more clever gcc version checking. --- BUILD/check-cpu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD/check-cpu b/BUILD/check-cpu index 48a5b5371e3..4974d3f4ecc 100755 --- a/BUILD/check-cpu +++ b/BUILD/check-cpu @@ -169,7 +169,7 @@ check_cpu () { fi cc_ver=`$cc --version | sed 1q` - cc_verno=`echo $cc_ver | sed -e 's/^.*gcc/gcc/g; s/[^0-9. ]//g; s/^ *//g; s/ .*//g'` + cc_verno=`echo $cc_ver | sed -e 's/^.*(GCC)//g; s/[^0-9. ]//g; s/^ *//g; s/ .*//g'` set -- `echo $cc_verno | tr '.' ' '` cc_major=$1 cc_minor=$2 From 63f983aceb981ec5783fac5eb09c593b918cf85e Mon Sep 17 00:00:00 2001 From: Mattias Jonsson Date: Tue, 19 Aug 2008 11:44:22 +0200 Subject: [PATCH 6/7] Post push fix for valgrind warning in ha_partition.cc Bug#35161 Fixed memory leak when failing to open a partition. Bug#20129 Added tests for verifying REPAIR PARTITION. --- .../parts/t1_will_crash#P#p1_first_1024.MYD | Bin 0 -> 1024 bytes .../std_data/parts/t1_will_crash#P#p2.MYD | Bin 0 -> 336 bytes .../std_data/parts/t1_will_crash#P#p2.MYI | Bin 0 -> 4096 bytes .../std_data/parts/t1_will_crash#P#p3.MYI | Bin 0 -> 2048 bytes .../std_data/parts/t1_will_crash#P#p4.MYI | Bin 0 -> 4096 bytes .../std_data/parts/t1_will_crash#P#p6.MYD | Bin 0 -> 868 bytes .../std_data/parts/t1_will_crash#P#p6_2.MYD | Bin 0 -> 868 bytes .../std_data/parts/t1_will_crash#P#p6_3.MYD | Bin 0 -> 868 bytes .../parts/r/partition_recover_myisam.result | 56 +++ .../parts/r/partition_repair_myisam.result | 437 +++++++++++++++++- ...pt => partition_recover_myisam-master.opt} | 0 .../parts/t/partition_recover_myisam.test | 31 ++ .../parts/t/partition_repair_myisam.test | 214 ++++++++- sql/ha_partition.cc | 2 + 14 files changed, 724 insertions(+), 16 deletions(-) create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p1_first_1024.MYD create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p2.MYD create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p2.MYI create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p3.MYI create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p4.MYI create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p6.MYD create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p6_2.MYD create mode 100644 mysql-test/std_data/parts/t1_will_crash#P#p6_3.MYD create mode 100644 mysql-test/suite/parts/r/partition_recover_myisam.result rename mysql-test/suite/parts/t/{partition_repair_myisam-master.opt => partition_recover_myisam-master.opt} (100%) create mode 100644 mysql-test/suite/parts/t/partition_recover_myisam.test diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p1_first_1024.MYD b/mysql-test/std_data/parts/t1_will_crash#P#p1_first_1024.MYD new file mode 100644 index 0000000000000000000000000000000000000000..a1bb8f98f9187832b97aa4cc2cf9c198d07cd0ac GIT binary patch literal 1024 zcmZQ(@MB{5$DEjy%*epN-~hxq`FZIjsTC#U(hLmD5Hm|k%Q>iRW@>7xI~C0g1Nxmi z8w$L$vt_AgHj4oR!#`C+g`}eV?9@Dk@(du6k(!vIpqp%HU}U0@pQn(LSdy5QnFIC_ U0}JILPi~Bj>Z2^h59RO!0QyCm$^ZZW literal 0 HcmV?d00001 diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p2.MYD b/mysql-test/std_data/parts/t1_will_crash#P#p2.MYD new file mode 100644 index 0000000000000000000000000000000000000000..098d7a83a4af016a201489e0e753d188eabdea50 GIT binary patch literal 336 zcmZQ(@MB{5$DERy#>BwD-~hxq`FZIjsTC#U(hLmD5HrgvDmkfbW^!_}Kef%w$;lC? GnwbEbUwUN# literal 0 HcmV?d00001 diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p2.MYI b/mysql-test/std_data/parts/t1_will_crash#P#p2.MYI new file mode 100644 index 0000000000000000000000000000000000000000..7408554575127eea0a2eed835cab612d0938afbd GIT binary patch literal 4096 zcmeH}ziI+O5XQgHJIsm)F%Yn~^AUnYQrelqH#kjowvtr(GJ@$OPm%`;n(uaQMTBbw zVFq^o@67G5y5sSI$hgG;3;d!35J4JzIZ4-&n>p+J)QDvUO@Z&{jy8wOl}e*@!E8X9 zmu$K|{r>4+_FlxP<=WB`;X2lz3g^1ieLcK1C=)E5M$+g=(Bi~ zqpThw9k=JNvFoj#!{&Re5-iG$XpSOPZLDi2-~^n26L12zBQQZ$mZkR1;?6x6%MW?= kFMxzqRmluv@W=J%m%Lt#<~tWB-~^n26L11f;64fb10dfrUH||9 literal 0 HcmV?d00001 diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p3.MYI b/mysql-test/std_data/parts/t1_will_crash#P#p3.MYI new file mode 100644 index 0000000000000000000000000000000000000000..38150da0bb511b7511cc6ff4c326eaaae9ffa72d GIT binary patch literal 2048 zcmeHDxedZV5S+0sbI6tei6*E5LJEP98lW9AL?u*YGxtfhbpZ+4uC)K$?%oW;im3U( z3m1G)0fdtUIm#AgOcI-}h$$9%y-n+R&eCVh`T6crOz$UohAe%+0l(hFojxi>eb*84 zdubzO+iDa+2X2+mq#_QguhFsJC{WYEzYg1*V*sE09Hx6>$HlA;8)W+2olUpI7%&Em L0b{@z_&)<*B~CA) literal 0 HcmV?d00001 diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p4.MYI b/mysql-test/std_data/parts/t1_will_crash#P#p4.MYI new file mode 100644 index 0000000000000000000000000000000000000000..df7eee53a819338fe4be68ae7aba8f3b0c4302d1 GIT binary patch literal 4096 zcmeHIOG*Pl5Pg*naU=mhcz}UGz`Yw+3Aph9SqfohGEE=}>Wr?}_rmf)K8 zQ*@3ujOo#B^gVTbn%$YOJ3;GU1|%HrYS@JGmphu%k0j9@AC9qFsgn~%34Jk QPzIC%Wk4BF2L2@j-=Om;+5i9m literal 0 HcmV?d00001 diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p6.MYD b/mysql-test/std_data/parts/t1_will_crash#P#p6.MYD new file mode 100644 index 0000000000000000000000000000000000000000..10fd7d2fbce08f5773cf3b1e5b3a86acfa0b0758 GIT binary patch literal 868 zcmb`F%MJlC6o!9OmxXu&n-eQ`A}%|bJ+VMU>;`o$mC?jy<)J))CmW6##B3)$$vG!Y z+pmBBR-oq~5Sy*a0&qE%-Y<C^(D?}s8qonQD$jiHxT2|CXkXGy?+!{D zsV;Q#*T%>_8BKG~c#E}?l_CRfaXA8idh1o5bmI#W{WC_ezhOmc7#xr}sS|i3^$^p+WUopiTwXceZmH%c=Gyxq7ux z(nxino$nbV*JLzJ9OFzqC5t%*oWgPhzVuc~ylICIMEYky25siBS^Y?acjvz`q_@`K M0yg{aseg0e27GHh_W%F@ literal 0 HcmV?d00001 diff --git a/mysql-test/std_data/parts/t1_will_crash#P#p6_3.MYD b/mysql-test/std_data/parts/t1_will_crash#P#p6_3.MYD new file mode 100644 index 0000000000000000000000000000000000000000..fb8f1a0f687b5f5771505126e19b28df282f9b99 GIT binary patch literal 868 zcmb`Fy9&ZU5Jj(9R7Cs&o53oAg@}(%()%b>EbOAL&owJ?A!_AE`2l`ea5PnlKnNL_ zUD%yD_wKL)QwyOuomB~d!>P2lH}Y<>?ts9OnbqenR{zz_kv#^&0?l(Gis=1X>sn4k zpaQ#Ehrmbt--BHPAodK`7otWQln=hSsL8gBOR54)=M`4kPkTi*y-~NyV L9L}WbwCBJVwLvQH literal 0 HcmV?d00001 diff --git a/mysql-test/suite/parts/r/partition_recover_myisam.result b/mysql-test/suite/parts/r/partition_recover_myisam.result new file mode 100644 index 00000000000..df737ec2853 --- /dev/null +++ b/mysql-test/suite/parts/r/partition_recover_myisam.result @@ -0,0 +1,56 @@ +CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +# replacing t1.MYI with a corrupt + unclosed one created by doing: +# 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +Warnings: +Error 145 Table './test/t1_will_crash' is marked as crashed and should be repaired +Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired +Error 1034 1 client is using or hasn't closed the table properly +Error 1034 Size of indexfile is: 1024 Should be: 2048 +Error 1034 Size of datafile is: 77 Should be: 7 +Error 1034 Number of rows changed from 1 to 11 +DROP TABLE t1_will_crash; +CREATE TABLE t1_will_crash (a INT, KEY (a)) +ENGINE=MyISAM +PARTITION BY HASH(a) +PARTITIONS 3; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +# replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing: +# 'create table t1 (a int key(a)) partition by hash (a) partitions 3' +# head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +Warnings: +Error 145 Table './test/t1_will_crash#P#p1' is marked as crashed and should be repaired +Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired +Error 1034 1 client is using or hasn't closed the table properly +Error 1034 Size of indexfile is: 1024 Should be: 2048 +Error 1034 Size of datafile is: 28 Should be: 7 +Error 1034 Number of rows changed from 1 to 4 +DROP TABLE t1_will_crash; diff --git a/mysql-test/suite/parts/r/partition_repair_myisam.result b/mysql-test/suite/parts/r/partition_repair_myisam.result index df737ec2853..2d0a26b397c 100644 --- a/mysql-test/suite/parts/r/partition_repair_myisam.result +++ b/mysql-test/suite/parts/r/partition_repair_myisam.result @@ -1,8 +1,20 @@ +# REPAIR USE_FRM is not implemented for partitioned tables. +# test of non partitioned myisam for reference CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); FLUSH TABLES; # replacing t1.MYI with a corrupt + unclosed one created by doing: # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI +CHECK TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 77 Should be: 7 +test.t1_will_crash check error Corrupt +REPAIR TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 1 to 11 +test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 @@ -16,23 +28,70 @@ a 9 10 11 -Warnings: -Error 145 Table './test/t1_will_crash' is marked as crashed and should be repaired -Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired -Error 1034 1 client is using or hasn't closed the table properly -Error 1034 Size of indexfile is: 1024 Should be: 2048 -Error 1034 Size of datafile is: 77 Should be: 7 -Error 1034 Number of rows changed from 1 to 11 DROP TABLE t1_will_crash; +# test of check/repair of a damaged partition's MYI-file CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM -PARTITION BY HASH(a) +PARTITION BY HASH (a) PARTITIONS 3; INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); FLUSH TABLES; +# test with CHECK/REPAIR TABLE # replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing: # 'create table t1 (a int key(a)) partition by hash (a) partitions 3' # head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI +CHECK TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 28 Should be: 7 +test.t1_will_crash check error Partition p1 returned error +test.t1_will_crash check error Corrupt +REPAIR TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 1 to 4 +test.t1_will_crash repair status OK +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +FLUSH TABLES; +# test with ALTER TABLE ... CHECK/REPAIR PARTITION +# replacing t1_will_crash#P#p1.MYI with a corrupt + unclosed one +ALTER TABLE t1_will_crash CHECK PARTITION p0, p2; +Table Op Msg_type Msg_text +test.t1_will_crash check status OK +ALTER TABLE t1_will_crash CHECK PARTITION p0, p1; +Table Op Msg_type Msg_text +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 28 Should be: 7 +test.t1_will_crash check error Partition p1 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash CHECK PARTITION p1, p2; +Table Op Msg_type Msg_text +test.t1_will_crash check warning Table is marked as crashed +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 28 Should be: 7 +test.t1_will_crash check error Partition p1 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash REPAIR PARTITION p0, p2; +Table Op Msg_type Msg_text +test.t1_will_crash repair status OK +ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 1 to 4 +test.t1_will_crash repair status OK SELECT * FROM t1_will_crash; a 1 @@ -46,11 +105,359 @@ a 9 10 11 -Warnings: -Error 145 Table './test/t1_will_crash#P#p1' is marked as crashed and should be repaired -Error 1194 Table 't1_will_crash' is marked as crashed and should be repaired -Error 1034 1 client is using or hasn't closed the table properly -Error 1034 Size of indexfile is: 1024 Should be: 2048 -Error 1034 Size of datafile is: 28 Should be: 7 -Error 1034 Number of rows changed from 1 to 4 +DROP TABLE t1_will_crash; +# test of check/repair of a damaged subpartition's MYI-file +CREATE TABLE t1_will_crash (a INT, KEY (a)) +ENGINE=MyISAM +PARTITION BY RANGE (a) +SUBPARTITION BY HASH (a) +SUBPARTITIONS 2 +(PARTITION p0 VALUES LESS THAN (7), +PARTITION p1 VALUES LESS THAN MAXVALUE); +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +FLUSH TABLES; +# test with CHECK/REPAIR TABLE +# replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one +CHECK TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 14 Should be: 7 +test.t1_will_crash check error Subpartition p1sp0 returned error +test.t1_will_crash check error Corrupt +REPAIR TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 1 to 2 +test.t1_will_crash repair status OK +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +FLUSH TABLES; +# test with ALTER TABLE ... CHECK/REPAIR PARTITION +# replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one +ALTER TABLE t1_will_crash CHECK PARTITION p0; +Table Op Msg_type Msg_text +test.t1_will_crash check status OK +ALTER TABLE t1_will_crash CHECK PARTITION all; +Table Op Msg_type Msg_text +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 14 Should be: 7 +test.t1_will_crash check error Subpartition p1sp0 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash CHECK PARTITION p1; +Table Op Msg_type Msg_text +test.t1_will_crash check warning Table is marked as crashed +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check error Size of indexfile is: 1024 Should be: 2048 +test.t1_will_crash check warning Size of datafile is: 14 Should be: 7 +test.t1_will_crash check error Subpartition p1sp0 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash REPAIR PARTITION p0; +Table Op Msg_type Msg_text +test.t1_will_crash repair status OK +ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 1 to 2 +test.t1_will_crash repair status OK +SELECT * FROM t1_will_crash; +a +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +DROP TABLE t1_will_crash; +# test of check/repair of crashed partitions in variuos states +CREATE TABLE t1_will_crash ( +a VARCHAR(255), +b INT, +c LONGTEXT, +PRIMARY KEY (a, b)) +ENGINE=MyISAM +PARTITION BY HASH (b) +PARTITIONS 7; +SELECT COUNT(*) FROM t1_will_crash; +COUNT(*) +33 +SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7); +partition rows +0 2 +1 5 +2 5 +3 5 +4 4 +5 4 +6 8 +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a; +partition b a length(c) +0 0 lost 64 +0 7 z lost 64 +1 1 abc 64 +1 8 tuw 64 +1 29 kkkkkkkkKkk 64 +1 71 1 broken when head -c1024 on datafile 1024 +1 71 eee 64 +2 2 def 64 +2 9 vxy 64 +2 23 lll 64 +2 30 2 crashed after _mi_mark_changed 64 +2 79 ccc 64 +3 3 ghi 64 +3 10 aaa 64 +3 17 nnn 64 +3 24 3 crashed after write_record 64 +3 73 ddd 64 +4 4 pqr 64 +4 11 bbb 64 +4 18 4 crashed after flush_cached_blocks 64 +4 67 fff 64 +5 5 mno 64 +5 19 mmm 64 +5 40 5 still here since crash in next row in multirow insert? 64 +5 89 a 64 +6 6 jkl 64 +6 13 ooo 64 +6 27 6 row 7 (crash before completely written to datafile) 128 +6 34 6 row 2 64 +6 48 6 row 4 64 +6 62 6 row 6 64 +6 83 64 +6 97 zzzzzZzzzzz 64 +FLUSH TABLES; +# truncating p0 to simulate an empty datafile (not recovered!) +# replacing p1 with only the first 1024 bytes (not recovered!) +# replacing p3 with a crashed one at the last row in first insert +# (crashed right after *share->write_record()) +# replacing p6 with a crashed MYD file (1) (splitted dynamic record) +ANALYZE TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash analyze status OK +OPTIMIZE TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash optimize warning Number of rows changed from 8 to 7 +test.t1_will_crash optimize status OK +CHECK TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash check error Size of datafile is: 0 Should be: 164 +test.t1_will_crash check error Partition p0 returned error +test.t1_will_crash check error Corrupt +REPAIR TABLE t1_will_crash; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 2 to 0 +test.t1_will_crash repair info Found block that points outside data file at 344 +test.t1_will_crash repair warning Number of rows changed from 5 to 4 +test.t1_will_crash repair warning Number of rows changed from 0 to 5 +test.t1_will_crash repair status OK +SELECT COUNT(*) FROM t1_will_crash; +COUNT(*) +29 +SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7); +partition rows +1 4 +2 5 +3 5 +4 4 +5 4 +6 7 +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a; +partition b a length(c) +1 1 abc 64 +1 8 tuw 64 +1 29 kkkkkkkkKkk 64 +1 71 eee 64 +2 2 def 64 +2 9 vxy 64 +2 23 lll 64 +2 30 2 crashed after _mi_mark_changed 64 +2 79 ccc 64 +3 3 ghi 64 +3 10 aaa 64 +3 17 nnn 64 +3 24 3 crashed after write_record 64 +3 73 ddd 64 +4 4 pqr 64 +4 11 bbb 64 +4 18 4 crashed after flush_cached_blocks 64 +4 67 fff 64 +5 5 mno 64 +5 19 mmm 64 +5 40 5 still here since crash in next row in multirow insert? 64 +5 89 a 64 +6 6 jkl 64 +6 13 ooo 64 +6 34 6 row 2 64 +6 48 6 row 4 64 +6 62 6 row 6 64 +6 83 64 +6 97 zzzzzZzzzzz 64 +FLUSH TABLES; +# +# replacing p2 with crashed files (after _mi_mark_changed) +ALTER TABLE t1_will_crash CHECK PARTITION p2; +Table Op Msg_type Msg_text +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check status OK +# crash was when index only marked as opened, no real corruption +ALTER TABLE t1_will_crash CHECK PARTITION p2; +Table Op Msg_type Msg_text +test.t1_will_crash check status OK +FLUSH TABLES; +# +# replacing p4 with updated but not closed index file +ALTER TABLE t1_will_crash OPTIMIZE PARTITION p4; +Table Op Msg_type Msg_text +test.t1_will_crash optimize error Found key at page 2048 that points to record outside datafile +test.t1_will_crash optimize error Partition p4 returned error +test.t1_will_crash optimize status Operation failed +ALTER TABLE t1_will_crash CHECK PARTITION p4; +Table Op Msg_type Msg_text +test.t1_will_crash check warning Table is marked as crashed and last repair failed +test.t1_will_crash check warning 1 client is using or hasn't closed the table properly +test.t1_will_crash check warning Size of datafile is: 368 Should be: 252 +test.t1_will_crash check error Found 4 keys of 3 +test.t1_will_crash check error Partition p4 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash REPAIR PARTITION p4; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 3 to 4 +test.t1_will_crash repair status OK +FLUSH TABLES; +# +# replacing p6 with a crashed MYD file (2) (splitted dynamic record) +ALTER TABLE t1_will_crash CHECK PARTITION p6; +Table Op Msg_type Msg_text +test.t1_will_crash check warning Size of datafile is: 868 Should be: 604 +test.t1_will_crash check error Unexpected byte: 0 at link: 340 +test.t1_will_crash check error Partition p6 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash REPAIR PARTITION p6; +Table Op Msg_type Msg_text +test.t1_will_crash repair info Delete link points outside datafile at 340 +test.t1_will_crash repair info Delete link points outside datafile at 340 +test.t1_will_crash repair status OK +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash +WHERE (b % 7) = 6 +ORDER BY partition, b, a; +partition b a length(c) +6 6 jkl 64 +6 13 ooo 64 +6 34 6 row 2 64 +6 48 6 row 4 64 +6 62 6 row 6 64 +6 83 64 +6 97 zzzzzZzzzzz 64 +FLUSH TABLES; +# +# replacing p6 with a crashed MYD file (3) (splitted dynamic record) +# Different results from the corrupt table, which can lead to dropping +# of the not completely written rows when using REBUILD on a corrupt +# table, depending if one reads via index or direct on datafile. +# Since crash when reuse of deleted row space, CHECK MEDIUM or EXTENDED +# is required (MEDIUM is default) to verify correct behavior! +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash +WHERE (b % 7) = 6 +ORDER BY partition, b, a; +partition b a length(c) +6 6 jkl 64 +6 13 ooo 64 +6 34 6 row 2 64 +6 83 64 +6 97 zzzzzZzzzzz 64 +SELECT (b % 7) AS partition, b, a FROM (SELECT b,a FROM t1_will_crash) q +WHERE (b % 7) = 6 +ORDER BY partition, b, a; +partition b a +6 6 jkl +6 13 ooo +6 34 6 row 2 +6 48 6 row 4 +6 62 6 row 6 +6 83 +6 97 zzzzzZzzzzz +ALTER TABLE t1_will_crash CHECK PARTITION p6; +Table Op Msg_type Msg_text +test.t1_will_crash check warning Size of datafile is: 868 Should be: 604 +test.t1_will_crash check error Record-count is not ok; is 8 Should be: 7 +test.t1_will_crash check warning Found 10 key parts. Should be: 7 +test.t1_will_crash check error Partition p6 returned error +test.t1_will_crash check error Corrupt +ALTER TABLE t1_will_crash REPAIR PARTITION p6; +Table Op Msg_type Msg_text +test.t1_will_crash repair warning Number of rows changed from 7 to 8 +test.t1_will_crash repair status OK +SELECT COUNT(*) FROM t1_will_crash; +COUNT(*) +29 +SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7); +partition rows +1 4 +2 4 +3 5 +4 4 +5 4 +6 8 +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a; +partition b a length(c) +1 1 abc 64 +1 8 tuw 64 +1 29 kkkkkkkkKkk 64 +1 71 eee 64 +2 2 def 64 +2 9 vxy 64 +2 23 lll 64 +2 79 ccc 64 +3 3 ghi 64 +3 10 aaa 64 +3 17 nnn 64 +3 24 3 crashed after write_record 64 +3 73 ddd 64 +4 4 pqr 64 +4 11 bbb 64 +4 18 4 crashed after flush_cached_blocks 64 +4 67 fff 64 +5 5 mno 64 +5 19 mmm 64 +5 40 5 still here since crash in next row in multirow insert? 64 +5 89 a 64 +6 6 jkl 64 +6 13 ooo 64 +6 27 6 row 7 (crash before completely written to datafile) 128 +6 34 6 row 2 64 +6 48 6 row 4 64 +6 62 6 row 6 64 +6 83 64 +6 97 zzzzzZzzzzz 64 +ALTER TABLE t1_will_crash CHECK PARTITION all EXTENDED; +Table Op Msg_type Msg_text +test.t1_will_crash check status OK DROP TABLE t1_will_crash; diff --git a/mysql-test/suite/parts/t/partition_repair_myisam-master.opt b/mysql-test/suite/parts/t/partition_recover_myisam-master.opt similarity index 100% rename from mysql-test/suite/parts/t/partition_repair_myisam-master.opt rename to mysql-test/suite/parts/t/partition_recover_myisam-master.opt diff --git a/mysql-test/suite/parts/t/partition_recover_myisam.test b/mysql-test/suite/parts/t/partition_recover_myisam.test new file mode 100644 index 00000000000..69e45b3ef3c --- /dev/null +++ b/mysql-test/suite/parts/t/partition_recover_myisam.test @@ -0,0 +1,31 @@ +# test the auto-recover (--myisam-recover) of partitioned myisam tables +--source include/have_partition.inc +--disable_warnings +--disable_query_log +drop table if exists t1_will_crash; +--enable_query_log +--enable_warnings + + +CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +--echo # replacing t1.MYI with a corrupt + unclosed one created by doing: +--echo # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI +--copy_file std_data/corrupt_t1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI +SELECT * FROM t1_will_crash; +DROP TABLE t1_will_crash; +CREATE TABLE t1_will_crash (a INT, KEY (a)) +ENGINE=MyISAM +PARTITION BY HASH(a) +PARTITIONS 3; +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +FLUSH TABLES; +--echo # replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing: +--echo # 'create table t1 (a int key(a)) partition by hash (a) partitions 3' +--echo # head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +SELECT * FROM t1_will_crash; +DROP TABLE t1_will_crash; diff --git a/mysql-test/suite/parts/t/partition_repair_myisam.test b/mysql-test/suite/parts/t/partition_repair_myisam.test index 551d344f60e..4c4cb21b848 100644 --- a/mysql-test/suite/parts/t/partition_repair_myisam.test +++ b/mysql-test/suite/parts/t/partition_repair_myisam.test @@ -1,3 +1,4 @@ +# test of check/repair of partitioned myisam tables --source include/have_partition.inc --disable_warnings --disable_query_log @@ -5,7 +6,9 @@ drop table if exists t1_will_crash; --enable_query_log --enable_warnings +--echo # REPAIR USE_FRM is not implemented for partitioned tables. +--echo # test of non partitioned myisam for reference CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); FLUSH TABLES; @@ -13,18 +16,227 @@ FLUSH TABLES; --echo # 'create table t1 (a int key(a))' head -c1024 t1.MYI > corrupt_t1.MYI --remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI --copy_file std_data/corrupt_t1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash.MYI +CHECK TABLE t1_will_crash; +REPAIR TABLE t1_will_crash; SELECT * FROM t1_will_crash; DROP TABLE t1_will_crash; + +--echo # test of check/repair of a damaged partition's MYI-file CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM -PARTITION BY HASH(a) +PARTITION BY HASH (a) PARTITIONS 3; INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); FLUSH TABLES; +--echo # test with CHECK/REPAIR TABLE --echo # replacing t1#P#p1.MYI with a corrupt + unclosed one created by doing: --echo # 'create table t1 (a int key(a)) partition by hash (a) partitions 3' --echo # head -c1024 t1#P#p1.MYI > corrupt_t1#P#p1.MYI --remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI --copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +CHECK TABLE t1_will_crash; +REPAIR TABLE t1_will_crash; +SELECT * FROM t1_will_crash; +FLUSH TABLES; +--echo # test with ALTER TABLE ... CHECK/REPAIR PARTITION +--echo # replacing t1_will_crash#P#p1.MYI with a corrupt + unclosed one +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYI +ALTER TABLE t1_will_crash CHECK PARTITION p0, p2; +ALTER TABLE t1_will_crash CHECK PARTITION p0, p1; +ALTER TABLE t1_will_crash CHECK PARTITION p1, p2; +ALTER TABLE t1_will_crash REPAIR PARTITION p0, p2; +ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1; SELECT * FROM t1_will_crash; DROP TABLE t1_will_crash; + +--echo # test of check/repair of a damaged subpartition's MYI-file +CREATE TABLE t1_will_crash (a INT, KEY (a)) +ENGINE=MyISAM +PARTITION BY RANGE (a) +SUBPARTITION BY HASH (a) +SUBPARTITIONS 2 +(PARTITION p0 VALUES LESS THAN (7), + PARTITION p1 VALUES LESS THAN MAXVALUE); +INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); +SELECT * FROM t1_will_crash; +FLUSH TABLES; +--echo # test with CHECK/REPAIR TABLE +--echo # replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1#SP#p1sp0.MYI +--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1#SP#p1sp0.MYI +CHECK TABLE t1_will_crash; +REPAIR TABLE t1_will_crash; +SELECT * FROM t1_will_crash; +FLUSH TABLES; +--echo # test with ALTER TABLE ... CHECK/REPAIR PARTITION +--echo # replacing t1_will_crash#P#p1#SP#p1sp0.MYI with a corrupt + unclosed one +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1#SP#p1sp0.MYI +--copy_file std_data/corrupt_t1#P#p1.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1#SP#p1sp0.MYI +ALTER TABLE t1_will_crash CHECK PARTITION p0; +ALTER TABLE t1_will_crash CHECK PARTITION all; +ALTER TABLE t1_will_crash CHECK PARTITION p1; +ALTER TABLE t1_will_crash REPAIR PARTITION p0; +ALTER TABLE t1_will_crash REPAIR PARTITION p0, p1; +SELECT * FROM t1_will_crash; +DROP TABLE t1_will_crash; + +--echo # test of check/repair of crashed partitions in variuos states +CREATE TABLE t1_will_crash ( + a VARCHAR(255), + b INT, + c LONGTEXT, + PRIMARY KEY (a, b)) +ENGINE=MyISAM +PARTITION BY HASH (b) +PARTITIONS 7; + +# creating a longer string for for filling the records +let $i= 3; +let $lt= longtext; +while ($i>0) +{ + let $lt= $lt$lt; + dec $i; +} + +# Tests (mapped to partition) +# Partition +# 0 - truncated datafile (size = 0 bytes) +# 1 - head -c 1024 of datafile (simulates crashed write) +# 2 - after _mi_mark_file_changed (only marked index as opened) +# 3 - after write_record (updated datafile + not closed/updated index) +# 4 - after flush_cached_blocks (updated index/datafiles, not closed index) +# 5 - (Not used) after mi_state_info_write (fully uppdated/closed index file) +# (this was verified to be a harmless crash, since everything was written) +# 6 - partly updated datafile (insert 6 small records, delete 5,3,1, +# insert one larger record (2.5 X small) and break in gdb before it has +# been completely written (in write_dynamic_record) +# (done with 3 different MYD files, since it also affects +# the delete-linked-list) + +--disable_query_log +eval INSERT INTO t1_will_crash VALUES + ('abc', 1, '$lt'), ('def', 2, '$lt'), ('ghi', 3, '$lt'), ('jkl', 6, '$lt'), + ('mno', 5, '$lt'), ('pqr', 4, '$lt'), ('tuw', 8, '$lt'), ('vxy', 9, '$lt'), + ('z lost', 7, '$lt'), ('aaa', 10, '$lt'), ('bbb', 11, '$lt'), + ('zzzzzZzzzzz', 97, '$lt'), ('a', 89, '$lt'), (' ', 83, '$lt'), + ('ccc', 79, '$lt'), ('ddd', 73, '$lt'), ('eee', 71, '$lt'), + ('fff', 67, '$lt'), ('ooo', 13, '$lt'), ('nnn', 17, '$lt'), + ('mmm', 19, '$lt'), ('lll', 23, '$lt'), ('kkkkkkkkKkk', 29, '$lt'), + (' lost', 0, '$lt'), ('1 broken when head -c1024 on datafile', 71, + '$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt$lt'), + ('3 crashed after write_record', 24, '$lt'); +eval INSERT INTO t1_will_crash VALUES + ('2 crashed after _mi_mark_changed', 30, '$lt'); +# if crashed here, part p5 would need to be repaired before next statement +# but since we use pre fabricated crashed files, we can skip that here. +eval INSERT INTO t1_will_crash VALUES + ('5 still here since crash in next row in multirow insert?', 40, '$lt'), + ('4 crashed after flush_cached_blocks', 18, '$lt'); +# There is no write after mi_state_info_write, so this is not tested. +#eval INSERT INTO t1_will_crash VALUES +# ('5 crashed after mi_state_info_write', 12, '$lt'); +eval INSERT INTO t1_will_crash VALUES + ('6 row 1', 27, '$lt'), ('6 row 2', 34, '$lt'), + ('6 row 3', 41, '$lt'), ('6 row 4', 48, '$lt'), + ('6 row 5', 55, '$lt'), ('6 row 6', 62, '$lt'); +DELETE FROM t1_will_crash WHERE b in (27, 55); +DELETE FROM t1_will_crash WHERE b = 41; +eval INSERT INTO t1_will_crash VALUES + ('6 row 7 (crash before completely written to datafile)', 27, '$lt$lt'); +--enable_query_log +SELECT COUNT(*) FROM t1_will_crash; +SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7); +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a; +FLUSH TABLES; +# testing p0, p1, p3, p6(1) +--echo # truncating p0 to simulate an empty datafile (not recovered!) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p0.MYD +--write_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p0.MYD +EOF + +--echo # replacing p1 with only the first 1024 bytes (not recovered!) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYD +--copy_file std_data/parts/t1_will_crash#P#p1_first_1024.MYD $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p1.MYD + +--echo # replacing p3 with a crashed one at the last row in first insert +--echo # (crashed right after *share->write_record()) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p3.MYI +--copy_file std_data/parts/t1_will_crash#P#p3.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p3.MYI + +--echo # replacing p6 with a crashed MYD file (1) (splitted dynamic record) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p6.MYD +--copy_file std_data/parts/t1_will_crash#P#p6.MYD $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p6.MYD +ANALYZE TABLE t1_will_crash; +OPTIMIZE TABLE t1_will_crash; +CHECK TABLE t1_will_crash; +REPAIR TABLE t1_will_crash; +SELECT COUNT(*) FROM t1_will_crash; +SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7); +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a; +FLUSH TABLES; + +# testing p2, p4, p6(2, 3) +--echo # +--echo # replacing p2 with crashed files (after _mi_mark_changed) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p2.MYI +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p2.MYD +--copy_file std_data/parts/t1_will_crash#P#p2.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p2.MYI +--copy_file std_data/parts/t1_will_crash#P#p2.MYD $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p2.MYD +ALTER TABLE t1_will_crash CHECK PARTITION p2; +--echo # crash was when index only marked as opened, no real corruption +ALTER TABLE t1_will_crash CHECK PARTITION p2; +FLUSH TABLES; + +--echo # +--echo # replacing p4 with updated but not closed index file +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p4.MYI +--copy_file std_data/parts/t1_will_crash#P#p4.MYI $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p4.MYI +#SHOW TABLE STATUS like 't1_will_crash'; +#ALTER TABLE t1_will_crash ANALYZE PARTITION p4; +#SHOW TABLE STATUS like 't1_will_crash'; +ALTER TABLE t1_will_crash OPTIMIZE PARTITION p4; +#SHOW TABLE STATUS like 't1_will_crash'; +ALTER TABLE t1_will_crash CHECK PARTITION p4; +#SHOW TABLE STATUS like 't1_will_crash'; +ALTER TABLE t1_will_crash REPAIR PARTITION p4; +#SHOW TABLE STATUS like 't1_will_crash'; +FLUSH TABLES; + +--echo # +--echo # replacing p6 with a crashed MYD file (2) (splitted dynamic record) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p6.MYD +--copy_file std_data/parts/t1_will_crash#P#p6_2.MYD $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p6.MYD +#ALTER TABLE t1_will_crash OPTIMIZE PARTITION p6; +ALTER TABLE t1_will_crash CHECK PARTITION p6; +ALTER TABLE t1_will_crash REPAIR PARTITION p6; +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash +WHERE (b % 7) = 6 +ORDER BY partition, b, a; +FLUSH TABLES; + +--echo # +--echo # replacing p6 with a crashed MYD file (3) (splitted dynamic record) +--remove_file $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p6.MYD +--copy_file std_data/parts/t1_will_crash#P#p6_3.MYD $MYSQLTEST_VARDIR/master-data/test/t1_will_crash#P#p6.MYD +--echo # Different results from the corrupt table, which can lead to dropping +--echo # of the not completely written rows when using REBUILD on a corrupt +--echo # table, depending if one reads via index or direct on datafile. +--echo # Since crash when reuse of deleted row space, CHECK MEDIUM or EXTENDED +--echo # is required (MEDIUM is default) to verify correct behavior! +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash +WHERE (b % 7) = 6 +ORDER BY partition, b, a; +SELECT (b % 7) AS partition, b, a FROM (SELECT b,a FROM t1_will_crash) q +WHERE (b % 7) = 6 +ORDER BY partition, b, a; +# NOTE: REBUILD PARTITION without CHECK before, 2 + (1) records will be lost! +#ALTER TABLE t1_will_crash REBUILD PARTITION p6; +ALTER TABLE t1_will_crash CHECK PARTITION p6; +ALTER TABLE t1_will_crash REPAIR PARTITION p6; +SELECT COUNT(*) FROM t1_will_crash; +SELECT (b % 7) AS partition, COUNT(*) AS rows FROM t1_will_crash GROUP BY (b % 7); +SELECT (b % 7) AS partition, b, a, length(c) FROM t1_will_crash ORDER BY partition, b, a; +ALTER TABLE t1_will_crash CHECK PARTITION all EXTENDED; +DROP TABLE t1_will_crash; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index af3ee000874..40f0a3ed869 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -2494,6 +2494,8 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked) err_handler: while (file-- != m_file) (*file)->close(); + if (!is_clone) + bitmap_free(&(m_part_info->used_partitions)); DBUG_RETURN(error); } From 4b2dd02552a30e5af04d32e474fa595a637a268e Mon Sep 17 00:00:00 2001 From: Georgi Kodinov Date: Tue, 19 Aug 2008 13:36:24 +0300 Subject: [PATCH 7/7] Bug#38195: Incorrect handling of aggregate functions when loose index scan is used causes server crash. Revert the fix : unstable test case revealed by pushbuild --- mysql-test/r/group_min_max.result | 25 ------------------------- mysql-test/t/group_min_max.test | 12 ------------ sql/sql_select.cc | 5 +---- 3 files changed, 1 insertion(+), 41 deletions(-) diff --git a/mysql-test/r/group_min_max.result b/mysql-test/r/group_min_max.result index c417a8d3528..5982931e677 100644 --- a/mysql-test/r/group_min_max.result +++ b/mysql-test/r/group_min_max.result @@ -2353,28 +2353,3 @@ a MIN(b) MAX(b) AVG(b) 2 1 3 2.0000 1 1 3 2.0000 DROP TABLE t1; -create table t1 (a int, b int, primary key (a,b), key `index` (a,b)) engine=MyISAM; -insert into t1 (a,b) values (0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7), -(0,8),(0,9),(0,10),(0,11); -insert into t1 (a,b) select a, max(b)+1 from t1 where a = 0 group by a; -select * from t1; -a b -0 0 -0 1 -0 2 -0 3 -0 4 -0 5 -0 6 -0 7 -0 8 -0 9 -0 10 -0 11 -0 12 -explain extended select sql_buffer_result a, max(b)+1 from t1 where a = 0 group by a; -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 range PRIMARY,index PRIMARY 4 NULL 5 Using where; Using index for group-by; Using temporary -Warnings: -Note 1003 select sql_buffer_result `test`.`t1`.`a` AS `a`,(max(`test`.`t1`.`b`) + 1) AS `max(b)+1` from `test`.`t1` where (`test`.`t1`.`a` = 0) group by `test`.`t1`.`a` -drop table t1; diff --git a/mysql-test/t/group_min_max.test b/mysql-test/t/group_min_max.test index 60a80ecf9d5..7f2607b513d 100644 --- a/mysql-test/t/group_min_max.test +++ b/mysql-test/t/group_min_max.test @@ -916,15 +916,3 @@ SELECT a, MIN(b), MAX(b), AVG(b) FROM t1 GROUP BY a ORDER BY a DESC; SELECT a, MIN(b), MAX(b), AVG(b) FROM t1 GROUP BY a ORDER BY a DESC; DROP TABLE t1; - -# -# Bug#38195: Incorrect handling of aggregate functions when loose index scan is -# used causes server crash. -# -create table t1 (a int, b int, primary key (a,b), key `index` (a,b)) engine=MyISAM; -insert into t1 (a,b) values (0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7), -(0,8),(0,9),(0,10),(0,11); -insert into t1 (a,b) select a, max(b)+1 from t1 where a = 0 group by a; -select * from t1; -explain extended select sql_buffer_result a, max(b)+1 from t1 where a = 0 group by a; -drop table t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 6928effc1a5..6de4b296d34 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1724,8 +1724,7 @@ JOIN::exec() if (!items1) { items1= items0 + all_fields.elements; - if (sort_and_group || curr_tmp_table->group || - tmp_table_param.precomputed_group_by) + if (sort_and_group || curr_tmp_table->group) { if (change_to_use_tmp_fields(thd, items1, tmp_fields_list1, tmp_all_fields1, @@ -9260,8 +9259,6 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List &fields, MI_COLUMNDEF *recinfo; uint total_uneven_bit_length= 0; bool force_copy_fields= param->force_copy_fields; - /* Treat sum functions as normal ones when loose index scan is used. */ - save_sum_fields|= param->precomputed_group_by; DBUG_ENTER("create_tmp_table"); DBUG_PRINT("enter",("distinct: %d save_sum_fields: %d rows_limit: %lu group: %d", (int) distinct, (int) save_sum_fields,