mirror of https://github.com/citusdata/citus.git
Support foreign table joins as well
parent
7e9204eba9
commit
4b6611460a
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue