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==--