Commit 869882f3 authored by lars@mysql.com's avatar lars@mysql.com

WL#2076: Added if(...) construct to mysqltest

Removed SHOW BINLOG EVENTS in test case for ps-protocol and row-based replication
parent b060900a
...@@ -153,10 +153,6 @@ static char TMPDIR[FN_REFLEN]; ...@@ -153,10 +153,6 @@ static char TMPDIR[FN_REFLEN];
static char delimiter[MAX_DELIMITER]= DEFAULT_DELIMITER; static char delimiter[MAX_DELIMITER]= DEFAULT_DELIMITER;
static uint delimiter_length= 1; static uint delimiter_length= 1;
static int *cur_block, *block_stack_end;
static int block_stack[BLOCK_STACK_DEPTH];
static int block_ok_stack[BLOCK_STACK_DEPTH];
static CHARSET_INFO *charset_info= &my_charset_latin1; /* Default charset */ static CHARSET_INFO *charset_info= &my_charset_latin1; /* Default charset */
static const char *charset_name= "latin1"; /* Default character set name */ static const char *charset_name= "latin1"; /* Default character set name */
...@@ -210,8 +206,6 @@ MYSQL_RES *last_result=0; ...@@ -210,8 +206,6 @@ MYSQL_RES *last_result=0;
PARSER parser; PARSER parser;
MASTER_POS master_pos; MASTER_POS master_pos;
int *block_ok; /* set to 0 if the current block should not be executed */
int false_block_depth = 0;
/* if set, all results are concated and compared against this file */ /* if set, all results are concated and compared against this file */
const char *result_file = 0; const char *result_file = 0;
...@@ -281,6 +275,7 @@ Q_QUERY_VERTICAL, Q_QUERY_HORIZONTAL, ...@@ -281,6 +275,7 @@ Q_QUERY_VERTICAL, Q_QUERY_HORIZONTAL,
Q_START_TIMER, Q_END_TIMER, Q_START_TIMER, Q_END_TIMER,
Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL, Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL,
Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT, Q_DISABLE_RECONNECT, Q_ENABLE_RECONNECT,
Q_IF,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
...@@ -368,9 +363,20 @@ const char *command_names[]= ...@@ -368,9 +363,20 @@ const char *command_names[]=
"enable_ps_protocol", "enable_ps_protocol",
"disable_reconnect", "disable_reconnect",
"enable_reconnect", "enable_reconnect",
"if",
0 0
}; };
/* Block stack */
typedef struct
{
int line; /* Start line of block */
my_bool ok; /* Should block be executed */
enum enum_commands cmd; /* Command owning the block */
} BLOCK;
static BLOCK block_stack[BLOCK_STACK_DEPTH];
static BLOCK *cur_block, *block_stack_end;
TYPELIB command_typelib= {array_elements(command_names),"", TYPELIB command_typelib= {array_elements(command_names),"",
command_names, 0}; command_names, 0};
...@@ -1723,36 +1729,54 @@ int do_connect(struct st_query* q) ...@@ -1723,36 +1729,54 @@ int do_connect(struct st_query* q)
int do_done(struct st_query* q) int do_done(struct st_query* q)
{ {
/* Dummy statement to eliminate compiler warning */
q->type = Q_END_BLOCK; q->type = Q_END_BLOCK;
/* Check if empty block stack */
if (cur_block == block_stack) if (cur_block == block_stack)
die("Stray '}' - end of block before beginning"); die("Stray '}' - end of block before beginning");
if (*block_ok--)
/* Test if inner block has been executed */
if (cur_block->ok && cur_block->cmd == Q_WHILE)
{ {
parser.current_line = *--cur_block; /* Pop block from stack, re-execute outer block */
cur_block--;
parser.current_line = cur_block->line;
} }
else else
{ {
++parser.current_line; /* Pop block from stack, goto next line */
--cur_block; cur_block--;
parser.current_line++;
} }
return 0; return 0;
} }
int do_while(struct st_query* q)
int do_block(enum enum_commands cmd, struct st_query* q)
{ {
char* p=q->first_argument; char* p=q->first_argument;
const char* expr_start, *expr_end; const char* expr_start, *expr_end;
VAR v; VAR v;
/* Check stack overflow */
if (cur_block == block_stack_end) if (cur_block == block_stack_end)
die("Nesting too deeply"); die("Nesting too deeply");
if (!*block_ok)
/* Set way to find outer block again, increase line counter */
cur_block->line= parser.current_line++;
/* If this block is ignored */
if (!cur_block->ok)
{ {
++false_block_depth; /* Inner block should be ignored too */
*++block_ok = 0; cur_block++;
*cur_block++ = parser.current_line++; cur_block->cmd= cmd;
cur_block->ok= FALSE;
return 0; return 0;
} }
/* Parse and evaluate test expression */
expr_start = strchr(p, '('); expr_start = strchr(p, '(');
if (!expr_start) if (!expr_start)
die("missing '(' in while"); die("missing '(' in while");
...@@ -1761,14 +1785,12 @@ int do_while(struct st_query* q) ...@@ -1761,14 +1785,12 @@ int do_while(struct st_query* q)
die("missing ')' in while"); die("missing ')' in while");
var_init(&v,0,0,0,0); var_init(&v,0,0,0,0);
eval_expr(&v, ++expr_start, &expr_end); eval_expr(&v, ++expr_start, &expr_end);
*cur_block++ = parser.current_line++;
if (!v.int_val) /* Define inner block */
{ cur_block++;
*++block_ok = 0; cur_block->cmd= cmd;
false_block_depth++; cur_block->ok= (v.int_val ? TRUE : FALSE);
}
else
*++block_ok = 1;
var_free(&v); var_free(&v);
return 0; return 0;
} }
...@@ -3404,12 +3426,13 @@ int main(int argc, char **argv) ...@@ -3404,12 +3426,13 @@ int main(int argc, char **argv)
lineno = lineno_stack; lineno = lineno_stack;
my_init_dynamic_array(&q_lines, sizeof(struct st_query*), INIT_Q_LINES, my_init_dynamic_array(&q_lines, sizeof(struct st_query*), INIT_Q_LINES,
INIT_Q_LINES); INIT_Q_LINES);
memset(block_stack, 0, sizeof(block_stack)); memset(block_stack, 0, sizeof(block_stack));
block_stack_end = block_stack + BLOCK_STACK_DEPTH; block_stack_end= block_stack + BLOCK_STACK_DEPTH;
memset(block_ok_stack, 0, sizeof(block_stack)); cur_block= block_stack;
cur_block = block_stack; cur_block->ok= TRUE; /* Outer block should always be executed */
block_ok = block_ok_stack; cur_block->cmd= Q_UNKNOWN;
*block_ok = 1;
init_dynamic_string(&ds_res, "", 0, 65536); init_dynamic_string(&ds_res, "", 0, 65536);
parse_args(argc, argv); parse_args(argc, argv);
if (mysql_server_init(embedded_server_arg_count, if (mysql_server_init(embedded_server_arg_count,
...@@ -3461,7 +3484,7 @@ int main(int argc, char **argv) ...@@ -3461,7 +3484,7 @@ int main(int argc, char **argv)
int current_line_inc = 1, processed = 0; int current_line_inc = 1, processed = 0;
if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND) if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND)
get_query_type(q); get_query_type(q);
if (*block_ok) if (cur_block->ok)
{ {
processed = 1; processed = 1;
switch (q->type) { switch (q->type) {
...@@ -3657,7 +3680,8 @@ int main(int argc, char **argv) ...@@ -3657,7 +3680,8 @@ int main(int argc, char **argv)
{ {
current_line_inc = 0; current_line_inc = 0;
switch (q->type) { switch (q->type) {
case Q_WHILE: do_while(q); break; case Q_WHILE: do_block(Q_WHILE, q); break;
case Q_IF: do_block(Q_IF, q); break;
case Q_END_BLOCK: do_done(q); break; case Q_END_BLOCK: do_done(q); break;
default: current_line_inc = 1; break; default: current_line_inc = 1; break;
} }
......
...@@ -4,6 +4,12 @@ ...@@ -4,6 +4,12 @@
# the $variables is extreme sensitive. # the $variables is extreme sensitive.
# #
###############################################################
# Debug options : To debug this test script
###############################################################
let $showbinlog= 0;
let $manipulate= 1;
######## The typical test sequence ######## The typical test sequence
# 1. INSERT without commit # 1. INSERT without commit
# check table content of master and slave # check table content of master and slave
...@@ -52,9 +58,12 @@ let $MAX= `SELECT MAX(f1) FROM t1` ; ...@@ -52,9 +58,12 @@ let $MAX= `SELECT MAX(f1) FROM t1` ;
eval INSERT INTO t1 SET f1= $MAX + 1; eval INSERT INTO t1 SET f1= $MAX + 1;
# results before DDL(to be tested) # results before DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s';
}
sync_slave_with_master; sync_slave_with_master;
connection slave; connection slave;
...@@ -63,9 +72,12 @@ SELECT '-------- switch to slave --------' as ""; ...@@ -63,9 +72,12 @@ SELECT '-------- switch to slave --------' as "";
--enable_query_log --enable_query_log
# results before DDL(to be tested) # results before DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
}
############################################################### ###############################################################
# command to be tested # command to be tested
...@@ -79,9 +91,12 @@ eval $my_stmt; ...@@ -79,9 +91,12 @@ eval $my_stmt;
let $my_stmt= ERROR: YOU FORGOT TO FILL IN THE STATEMENT; let $my_stmt= ERROR: YOU FORGOT TO FILL IN THE STATEMENT;
# results after DDL(to be tested) # results after DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s';
}
sync_slave_with_master; sync_slave_with_master;
connection slave; connection slave;
...@@ -90,9 +105,12 @@ SELECT '-------- switch to slave --------' as ""; ...@@ -90,9 +105,12 @@ SELECT '-------- switch to slave --------' as "";
--enable_query_log --enable_query_log
# results after DDL(to be tested) # results after DDL(to be tested)
SELECT MAX(f1) FROM t1; SELECT MAX(f1) FROM t1;
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
}
############################################################### ###############################################################
# ROLLBACK # ROLLBACK
...@@ -114,9 +132,12 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: MASTER: The INSERT is ', ...@@ -114,9 +132,12 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: MASTER: The INSERT is ',
' (Failed)')) AS "" ' (Failed)')) AS ""
FROM mysqltest1.t1; FROM mysqltest1.t1;
--enable_query_log --enable_query_log
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'master-bin.$_log_num_s';
}
sync_slave_with_master; sync_slave_with_master;
connection slave; connection slave;
...@@ -133,16 +154,17 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: SLAVE: The INSERT is ', ...@@ -133,16 +154,17 @@ eval SELECT CONCAT(CONCAT('TEST-INFO: SLAVE: The INSERT is ',
' (Failed)')) AS "" ' (Failed)')) AS ""
FROM mysqltest1.t1; FROM mysqltest1.t1;
--enable_query_log --enable_query_log
if ($show_binlog)
{
--replace_result $VERSION VERSION --replace_result $VERSION VERSION
--replace_column 2 # 5 # --replace_column 2 # 5 #
eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
}
############################################################### ###############################################################
# Manipulate binlog # Manipulate binlog
############################################################### ###############################################################
#let $manipulate= 0; if ($manipulate)
let $manipulate= 1;
while ($manipulate)
{ {
#### Manipulate the binary logs, #### Manipulate the binary logs,
# so that the output of SHOW BINLOG EVENTS IN <current log> # so that the output of SHOW BINLOG EVENTS IN <current log>
...@@ -171,7 +193,6 @@ flush logs; ...@@ -171,7 +193,6 @@ flush logs;
# sleep 1; # sleep 1;
# eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s'; # eval SHOW BINLOG EVENTS IN 'slave-bin.$_log_num_s';
inc $_log_num_n; inc $_log_num_n;
let $manipulate= 0;
} }
connection master; connection master;
......
This diff is collapsed.
...@@ -253,6 +253,8 @@ let $my_slave_commit= false; ...@@ -253,6 +253,8 @@ let $my_slave_commit= false;
--source include/rpl_stmt_seq.inc --source include/rpl_stmt_seq.inc
# With prior read locking # With prior read locking
# Note that this test generate an error since the rpl_stmt_seq.inc
# tries to insert into t1.
LOCK TABLES mysqltest1.t1 READ; LOCK TABLES mysqltest1.t1 READ;
let $my_stmt= UNLOCK TABLES; let $my_stmt= UNLOCK TABLES;
let $my_master_commit= false; let $my_master_commit= false;
......
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