Commit 92a1a112 authored by Bjorn Munch's avatar Bjorn Munch

Bug #58087 mysqltest re-evaluates 'let' expressions infinitely

Results from query is sent for evaluation
Break recursion by asking for ` to be ignored
parent dbbb506f
...@@ -471,7 +471,7 @@ VAR* var_init(VAR* v, const char *name, int name_len, const char *val, ...@@ -471,7 +471,7 @@ VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
void var_free(void* v); void var_free(void* v);
VAR* var_get(const char *var_name, const char** var_name_end, VAR* var_get(const char *var_name, const char** var_name_end,
my_bool raw, my_bool ignore_not_existing); my_bool raw, my_bool ignore_not_existing);
void eval_expr(VAR* v, const char *p, const char** p_end); void eval_expr(VAR* v, const char *p, const char** p_end, bool backtick= true);
my_bool match_delimiter(int c, const char *delim, uint length); my_bool match_delimiter(int c, const char *delim, uint length);
void dump_result_to_reject_file(char *buf, int size); void dump_result_to_reject_file(char *buf, int size);
void dump_warning_messages(); void dump_warning_messages();
...@@ -2233,7 +2233,8 @@ void var_query_set(VAR *var, const char *query, const char** query_end) ...@@ -2233,7 +2233,8 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
dynstr_append_mem(&result, "\t", 1); dynstr_append_mem(&result, "\t", 1);
} }
end= result.str + result.length-1; end= result.str + result.length-1;
eval_expr(var, result.str, (const char**) &end); /* Evaluation should not recurse via backtick */
eval_expr(var, result.str, (const char**) &end, false);
dynstr_free(&result); dynstr_free(&result);
} }
else else
...@@ -2389,7 +2390,7 @@ void var_copy(VAR *dest, VAR *src) ...@@ -2389,7 +2390,7 @@ void var_copy(VAR *dest, VAR *src)
} }
void eval_expr(VAR *v, const char *p, const char **p_end) void eval_expr(VAR *v, const char *p, const char **p_end, bool backtick)
{ {
DBUG_ENTER("eval_expr"); DBUG_ENTER("eval_expr");
...@@ -2414,7 +2415,7 @@ void eval_expr(VAR *v, const char *p, const char **p_end) ...@@ -2414,7 +2415,7 @@ void eval_expr(VAR *v, const char *p, const char **p_end)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
if (*p == '`') if (*p == '`' && backtick)
{ {
var_query_set(v, p, p_end); var_query_set(v, p, p_end);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
......
...@@ -308,6 +308,10 @@ var3 two columns with same name ...@@ -308,6 +308,10 @@ var3 two columns with same name
var4 from query that returns NULL var4 from query that returns NULL
var5 from query that returns no row var5 from query that returns no row
failing query in let failing query in let
create table t1 (a varchar(100));
insert into t1 values ('`select 42`');
`select 42`
drop table t1;
mysqltest: At line 1: Error running query 'failing query': 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'failing query' at line 1 mysqltest: At line 1: Error running query 'failing query': 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'failing query' at line 1
mysqltest: At line 1: Missing required argument 'filename' to command 'source' mysqltest: At line 1: Missing required argument 'filename' to command 'source'
mysqltest: At line 1: Could not open './non_existingFile' for reading, errno: 2 mysqltest: At line 1: Could not open './non_existingFile' for reading, errno: 2
......
...@@ -854,6 +854,13 @@ let $var2= `failing query`; ...@@ -854,6 +854,13 @@ let $var2= `failing query`;
echo $var2; echo $var2;
EOF EOF
create table t1 (a varchar(100));
insert into t1 values ('`select 42`');
let $a= `select * from t1`;
# This should output `select 42`, not evaluate it again to 42
echo $a;
drop table t1;
--error 1 --error 1
--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/let.sql 2>&1 --exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/let.sql 2>&1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment