From: Christopher Powers Date: April 19 2011 4:22pm Subject: bzr push into mysql-trunk branch (chris.powers:3280 to 3282) WL#4896 List-Archive: http://lists.mysql.com/commits/135735 Message-Id: <20110419162420.895CB1DB033A@xeno.mysql.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4214414423322303146==" --===============4214414423322303146== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3282 cpowers 2011-04-19 WL#4896 "Performance Schema Net IO" - Updated unit test to handle socket with no thread owner modified: storage/perfschema/unittest/pfs-t.cc 3281 cpowers 2011-04-19 [merge] merge with mysql-trunk added: sql/item_inetfunc.cc sql/item_inetfunc.h modified: cmake/os/Windows.cmake config.h.cmake include/my_net.h libmysql/libmysql.c libmysqld/libmysqld.c mysql-test/collections/default.experimental mysql-test/collections/default.weekly mysql-test/include/subquery.inc mysql-test/lib/My/Find.pm mysql-test/lib/mtr_gcov.pl mysql-test/mysql-test-run.pl mysql-test/r/func_analyse.result mysql-test/r/loaddata.result mysql-test/r/subquery_all.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_none.result mysql-test/r/type_timestamp.result mysql-test/r/warnings.result mysql-test/r/xa.result mysql-test/suite/binlog/r/binlog_bug23533.result mysql-test/suite/binlog/t/binlog_bug23533.test mysql-test/t/func_analyse.test mysql-test/t/loaddata.test mysql-test/t/type_timestamp.test mysql-test/t/warnings.test mysql-test/t/xa.test sql-common/client.c sql/CMakeLists.txt sql/hostname.cc sql/item_create.cc sql/item_func.cc sql/item_func.h sql/item_strfunc.cc sql/item_strfunc.h sql/mysqld.cc sql/opt_sum.cc sql/rpl_info_factory.h sql/sp_head.cc sql/sql_admin.cc sql/sql_class.cc sql/sql_class.h sql/sql_connect.cc sql/sql_error.cc sql/sql_error.h sql/sql_load.cc sql/sql_parse.cc sql/sql_prepare.cc sql/sql_select.cc sql/sql_select.h sql/sql_show.cc sql/sql_trigger.cc sql/transaction.cc storage/myisam/myisamdef.h vio/vio_priv.h 3280 cpowers 2011-04-13 [merge] WL#4896 "Performance Schema Net IO" Merge with mysql-trunk removed: extra/yassl/src/template_instnt.cpp extra/yassl/taocrypt/src/template_instnt.cpp mysql-test/suite/bugs/ mysql-test/suite/bugs/combinations mysql-test/suite/bugs/data/ mysql-test/suite/bugs/data/rpl_bug12691.dat mysql-test/suite/bugs/r/ mysql-test/suite/bugs/r/bug57108.result mysql-test/suite/bugs/r/rpl_bug12691.result mysql-test/suite/bugs/r/rpl_bug31582.result mysql-test/suite/bugs/r/rpl_bug31583.result mysql-test/suite/bugs/r/rpl_bug33029.result mysql-test/suite/bugs/r/rpl_bug38205.result mysql-test/suite/bugs/t/ mysql-test/suite/bugs/t/bug57108-master.opt mysql-test/suite/bugs/t/bug57108.test mysql-test/suite/bugs/t/rpl_bug12691.test mysql-test/suite/bugs/t/rpl_bug31582.test mysql-test/suite/bugs/t/rpl_bug31583.test mysql-test/suite/bugs/t/rpl_bug33029.test mysql-test/suite/bugs/t/rpl_bug38205.test mysql-test/suite/sys_vars/r/max_long_data_size_basic.result mysql-test/suite/sys_vars/t/max_long_data_size_basic.test added: unittest/gunit/sql_plist-t.cc renamed: mysql-test/suite/bugs/r/rpl_bug23533.result => mysql-test/suite/binlog/r/binlog_bug23533.result mysql-test/suite/bugs/r/rpl_bug36391.result => mysql-test/suite/binlog/r/binlog_bug36391.result mysql-test/suite/bugs/r/rpl_bug37426.result => mysql-test/suite/rpl/r/rpl_bug37426.result mysql-test/suite/bugs/t/rpl_bug23533.test => mysql-test/suite/binlog/t/binlog_bug23533.test mysql-test/suite/bugs/t/rpl_bug36391-master.opt => mysql-test/suite/binlog/t/binlog_bug36391-master.opt mysql-test/suite/bugs/t/rpl_bug36391.test => mysql-test/suite/binlog/t/binlog_bug36391.test mysql-test/suite/bugs/t/rpl_bug37426.test => mysql-test/suite/rpl/t/rpl_bug37426.test modified: client/client_priv.h client/mysqlslap.c cmake/os/WindowsCache.cmake cmake/ssl.cmake config.h.cmake configure.cmake extra/yassl/CMakeLists.txt extra/yassl/src/crypto_wrapper.cpp extra/yassl/src/yassl_int.cpp extra/yassl/taocrypt/CMakeLists.txt extra/yassl/taocrypt/src/algebra.cpp extra/yassl/taocrypt/src/integer.cpp include/my_global.h include/violite.h mysql-test/collections/default.experimental mysql-test/collections/default.weekly mysql-test/extra/rpl_tests/rpl_extra_col_master.test mysql-test/include/ctype_numconv.inc mysql-test/include/func_in.inc mysql-test/include/mix1.inc mysql-test/include/mtr_warnings.sql mysql-test/include/order_by.inc mysql-test/include/subquery_mat.inc mysql-test/lib/mtr_misc.pl mysql-test/mysql-test-run.pl mysql-test/r/alter_table.result mysql-test/r/ctype_binary.result mysql-test/r/ctype_cp1251.result mysql-test/r/ctype_latin1.result mysql-test/r/ctype_ucs.result mysql-test/r/ctype_utf8.result mysql-test/r/func_group.result mysql-test/r/func_in_icp.result mysql-test/r/func_in_icp_mrr.result mysql-test/r/func_in_mrr.result mysql-test/r/func_in_mrr_cost.result mysql-test/r/func_in_none.result mysql-test/r/innodb_icp_all.result mysql-test/r/innodb_mysql_lock.result mysql-test/r/innodb_mysql_sync.result mysql-test/r/lowercase_table2.result mysql-test/r/myisam_icp_all.result mysql-test/r/mysqld--help-notwin.result mysql-test/r/mysqld--help-win.result mysql-test/r/mysqlslap.result mysql-test/r/order_by_all.result mysql-test/r/order_by_icp_mrr.result mysql-test/r/order_by_none.result mysql-test/r/plugin_auth.result mysql-test/r/show_check.result mysql-test/r/sp-destruct.result mysql-test/r/subquery_all.result mysql-test/r/subquery_all_jcl6.result mysql-test/r/subquery_mat.result mysql-test/r/subquery_mat_all.result mysql-test/r/subquery_mat_none.result mysql-test/r/subquery_nomat_nosj_jcl6.result mysql-test/r/variables-big.result mysql-test/r/variables.result mysql-test/r/view.result mysql-test/r/xa.result mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result mysql-test/suite/rpl/r/rpl_migration_crash_safe.result mysql-test/suite/rpl/r/rpl_rotate_logs.result mysql-test/suite/rpl/t/rpl_migration_crash_safe.test mysql-test/suite/rpl/t/rpl_rotate_logs.test mysql-test/suite/sys_vars/r/master_info_repository_basic.result mysql-test/suite/sys_vars/r/relay_log_info_repository_basic.result mysql-test/suite/sys_vars/t/master_info_repository_basic.test mysql-test/suite/sys_vars/t/relay_log_info_repository_basic.test mysql-test/t/alter_table.test mysql-test/t/func_group.test mysql-test/t/innodb_mysql_lock.test mysql-test/t/innodb_mysql_sync.test mysql-test/t/lowercase_table2.test mysql-test/t/mysqlslap.test mysql-test/t/plugin_auth.test mysql-test/t/show_check.test mysql-test/t/sp-destruct.test mysql-test/t/variables.test mysql-test/t/view.test mysql-test/t/xa.test mysys/charset.c mysys/my_init.c mysys/my_thr_init.c mysys/mysys_priv.h plugin/auth/auth_socket.c scripts/mysql_install_db.pl.in scripts/mysql_install_db.sh scripts/mysql_system_tables_fix.sql sql/binlog.cc sql/field.cc sql/filesort.cc sql/hostname.cc sql/item.cc sql/item.h sql/item_buff.cc sql/item_cmpfunc.cc sql/item_func.cc sql/item_func.h sql/item_strfunc.cc sql/item_sum.cc sql/keycaches.cc sql/mdl.h sql/mysqld.cc sql/opt_range.cc sql/rpl_info.cc sql/rpl_info.h sql/rpl_info_factory.cc sql/rpl_info_factory.h sql/rpl_info_file.cc sql/rpl_info_file.h sql/rpl_info_handler.cc sql/rpl_info_handler.h sql/rpl_info_table.cc sql/rpl_info_table.h sql/rpl_info_table_access.cc sql/rpl_info_values.cc sql/rpl_mi.cc sql/rpl_mi.h sql/rpl_reporting.cc sql/rpl_rli.cc sql/rpl_rli.h sql/rpl_slave.cc sql/rpl_slave.h sql/share/errmsg-utf8.txt sql/sql_acl.cc sql/sql_base.h sql/sql_binlog.cc sql/sql_class.cc sql/sql_class.h sql/sql_insert.cc sql/sql_join_cache.cc sql/sql_plist.h sql/sql_select.cc sql/sql_show.cc sql/sql_table.cc sql/sql_update.cc sql/sys_vars.cc sql/sys_vars.h sql/table.cc sql/table.h storage/innobase/handler/ha_innodb.cc storage/innobase/handler/handler0alter.cc storage/innobase/include/sync0arr.h storage/innobase/include/trx0roll.h storage/innobase/row/row0merge.c storage/innobase/row/row0mysql.c storage/innobase/srv/srv0srv.c storage/innobase/sync/sync0arr.c storage/innobase/trx/trx0roll.c storage/perfschema/ha_perfschema.h storage/perfschema/pfs.h storage/perfschema/pfs_atomic.h storage/perfschema/pfs_column_types.h storage/perfschema/pfs_column_values.h storage/perfschema/pfs_con_slice.h storage/perfschema/pfs_defaults.h storage/perfschema/pfs_engine_table.h storage/perfschema/pfs_events_statements.h storage/perfschema/pfs_global.h storage/perfschema/pfs_instr.h storage/perfschema/pfs_server.h storage/perfschema/pfs_setup_actor.cc storage/perfschema/pfs_timer.h unittest/gunit/CMakeLists.txt vio/viosocket.c mysql-test/suite/binlog/r/binlog_bug23533.result mysql-test/suite/binlog/r/binlog_bug36391.result mysql-test/suite/rpl/r/rpl_bug37426.result mysql-test/suite/binlog/t/binlog_bug23533.test mysql-test/suite/binlog/t/binlog_bug36391.test mysql-test/suite/rpl/t/rpl_bug37426.test === modified file 'cmake/os/Windows.cmake' --- a/cmake/os/Windows.cmake 2010-11-19 23:41:00 +0000 +++ b/cmake/os/Windows.cmake 2011-04-14 08:09:49 +0000 @@ -1,4 +1,4 @@ -# Copyright (C) 2010 Sun Microsystems, Inc +# Copyright (C) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -191,3 +191,4 @@ IF(NOT HAVE_SIZE_OF_SSIZE_T) ENDIF() SET(FN_NO_CASE_SENSE 1) +SET(USE_SYMDIR 1) === modified file 'config.h.cmake' --- a/config.h.cmake 2011-04-14 01:36:24 +0000 +++ b/config.h.cmake 2011-04-19 15:24:55 +0000 @@ -509,6 +509,7 @@ #cmakedefine EXTRA_DEBUG 1 #cmakedefine BACKUP_TEST 1 #cmakedefine CYBOZU 1 +#cmakedefine USE_SYMDIR 1 /* Character sets and collations */ #cmakedefine MYSQL_DEFAULT_CHARSET_NAME "@MYSQL_DEFAULT_CHARSET_NAME@" === modified file 'include/my_net.h' --- a/include/my_net.h 2011-03-29 12:43:49 +0000 +++ b/include/my_net.h 2011-04-15 09:33:58 +0000 @@ -11,7 +11,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* This file is also used to make handling of sockets and ioctl() @@ -27,18 +27,23 @@ C_MODE_START #include + #ifdef HAVE_SYS_SOCKET_H #include #endif + #ifdef HAVE_NETINET_IN_H #include #endif + #ifdef HAVE_ARPA_INET_H #include #endif + #ifdef HAVE_POLL #include #endif + #ifdef HAVE_SYS_IOCTL_H #include #endif @@ -47,9 +52,9 @@ C_MODE_START #include #include #include -#if !defined(alpha_linux_port) -#include -#endif +# if !defined(alpha_linux_port) +# include +# endif #endif #if defined(__WIN__) @@ -61,7 +66,8 @@ C_MODE_START #define SD_BOTH 0x02 */ #define SHUT_RDWR 0x02 - +#else +#include /* getaddrinfo() & co */ #endif /* === modified file 'libmysql/libmysql.c' --- a/libmysql/libmysql.c 2011-03-08 19:14:42 +0000 +++ b/libmysql/libmysql.c 2011-04-15 09:33:58 +0000 @@ -1,11 +1,8 @@ -/* Copyright (C) 2000-2004 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation. - - There are special exceptions to the terms and conditions of the GPL as it - is applied to this software. + the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,7 +11,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include @@ -34,10 +31,6 @@ #include #endif #if !defined(__WIN__) -#include -#include -#include -#include #ifdef HAVE_SELECT_H #include #endif === modified file 'libmysqld/libmysqld.c' --- a/libmysqld/libmysqld.c 2010-08-09 08:32:50 +0000 +++ b/libmysqld/libmysqld.c 2011-04-15 09:33:58 +0000 @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -11,7 +11,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include @@ -33,10 +33,6 @@ #include #endif #if !defined(__WIN__) -#include -#include -#include -#include #ifdef HAVE_SELECT_H # include #endif === modified file 'mysql-test/collections/default.experimental' --- a/mysql-test/collections/default.experimental 2011-04-13 21:03:10 +0000 +++ b/mysql-test/collections/default.experimental 2011-04-18 20:23:04 +0000 @@ -2,8 +2,7 @@ # in alphabetical order. This also helps with merge conflict resolution. binlog.binlog_multi_engine # joro : NDB tests marked as experimental as agreed with bochklin -binlog.binlog_bug23533 # WL#5867: skozlov: test case moved from unused bugs suite -binlog.binlog_bug36391 # WL#5867: skozlov: test case moved from unused bugs suite +binlog.binlog_bug23533 # skozlov: BUG#12371924 funcs_1.charset_collation_1 # depends on compile-time decisions @@ -19,12 +18,12 @@ main.subquery_sj_none @solaris main.type_float @freebsd # Bug#38965 2010-05-04 alik test cases gis-rtree, type_float, type_newdecimal fail in embedded server main.wait_timeout @solaris # Bug#51244 2010-04-26 alik wait_timeout fails on OpenSolaris +rpl.rpl_checksum # BUG#12370830 2011-04-18 sven rpl_checksum failed on pb2 (server crash) rpl.rpl_innodb_bug28430 # Bug#46029 rpl.rpl_row_sp011 @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun rpl.rpl_delayed_slave # BUG#57514 rpl_delayed_slave fails sporadically in pb rpl.rpl_seconds_behind_master # BUG#58053 2010-11-24 luis fails sporadically on pb2 rpl.rpl_show_slave_running # BUG#12346048 2011-04-11 sven fails sporadically on pb2 -rpl.rpl_bug37426 # WL#5867: skozlov: test case moved from unused bugs suite sys_vars.max_sp_recursion_depth_func @solaris # Bug#47791 2010-01-20 alik Several test cases fail on Solaris with error Thread stack overrun sys_vars.plugin_dir_basic # Bug#52223 2010-11-24 alik Test "plugin_dir_basic" does not support RPM build (test) directory structure === modified file 'mysql-test/collections/default.weekly' --- a/mysql-test/collections/default.weekly 2011-04-06 04:31:38 +0000 +++ b/mysql-test/collections/default.weekly 2011-04-14 05:33:57 +0000 @@ -11,17 +11,17 @@ perl mysql-test-run.pl --timer --force - # Non debug runs of all the tests run in the daily and weekly collections -perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=normal --vardir=var-normal --report-features --skip-test-list=collections/disabled-daily.list --unit-tests +perl mysql-test-run.pl --force --timer --big-test --testcase-timeout=60 --parallel=auto --experimental=collections/default.experimental --comment=normal --vardir=var-normal --report-features --skip-test-list=collections/disabled-daily.list --unit-tests perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --skip-test-list=collections/disabled-daily.list perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=row --vardir=var-row --mysqld=--binlog-format=row --skip-test-list=collections/disabled-daily.list perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=ps_row --vardir=var-ps_row --mysqld=--binlog-format=row --ps-protocol --skip-test-list=collections/disabled-daily.list perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=embedded --vardir=var-embedded --embedded perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=ps --vardir=var-ps --ps-protocol --skip-test-list=collections/disabled-daily.list -perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=funcs2 --vardir=var-funcs2 --suite=funcs_2 -perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=partitions --vardir=var-parts --suite=parts -perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=stress --vardir=var-stress --suite=stress -perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=jp --vardir=var-jp --suite=jp -perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=nist --vardir=var-nist --suite=nist +perl mysql-test-run.pl --force --timer --big-test --testcase-timeout=60 --parallel=auto --experimental=collections/default.experimental --comment=funcs2 --vardir=var-funcs2 --suite=funcs_2 +perl mysql-test-run.pl --force --timer --big-test --testcase-timeout=60 --parallel=auto --experimental=collections/default.experimental --comment=partitions --vardir=var-parts --suite=parts +perl mysql-test-run.pl --force --timer --big-test --testcase-timeout=60 --parallel=auto --experimental=collections/default.experimental --comment=stress --vardir=var-stress --suite=stress +perl mysql-test-run.pl --force --timer --big-test --testcase-timeout=60 --parallel=auto --experimental=collections/default.experimental --comment=jp --vardir=var-jp --suite=jp +perl mysql-test-run.pl --force --timer --big-test --testcase-timeout=60 --parallel=auto --experimental=collections/default.experimental --comment=nist --vardir=var-nist --suite=nist perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=nist+ps --vardir=var-ps_nist --suite=nist --ps-protocol perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=rpl_binlog_checksum --vardir=var-rpl_binlog_checksum --suite=rpl,binlog --mysqld=--binlog-checksum=CRC32 --skip-test-list=collections/disabled-daily.list perl mysql-test-run.pl --force --timer --parallel=auto --experimental=collections/default.experimental --comment=rpl_crash_safe_relay --vardir=var-rpl_crash_safe_relay --suite=rpl --mysqld=--relay-log-info-repository=TABLE --skip-test-list=collections/disabled-daily.list === modified file 'mysql-test/include/subquery.inc' --- a/mysql-test/include/subquery.inc 2011-02-02 09:04:55 +0000 +++ b/mysql-test/include/subquery.inc 2011-04-15 08:11:49 +0000 @@ -5064,6 +5064,28 @@ DROP TABLE t1; --echo # +--echo # Bug #11765713 58705: +--echo # OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES +--echo # CREATED BY OPT_SUM_QUERY +--echo # + +CREATE TABLE t1(a INT NOT NULL, KEY (a)); +INSERT INTO t1 VALUES (0), (1); + +--error ER_SUBQUERY_NO_1_ROW +SELECT 1 as foo FROM t1 WHERE a < SOME + (SELECT a FROM t1 WHERE a <=> + (SELECT a FROM t1) + ); + +SELECT 1 as foo FROM t1 WHERE a < SOME + (SELECT a FROM t1 WHERE a <=> + (SELECT a FROM t1 where a is null) + ); + +DROP TABLE t1; + +--echo # --echo # Bug #57704: Cleanup code dies with void TABLE::set_keyread(bool): --echo # Assertion `file' failed. --echo # === modified file 'mysql-test/lib/My/Find.pm' --- a/mysql-test/lib/My/Find.pm 2011-02-24 14:11:05 +0000 +++ b/mysql-test/lib/My/Find.pm 2011-04-15 08:37:20 +0000 @@ -1,5 +1,5 @@ # -*- cperl -*- -# Copyright (C) 2008 MySQL AB +# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -156,8 +156,7 @@ sub my_find_paths { # User can select to look in a special build dir # which is a subdirectory of any of the paths my @extra_dirs; - my $build_dir= $::opt_config_dir || $ENV{MTR_VS_CONFIG} - || $ENV{MTR_BUILD_DIR}; + my $build_dir= $::opt_vs_config || $ENV{MTR_VS_CONFIG} || $ENV{MTR_BUILD_DIR}; push(@extra_dirs, $build_dir) if defined $build_dir; if (defined $extension){ === modified file 'mysql-test/lib/mtr_gcov.pl' --- a/mysql-test/lib/mtr_gcov.pl 2011-01-18 11:01:40 +0000 +++ b/mysql-test/lib/mtr_gcov.pl 2011-04-14 12:25:15 +0000 @@ -1,5 +1,5 @@ # -*- cperl -*- -# Copyright (C) 2004, 2006 MySQL AB, 2009 Sun Microsystems, Inc. +# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ sub gcov_prepare ($) { # # Collect gcov statistics. # Arguments: -# $dir basedir, normally source directory +# $dir basedir, normally build directory # $gcov gcov utility program [path] name # $gcov_msg message file name # $gcov_err error file name @@ -43,29 +43,25 @@ sub gcov_collect ($$$) { my $start_dir= cwd(); print "Collecting source coverage info using '$gcov'...\n"; - -f "$start_dir/$gcov_msg" and unlink("$start_dir/$gcov_msg"); - -f "$start_dir/$gcov_err" and unlink("$start_dir/$gcov_err"); + -f "$dir/$gcov_msg" and unlink("$dir/$gcov_msg"); + -f "$dir/$gcov_err" and unlink("$dir/$gcov_err"); my @dirs= `find "$dir" -type d -print | sort`; #print "List of directories:\n@dirs\n"; foreach my $d ( @dirs ) { - my $dir_reported= 0; chomp($d); chdir($d) or next; - foreach my $f ( (glob("*.h"), glob("*.cc"), glob("*.c")) ) { - $f =~ /(.*)\.[ch]c?/; - -f "$1.gcno" or next; - if (!$dir_reported) { - print "Collecting in '$d'...\n"; - $dir_reported= 1; - } - system("$gcov $f 2>>$start_dir/$gcov_err >>$start_dir/$gcov_msg"); + my @flist= glob("*.*.gcno"); + print ("Collecting in '$d'...\n") if @flist; + + foreach my $f (@flist) { + system("$gcov $f 2>>$dir/$gcov_err >>$dir/$gcov_msg"); } chdir($start_dir); } - print "gcov info in $gcov_msg, errors in $gcov_err\n"; + print "gcov info in $dir/$gcov_msg, errors in $dir/$gcov_err\n"; } === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2011-04-07 08:39:10 +0000 +++ b/mysql-test/mysql-test-run.pl 2011-04-15 08:39:02 +0000 @@ -211,8 +211,8 @@ our $opt_clean_vardir= $ENV{'MTR_CLEAN_V our $opt_gcov; our $opt_gcov_exe= "gcov"; -our $opt_gcov_err= "mysql-test-gcov.msg"; -our $opt_gcov_msg= "mysql-test-gcov.err"; +our $opt_gcov_err= "mysql-test-gcov.err"; +our $opt_gcov_msg= "mysql-test-gcov.msg"; our $opt_gprof; our %gprof_dirs; @@ -508,7 +508,7 @@ sub main { mtr_print_line(); if ( $opt_gcov ) { - gcov_collect($basedir, $opt_gcov_exe, + gcov_collect($bindir, $opt_gcov_exe, $opt_gcov_msg, $opt_gcov_err); } @@ -1200,7 +1200,7 @@ sub command_line_setup { chomp; # remove comments (# foo) at the beginning of the line, or after a # blank at the end of the line - s/( +|^)#.*$//; + s/(\s+|^)#.*$//; # If @ platform specifier given, use this entry only if it contains # @ or @! where xxx != platform if (/\@.*/) @@ -1211,8 +1211,8 @@ sub command_line_setup { s/\@.*$//; } # remove whitespace - s/^ +//; - s/ +$//; + s/^\s+//; + s/\s+$//; # if nothing left, don't need to remember this line if ( $_ eq "" ) { next; === modified file 'mysql-test/r/func_analyse.result' --- a/mysql-test/r/func_analyse.result 2011-03-14 18:11:41 +0000 +++ b/mysql-test/r/func_analyse.result 2011-04-14 09:32:17 +0000 @@ -135,6 +135,19 @@ SELECT * FROM t1 PROCEDURE ANALYSE(); Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype test.t1.a e e- 1 2 0 0 1.3333 NULL ENUM('e','e-') NOT NULL DROP TABLE t1; +# +# Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL +# +CREATE TABLE t1(f1 INT) ENGINE=MYISAM; +CREATE TABLE t2(f2 INT) ENGINE=INNODB; +INSERT INTO t2 VALUES (1); +SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype +test.t1.f1 NULL NULL 0 0 0 1 0.0 0.0 CHAR(0) +SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype +test.t2.f2 1 1 1 1 0 0 1.0000 0.0000 ENUM('1') NOT NULL +DROP TABLE t1, t2; End of 5.1 tests # # Bug #47338 assertion in handler::ha_external_lock === modified file 'mysql-test/r/loaddata.result' --- a/mysql-test/r/loaddata.result 2010-07-14 12:05:20 +0000 +++ b/mysql-test/r/loaddata.result 2011-04-15 08:55:21 +0000 @@ -532,4 +532,11 @@ a 0 1 DROP TABLE t1; +# +# Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U +# +CREATE TABLE t1(f1 INT); +SELECT 0xE1BB30 INTO OUTFILE 't1.dat'; +LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8; +DROP TABLE t1; End of 5.1 tests === modified file 'mysql-test/r/subquery_all.result' --- a/mysql-test/r/subquery_all.result 2011-03-29 08:10:26 +0000 +++ b/mysql-test/r/subquery_all.result 2011-04-15 08:11:49 +0000 @@ -6213,6 +6213,24 @@ id select_type table type possible_keys DROP TABLE t2; DROP TABLE t1; # +# Bug #11765713 58705: +# OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES +# CREATED BY OPT_SUM_QUERY +# +CREATE TABLE t1(a INT NOT NULL, KEY (a)); +INSERT INTO t1 VALUES (0), (1); +SELECT 1 as foo FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1) +); +ERROR 21000: Subquery returns more than 1 row +SELECT 1 as foo FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1 where a is null) +); +foo +DROP TABLE t1; +# # Bug #57704: Cleanup code dies with void TABLE::set_keyread(bool): # Assertion `file' failed. # === modified file 'mysql-test/r/subquery_nomat_nosj.result' --- a/mysql-test/r/subquery_nomat_nosj.result 2011-03-24 13:16:36 +0000 +++ b/mysql-test/r/subquery_nomat_nosj.result 2011-04-15 08:11:49 +0000 @@ -6213,6 +6213,24 @@ id select_type table type possible_keys DROP TABLE t2; DROP TABLE t1; # +# Bug #11765713 58705: +# OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES +# CREATED BY OPT_SUM_QUERY +# +CREATE TABLE t1(a INT NOT NULL, KEY (a)); +INSERT INTO t1 VALUES (0), (1); +SELECT 1 as foo FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1) +); +ERROR 21000: Subquery returns more than 1 row +SELECT 1 as foo FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1 where a is null) +); +foo +DROP TABLE t1; +# # Bug #57704: Cleanup code dies with void TABLE::set_keyread(bool): # Assertion `file' failed. # === modified file 'mysql-test/r/subquery_none.result' --- a/mysql-test/r/subquery_none.result 2011-02-14 11:21:26 +0000 +++ b/mysql-test/r/subquery_none.result 2011-04-15 08:11:49 +0000 @@ -6212,6 +6212,24 @@ id select_type table type possible_keys DROP TABLE t2; DROP TABLE t1; # +# Bug #11765713 58705: +# OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES +# CREATED BY OPT_SUM_QUERY +# +CREATE TABLE t1(a INT NOT NULL, KEY (a)); +INSERT INTO t1 VALUES (0), (1); +SELECT 1 as foo FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1) +); +ERROR 21000: Subquery returns more than 1 row +SELECT 1 as foo FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1 where a is null) +); +foo +DROP TABLE t1; +# # Bug #57704: Cleanup code dies with void TABLE::set_keyread(bool): # Assertion `file' failed. # === modified file 'mysql-test/r/type_timestamp.result' --- a/mysql-test/r/type_timestamp.result 2011-01-12 17:24:53 +0000 +++ b/mysql-test/r/type_timestamp.result 2011-04-18 08:47:41 +0000 @@ -523,6 +523,69 @@ a 2000-01-01 00:00:01 2000-01-01 00:00:01 DROP TABLE t1; +# +# Bug#50774: failed to get the correct resultset when timestamp values +# are appended with .0 +# +CREATE TABLE t1 ( a TIMESTAMP, KEY ( a ) ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:01' ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:02' ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:03' ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:04' ); +SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0'; +a +2010-02-01 09:31:02 +2010-02-01 09:31:03 +2010-02-01 09:31:04 +SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' <= a; +a +2010-02-01 09:31:02 +2010-02-01 09:31:03 +2010-02-01 09:31:04 +SELECT * FROM t1 WHERE a <= '2010-02-01 09:31:02.0'; +a +2010-02-01 09:31:01 +2010-02-01 09:31:02 +SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' >= a; +a +2010-02-01 09:31:01 +2010-02-01 09:31:02 +EXPLAIN +SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0'; +id select_type table type possible_keys key key_len ref rows Extra +x x x range x x x x x x +SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0'; +a +2010-02-01 09:31:02 +2010-02-01 09:31:03 +2010-02-01 09:31:04 +CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:01' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:02' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:03' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:04' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:05' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:06' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:07' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:08' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:09' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:10' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:11' ); +# The bug would cause the range optimizer's comparison to use an open +# interval here. This reveals itself only in the number of reads +# performed. +FLUSH STATUS; +EXPLAIN +SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; +id select_type table type possible_keys key key_len ref rows Extra +x x x range x x x x x x +SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; +a +2010-02-01 09:31:01 +SHOW STATUS LIKE 'Handler_read_next'; +Variable_name Value +Handler_read_next 1 +DROP TABLE t1, t2; End of 5.1 tests Bug#50888 valgrind warnings in Field_timestamp::val_str === modified file 'mysql-test/r/warnings.result' --- a/mysql-test/r/warnings.result 2010-08-30 06:38:09 +0000 +++ b/mysql-test/r/warnings.result 2011-04-15 12:14:35 +0000 @@ -316,3 +316,25 @@ SHOW ERRORS; Level Code Message Error 1051 Unknown table 'test.t1' End of 5.0 tests + +-- Bug#55847 + +DROP TABLE IF EXISTS t1; +DROP FUNCTION IF EXISTS f1; +CREATE TABLE t1(a INT UNIQUE); +CREATE FUNCTION f1(x INT) RETURNS INT +BEGIN +INSERT INTO t1 VALUES(x); +INSERT INTO t1 VALUES(x); +RETURN x; +END| + +SHOW TABLES WHERE f1(11) = 11; +ERROR 23000: Duplicate entry '11' for key 'a' + +SHOW WARNINGS; +Level Code Message +Error 1062 Duplicate entry '11' for key 'a' + +DROP TABLE t1; +DROP FUNCTION f1; === modified file 'mysql-test/r/xa.result' --- a/mysql-test/r/xa.result 2011-04-12 10:59:59 +0000 +++ b/mysql-test/r/xa.result 2011-04-14 08:47:14 +0000 @@ -200,3 +200,32 @@ SELECT * FROM t1; a 1 DROP TABLE t1; +# +# Bug#12352846 - TRANS_XA_START(THD*): +# ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() +# FAILED +# +DROP TABLE IF EXISTS t1, t2; +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (a INT); +START TRANSACTION; +INSERT INTO t1 VALUES (1); +# Connection con2 +XA START 'xid1'; +# Sending: +INSERT INTO t2 SELECT a FROM t1; +# Connection default +# Waiting until INSERT ... is blocked +DELETE FROM t1; +COMMIT; +# Connection con2 +# Reaping: INSERT INTO t2 SELECT a FROM t1 +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +XA COMMIT 'xid1'; +ERROR XA102: XA_RBDEADLOCK: Transaction branch was rolled back: deadlock was detected +XA START 'xid1'; +XA END 'xid1'; +XA PREPARE 'xid1'; +XA ROLLBACK 'xid1'; +# Connection default +DROP TABLE t1, t2; === modified file 'mysql-test/suite/binlog/r/binlog_bug23533.result' --- a/mysql-test/suite/binlog/r/binlog_bug23533.result 2011-04-13 20:18:08 +0000 +++ b/mysql-test/suite/binlog/r/binlog_bug23533.result 2011-04-18 19:59:15 +0000 @@ -3,10 +3,9 @@ CREATE TABLE t1 (a INT NOT NULL AUTO_INC SELECT COUNT(*) FROM t1; COUNT(*) 1000 -SHOW VARIABLES LIKE 'max_binlog_cache_size'; -Variable_name Value -max_binlog_cache_size 4294963200 +SET @saved_binlog_cache_size=@@binlog_cache_size; SET @saved_max_binlog_cache_size=@@max_binlog_cache_size; +SET GLOBAL binlog_cache_size=4096; SET GLOBAL max_binlog_cache_size=4096; START TRANSACTION; CREATE TABLE t2 SELECT * FROM t1; @@ -16,4 +15,5 @@ SHOW TABLES LIKE 't%'; Tables_in_test (t%) t1 SET GLOBAL max_binlog_cache_size=@saved_max_binlog_cache_size; +SET GLOBAL binlog_cache_size=@saved_binlog_cache_size; DROP TABLE t1; === modified file 'mysql-test/suite/binlog/t/binlog_bug23533.test' --- a/mysql-test/suite/binlog/t/binlog_bug23533.test 2011-04-13 20:18:08 +0000 +++ b/mysql-test/suite/binlog/t/binlog_bug23533.test 2011-04-18 19:59:15 +0000 @@ -15,15 +15,18 @@ CREATE TABLE t1 (a INT NOT NULL AUTO_INC let $i= 1000; while ($i) { + BEGIN; eval INSERT INTO t1 VALUES($i, REPEAT('x', 4096)); + COMMIT; dec $i; } --enable_query_log SELECT COUNT(*) FROM t1; # Set small value for max_binlog_cache_size -SHOW VARIABLES LIKE 'max_binlog_cache_size'; +SET @saved_binlog_cache_size=@@binlog_cache_size; SET @saved_max_binlog_cache_size=@@max_binlog_cache_size; +SET GLOBAL binlog_cache_size=4096; SET GLOBAL max_binlog_cache_size=4096; # Copied data from t1 into t2 large than max_binlog_cache_size @@ -35,4 +38,5 @@ SHOW TABLES LIKE 't%'; # 5.1 End of Test SET GLOBAL max_binlog_cache_size=@saved_max_binlog_cache_size; +SET GLOBAL binlog_cache_size=@saved_binlog_cache_size; DROP TABLE t1; === modified file 'mysql-test/t/func_analyse.test' --- a/mysql-test/t/func_analyse.test 2011-03-14 18:11:41 +0000 +++ b/mysql-test/t/func_analyse.test 2011-04-14 09:32:17 +0000 @@ -1,6 +1,7 @@ # # Test of procedure analyse # +-- source include/have_innodb.inc --disable_warnings drop table if exists t1,t2; @@ -144,6 +145,17 @@ INSERT INTO t1 VALUES ('e'),('e'),('e-') SELECT * FROM t1 PROCEDURE ANALYSE(); DROP TABLE t1; +--echo # +--echo # Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL +--echo # + +CREATE TABLE t1(f1 INT) ENGINE=MYISAM; +CREATE TABLE t2(f2 INT) ENGINE=INNODB; +INSERT INTO t2 VALUES (1); +SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE(); +SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE(); +DROP TABLE t1, t2; + --echo End of 5.1 tests --echo # === modified file 'mysql-test/t/loaddata.test' --- a/mysql-test/t/loaddata.test 2010-07-14 12:05:20 +0000 +++ b/mysql-test/t/loaddata.test 2011-04-15 08:55:21 +0000 @@ -601,5 +601,18 @@ DROP TABLE t1; let $MYSQLD_DATADIR= `select @@datadir`; remove_file $MYSQLD_DATADIR/test/tmpp2.txt; +--echo # +--echo # Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U +--echo # + +CREATE TABLE t1(f1 INT); +EVAL SELECT 0xE1BB30 INTO OUTFILE 't1.dat'; +--disable_warnings +LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8; +--enable_warnings + +DROP TABLE t1; +let $MYSQLD_DATADIR= `select @@datadir`; +remove_file $MYSQLD_DATADIR/test/t1.dat; --echo End of 5.1 tests === modified file 'mysql-test/t/type_timestamp.test' --- a/mysql-test/t/type_timestamp.test 2011-01-12 12:58:47 +0000 +++ b/mysql-test/t/type_timestamp.test 2011-04-18 08:46:17 +0000 @@ -362,6 +362,53 @@ SELECT a FROM t1 WHERE a >= '20000101000 DROP TABLE t1; +--echo # +--echo # Bug#50774: failed to get the correct resultset when timestamp values +--echo # are appended with .0 +--echo # +CREATE TABLE t1 ( a TIMESTAMP, KEY ( a ) ); + +INSERT INTO t1 VALUES( '2010-02-01 09:31:01' ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:02' ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:03' ); +INSERT INTO t1 VALUES( '2010-02-01 09:31:04' ); + +SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0'; +SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' <= a; +SELECT * FROM t1 WHERE a <= '2010-02-01 09:31:02.0'; +SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' >= a; + +--replace_column 1 x 2 x 3 x 5 x 6 x 7 x 8 x 9 x 10 x +EXPLAIN +SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0'; +SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0'; + +CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) ); + +INSERT INTO t2 VALUES( '2010-02-01 09:31:01' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:02' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:03' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:04' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:05' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:06' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:07' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:08' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:09' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:10' ); +INSERT INTO t2 VALUES( '2010-02-01 09:31:11' ); + +--echo # The bug would cause the range optimizer's comparison to use an open +--echo # interval here. This reveals itself only in the number of reads +--echo # performed. +FLUSH STATUS; +--replace_column 1 x 2 x 3 x 5 x 6 x 7 x 8 x 9 x 10 x +EXPLAIN +SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; +SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; +SHOW STATUS LIKE 'Handler_read_next'; + +DROP TABLE t1, t2; + --echo End of 5.1 tests --echo === modified file 'mysql-test/t/warnings.test' --- a/mysql-test/t/warnings.test 2009-11-13 10:17:53 +0000 +++ b/mysql-test/t/warnings.test 2011-04-15 12:02:22 +0000 @@ -228,3 +228,43 @@ DROP TABLE t1; SHOW ERRORS; --echo End of 5.0 tests + +# +# Bug#55847: SHOW WARNINGS returns empty result set when SQLEXCEPTION is active +# + +--echo +--echo -- Bug#55847 +--echo + +--disable_warnings +DROP TABLE IF EXISTS t1; +DROP FUNCTION IF EXISTS f1; +--enable_warnings + +CREATE TABLE t1(a INT UNIQUE); + +delimiter |; + +CREATE FUNCTION f1(x INT) RETURNS INT +BEGIN + INSERT INTO t1 VALUES(x); + INSERT INTO t1 VALUES(x); + RETURN x; +END| + +delimiter ;| + +--echo + +--error ER_DUP_ENTRY +SHOW TABLES WHERE f1(11) = 11; + +--echo + +SHOW WARNINGS; + +--echo + +DROP TABLE t1; +DROP FUNCTION f1; === modified file 'mysql-test/t/xa.test' --- a/mysql-test/t/xa.test 2011-04-12 10:59:59 +0000 +++ b/mysql-test/t/xa.test 2011-04-14 08:47:14 +0000 @@ -3,6 +3,8 @@ # -- source include/have_innodb.inc +--source include/not_embedded.inc + # Save the initial number of concurrent sessions --source include/count_sessions.inc @@ -326,6 +328,59 @@ SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # Bug#12352846 - TRANS_XA_START(THD*): +--echo # ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() +--echo # FAILED +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +--enable_warnings + +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (a INT); + +START TRANSACTION; +INSERT INTO t1 VALUES (1); + +--echo # Connection con2 +--connect (con2,localhost,root) +XA START 'xid1'; +--echo # Sending: +--send INSERT INTO t2 SELECT a FROM t1 + +--echo # Connection default +--connection default +let $wait_condition= + SELECT COUNT(*) = 1 FROM information_schema.processlist + WHERE state = "Sending data" + AND info = "INSERT INTO t2 SELECT a FROM t1"; +--echo # Waiting until INSERT ... is blocked +--source include/wait_condition.inc +DELETE FROM t1; +COMMIT; + +--echo # Connection con2 +--connection con2 +--echo # Reaping: INSERT INTO t2 SELECT a FROM t1 +--error ER_LOCK_DEADLOCK +--reap +--error ER_XA_RBDEADLOCK +XA COMMIT 'xid1'; +# This caused the assert to be triggered +XA START 'xid1'; + +XA END 'xid1'; +XA PREPARE 'xid1'; +XA ROLLBACK 'xid1'; + +--echo # Connection default +connection default; +DROP TABLE t1, t2; +disconnect con2; + + # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc === modified file 'sql-common/client.c' --- a/sql-common/client.c 2011-03-21 02:16:39 +0000 +++ b/sql-common/client.c 2011-04-19 15:24:55 +0000 @@ -37,10 +37,6 @@ #include "mysql.h" -#ifndef __WIN__ -#include -#endif - /* Remove client convenience wrappers */ #undef max_allowed_packet #undef net_buffer_length @@ -61,6 +57,7 @@ my_bool net_flush(NET *net); #else /*EMBEDDED_LIBRARY*/ #define CLI_MYSQL_REAL_CONNECT STDCALL mysql_real_connect #endif /*EMBEDDED_LIBRARY*/ + #include #include #include @@ -69,6 +66,7 @@ my_bool net_flush(NET *net); #include "mysqld_error.h" #include "errmsg.h" #include + #if !defined(__WIN__) #include /* because of signal() */ #endif /* !defined(__WIN__) */ @@ -76,21 +74,20 @@ my_bool net_flush(NET *net); #include #include #include + #ifdef HAVE_PWD_H #include #endif + #if !defined(__WIN__) -#include -#include -#include -#include #ifdef HAVE_SELECT_H # include #endif #ifdef HAVE_SYS_SELECT_H -#include +# include #endif #endif /* !defined(__WIN__) */ + #ifdef HAVE_SYS_UN_H # include #endif @@ -111,6 +108,7 @@ my_bool net_flush(NET *net); #include "client_settings.h" #include #include + #define native_password_plugin_name "mysql_native_password" #define old_password_plugin_name "mysql_old_password" === modified file 'sql/CMakeLists.txt' --- a/sql/CMakeLists.txt 2011-02-02 08:30:13 +0000 +++ b/sql/CMakeLists.txt 2011-04-15 09:04:21 +0000 @@ -64,6 +64,7 @@ SET(SQL_SHARED_SOURCES item_sum.cc item_timefunc.cc item_xmlfunc.cc + item_inetfunc.cc key.cc keycaches.cc lock.cc === modified file 'sql/hostname.cc' --- a/sql/hostname.cc 2011-04-08 10:32:40 +0000 +++ b/sql/hostname.cc 2011-04-15 09:33:58 +0000 @@ -26,10 +26,6 @@ #include "sql_priv.h" #include "hostname.h" -#include "my_global.h" -#ifndef __WIN__ -#include // getservbyname, servent -#endif #include "hash_filo.h" #include #include "log.h" // sql_print_warning, === modified file 'sql/item_create.cc' --- a/sql/item_create.cc 2011-03-09 20:54:55 +0000 +++ b/sql/item_create.cc 2011-04-15 09:04:21 +0000 @@ -30,6 +30,7 @@ #include "set_var.h" #include "sp_head.h" #include "sp.h" +#include "item_inetfunc.h" /* ============================================================================= === modified file 'sql/item_func.cc' --- a/sql/item_func.cc 2011-04-08 13:41:38 +0000 +++ b/sql/item_func.cc 2011-04-15 09:04:21 +0000 @@ -5711,61 +5711,6 @@ void Item_func_get_system_var::cleanup() } -longlong Item_func_inet_aton::val_int() -{ - DBUG_ASSERT(fixed == 1); - uint byte_result = 0; - ulonglong result = 0; // We are ready for 64 bit addresses - const char *p,* end; - char c = '.'; // we mark c to indicate invalid IP in case length is 0 - char buff[36]; - int dot_count= 0; - - String *s, tmp(buff, sizeof(buff), &my_charset_latin1); - if (!(s = args[0]->val_str_ascii(&tmp))) // If null value - goto err; - null_value=0; - - end= (p = s->ptr()) + s->length(); - while (p < end) - { - c = *p++; - int digit = (int) (c - '0'); - if (digit >= 0 && digit <= 9) - { - if ((byte_result = byte_result * 10 + digit) > 255) - goto err; // Wrong address - } - else if (c == '.') - { - dot_count++; - result= (result << 8) + (ulonglong) byte_result; - byte_result = 0; - } - else - goto err; // Invalid character - } - if (c != '.') // IP number can't end on '.' - { - /* - Handle short-forms addresses according to standard. Examples: - 127 -> 0.0.0.127 - 127.1 -> 127.0.0.1 - 127.2.1 -> 127.2.0.1 - */ - switch (dot_count) { - case 1: result<<= 8; /* Fall through */ - case 2: result<<= 8; /* Fall through */ - } - return (result << 8) + (ulonglong) byte_result; - } - -err: - null_value=1; - return 0; -} - - void Item_func_match::init_search(bool no_order) { DBUG_ENTER("Item_func_match::init_search"); === modified file 'sql/item_func.h' --- a/sql/item_func.h 2011-04-08 13:41:38 +0000 +++ b/sql/item_func.h 2011-04-15 09:04:21 +0000 @@ -1635,17 +1635,6 @@ public: }; -class Item_func_inet_aton : public Item_int_func -{ -public: - Item_func_inet_aton(Item *a) :Item_int_func(a) {} - longlong val_int(); - const char *func_name() const { return "inet_aton"; } - void fix_length_and_dec() - { decimals= 0; max_length= 21; maybe_null= 1; unsigned_flag= 1;} -}; - - /* for fulltext search */ #include === added file 'sql/item_inetfunc.cc' --- a/sql/item_inetfunc.cc 1970-01-01 00:00:00 +0000 +++ b/sql/item_inetfunc.cc 2011-04-15 09:42:59 +0000 @@ -0,0 +1,133 @@ +/* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "item_inetfunc.h" + +#include "violite.h" // vio_getnameinfo() + +/////////////////////////////////////////////////////////////////////////// + +longlong Item_func_inet_aton::val_int() +{ + DBUG_ASSERT(fixed); + + uint byte_result= 0; + ulonglong result= 0; + const char *p,* end; + char c= '.'; // we mark c to indicate invalid IP in case length is 0 + char buff[36]; + int dot_count= 0; + + String tmp(buff, sizeof (buff), &my_charset_latin1); + String *s= args[0]->val_str_ascii(&tmp); + + if (!s) // If null value + goto err; + + null_value= 0; + + p= s->ptr(); + end= p + s->length(); + while (p < end) + { + c= *p++; + int digit= (int) (c - '0'); + if (digit >= 0 && digit <= 9) + { + byte_result= byte_result * 10 + digit; + if (byte_result > 255) + goto err; // Wrong address + } + else if (c == '.') + { + dot_count++; + result= (result << 8) + (ulonglong) byte_result; + byte_result= 0; + } + else + goto err; // Invalid character + } + if (c != '.') // IP number can't end on '.' + { + /* + Attempt to support short-form addresses (i.e. classful addresses). + The current code does not support full range of classful addresses. + Examples: + 127 -> 0.0.0.127 + 127.255 -> 127.0.0.255 + 127.256 -> NULL (should have been 127.0.1.0) + 127.2.1 -> 127.2.0.1 + */ + switch (dot_count) { + case 1: result<<= 8; /* Fall through */ + case 2: result<<= 8; /* Fall through */ + } + return (result << 8) + (ulonglong) byte_result; + } + +err: + null_value=1; + return 0; +} + +/////////////////////////////////////////////////////////////////////////// + +String* Item_func_inet_ntoa::val_str(String* str) +{ + DBUG_ASSERT(fixed); + + ulonglong n= (ulonglong) args[0]->val_int(); + + /* + We do not know if args[0] is NULL until we have called + some val function on it if args[0] is not a constant! + + Also return null if n > 255.255.255.255 + */ + null_value= args[0]->null_value || n > (ulonglong) LL(4294967295); + + if (null_value) + return 0; // Null value + + str->set_charset(collation.collation); + str->length(0); + + uchar buf[8]; + int4store(buf, n); + + /* Now we can assume little endian. */ + + char num[4]; + num[3]= '.'; + + for (uchar *p= buf + 4; p-- > buf;) + { + uint c= *p; + uint n1, n2; // Try to avoid divisions + n1= c / 100; // 100 digits + c -= n1 * 100; + n2= c / 10; // 10 digits + c -= n2 * 10; // last digit + num[0]= (char) n1 + '0'; + num[1]= (char) n2 + '0'; + num[2]= (char) c + '0'; + uint length= (n1 ? 4 : n2 ? 3 : 2); // Remove pre-zero + uint dot_length= (p <= buf) ? 1 : 0; + + str->append(num + 4 - length, length - dot_length, &my_charset_latin1); + } + + return str; +} === added file 'sql/item_inetfunc.h' --- a/sql/item_inetfunc.h 1970-01-01 00:00:00 +0000 +++ b/sql/item_inetfunc.h 2011-04-15 09:39:46 +0000 @@ -0,0 +1,74 @@ +#ifndef ITEM_INETFUNC_INCLUDED +#define ITEM_INETFUNC_INCLUDED + +/* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + + +#include "item.h" + +/************************************************************************* + Item_func_inet_aton implements INET_ATON() SQL-function. +*************************************************************************/ + +class Item_func_inet_aton : public Item_int_func +{ +public: + inline Item_func_inet_aton(Item *arg) + : Item_int_func(arg) + {} + +public: + virtual longlong val_int(); + + virtual const char *func_name() const + { return "inet_aton"; } + + virtual void fix_length_and_dec() + { + decimals= 0; + max_length= 21; + maybe_null= 1; + unsigned_flag= 1; + } +}; + + +/************************************************************************* + Item_func_inet_ntoa implements INET_NTOA() SQL-function. +*************************************************************************/ + +class Item_func_inet_ntoa : public Item_str_func +{ +public: + inline Item_func_inet_ntoa(Item *arg) + : Item_str_func(arg) + { } + +public: + virtual String* val_str(String* str); + + virtual const char *func_name() const + { return "inet_ntoa"; } + + virtual void fix_length_and_dec() + { + decimals= 0; + fix_length_and_charset(3 * 8 + 7, default_charset()); + maybe_null= 1; + } +}; + +#endif // ITEM_INETFUNC_INCLUDED === modified file 'sql/item_strfunc.cc' --- a/sql/item_strfunc.cc 2011-04-08 13:41:38 +0000 +++ b/sql/item_strfunc.cc 2011-04-15 09:04:21 +0000 @@ -3513,48 +3513,6 @@ void Item_func_export_set::fix_length_an fix_char_length(length * 64 + sep_length * 63); } -String* Item_func_inet_ntoa::val_str(String* str) -{ - DBUG_ASSERT(fixed == 1); - uchar buf[8], *p; - ulonglong n = (ulonglong) args[0]->val_int(); - char num[4]; - - /* - We do not know if args[0] is NULL until we have called - some val function on it if args[0] is not a constant! - - Also return null if n > 255.255.255.255 - */ - if ((null_value= (args[0]->null_value || n > (ulonglong) LL(4294967295)))) - return 0; // Null value - - str->set_charset(collation.collation); - str->length(0); - int4store(buf,n); - - /* Now we can assume little endian. */ - - num[3]='.'; - for (p=buf+4 ; p-- > buf ; ) - { - uint c = *p; - uint n1,n2; // Try to avoid divisions - n1= c / 100; // 100 digits - c-= n1*100; - n2= c / 10; // 10 digits - c-=n2*10; // last digit - num[0]=(char) n1+'0'; - num[1]=(char) n2+'0'; - num[2]=(char) c+'0'; - uint length= (n1 ? 4 : n2 ? 3 : 2); // Remove pre-zero - uint dot_length= (p <= buf) ? 1 : 0; - (void) str->append(num + 4 - length, length - dot_length, - &my_charset_latin1); - } - return str; -} - #define get_esc_bit(mask, num) (1 & (*((mask) + ((num) >> 3))) >> ((num) & 7)) === modified file 'sql/item_strfunc.h' --- a/sql/item_strfunc.h 2011-03-22 11:44:40 +0000 +++ b/sql/item_strfunc.h 2011-04-15 09:04:21 +0000 @@ -780,22 +780,6 @@ class Item_func_export_set: public Item_ const char *func_name() const { return "export_set"; } }; -class Item_func_inet_ntoa : public Item_str_func -{ -public: - Item_func_inet_ntoa(Item *a) :Item_str_func(a) - { - } - String* val_str(String* str); - const char *func_name() const { return "inet_ntoa"; } - void fix_length_and_dec() - { - decimals= 0; - fix_length_and_charset(3 * 8 + 7, default_charset()); - maybe_null= 1; - } -}; - class Item_func_quote :public Item_str_func { String tmp_value; === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2011-04-14 01:36:24 +0000 +++ b/sql/mysqld.cc 2011-04-19 15:24:55 +0000 @@ -17,9 +17,6 @@ #include "sql_priv.h" #include "unireg.h" #include -#ifndef __WIN__ -#include // getservbyname, servent -#endif #include "sql_parse.h" // test_if_data_home_dir #include "sql_cache.h" // query_cache, query_cache_* #include "sql_locale.h" // MY_LOCALES, my_locales, my_locale_by_name === modified file 'sql/opt_sum.cc' --- a/sql/opt_sum.cc 2010-12-08 12:55:40 +0000 +++ b/sql/opt_sum.cc 2011-04-15 08:11:49 +0000 @@ -212,6 +212,7 @@ static int get_index_max_value(TABLE *ta /** Substitutes constants for some COUNT(), MIN() and MAX() functions. + @param thd thread handler @param tables list of leaves of join table tree @param all_fields All fields to be returned @param conds WHERE clause @@ -229,9 +230,12 @@ static int get_index_max_value(TABLE *ta HA_ERR_KEY_NOT_FOUND on impossible conditions @retval HA_ERR_... if a deadlock or a lock wait timeout happens, for example + @retval + ER_... e.g. ER_SUBQUERY_NO_1_ROW */ -int opt_sum_query(TABLE_LIST *tables, List &all_fields,Item *conds) +int opt_sum_query(THD *thd, + TABLE_LIST *tables, List &all_fields, Item *conds) { List_iterator_fast it(all_fields); int const_result= 1; @@ -243,6 +247,8 @@ int opt_sum_query(TABLE_LIST *tables, Li Item *item; int error; + DBUG_ENTER("opt_sum_query"); + if (conds) where_tables= conds->used_tables(); @@ -270,7 +276,7 @@ int opt_sum_query(TABLE_LIST *tables, Li WHERE t2.field IS NULL; */ if (tl->table->map & where_tables) - return 0; + DBUG_RETURN(0); } else used_tables|= tl->table->map; @@ -297,7 +303,7 @@ int opt_sum_query(TABLE_LIST *tables, Li if(error) { tl->table->file->print_error(error, MYF(ME_FATALERROR)); - return error; + DBUG_RETURN(error); } count*= tl->table->file->stats.records; } @@ -390,10 +396,10 @@ int opt_sum_query(TABLE_LIST *tables, Li if (error) { if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE) - return HA_ERR_KEY_NOT_FOUND; // No rows matching WHERE + DBUG_RETURN(HA_ERR_KEY_NOT_FOUND); // No rows matching WHERE /* HA_ERR_LOCK_DEADLOCK or some other error */ table->file->print_error(error, MYF(0)); - return(error); + DBUG_RETURN(error); } removed_tables|= table->map; } @@ -442,6 +448,10 @@ int opt_sum_query(TABLE_LIST *tables, Li const_result= 0; } } + + if (thd->is_error()) + DBUG_RETURN(thd->stmt_da->sql_errno()); + /* If we have a where clause, we can only ignore searching in the tables if MIN/MAX optimisation replaced all used tables @@ -451,7 +461,7 @@ int opt_sum_query(TABLE_LIST *tables, Li */ if (removed_tables && used_tables != removed_tables) const_result= 0; // We didn't remove all tables - return const_result; + DBUG_RETURN(const_result); } @@ -737,6 +747,12 @@ static bool matching_cond(bool max_fl, T if (is_null || (is_null_safe_eq && args[1]->is_null())) { + /* + If we have a non-nullable index, we cannot use it, + since set_null will be ignored, and we will compare uninitialized data. + */ + if (!part->field->real_maybe_null()) + DBUG_RETURN(false); part->field->set_null(); *key_ptr= (uchar) 1; } @@ -807,8 +823,9 @@ static bool matching_cond(bool max_fl, T @param[out] prefix_len Length of prefix for the search range @note - This function may set table->key_read to 1, which must be reset after - index is used! (This can only happen when function returns 1) + This function may set field->table->key_read to true, + which must be reset after index is used! + (This can only happen when function returns 1) @retval 0 Index can not be used to optimize MIN(field)/MAX(field) @@ -823,7 +840,9 @@ static bool find_key_for_maxmin(bool max uint *range_fl, uint *prefix_len) { if (!(field->flags & PART_KEY_FLAG)) - return 0; // Not key field + return false; // Not key field + + DBUG_ENTER("find_key_for_maxmin"); TABLE *table= field->table; uint idx= 0; @@ -848,7 +867,7 @@ static bool find_key_for_maxmin(bool max part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1) { if (!(table->file->index_flags(idx, jdx, 0) & HA_READ_ORDER)) - return 0; + DBUG_RETURN(false); /* Check whether the index component is partial */ Field *part_field= table->field[part->fieldnr-1]; @@ -897,12 +916,12 @@ static bool find_key_for_maxmin(bool max */ if (field->part_of_key.is_set(idx)) table->set_keyread(TRUE); - return 1; + DBUG_RETURN(true); } } } } - return 0; + DBUG_RETURN(false); } === modified file 'sql/rpl_info_factory.h' --- a/sql/rpl_info_factory.h 2011-03-23 23:28:49 +0000 +++ b/sql/rpl_info_factory.h 2011-04-14 12:25:14 +0000 @@ -36,10 +36,10 @@ public: static bool create(uint mi_option, Master_info **mi, uint rli_option, Relay_log_info **rli); static Master_info *create_mi(uint rli_option); - static bool change_mi_repository(Master_info *mi, uint mi_option, + static bool change_mi_repository(Master_info *mi, const uint mi_option, const char **msg); static Relay_log_info *create_rli(uint rli_option, bool is_slave_recovery); - static bool change_rli_repository(Relay_log_info *mi, uint mi_option, + static bool change_rli_repository(Relay_log_info *mi, const uint mi_option, const char **msg); private: static bool decide_repository(Rpl_info *info, === modified file 'sql/sp_head.cc' --- a/sql/sp_head.cc 2011-03-22 11:44:40 +0000 +++ b/sql/sp_head.cc 2011-04-15 12:14:35 +0000 @@ -1214,7 +1214,8 @@ sp_head::execute(THD *thd, bool merge_da String old_packet; Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer; Object_creation_ctx *saved_creation_ctx; - Warning_info *saved_warning_info, warning_info(thd->warning_info->warn_id()); + Warning_info *saved_warning_info; + Warning_info warning_info(thd->warning_info->warn_id(), false); /* Just reporting a stack overrun error === modified file 'sql/sql_admin.cc' --- a/sql/sql_admin.cc 2011-03-08 09:21:39 +0000 +++ b/sql/sql_admin.cc 2011-04-15 12:14:35 +0000 @@ -263,7 +263,7 @@ static bool mysql_admin_table(THD* thd, const char *operator_name, thr_lock_type lock_type, bool open_for_modify, - bool no_warnings_for_error, + bool repair_table_use_frm, uint extra_open_options, int (*prepare_func)(THD *, TABLE_LIST *, HA_CHECK_OPT *), @@ -331,18 +331,43 @@ static bool mysql_admin_table(THD* thd, lex->query_tables= table; lex->query_tables_last= &table->next_global; lex->query_tables_own_last= 0; - /* - Under locked tables, we know that the table can be opened, - so any errors opening the table are logical errors. - In these cases it makes sense to report them. - */ - if (!thd->locked_tables_mode) - thd->no_warnings_for_error= no_warnings_for_error; + if (view_operator_func == NULL) table->required_type=FRMTYPE_TABLE; - open_error= open_and_lock_tables(thd, table, TRUE, 0); - thd->no_warnings_for_error= 0; + if (!thd->locked_tables_mode && repair_table_use_frm) + { + /* + If we're not under LOCK TABLES and we're executing REPAIR TABLE + USE_FRM, we need to ignore errors from open_and_lock_tables(). + REPAIR TABLE USE_FRM is a heavy weapon used when a table is + critically damaged, so open_and_lock_tables() will most likely + report errors. Those errors are not interesting for the user + because it's already known that the table is badly damaged. + */ + + Warning_info wi(thd->query_id, false); + Warning_info *wi_saved= thd->warning_info; + + thd->warning_info= &wi; + + open_error= open_and_lock_tables(thd, table, TRUE, 0); + + thd->warning_info= wi_saved; + } + else + { + /* + It's assumed that even if it is REPAIR TABLE USE_FRM, the table + can be opened if we're under LOCK TABLES (otherwise LOCK TABLES + would fail). Thus, the only errors we could have from + open_and_lock_tables() are logical ones, like incorrect locking + mode. It does make sense for the user to see such errors. + */ + + open_error= open_and_lock_tables(thd, table, TRUE, 0); + } + table->next_global= save_next_global; table->next_local= save_next_local; thd->open_options&= ~extra_open_options; === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2011-04-04 08:47:25 +0000 +++ b/sql/sql_class.cc 2011-04-15 12:14:35 +0000 @@ -13,7 +13,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - /***************************************************************************** ** ** This file implements classes defined in sql_class.h @@ -510,7 +509,7 @@ THD::THD(bool enable_plugins) debug_sync_control(0), #endif /* defined(ENABLED_DEBUG_SYNC) */ m_enable_plugins(enable_plugins), - main_warning_info(0) + main_warning_info(0, false) { ulong tmp; @@ -569,7 +568,7 @@ THD::THD(bool enable_plugins) client_capabilities= 0; // minimalistic client ull=0; system_thread= NON_SYSTEM_THREAD; - cleanup_done= abort_on_warning= no_warnings_for_error= 0; + cleanup_done= abort_on_warning= 0; peer_port= 0; // For SHOW PROCESSLIST transaction.m_pending_rows_event= 0; transaction.on= 1; @@ -842,10 +841,6 @@ MYSQL_ERROR* THD::raise_condition(uint s query_cache_abort(&query_cache_tls); - /* FIXME: broken special case */ - if (no_warnings_for_error && (level == MYSQL_ERROR::WARN_LEVEL_ERROR)) - DBUG_RETURN(NULL); - /* When simulating OOM, skip writing to error log to avoid mtr errors */ DBUG_EXECUTE_IF("simulate_out_of_memory", DBUG_RETURN(NULL);); === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2011-04-04 10:06:13 +0000 +++ b/sql/sql_class.h 2011-04-15 12:14:35 +0000 @@ -2180,7 +2180,6 @@ public: bool enable_slow_log; /* enable slow log for current statement */ bool abort_on_warning; bool got_warning; /* Set on call to push_warning() */ - bool no_warnings_for_error; /* no warnings on call to my_error() */ /* set during loop of derived table processing */ bool derived_tables_processing; my_bool tablespace_op; /* This is TRUE in DISCARD/IMPORT TABLESPACE */ @@ -2974,6 +2973,7 @@ private: /** The current internal error handler for this thread, or NULL. */ Internal_error_handler *m_internal_handler; + /** The lex to hold the parsed tree of conventional (non-prepared) queries. Whereas for prepared and stored procedure statements we use an own lex === modified file 'sql/sql_connect.cc' --- a/sql/sql_connect.cc 2011-03-21 02:16:39 +0000 +++ b/sql/sql_connect.cc 2011-04-19 15:24:55 +0000 @@ -1,4 +1,4 @@ -/* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,9 +20,6 @@ #include "my_global.h" #include "sql_priv.h" -#ifndef __WIN__ -#include // getservbyname, servent -#endif #include "sql_audit.h" #include "sql_connect.h" #include "my_global.h" === modified file 'sql/sql_error.cc' --- a/sql/sql_error.cc 2011-03-09 20:54:55 +0000 +++ b/sql/sql_error.cc 2011-04-15 12:14:35 +0000 @@ -457,10 +457,11 @@ Diagnostics_area::disable_status() m_status= DA_DISABLED; } -Warning_info::Warning_info(ulonglong warn_id_arg) +Warning_info::Warning_info(ulonglong warn_id_arg, bool allow_unlimited_warnings) :m_statement_warn_count(0), m_current_row_for_warning(1), m_warn_id(warn_id_arg), + m_allow_unlimited_warnings(allow_unlimited_warnings), m_read_only(FALSE) { /* Initialize sub structures */ @@ -542,7 +543,8 @@ MYSQL_ERROR *Warning_info::push_warning( if (! m_read_only) { - if (m_warn_list.elements < thd->variables.max_error_count) + if (m_allow_unlimited_warnings || + m_warn_list.elements < thd->variables.max_error_count) { cond= new (& m_warn_root) MYSQL_ERROR(& m_warn_root); if (cond) @@ -558,6 +560,20 @@ MYSQL_ERROR *Warning_info::push_warning( return cond; } +MYSQL_ERROR *Warning_info::push_warning(THD *thd, const MYSQL_ERROR *sql_condition) +{ + MYSQL_ERROR *new_condition= push_warning(thd, + sql_condition->get_sql_errno(), + sql_condition->get_sqlstate(), + sql_condition->get_level(), + sql_condition->get_message_text()); + + if (new_condition) + new_condition->copy_opt_attributes(sql_condition); + + return new_condition; +} + /* Push the warning to error list if there is still room in the list === modified file 'sql/sql_error.h' --- a/sql/sql_error.h 2011-03-09 20:54:55 +0000 +++ b/sql/sql_error.h 2011-04-15 12:14:35 +0000 @@ -322,10 +322,13 @@ class Warning_info { /** A memory root to allocate warnings and errors */ MEM_ROOT m_warn_root; + /** List of warnings of all severities (levels). */ List m_warn_list; + /** A break down of the number of warnings per severity (level). */ uint m_warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_END]; + /** The number of warnings of the current statement. Warning_info life cycle differs from statement life cycle -- it may span @@ -333,20 +336,25 @@ class Warning_info m_statement_warn_count 0, whereas m_warn_list is not empty. */ uint m_statement_warn_count; + /* Row counter, to print in errors and warnings. Not increased in create_sort_index(); may differ from examined_row_count. */ ulong m_current_row_for_warning; - /** Used to optionally clear warnings only once per statement. */ + + /** Used to optionally clear warnings only once per statement. */ ulonglong m_warn_id; + /** Indicates if push_warning() allows unlimited number of warnings. */ + bool m_allow_unlimited_warnings; + private: Warning_info(const Warning_info &rhs); /* Not implemented */ Warning_info& operator=(const Warning_info &rhs); /* Not implemented */ public: - Warning_info(ulonglong warn_id_arg); + Warning_info(ulonglong warn_id_arg, bool allow_unlimited_warnings); ~Warning_info(); /** @@ -383,19 +391,13 @@ public: void append_warnings(THD *thd, List *src) { MYSQL_ERROR *err; - MYSQL_ERROR *copy; List_iterator_fast it(*src); /* Don't use ::push_warning() to avoid invocation of condition handlers or escalation of warnings to errors. */ while ((err= it++)) - { - copy= Warning_info::push_warning(thd, err->get_sql_errno(), err->get_sqlstate(), - err->get_level(), err->get_message_text()); - if (copy) - copy->copy_opt_attributes(err); - } + Warning_info::push_warning(thd, err); } /** @@ -461,6 +463,9 @@ public: MYSQL_ERROR::enum_warning_level level, const char* msg); + /** Add a new condition to the current list. */ + MYSQL_ERROR *push_warning(THD *thd, const MYSQL_ERROR *sql_condition); + /** Set the read only status for this statement area. This is a privileged operation, reserved for the implementation of === modified file 'sql/sql_load.cc' --- a/sql/sql_load.cc 2011-03-09 20:54:55 +0000 +++ b/sql/sql_load.cc 2011-04-15 09:02:16 +0000 @@ -1337,7 +1337,7 @@ READ_INFO::READ_INFO(File file_par, uint /* Set of a stack for unget if long terminators */ - uint length=max(field_term_length,line_term_length)+1; + uint length= max(cs->mbmaxlen, max(field_term_length, line_term_length)) + 1; set_if_bigger(length,line_start.length()); stack=stack_pos=(int*) sql_alloc(sizeof(int)*length); === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2011-04-01 23:01:38 +0000 +++ b/sql/sql_parse.cc 2011-04-19 15:24:55 +0000 @@ -7351,10 +7351,20 @@ bool parse_sql(THD *thd, bool mysql_parse_status= MYSQLparse(thd) != 0; - /* Check that if MYSQLparse() failed, thd->is_error() is set. */ + /* + Check that if MYSQLparse() failed either thd->is_error() is set, or an + internal error handler is set. + + The assert will not catch a situation where parsing fails without an + error reported if an error handler exists. The problem is that the + error handler might have intercepted the error, so thd->is_error() is + not set. However, there is no way to be 100% sure here (the error + handler might be for other errors than parsing one). + */ DBUG_ASSERT(!mysql_parse_status || - (mysql_parse_status && thd->is_error())); + (mysql_parse_status && thd->is_error()) || + (mysql_parse_status && thd->get_internal_handler())); /* Reset parser state. */ === modified file 'sql/sql_prepare.cc' --- a/sql/sql_prepare.cc 2011-03-17 17:39:31 +0000 +++ b/sql/sql_prepare.cc 2011-04-15 12:14:35 +0000 @@ -2843,7 +2843,8 @@ void mysql_stmt_get_longdata(THD *thd, c param= stmt->param_array[param_number]; Diagnostics_area new_stmt_da, *save_stmt_da= thd->stmt_da; - Warning_info new_warnning_info(thd->query_id), *save_warinig_info= thd->warning_info; + Warning_info new_warnning_info(thd->query_id, false); + Warning_info *save_warinig_info= thd->warning_info; thd->stmt_da= &new_stmt_da; thd->warning_info= &new_warnning_info; @@ -3909,7 +3910,7 @@ Ed_result_set::Ed_result_set(Listquery_id), + :m_warning_info(thd->query_id, false), m_thd(thd), m_rsets(0), m_current_rset(0) === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-04-07 14:24:47 +0000 +++ b/sql/sql_select.cc 2011-04-15 08:11:49 +0000 @@ -1893,7 +1893,7 @@ JOIN::optimize() If all items were resolved by opt_sum_query, there is no need to open any tables. */ - if ((res=opt_sum_query(select_lex->leaf_tables, all_fields, conds))) + if ((res=opt_sum_query(thd, select_lex->leaf_tables, all_fields, conds))) { if (res == HA_ERR_KEY_NOT_FOUND) { @@ -2936,7 +2936,11 @@ JOIN::exec() curr_join->best_positions[curr_join->const_tables].sj_strategy != SJ_OPT_LOOSE_SCAN) disable_sorted_access(&curr_join->join_tab[curr_join->const_tables]); - if ((tmp_error= do_select(curr_join, (List *) 0, curr_tmp_table, 0))) + + Procedure *save_proc= curr_join->procedure; + tmp_error= do_select(curr_join, (List *) 0, curr_tmp_table, 0); + curr_join->procedure= save_proc; + if (tmp_error) { error= tmp_error; DBUG_VOID_RETURN; @@ -18625,10 +18629,14 @@ end_send(JOIN *join, JOIN_TAB *join_tab } if (join->having && join->having->val_int() == 0) DBUG_RETURN(NESTED_LOOP_OK); // Didn't match having - error=0; if (join->procedure) - error=join->procedure->send_row(join->procedure_fields_list); - else if (join->do_send_rows) + { + if (join->procedure->send_row(join->procedure_fields_list)) + DBUG_RETURN(NESTED_LOOP_ERROR); + DBUG_RETURN(NESTED_LOOP_OK); + } + error=0; + if (join->do_send_rows) error=join->result->send_data(*join->fields); if (error) DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ === modified file 'sql/sql_select.h' --- a/sql/sql_select.h 2011-04-06 11:13:33 +0000 +++ b/sql/sql_select.h 2011-04-15 08:11:49 +0000 @@ -2062,7 +2062,8 @@ bool is_indexed_agg_distinct(JOIN *join, /* functions from opt_sum.cc */ bool simple_pred(Item_func *func_item, Item **args, bool *inv_order); -int opt_sum_query(TABLE_LIST *tables, List &all_fields,Item *conds); +int opt_sum_query(THD* thd, + TABLE_LIST *tables, List &all_fields, Item *conds); /* from sql_delete.cc, used by opt_range.cc */ extern "C" int refpos_order_cmp(const void* arg, const void *a,const void *b); === modified file 'sql/sql_show.cc' --- a/sql/sql_show.cc 2011-04-06 15:21:05 +0000 +++ b/sql/sql_show.cc 2011-04-15 12:14:35 +0000 @@ -3417,6 +3417,45 @@ end: /** + Trigger_error_handler is intended to intercept and silence SQL conditions + that might happen during trigger loading for SHOW statements. + The potential SQL conditions are: + + - ER_PARSE_ERROR -- this error is thrown if a trigger definition file + is damaged or contains invalid CREATE TRIGGER statement. That should + not happen in normal life. + + - ER_TRG_NO_DEFINER -- this warning is thrown when we're loading a + trigger created/imported in/from the version of MySQL, which does not + support trigger definers. + + - ER_TRG_NO_CREATION_CTX -- this warning is thrown when we're loading a + trigger created/imported in/from the version of MySQL, which does not + support trigger creation contexts. +*/ + +class Trigger_error_handler : public Internal_error_handler +{ +public: + bool handle_condition(THD *thd, + uint sql_errno, + const char* sqlstate, + MYSQL_ERROR::enum_warning_level level, + const char* msg, + MYSQL_ERROR ** cond_hdl) + { + if (sql_errno == ER_PARSE_ERROR || + sql_errno == ER_TRG_NO_DEFINER || + sql_errno == ER_TRG_NO_CREATION_CTX) + return true; + + return false; + } +}; + + + +/** @brief Fill I_S tables whose data are retrieved from frm files and storage engine @@ -3571,7 +3610,6 @@ int get_all_tables(THD *thd, TABLE_LIST acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0)) #endif { - thd->no_warnings_for_error= 1; List table_names; int res= make_table_name_list(thd, &table_names, lex, &lookup_field_vals, @@ -3620,9 +3658,24 @@ int get_all_tables(THD *thd, TABLE_LIST if (!(table_open_method & ~OPEN_FRM_ONLY) && !with_i_schema) { - if (!fill_schema_table_from_frm(thd, tables, schema_table, db_name, - table_name, schema_table_idx, - can_deadlock)) + /* + Here we need to filter out warnings, which can happen + during loading of triggers in fill_schema_table_from_frm(), + because we don't need those warnings to pollute output of + SELECT from I_S / SHOW-statements. + */ + + Trigger_error_handler err_handler; + thd->push_internal_handler(&err_handler); + + int res= fill_schema_table_from_frm(thd, tables, schema_table, + db_name, table_name, + schema_table_idx, + can_deadlock); + + thd->pop_internal_handler(); + + if (!res) continue; } @@ -3632,7 +3685,6 @@ int get_all_tables(THD *thd, TABLE_LIST Set the parent lex of 'sel' because it is needed by sel.init_query() which is called inside make_table_list. */ - thd->no_warnings_for_error= 1; sel.parent_lex= lex; if (make_table_list(thd, &sel, db_name, table_name)) goto err; @@ -6667,6 +6719,92 @@ int make_schema_select(THD *thd, SELECT_ } +/** + Fill INFORMATION_SCHEMA-table, leave correct Diagnostics_area / + Warning_info state after itself. + + This function is a wrapper around ST_SCHEMA_TABLE::fill_table(), which + may "partially silence" some errors. The thing is that during + fill_table() many errors might be emitted. These errors stem from the + nature of fill_table(). + + For example, SELECT ... FROM INFORMATION_SCHEMA.xxx WHERE TABLE_NAME = 'xxx' + results in a number of 'Table .xxx does not exist' errors, + because fill_table() tries to open the 'xxx' table in every possible + database. + + Those errors are cleared (the error status is cleared from + Diagnostics_area) inside fill_table(), but they remain in Warning_info + (Warning_info is not cleared because it may contain useful warnings). + + This function is responsible for making sure that Warning_info does not + contain warnings corresponding to the cleared errors. + + @note: THD::no_warnings_for_error used to be set before calling + fill_table(), thus those errors didn't go to Warning_info. This is not + the case now (THD::no_warnings_for_error was eliminated as a hack), so we + need to take care of those warnings here. + + @param thd Thread context. + @param table_list I_S table. + @param join_table JOIN/SELECT table. + + @return Error status. + @retval TRUE Error. + @retval FALSE Success. +*/ +static bool do_fill_table(THD *thd, + TABLE_LIST *table_list, + JOIN_TAB *join_table) +{ + // NOTE: fill_table() may generate many "useless" warnings, which will be + // ignored afterwards. On the other hand, there might be "useful" + // warnings, which should be presented to the user. Warning_info usually + // stores no more than THD::variables.max_error_count warnings. + // The problem is that "useless warnings" may occupy all the slots in the + // Warning_info, so "useful warnings" get rejected. In order to avoid + // that problem we create a Warning_info instance, which is capable of + // storing "unlimited" number of warnings. + Warning_info wi(thd->query_id, true); + Warning_info *wi_saved= thd->warning_info; + + thd->warning_info= &wi; + + bool res= table_list->schema_table->fill_table( + thd, table_list, join_table->select_cond); + + thd->warning_info= wi_saved; + + // Pass an error if any. + + if (thd->stmt_da->is_error()) + { + thd->warning_info->push_warning(thd, + thd->stmt_da->sql_errno(), + thd->stmt_da->get_sqlstate(), + MYSQL_ERROR::WARN_LEVEL_ERROR, + thd->stmt_da->message()); + } + + // Pass warnings (if any). + // + // Filter out warnings with WARN_LEVEL_ERROR level, because they + // correspond to the errors which were filtered out in fill_table(). + + + List_iterator_fast it(wi.warn_list()); + MYSQL_ERROR *err; + + while ((err= it++)) + { + if (err->get_level() != MYSQL_ERROR::WARN_LEVEL_ERROR) + thd->warning_info->push_warning(thd, err); + } + + return res; +} + + /* Fill temporary schema tables before SELECT @@ -6689,7 +6827,6 @@ bool get_schema_tables_result(JOIN *join bool result= 0; DBUG_ENTER("get_schema_tables_result"); - thd->no_warnings_for_error= 1; for (JOIN_TAB *tab= join->join_tab; tab < tmp_join_tab; tab++) { if (!tab->table || !tab->table->pos_in_table_list) @@ -6740,8 +6877,7 @@ bool get_schema_tables_result(JOIN *join else table_list->table->file->stats.records= 0; - if (table_list->schema_table->fill_table(thd, table_list, - tab->select_cond)) + if (do_fill_table(thd, table_list, tab)) { result= 1; join->error= 1; @@ -6753,7 +6889,6 @@ bool get_schema_tables_result(JOIN *join table_list->schema_table_state= executed_place; } } - thd->no_warnings_for_error= 0; DBUG_RETURN(result); } === modified file 'sql/sql_trigger.cc' --- a/sql/sql_trigger.cc 2011-03-10 08:33:54 +0000 +++ b/sql/sql_trigger.cc 2011-04-15 12:14:35 +0000 @@ -1225,13 +1225,12 @@ bool Table_triggers_list::check_n_load(T DBUG_RETURN(1); // EOM } - - if (!thd->no_warnings_for_error) - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_TRG_NO_CREATION_CTX, - ER(ER_TRG_NO_CREATION_CTX), - (const char*) db, - (const char*) table_name); + + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRG_NO_CREATION_CTX, + ER(ER_TRG_NO_CREATION_CTX), + (const char*) db, + (const char*) table_name); if (!(trg_client_cs_name= alloc_lex_string(&table->mem_root)) || !(trg_connection_cl_name= alloc_lex_string(&table->mem_root)) || @@ -1362,12 +1361,12 @@ bool Table_triggers_list::check_n_load(T MySQL, which does not support triggers definers. We should emit warning here. */ - if (!thd->no_warnings_for_error) - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_TRG_NO_DEFINER, ER(ER_TRG_NO_DEFINER), - (const char*) db, - (const char*) sp->m_name.str); - + + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TRG_NO_DEFINER, ER(ER_TRG_NO_DEFINER), + (const char*) db, + (const char*) sp->m_name.str); + /* Set definer to the '' to correct displaying in the information schema. === modified file 'sql/transaction.cc' --- a/sql/transaction.cc 2011-04-12 10:59:59 +0000 +++ b/sql/transaction.cc 2011-04-14 08:47:14 +0000 @@ -75,6 +75,33 @@ static bool xa_trans_rolled_back(XID_STA /** + Rollback the active XA transaction. + + @note Resets rm_error before calling ha_rollback(), so + the thd->transaction.xid structure gets reset + by ha_rollback() / THD::transaction::cleanup(). + + @return TRUE if the rollback failed, FALSE otherwise. +*/ + +static bool xa_trans_force_rollback(THD *thd) +{ + /* + We must reset rm_error before calling ha_rollback(), + so thd->transaction.xid structure gets reset + by ha_rollback()/THD::transaction::cleanup(). + */ + thd->transaction.xid_state.rm_error= 0; + if (ha_rollback_trans(thd, true)) + { + my_error(ER_XAER_RMERR, MYF(0)); + return true; + } + return false; +} + + +/** Begin a new transaction. @note Beginning a transaction implicitly commits any current @@ -645,8 +672,7 @@ bool trans_xa_commit(THD *thd) if (xa_trans_rolled_back(&thd->transaction.xid_state)) { - if (ha_rollback_trans(thd, TRUE)) - my_error(ER_XAER_RMERR, MYF(0)); + xa_trans_force_rollback(thd); res= thd->is_error(); } else if (xa_state == XA_IDLE && thd->lex->xa_opt == XA_ONE_PHASE) @@ -735,15 +761,7 @@ bool trans_xa_rollback(THD *thd) DBUG_RETURN(TRUE); } - /* - Resource Manager error is meaningless at this point, as we perform - explicit rollback request by user. We must reset rm_error before - calling ha_rollback(), so thd->transaction.xid structure gets reset - by ha_rollback()/THD::transaction::cleanup(). - */ - thd->transaction.xid_state.rm_error= 0; - if ((res= test(ha_rollback_trans(thd, TRUE)))) - my_error(ER_XAER_RMERR, MYF(0)); + res= xa_trans_force_rollback(thd); thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_KEEP_LOG); thd->transaction.all.modified_non_trans_table= FALSE; === modified file 'storage/myisam/myisamdef.h' --- a/storage/myisam/myisamdef.h 2011-03-28 08:51:35 +0000 +++ b/storage/myisam/myisamdef.h 2011-04-14 12:04:53 +0000 @@ -226,8 +226,9 @@ typedef struct st_mi_bit_buff { /* Used uint error; } MI_BIT_BUFF; - +C_MODE_START typedef ICP_RESULT (*index_cond_func_t)(void *param); +C_MODE_END struct st_myisam_info { MYISAM_SHARE *s; /* Shared between open:s */ === modified file 'storage/perfschema/unittest/pfs-t.cc' --- a/storage/perfschema/unittest/pfs-t.cc 2011-04-02 21:08:06 +0000 +++ b/storage/perfschema/unittest/pfs-t.cc 2011-04-19 16:20:29 +0000 @@ -877,7 +877,6 @@ void test_init_disabled() /* disabled S-A + enabled T-1: no instrumentation */ socket_class_A->m_enabled= false; - socket_A1= psi->init_socket(socket_key_A, NULL); ok(socket_A1 == NULL, "not instrumented"); /* enabled S-A + enabled T-1: instrumentation */ @@ -1120,6 +1119,9 @@ void test_locker_disabled() socket_A1= psi->init_socket(socket_key_A, NULL); ok(socket_A1 != NULL, "instrumented"); + /* Socket lockers require a thread owner */ + psi->set_socket_thread_owner(socket_A1); + PSI_mutex_locker *mutex_locker; PSI_mutex_locker_state mutex_state; PSI_rwlock_locker *rwlock_locker; @@ -1298,6 +1300,16 @@ void test_locker_disabled() psi->start_socket_wait(socket_locker, 10, __FILE__, __LINE__); psi->end_socket_wait(socket_locker, 10); + /* Pretend the socket does not have a thread owner */ + /* ---------------------------------------------- */ + + socket_class_A->m_enabled= true; + socket_A1= psi->init_socket(socket_key_A, NULL); + ok(socket_A1 != NULL, "instrumented"); + /* Socket thread owner has not been set */ + socket_locker= psi->get_thread_socket_locker(&socket_state, socket_A1, PSI_SOCKET_SEND); + ok(socket_locker == NULL, "no locker (no thread owner)"); + /* Pretend the running thread is not instrumented */ /* ---------------------------------------------- */ @@ -1604,7 +1616,7 @@ void do_all_tests() int main(int, char **) { - plan(214); + plan(216); MY_INIT("pfs-t"); do_all_tests(); return 0; === modified file 'vio/vio_priv.h' --- a/vio/vio_priv.h 2010-06-07 14:01:39 +0000 +++ b/vio/vio_priv.h 2011-04-15 09:33:58 +0000 @@ -1,7 +1,7 @@ #ifndef VIO_PRIV_INCLUDED #define VIO_PRIV_INCLUDED -/* Copyright (C) 2003 MySQL AB +/* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* Structures and functions private to the vio package */ @@ -25,11 +25,6 @@ #include #include -#ifndef __WIN__ -#include -#include -#endif - #ifdef _WIN32 void vio_win32_timeout(Vio *vio, uint which, uint timeout); #endif --===============4214414423322303146== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/cpowers@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: cpowers@tma-1-20110419162029-ju5nyvss7x6w33lc # target_branch: file:///home/cpowers/work/dev/base_mysql-trunk-\ # wl4896/ # testament_sha1: a1f80b152d091383f20fd8deecf0a43821c018c9 # timestamp: 2011-04-19 11:24:18 -0500 # source_branch: bzr+ssh://cpowers@stripped/bzrroot\ # /server/mysql-trunk/ # base_revision_id: cpowers@tma-1-20110414013624-3wqxicqyit34j18u # # Begin bundle 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 --===============4214414423322303146==--