Skip to content

Commit aa4d1be

Browse files
authored
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()
1 parent 6dc75b5 commit aa4d1be

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

mysql-test/suite/versioning/r/view.result

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,5 +107,14 @@ create or replace view vt1 as select * from t1 union select * from t2;
107107
select * from vt1;
108108
a
109109
1
110+
# MDEV-14689 crash on second PS execute
111+
create or replace table t1 (a int);
112+
create or replace view v1 as select * from t1;
113+
create or replace table t2 (b int) with system versioning;
114+
prepare stmt from 'select a from v1 inner join t2 group by a order by a';
115+
execute stmt;
116+
a
117+
execute stmt;
118+
a
110119
drop database test;
111120
create database test;

mysql-test/suite/versioning/t/view.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,14 @@ create or replace table t2 (a int);
8989
create or replace view vt1 as select * from t1 union select * from t2;
9090
select * from vt1;
9191

92+
--echo # MDEV-14689 crash on second PS execute
93+
create or replace table t1 (a int);
94+
create or replace view v1 as select * from t1;
95+
create or replace table t2 (b int) with system versioning;
96+
prepare stmt from 'select a from v1 inner join t2 group by a order by a';
97+
execute stmt;
98+
execute stmt;
99+
100+
92101
drop database test;
93102
create database test;

sql/sql_select.cc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -700,24 +700,36 @@ void JOIN::vers_check_items()
700700

701701
if (conds)
702702
{
703-
conds= conds->transform(thd, transformer, NULL);
703+
Item *tmp = conds->transform(thd, transformer, NULL);
704+
if (conds != tmp)
705+
conds= tmp;
704706
}
705707

706708
for (ORDER *ord= order; ord; ord= ord->next)
707709
{
708-
ord->item_ptr= (*ord->item)->transform(thd, transformer, NULL);
709-
*ord->item= ord->item_ptr;
710+
Item *tmp= (*ord->item)->transform(thd, transformer, NULL);
711+
if (*ord->item != tmp)
712+
{
713+
ord->item_ptr= tmp;
714+
*ord->item= ord->item_ptr;
715+
}
710716
}
711717

712718
for (ORDER *ord= group_list; ord; ord= ord->next)
713719
{
714-
ord->item_ptr= (*ord->item)->transform(thd, transformer, NULL);
715-
*ord->item= ord->item_ptr;
720+
Item *tmp= (*ord->item)->transform(thd, transformer, NULL);
721+
if (*ord->item != tmp)
722+
{
723+
ord->item_ptr= tmp;
724+
*ord->item= ord->item_ptr;
725+
}
716726
}
717727

718728
if (having)
719729
{
720-
having= having->transform(thd, transformer, NULL);
730+
Item *tmp= having->transform(thd, transformer, NULL);
731+
if (having != tmp)
732+
having= tmp;
721733
}
722734
}
723735

0 commit comments

Comments
 (0)