From 3d88a72f76d2b24969974fb16eee603e838f4556 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Tue, 5 Dec 2017 03:25:34 +0300 Subject: [PATCH] SQL: fix subquery not a derived table [#365 bug 9] Tests affected (forced mode): main.ps \ main.user_var \ main.myisam_explain_non_select_all \ main.opt_tvc \ main.subselect \ main.subselect_no_exists_to_in \ main.derived \ main.derived_opt \ main.update --- mysql-test/suite/versioning/r/select.result | 4 ++++ mysql-test/suite/versioning/t/select.test | 4 ++++ sql/sql_select.cc | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/versioning/r/select.result b/mysql-test/suite/versioning/r/select.result index 3b0d4b74286..ef2755460c3 100644 --- a/mysql-test/suite/versioning/r/select.result +++ b/mysql-test/suite/versioning/r/select.result @@ -298,6 +298,10 @@ create or replace table t2 (b int) with system versioning; select * from t1 where exists (select 1 from t2 where t2.b = t1.a and t2.b = t1.a); a +### Issue #365, bug 9 (not a derived subquery) +create or replace table t1 (x int) with system versioning; +select t1.x in (select x from t1) a from t1, (select x from t1) b; +a drop view v1; drop table t1, t2; call innodb_verify_vtq(28); diff --git a/mysql-test/suite/versioning/t/select.test b/mysql-test/suite/versioning/t/select.test index 51b10d420e8..8f8698bbfcc 100644 --- a/mysql-test/suite/versioning/t/select.test +++ b/mysql-test/suite/versioning/t/select.test @@ -195,6 +195,10 @@ create or replace table t2 (b int) with system versioning; select * from t1 where exists (select 1 from t2 where t2.b = t1.a and t2.b = t1.a); +--echo ### Issue #365, bug 9 (not a derived subquery) +create or replace table t1 (x int) with system versioning; +select t1.x in (select x from t1) a from t1, (select x from t1) b; + drop view v1; drop table t1, t2; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 76e8eb4f175..67f41797a12 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -791,14 +791,14 @@ int vers_setup_select(THD *thd, TABLE_LIST *tables, COND **where_expr, if (!vers_conditions && outer_slex && slex->vers_import_outer) { TABLE_LIST* derived= slex->master_unit()->derived; - while (outer_slex && (!derived->vers_conditions || derived->vers_conditions.from_inner)) + // inner SELECT may not be a derived table (derived == NULL) + while (derived && outer_slex && (!derived->vers_conditions || derived->vers_conditions.from_inner)) { derived= outer_slex->master_unit()->derived; outer_slex= outer_slex->next_select_in_list(); } - if (outer_slex) + if (derived && outer_slex && !derived->vers_conditions.from_inner) { - DBUG_ASSERT(derived); DBUG_ASSERT(derived->vers_conditions); vers_conditions= derived->vers_conditions; }