From: Bjorn Munch Date: October 3 2010 5:38pm Subject: bzr commit into mysql-5.1-bugteam branch (bjorn.munch:3516) List-Archive: http://lists.mysql.com/commits/119784 Message-Id: <201010031738.o93HcOE7002018@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1241823358==" --===============1241823358== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/mysql-5.1-bugteam/ based on revid:alexey.kopytov@stripped 3516 Bjorn Munch 2010-10-03 [merge] merge from 5.1-mtr modified: client/mysqltest.cc mysql-test/include/setup_fake_relay_log.inc mysql-test/mysql-test-run.pl mysql-test/r/mysqltest.result mysql-test/suite/innodb/t/innodb_bug53756.test mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test mysql-test/suite/sys_vars/t/secure_file_priv.test mysql-test/t/mysqltest.test === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-09-10 07:58:26 +0000 +++ b/client/mysqltest.cc 2010-10-03 17:37:58 +0000 @@ -103,6 +103,7 @@ static my_bool parsing_disabled= 0; static my_bool display_result_vertically= FALSE, display_result_lower= FALSE, display_metadata= FALSE, display_result_sorted= FALSE; static my_bool disable_query_log= 0, disable_result_log= 0; +static my_bool disable_connect_log= 1; static my_bool disable_warnings= 0; static my_bool disable_info= 1; static my_bool abort_on_error= 1; @@ -242,7 +243,9 @@ struct st_connection int cur_query_len; pthread_mutex_t mutex; pthread_cond_t cond; + pthread_t tid; int query_done; + my_bool has_thread; #endif /*EMBEDDED_LIBRARY*/ }; @@ -273,6 +276,7 @@ enum enum_commands { Q_DISABLE_RPL_PARSE, Q_EVAL_RESULT, Q_ENABLE_QUERY_LOG, Q_DISABLE_QUERY_LOG, Q_ENABLE_RESULT_LOG, Q_DISABLE_RESULT_LOG, + Q_ENABLE_CONNECT_LOG, Q_DISABLE_CONNECT_LOG, Q_WAIT_FOR_SLAVE_TO_STOP, Q_ENABLE_WARNINGS, Q_DISABLE_WARNINGS, Q_ENABLE_INFO, Q_DISABLE_INFO, @@ -340,6 +344,8 @@ const char *command_names[]= /* Enable/disable that the _result_ from a query is logged to result file */ "enable_result_log", "disable_result_log", + "enable_connect_log", + "disable_connect_log", "wait_for_slave_to_stop", "enable_warnings", "disable_warnings", @@ -733,8 +739,6 @@ pthread_handler_t send_one_query(void *a static int do_send_query(struct st_connection *cn, const char *q, int q_len, int flags) { - pthread_t tid; - if (flags & QUERY_REAP_FLAG) return mysql_send_query(&cn->mysql, q, q_len); @@ -745,9 +749,10 @@ static int do_send_query(struct st_conne cn->cur_query= q; cn->cur_query_len= q_len; cn->query_done= 0; - if (pthread_create(&tid, &cn_thd_attrib, send_one_query, (void*)cn)) + if (pthread_create(&cn->tid, &cn_thd_attrib, send_one_query, (void*)cn)) die("Cannot start new thread for query"); + cn->has_thread= TRUE; return 0; } @@ -760,6 +765,14 @@ static void wait_query_thread_end(struct pthread_cond_wait(&con->cond, &con->mutex); pthread_mutex_unlock(&con->mutex); } + if (con->has_thread) + { +#ifndef __WIN__ + /* May hang on Windows, but the problem it solves is not seen there */ + pthread_join(con->tid, NULL); +#endif + con->has_thread= FALSE; + } } #else /*EMBEDDED_LIBRARY*/ @@ -2175,8 +2188,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; @@ -3834,7 +3853,18 @@ void do_perl(struct st_command *command) if (!error) my_delete(temp_file_path, MYF(0)); - handle_command_error(command, WEXITSTATUS(error)); + /* Check for error code that indicates perl could not be started */ + int exstat= WEXITSTATUS(error); +#ifdef __WIN__ + if (exstat == 1) + /* Text must begin 'perl not found' as mtr looks for it */ + abort_not_supported_test("perl not found in path or did not start"); +#else + if (exstat == 127) + abort_not_supported_test("perl not found in path"); +#endif + else + handle_command_error(command, exstat); } dynstr_free(&ds_delimiter); DBUG_VOID_RETURN; @@ -4778,6 +4808,16 @@ void select_connection_name(const char * set_current_connection(con); + /* Connection logging if enabled */ + if (!disable_connect_log && !disable_query_log) + { + DYNAMIC_STRING *ds= &ds_res; + + dynstr_append_mem(ds, "connection ", 11); + replace_dynstr_append(ds, name); + dynstr_append_mem(ds, ";\n", 2); + } + DBUG_VOID_RETURN; } @@ -4865,6 +4905,16 @@ void do_close_connection(struct st_comma var_set_string("$CURRENT_CONNECTION", con->name); } + /* Connection logging if enabled */ + if (!disable_connect_log && !disable_query_log) + { + DYNAMIC_STRING *ds= &ds_res; + + dynstr_append_mem(ds, "disconnect ", 11); + replace_dynstr_append(ds, ds_connection.str); + dynstr_append_mem(ds, ";\n", 2); + } + DBUG_VOID_RETURN; } @@ -4999,6 +5049,13 @@ int connect_n_handle_errors(struct st_co dynstr_append_mem(ds, delimiter, delimiter_length); dynstr_append_mem(ds, "\n", 1); } + /* Simlified logging if enabled */ + if (!disable_connect_log && !disable_query_log) + { + replace_dynstr_append(ds, command->query); + dynstr_append_mem(ds, ";\n", 2); + } + while (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0, CLIENT_MULTI_STATEMENTS)) { @@ -5187,6 +5244,7 @@ void do_connect(struct st_command *comma #ifdef EMBEDDED_LIBRARY con_slot->query_done= 1; + con_slot->has_thread= FALSE; #endif if (!mysql_init(&con_slot->mysql)) die("Failed on mysql_init()"); @@ -7307,11 +7365,13 @@ void run_query(struct st_connection *cn, (flags & QUERY_REAP_FLAG)); DBUG_ENTER("run_query"); - init_dynamic_string(&ds_warnings, NULL, 0, 256); - if (cn->pending && (flags & QUERY_SEND_FLAG)) die ("Cannot run query on connection between send and reap"); + if (!(flags & QUERY_SEND_FLAG) && !cn->pending) + die ("Cannot reap on a connection without pending send"); + + init_dynamic_string(&ds_warnings, NULL, 0, 256); /* Evaluate query if this is an eval command */ @@ -8052,6 +8112,8 @@ int main(int argc, char **argv) case Q_DISABLE_ABORT_ON_ERROR: abort_on_error=0; break; case Q_ENABLE_RESULT_LOG: disable_result_log=0; break; case Q_DISABLE_RESULT_LOG: disable_result_log=1; break; + case Q_ENABLE_CONNECT_LOG: disable_connect_log=0; break; + case Q_DISABLE_CONNECT_LOG: disable_connect_log=1; break; case Q_ENABLE_WARNINGS: disable_warnings=0; break; case Q_DISABLE_WARNINGS: disable_warnings=1; break; case Q_ENABLE_INFO: disable_info=0; break; === modified file 'mysql-test/include/setup_fake_relay_log.inc' --- a/mysql-test/include/setup_fake_relay_log.inc 2010-02-02 15:16:47 +0000 +++ b/mysql-test/include/setup_fake_relay_log.inc 2010-09-15 12:56:22 +0000 @@ -72,7 +72,7 @@ copy_file $fake_relay_log $_fake_relay_l if (`SELECT LENGTH(@@secure_file_priv) > 0`) { - -- let $_file_priv_dir= `SELECT @@secure_file_priv`; + -- let $_file_priv_dir= `SELECT @@secure_file_priv` -- let $_suffix= `SELECT UUID()` -- let $_tmp_file= $_file_priv_dir/fake-index.$_suffix === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2010-08-31 09:27:57 +0000 +++ b/mysql-test/mysql-test-run.pl 2010-09-30 10:42:37 +0000 @@ -110,12 +110,24 @@ my $path_vardir_trace; # unix f my $opt_tmpdir; # Path to use for tmp/ dir my $opt_tmpdir_pid; +my $opt_start; +my $opt_start_dirty; +my $opt_start_exit; +my $start_only; + END { if ( defined $opt_tmpdir_pid and $opt_tmpdir_pid == $$ ) { - # Remove the tempdir this process has created - mtr_verbose("Removing tmpdir '$opt_tmpdir"); - rmtree($opt_tmpdir); + if (!$opt_start_exit) + { + # Remove the tempdir this process has created + mtr_verbose("Removing tmpdir $opt_tmpdir"); + rmtree($opt_tmpdir); + } + else + { + mtr_warning("tmpdir $opt_tmpdir should be removed after the server has finished"); + } } } @@ -215,10 +227,6 @@ my $opt_start_timeout = $ENV{MTR_START sub suite_timeout { return $opt_suite_timeout * 60; }; sub check_timeout { return $opt_testcase_timeout * 6; }; -my $opt_start; -my $opt_start_dirty; -my $opt_start_exit; -my $start_only; my $opt_wait_all; my $opt_user_args; my $opt_repeat= 1; @@ -2099,6 +2107,11 @@ sub environment_setup { # to detect that valgrind is being used from test cases $ENV{'VALGRIND_TEST'}= $opt_valgrind; + # Add dir of this perl to aid mysqltest in finding perl + my $perldir= dirname($^X); + my $pathsep= ":"; + $pathsep= ";" if IS_WINDOWS && ! IS_CYGWIN; + $ENV{'PATH'}= "$ENV{'PATH'}".$pathsep.$perldir; } @@ -3575,6 +3588,9 @@ sub run_testcase ($) { # Try to get reason from test log file find_testcase_skipped_reason($tinfo); mtr_report_test_skipped($tinfo); + # Restart if skipped due to missing perl, it may have had side effects + stop_all_servers($opt_shutdown_timeout) + if ($tinfo->{'comment'} =~ /^perl not found/); } elsif ( $res == 65 ) { === modified file 'mysql-test/r/mysqltest.result' --- a/mysql-test/r/mysqltest.result 2010-08-10 10:13:58 +0000 +++ b/mysql-test/r/mysqltest.result 2010-09-22 08:57:10 +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 @@ -449,12 +452,16 @@ mysqltest: At line 1: Missing required a mysqltest: At line 1: query 'connect con2,localhost,root,,illegal_db' failed: 1049: Unknown database 'illegal_db' mysqltest: At line 1: Illegal argument for port: 'illegal_port' mysqltest: At line 1: Illegal option to connect: SMTP -OK -mysqltest: The test didn't produce any output +200 connects succeeded mysqltest: In included file "MYSQLTEST_VARDIR/tmp/mysqltest.sql": At line 3: connection 'test_con1' not found in connection pool mysqltest: In included file "MYSQLTEST_VARDIR/tmp/mysqltest.sql": At line 2: Connection test_con1 already exists show tables; ERROR 3D000: No database selected +connect con1,localhost,root,,; +connection default; +connection con1; +disconnect con1; +connection default; Output from mysqltest-x.inc Output from mysqltest-x.inc Output from mysqltest-x.inc === modified file 'mysql-test/suite/innodb/t/innodb_bug53756.test' --- a/mysql-test/suite/innodb/t/innodb_bug53756.test 2010-07-06 02:26:38 +0000 +++ b/mysql-test/suite/innodb/t/innodb_bug53756.test 2010-09-30 08:28:22 +0000 @@ -34,8 +34,8 @@ INSERT INTO bug_53756 VALUES(1, 11), (2, --echo --echo # Select a less restrictive isolation level. # Don't use user variables. They won't survive server crash. ---let $global_isolation= `SELECT @@global.tx_isolation`; ---let $session_isolation= `SELECT @@session.tx_isolation`; +--let $global_isolation= `SELECT @@global.tx_isolation` +--let $session_isolation= `SELECT @@session.tx_isolation` SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; COMMIT; === 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/secure_file_priv.test' --- a/mysql-test/suite/sys_vars/t/secure_file_priv.test 2010-04-16 14:10:47 +0000 +++ b/mysql-test/suite/sys_vars/t/secure_file_priv.test 2010-09-21 09:16:20 +0000 @@ -9,7 +9,7 @@ SHOW VARIABLES LIKE 'secure_file_priv'; # Doing this in a portable manner is difficult but we should be able to # count on the depth of the directory hierarchy used. Three steps up from # the datadir is the 'mysql_test' directory. ---let $PROTECTED_FILE=`SELECT concat(@@datadir,'/../../../bug50373.txt')`; +--let $PROTECTED_FILE=`SELECT concat(@@datadir,'/../../../bug50373.txt')` --eval SELECT * FROM t1 INTO OUTFILE '$PROTECTED_FILE'; DELETE FROM t1; --eval LOAD DATA INFILE '$PROTECTED_FILE' INTO TABLE t1; === modified file 'mysql-test/t/mysqltest.test' --- a/mysql-test/t/mysqltest.test 2010-08-10 10:13:58 +0000 +++ b/mysql-test/t/mysqltest.test 2010-09-22 08:57:10 +0000 @@ -494,6 +494,32 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqlt --error 1 --exec echo "--disable_query_log;" | $MYSQL_TEST 2>&1 +# +# Extra text after `` +# +# Cannot use exec echo here as ` may or may not need to be escaped +--write_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql +let $x= `select 1` BOO ; +EOF +--error 1 +--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/mysqltest.sql 2>&1 +remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; +--write_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql +--let $x= `select 1`; +EOF +--error 1 +--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/mysqltest.sql 2>&1 +remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; +--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. @@ -1441,19 +1467,6 @@ eval select "$long_rep" as x; # Repeat connect/disconnect --write_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql -let $i=100; -while ($i) -{ - connect (test_con1,localhost,root,,); - disconnect test_con1; - dec $i; -} -EOF ---exec echo "source $MYSQLTEST_VARDIR/tmp/mysqltest.sql; echo OK; exit;" | $MYSQL_TEST 2>&1 -remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; - -# Repeat connect/disconnect ---write_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql let $i=200; while ($i) { @@ -1461,9 +1474,8 @@ while ($i) disconnect test_con1; dec $i; } +echo 200 connects succeeded; EOF ---replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR ---error 1 --exec echo "source $MYSQLTEST_VARDIR/tmp/mysqltest.sql;" | $MYSQL_TEST 2>&1 remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; @@ -1504,6 +1516,22 @@ show tables; disconnect con2; connection default; +# Test enable_connect_log +--enable_connect_log +connect (con1,localhost,root,,); +connection default; +connection con1; +--disable_query_log +# These should not be logged +connect (con2,localhost,root,,*NO-ONE*); +connection con2; +disconnect con2; +connection con1; +--enable_query_log +disconnect con1; +connection default; +--disable_connect_log + # ---------------------------------------------------------------------------- # Test mysqltest arguments # ---------------------------------------------------------------------------- --===============1241823358== 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/mysql-5.1-bugteam/ # testament_sha1: e21cd8603b975e7950b5fd18bfa5c2e2855ce1d1 # timestamp: 2010-10-03 19:38:24 +0200 # source_branch: file:///home/bm136801/my/mtr-51/ # base_revision_id: alexey.kopytov@stripped\ # 2z1rzbvj0tagqazc # # Begin bundle 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 Q84IhCe1+X/xdyRThQkKt77fIA== --===============1241823358==--