diff options
-rw-r--r-- | client/mysqltest.c | 32 | ||||
-rw-r--r-- | mysql-test/r/multi_update.result | 24 | ||||
-rw-r--r-- | mysql-test/t/multi_update.test | 25 |
3 files changed, 72 insertions, 9 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c index 1ccd507531b..4ce5f23b28b 100644 --- a/client/mysqltest.c +++ b/client/mysqltest.c @@ -95,9 +95,13 @@ static FILE** cur_file; static FILE** file_stack_end; static uint lineno_stack[MAX_INCLUDE_DEPTH]; static char TMPDIR[FN_REFLEN]; +static int *block_ok_stack_end; -static int block_stack[BLOCK_STACK_DEPTH]; static int *cur_block, *block_stack_end; +static int block_stack[BLOCK_STACK_DEPTH]; + + +static int block_ok_stack[BLOCK_STACK_DEPTH]; static uint global_expected_errno[MAX_EXPECTED_ERRORS]; DYNAMIC_ARRAY q_lines; @@ -121,7 +125,7 @@ typedef struct PARSER parser; MASTER_POS master_pos; -int block_ok = 1; /* set to 0 if the current block should not be executed */ +int* block_ok; /* set to 0 if the current block should not be executed */ int false_block_depth = 0; const char* result_file = 0; /* if set, all results are concated and compared against this file*/ @@ -1091,13 +1095,14 @@ int do_done(struct st_query* q) q->type = Q_END_BLOCK; if (cur_block == block_stack) die("Stray '}' - end of block before beginning"); - if (block_ok) + if (*block_ok--) + { parser.current_line = *--cur_block; + } else { - if (!--false_block_depth) - block_ok = 1; ++parser.current_line; + --cur_block; } return 0; } @@ -1109,11 +1114,14 @@ int do_while(struct st_query* q) VAR v; if (cur_block == block_stack_end) die("Nesting too deeply"); - if (!block_ok) + if (!*block_ok) { ++false_block_depth; + *++block_ok = 0; + *cur_block++ = parser.current_line++; return 0; } + expr_start = strchr(p, '('); if (!expr_start) die("missing '(' in while"); @@ -1124,9 +1132,11 @@ int do_while(struct st_query* q) *cur_block++ = parser.current_line++; if (!v.int_val) { - block_ok = 0; - false_block_depth = 1; + *++block_ok = 0; + false_block_depth++; } + else + *++block_ok = 1; return 0; } @@ -1837,7 +1847,11 @@ int main(int argc, char** argv) INIT_Q_LINES); memset(block_stack, 0, sizeof(block_stack)); block_stack_end = block_stack + BLOCK_STACK_DEPTH; + memset(block_ok_stack, 0, sizeof(block_stack)); + block_ok_stack_end = block_ok_stack + BLOCK_STACK_DEPTH; cur_block = block_stack; + block_ok = block_ok_stack; + *block_ok = 1; init_dynamic_string(&ds_res, "", 0, 65536); parse_args(argc, argv); init_var_hash(); @@ -1861,7 +1875,7 @@ int main(int argc, char** argv) int current_line_inc = 1, processed = 0; if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND) get_query_type(q); - if (block_ok) + if (*block_ok) { processed = 1; switch (q->type) { diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result new file mode 100644 index 00000000000..21852771c46 --- /dev/null +++ b/mysql-test/r/multi_update.result @@ -0,0 +1,24 @@ +id1 t +1 3 +2 2 +3 1 +id2 t +3 3 +3 2 +3 1 +2 3 +2 2 +2 1 +1 3 +1 2 +1 1 +id3 t +3 3 +3 2 +3 1 +2 3 +2 2 +2 1 +1 3 +1 2 +1 1 diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test new file mode 100644 index 00000000000..c9c705b2e64 --- /dev/null +++ b/mysql-test/t/multi_update.test @@ -0,0 +1,25 @@ +drop table if exists t1,t2,t3; +create table t1(id1 int not null auto_increment primary key, t char(12)); +create table t2(id2 int not null, t char(12), index(id2)); +create table t3(id3 int not null, t char(12), index(id3)); +let $1 = 3; +while ($1) + { + let $2 = 3; + eval insert into t1(t) values ('$1'); + while ($2) + { + eval insert into t2(id2,t) values ($1,'$2'); + eval insert into t3(id3,t) values ($1,'$2'); + dec $2; + } + dec $1; + } + +select * from t1; +select * from t2; +select * from t3; + +delete from t1,t2 where t1.id = t2.id and t1.id = 3; +select * from t1; +select * from t2; |