diff options
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/regress/expected/subselect.out | 79 | ||||
-rw-r--r-- | src/test/regress/sql/subselect.sql | 44 |
2 files changed, 123 insertions, 0 deletions
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index 48e1572afa4..28950eeafe8 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -779,6 +779,85 @@ select '1'::text in (select '1'::name union all select '1'::name); (1 row) -- +-- Test that we don't try to use a hashed subplan if the simplified +-- testexpr isn't of the right shape +-- +create temp table inner_text (c1 text, c2 text); +insert into inner_text values ('a', null); +insert into inner_text values ('123', '456'); +-- this fails by default, of course +select * from int8_tbl where q1 in (select c1 from inner_text); +ERROR: operator does not exist: bigint = text +LINE 1: select * from int8_tbl where q1 in (select c1 from inner_tex... + ^ +HINT: No operator matches the given name and argument types. You might need to add explicit type casts. +begin; +-- make an operator to allow it to succeed +create function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2'; +create operator = (procedure=bogus_int8_text_eq, leftarg=int8, rightarg=text); +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); + QUERY PLAN +-------------------------------- + Seq Scan on int8_tbl + Filter: (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on inner_text +(4 rows) + +select * from int8_tbl where q1 in (select c1 from inner_text); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- inlining of this function results in unusual number of hash clauses, +-- which we can still cope with +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2 and $1::text = $2'; +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); + QUERY PLAN +-------------------------------- + Seq Scan on int8_tbl + Filter: (hashed SubPlan 1) + SubPlan 1 + -> Seq Scan on inner_text +(4 rows) + +select * from int8_tbl where q1 in (select c1 from inner_text); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +-- inlining of this function causes LHS and RHS to be switched, +-- which we can't cope with, so hashing should be abandoned +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $2 = $1::text'; +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); + QUERY PLAN +-------------------------------------- + Seq Scan on int8_tbl + Filter: (SubPlan 1) + SubPlan 1 + -> Materialize + -> Seq Scan on inner_text +(5 rows) + +select * from int8_tbl where q1 in (select c1 from inner_text); + q1 | q2 +-----+------------------ + 123 | 456 + 123 | 4567890123456789 +(2 rows) + +rollback; -- to get rid of the bogus operator +-- -- Test case for planner bug with nested EXISTS handling -- select a.thousand from tenk1 a, tenk1 b diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index 9909ee28963..88d54ed3820 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -452,6 +452,50 @@ select 'foo'::text in (select 'bar'::name union all select 'bar'::name); select '1'::text in (select '1'::name union all select '1'::name); -- +-- Test that we don't try to use a hashed subplan if the simplified +-- testexpr isn't of the right shape +-- + +create temp table inner_text (c1 text, c2 text); +insert into inner_text values ('a', null); +insert into inner_text values ('123', '456'); + +-- this fails by default, of course +select * from int8_tbl where q1 in (select c1 from inner_text); + +begin; + +-- make an operator to allow it to succeed +create function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2'; + +create operator = (procedure=bogus_int8_text_eq, leftarg=int8, rightarg=text); + +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); +select * from int8_tbl where q1 in (select c1 from inner_text); + +-- inlining of this function results in unusual number of hash clauses, +-- which we can still cope with +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $1::text = $2 and $1::text = $2'; + +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); +select * from int8_tbl where q1 in (select c1 from inner_text); + +-- inlining of this function causes LHS and RHS to be switched, +-- which we can't cope with, so hashing should be abandoned +create or replace function bogus_int8_text_eq(int8, text) returns boolean +language sql as 'select $2 = $1::text'; + +explain (costs off) +select * from int8_tbl where q1 in (select c1 from inner_text); +select * from int8_tbl where q1 in (select c1 from inner_text); + +rollback; -- to get rid of the bogus operator + +-- -- Test case for planner bug with nested EXISTS handling -- select a.thousand from tenk1 a, tenk1 b |