From: Bjorn Munch Date: September 20 2010 9:18am Subject: bzr push into mysql-5.5-mtr branch (bjorn.munch:3087 to 3091) List-Archive: http://lists.mysql.com/commits/118575 Message-Id: <201009200918.o8K9IfSF029270@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0745588413==" --===============0745588413== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3091 Bjorn Munch 2010-09-20 small test fix after 56753 modified: mysql-test/suite/sys_vars/t/div_precision_increment_func.test 3090 Bjorn Munch 2010-09-20 Bug #56787 MTR completion report should be more informative Added counts of skipped test, inclusing how many by test itself Also fixed misspelling in the (hitherto unused) variable name modified: mysql-test/lib/mtr_report.pm 3089 Bjorn Munch 2010-09-20 [merge] upmerge 56753 modified: client/mysqltest.cc mysql-test/r/mysqltest.result mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test mysql-test/t/mysqltest.test 3088 Bjorn Munch 2010-09-20 [merge] merge from 5.5 added: mysql-test/include/ctype_filesort2.inc modified: client/CMakeLists.txt client/sql_string.cc configure.in include/CMakeLists.txt include/Makefile.am include/m_ctype.h mysql-test/r/ctype_utf16.result mysql-test/r/ctype_utf32.result mysql-test/r/ctype_utf8mb4.result mysql-test/r/func_if.result mysql-test/r/sp-destruct.result mysql-test/t/ctype_utf16.test mysql-test/t/ctype_utf32.test mysql-test/t/ctype_utf8mb4.test mysql-test/t/func_if.test mysql-test/t/sp-destruct.test scripts/CMakeLists.txt scripts/make_win_bin_dist sql/CMakeLists.txt sql/field.cc sql/item_cmpfunc.cc sql/mdl.cc sql/mdl.h sql/sp.cc sql/sql_base.cc sql/sql_base.h sql/sql_string.cc sql/table.cc strings/ctype-ucs2.c strings/ctype-utf8.c 3087 Bjorn Munch 2010-09-14 [merge] upmerge 55426(55546), 56647 modified: client/mysqltest.cc === modified file 'client/CMakeLists.txt' --- a/client/CMakeLists.txt 2010-08-12 15:19:57 +0000 +++ b/client/CMakeLists.txt 2010-09-06 11:26:23 +0000 @@ -64,7 +64,10 @@ MYSQL_ADD_EXECUTABLE(mysqlslap mysqlslap SET_SOURCE_FILES_PROPERTIES(mysqlslap.c PROPERTIES COMPILE_FLAGS "-DTHREADS") TARGET_LINK_LIBRARIES(mysqlslap mysqlclient) -ADD_EXECUTABLE(echo echo.c) +# "WIN32" also covers 64 bit. "echo" is used in some files below "mysql-test/". +IF(WIN32) + MYSQL_ADD_EXECUTABLE(echo echo.c) +ENDIF(WIN32) SET_TARGET_PROPERTIES (mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysqlslap PROPERTIES HAS_CXX TRUE) === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-09-14 12:19:51 +0000 +++ b/client/mysqltest.cc 2010-09-20 08:08:32 +0000 @@ -2185,8 +2185,14 @@ void var_query_set(VAR *var, const char DBUG_ENTER("var_query_set"); LINT_INIT(res); + /* Only white space or ) allowed past ending ` */ while (end > query && *end != '`') + { + if (*end && (*end != ' ' && *end != '\t' && *end != '\n' && *end != ')')) + die("Spurious text after `query` expression"); --end; + } + if (query == end) die("Syntax error in query, missing '`'"); ++query; === modified file 'client/sql_string.cc' --- a/client/sql_string.cc 2010-07-09 12:28:51 +0000 +++ b/client/sql_string.cc 2010-08-25 15:57:53 +0000 @@ -31,9 +31,12 @@ ** String functions *****************************************************************************/ -bool String::real_alloc(uint32 arg_length) +bool String::real_alloc(uint32 length) { - arg_length=ALIGN_SIZE(arg_length+1); + uint32 arg_length= ALIGN_SIZE(length + 1); + DBUG_ASSERT(arg_length > length); + if (arg_length <= length) + return TRUE; /* Overflow */ str_length=0; if (Alloced_length < arg_length) { @@ -56,6 +59,9 @@ bool String::real_alloc(uint32 arg_lengt bool String::realloc(uint32 alloc_length) { uint32 len=ALIGN_SIZE(alloc_length+1); + DBUG_ASSERT(len > alloc_length); + if (len <= alloc_length) + return TRUE; /* Overflow */ if (Alloced_length < len) { char *new_ptr; === modified file 'configure.in' --- a/configure.in 2010-08-25 14:05:33 +0000 +++ b/configure.in 2010-09-10 18:48:13 +0000 @@ -27,7 +27,7 @@ dnl dnl When changing the major version number please also check the switch dnl statement in mysqlbinlog::check_master_version(). You may also need dnl to update version.c in ndb. -AC_INIT([MySQL Server], [5.5.7-m3], [], [mysql]) +AC_INIT([MySQL Server], [5.5.7-rc], [], [mysql]) AC_CONFIG_SRCDIR([sql/mysqld.cc]) AC_CANONICAL_SYSTEM === modified file 'include/CMakeLists.txt' --- a/include/CMakeLists.txt 2010-08-12 15:19:57 +0000 +++ b/include/CMakeLists.txt 2010-08-31 14:33:19 +0000 @@ -54,6 +54,7 @@ SET(HEADERS keycache.h m_ctype.h my_attribute.h + my_compiler.h ${HEADERS_GEN_CONFIGURE} ) === modified file 'include/Makefile.am' --- a/include/Makefile.am 2010-08-16 12:50:27 +0000 +++ b/include/Makefile.am 2010-09-10 18:48:13 +0000 @@ -32,8 +32,9 @@ pkginclude_HEADERS = $(HEADERS_ABI) my_d decimal.h errmsg.h my_global.h my_net.h \ my_getopt.h sslopt-longopts.h my_dir.h \ sslopt-vars.h sslopt-case.h sql_common.h keycache.h \ - m_ctype.h my_attribute.h $(HEADERS_GEN_CONFIGURE) \ - $(HEADERS_GEN_MAKE) probes_mysql.h probes_mysql_nodtrace.h + m_ctype.h my_attribute.h my_compiler.h \ + $(HEADERS_GEN_CONFIGURE) $(HEADERS_GEN_MAKE) \ + probes_mysql.h probes_mysql_nodtrace.h noinst_HEADERS = lf.h my_bit.h \ heap.h my_bitmap.h my_uctype.h password.h \ @@ -47,7 +48,7 @@ noinst_HEADERS = lf.h my_bit.h \ my_user.h my_atomic.h atomic/nolock.h \ atomic/rwlock.h atomic/x86-gcc.h atomic/generic-msvc.h \ atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h \ - atomic/solaris.h mysql/innodb_priv.h my_compiler.h + atomic/solaris.h mysql/innodb_priv.h pkgpsiinclude_HEADERS = mysql/psi/psi.h mysql/psi/mysql_thread.h \ mysql/psi/mysql_file.h === modified file 'include/m_ctype.h' --- a/include/m_ctype.h 2010-03-31 14:05:33 +0000 +++ b/include/m_ctype.h 2010-08-31 14:22:03 +0000 @@ -539,6 +539,11 @@ size_t my_strnxfrm_unicode(CHARSET_INFO uchar *dst, size_t dstlen, const uchar *src, size_t srclen); +size_t my_strnxfrm_unicode_full_bin(CHARSET_INFO *, + uchar *dst, size_t dstlen, + const uchar *src, size_t srclen); +size_t my_strnxfrmlen_unicode_full_bin(CHARSET_INFO *, size_t); + int my_wildcmp_unicode(CHARSET_INFO *cs, const char *str, const char *str_end, const char *wildstr, const char *wildend, === added file 'mysql-test/include/ctype_filesort2.inc' --- a/mysql-test/include/ctype_filesort2.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/ctype_filesort2.inc 2010-08-31 14:22:03 +0000 @@ -0,0 +1,16 @@ +# +# Testing filesort for full Unicode character sets +# with supplementary characters. +# + +--echo # +--echo # Bug#55980 Character sets: supplementary character _bin ordering is wrong +--echo # +CREATE TABLE t1 AS SELECT REPEAT('a',1) AS a LIMIT 0; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (_utf8mb4 0xEFBE9D),(_utf8mb4 0xF0908E84); +INSERT INTO t1 VALUES (_utf8mb4 0xCE85),(_utf8mb4 0xF4808080); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +ALTER TABLE t1 ADD KEY(a); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +DROP TABLE IF EXISTS t1; === modified file 'mysql-test/lib/mtr_report.pm' --- a/mysql-test/lib/mtr_report.pm 2010-06-10 08:34:16 +0000 +++ b/mysql-test/lib/mtr_report.pm 2010-09-20 08:12:39 +0000 @@ -229,7 +229,8 @@ sub mtr_report_stats ($$;$) { # Find out how we where doing # ---------------------------------------------------------------------- - my $tot_skiped= 0; + my $tot_skipped= 0; + my $tot_skipdetect= 0; my $tot_passed= 0; my $tot_failed= 0; my $tot_tests= 0; @@ -246,8 +247,9 @@ sub mtr_report_stats ($$;$) { } elsif ( $tinfo->{'result'} eq 'MTR_RES_SKIPPED' ) { - # Test was skipped - $tot_skiped++; + # Test was skipped (disabled not counted) + $tot_skipped++ unless $tinfo->{'disable'}; + $tot_skipdetect++ if $tinfo->{'skip_detected_by_test'}; } elsif ( $tinfo->{'result'} eq 'MTR_RES_PASSED' ) { @@ -376,6 +378,9 @@ sub mtr_report_stats ($$;$) { print "All $tot_tests tests were successful.\n\n"; } + print "$tot_skipped tests were skipped, ". + "$tot_skipdetect by the test itself.\n\n" if $tot_skipped; + if ( $tot_failed != 0 || $found_problems) { mtr_error("there were failing test cases") unless $dont_error; === modified file 'mysql-test/r/ctype_utf16.result' --- a/mysql-test/r/ctype_utf16.result 2010-06-02 12:23:50 +0000 +++ b/mysql-test/r/ctype_utf16.result 2010-08-31 14:22:03 +0000 @@ -611,6 +611,31 @@ utf16_bin 00610009 utf16_bin 0061 utf16_bin 00610020 drop table t1; +# +# Bug#55980 Character sets: supplementary character _bin ordering is wrong +# +CREATE TABLE t1 AS SELECT REPEAT('a',1) AS a LIMIT 0; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(1) CHARACTER SET utf16 COLLATE utf16_bin NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (_utf8mb4 0xEFBE9D),(_utf8mb4 0xF0908E84); +INSERT INTO t1 VALUES (_utf8mb4 0xCE85),(_utf8mb4 0xF4808080); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +HEX(a) HEX(CONVERT(a USING utf8mb4)) +0385 CE85 +D800DF84 F0908E84 +DBC0DC00 F4808080 +FF9D EFBE9D +ALTER TABLE t1 ADD KEY(a); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +HEX(a) HEX(CONVERT(a USING utf8mb4)) +0385 CE85 +D800DF84 F0908E84 +DBC0DC00 F4808080 +FF9D EFBE9D +DROP TABLE IF EXISTS t1; select @@collation_connection; @@collation_connection utf16_bin === modified file 'mysql-test/r/ctype_utf32.result' --- a/mysql-test/r/ctype_utf32.result 2010-08-26 12:36:33 +0000 +++ b/mysql-test/r/ctype_utf32.result 2010-09-10 18:48:13 +0000 @@ -610,6 +610,31 @@ utf32_bin 0000006100000009 utf32_bin 00000061 utf32_bin 0000006100000020 drop table t1; +# +# Bug#55980 Character sets: supplementary character _bin ordering is wrong +# +CREATE TABLE t1 AS SELECT REPEAT('a',1) AS a LIMIT 0; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(1) CHARACTER SET utf32 COLLATE utf32_bin NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (_utf8mb4 0xEFBE9D),(_utf8mb4 0xF0908E84); +INSERT INTO t1 VALUES (_utf8mb4 0xCE85),(_utf8mb4 0xF4808080); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +HEX(a) HEX(CONVERT(a USING utf8mb4)) +00000385 CE85 +0000FF9D EFBE9D +00010384 F0908E84 +00100000 F4808080 +ALTER TABLE t1 ADD KEY(a); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +HEX(a) HEX(CONVERT(a USING utf8mb4)) +00000385 CE85 +0000FF9D EFBE9D +00010384 F0908E84 +00100000 F4808080 +DROP TABLE IF EXISTS t1; select @@collation_connection; @@collation_connection utf32_bin === modified file 'mysql-test/r/ctype_utf8mb4.result' --- a/mysql-test/r/ctype_utf8mb4.result 2010-06-02 12:23:50 +0000 +++ b/mysql-test/r/ctype_utf8mb4.result 2010-08-31 14:22:03 +0000 @@ -987,6 +987,31 @@ utf8mb4_bin 6109 utf8mb4_bin 61 utf8mb4_bin 6120 drop table t1; +# +# Bug#55980 Character sets: supplementary character _bin ordering is wrong +# +CREATE TABLE t1 AS SELECT REPEAT('a',1) AS a LIMIT 0; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES (_utf8mb4 0xEFBE9D),(_utf8mb4 0xF0908E84); +INSERT INTO t1 VALUES (_utf8mb4 0xCE85),(_utf8mb4 0xF4808080); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +HEX(a) HEX(CONVERT(a USING utf8mb4)) +CE85 CE85 +EFBE9D EFBE9D +F0908E84 F0908E84 +F4808080 F4808080 +ALTER TABLE t1 ADD KEY(a); +SELECT HEX(a), HEX(CONVERT(a USING utf8mb4)) FROM t1 ORDER BY a; +HEX(a) HEX(CONVERT(a USING utf8mb4)) +CE85 CE85 +EFBE9D EFBE9D +F0908E84 F0908E84 +F4808080 F4808080 +DROP TABLE IF EXISTS t1; select @@collation_connection; @@collation_connection utf8mb4_bin === modified file 'mysql-test/r/func_if.result' --- a/mysql-test/r/func_if.result 2008-12-12 14:19:33 +0000 +++ b/mysql-test/r/func_if.result 2010-08-25 15:57:53 +0000 @@ -186,3 +186,13 @@ MAX(IFNULL(CAST(c AS UNSIGNED), 0)) 12345678901234567890 DROP TABLE t1; End of 5.0 tests +# +# Bug#55077: Assertion failed: width > 0 && to != ((void *)0), file .\dtoa.c +# +CREATE TABLE t1 (a LONGBLOB, b DOUBLE); +INSERT INTO t1 VALUES (NULL, 0), (NULL, 1); +SELECT IF(b, (SELECT a FROM t1 LIMIT 1), b) c FROM t1 GROUP BY c; +c +NULL +0 +DROP TABLE t1; === modified file 'mysql-test/r/mysqltest.result' --- a/mysql-test/r/mysqltest.result 2010-08-30 13:19:46 +0000 +++ b/mysql-test/r/mysqltest.result 2010-09-20 08:08:32 +0000 @@ -177,6 +177,9 @@ mysqltest: At line 1: End of line junk d " mysqltest: At line 1: Extra delimiter ";" found mysqltest: At line 1: Extra delimiter ";" found +mysqltest: At line 1: Spurious text after `query` expression +mysqltest: At line 1: Spurious text after `query` expression +mysqltest: At line 2: Spurious text after `query` expression mysqltest: At line 1: Missing argument(s) to 'error' mysqltest: At line 1: Missing argument(s) to 'error' mysqltest: At line 1: The sqlstate definition must start with an uppercase S === modified file 'mysql-test/r/sp-destruct.result' --- a/mysql-test/r/sp-destruct.result 2010-03-03 09:24:53 +0000 +++ b/mysql-test/r/sp-destruct.result 2010-08-31 13:49:41 +0000 @@ -134,3 +134,19 @@ Warning 1405 Failed to revoke all privil # Restore the procs_priv table RENAME TABLE procs_priv_backup TO mysql.procs_priv; FLUSH TABLE mysql.procs_priv; +# +# Bug #56137 "Assertion `thd->lock == 0' failed on upgrading from +# 5.1.50 to 5.5.6". +# +drop database if exists mysqltest; +# Backup mysql.proc. +flush table mysql.proc; +create database mysqltest; +# Corrupt mysql.proc to make it unusable by current version of server. +alter table mysql.proc drop column type; +# The below statement should not cause assertion failure. +drop database mysqltest; +Warnings: +Error 1547 Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted +# Restore mysql.proc. +drop table mysql.proc; === modified file 'mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test' --- a/mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test 2010-01-14 10:49:40 +0000 +++ b/mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test 2010-09-15 12:56:22 +0000 @@ -205,7 +205,7 @@ DROP TABLE `t1`; -- echo === Using mysqlbinlog to detect failure. Before the patch mysqlbinlog would find a corrupted event, thence would fail. --- let $MYSQLD_DATADIR= `SELECT @@datadir`; +-- let $MYSQLD_DATADIR= `SELECT @@datadir` -- exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog -- remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug42749.binlog @@ -330,7 +330,7 @@ while($ntables) -- echo ### assertion: check that binlog is not corrupt. Using mysqlbinlog to -- echo ### detect failure. Before the patch mysqlbinlog would find -- echo ### a corrupted event, thence would fail. --- let $MYSQLD_DATADIR= `SELECT @@datadir`; +-- let $MYSQLD_DATADIR= `SELECT @@datadir` -- exec $MYSQL_BINLOG -v --hex $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug50018.binlog ## clean up === modified file 'mysql-test/suite/sys_vars/t/div_precision_increment_func.test' --- a/mysql-test/suite/sys_vars/t/div_precision_increment_func.test 2009-12-22 09:35:56 +0000 +++ b/mysql-test/suite/sys_vars/t/div_precision_increment_func.test 2010-09-20 08:21:55 +0000 @@ -19,7 +19,7 @@ # # ################################################################################ -let $save_div_precision_increment = `SELECT @@global.div_precision_increment` +let $save_div_precision_increment = `SELECT @@global.div_precision_increment`; #SET @save_div_precision_increment = @@global.div_precision_increment; === modified file 'mysql-test/t/ctype_utf16.test' --- a/mysql-test/t/ctype_utf16.test 2010-06-02 12:23:50 +0000 +++ b/mysql-test/t/ctype_utf16.test 2010-08-31 14:22:03 +0000 @@ -326,6 +326,7 @@ SET collation_connection='utf16_general_ SET NAMES latin1; SET collation_connection='utf16_bin'; -- source include/ctype_filesort.inc +-- source include/ctype_filesort2.inc -- source include/ctype_like_escape.inc # === modified file 'mysql-test/t/ctype_utf32.test' --- a/mysql-test/t/ctype_utf32.test 2010-08-26 12:36:33 +0000 +++ b/mysql-test/t/ctype_utf32.test 2010-09-10 18:48:13 +0000 @@ -328,6 +328,7 @@ SET collation_connection='utf32_general_ SET NAMES latin1; SET collation_connection='utf32_bin'; -- source include/ctype_filesort.inc +-- source include/ctype_filesort2.inc -- source include/ctype_like_escape.inc # === modified file 'mysql-test/t/ctype_utf8mb4.test' --- a/mysql-test/t/ctype_utf8mb4.test 2010-06-02 12:23:50 +0000 +++ b/mysql-test/t/ctype_utf8mb4.test 2010-08-31 14:22:03 +0000 @@ -733,6 +733,7 @@ SET collation_connection='utf8mb4_genera -- source include/ctype_german.inc SET collation_connection='utf8mb4_bin'; -- source include/ctype_filesort.inc +-- source include/ctype_filesort2.inc -- source include/ctype_like_escape.inc # === modified file 'mysql-test/t/func_if.test' --- a/mysql-test/t/func_if.test 2008-12-12 13:16:25 +0000 +++ b/mysql-test/t/func_if.test 2010-08-25 15:57:53 +0000 @@ -165,3 +165,15 @@ DROP TABLE t1; --echo End of 5.0 tests + + +--echo # +--echo # Bug#55077: Assertion failed: width > 0 && to != ((void *)0), file .\dtoa.c +--echo # + +CREATE TABLE t1 (a LONGBLOB, b DOUBLE); +INSERT INTO t1 VALUES (NULL, 0), (NULL, 1); + +SELECT IF(b, (SELECT a FROM t1 LIMIT 1), b) c FROM t1 GROUP BY c; + +DROP TABLE t1; === modified file 'mysql-test/t/mysqltest.test' --- a/mysql-test/t/mysqltest.test 2010-08-30 13:19:46 +0000 +++ b/mysql-test/t/mysqltest.test 2010-09-20 08:08:32 +0000 @@ -494,6 +494,23 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlt --error 1 --exec echo "--disable_query_log;" | $MYSQL_TEST 2>&1 +# +# Extra text after `` +# +--error 1 +-- exec echo "let \$x= \`select 1\` BOO ;" | $MYSQL_TEST 2>&1 +--error 1 +-- exec echo "--let \$x= \`select 1\`;" | $MYSQL_TEST 2>&1 +--write_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql +# Missing ; in next line should be detected and cause failure +let $x= `select 1` +let $x= 2; +echo $x; +EOF +--error 1 +--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/mysqltest.sql 2>&1 +remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; + # Allow trailing # comment --sleep 1 # Wait for insert delayed to be executed. === modified file 'mysql-test/t/sp-destruct.test' --- a/mysql-test/t/sp-destruct.test 2010-03-03 09:24:53 +0000 +++ b/mysql-test/t/sp-destruct.test 2010-08-31 13:49:41 +0000 @@ -222,3 +222,33 @@ SHOW WARNINGS; --echo # Restore the procs_priv table RENAME TABLE procs_priv_backup TO mysql.procs_priv; FLUSH TABLE mysql.procs_priv; + + +--echo # +--echo # Bug #56137 "Assertion `thd->lock == 0' failed on upgrading from +--echo # 5.1.50 to 5.5.6". +--echo # +--disable_warnings +drop database if exists mysqltest; +--enable_warnings +--echo # Backup mysql.proc. +flush table mysql.proc; +let $MYSQLD_DATADIR= `select @@datadir`; +--copy_file $MYSQLD_DATADIR/mysql/proc.frm $MYSQLTEST_VARDIR/tmp/proc.frm +--copy_file $MYSQLD_DATADIR/mysql/proc.MYD $MYSQLTEST_VARDIR/tmp/proc.MYD +--copy_file $MYSQLD_DATADIR/mysql/proc.MYI $MYSQLTEST_VARDIR/tmp/proc.MYI + +create database mysqltest; +--echo # Corrupt mysql.proc to make it unusable by current version of server. +alter table mysql.proc drop column type; +--echo # The below statement should not cause assertion failure. +drop database mysqltest; + +--echo # Restore mysql.proc. +drop table mysql.proc; +--copy_file $MYSQLTEST_VARDIR/tmp/proc.frm $MYSQLD_DATADIR/mysql/proc.frm +--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYD $MYSQLD_DATADIR/mysql/proc.MYD +--copy_file $MYSQLTEST_VARDIR/tmp/proc.MYI $MYSQLD_DATADIR/mysql/proc.MYI +--remove_file $MYSQLTEST_VARDIR/tmp/proc.frm +--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYD +--remove_file $MYSQLTEST_VARDIR/tmp/proc.MYI === modified file 'scripts/CMakeLists.txt' --- a/scripts/CMakeLists.txt 2010-08-19 12:11:31 +0000 +++ b/scripts/CMakeLists.txt 2010-09-07 15:05:16 +0000 @@ -139,6 +139,7 @@ ELSE() ENDIF() SET(HOSTNAME "hostname") +SET(MYSQLD_USER "mysql") # Required for mysqlbug until autotools are deprecated, once done remove these # and expand default cmake variables === modified file 'scripts/make_win_bin_dist' --- a/scripts/make_win_bin_dist 2010-07-23 20:14:04 +0000 +++ b/scripts/make_win_bin_dist 2010-08-31 14:33:19 +0000 @@ -260,6 +260,7 @@ cp include/mysql.h \ include/keycache.h \ include/m_ctype.h \ include/my_attribute.h \ + include/my_compiler.h \ include/mysqld_error.h \ include/sql_state.h \ include/mysqld_ername.h \ === modified file 'sql/CMakeLists.txt' --- a/sql/CMakeLists.txt 2010-08-18 11:29:04 +0000 +++ b/sql/CMakeLists.txt 2010-08-31 11:06:56 +0000 @@ -271,8 +271,7 @@ IF(WIN32 AND MYSQLD_EXECUTABLE) COMMAND ${CMAKE_COMMAND} ${CONFIG_PARAM} -P ${CMAKE_CURRENT_BINARY_DIR}/create_initial_db.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/data - COMMAND ${CMAKE_COMMAND} -E touch initdb.dep - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/initdb.dep DEPENDS mysqld ) ADD_CUSTOM_TARGET(initial_database === modified file 'sql/field.cc' --- a/sql/field.cc 2010-08-23 09:56:21 +0000 +++ b/sql/field.cc 2010-08-25 15:57:53 +0000 @@ -4189,6 +4189,7 @@ String *Field_float::val_str(String *val String *val_ptr __attribute__((unused))) { ASSERT_COLUMN_MARKED_FOR_READ; + DBUG_ASSERT(field_length <= MAX_FIELD_CHARLENGTH); float nr; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) @@ -4199,8 +4200,13 @@ String *Field_float::val_str(String *val #endif memcpy(&nr, ptr, sizeof(nr)); - uint to_length=max(field_length,70); - val_buffer->alloc(to_length); + uint to_length= 70; + if (val_buffer->alloc(to_length)) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + return val_buffer; + } + char *to=(char*) val_buffer->ptr(); size_t len; @@ -4209,7 +4215,7 @@ String *Field_float::val_str(String *val else { /* - We are safe here because the buffer length is >= 70, and + We are safe here because the buffer length is 70, and fabs(float) < 10^39, dec < NOT_FIXED_DEC. So the resulting string will be not longer than 69 chars + terminating '\0'. */ @@ -4506,6 +4512,7 @@ String *Field_double::val_str(String *va String *val_ptr __attribute__((unused))) { ASSERT_COLUMN_MARKED_FOR_READ; + DBUG_ASSERT(field_length <= MAX_FIELD_CHARLENGTH); double nr; #ifdef WORDS_BIGENDIAN if (table->s->db_low_byte_first) @@ -4515,9 +4522,13 @@ String *Field_double::val_str(String *va else #endif doubleget(nr,ptr); + uint to_length= DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE; + if (val_buffer->alloc(to_length)) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + return val_buffer; + } - uint to_length=max(field_length, DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE); - val_buffer->alloc(to_length); char *to=(char*) val_buffer->ptr(); size_t len; === modified file 'sql/item_cmpfunc.cc' --- a/sql/item_cmpfunc.cc 2010-08-19 11:55:35 +0000 +++ b/sql/item_cmpfunc.cc 2010-08-25 15:57:53 +0000 @@ -2560,27 +2560,30 @@ Item_func_if::fix_length_and_dec() cached_result_type= arg2_type; collation.set(args[2]->collation.collation); cached_field_type= args[2]->field_type(); + max_length= args[2]->max_length; + return; } - else if (null2) + + if (null2) { cached_result_type= arg1_type; collation.set(args[1]->collation.collation); cached_field_type= args[1]->field_type(); + max_length= args[1]->max_length; + return; + } + + agg_result_type(&cached_result_type, args + 1, 2); + if (cached_result_type == STRING_RESULT) + { + if (agg_arg_charsets_for_string_result(collation, args + 1, 2)) + return; } else { - agg_result_type(&cached_result_type, args+1, 2); - if (cached_result_type == STRING_RESULT) - { - if (agg_arg_charsets_for_string_result(collation, args + 1, 2)) - return; - } - else - { - collation.set_numeric(); // Number - } - cached_field_type= agg_field_type(args + 1, 2); + collation.set_numeric(); // Number } + cached_field_type= agg_field_type(args + 1, 2); uint32 char_length; if ((cached_result_type == DECIMAL_RESULT ) === modified file 'sql/mdl.cc' --- a/sql/mdl.cc 2010-08-12 13:50:23 +0000 +++ b/sql/mdl.cc 2010-09-06 17:29:02 +0000 @@ -124,7 +124,6 @@ public: Deadlock_detection_visitor(MDL_context *start_node_arg) : m_start_node(start_node_arg), m_victim(NULL), - m_current_search_depth(0), m_found_deadlock(FALSE) {} virtual bool enter_node(MDL_context *node); @@ -133,6 +132,8 @@ public: virtual bool inspect_edge(MDL_context *dest); MDL_context *get_victim() const { return m_victim; } + + void abort_traversal(MDL_context *node); private: /** Change the deadlock victim to a new one if it has lower deadlock @@ -147,13 +148,6 @@ private: MDL_context *m_start_node; /** If a deadlock is found, the context that identifies the victim. */ MDL_context *m_victim; - /** Set to the 0 at start. Increased whenever - we descend into another MDL context (aka traverse to the next - wait-for graph node). When MAX_SEARCH_DEPTH is reached, we - assume that a deadlock is found, even if we have not found a - loop. - */ - uint m_current_search_depth; /** TRUE if we found a deadlock. */ bool m_found_deadlock; /** @@ -187,7 +181,7 @@ private: bool Deadlock_detection_visitor::enter_node(MDL_context *node) { - m_found_deadlock= ++m_current_search_depth >= MAX_SEARCH_DEPTH; + m_found_deadlock= m_current_search_depth >= MAX_SEARCH_DEPTH; if (m_found_deadlock) { DBUG_ASSERT(! m_victim); @@ -207,7 +201,6 @@ bool Deadlock_detection_visitor::enter_n void Deadlock_detection_visitor::leave_node(MDL_context *node) { - --m_current_search_depth; if (m_found_deadlock) opt_change_victim_to(node); } @@ -252,6 +245,21 @@ Deadlock_detection_visitor::opt_change_v /** + Abort traversal of a wait-for graph and report a deadlock. + + @param node Node which we were about to visit when abort + was initiated. +*/ + +void Deadlock_detection_visitor::abort_traversal(MDL_context *node) +{ + DBUG_ASSERT(! m_victim); + m_found_deadlock= TRUE; + opt_change_victim_to(node); +} + + +/** Get a bit corresponding to enum_mdl_type value in a granted/waiting bitmaps and compatibility matrices. */ @@ -2056,8 +2064,13 @@ bool MDL_lock::visit_subgraph(MDL_ticket are visiting it but this is OK: in the worst case we might do some extra work and one more context might be chosen as a victim. */ + ++gvisitor->m_current_search_depth; + if (gvisitor->enter_node(src_ctx)) + { + --gvisitor->m_current_search_depth; goto end; + } /* We do a breadth-first search first -- that is, inspect all @@ -2114,6 +2127,7 @@ bool MDL_lock::visit_subgraph(MDL_ticket end_leave_node: gvisitor->leave_node(src_ctx); + --gvisitor->m_current_search_depth; end: mysql_prlock_unlock(&m_rwlock); === modified file 'sql/mdl.h' --- a/sql/mdl.h 2010-08-12 13:50:23 +0000 +++ b/sql/mdl.h 2010-09-06 17:29:02 +0000 @@ -385,7 +385,10 @@ public: virtual bool inspect_edge(MDL_context *dest) = 0; virtual ~MDL_wait_for_graph_visitor(); - MDL_wait_for_graph_visitor() :m_lock_open_count(0) {} + MDL_wait_for_graph_visitor() :m_lock_open_count(0), + m_current_search_depth(0) + { } + virtual void abort_traversal(MDL_context *node) = 0; public: /** XXX, hack: During deadlock search, we may need to @@ -396,6 +399,17 @@ public: LOCK_open since it has significant performance impacts. */ uint m_lock_open_count; + /** + Set to the 0 at start. Increased whenever + we descend into another MDL context (aka traverse to the next + wait-for graph node). When MAX_SEARCH_DEPTH is reached, we + assume that a deadlock is found, even if we have not found a + loop. + + XXX: This member belongs to this class only temporarily until + bug #56405 is fixed. + */ + uint m_current_search_depth; }; /** === modified file 'sql/sp.cc' --- a/sql/sp.cc 2010-07-27 10:25:53 +0000 +++ b/sql/sp.cc 2010-08-31 13:49:41 +0000 @@ -440,6 +440,7 @@ static TABLE *open_proc_table_for_update { TABLE_LIST table_list; TABLE *table; + MDL_ticket *mdl_savepoint= thd->mdl_context.mdl_savepoint(); DBUG_ENTER("open_proc_table_for_update"); table_list.init_one_table("mysql", 5, "proc", 4, "proc", TL_WRITE); @@ -450,6 +451,9 @@ static TABLE *open_proc_table_for_update if (!proc_table_intact.check(table, &proc_table_def)) DBUG_RETURN(table); + close_thread_tables(thd); + thd->mdl_context.rollback_to_savepoint(mdl_savepoint); + DBUG_RETURN(NULL); } === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2010-08-20 08:24:32 +0000 +++ b/sql/sql_base.cc 2010-09-06 17:29:02 +0000 @@ -100,6 +100,8 @@ bool No_such_table_error_handler::safely TABLE_SHAREs, refresh_version and the table id counter. */ mysql_mutex_t LOCK_open; +mysql_mutex_t LOCK_dd_owns_lock_open; +uint dd_owns_lock_open= 0; #ifdef HAVE_PSI_INTERFACE static PSI_mutex_key key_LOCK_open; @@ -298,6 +300,7 @@ bool table_def_init(void) init_tdc_psi_keys(); #endif mysql_mutex_init(key_LOCK_open, &LOCK_open, MY_MUTEX_INIT_FAST); + mysql_mutex_init(NULL, &LOCK_dd_owns_lock_open, MY_MUTEX_INIT_FAST); oldest_unused_share= &end_of_unused_share; end_of_unused_share.prev= &oldest_unused_share; @@ -341,6 +344,7 @@ void table_def_free(void) table_def_inited= 0; /* Free table definitions. */ my_hash_free(&table_def_cache); + mysql_mutex_destroy(&LOCK_dd_owns_lock_open); mysql_mutex_destroy(&LOCK_open); } DBUG_VOID_RETURN; === modified file 'sql/sql_base.h' --- a/sql/sql_base.h 2010-08-20 08:24:32 +0000 +++ b/sql/sql_base.h 2010-09-06 17:29:02 +0000 @@ -71,6 +71,8 @@ enum enum_tdc_remove_table_type {TDC_RT_ bool check_dup(const char *db, const char *name, TABLE_LIST *tables); extern mysql_mutex_t LOCK_open; +extern mysql_mutex_t LOCK_dd_owns_lock_open; +extern uint dd_owns_lock_open; bool table_cache_init(void); void table_cache_free(void); bool table_def_init(void); === modified file 'sql/sql_string.cc' --- a/sql/sql_string.cc 2010-07-09 12:28:51 +0000 +++ b/sql/sql_string.cc 2010-08-25 15:57:53 +0000 @@ -31,9 +31,12 @@ ** String functions *****************************************************************************/ -bool String::real_alloc(uint32 arg_length) +bool String::real_alloc(uint32 length) { - arg_length=ALIGN_SIZE(arg_length+1); + uint32 arg_length= ALIGN_SIZE(length + 1); + DBUG_ASSERT(arg_length > length); + if (arg_length <= length) + return TRUE; /* Overflow */ str_length=0; if (Alloced_length < arg_length) { @@ -56,6 +59,9 @@ bool String::real_alloc(uint32 arg_lengt bool String::realloc(uint32 alloc_length) { uint32 len=ALIGN_SIZE(alloc_length+1); + DBUG_ASSERT(len > alloc_length); + if (len <= alloc_length) + return TRUE; /* Overflow */ if (Alloced_length < len) { char *new_ptr; === modified file 'sql/table.cc' --- a/sql/table.cc 2010-08-18 11:29:04 +0000 +++ b/sql/table.cc 2010-09-06 17:29:02 +0000 @@ -3085,7 +3085,30 @@ bool TABLE_SHARE::visit_subgraph(Wait_fo holding a write-lock on MDL_lock::m_rwlock. */ if (gvisitor->m_lock_open_count++ == 0) + { + /* + To circumvent bug #56405 "Deadlock in the MDL deadlock detector" + we don't try to lock LOCK_open mutex if some thread doing + deadlock detection already owns it and current search depth is + greater than 0. Instead we report a deadlock. + + TODO/FIXME: The proper fix for this bug is to use rwlocks for + protection of table shares/instead of LOCK_open. + Unfortunately it requires more effort/has significant + performance effect. + */ + mysql_mutex_lock(&LOCK_dd_owns_lock_open); + if (gvisitor->m_current_search_depth > 0 && dd_owns_lock_open > 0) + { + mysql_mutex_unlock(&LOCK_dd_owns_lock_open); + --gvisitor->m_lock_open_count; + gvisitor->abort_traversal(src_ctx); + return TRUE; + } + ++dd_owns_lock_open; + mysql_mutex_unlock(&LOCK_dd_owns_lock_open); mysql_mutex_lock(&LOCK_open); + } I_P_List_iterator tables_it(used_tables); @@ -3100,8 +3123,12 @@ bool TABLE_SHARE::visit_subgraph(Wait_fo goto end; } + ++gvisitor->m_current_search_depth; if (gvisitor->enter_node(src_ctx)) + { + --gvisitor->m_current_search_depth; goto end; + } while ((table= tables_it++)) { @@ -3124,10 +3151,16 @@ bool TABLE_SHARE::visit_subgraph(Wait_fo end_leave_node: gvisitor->leave_node(src_ctx); + --gvisitor->m_current_search_depth; end: if (gvisitor->m_lock_open_count-- == 1) + { mysql_mutex_unlock(&LOCK_open); + mysql_mutex_lock(&LOCK_dd_owns_lock_open); + --dd_owns_lock_open; + mysql_mutex_unlock(&LOCK_dd_owns_lock_open); + } return result; } === modified file 'strings/ctype-ucs2.c' --- a/strings/ctype-ucs2.c 2010-07-23 20:09:27 +0000 +++ b/strings/ctype-ucs2.c 2010-08-31 14:22:03 +0000 @@ -1469,7 +1469,7 @@ my_strnncoll_utf16_bin(CHARSET_INFO *cs, } if (s_wc != t_wc) { - return s_wc > t_wc ? 1 : -1; + return my_bincmp(s, s + s_res, t, t + t_res); } s+= s_res; @@ -1511,7 +1511,7 @@ my_strnncollsp_utf16_bin(CHARSET_INFO *c if (s_wc != t_wc) { - return s_wc > t_wc ? 1 : -1; + return my_bincmp(s, s + s_res, t, t + t_res); } s+= s_res; @@ -1684,8 +1684,8 @@ static MY_COLLATION_HANDLER my_collation NULL, /* init */ my_strnncoll_utf16_bin, my_strnncollsp_utf16_bin, - my_strnxfrm_unicode, - my_strnxfrmlen_simple, + my_strnxfrm_unicode_full_bin, + my_strnxfrmlen_unicode_full_bin, my_like_range_utf16, my_wildcmp_utf16_bin, my_strcasecmp_mb2_or_mb4, @@ -2711,8 +2711,8 @@ static MY_COLLATION_HANDLER my_collation NULL, /* init */ my_strnncoll_utf32_bin, my_strnncollsp_utf32_bin, - my_strnxfrm_unicode, - my_strnxfrmlen_utf32, + my_strnxfrm_unicode_full_bin, + my_strnxfrmlen_unicode_full_bin, my_like_range_utf32, my_wildcmp_utf32_bin, my_strcasecmp_mb2_or_mb4, === modified file 'strings/ctype-utf8.c' --- a/strings/ctype-utf8.c 2010-03-04 11:00:32 +0000 +++ b/strings/ctype-utf8.c 2010-08-31 14:22:03 +0000 @@ -1893,7 +1893,13 @@ my_wildcmp_unicode(CHARSET_INFO *cs, /* - This function is shared between utf8mb3/utf8mb4/ucs2/utf16/utf32 + Store sorting weights using 2 bytes per character. + + This function is shared between + - utf8mb3_general_ci, utf8_bin, ucs2_general_ci, ucs2_bin + which support BMP only (U+0000..U+FFFF). + - utf8mb4_general_ci, utf16_general_ci, utf32_general_ci, + which map all supplementary characters to weight 0xFFFD. */ size_t my_strnxfrm_unicode(CHARSET_INFO *cs, @@ -1937,6 +1943,70 @@ my_strnxfrm_unicode(CHARSET_INFO *cs, } +/* + Store sorting weights using 3 bytes per character. + This function is shared between utf8mb4_bin, utf16_bin, utf32_bin. +*/ +size_t +my_strnxfrm_unicode_full_bin(CHARSET_INFO *cs, + uchar *dst, size_t dstlen, + const uchar *src, size_t srclen) +{ + my_wc_t wc; + uchar *de= dst + dstlen; + uchar *de_beg= de - 2; /* The beginning of the last chunk */ + const uchar *se = src + srclen; + + LINT_INIT(wc); + DBUG_ASSERT(src); + DBUG_ASSERT(cs->state & MY_CS_BINSORT); + + while (dst < de_beg) + { + int res; + if ((res= cs->cset->mb_wc(cs, &wc, src, se)) <= 0) + break; + src+= res; + if (cs->mbminlen == 2) /* utf16_bin */ + { + /* + Reorder code points to weights as follows: + U+0000..U+D7FF -> [00][00][00]..[00][D7][FF] BMP part #1 + U+10000..U+10FFFF -> [01][00][00]..[10][FF][FF] Supplementary + U+E000..U+FFFF -> [20][E0][00]..[20][FF][FF] BMP part #2 + */ + if (wc >= 0xE000 && wc <= 0xFFFF) + wc+= 0x200000; + } + *dst++= (uchar) (wc >> 16); + *dst++= (uchar) ((wc >> 8) & 0xFF); + *dst++= (uchar) (wc & 0xFF); + } + + while (dst < de_beg) /* Fill the tail with keys for space character */ + { + *dst++= 0x00; + *dst++= 0x00; + *dst++= 0x20; + } + + /* Clear the last one or two bytes, if "dstlen" was not divisible by 3 */ + if (dst < de) + { + *dst++= 0x00; + if (dst < de) + *dst= 0x00; + } + + return dstlen; +} + + +size_t +my_strnxfrmlen_unicode_full_bin(CHARSET_INFO *cs, size_t len) +{ + return ((len + 3) / cs->mbmaxlen) * 3; +} #endif /* HAVE_UNIDATA */ @@ -5067,8 +5137,8 @@ static MY_COLLATION_HANDLER my_collation NULL, /* init */ my_strnncoll_mb_bin, my_strnncollsp_mb_bin, - my_strnxfrm_unicode, - my_strnxfrmlen_utf8mb4, + my_strnxfrm_unicode_full_bin, + my_strnxfrmlen_unicode_full_bin, my_like_range_mb, my_wildcmp_mb_bin, my_strcasecmp_mb_bin, --===============0745588413== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/bjorn.munch@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bjorn.munch@stripped # target_branch: file:///home/bm136801/my/mtr-55/ # testament_sha1: 2df1834a8e4581e9139e06b6106e645433e82eb2 # timestamp: 2010-09-20 11:18:41 +0200 # source_branch: file:///home/bm136801/my/mysql-5.5/ # base_revision_id: bjorn.munch@stripped\ # 7p79p11wjb9xn8wn # # Begin bundle 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 --===============0745588413==--