Bug #37097 mysqltest add result file format version 2
Add result file format v2 Backport to 5.6.0
This commit is contained in:
parent
3e18dfb6b0
commit
b2d7daeb6d
@ -75,7 +75,8 @@
|
|||||||
enum {
|
enum {
|
||||||
OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION,
|
OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION,
|
||||||
OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL,
|
OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL,
|
||||||
OPT_MAX_CONNECT_RETRIES, OPT_MARK_PROGRESS, OPT_LOG_DIR, OPT_TAIL_LINES
|
OPT_MAX_CONNECT_RETRIES, OPT_MARK_PROGRESS, OPT_LOG_DIR, OPT_TAIL_LINES,
|
||||||
|
OPT_RESULT_FORMAT_VERSION
|
||||||
};
|
};
|
||||||
|
|
||||||
static int record= 0, opt_sleep= -1;
|
static int record= 0, opt_sleep= -1;
|
||||||
@ -85,6 +86,7 @@ const char *opt_logdir= "";
|
|||||||
const char *opt_include= 0, *opt_charsets_dir;
|
const char *opt_include= 0, *opt_charsets_dir;
|
||||||
static int opt_port= 0;
|
static int opt_port= 0;
|
||||||
static int opt_max_connect_retries;
|
static int opt_max_connect_retries;
|
||||||
|
static int opt_result_format_version;
|
||||||
static my_bool opt_compress= 0, silent= 0, verbose= 0;
|
static my_bool opt_compress= 0, silent= 0, verbose= 0;
|
||||||
static my_bool debug_info_flag= 0, debug_check_flag= 0;
|
static my_bool debug_info_flag= 0, debug_check_flag= 0;
|
||||||
static my_bool tty_password= 0;
|
static my_bool tty_password= 0;
|
||||||
@ -281,11 +283,13 @@ enum enum_commands {
|
|||||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
|
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
|
||||||
Q_LIST_FILES, Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE,
|
Q_LIST_FILES, Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE,
|
||||||
Q_SEND_SHUTDOWN, Q_SHUTDOWN_SERVER,
|
Q_SEND_SHUTDOWN, Q_SHUTDOWN_SERVER,
|
||||||
|
Q_RESULT_FORMAT_VERSION,
|
||||||
Q_MOVE_FILE,
|
Q_MOVE_FILE,
|
||||||
|
|
||||||
Q_UNKNOWN, /* Unknown command. */
|
Q_UNKNOWN, /* Unknown command. */
|
||||||
Q_COMMENT, /* Comments, ignored. */
|
Q_COMMENT, /* Comments, ignored. */
|
||||||
Q_COMMENT_WITH_COMMAND
|
Q_COMMENT_WITH_COMMAND,
|
||||||
|
Q_EMPTY_LINE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -375,6 +379,7 @@ const char *command_names[]=
|
|||||||
"list_files_append_file",
|
"list_files_append_file",
|
||||||
"send_shutdown",
|
"send_shutdown",
|
||||||
"shutdown_server",
|
"shutdown_server",
|
||||||
|
"result_format",
|
||||||
"move_file",
|
"move_file",
|
||||||
|
|
||||||
0
|
0
|
||||||
@ -2190,6 +2195,59 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_result_format_version(ulong new_version)
|
||||||
|
{
|
||||||
|
switch (new_version){
|
||||||
|
case 1:
|
||||||
|
/* The first format */
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
/* New format that also writes comments and empty lines
|
||||||
|
from test file to result */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
die("Version format %lu has not yet been implemented", new_version);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
opt_result_format_version= new_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Set the result format version to use when generating
|
||||||
|
the .result file
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_result_format_version(struct st_command *command)
|
||||||
|
{
|
||||||
|
long version;
|
||||||
|
static DYNAMIC_STRING ds_version;
|
||||||
|
const struct command_arg result_format_args[] = {
|
||||||
|
"version", ARG_STRING, TRUE, &ds_version, "Version to use",
|
||||||
|
};
|
||||||
|
|
||||||
|
DBUG_ENTER("do_result_format_version");
|
||||||
|
|
||||||
|
check_command_args(command, command->first_argument,
|
||||||
|
result_format_args,
|
||||||
|
sizeof(result_format_args)/sizeof(struct command_arg),
|
||||||
|
',');
|
||||||
|
|
||||||
|
/* Convert version number to int */
|
||||||
|
if (!str2int(ds_version.str, 10, (long) 0, (long) INT_MAX, &version))
|
||||||
|
die("Invalid version number: '%s'", ds_version.str);
|
||||||
|
|
||||||
|
set_result_format_version(version);
|
||||||
|
|
||||||
|
dynstr_append(&ds_res, "result_format: ");
|
||||||
|
dynstr_append_mem(&ds_res, ds_version.str, ds_version.length);
|
||||||
|
dynstr_append(&ds_res, "\n");
|
||||||
|
dynstr_free(&ds_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set variable from the result of a field in a query
|
Set variable from the result of a field in a query
|
||||||
|
|
||||||
@ -5265,7 +5323,7 @@ my_bool end_of_query(int c)
|
|||||||
|
|
||||||
int read_line(char *buf, int size)
|
int read_line(char *buf, int size)
|
||||||
{
|
{
|
||||||
char c, UNINIT_VAR(last_quote);
|
char c, UNINIT_VAR(last_quote), last_char= 0;
|
||||||
char *p= buf, *buf_end= buf + size - 1;
|
char *p= buf, *buf_end= buf + size - 1;
|
||||||
int skip_char= 0;
|
int skip_char= 0;
|
||||||
enum {R_NORMAL, R_Q, R_SLASH_IN_Q,
|
enum {R_NORMAL, R_Q, R_SLASH_IN_Q,
|
||||||
@ -5363,14 +5421,24 @@ int read_line(char *buf, int size)
|
|||||||
}
|
}
|
||||||
else if (my_isspace(charset_info, c))
|
else if (my_isspace(charset_info, c))
|
||||||
{
|
{
|
||||||
/* Skip all space at begining of line */
|
|
||||||
if (c == '\n')
|
if (c == '\n')
|
||||||
{
|
{
|
||||||
|
if (last_char == '\n')
|
||||||
|
{
|
||||||
|
/* Two new lines in a row, return empty line */
|
||||||
|
DBUG_PRINT("info", ("Found two new lines in a row"));
|
||||||
|
*p++= c;
|
||||||
|
*p= 0;
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Query hasn't started yet */
|
/* Query hasn't started yet */
|
||||||
start_lineno= cur_file->lineno;
|
start_lineno= cur_file->lineno;
|
||||||
DBUG_PRINT("info", ("Query hasn't started yet, start_lineno: %d",
|
DBUG_PRINT("info", ("Query hasn't started yet, start_lineno: %d",
|
||||||
start_lineno));
|
start_lineno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip all space at begining of line */
|
||||||
skip_char= 1;
|
skip_char= 1;
|
||||||
}
|
}
|
||||||
else if (end_of_query(c))
|
else if (end_of_query(c))
|
||||||
@ -5411,6 +5479,8 @@ int read_line(char *buf, int size)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
last_char= c;
|
||||||
|
|
||||||
if (!skip_char)
|
if (!skip_char)
|
||||||
{
|
{
|
||||||
/* Could be a multibyte character */
|
/* Could be a multibyte character */
|
||||||
@ -5620,9 +5690,10 @@ int read_command(struct st_command** command_ptr)
|
|||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
convert_to_format_v1(read_command_buf);
|
if (opt_result_format_version == 1)
|
||||||
|
convert_to_format_v1(read_command_buf);
|
||||||
|
|
||||||
DBUG_PRINT("info", ("query: %s", read_command_buf));
|
DBUG_PRINT("info", ("query: '%s'", read_command_buf));
|
||||||
if (*p == '#')
|
if (*p == '#')
|
||||||
{
|
{
|
||||||
command->type= Q_COMMENT;
|
command->type= Q_COMMENT;
|
||||||
@ -5632,6 +5703,10 @@ int read_command(struct st_command** command_ptr)
|
|||||||
command->type= Q_COMMENT_WITH_COMMAND;
|
command->type= Q_COMMENT_WITH_COMMAND;
|
||||||
p+= 2; /* Skip past -- */
|
p+= 2; /* Skip past -- */
|
||||||
}
|
}
|
||||||
|
else if (*p == '\n')
|
||||||
|
{
|
||||||
|
command->type= Q_EMPTY_LINE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Skip leading spaces */
|
/* Skip leading spaces */
|
||||||
while (*p && my_isspace(charset_info, *p))
|
while (*p && my_isspace(charset_info, *p))
|
||||||
@ -5726,6 +5801,11 @@ static struct my_option my_long_options[] =
|
|||||||
{"result-file", 'R', "Read/Store result from/in this file.",
|
{"result-file", 'R', "Read/Store result from/in this file.",
|
||||||
(uchar**) &result_file_name, (uchar**) &result_file_name, 0,
|
(uchar**) &result_file_name, (uchar**) &result_file_name, 0,
|
||||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
{"result-format-version", OPT_RESULT_FORMAT_VERSION,
|
||||||
|
"Version of the result file format to use",
|
||||||
|
(uchar**) &opt_result_format_version,
|
||||||
|
(uchar**) &opt_result_format_version, 0,
|
||||||
|
GET_INT, REQUIRED_ARG, 1, 1, 2, 0, 0, 0},
|
||||||
{"server-arg", 'A', "Send option value to embedded server as a parameter.",
|
{"server-arg", 'A', "Send option value to embedded server as a parameter.",
|
||||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"server-file", 'F', "Read embedded server arguments from file.",
|
{"server-file", 'F', "Read embedded server arguments from file.",
|
||||||
@ -5929,6 +6009,9 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
sf_malloc_quick=1;
|
sf_malloc_quick=1;
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
case OPT_RESULT_FORMAT_VERSION:
|
||||||
|
set_result_format_version(opt_result_format_version);
|
||||||
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
print_version();
|
print_version();
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -7799,6 +7882,7 @@ int main(int argc, char **argv)
|
|||||||
case Q_MOVE_FILE: do_move_file(command); break;
|
case Q_MOVE_FILE: do_move_file(command); break;
|
||||||
case Q_CHMOD_FILE: do_chmod_file(command); break;
|
case Q_CHMOD_FILE: do_chmod_file(command); break;
|
||||||
case Q_PERL: do_perl(command); break;
|
case Q_PERL: do_perl(command); break;
|
||||||
|
case Q_RESULT_FORMAT_VERSION: do_result_format_version(command); break;
|
||||||
case Q_DELIMITER:
|
case Q_DELIMITER:
|
||||||
do_delimiter(command);
|
do_delimiter(command);
|
||||||
break;
|
break;
|
||||||
@ -7915,9 +7999,38 @@ int main(int argc, char **argv)
|
|||||||
do_sync_with_master2(command, 0);
|
do_sync_with_master2(command, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Q_COMMENT: /* Ignore row */
|
case Q_COMMENT:
|
||||||
|
{
|
||||||
command->last_argument= command->end;
|
command->last_argument= command->end;
|
||||||
|
|
||||||
|
/* Don't output comments in v1 */
|
||||||
|
if (opt_result_format_version == 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Don't output comments if query logging is off */
|
||||||
|
if (disable_query_log)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Write comment's with two starting #'s to result file */
|
||||||
|
const char* p= command->query;
|
||||||
|
if (p && *p == '#' && *(p+1) == '#')
|
||||||
|
{
|
||||||
|
dynstr_append_mem(&ds_res, command->query, command->query_len);
|
||||||
|
dynstr_append(&ds_res, "\n");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
case Q_EMPTY_LINE:
|
||||||
|
/* Don't output newline in v1 */
|
||||||
|
if (opt_result_format_version == 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Don't output newline if query logging is off */
|
||||||
|
if (disable_query_log)
|
||||||
|
break;
|
||||||
|
|
||||||
|
dynstr_append(&ds_res, "\n");
|
||||||
|
break;
|
||||||
case Q_PING:
|
case Q_PING:
|
||||||
handle_command_error(command, mysql_ping(&cur_con->mysql));
|
handle_command_error(command, mysql_ping(&cur_con->mysql));
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user