diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2019-12-05 23:45:57 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2019-12-05 23:53:07 +0300 |
commit | be92dce61353952da593b32f3f52b81b89ee7219 (patch) | |
tree | 8457dde0f503e2bf2eb64d5154fddf34c5be4d24 | |
parent | 1fbd9bb2c5d134209ac2aae073f7a78797c1c04e (diff) | |
download | mariadb-git-be92dce61353952da593b32f3f52b81b89ee7219.tar.gz |
MDEV-21234 Server crashes in in setup_on_expr upon 3rd execution of SP
Versioned conditions in on_expr can not be rebuilt at optimization
stage on non-conventional arena.
-rw-r--r-- | mysql-test/suite/versioning/r/select.result | 24 | ||||
-rw-r--r-- | mysql-test/suite/versioning/t/select.test | 29 | ||||
-rw-r--r-- | sql/sql_select.cc | 15 |
3 files changed, 67 insertions, 1 deletions
diff --git a/mysql-test/suite/versioning/r/select.result b/mysql-test/suite/versioning/r/select.result index 9b6738d4eb9..f1bdcccce59 100644 --- a/mysql-test/suite/versioning/r/select.result +++ b/mysql-test/suite/versioning/r/select.result @@ -586,6 +586,30 @@ call p; i drop procedure p; drop table t1; +# +# MDEV-21234 Server crashes in in setup_on_expr upon 3rd execution of SP +# +create table t1 (a varchar(8)); +insert into t1 values ('foo'),('bar'); +create table t2 (b date); +create procedure pr() insert into t2 select * from t1; +call pr; +ERROR 22007: Incorrect date value: 'foo' for column `test`.`t2`.`b` at row 1 +prepare stmt from 'insert into t2 select * from t1'; +execute stmt; +ERROR 22007: Incorrect date value: 'foo' for column `test`.`t2`.`b` at row 1 +alter table t1 add system versioning; +call pr; +ERROR 22007: Incorrect date value: 'foo' for column `test`.`t2`.`b` at row 1 +call pr; +ERROR 22007: Incorrect date value: 'foo' for column `test`.`t2`.`b` at row 1 +execute stmt; +ERROR 22007: Incorrect date value: 'foo' for column `test`.`t2`.`b` at row 1 +execute stmt; +ERROR 22007: Incorrect date value: 'foo' for column `test`.`t2`.`b` at row 1 +drop prepare stmt; +drop procedure pr; +drop table t1, t2; call verify_trt_dummy(34); No A B C D 1 1 1 1 1 diff --git a/mysql-test/suite/versioning/t/select.test b/mysql-test/suite/versioning/t/select.test index 3fbeaf7578f..069fe7a9a8d 100644 --- a/mysql-test/suite/versioning/t/select.test +++ b/mysql-test/suite/versioning/t/select.test @@ -392,6 +392,35 @@ call p; drop procedure p; drop table t1; +--echo # +--echo # MDEV-21234 Server crashes in in setup_on_expr upon 3rd execution of SP +--echo # +create table t1 (a varchar(8)); +insert into t1 values ('foo'),('bar'); +create table t2 (b date); + +create procedure pr() insert into t2 select * from t1; +--error ER_TRUNCATED_WRONG_VALUE +call pr; +prepare stmt from 'insert into t2 select * from t1'; +--error ER_TRUNCATED_WRONG_VALUE +execute stmt; +alter table t1 add system versioning; +--error ER_TRUNCATED_WRONG_VALUE +call pr; +--error ER_TRUNCATED_WRONG_VALUE +call pr; +--error ER_TRUNCATED_WRONG_VALUE +execute stmt; +--error ER_TRUNCATED_WRONG_VALUE +execute stmt; +drop prepare stmt; + +# cleanup +drop procedure pr; +drop table t1, t2; + + call verify_trt_dummy(34); -- source suite/versioning/common_finish.inc diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4c83c1d84e5..275c46141cd 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1713,7 +1713,20 @@ JOIN::optimize_inner() } } - conds= optimize_cond(this, conds, join_list, FALSE, + bool ignore_on_expr= false; + /* + PS/SP note: on_expr of versioned table can not be reallocated + (see build_equal_items() below) because it can be not rebuilt + at second invocation. + */ + if (!thd->stmt_arena->is_conventional() && thd->mem_root != thd->stmt_arena->mem_root) + for (TABLE_LIST *tbl= tables_list; tbl; tbl= tbl->next_local) + if (tbl->table && tbl->on_expr && tbl->table->versioned()) + { + ignore_on_expr= true; + break; + } + conds= optimize_cond(this, conds, join_list, ignore_on_expr, &cond_value, &cond_equal, OPT_LINK_EQUAL_FIELDS); if (thd->is_error()) |