From: Bjorn Munch Date: September 28 2010 2:55pm Subject: bzr push into mysql-trunk-mtr branch (bjorn.munch:2970 to 2971) List-Archive: http://lists.mysql.com/commits/119294 Message-Id: <201009281456.o8SEuD3C019027@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0517457672==" --===============0517457672== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 2971 Bjorn Munch 2010-09-28 [merge] upmerge 56125,56921,57036 modified: client/mysqltest.cc mysql-test/mysql-test-run.pl mysql-test/r/mysqltest.result mysql-test/t/mysqltest.test 2970 Bjorn Munch 2010-09-21 [merge] mysqltest.test fix after 56753 modified: mysql-test/t/mysqltest.test === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-09-21 09:21:55 +0000 +++ b/client/mysqltest.cc 2010-09-28 14:01:36 +0000 @@ -112,6 +112,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; @@ -227,8 +228,9 @@ typedef struct int str_val_len; int int_val; int alloced_len; - int int_dirty; /* do not update string if int is updated until first read */ - int alloced; + bool int_dirty; /* do not update string if int is updated until first read */ + bool is_int; + bool alloced; } VAR; /*Perl/shell-like variable registers */ @@ -284,6 +286,7 @@ enum enum_commands { 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, @@ -349,6 +352,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", @@ -1954,6 +1959,21 @@ static void var_free(void *v) C_MODE_END +void var_set_int(VAR *v, const char *str) +{ + char *endptr; + /* Initially assume not a number */ + v->int_val= 0; + v->is_int= false; + v->int_dirty= false; + if (!str) return; + + v->int_val = (int) strtol(str, &endptr, 10); + /* It is an int if strtol consumed something up to end/space/tab */ + if (endptr > str && (!*endptr || *endptr == ' ' || *endptr == '\t')) + v->is_int= true; +} + VAR *var_init(VAR *v, const char *name, int name_len, const char *val, int val_len) @@ -1988,11 +2008,10 @@ VAR *var_init(VAR *v, const char *name, memcpy(tmp_var->str_val, val, val_len); tmp_var->str_val[val_len]= 0; } + var_set_int(tmp_var, val); tmp_var->name_len = name_len; tmp_var->str_val_len = val_len; tmp_var->alloced_len = val_alloc_len; - tmp_var->int_val = (val) ? atoi(val) : 0; - tmp_var->int_dirty = 0; return tmp_var; } @@ -2053,7 +2072,7 @@ VAR* var_get(const char *var_name, const if (!raw && v->int_dirty) { sprintf(v->str_val, "%d", v->int_val); - v->int_dirty = 0; + v->int_dirty= false; v->str_val_len = strlen(v->str_val); } if (var_name_end) @@ -2115,7 +2134,7 @@ void var_set(const char *var_name, const if (v->int_dirty) { sprintf(v->str_val, "%d", v->int_val); - v->int_dirty= 0; + v->int_dirty=false; v->str_val_len= strlen(v->str_val); } /* setenv() expects \0-terminated strings */ @@ -2421,6 +2440,7 @@ void var_set_query_get_value(struct st_c void var_copy(VAR *dest, VAR *src) { dest->int_val= src->int_val; + dest->is_int= src->is_int; dest->int_dirty= src->int_dirty; /* Alloc/realloc data for str_val in dest */ @@ -2504,9 +2524,7 @@ void eval_expr(VAR *v, const char *p, co v->str_val_len = new_val_len; memcpy(v->str_val, p, new_val_len); v->str_val[new_val_len] = 0; - v->int_val=atoi(p); - DBUG_PRINT("info", ("atoi on '%s', returns: %d", p, v->int_val)); - v->int_dirty=0; + var_set_int(v, p); } DBUG_VOID_RETURN; } @@ -2853,6 +2871,8 @@ int do_modify_var(struct st_command *com die("The argument to %.*s must be a variable (start with $)", command->first_word_len, command->query); v= var_get(p, &p, 1, 0); + if (! v->is_int) + die("Cannot perform inc/dec on a non-numeric value"); switch (op) { case DO_DEC: v->int_val--; @@ -2864,7 +2884,7 @@ int do_modify_var(struct st_command *com die("Invalid operator to do_modify_var"); break; } - v->int_dirty= 1; + v->int_dirty= true; command->last_argument= (char*)++p; return 0; } @@ -4822,6 +4842,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; } @@ -4909,6 +4939,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; } @@ -5043,6 +5083,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)) { @@ -8120,6 +8167,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/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2010-09-01 14:02:56 +0000 +++ b/mysql-test/mysql-test-run.pl 2010-09-28 14:01:36 +0000 @@ -126,12 +126,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"); + } } } @@ -234,10 +246,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; === modified file 'mysql-test/r/mysqltest.result' --- a/mysql-test/r/mysqltest.result 2010-09-20 08:24:39 +0000 +++ b/mysql-test/r/mysqltest.result 2010-09-28 14:01:36 +0000 @@ -369,23 +369,24 @@ mysqltest: At line 1: Missing required a mysqltest: At line 1: Invalid argument to sleep "abc" mysqltest: At line 1: Invalid argument to real_sleep "abc" 1 -2 101 -hej -1 +-99 mysqltest: At line 1: Missing argument to inc mysqltest: At line 1: The argument to inc must be a variable (start with $) +mysqltest: At line 1: Cannot perform inc/dec on a non-numeric value mysqltest: At line 1: End of line junk detected: "1000" -4 -4 +mysqltest: At line 1: Cannot perform inc/dec on a non-numeric value +mysqltest: At line 1: Cannot perform inc/dec on a non-numeric value +-96 +-96 -1 --2 99 -hej --1 mysqltest: At line 1: Missing argument to dec mysqltest: At line 1: The argument to dec must be a variable (start with $) +mysqltest: At line 1: Cannot perform inc/dec on a non-numeric value mysqltest: At line 1: End of line junk detected: "1000" +mysqltest: At line 1: Cannot perform inc/dec on a non-numeric value +mysqltest: At line 1: Cannot perform inc/dec on a non-numeric value mysqltest: At line 1: Missing arguments to system, nothing to do! mysqltest: At line 1: Missing arguments to system, nothing to do! system command 'NonExistsinfComamdn 2> /dev/null' failed @@ -452,12 +453,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/t/mysqltest.test' --- a/mysql-test/t/mysqltest.test 2010-09-21 09:21:55 +0000 +++ b/mysql-test/t/mysqltest.test 2010-09-28 14:01:36 +0000 @@ -1006,16 +1006,13 @@ EOF # ---------------------------------------------------------------------------- # Test inc # ---------------------------------------------------------------------------- -inc $i; -echo $i; +let $i= 0; inc $i; echo $i; let $i=100; inc $i; echo $i; - -let $i=hej; -echo $i; +let $i= -100; inc $i; echo $i; @@ -1024,7 +1021,13 @@ echo $i; --error 1 --exec echo "inc i;" | $MYSQL_TEST 2>&1 --error 1 +--exec echo "inc \$i;" | $MYSQL_TEST 2>&1 +--error 1 --exec echo "let \$i=100; inc \$i 1000; echo \$i;" | $MYSQL_TEST 2>&1 +--error 1 +--exec echo "let \$i=text; inc \$i; echo \$i;" | $MYSQL_TEST 2>&1 +--error 1 +--exec echo "let \$i=10cc; inc \$i; echo \$i;" | $MYSQL_TEST 2>&1 inc $i; inc $i; inc $i; --echo $i echo $i; @@ -1034,25 +1037,25 @@ echo $i; # Test dec # ---------------------------------------------------------------------------- -dec $d; -echo $d; +let $d= 0; dec $d; echo $d; let $d=100; dec $d; echo $d; -let $d=hej; -echo $d; -dec $d; -echo $d; - --error 1 --exec echo "dec;" | $MYSQL_TEST 2>&1 --error 1 --exec echo "dec i;" | $MYSQL_TEST 2>&1 --error 1 +--exec echo "dec \$i;" | $MYSQL_TEST 2>&1 +--error 1 --exec echo "let \$i=100; dec \$i 1000; echo \$i;" | $MYSQL_TEST 2>&1 +--error 1 +--exec echo "let \$i=text; dec \$i; echo \$i;" | $MYSQL_TEST 2>&1 +--error 1 +--exec echo "let \$i=10cc; dec \$i; echo \$i;" | $MYSQL_TEST 2>&1 # ---------------------------------------------------------------------------- @@ -1467,19 +1470,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) { @@ -1487,9 +1477,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; @@ -1530,6 +1519,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 # ---------------------------------------------------------------------------- --===============0517457672== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/bjorn.munch@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: bjorn.munch@stripped # target_branch: file:///home/bm136801/my/mtr-tr/ # testament_sha1: 72dccab94325879cca3fd31cd232909d14db258c # timestamp: 2010-09-28 16:56:13 +0200 # source_branch: file:///home/bm136801/my/mysql-trunk/ # base_revision_id: bjorn.munch@stripped\ # tlqo81ui5cxqzci9 # # Begin bundle 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 --===============0517457672==--