From: Bjorn Munch Date: September 28 2010 2:53pm Subject: bzr commit into mysql-next-mr-mtr branch (bjorn.munch:2981) List-Archive: http://lists.mysql.com/commits/119291 Message-Id: <201009281453.o8SErnVW018982@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0278076438==" --===============0278076438== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/mtr-nx/ based on revid:bjorn.munch@stripped 2981 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 === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-09-21 09:23:17 +0000 +++ b/client/mysqltest.cc 2010-09-28 14:53:13 +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-02 08:06:12 +0000 +++ b/mysql-test/mysql-test-run.pl 2010-09-28 14:53:13 +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 09:11:31 +0000 +++ b/mysql-test/r/mysqltest.result 2010-09-28 14:53:13 +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:23:17 +0000 +++ b/mysql-test/t/mysqltest.test 2010-09-28 14:53:13 +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 # ---------------------------------------------------------------------------- --===============0278076438== 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-nx/ # testament_sha1: 703950c9ea9504129d23f82487030e7a58c36b37 # timestamp: 2010-09-28 16:53:49 +0200 # source_branch: file:///home/bm136801/my/mysql-next-mr/ # base_revision_id: bjorn.munch@stripped\ # dfpitgo40vcpwthr # # Begin bundle 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 kU4UJAq0h1NA --===============0278076438==--