Commit a3c7d967 authored by Bjorn Munch's avatar Bjorn Munch

Bug #44922 mysqltest's query_get_value function can't work with queries containing ','

check_command_args() always looks for the first , (or whatever)
Extended check_command_args() to let arguments be quoted
Added test in mysqltest.test
parent ba9e3c45
...@@ -966,6 +966,7 @@ void check_command_args(struct st_command *command, ...@@ -966,6 +966,7 @@ void check_command_args(struct st_command *command,
for (i= 0; i < num_args; i++) for (i= 0; i < num_args; i++)
{ {
const struct command_arg *arg= &args[i]; const struct command_arg *arg= &args[i];
char delimiter;
switch (arg->type) { switch (arg->type) {
/* A string */ /* A string */
...@@ -974,8 +975,15 @@ void check_command_args(struct st_command *command, ...@@ -974,8 +975,15 @@ void check_command_args(struct st_command *command,
while (*ptr && *ptr == ' ') while (*ptr && *ptr == ' ')
ptr++; ptr++;
start= ptr; start= ptr;
/* Find end of arg, terminated by "delimiter_arg" */ delimiter = delimiter_arg;
while (*ptr && *ptr != delimiter_arg) /* If start of arg is ' ` or " search to matching quote end instead */
if (*ptr && strchr ("'`\"", *ptr))
{
delimiter= *ptr;
start= ++ptr;
}
/* Find end of arg, terminated by "delimiter" */
while (*ptr && *ptr != delimiter)
ptr++; ptr++;
if (ptr > start) if (ptr > start)
{ {
...@@ -987,6 +995,11 @@ void check_command_args(struct st_command *command, ...@@ -987,6 +995,11 @@ void check_command_args(struct st_command *command,
/* Empty string */ /* Empty string */
init_dynamic_string(arg->ds, "", 0, 0); init_dynamic_string(arg->ds, "", 0, 0);
} }
/* Find real end of arg, terminated by "delimiter_arg" */
/* This will do nothing if arg was not closed by quotes */
while (*ptr && *ptr != delimiter_arg)
ptr++;
command->last_argument= (char*)ptr; command->last_argument= (char*)ptr;
/* Step past the delimiter */ /* Step past the delimiter */
......
...@@ -697,6 +697,7 @@ statement="SHOW COLUMNS FROM t1" row_number=1, column_name="Type", Value=int(11) ...@@ -697,6 +697,7 @@ statement="SHOW COLUMNS FROM t1" row_number=1, column_name="Type", Value=int(11)
statement=SHOW COLUMNS FROM t1 row_number=1, column_name=Default, Value=NULL statement=SHOW COLUMNS FROM t1 row_number=1, column_name=Default, Value=NULL
value= ->A B<- value= ->A B<-
value= 1 value= 1
value= 2
mysqltest: At line 1: query_get_value - argument list started with '(' must be ended with ')' mysqltest: At line 1: query_get_value - argument list started with '(' must be ended with ')'
mysqltest: At line 1: Missing required argument 'query' to command 'query_get_value' mysqltest: At line 1: Missing required argument 'query' to command 'query_get_value'
mysqltest: At line 1: Missing required argument 'column name' to command 'query_get_value' mysqltest: At line 1: Missing required argument 'column name' to command 'query_get_value'
......
...@@ -55,7 +55,8 @@ disconnect con4; ...@@ -55,7 +55,8 @@ disconnect con4;
connect (fail_con,localhost,test,,test2); connect (fail_con,localhost,test,,test2);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT --replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
--error ER_ACCESS_DENIED_ERROR --error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,,""); # Need to protect "" within '' so it's interpreted literally
connect (fail_con,localhost,test,,'""');
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT --replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
--error ER_ACCESS_DENIED_ERROR --error ER_ACCESS_DENIED_ERROR
connect (fail_con,localhost,test,zorro,test2); connect (fail_con,localhost,test,zorro,test2);
......
...@@ -2037,6 +2037,10 @@ let $value= query_get_value(SELECT 'A B' AS "MyColumn", MyColumn, 1); ...@@ -2037,6 +2037,10 @@ let $value= query_get_value(SELECT 'A B' AS "MyColumn", MyColumn, 1);
let $value= query_get_value(SELECT 1 AS "My Column", My Column, 1); let $value= query_get_value(SELECT 1 AS "My Column", My Column, 1);
--echo value= $value --echo value= $value
# #
# 4.1 Query containing , protected by quotes, quotes also on column
let $value= query_get_value('SELECT 1 as a, 2 as b', "b", 1);
--echo value= $value
#
#------------ Negative tests ------------ #------------ Negative tests ------------
# 5. Incomplete statement including missing parameters # 5. Incomplete statement including missing parameters
# 5.1 incomplete statement # 5.1 incomplete statement
......
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