From 7069071d7de774dcf28f73b6a968bcb730a12885 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Fri, 29 Dec 2017 12:28:37 +0300 Subject: [PATCH] MDEV-14786 Server crashes in Item_cond::transform on 2nd execution of SP querying from a view [fixes #436] --- mysql-test/suite/versioning/r/select_sp.result | 15 ++++++++++++++- mysql-test/suite/versioning/t/select_sp.test | 12 +++++++++++- sql/sql_select.cc | 4 ++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/versioning/r/select_sp.result b/mysql-test/suite/versioning/r/select_sp.result index 3534f92bdbc..f7aef65c90b 100644 --- a/mysql-test/suite/versioning/r/select_sp.result +++ b/mysql-test/suite/versioning/r/select_sp.result @@ -232,6 +232,19 @@ called_bad called_bad called_bad # bad() is good. +# MDEV-14786 Server crashes in Item_cond::transform on 2nd execution of SP querying from a view [#436] +create or replace table t1 (called_bad int) with system versioning; +create or replace view v1 as select called_bad from t1 where called_bad < 5; +create or replace procedure bad() select called_bad from v1; +called_bad +called_bad +called_bad +called_bad +called_bad +called_bad +called_bad +called_bad +# bad() is good. # wildcard expansion on hidden fields. create or replace table t1( A int @@ -255,7 +268,7 @@ create or replace table t1 (a int) with system versioning; create or replace table t2 (a int) with system versioning; insert into t1 values(1); insert into t2 values(1); -create view v1 as select * from t2 inner join t1 using (a); +create or replace view v1 as select * from t2 inner join t1 using (a); select * from v1; a 1 diff --git a/mysql-test/suite/versioning/t/select_sp.test b/mysql-test/suite/versioning/t/select_sp.test index c5c04001c73..95ad1ea33ad 100644 --- a/mysql-test/suite/versioning/t/select_sp.test +++ b/mysql-test/suite/versioning/t/select_sp.test @@ -125,6 +125,16 @@ drop procedure bad; --enable_query_log --echo # bad() is good. +--echo # MDEV-14786 Server crashes in Item_cond::transform on 2nd execution of SP querying from a view [#436] +create or replace table t1 (called_bad int) with system versioning; +create or replace view v1 as select called_bad from t1 where called_bad < 5; +create or replace procedure bad() select called_bad from v1; +--disable_query_log +call bad; call bad; call bad; call bad; call bad; call bad; call bad; call bad; +drop procedure bad; +--enable_query_log +--echo # bad() is good. + --echo # wildcard expansion on hidden fields. create or replace table t1( A int @@ -149,7 +159,7 @@ create or replace table t1 (a int) with system versioning; create or replace table t2 (a int) with system versioning; insert into t1 values(1); insert into t2 values(1); -create view v1 as select * from t2 inner join t1 using (a); +create or replace view v1 as select * from t2 inner join t1 using (a); select * from v1; drop view v1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b4ff558f53d..cf9298d3700 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -14904,6 +14904,8 @@ static COND* substitute_for_best_equal_field(THD *thd, JOIN_TAB *context_tab, Item_equal *item_equal; COND *org_cond= cond; // Return this in case of fatal error + Query_arena_stmt on_stmt_arena(thd); + if (cond->type() == Item::COND_ITEM) { List *cond_list= ((Item_cond*) cond)->argument_list(); @@ -16025,6 +16027,8 @@ optimize_cond(JOIN *join, COND *conds, THD *thd= join->thd; DBUG_ENTER("optimize_cond"); + Query_arena_stmt on_stmt_arena(thd); + if (!conds) { *cond_value= Item::COND_TRUE;