From: Bjorn Munch Date: September 28 2010 2:57pm Subject: bzr push into mysql-5.5-mtr branch (bjorn.munch:3092 to 3094) List-Archive: http://lists.mysql.com/commits/119295 Message-Id: <201009281457.o8SEvdYN019055@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2069739641==" --===============2069739641== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3094 Bjorn Munch 2010-09-28 [merge] upmerge 56125,56921 modified: client/mysqltest.cc mysql-test/mysql-test-run.pl mysql-test/r/mysqltest.result mysql-test/t/mysqltest.test 3093 Bjorn Munch 2010-09-27 Bug #57036 Add checks in mysqltest that variables treated as ints are in fact ints Adds boolean flag is_int and a separete function to check for int value Added tests to mysqltest.test modified: client/mysqltest.cc mysql-test/r/mysqltest.result mysql-test/t/mysqltest.test 3092 Bjorn Munch 2010-09-21 [merge] test fixes after 56753 modified: 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-21 09:18:53 +0000 +++ b/client/mysqltest.cc 2010-09-28 14:00:11 +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; } @@ -4820,6 +4840,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; } @@ -4907,6 +4937,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; } @@ -5041,6 +5081,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)) { @@ -8111,6 +8158,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 13:52:31 +0000 +++ b/mysql-test/mysql-test-run.pl 2010-09-28 14:00:11 +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:08:32 +0000 +++ b/mysql-test/r/mysqltest.result 2010-09-28 14:00:11 +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:18:53 +0000 +++ b/mysql-test/t/mysqltest.test 2010-09-28 14:00:11 +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 # ---------------------------------------------------------------------------- --===============2069739641== 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/ifexpr-55/ # testament_sha1: b1c1ac711953bd2e5adb83e6d3156f5c7a0e11f2 # timestamp: 2010-09-28 16:57:39 +0200 # source_branch: file:///home/bm136801/my/ecl-51/ # base_revision_id: bjorn.munch@stripped\ # 8szqk6lx3c5wnd1a # # Begin bundle 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 odAsitFzK4WlazU4vMYdiDN/4u5IpwoSDc+9zcA= --===============2069739641==--