From: Bjorn Munch Date: September 27 2010 12:37pm Subject: bzr commit into mysql-5.5-mtr branch (bjorn.munch:3093) Bug#57036 List-Archive: http://lists.mysql.com/commits/119164 X-Bug: 57036 Message-Id: <201009271237.o8RCbnjb016771@khepri15.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1920834354==" --===============1920834354== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/bm136801/my/ifexpr-55/ based on revid:bjorn.munch@stripped 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 === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2010-09-21 09:18:53 +0000 +++ b/client/mysqltest.cc 2010-09-27 12:36:16 +0000 @@ -227,8 +227,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 */ @@ -1954,6 +1955,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 +2004,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 +2068,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 +2130,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 +2436,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 +2520,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 +2867,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 +2880,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; } === 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-27 12:36:16 +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 === 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-27 12:36:16 +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 # ---------------------------------------------------------------------------- --===============1920834354== 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: 9d1a41bf9622e15f9fb60e8f0c8edff13b9006d6 # timestamp: 2010-09-27 14:37:49 +0200 # base_revision_id: bjorn.munch@stripped\ # 8szqk6lx3c5wnd1a # # Begin bundle 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 --===============1920834354==--