summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjorn Munch <bjorn.munch@oracle.com>2010-11-15 14:23:02 +0100
committerBjorn Munch <bjorn.munch@oracle.com>2010-11-15 14:23:02 +0100
commit92a1a112030452b375684e2b8633de0a32dc0912 (patch)
treed9bdfcbf2ee86e412eed95ee536e7a966582dbd3
parentdbbb506f4226e30255b8f4463163d4f6d39400fc (diff)
downloadmariadb-git-92a1a112030452b375684e2b8633de0a32dc0912.tar.gz
Bug #58087 mysqltest re-evaluates 'let' expressions infinitely
Results from query is sent for evaluation Break recursion by asking for ` to be ignored
-rw-r--r--client/mysqltest.cc9
-rw-r--r--mysql-test/r/mysqltest.result4
-rw-r--r--mysql-test/t/mysqltest.test7
3 files changed, 16 insertions, 4 deletions
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index abedd874948..9fc692d0d04 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -471,7 +471,7 @@ VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
void var_free(void* v);
VAR* var_get(const char *var_name, const char** var_name_end,
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);
void dump_result_to_reject_file(char *buf, int size);
void dump_warning_messages();
@@ -2233,7 +2233,8 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
dynstr_append_mem(&result, "\t", 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);
}
else
@@ -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");
@@ -2414,7 +2415,7 @@ void eval_expr(VAR *v, const char *p, const char **p_end)
DBUG_VOID_RETURN;
}
- if (*p == '`')
+ if (*p == '`' && backtick)
{
var_query_set(v, p, p_end);
DBUG_VOID_RETURN;
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index 8afef65b66f..f22a18057c3 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -308,6 +308,10 @@ var3 two columns with same name
var4 from query that returns NULL
var5 from query that returns no row
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: Missing required argument 'filename' to command 'source'
mysqltest: At line 1: Could not open './non_existingFile' for reading, errno: 2
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index d6bdbc2b3c1..59ff70e1591 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -854,6 +854,13 @@ let $var2= `failing query`;
echo $var2;
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
--exec $MYSQL_TEST < $MYSQLTEST_VARDIR/tmp/let.sql 2>&1