Commit 01c9d1c9 authored by Aleksey Midenkov's avatar Aleksey Midenkov

SQL: SP idempotency fix

Fixes #52
parent 44e581eb
...@@ -93,7 +93,45 @@ A x y x y ...@@ -93,7 +93,45 @@ A x y x y
1 5 15 5 15 1 5 15 5 15
1 6 16 6 16 1 6 16 6 16
1 7 17 7 17 1 7 17 7 17
call test_01('bigint unsigned', 'innodb', 'commit_ts(sys_end)');
A x y x y
1 1 11 1 11
1 2 12 2 12
1 3 13 3 13
1 4 14 4 14
1 5 15 5 15
1 6 16 6 16
1 7 17 7 17
1 8 18 8 18
1 9 19 9 19
A x y x y
1 1 11 1 11
1 3 13 3 13
1 4 14 4 14
1 5 15 5 15
1 6 16 6 16
1 7 17 7 17
1 8 18 8 18
1 9 19 9 19
A x y x y
1 1 11 1 11
1 3 13 3 13
1 4 14 4 14
1 5 15 5 15
1 6 16 6 16
1 7 17 7 17
call verify_vtq; call verify_vtq;
No A B C D No A B C D
1 1 1 1 1
2 1 1 1 1
3 1 1 1 1
4 1 1 1 1
5 1 1 1 1
6 1 1 1 1
7 1 1 1 1
8 1 1 1 1
9 1 1 1 1
10 1 1 1 1
11 1 1 1 1
drop procedure test_01; drop procedure test_01;
drop procedure verify_vtq; drop procedure verify_vtq;
...@@ -60,8 +60,7 @@ end~~ ...@@ -60,8 +60,7 @@ end~~
delimiter ;~~ delimiter ;~~
call test_01('timestamp(6)', 'myisam', 'sys_end'); call test_01('timestamp(6)', 'myisam', 'sys_end');
# Issue #52 call test_01('bigint unsigned', 'innodb', 'commit_ts(sys_end)');
# call test_01('bigint unsigned', 'innodb', 'commit_ts(sys_end)');
call verify_vtq; call verify_vtq;
drop procedure test_01; drop procedure test_01;
......
...@@ -701,44 +701,54 @@ setup_for_system_time(THD *thd, TABLE_LIST *tables, COND **where_expr, SELECT_LE ...@@ -701,44 +701,54 @@ setup_for_system_time(THD *thd, TABLE_LIST *tables, COND **where_expr, SELECT_LE
if (select_lex->saved_where) if (select_lex->saved_where)
{ {
DBUG_ASSERT(thd->stmt_arena->is_sp_execute()); DBUG_ASSERT(thd->stmt_arena->is_sp_execute());
*where_expr= select_lex->saved_where; /* 2. this copy_andor_structure() is also required by the same reason */
*where_expr= select_lex->saved_where->copy_andor_structure(thd);
} }
else if (thd->stmt_arena->is_sp_execute()) else if (thd->stmt_arena->is_sp_execute())
{ {
if (thd->stmt_arena->is_stmt_execute()) // SP executed second time (STMT_EXECUTED) if (thd->stmt_arena->is_stmt_execute()) // SP executed second time (STMT_EXECUTED)
*where_expr= 0; *where_expr= 0;
else if (*where_expr) // SP executed first time (STMT_INITIALIZED_FOR_SP) else if (*where_expr) // SP executed first time (STMT_INITIALIZED_FOR_SP)
/* copy_andor_structure() is required since this andor tree /* 1. copy_andor_structure() is required since this andor tree
is modified later (and on shorter arena) */ is modified later (and on shorter arena) */
select_lex->saved_where= (*where_expr)->copy_andor_structure(thd); select_lex->saved_where= (*where_expr)->copy_andor_structure(thd);
} }
for (table= tables; table; table= table->next_local) /* We have to save also non-versioned on_expr since we may have
conjuction of versioned + non-versioned */
if (thd->stmt_arena->is_sp_execute())
{ {
if (table->table && table->table->versioned()) for (table= tables; table; table= table->next_local)
{ {
COND** dst_cond= where_expr; if (!table->table)
continue;
if (table->saved_on_expr) // same logic as saved_where if (table->saved_on_expr) // same logic as saved_where
{ {
DBUG_ASSERT(thd->stmt_arena->is_sp_execute());
if (table->on_expr) if (table->on_expr)
{ table->on_expr= table->saved_on_expr->copy_andor_structure(thd);
table->on_expr= table->saved_on_expr;
dst_cond= &table->on_expr;
}
else else
{
// on_expr was moved to WHERE (see below: Add ON expression to the WHERE) // on_expr was moved to WHERE (see below: Add ON expression to the WHERE)
*dst_cond= and_items(thd, *where_expr= and_items(thd,
*where_expr, *where_expr,
table->saved_on_expr); table->saved_on_expr->copy_andor_structure(thd));
} }
else if (table->on_expr &&
thd->stmt_arena->state == Query_arena::STMT_INITIALIZED_FOR_SP)
{
table->saved_on_expr= table->on_expr->copy_andor_structure(thd);
} }
else if (table->on_expr) }
}
for (table= tables; table; table= table->next_local)
{
if (table->table && table->table->versioned())
{
COND** dst_cond= where_expr;
if (table->on_expr)
{ {
dst_cond= &table->on_expr; dst_cond= &table->on_expr;
if (thd->stmt_arena->state == Query_arena::STMT_INITIALIZED_FOR_SP)
table->saved_on_expr= table->on_expr->copy_andor_structure(thd);
} }
Field *fstart= table->table->vers_start_field(); Field *fstart= table->table->vers_start_field();
......
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