From ce2cf855bfc0d9c8adb64f02a7b32ddd81f9948a Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Sat, 28 Apr 2018 14:18:02 +0300 Subject: [PATCH] MDEV-16043 Assertion thd->Item_change_list::is_empty() failed in mysql_parse upon SELECT from a view reading from a versioned table Lost restore_active_arena(). Using of Query_arena_stmt is suggested instead. --- mysql-test/suite/versioning/r/select2.result | 8 ++++++++ mysql-test/suite/versioning/t/select2.test | 8 ++++++++ sql/sql_select.cc | 8 +++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/versioning/r/select2.result b/mysql-test/suite/versioning/r/select2.result index 9267ab8c913..bb5c82ee444 100644 --- a/mysql-test/suite/versioning/r/select2.result +++ b/mysql-test/suite/versioning/r/select2.result @@ -332,5 +332,13 @@ select * from (select * from t1 for system_time all, t2 for system_time all) for ERROR HY000: Table `t` is not system-versioned select * from (t1 for system_time all join t2 for system_time all) for system_time all; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 +# MDEV-16043 Assertion thd->Item_change_list::is_empty() failed in mysql_parse upon SELECT from a view reading from a versioned table +create or replace table t1 (a int) with system versioning; +create or replace view v1 as select * from t1; +prepare stmt from "select * from t1 where exp( '20010609211642053929' )"; +execute stmt; +ERROR 22003: DOUBLE value is out of range in 'exp('20010609211642053929')' +select a from v1; +a drop view v1; drop table t1, t2; diff --git a/mysql-test/suite/versioning/t/select2.test b/mysql-test/suite/versioning/t/select2.test index 7caec784e27..d1b73fa799b 100644 --- a/mysql-test/suite/versioning/t/select2.test +++ b/mysql-test/suite/versioning/t/select2.test @@ -202,6 +202,14 @@ select * from (select * from t1 for system_time all, t2 for system_time all) for --error ER_PARSE_ERROR select * from (t1 for system_time all join t2 for system_time all) for system_time all; +--echo # MDEV-16043 Assertion thd->Item_change_list::is_empty() failed in mysql_parse upon SELECT from a view reading from a versioned table +create or replace table t1 (a int) with system versioning; +create or replace view v1 as select * from t1; +prepare stmt from "select * from t1 where exp( '20010609211642053929' )"; +--error ER_DATA_OUT_OF_RANGE +execute stmt; +select a from v1; + drop view v1; drop table t1, t2; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index f46f96bf47b..7bb019f30ff 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1602,10 +1602,12 @@ JOIN::optimize_inner() /* Convert all outer joins to inner joins if possible */ conds= simplify_joins(this, join_list, conds, TRUE, FALSE); - if (thd->is_error()) - DBUG_RETURN(1); - if (select_lex->save_leaf_tables(thd)) + if (thd->is_error() || select_lex->save_leaf_tables(thd)) + { + if (arena) + thd->restore_active_arena(arena, &backup); DBUG_RETURN(1); + } build_bitmap_for_nested_joins(join_list, 0); sel->prep_where= conds ? conds->copy_andor_structure(thd) : 0;