From aa4d1bedfcb2ad31a7b7db80b54eb9fc7bfd7b37 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Thu, 21 Dec 2017 14:59:46 +0300 Subject: [PATCH] MDEV-14689 Server crashes in find_field_in_tables on 2nd execution of PS with versioned table and view SQL: wrong usage of Item::transform() --- mysql-test/suite/versioning/r/view.result | 9 +++++++++ mysql-test/suite/versioning/t/view.test | 9 +++++++++ sql/sql_select.cc | 24 +++++++++++++++++------ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/mysql-test/suite/versioning/r/view.result b/mysql-test/suite/versioning/r/view.result index 128c849b18c..9dacb632238 100644 --- a/mysql-test/suite/versioning/r/view.result +++ b/mysql-test/suite/versioning/r/view.result @@ -107,5 +107,14 @@ create or replace view vt1 as select * from t1 union select * from t2; select * from vt1; a 1 +# MDEV-14689 crash on second PS execute +create or replace table t1 (a int); +create or replace view v1 as select * from t1; +create or replace table t2 (b int) with system versioning; +prepare stmt from 'select a from v1 inner join t2 group by a order by a'; +execute stmt; +a +execute stmt; +a drop database test; create database test; diff --git a/mysql-test/suite/versioning/t/view.test b/mysql-test/suite/versioning/t/view.test index e2ad96e70cc..e06d3aac477 100644 --- a/mysql-test/suite/versioning/t/view.test +++ b/mysql-test/suite/versioning/t/view.test @@ -89,5 +89,14 @@ create or replace table t2 (a int); create or replace view vt1 as select * from t1 union select * from t2; select * from vt1; +--echo # MDEV-14689 crash on second PS execute +create or replace table t1 (a int); +create or replace view v1 as select * from t1; +create or replace table t2 (b int) with system versioning; +prepare stmt from 'select a from v1 inner join t2 group by a order by a'; +execute stmt; +execute stmt; + + drop database test; create database test; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b65131fb9c9..b48006aeed1 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -700,24 +700,36 @@ void JOIN::vers_check_items() if (conds) { - conds= conds->transform(thd, transformer, NULL); + Item *tmp = conds->transform(thd, transformer, NULL); + if (conds != tmp) + conds= tmp; } for (ORDER *ord= order; ord; ord= ord->next) { - ord->item_ptr= (*ord->item)->transform(thd, transformer, NULL); - *ord->item= ord->item_ptr; + Item *tmp= (*ord->item)->transform(thd, transformer, NULL); + if (*ord->item != tmp) + { + ord->item_ptr= tmp; + *ord->item= ord->item_ptr; + } } for (ORDER *ord= group_list; ord; ord= ord->next) { - ord->item_ptr= (*ord->item)->transform(thd, transformer, NULL); - *ord->item= ord->item_ptr; + Item *tmp= (*ord->item)->transform(thd, transformer, NULL); + if (*ord->item != tmp) + { + ord->item_ptr= tmp; + *ord->item= ord->item_ptr; + } } if (having) { - having= having->transform(thd, transformer, NULL); + Item *tmp= having->transform(thd, transformer, NULL); + if (having != tmp) + having= tmp; } }