Commit d6ad8e3e authored by msvensson@shellback.(none)'s avatar msvensson@shellback.(none)

Merge shellback.(none):/home/msvensson/mysql/my51-mysqltest-new-commands

into  shellback.(none):/home/msvensson/mysql/same_tools/my51-same_tools
parents b9eda58a b7977855
......@@ -16,12 +16,14 @@
/* mysqltest test tool
* See the "MySQL Test framework manual" for more information
* http://dev.mysql.com/doc/mysqltest/en/index.html
*
* Written by:
* Sasha Pachev <sasha@mysql.com>
* Matt Wagner <matt@mysql.com>
* Monty
* Jani
* Magnus
**/
#define MTEST_VERSION "2.7"
......@@ -1296,6 +1298,7 @@ static void do_exec(struct st_query *query)
query->first_argument, query->expected_errno[0].code.errnum);
}
dynstr_free(&ds_cmd);
free_replace();
DBUG_VOID_RETURN;
}
......@@ -1721,22 +1724,32 @@ static my_bool match_delimiter(int c, const char* delim, uint length)
}
static void read_until_EOF(DYNAMIC_STRING* ds)
static void read_until_delimiter(DYNAMIC_STRING *ds,
DYNAMIC_STRING *ds_delimiter)
{
int c;
DBUG_ENTER("read_until_EOF");
DBUG_ENTER("read_until_delimiter");
DBUG_PRINT("enter", ("delimiter: %s, length: %d",
ds_delimiter->str, ds_delimiter->length));
if (ds_delimiter->length > MAX_DELIMITER)
die("Max delimiter length(%d) exceeded", MAX_DELIMITER);
/* Read from file until delimiter EOF is found */
/* Read from file until delimiter is found */
while (1)
{
c= my_getc(cur_file->file);
if (c == '\n')
cur_file->lineno++;
if (feof(cur_file->file))
die("End of file encountered before 'EOF' delimiter was found");
die("End of file encountered before '%s' delimiter was found",
ds_delimiter->str);
if (match_delimiter(c, "EOF", 3))
if (match_delimiter(c, ds_delimiter->str, ds_delimiter->length))
{
DBUG_PRINT("exit", ("Found EOF"));
DBUG_PRINT("exit", ("Found delimiter '%s'", ds_delimiter->str));
break;
}
dynstr_append_mem(ds, (const char*)&c, 1);
......@@ -1752,7 +1765,7 @@ static void read_until_EOF(DYNAMIC_STRING* ds)
command called command
DESCRIPTION
write_file <file_name>;
write_file <file_name> [<delimiter>];
<what to write line 1>
<...>
< what to write line n>
......@@ -1764,18 +1777,23 @@ static void read_until_EOF(DYNAMIC_STRING* ds)
< what to write line n>
EOF
Write everything between the "write_file" command and EOF to "file_name"
Write everything between the "write_file" command and 'delimiter'
to "file_name"
NOTE! Overwrites existing file
Default <delimiter> is EOF
*/
static void do_write_file(struct st_query *command)
{
DYNAMIC_STRING ds_content;
DYNAMIC_STRING ds_filename;
DYNAMIC_STRING ds_delimiter;
const struct command_arg write_file_args[] = {
"filename", ARG_STRING, TRUE, &ds_filename, "File to write to",
"delimiter", ARG_STRING, FALSE, &ds_delimiter, "Delimiter to read until"
};
DBUG_ENTER("do_write_file");
......@@ -1784,12 +1802,17 @@ static void do_write_file(struct st_query *command)
write_file_args,
sizeof(write_file_args)/sizeof(struct command_arg));
/* If no delimiter was provided, use EOF */
if (ds_delimiter.length == 0)
dynstr_set(&ds_delimiter, "EOF");
init_dynamic_string(&ds_content, "", 1024, 1024);
read_until_EOF(&ds_content);
read_until_delimiter(&ds_content, &ds_delimiter);
DBUG_PRINT("info", ("Writing to file: %s", ds_filename.str));
str_to_file(ds_filename.str, ds_content.str, ds_content.length);
dynstr_free(&ds_content);
dynstr_free(&ds_filename);
dynstr_free(&ds_delimiter);
DBUG_VOID_RETURN;
}
......@@ -1800,22 +1823,17 @@ static void do_write_file(struct st_query *command)
command command handle
DESCRIPTION
perl;
perl [<delimiter>];
<perlscript line 1>
<...>
<perlscript line n>
EOF
Execute everything after "perl" until EOF as perl.
Execute everything after "perl" until <delimiter> as perl.
Useful for doing more advanced things
but still being able to execute it on all platforms.
The function sets delimiter to EOF and remembers that this
is a perl command by setting "perl mode". The following lines
will then be parsed as any normal query, but when searching
for command in get_query_type, this function will be called
again since "perl mode" is on and the perl script can be
executed.
Default <delimiter> is EOF
*/
static void do_perl(struct st_query *command)
......@@ -1824,10 +1842,23 @@ static void do_perl(struct st_query *command)
char buf[FN_REFLEN];
FILE *res_file;
DYNAMIC_STRING ds_script;
DYNAMIC_STRING ds_delimiter;
const struct command_arg perl_args[] = {
"delimiter", ARG_STRING, FALSE, &ds_delimiter, "Delimiter to read until"
};
DBUG_ENTER("do_perl");
check_command_args(command,
command->first_argument,
perl_args,
sizeof(perl_args)/sizeof(struct command_arg));
/* If no delimiter was provided, use EOF */
if (ds_delimiter.length == 0)
dynstr_set(&ds_delimiter, "EOF");
init_dynamic_string(&ds_script, "", 1024, 1024);
read_until_EOF(&ds_script);
read_until_delimiter(&ds_script, &ds_delimiter);
DBUG_PRINT("info", ("Executing perl: %s", ds_script.str));
......@@ -1858,6 +1889,7 @@ static void do_perl(struct st_query *command)
error= pclose(res_file);
handle_command_error(command, WEXITSTATUS(error));
dynstr_free(&ds_script);
dynstr_free(&ds_delimiter);
DBUG_VOID_RETURN;
}
......@@ -2714,6 +2746,7 @@ static void free_replace_regex()
{
if (glob_replace_regex)
{
delete_dynamic(&glob_replace_regex->regex_arr);
my_free(glob_replace_regex->even_buf,MYF(MY_ALLOW_ZERO_PTR));
my_free(glob_replace_regex->odd_buf,MYF(MY_ALLOW_ZERO_PTR));
my_free((char*) glob_replace_regex,MYF(0));
......@@ -4160,6 +4193,7 @@ static int reg_replace(char** buf_p, int* buf_len_p, char *pattern,
str_p= str_end;
}
}
my_free((gptr)subs, MYF(0));
my_regfree(&r);
*res_p= 0;
*buf_p= buf;
......
......@@ -488,4 +488,8 @@ mysqltest: At line 1: Missing required argument 'to_file' to command 'copy_file'
hello
hello
hello
mysqltest: At line 1: Max delimiter length(16) exceeded
hello
hello
End of tests
End of 5.1 tests
......@@ -1211,6 +1211,18 @@ remove_file non_existing_file;
--error 1
--exec echo "write_file filename \";" | $MYSQL_TEST 2>&1
write_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
Content for test_file1
EOF
file_exists $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
remove_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
write_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp END_DELIMITER;
Content for test_file1 contains EOF
END_DELIMITER
file_exists $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
remove_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
# ----------------------------------------------------------------------------
# test for file_exist
# ----------------------------------------------------------------------------
......@@ -1255,6 +1267,17 @@ remove_file $MYSQLTEST_VARDIR/tmp/file2.tmp;
print "hello\n";
EOF
--perl EOF
print "hello\n";
EOF
--perl DELIMITER
print "hello\n";
DELIMITER
--error 1
--exec echo "perl TOO_LONG_DELIMITER ;" | $MYSQL_TEST 2>&1
perl;
print "hello\n";
EOF
......@@ -1263,4 +1286,7 @@ perl;
# Print "hello"
print "hello\n";
EOF
--echo End of tests
--echo End of 5.1 tests
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