Fix nested select query with union bug

pull/4951/head
Ahmet Gedemenli 2021-05-04 16:37:33 +03:00
parent d0ba122061
commit 2e0bb5c0c8
3 changed files with 136 additions and 2 deletions

View File

@ -2006,7 +2006,7 @@ RelationRestrictionForRelation(RangeTblEntry *rangeTableEntry,
List *filteredRelationRestrictionList =
filteredRelationRestrictionContext->relationRestrictionList;
if (list_length(filteredRelationRestrictionList) != 1)
if (list_length(filteredRelationRestrictionList) < 1)
{
return NULL;
}

View File

@ -470,7 +470,111 @@ DEBUG: Wrapping relation "local_table" "u2" to a subquery
DEBUG: generating subplan XXX_1 for subquery SELECT value FROM push_down_filters.local_table u2 WHERE false
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM ((push_down_filters.distributed_table u1 JOIN (SELECT NULL::integer AS key, u2_1.value, NULL::timestamp with time zone AS "time" FROM (SELECT intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(value integer)) u2_1) u2 USING (value)) JOIN LATERAL (SELECT distributed_table.value, random() AS random FROM push_down_filters.distributed_table WHERE (u2.value OPERATOR(pg_catalog.=) 15)) u3 USING (value)) WHERE ((u2.value OPERATOR(pg_catalog.>) 2) AND false)
ERROR: complex joins are only supported when all distributed tables are co-located and joined on their distribution columns
-- Test Nested Select Query with Union, with Reference Tables
CREATE TABLE tbl1(a int);
CREATE TABLE tbl2(b int);
INSERT INTO tbl1 VALUES (1);
INSERT INTO tbl2 VALUES (1);
SELECT create_reference_table('tbl1');
NOTICE: Copying data from local table...
DEBUG: Copied 1 rows
NOTICE: copying the data has completed
DETAIL: The local data in the table is no longer visible, but is still on disk.
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$push_down_filters.tbl1$$)
create_reference_table
---------------------------------------------------------------------
(1 row)
SELECT MAX(x) FROM (
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE b > 0) AS s1 WHERE true
UNION ALL
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE b > 0) AS s1 WHERE false
) as res;
DEBUG: Wrapping relation "tbl2" to a subquery
DEBUG: generating subplan XXX_1 for subquery SELECT b FROM push_down_filters.tbl2 WHERE (b OPERATOR(pg_catalog.>) 0)
DEBUG: Wrapping relation "tbl2" to a subquery
DEBUG: generating subplan XXX_2 for subquery SELECT b FROM push_down_filters.tbl2 WHERE false
DEBUG: generating subplan XXX_3 for subquery SELECT 1 AS x FROM (SELECT 1 FROM push_down_filters.tbl1, (SELECT tbl2_1.b FROM (SELECT intermediate_result.b FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(b integer)) tbl2_1) tbl2 WHERE (tbl2.b OPERATOR(pg_catalog.>) 0)) s1("?column?") WHERE true UNION ALL SELECT 1 AS x FROM (SELECT 1 FROM push_down_filters.tbl1, (SELECT tbl2_1.b FROM (SELECT intermediate_result.b FROM read_intermediate_result('XXX_2'::text, 'binary'::citus_copy_format) intermediate_result(b integer)) tbl2_1) tbl2 WHERE (tbl2.b OPERATOR(pg_catalog.>) 0)) s1("?column?") WHERE false
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT max(x) AS max FROM (SELECT intermediate_result.x FROM read_intermediate_result('XXX_3'::text, 'binary'::citus_copy_format) intermediate_result(x integer)) res
max
---------------------------------------------------------------------
1
(1 row)
DROP TABLE tbl1, tbl2;
CREATE table tbl2(a int, b int, d int);
CREATE table tbl1(a int, b int, c int);
INSERT INTO tbl1 VALUES (1,1,1);
INSERT INTO tbl2 VALUES (1,1,1);
SELECT create_distributed_table('tbl1', 'a');
NOTICE: Copying data from local table...
DEBUG: Copied 1 rows
NOTICE: copying the data has completed
DETAIL: The local data in the table is no longer visible, but is still on disk.
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$push_down_filters.tbl1$$)
create_distributed_table
---------------------------------------------------------------------
(1 row)
SELECT MAX(x) FROM (
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE true
UNION ALL
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE false
) as res;
DEBUG: Wrapping relation "tbl2" to a subquery
DEBUG: generating subplan XXX_1 for subquery SELECT b FROM push_down_filters.tbl2 WHERE (b OPERATOR(pg_catalog.>) 0)
DEBUG: Wrapping relation "tbl2" to a subquery
DEBUG: generating subplan XXX_2 for subquery SELECT b FROM push_down_filters.tbl2 WHERE false
DEBUG: generating subplan XXX_3 for subquery SELECT 1 AS x FROM (SELECT 1 FROM push_down_filters.tbl1, (SELECT NULL::integer AS a, tbl2_1.b, NULL::integer AS d FROM (SELECT intermediate_result.b FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(b integer)) tbl2_1) tbl2 WHERE (tbl2.b OPERATOR(pg_catalog.>) 0)) s1("?column?") WHERE true
DEBUG: generating subplan XXX_4 for subquery SELECT 1 AS x FROM (SELECT 1 FROM push_down_filters.tbl1, (SELECT NULL::integer AS a, tbl2_1.b, NULL::integer AS d FROM (SELECT intermediate_result.b FROM read_intermediate_result('XXX_2'::text, 'binary'::citus_copy_format) intermediate_result(b integer)) tbl2_1) tbl2 WHERE (tbl2.b OPERATOR(pg_catalog.>) 0)) s1("?column?") WHERE false
DEBUG: generating subplan XXX_5 for subquery SELECT intermediate_result.x FROM read_intermediate_result('XXX_3'::text, 'binary'::citus_copy_format) intermediate_result(x integer) UNION ALL SELECT intermediate_result.x FROM read_intermediate_result('XXX_4'::text, 'binary'::citus_copy_format) intermediate_result(x integer)
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT max(x) AS max FROM (SELECT intermediate_result.x FROM read_intermediate_result('XXX_5'::text, 'binary'::citus_copy_format) intermediate_result(x integer)) res
max
---------------------------------------------------------------------
1
(1 row)
SELECT undistribute_table('tbl1');
NOTICE: creating a new table for push_down_filters.tbl1
NOTICE: moving the data of push_down_filters.tbl1
NOTICE: dropping the old push_down_filters.tbl1
CONTEXT: SQL statement "DROP TABLE push_down_filters.tbl1 CASCADE"
NOTICE: renaming the new table to push_down_filters.tbl1
undistribute_table
---------------------------------------------------------------------
(1 row)
SELECT create_reference_table('tbl1');
NOTICE: Copying data from local table...
DEBUG: Copied 1 rows
NOTICE: copying the data has completed
DETAIL: The local data in the table is no longer visible, but is still on disk.
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$push_down_filters.tbl1$$)
create_reference_table
---------------------------------------------------------------------
(1 row)
SELECT MAX(x) FROM (
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE true
UNION ALL
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE false
) as res;
DEBUG: Wrapping relation "tbl2" to a subquery
DEBUG: generating subplan XXX_1 for subquery SELECT b FROM push_down_filters.tbl2 WHERE (b OPERATOR(pg_catalog.>) 0)
DEBUG: Wrapping relation "tbl2" to a subquery
DEBUG: generating subplan XXX_2 for subquery SELECT b FROM push_down_filters.tbl2 WHERE false
DEBUG: generating subplan XXX_3 for subquery SELECT 1 AS x FROM (SELECT 1 FROM push_down_filters.tbl1, (SELECT NULL::integer AS a, tbl2_1.b, NULL::integer AS d FROM (SELECT intermediate_result.b FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(b integer)) tbl2_1) tbl2 WHERE (tbl2.b OPERATOR(pg_catalog.>) 0)) s1("?column?") WHERE true UNION ALL SELECT 1 AS x FROM (SELECT 1 FROM push_down_filters.tbl1, (SELECT NULL::integer AS a, tbl2_1.b, NULL::integer AS d FROM (SELECT intermediate_result.b FROM read_intermediate_result('XXX_2'::text, 'binary'::citus_copy_format) intermediate_result(b integer)) tbl2_1) tbl2 WHERE (tbl2.b OPERATOR(pg_catalog.>) 0)) s1("?column?") WHERE false
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT max(x) AS max FROM (SELECT intermediate_result.x FROM read_intermediate_result('XXX_3'::text, 'binary'::citus_copy_format) intermediate_result(x integer)) res
max
---------------------------------------------------------------------
1
(1 row)
\set VERBOSITY terse
RESET client_min_messages;
DROP SCHEMA push_down_filters CASCADE;
NOTICE: drop cascades to 5 other objects
NOTICE: drop cascades to 7 other objects

View File

@ -260,6 +260,36 @@ JOIN LATERAL
WHERE (u2.value > 2
AND FALSE);
-- Test Nested Select Query with Union, with Reference Tables
CREATE TABLE tbl1(a int);
CREATE TABLE tbl2(b int);
INSERT INTO tbl1 VALUES (1);
INSERT INTO tbl2 VALUES (1);
SELECT create_reference_table('tbl1');
SELECT MAX(x) FROM (
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE b > 0) AS s1 WHERE true
UNION ALL
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE b > 0) AS s1 WHERE false
) as res;
DROP TABLE tbl1, tbl2;
CREATE table tbl2(a int, b int, d int);
CREATE table tbl1(a int, b int, c int);
INSERT INTO tbl1 VALUES (1,1,1);
INSERT INTO tbl2 VALUES (1,1,1);
SELECT create_distributed_table('tbl1', 'a');
SELECT MAX(x) FROM (
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE true
UNION ALL
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE false
) as res;
SELECT undistribute_table('tbl1');
SELECT create_reference_table('tbl1');
SELECT MAX(x) FROM (
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE true
UNION ALL
SELECT 1 as x FROM (SELECT 1 FROM tbl1, tbl2 WHERE tbl2.b > 0) AS s1 WHERE false
) as res;
\set VERBOSITY terse
RESET client_min_messages;
DROP SCHEMA push_down_filters CASCADE;