Skip to content

Commit

Permalink
MDEV-18896 Crash in convert_join_subqueries_to_semijoins
Browse files Browse the repository at this point in the history
If an IN-subquery is used in a table-less select the current code
should never consider it as candidate for semi-join optimizations.
Yet the function check_and_do_in_subquery_rewrites() improperly
checked the property "to be a table-less select". As a result
such select in IN subquery was used in INSERT .. SELECT then
the IN subquery by mistake was registered as a semi-join subquery
and convert_subq_to_sj() was called for it. However the code of
this function does not assume that the parent select of the subquery
could be a table-less select.
  • Loading branch information
igorbabaev committed Mar 15, 2019
1 parent 8024f8c commit 0dd12b4
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 1 deletion.
7 changes: 7 additions & 0 deletions mysql-test/r/subselect_sj.result
Original file line number Diff line number Diff line change
Expand Up @@ -3178,5 +3178,12 @@ EXECUTE stmt;
a
drop view v3;
drop table t1,t2,t3;
#
# MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
#
create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);
drop table t1,t2;
# End of 5.5 test
set optimizer_switch=@subselect_sj_tmp;
7 changes: 7 additions & 0 deletions mysql-test/r/subselect_sj_jcl6.result
Original file line number Diff line number Diff line change
Expand Up @@ -3192,6 +3192,13 @@ EXECUTE stmt;
a
drop view v3;
drop table t1,t2,t3;
#
# MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
#
create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);
drop table t1,t2;
# End of 5.5 test
set optimizer_switch=@subselect_sj_tmp;
#
Expand Down
10 changes: 10 additions & 0 deletions mysql-test/t/subselect_sj.test
Original file line number Diff line number Diff line change
Expand Up @@ -2869,6 +2869,16 @@ EXECUTE stmt;
drop view v3;
drop table t1,t2,t3;

--echo #
--echo # MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
--echo #

create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);

drop table t1,t2;

--echo # End of 5.5 test

# The following command must be the last one the file
Expand Down
2 changes: 1 addition & 1 deletion sql/opt_subselect.cc
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ int check_and_do_in_subquery_rewrites(JOIN *join)
select_lex->outer_select()->join && // 6
parent_unit->first_select()->leaf_tables.elements && // 7
!in_subs->has_strategy() && // 8
select_lex->outer_select()->leaf_tables.elements && // 9
select_lex->outer_select()->table_list.first && // 9
!((join->select_options | // 10
select_lex->outer_select()->join->select_options) // 10
& SELECT_STRAIGHT_JOIN)) // 10
Expand Down

0 comments on commit 0dd12b4

Please sign in to comment.