From 4b6611460a830c1d34b643d1a4c3bd79e09e9eeb Mon Sep 17 00:00:00 2001 From: Sait Talha Nisanci Date: Wed, 2 Dec 2020 14:31:11 +0300 Subject: [PATCH] Support foreign table joins as well --- .../distributed/planner/recursive_planning.c | 3 ++- .../regress/expected/local_table_join.out | 22 ++++++++++++++++++- src/test/regress/sql/local_table_join.sql | 15 +++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/backend/distributed/planner/recursive_planning.c b/src/backend/distributed/planner/recursive_planning.c index 083eef214..5f85df5cc 100644 --- a/src/backend/distributed/planner/recursive_planning.c +++ b/src/backend/distributed/planner/recursive_planning.c @@ -1522,7 +1522,8 @@ IsRecursivelyPlannableRelation(RangeTblEntry *rangeTableEntry) } return rangeTableEntry->relkind == RELKIND_PARTITIONED_TABLE || rangeTableEntry->relkind == RELKIND_RELATION || - rangeTableEntry->relkind == RELKIND_MATVIEW; + rangeTableEntry->relkind == RELKIND_MATVIEW || + rangeTableEntry->relkind == RELKIND_FOREIGN_TABLE; } diff --git a/src/test/regress/expected/local_table_join.out b/src/test/regress/expected/local_table_join.out index ce796af90..4f9ae31c8 100644 --- a/src/test/regress/expected/local_table_join.out +++ b/src/test/regress/expected/local_table_join.out @@ -49,6 +49,16 @@ SELECT create_distributed_table('distributed_table_composite', 'key'); (1 row) +CREATE FUNCTION fake_fdw_handler() +RETURNS fdw_handler +AS 'citus' +LANGUAGE C STRICT; +CREATE FOREIGN DATA WRAPPER fake_fdw HANDLER fake_fdw_handler; +CREATE SERVER fake_fdw_server FOREIGN DATA WRAPPER fake_fdw; +CREATE FOREIGN TABLE foreign_table ( + key int, + value text +) SERVER fake_fdw_server OPTIONS (encoding 'utf-8', compression 'true'); CREATE MATERIALIZED VIEW mv1 AS SELECT * FROM postgres_table; CREATE MATERIALIZED VIEW mv2 AS SELECT * FROM distributed_table; SET client_min_messages TO DEBUG1; @@ -234,6 +244,16 @@ DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS c 0 (1 row) +-- foreign tables should work too +SELECT count(*) FROM foreign_table JOIN distributed_table USING(key); +DEBUG: Wrapping local relation "foreign_table" to a subquery: SELECT key, NULL::text AS value FROM local_table_join.foreign_table WHERE true OFFSET 0 +DEBUG: generating subplan XXX_1 for subquery SELECT key, NULL::text AS value FROM local_table_join.foreign_table WHERE true OFFSET 0 +DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM ((SELECT intermediate_result.key, intermediate_result.value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text)) foreign_table JOIN local_table_join.distributed_table USING (key)) + count +--------------------------------------------------------------------- + 0 +(1 row) + -- partitioned tables should work as well SELECT count(*) FROM distributed_partitioned_table JOIN postgres_table USING(key); DEBUG: Wrapping local relation "postgres_table" to a subquery: SELECT key, NULL::text AS value, NULL::jsonb AS value_2 FROM local_table_join.postgres_table WHERE true OFFSET 0 @@ -1083,4 +1103,4 @@ SELECT master_remove_node('localhost', :master_port); \set VERBOSITY terse DROP SCHEMA local_table_join CASCADE; -NOTICE: drop cascades to 11 other objects +NOTICE: drop cascades to 15 other objects diff --git a/src/test/regress/sql/local_table_join.sql b/src/test/regress/sql/local_table_join.sql index 5d38db1ea..1b5593061 100644 --- a/src/test/regress/sql/local_table_join.sql +++ b/src/test/regress/sql/local_table_join.sql @@ -26,6 +26,18 @@ CREATE TABLE local_partitioned_table_2 PARTITION OF local_partitioned_table FOR CREATE TABLE distributed_table_composite (key int, value text, value_2 jsonb, primary key (key, value)); SELECT create_distributed_table('distributed_table_composite', 'key'); +CREATE FUNCTION fake_fdw_handler() +RETURNS fdw_handler +AS 'citus' +LANGUAGE C STRICT; +CREATE FOREIGN DATA WRAPPER fake_fdw HANDLER fake_fdw_handler; +CREATE SERVER fake_fdw_server FOREIGN DATA WRAPPER fake_fdw; + +CREATE FOREIGN TABLE foreign_table ( + key int, + value text +) SERVER fake_fdw_server OPTIONS (encoding 'utf-8', compression 'true'); + CREATE MATERIALIZED VIEW mv1 AS SELECT * FROM postgres_table; CREATE MATERIALIZED VIEW mv2 AS SELECT * FROM distributed_table; @@ -76,6 +88,9 @@ SELECT count(*) FROM (SELECT * FROM distributed_table) d1 JOIN mv2 USING(key); SELECT count(*) FROM reference_table JOIN mv2 USING(key); SELECT count(*) FROM distributed_table JOIN mv2 USING(key) JOIN reference_table USING (key); +-- foreign tables should work too +SELECT count(*) FROM foreign_table JOIN distributed_table USING(key); + -- partitioned tables should work as well SELECT count(*) FROM distributed_partitioned_table JOIN postgres_table USING(key); SELECT count(*) FROM distributed_partitioned_table JOIN postgres_table USING(key) WHERE distributed_partitioned_table.key = 10;