mirror of https://github.com/citusdata/citus.git
PG16 compatibility - more test output fixes (#7112)
PG16 compatibility - part 9 Check out part 1pull/7122/head42d956888d
part 20d503dd5ac
part 3907d72e60d
part 47c6b4ce103
part 56056cb2c29
part 6b36c431abb
part 7ee3153fe50
part 82c50b5f7ff
This commit is in the series of PG16 compatibility commits. It makes some changes to our tests in order to be compatible with the following in PG16: - Fix multi_subquery_in_where_reference_clause test somehow PG got rid of the outer join (e.g., explain doesn't show outer joins), hence we can pushdown the subquery. Changing to users_reference_table - Fix unqualified column names for views in PG16 Relevant PG commit:47bb9db759
47bb9db75996232ea71fc1e1888ffb0e70579b54 - Fix global_cancel test Error wording and detail changed Relevant PG commit:2631ebab7b
2631ebab7b18bdc079fd86107c47d6104a6b3c6e - Fix local_table_join_test with lateral subquery Possible relevant PG commit:ae89129aa3
ae89129aa3555c263b8c3ccc4c0f1ef7e46201aa I removed the where clause and the limit count error was hit again. With the where clause the query unexpectedly works. - Fix test outputs Relevant PG commits: --1349d2790b
--f4c7c410ee
For multi_explain and multi_complex_count_distinct there were too many places touched so I just added an alternative test output. For the other tests I modified the problematic parts. More PG16 compatibility commits are coming soon ...
parent
2c50b5f7ff
commit
b2291374b4
|
@ -303,5 +303,8 @@ s/(NOTICE: issuing CREATE EXTENSION IF NOT EXISTS citus_columnar WITH SCHEMA p
|
|||
s/, password_required=false//g
|
||||
s/provide the file or change sslmode/provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode/g
|
||||
s/(:varcollid [0-9]+) :varlevelsup 0/\1 :varnullingrels (b) :varlevelsup 0/g
|
||||
s/table_name_for_view\.([_a-z0-9]+)(,| |$)/\1\2/g
|
||||
s/permission denied to terminate process/must be a superuser to terminate superuser process/g
|
||||
s/permission denied to cancel query/must be a superuser to cancel superuser query/g
|
||||
|
||||
#endif /* PG_VERSION_NUM < PG_VERSION_16 */
|
||||
|
|
|
@ -912,12 +912,12 @@ select run_command_on_workers($$SELECT count(*)=0 from citus_local_tables_mx.v10
|
|||
(2 rows)
|
||||
|
||||
CREATE TABLE loc_tb_2 (a int);
|
||||
CREATE VIEW v104 AS SELECT * from loc_tb_2;
|
||||
CREATE VIEW v104 AS SELECT * from loc_tb_2 table_name_for_view;
|
||||
SET client_min_messages TO DEBUG1;
|
||||
-- verify the CREATE command for the view is generated correctly
|
||||
ALTER TABLE loc_tb_2 ADD CONSTRAINT fkey_2 FOREIGN KEY (a) references ref_tb(a);
|
||||
DEBUG: executing "CREATE OR REPLACE VIEW citus_local_tables_mx.v104 (a) AS SELECT loc_tb_2.a
|
||||
FROM citus_local_tables_mx.loc_tb_2; ALTER VIEW citus_local_tables_mx.v104 OWNER TO postgres"
|
||||
DEBUG: executing "CREATE OR REPLACE VIEW citus_local_tables_mx.v104 (a) AS SELECT a
|
||||
FROM citus_local_tables_mx.loc_tb_2 table_name_for_view; ALTER VIEW citus_local_tables_mx.v104 OWNER TO postgres"
|
||||
DEBUG: "view v104" has dependency to "table loc_tb_2" that is not in Citus' metadata
|
||||
DEBUG: validating foreign key constraint "fkey_2_1330083"
|
||||
SET client_min_messages TO WARNING;
|
||||
|
|
|
@ -326,7 +326,7 @@ WHERE w2.a = 123;
|
|||
|
||||
EXPLAIN (COSTS OFF) SELECT sub_1.b, sub_2.a, sub_3.avg
|
||||
FROM
|
||||
(SELECT b FROM full_correlated WHERE (a > 2) GROUP BY b HAVING count(DISTINCT a) > 0 ORDER BY 1 DESC LIMIT 5) AS sub_1,
|
||||
(SELECT b FROM full_correlated WHERE (a > 2) GROUP BY b ORDER BY 1 DESC LIMIT 5) AS sub_1,
|
||||
(SELECT a FROM full_correlated WHERE (a > 10) GROUP BY a HAVING count(DISTINCT a) >= 1 ORDER BY 1 DESC LIMIT 3) AS sub_2,
|
||||
(SELECT avg(a) AS AVG FROM full_correlated WHERE (a > 2) GROUP BY a HAVING sum(a) > 10 ORDER BY (sum(d) - avg(a) - COALESCE(array_upper(ARRAY[max(a)],1) * 5, 0)) DESC LIMIT 3) AS sub_3
|
||||
WHERE sub_2.a < sub_1.b::integer
|
||||
|
@ -341,11 +341,10 @@ LIMIT 100;
|
|||
-> Nested Loop
|
||||
Join Filter: (full_correlated_1.a < (full_correlated.b)::integer)
|
||||
-> Limit
|
||||
-> GroupAggregate
|
||||
Group Key: full_correlated.b
|
||||
Filter: (count(DISTINCT full_correlated.a) > 0)
|
||||
-> Sort
|
||||
Sort Key: full_correlated.b DESC
|
||||
-> Sort
|
||||
Sort Key: full_correlated.b DESC
|
||||
-> HashAggregate
|
||||
Group Key: full_correlated.b
|
||||
-> Custom Scan (ColumnarScan) on full_correlated
|
||||
Filter: (a > 2)
|
||||
Columnar Projected Columns: a, b
|
||||
|
@ -366,7 +365,7 @@ LIMIT 100;
|
|||
Filter: (sum(full_correlated_2.a) > 10)
|
||||
-> Index Scan using full_correlated_btree on full_correlated full_correlated_2
|
||||
Index Cond: (a > 2)
|
||||
(32 rows)
|
||||
(31 rows)
|
||||
|
||||
DROP INDEX full_correlated_btree;
|
||||
CREATE INDEX full_correlated_hash ON full_correlated USING hash(a);
|
||||
|
|
|
@ -67,12 +67,12 @@ SELECT pg_typeof(:maintenance_daemon_gpid);
|
|||
bigint
|
||||
(1 row)
|
||||
|
||||
\set VERBOSITY terse
|
||||
SELECT pg_cancel_backend(:maintenance_daemon_gpid);
|
||||
ERROR: must be a superuser to cancel superuser query
|
||||
CONTEXT: while executing command on localhost:xxxxx
|
||||
SELECT pg_terminate_backend(:maintenance_daemon_gpid);
|
||||
ERROR: must be a superuser to terminate superuser process
|
||||
CONTEXT: while executing command on localhost:xxxxx
|
||||
\set VERBOSITY default
|
||||
-- we can cancel our own backend
|
||||
SELECT pg_cancel_backend(citus_backend_gpid());
|
||||
ERROR: canceling statement due to user request
|
||||
|
|
|
@ -357,13 +357,13 @@ DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS c
|
|||
101
|
||||
(1 row)
|
||||
|
||||
CREATE VIEW local_regular_view AS SELECT * FROM local;
|
||||
CREATE VIEW local_regular_view AS SELECT * FROM local table_name_for_view;
|
||||
WARNING: "view local_regular_view" has dependency to "table local" that is not in Citus' metadata
|
||||
DETAIL: "view local_regular_view" will be created only locally
|
||||
HINT: Distribute "table local" first to distribute "view local_regular_view"
|
||||
CREATE VIEW dist_regular_view AS SELECT * FROM distributed;
|
||||
SELECT count(*) FROM distributed JOIN local_regular_view USING (id);
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT local.id, local.title FROM local_dist_join_mixed.local
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT id, title FROM local_dist_join_mixed.local table_name_for_view
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM (local_dist_join_mixed.distributed JOIN (SELECT intermediate_result.id, intermediate_result.title FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(id bigint, title text)) local_regular_view USING (id))
|
||||
count
|
||||
---------------------------------------------------------------------
|
||||
|
@ -380,7 +380,7 @@ DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS c
|
|||
(1 row)
|
||||
|
||||
SELECT count(*) FROM dist_regular_view JOIN local_regular_view USING (id);
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT local.id, local.title FROM local_dist_join_mixed.local
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT id, title FROM local_dist_join_mixed.local table_name_for_view
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM ((SELECT distributed.id, distributed.name, distributed.created_at FROM local_dist_join_mixed.distributed) dist_regular_view JOIN (SELECT intermediate_result.id, intermediate_result.title FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(id bigint, title text)) local_regular_view USING (id))
|
||||
count
|
||||
---------------------------------------------------------------------
|
||||
|
|
|
@ -1370,9 +1370,6 @@ select typdefault from (
|
|||
select a from tbl
|
||||
where typdefault > 'a'
|
||||
limit 1) as subq_0
|
||||
where (
|
||||
select true as bool from pg_catalog.pg_am limit 1
|
||||
)
|
||||
) as subq_1
|
||||
) as subq_2;
|
||||
typdefault
|
||||
|
@ -1400,15 +1397,11 @@ select typdefault from (
|
|||
select a from tbl
|
||||
where typdefault > 'a'
|
||||
limit 1) as subq_0
|
||||
where (
|
||||
select true as bool from pg_catalog.pg_am limit 1
|
||||
)
|
||||
) as subq_1
|
||||
) as subq_2;
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT true AS bool FROM pg_am LIMIT 1
|
||||
DEBUG: Wrapping relation "custom_pg_type" to a subquery
|
||||
DEBUG: generating subplan XXX_2 for subquery SELECT typdefault FROM local_table_join.custom_pg_type WHERE true
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT typdefault FROM (SELECT subq_1.typdefault FROM (SELECT custom_pg_type.typdefault FROM (SELECT custom_pg_type_1.typdefault FROM (SELECT intermediate_result.typdefault FROM read_intermediate_result('XXX_2'::text, 'binary'::citus_copy_format) intermediate_result(typdefault text)) custom_pg_type_1) custom_pg_type, LATERAL (SELECT tbl.a FROM local_table_join.tbl WHERE (custom_pg_type.typdefault OPERATOR(pg_catalog.>) 'a'::text) LIMIT 1) subq_0 WHERE (SELECT intermediate_result.bool FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(bool boolean))) subq_1) subq_2
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT typdefault FROM local_table_join.custom_pg_type WHERE true
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT typdefault FROM (SELECT subq_1.typdefault FROM (SELECT custom_pg_type.typdefault FROM (SELECT custom_pg_type_1.typdefault FROM (SELECT intermediate_result.typdefault FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(typdefault text)) custom_pg_type_1) custom_pg_type, LATERAL (SELECT tbl.a FROM local_table_join.tbl WHERE (custom_pg_type.typdefault OPERATOR(pg_catalog.>) 'a'::text) LIMIT 1) subq_0) subq_1) subq_2
|
||||
ERROR: cannot push down this subquery
|
||||
DETAIL: Limit clause is currently unsupported when a lateral subquery references a column from complex subqueries, CTEs or local tables
|
||||
-- Not supported because of 4470
|
||||
|
|
|
@ -1,6 +1,18 @@
|
|||
--
|
||||
-- COMPLEX_COUNT_DISTINCT
|
||||
--
|
||||
-- This test file has an alternative output because of the following in PG16:
|
||||
-- https://github.com/postgres/postgres/commit/1349d2790bf48a4de072931c722f39337e72055e
|
||||
-- https://github.com/postgres/postgres/commit/f4c7c410ee4a7baa06f51ebb8d5333c169691dd3
|
||||
-- The alternative output can be deleted when we drop support for PG15
|
||||
--
|
||||
SHOW server_version \gset
|
||||
SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16;
|
||||
server_version_ge_16
|
||||
---------------------------------------------------------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SET citus.next_shard_id TO 240000;
|
||||
SET citus.shard_count TO 8;
|
||||
SET citus.shard_replication_factor TO 1;
|
||||
|
@ -65,7 +77,7 @@ SELECT
|
|||
GROUP BY l_orderkey
|
||||
ORDER BY 2 DESC, 1 DESC
|
||||
LIMIT 10;
|
||||
QUERY PLAN
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Limit
|
||||
Output: remote_scan.l_orderkey, remote_scan.count
|
||||
|
@ -87,9 +99,12 @@ SELECT
|
|||
-> GroupAggregate
|
||||
Output: l_orderkey, count(DISTINCT l_partkey)
|
||||
Group Key: lineitem_hash.l_orderkey
|
||||
-> Index Scan Backward using lineitem_hash_pkey_240000 on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(22 rows)
|
||||
-> Sort
|
||||
Output: l_orderkey, l_partkey
|
||||
Sort Key: lineitem_hash.l_orderkey DESC, lineitem_hash.l_partkey
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey
|
||||
(25 rows)
|
||||
|
||||
-- it is also supported if there is no grouping or grouping is on non-partition field
|
||||
SELECT
|
||||
|
@ -108,7 +123,7 @@ SELECT
|
|||
FROM lineitem_hash
|
||||
ORDER BY 1 DESC
|
||||
LIMIT 10;
|
||||
QUERY PLAN
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Limit
|
||||
Output: (count(DISTINCT remote_scan.count))
|
||||
|
@ -117,19 +132,22 @@ SELECT
|
|||
Sort Key: (count(DISTINCT remote_scan.count)) DESC
|
||||
-> Aggregate
|
||||
Output: count(DISTINCT remote_scan.count)
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
-> Sort
|
||||
Output: remote_scan.count
|
||||
Task Count: 8
|
||||
Tasks Shown: One of 8
|
||||
-> Task
|
||||
Query: SELECT l_partkey AS count FROM public.lineitem_hash_240000 lineitem_hash WHERE true GROUP BY l_partkey
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> HashAggregate
|
||||
Output: l_partkey
|
||||
Group Key: lineitem_hash.l_partkey
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(19 rows)
|
||||
Sort Key: remote_scan.count
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
Output: remote_scan.count
|
||||
Task Count: 8
|
||||
Tasks Shown: One of 8
|
||||
-> Task
|
||||
Query: SELECT l_partkey AS count FROM public.lineitem_hash_240000 lineitem_hash WHERE true GROUP BY l_partkey
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> HashAggregate
|
||||
Output: l_partkey
|
||||
Group Key: lineitem_hash.l_partkey
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(22 rows)
|
||||
|
||||
SELECT
|
||||
l_shipmode, count(DISTINCT l_partkey)
|
||||
|
@ -167,7 +185,7 @@ SELECT
|
|||
Group Key: remote_scan.l_shipmode
|
||||
-> Sort
|
||||
Output: remote_scan.l_shipmode, remote_scan.count
|
||||
Sort Key: remote_scan.l_shipmode DESC
|
||||
Sort Key: remote_scan.l_shipmode DESC, remote_scan.count
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
Output: remote_scan.l_shipmode, remote_scan.count
|
||||
Task Count: 8
|
||||
|
@ -210,7 +228,7 @@ SELECT
|
|||
GROUP BY l_orderkey
|
||||
ORDER BY 3 DESC, 2 DESC, 1
|
||||
LIMIT 10;
|
||||
QUERY PLAN
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Limit
|
||||
Output: remote_scan.l_orderkey, remote_scan.count, remote_scan.count_1
|
||||
|
@ -232,9 +250,12 @@ SELECT
|
|||
-> GroupAggregate
|
||||
Output: l_orderkey, count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
||||
Group Key: lineitem_hash.l_orderkey
|
||||
-> Index Scan using lineitem_hash_pkey_240000 on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(22 rows)
|
||||
-> Sort
|
||||
Output: l_orderkey, l_partkey, l_shipmode
|
||||
Sort Key: lineitem_hash.l_orderkey, lineitem_hash.l_partkey
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_shipmode
|
||||
(25 rows)
|
||||
|
||||
-- partition/non-partition column count distinct no grouping
|
||||
SELECT
|
||||
|
@ -249,23 +270,26 @@ EXPLAIN (COSTS false, VERBOSE true)
|
|||
SELECT
|
||||
count(distinct l_orderkey), count(distinct l_partkey), count(distinct l_shipmode)
|
||||
FROM lineitem_hash;
|
||||
QUERY PLAN
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Aggregate
|
||||
Output: count(DISTINCT remote_scan.count), count(DISTINCT remote_scan.count_1), count(DISTINCT remote_scan.count_2)
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
-> Sort
|
||||
Output: remote_scan.count, remote_scan.count_1, remote_scan.count_2
|
||||
Task Count: 8
|
||||
Tasks Shown: One of 8
|
||||
-> Task
|
||||
Query: SELECT l_orderkey AS count, l_partkey AS count, l_shipmode AS count FROM public.lineitem_hash_240000 lineitem_hash WHERE true GROUP BY l_orderkey, l_partkey, l_shipmode
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> HashAggregate
|
||||
Output: l_orderkey, l_partkey, l_shipmode
|
||||
Group Key: lineitem_hash.l_orderkey, lineitem_hash.l_partkey, lineitem_hash.l_shipmode
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(14 rows)
|
||||
Sort Key: remote_scan.count
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
Output: remote_scan.count, remote_scan.count_1, remote_scan.count_2
|
||||
Task Count: 8
|
||||
Tasks Shown: One of 8
|
||||
-> Task
|
||||
Query: SELECT l_orderkey AS count, l_partkey AS count, l_shipmode AS count FROM public.lineitem_hash_240000 lineitem_hash WHERE true GROUP BY l_orderkey, l_partkey, l_shipmode
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> HashAggregate
|
||||
Output: l_orderkey, l_partkey, l_shipmode
|
||||
Group Key: lineitem_hash.l_orderkey, lineitem_hash.l_partkey, lineitem_hash.l_shipmode
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(17 rows)
|
||||
|
||||
-- distinct/non-distinct on partition and non-partition columns
|
||||
SELECT
|
||||
|
@ -433,7 +457,7 @@ SELECT *
|
|||
Group Key: lineitem_hash.l_partkey
|
||||
-> Sort
|
||||
Output: l_partkey, l_orderkey
|
||||
Sort Key: lineitem_hash.l_partkey
|
||||
Sort Key: lineitem_hash.l_partkey, lineitem_hash.l_orderkey
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_partkey, l_orderkey
|
||||
Task Count: 1
|
||||
|
@ -483,7 +507,7 @@ SELECT
|
|||
GROUP BY l_orderkey
|
||||
ORDER BY 2 DESC, 3 DESC, 1
|
||||
LIMIT 10;
|
||||
QUERY PLAN
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Limit
|
||||
Output: remote_scan.l_orderkey, remote_scan.count, remote_scan.count_1
|
||||
|
@ -505,9 +529,12 @@ SELECT
|
|||
-> GroupAggregate
|
||||
Output: l_orderkey, count(DISTINCT l_suppkey) FILTER (WHERE (l_shipmode = 'AIR'::bpchar)), count(DISTINCT l_suppkey)
|
||||
Group Key: lineitem_hash.l_orderkey
|
||||
-> Index Scan using lineitem_hash_pkey_240000 on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment
|
||||
(22 rows)
|
||||
-> Sort
|
||||
Output: l_orderkey, l_suppkey, l_shipmode
|
||||
Sort Key: lineitem_hash.l_orderkey, lineitem_hash.l_suppkey
|
||||
-> Seq Scan on public.lineitem_hash_240000 lineitem_hash
|
||||
Output: l_orderkey, l_suppkey, l_shipmode
|
||||
(25 rows)
|
||||
|
||||
-- group by on non-partition column
|
||||
SELECT
|
||||
|
@ -550,7 +577,7 @@ SELECT
|
|||
Group Key: remote_scan.l_suppkey
|
||||
-> Sort
|
||||
Output: remote_scan.l_suppkey, remote_scan.count, remote_scan.count_1
|
||||
Sort Key: remote_scan.l_suppkey DESC
|
||||
Sort Key: remote_scan.l_suppkey DESC, remote_scan.count
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
Output: remote_scan.l_suppkey, remote_scan.count, remote_scan.count_1
|
||||
Task Count: 8
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +1,18 @@
|
|||
--
|
||||
-- MULTI_EXPLAIN
|
||||
--
|
||||
-- This test file has an alternative output because of the following in PG16:
|
||||
-- https://github.com/postgres/postgres/commit/1349d2790bf48a4de072931c722f39337e72055e
|
||||
-- https://github.com/postgres/postgres/commit/f4c7c410ee4a7baa06f51ebb8d5333c169691dd3
|
||||
-- The alternative output can be deleted when we drop support for PG15
|
||||
--
|
||||
SHOW server_version \gset
|
||||
SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16;
|
||||
server_version_ge_16
|
||||
---------------------------------------------------------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SET citus.next_shard_id TO 570000;
|
||||
\a\t
|
||||
SET citus.explain_distributed_queries TO on;
|
||||
|
@ -651,7 +663,7 @@ Aggregate
|
|||
-> GroupAggregate
|
||||
Group Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id)
|
||||
-> Sort
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id)
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), events.event_time
|
||||
-> Hash Join
|
||||
Hash Cond: (users.composite_id = events.composite_id)
|
||||
-> Seq Scan on users_1400289 users
|
||||
|
@ -737,7 +749,7 @@ HashAggregate
|
|||
-> GroupAggregate
|
||||
Group Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), subquery_2.hasdone
|
||||
-> Sort
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), subquery_2.hasdone
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), subquery_2.hasdone, events.event_time
|
||||
-> Hash Left Join
|
||||
Hash Cond: (users.composite_id = subquery_2.composite_id)
|
||||
-> HashAggregate
|
||||
|
@ -853,7 +865,7 @@ Sort
|
|||
Group Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), subquery_2.count_pay
|
||||
Filter: (array_ndims(array_agg(('action=>1'::text) ORDER BY events.event_time)) > 0)
|
||||
-> Sort
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), subquery_2.count_pay
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), subquery_2.count_pay, events.event_time
|
||||
-> Hash Left Join
|
||||
Hash Cond: (users.composite_id = subquery_2.composite_id)
|
||||
-> HashAggregate
|
||||
|
@ -951,7 +963,7 @@ Limit
|
|||
-> GroupAggregate
|
||||
Group Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id)
|
||||
-> Sort
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id)
|
||||
Sort Key: ((users.composite_id).tenant_id), ((users.composite_id).user_id), events.event_time
|
||||
-> Nested Loop Left Join
|
||||
-> Limit
|
||||
-> Sort
|
||||
|
@ -2381,11 +2393,16 @@ Custom Scan (Citus Adaptive) (actual rows=1 loops=1)
|
|||
Tuple data received from node: 8 bytes
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> Aggregate (actual rows=1 loops=1)
|
||||
-> Hash Join (actual rows=10 loops=1)
|
||||
Hash Cond: (ref_table.a = intermediate_result.a)
|
||||
-> Seq Scan on ref_table_570021 ref_table (actual rows=10 loops=1)
|
||||
-> Hash (actual rows=10 loops=1)
|
||||
-> Merge Join (actual rows=10 loops=1)
|
||||
Merge Cond: (intermediate_result.a = ref_table.a)
|
||||
-> Sort (actual rows=10 loops=1)
|
||||
Sort Key: intermediate_result.a
|
||||
Sort Method: quicksort Memory: 25kB
|
||||
-> Function Scan on read_intermediate_result intermediate_result (actual rows=10 loops=1)
|
||||
-> Sort (actual rows=10 loops=1)
|
||||
Sort Key: ref_table.a
|
||||
Sort Method: quicksort Memory: 25kB
|
||||
-> Seq Scan on ref_table_570021 ref_table (actual rows=10 loops=1)
|
||||
EXPLAIN :default_analyze_flags
|
||||
SELECT count(distinct a) FROM (SELECT GREATEST(random(), 2) r, a FROM dist_table) t NATURAL JOIN ref_table;
|
||||
Aggregate (actual rows=1 loops=1)
|
||||
|
@ -2442,9 +2459,12 @@ Aggregate (actual rows=1 loops=1)
|
|||
-> Aggregate (actual rows=1 loops=1)
|
||||
InitPlan 1 (returns $0)
|
||||
-> Function Scan on read_intermediate_result intermediate_result (actual rows=1 loops=1)
|
||||
-> Result (actual rows=4 loops=1)
|
||||
One-Time Filter: $0
|
||||
-> Seq Scan on dist_table_570017 dist_table (actual rows=4 loops=1)
|
||||
-> Sort (actual rows=4 loops=1)
|
||||
Sort Key: dist_table.a
|
||||
Sort Method: quicksort Memory: 25kB
|
||||
-> Result (actual rows=4 loops=1)
|
||||
One-Time Filter: $0
|
||||
-> Seq Scan on dist_table_570017 dist_table (actual rows=4 loops=1)
|
||||
BEGIN;
|
||||
EXPLAIN :default_analyze_flags
|
||||
WITH r AS (
|
||||
|
@ -2486,7 +2506,10 @@ Custom Scan (Citus Adaptive) (actual rows=1 loops=1)
|
|||
Tuple data received from node: 8 bytes
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> Aggregate (actual rows=1 loops=1)
|
||||
-> Function Scan on read_intermediate_result intermediate_result (actual rows=10 loops=1)
|
||||
-> Sort (actual rows=10 loops=1)
|
||||
Sort Key: intermediate_result.a2
|
||||
Sort Method: quicksort Memory: 25kB
|
||||
-> Function Scan on read_intermediate_result intermediate_result (actual rows=10 loops=1)
|
||||
ROLLBACK;
|
||||
-- https://github.com/citusdata/citus/issues/4074
|
||||
prepare ref_select(int) AS select * from ref_table where 1 = $1;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -374,17 +374,17 @@ LIMIT 2;
|
|||
(2 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT ut.user_id, count(DISTINCT ut.value_2)
|
||||
SELECT ut.user_id, avg(ut.value_2)
|
||||
FROM users_table ut, events_table et
|
||||
WHERE ut.user_id = et.user_id and et.value_2 < 5
|
||||
GROUP BY ut.user_id
|
||||
ORDER BY 2, AVG(ut.value_1), 1 DESC
|
||||
LIMIT 5;
|
||||
QUERY PLAN
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
Limit
|
||||
-> Sort
|
||||
Sort Key: remote_scan.count, remote_scan.worker_column_3, remote_scan.user_id DESC
|
||||
Sort Key: remote_scan.avg, remote_scan.worker_column_3, remote_scan.user_id DESC
|
||||
-> Custom Scan (Citus Adaptive)
|
||||
Task Count: 4
|
||||
Tasks Shown: One of 4
|
||||
|
@ -392,16 +392,14 @@ LIMIT 5;
|
|||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> Limit
|
||||
-> Sort
|
||||
Sort Key: (count(DISTINCT ut.value_2)), (avg(ut.value_1)), ut.user_id DESC
|
||||
-> GroupAggregate
|
||||
Sort Key: (avg(ut.value_2)), (avg(ut.value_1)), ut.user_id DESC
|
||||
-> HashAggregate
|
||||
Group Key: ut.user_id
|
||||
-> Sort
|
||||
Sort Key: ut.user_id DESC
|
||||
-> Hash Join
|
||||
Hash Cond: (ut.user_id = et.user_id)
|
||||
-> Seq Scan on users_table_1400256 ut
|
||||
-> Hash
|
||||
-> Seq Scan on events_table_1400260 et
|
||||
Filter: (value_2 < 5)
|
||||
(21 rows)
|
||||
-> Hash Join
|
||||
Hash Cond: (ut.user_id = et.user_id)
|
||||
-> Seq Scan on users_table_1400256 ut
|
||||
-> Hash
|
||||
-> Seq Scan on events_table_1400260 et
|
||||
Filter: (value_2 < 5)
|
||||
(19 rows)
|
||||
|
||||
|
|
|
@ -813,7 +813,7 @@ SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
|||
EXPLAIN (COSTS FALSE)
|
||||
SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
||||
FROM lineitem_hash_part
|
||||
GROUP BY l_orderkey
|
||||
GROUP BY l_orderkey, l_partkey, l_shipmode
|
||||
ORDER BY 1,2;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
|
@ -827,9 +827,9 @@ EXPLAIN (COSTS FALSE)
|
|||
-> Task
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> GroupAggregate
|
||||
Group Key: l_orderkey
|
||||
Group Key: l_orderkey, l_partkey, l_shipmode
|
||||
-> Sort
|
||||
Sort Key: l_orderkey
|
||||
Sort Key: l_orderkey, l_partkey, l_shipmode
|
||||
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
|
||||
(14 rows)
|
||||
|
||||
|
@ -839,7 +839,7 @@ SET enable_hashagg TO off;
|
|||
EXPLAIN (COSTS FALSE)
|
||||
SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
||||
FROM lineitem_hash_part
|
||||
GROUP BY l_orderkey
|
||||
GROUP BY l_orderkey, l_partkey, l_shipmode
|
||||
ORDER BY 1,2;
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------
|
||||
|
@ -852,9 +852,9 @@ EXPLAIN (COSTS FALSE)
|
|||
-> Task
|
||||
Node: host=localhost port=xxxxx dbname=regression
|
||||
-> GroupAggregate
|
||||
Group Key: l_orderkey
|
||||
Group Key: l_orderkey, l_partkey, l_shipmode
|
||||
-> Sort
|
||||
Sort Key: l_orderkey
|
||||
Sort Key: l_orderkey, l_partkey, l_shipmode
|
||||
-> Seq Scan on lineitem_hash_part_360041 lineitem_hash_part
|
||||
(13 rows)
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@ SELECT
|
|||
FROM
|
||||
users_table RIGHT JOIN users_reference_table USING (user_id)
|
||||
WHERE
|
||||
users_table.value_2 IN
|
||||
users_reference_table.value_2 IN
|
||||
(SELECT
|
||||
value_2
|
||||
FROM
|
||||
|
|
|
@ -92,7 +92,7 @@ SELECT l_orderkey, count(*) FROM priority_lineitem GROUP BY 1 ORDER BY 2 DESC, 1
|
|||
326 | 7
|
||||
(5 rows)
|
||||
|
||||
CREATE VIEW air_shipped_lineitems AS SELECT * FROM lineitem_hash_part WHERE l_shipmode = 'AIR';
|
||||
CREATE VIEW air_shipped_lineitems AS SELECT * FROM lineitem_hash_part table_name_for_view WHERE l_shipmode = 'AIR';
|
||||
-- join between view and table
|
||||
SELECT count(*) FROM orders_hash_part join air_shipped_lineitems ON (o_orderkey = l_orderkey);
|
||||
count
|
||||
|
@ -179,7 +179,7 @@ SELECT o_orderkey, l_linenumber FROM priority_orders left join air_shipped_linei
|
|||
-- it passes planning, fails at execution stage
|
||||
SET client_min_messages TO DEBUG1;
|
||||
SELECT * FROM priority_orders JOIN air_shipped_lineitems ON (o_custkey = l_suppkey) ORDER BY o_orderkey DESC, o_custkey DESC, o_orderpriority DESC LIMIT 5;
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT lineitem_hash_part.l_orderkey, lineitem_hash_part.l_partkey, lineitem_hash_part.l_suppkey, lineitem_hash_part.l_linenumber, lineitem_hash_part.l_quantity, lineitem_hash_part.l_extendedprice, lineitem_hash_part.l_discount, lineitem_hash_part.l_tax, lineitem_hash_part.l_returnflag, lineitem_hash_part.l_linestatus, lineitem_hash_part.l_shipdate, lineitem_hash_part.l_commitdate, lineitem_hash_part.l_receiptdate, lineitem_hash_part.l_shipinstruct, lineitem_hash_part.l_shipmode, lineitem_hash_part.l_comment FROM public.lineitem_hash_part WHERE (lineitem_hash_part.l_shipmode OPERATOR(pg_catalog.=) 'AIR'::bpchar)
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT l_orderkey, l_partkey, l_suppkey, l_linenumber, l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate, l_commitdate, l_receiptdate, l_shipinstruct, l_shipmode, l_comment FROM public.lineitem_hash_part table_name_for_view WHERE (l_shipmode OPERATOR(pg_catalog.=) 'AIR'::bpchar)
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT priority_orders.o_orderkey, priority_orders.o_custkey, priority_orders.o_orderstatus, priority_orders.o_totalprice, priority_orders.o_orderdate, priority_orders.o_orderpriority, priority_orders.o_clerk, priority_orders.o_shippriority, priority_orders.o_comment, air_shipped_lineitems.l_orderkey, air_shipped_lineitems.l_partkey, air_shipped_lineitems.l_suppkey, air_shipped_lineitems.l_linenumber, air_shipped_lineitems.l_quantity, air_shipped_lineitems.l_extendedprice, air_shipped_lineitems.l_discount, air_shipped_lineitems.l_tax, air_shipped_lineitems.l_returnflag, air_shipped_lineitems.l_linestatus, air_shipped_lineitems.l_shipdate, air_shipped_lineitems.l_commitdate, air_shipped_lineitems.l_receiptdate, air_shipped_lineitems.l_shipinstruct, air_shipped_lineitems.l_shipmode, air_shipped_lineitems.l_comment FROM ((SELECT orders_hash_part.o_orderkey, orders_hash_part.o_custkey, orders_hash_part.o_orderstatus, orders_hash_part.o_totalprice, orders_hash_part.o_orderdate, orders_hash_part.o_orderpriority, orders_hash_part.o_clerk, orders_hash_part.o_shippriority, orders_hash_part.o_comment FROM public.orders_hash_part WHERE (orders_hash_part.o_orderpriority OPERATOR(pg_catalog.<) '3-MEDIUM'::bpchar)) priority_orders JOIN (SELECT intermediate_result.l_orderkey, intermediate_result.l_partkey, intermediate_result.l_suppkey, intermediate_result.l_linenumber, intermediate_result.l_quantity, intermediate_result.l_extendedprice, intermediate_result.l_discount, intermediate_result.l_tax, intermediate_result.l_returnflag, intermediate_result.l_linestatus, intermediate_result.l_shipdate, intermediate_result.l_commitdate, intermediate_result.l_receiptdate, intermediate_result.l_shipinstruct, intermediate_result.l_shipmode, intermediate_result.l_comment FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(l_orderkey bigint, l_partkey integer, l_suppkey integer, l_linenumber integer, l_quantity numeric(15,2), l_extendedprice numeric(15,2), l_discount numeric(15,2), l_tax numeric(15,2), l_returnflag character(1), l_linestatus character(1), l_shipdate date, l_commitdate date, l_receiptdate date, l_shipinstruct character(25), l_shipmode character(10), l_comment character varying(44))) air_shipped_lineitems ON ((priority_orders.o_custkey OPERATOR(pg_catalog.=) air_shipped_lineitems.l_suppkey))) ORDER BY priority_orders.o_orderkey DESC, priority_orders.o_custkey DESC, priority_orders.o_orderpriority DESC LIMIT 5
|
||||
DEBUG: push down of limit count: 5
|
||||
o_orderkey | o_custkey | o_orderstatus | o_totalprice | o_orderdate | o_orderpriority | o_clerk | o_shippriority | o_comment | l_orderkey | l_partkey | l_suppkey | l_linenumber | l_quantity | l_extendedprice | l_discount | l_tax | l_returnflag | l_linestatus | l_shipdate | l_commitdate | l_receiptdate | l_shipinstruct | l_shipmode | l_comment
|
||||
|
|
|
@ -1079,19 +1079,19 @@ SELECT create_distributed_table('table1','tenant_id');
|
|||
|
||||
(1 row)
|
||||
|
||||
CREATE VIEW table1_view AS SELECT * from table1 where id < 100;
|
||||
CREATE VIEW table1_view AS SELECT * from table1 table_name_for_view where id < 100;
|
||||
-- all of the above queries are non-colocated subquery joins
|
||||
-- because the views are replaced with subqueries
|
||||
UPDATE table2 SET id=20 FROM table1_view WHERE table1_view.id=table2.id;
|
||||
DEBUG: complex joins are only supported when all distributed tables are co-located and joined on their distribution columns
|
||||
DEBUG: Router planner cannot handle multi-shard select queries
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT table1.id, table1.tenant_id FROM non_colocated_subquery.table1 WHERE (table1.id OPERATOR(pg_catalog.<) 100)
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT id, tenant_id FROM non_colocated_subquery.table1 table_name_for_view WHERE (id OPERATOR(pg_catalog.<) 100)
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: UPDATE non_colocated_subquery.table2 SET id = 20 FROM (SELECT intermediate_result.id, intermediate_result.tenant_id FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(id integer, tenant_id integer)) table1_view WHERE (table1_view.id OPERATOR(pg_catalog.=) table2.id)
|
||||
DEBUG: Creating router plan
|
||||
UPDATE table2_p1 SET id=20 FROM table1_view WHERE table1_view.id=table2_p1.id;
|
||||
DEBUG: complex joins are only supported when all distributed tables are co-located and joined on their distribution columns
|
||||
DEBUG: Router planner cannot handle multi-shard select queries
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT table1.id, table1.tenant_id FROM non_colocated_subquery.table1 WHERE (table1.id OPERATOR(pg_catalog.<) 100)
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT id, tenant_id FROM non_colocated_subquery.table1 table_name_for_view WHERE (id OPERATOR(pg_catalog.<) 100)
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: UPDATE non_colocated_subquery.table2_p1 SET id = 20 FROM (SELECT intermediate_result.id, intermediate_result.tenant_id FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(id integer, tenant_id integer)) table1_view WHERE (table1_view.id OPERATOR(pg_catalog.=) table2_p1.id)
|
||||
DEBUG: Creating router plan
|
||||
RESET client_min_messages;
|
||||
|
|
|
@ -1187,17 +1187,16 @@ DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS c
|
|||
|
||||
-- same test using a view, can be recursively planned
|
||||
CREATE VIEW my_view_1 AS
|
||||
SELECT * FROM dist_1 t2 WHERE EXISTS (
|
||||
SELECT * FROM dist_1 table_name_for_view WHERE EXISTS (
|
||||
SELECT * FROM dist_1 t4
|
||||
WHERE t4.a = t2.a
|
||||
);
|
||||
WHERE t4.a = table_name_for_view.a);
|
||||
SELECT COUNT(*) FROM ref_1 t1
|
||||
LEFT JOIN
|
||||
my_view_1 t3
|
||||
USING (a);
|
||||
DEBUG: recursively planning right side of the left join since the outer side is a recurring rel
|
||||
DEBUG: recursively planning the distributed subquery since it is part of a distributed join node that is outer joined with a recurring rel
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT t2.a, t2.b FROM recurring_outer_join.dist_1 t2 WHERE (EXISTS (SELECT t4.a, t4.b FROM recurring_outer_join.dist_1 t4 WHERE (t4.a OPERATOR(pg_catalog.=) t2.a)))
|
||||
DEBUG: generating subplan XXX_1 for subquery SELECT a, b FROM recurring_outer_join.dist_1 table_name_for_view WHERE (EXISTS (SELECT t4.a, t4.b FROM recurring_outer_join.dist_1 t4 WHERE (t4.a OPERATOR(pg_catalog.=) table_name_for_view.a)))
|
||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM (recurring_outer_join.ref_1 t1 LEFT JOIN (SELECT intermediate_result.a, intermediate_result.b FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(a integer, b integer)) t3 USING (a))
|
||||
count
|
||||
---------------------------------------------------------------------
|
||||
|
|
|
@ -396,10 +396,10 @@ DROP VIEW numbers_v, local_table_v;
|
|||
-- Joins between reference tables and materialized views are allowed to
|
||||
-- be planned to be executed locally.
|
||||
--
|
||||
CREATE MATERIALIZED VIEW numbers_v AS SELECT * FROM numbers WHERE a BETWEEN 1 AND 10;
|
||||
NOTICE: executing the command locally: SELECT a FROM replicate_ref_to_coordinator.numbers_8000001 numbers WHERE ((a OPERATOR(pg_catalog.>=) 1) AND (a OPERATOR(pg_catalog.<=) 10))
|
||||
CREATE MATERIALIZED VIEW numbers_v AS SELECT * FROM numbers table_name_for_view WHERE a BETWEEN 1 AND 10;
|
||||
NOTICE: executing the command locally: SELECT a FROM replicate_ref_to_coordinator.numbers_8000001 table_name_for_view WHERE ((a OPERATOR(pg_catalog.>=) 1) AND (a OPERATOR(pg_catalog.<=) 10))
|
||||
REFRESH MATERIALIZED VIEW numbers_v;
|
||||
NOTICE: executing the command locally: SELECT numbers.a FROM replicate_ref_to_coordinator.numbers_8000001 numbers WHERE ((numbers.a OPERATOR(pg_catalog.>=) 1) AND (numbers.a OPERATOR(pg_catalog.<=) 10))
|
||||
NOTICE: executing the command locally: SELECT a FROM replicate_ref_to_coordinator.numbers_8000001 table_name_for_view WHERE ((a OPERATOR(pg_catalog.>=) 1) AND (a OPERATOR(pg_catalog.<=) 10))
|
||||
SELECT * FROM squares JOIN numbers_v ON squares.a = numbers_v.a ORDER BY 1;
|
||||
NOTICE: executing the command locally: SELECT squares.a, squares.b, numbers_v.a FROM (replicate_ref_to_coordinator.squares_8000000 squares JOIN replicate_ref_to_coordinator.numbers_v ON ((squares.a OPERATOR(pg_catalog.=) numbers_v.a))) ORDER BY squares.a
|
||||
a | b | a
|
||||
|
|
|
@ -304,18 +304,18 @@ SELECT create_distributed_table('view_table', 'a');
|
|||
|
||||
INSERT INTO view_table VALUES (1, 2, 3), (2, 4, 6), (3, 6, 9);
|
||||
CREATE SCHEMA another_schema;
|
||||
CREATE VIEW undis_view1 AS SELECT a, b FROM view_table;
|
||||
CREATE VIEW undis_view2 AS SELECT a, c FROM view_table;
|
||||
CREATE VIEW undis_view1 AS SELECT a, b FROM view_table table_name_for_view;
|
||||
CREATE VIEW undis_view2 AS SELECT a, c FROM view_table table_name_for_view;
|
||||
CREATE VIEW another_schema.undis_view3 AS SELECT b, c FROM undis_view1 JOIN undis_view2 ON undis_view1.a = undis_view2.a;
|
||||
SELECT schemaname, viewname, viewowner, definition FROM pg_views WHERE viewname LIKE 'undis\_view%' ORDER BY viewname;
|
||||
schemaname | viewname | viewowner | definition
|
||||
---------------------------------------------------------------------
|
||||
undistribute_table | undis_view1 | postgres | SELECT view_table.a, +
|
||||
| | | view_table.b +
|
||||
| | | FROM view_table;
|
||||
undistribute_table | undis_view2 | postgres | SELECT view_table.a, +
|
||||
| | | view_table.c +
|
||||
| | | FROM view_table;
|
||||
undistribute_table | undis_view1 | postgres | SELECT a, +
|
||||
| | | b +
|
||||
| | | FROM view_table table_name_for_view;
|
||||
undistribute_table | undis_view2 | postgres | SELECT a, +
|
||||
| | | c +
|
||||
| | | FROM view_table table_name_for_view;
|
||||
another_schema | undis_view3 | postgres | SELECT undis_view1.b, +
|
||||
| | | undis_view2.c +
|
||||
| | | FROM (undis_view1 +
|
||||
|
@ -348,12 +348,12 @@ NOTICE: renaming the new table to undistribute_table.view_table
|
|||
SELECT schemaname, viewname, viewowner, definition FROM pg_views WHERE viewname LIKE 'undis\_view%' ORDER BY viewname;
|
||||
schemaname | viewname | viewowner | definition
|
||||
---------------------------------------------------------------------
|
||||
undistribute_table | undis_view1 | postgres | SELECT view_table.a, +
|
||||
| | | view_table.b +
|
||||
| | | FROM view_table;
|
||||
undistribute_table | undis_view2 | postgres | SELECT view_table.a, +
|
||||
| | | view_table.c +
|
||||
| | | FROM view_table;
|
||||
undistribute_table | undis_view1 | postgres | SELECT a, +
|
||||
| | | b +
|
||||
| | | FROM view_table table_name_for_view;
|
||||
undistribute_table | undis_view2 | postgres | SELECT a, +
|
||||
| | | c +
|
||||
| | | FROM view_table table_name_for_view;
|
||||
another_schema | undis_view3 | postgres | SELECT undis_view1.b, +
|
||||
| | | undis_view2.c +
|
||||
| | | FROM (undis_view1 +
|
||||
|
|
|
@ -316,13 +316,13 @@ UNION ALL
|
|||
employees e
|
||||
INNER JOIN reporting_line rl ON e.manager_id = rl.employee_id;
|
||||
-- Aliases are supported
|
||||
CREATE VIEW aliased_opt_prop_view(alias_1, alias_2) AS SELECT * FROM view_table_6;
|
||||
CREATE VIEW aliased_opt_prop_view(alias_1, alias_2) AS SELECT * FROM view_table_6 table_name_for_view;
|
||||
-- View options are supported
|
||||
CREATE VIEW opt_prop_view
|
||||
WITH(check_option=CASCADED, security_barrier=true)
|
||||
AS SELECT * FROM view_table_6;
|
||||
AS SELECT * FROM view_table_6 table_name_for_view;
|
||||
CREATE VIEW sep_opt_prop_view
|
||||
AS SELECT * FROM view_table_6
|
||||
AS SELECT * FROM view_table_6 table_name_for_view
|
||||
WITH LOCAL CHECK OPTION;
|
||||
SELECT * FROM (SELECT pg_identify_object_as_address(classid, objid, objsubid) as obj_identifier from pg_catalog.pg_dist_object) as obj_identifiers where obj_identifier::text like '%opt_prop_view%' ORDER BY 1;
|
||||
obj_identifier
|
||||
|
@ -335,27 +335,27 @@ SELECT * FROM (SELECT pg_identify_object_as_address(classid, objid, objsubid) as
|
|||
-- Check definitions and reltoptions of views are correct on workers
|
||||
\c - - - :worker_1_port
|
||||
SELECT definition FROM pg_views WHERE viewname = 'aliased_opt_prop_view';
|
||||
definition
|
||||
definition
|
||||
---------------------------------------------------------------------
|
||||
SELECT view_table_6.id AS alias_1, +
|
||||
view_table_6.val_1 AS alias_2 +
|
||||
FROM view_prop_schema.view_table_6;
|
||||
SELECT id AS alias_1, +
|
||||
val_1 AS alias_2 +
|
||||
FROM view_prop_schema.view_table_6 table_name_for_view;
|
||||
(1 row)
|
||||
|
||||
SELECT definition FROM pg_views WHERE viewname = 'opt_prop_view';
|
||||
definition
|
||||
definition
|
||||
---------------------------------------------------------------------
|
||||
SELECT view_table_6.id, +
|
||||
view_table_6.val_1 +
|
||||
FROM view_prop_schema.view_table_6;
|
||||
SELECT id, +
|
||||
val_1 +
|
||||
FROM view_prop_schema.view_table_6 table_name_for_view;
|
||||
(1 row)
|
||||
|
||||
SELECT definition FROM pg_views WHERE viewname = 'sep_opt_prop_view';
|
||||
definition
|
||||
definition
|
||||
---------------------------------------------------------------------
|
||||
SELECT view_table_6.id, +
|
||||
view_table_6.val_1 +
|
||||
FROM view_prop_schema.view_table_6;
|
||||
SELECT id, +
|
||||
val_1 +
|
||||
FROM view_prop_schema.view_table_6 table_name_for_view;
|
||||
(1 row)
|
||||
|
||||
SELECT relname, reloptions
|
||||
|
@ -444,7 +444,7 @@ SELECT create_distributed_table('alter_view_table','id');
|
|||
|
||||
(1 row)
|
||||
|
||||
CREATE VIEW alter_view_1 AS SELECT * FROM alter_view_table;
|
||||
CREATE VIEW alter_view_1 AS SELECT * FROM alter_view_table table_name_for_view;
|
||||
-- Set/drop default value is not supported by Citus
|
||||
ALTER VIEW alter_view_1 ALTER COLUMN val1 SET DEFAULT random()::text;
|
||||
ERROR: Citus doesn't support setting or resetting default values for a column of view
|
||||
|
@ -465,11 +465,11 @@ ALTER TABLE alter_view_1 SET (check_option=cascaded, security_barrier);
|
|||
ALTER TABLE alter_view_1 SET (check_option=cascaded, security_barrier = true);
|
||||
-- Check the definition on both coordinator and worker node
|
||||
SELECT definition FROM pg_views WHERE viewname = 'alter_view_1';
|
||||
definition
|
||||
definition
|
||||
---------------------------------------------------------------------
|
||||
SELECT alter_view_table.id,+
|
||||
alter_view_table.val1 +
|
||||
FROM alter_view_table;
|
||||
SELECT id, +
|
||||
val1 +
|
||||
FROM alter_view_table table_name_for_view;
|
||||
(1 row)
|
||||
|
||||
SELECT relname, reloptions
|
||||
|
@ -482,11 +482,11 @@ WHERE oid = 'view_prop_schema.alter_view_1'::regclass::oid;
|
|||
|
||||
\c - - - :worker_1_port
|
||||
SELECT definition FROM pg_views WHERE viewname = 'alter_view_1';
|
||||
definition
|
||||
definition
|
||||
---------------------------------------------------------------------
|
||||
SELECT alter_view_table.id, +
|
||||
alter_view_table.val1 +
|
||||
FROM view_prop_schema.alter_view_table;
|
||||
SELECT id, +
|
||||
val1 +
|
||||
FROM view_prop_schema.alter_view_table table_name_for_view;
|
||||
(1 row)
|
||||
|
||||
SELECT relname, reloptions
|
||||
|
|
|
@ -473,7 +473,7 @@ select run_command_on_workers($$SELECT count(*)=0 from citus_local_tables_mx.v10
|
|||
select run_command_on_workers($$SELECT count(*)=0 from citus_local_tables_mx.v102$$);
|
||||
|
||||
CREATE TABLE loc_tb_2 (a int);
|
||||
CREATE VIEW v104 AS SELECT * from loc_tb_2;
|
||||
CREATE VIEW v104 AS SELECT * from loc_tb_2 table_name_for_view;
|
||||
|
||||
SET client_min_messages TO DEBUG1;
|
||||
-- verify the CREATE command for the view is generated correctly
|
||||
|
|
|
@ -193,7 +193,7 @@ WHERE w2.a = 123;
|
|||
|
||||
EXPLAIN (COSTS OFF) SELECT sub_1.b, sub_2.a, sub_3.avg
|
||||
FROM
|
||||
(SELECT b FROM full_correlated WHERE (a > 2) GROUP BY b HAVING count(DISTINCT a) > 0 ORDER BY 1 DESC LIMIT 5) AS sub_1,
|
||||
(SELECT b FROM full_correlated WHERE (a > 2) GROUP BY b ORDER BY 1 DESC LIMIT 5) AS sub_1,
|
||||
(SELECT a FROM full_correlated WHERE (a > 10) GROUP BY a HAVING count(DISTINCT a) >= 1 ORDER BY 1 DESC LIMIT 3) AS sub_2,
|
||||
(SELECT avg(a) AS AVG FROM full_correlated WHERE (a > 2) GROUP BY a HAVING sum(a) > 10 ORDER BY (sum(d) - avg(a) - COALESCE(array_upper(ARRAY[max(a)],1) * 5, 0)) DESC LIMIT 3) AS sub_3
|
||||
WHERE sub_2.a < sub_1.b::integer
|
||||
|
|
|
@ -47,9 +47,12 @@ RESET client_min_messages;
|
|||
|
||||
SELECT pg_typeof(:maintenance_daemon_gpid);
|
||||
|
||||
\set VERBOSITY terse
|
||||
|
||||
SELECT pg_cancel_backend(:maintenance_daemon_gpid);
|
||||
SELECT pg_terminate_backend(:maintenance_daemon_gpid);
|
||||
|
||||
\set VERBOSITY default
|
||||
-- we can cancel our own backend
|
||||
SELECT pg_cancel_backend(citus_backend_gpid());
|
||||
|
||||
|
|
|
@ -78,14 +78,13 @@ SELECT count(*) FROM distributed JOIN unlogged_local USING (id);
|
|||
CREATE MATERIALIZED VIEW mat_view AS SELECT * FROM local;
|
||||
SELECT count(*) FROM distributed JOIN mat_view USING (id);
|
||||
|
||||
CREATE VIEW local_regular_view AS SELECT * FROM local;
|
||||
CREATE VIEW local_regular_view AS SELECT * FROM local table_name_for_view;
|
||||
CREATE VIEW dist_regular_view AS SELECT * FROM distributed;
|
||||
|
||||
SELECT count(*) FROM distributed JOIN local_regular_view USING (id);
|
||||
SELECT count(*) FROM local JOIN dist_regular_view USING (id);
|
||||
SELECT count(*) FROM dist_regular_view JOIN local_regular_view USING (id);
|
||||
|
||||
|
||||
-- join alias/table alias
|
||||
SELECT COUNT(*) FROM (distributed JOIN local USING (id)) AS t(a,b,c,d) ORDER BY d,c,a,b LIMIT 3;
|
||||
SELECT COUNT(*) FROM (distributed d1(x,y,y1) JOIN local l1(x,t) USING (x)) AS t(a,b,c,d) ORDER BY d,c,a,b LIMIT 3;
|
||||
|
|
|
@ -362,9 +362,6 @@ select typdefault from (
|
|||
select a from tbl
|
||||
where typdefault > 'a'
|
||||
limit 1) as subq_0
|
||||
where (
|
||||
select true as bool from pg_catalog.pg_am limit 1
|
||||
)
|
||||
) as subq_1
|
||||
) as subq_2;
|
||||
|
||||
|
@ -379,9 +376,6 @@ select typdefault from (
|
|||
select a from tbl
|
||||
where typdefault > 'a'
|
||||
limit 1) as subq_0
|
||||
where (
|
||||
select true as bool from pg_catalog.pg_am limit 1
|
||||
)
|
||||
) as subq_1
|
||||
) as subq_2;
|
||||
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
--
|
||||
-- COMPLEX_COUNT_DISTINCT
|
||||
--
|
||||
|
||||
-- This test file has an alternative output because of the following in PG16:
|
||||
-- https://github.com/postgres/postgres/commit/1349d2790bf48a4de072931c722f39337e72055e
|
||||
-- https://github.com/postgres/postgres/commit/f4c7c410ee4a7baa06f51ebb8d5333c169691dd3
|
||||
-- The alternative output can be deleted when we drop support for PG15
|
||||
--
|
||||
SHOW server_version \gset
|
||||
SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16;
|
||||
|
||||
SET citus.next_shard_id TO 240000;
|
||||
SET citus.shard_count TO 8;
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
--
|
||||
-- MULTI_EXPLAIN
|
||||
--
|
||||
-- This test file has an alternative output because of the following in PG16:
|
||||
-- https://github.com/postgres/postgres/commit/1349d2790bf48a4de072931c722f39337e72055e
|
||||
-- https://github.com/postgres/postgres/commit/f4c7c410ee4a7baa06f51ebb8d5333c169691dd3
|
||||
-- The alternative output can be deleted when we drop support for PG15
|
||||
--
|
||||
SHOW server_version \gset
|
||||
SELECT substring(:'server_version', '\d+')::int >= 16 AS server_version_ge_16;
|
||||
|
||||
SET citus.next_shard_id TO 570000;
|
||||
|
||||
|
|
|
@ -177,7 +177,7 @@ ORDER BY 2, AVG(ut.value_1), 1 DESC
|
|||
LIMIT 2;
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT ut.user_id, count(DISTINCT ut.value_2)
|
||||
SELECT ut.user_id, avg(ut.value_2)
|
||||
FROM users_table ut, events_table et
|
||||
WHERE ut.user_id = et.user_id and et.value_2 < 5
|
||||
GROUP BY ut.user_id
|
||||
|
|
|
@ -303,7 +303,7 @@ SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
|||
EXPLAIN (COSTS FALSE)
|
||||
SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
||||
FROM lineitem_hash_part
|
||||
GROUP BY l_orderkey
|
||||
GROUP BY l_orderkey, l_partkey, l_shipmode
|
||||
ORDER BY 1,2;
|
||||
|
||||
-- check the plan if the hash aggreate is disabled. We expect to see sort + unique
|
||||
|
@ -312,7 +312,7 @@ SET enable_hashagg TO off;
|
|||
EXPLAIN (COSTS FALSE)
|
||||
SELECT DISTINCT count(DISTINCT l_partkey), count(DISTINCT l_shipmode)
|
||||
FROM lineitem_hash_part
|
||||
GROUP BY l_orderkey
|
||||
GROUP BY l_orderkey, l_partkey, l_shipmode
|
||||
ORDER BY 1,2;
|
||||
|
||||
SET enable_hashagg TO on;
|
||||
|
|
|
@ -132,7 +132,7 @@ SELECT
|
|||
FROM
|
||||
users_table RIGHT JOIN users_reference_table USING (user_id)
|
||||
WHERE
|
||||
users_table.value_2 IN
|
||||
users_reference_table.value_2 IN
|
||||
(SELECT
|
||||
value_2
|
||||
FROM
|
||||
|
|
|
@ -37,7 +37,7 @@ CREATE VIEW priority_lineitem AS SELECT li.* FROM lineitem_hash_part li JOIN pri
|
|||
|
||||
SELECT l_orderkey, count(*) FROM priority_lineitem GROUP BY 1 ORDER BY 2 DESC, 1 LIMIT 5;
|
||||
|
||||
CREATE VIEW air_shipped_lineitems AS SELECT * FROM lineitem_hash_part WHERE l_shipmode = 'AIR';
|
||||
CREATE VIEW air_shipped_lineitems AS SELECT * FROM lineitem_hash_part table_name_for_view WHERE l_shipmode = 'AIR';
|
||||
|
||||
-- join between view and table
|
||||
SELECT count(*) FROM orders_hash_part join air_shipped_lineitems ON (o_orderkey = l_orderkey);
|
||||
|
|
|
@ -792,7 +792,7 @@ SET citus.shard_replication_factor TO 1;
|
|||
SELECT create_distributed_table('table2','tenant_id');
|
||||
SELECT create_distributed_table('table1','tenant_id');
|
||||
|
||||
CREATE VIEW table1_view AS SELECT * from table1 where id < 100;
|
||||
CREATE VIEW table1_view AS SELECT * from table1 table_name_for_view where id < 100;
|
||||
|
||||
-- all of the above queries are non-colocated subquery joins
|
||||
-- because the views are replaced with subqueries
|
||||
|
|
|
@ -612,10 +612,9 @@ USING (a);
|
|||
|
||||
-- same test using a view, can be recursively planned
|
||||
CREATE VIEW my_view_1 AS
|
||||
SELECT * FROM dist_1 t2 WHERE EXISTS (
|
||||
SELECT * FROM dist_1 table_name_for_view WHERE EXISTS (
|
||||
SELECT * FROM dist_1 t4
|
||||
WHERE t4.a = t2.a
|
||||
);
|
||||
WHERE t4.a = table_name_for_view.a);
|
||||
|
||||
SELECT COUNT(*) FROM ref_1 t1
|
||||
LEFT JOIN
|
||||
|
|
|
@ -192,7 +192,7 @@ DROP VIEW numbers_v, local_table_v;
|
|||
-- Joins between reference tables and materialized views are allowed to
|
||||
-- be planned to be executed locally.
|
||||
--
|
||||
CREATE MATERIALIZED VIEW numbers_v AS SELECT * FROM numbers WHERE a BETWEEN 1 AND 10;
|
||||
CREATE MATERIALIZED VIEW numbers_v AS SELECT * FROM numbers table_name_for_view WHERE a BETWEEN 1 AND 10;
|
||||
REFRESH MATERIALIZED VIEW numbers_v;
|
||||
|
||||
SELECT * FROM squares JOIN numbers_v ON squares.a = numbers_v.a ORDER BY 1;
|
||||
|
|
|
@ -105,8 +105,8 @@ INSERT INTO view_table VALUES (1, 2, 3), (2, 4, 6), (3, 6, 9);
|
|||
|
||||
CREATE SCHEMA another_schema;
|
||||
|
||||
CREATE VIEW undis_view1 AS SELECT a, b FROM view_table;
|
||||
CREATE VIEW undis_view2 AS SELECT a, c FROM view_table;
|
||||
CREATE VIEW undis_view1 AS SELECT a, b FROM view_table table_name_for_view;
|
||||
CREATE VIEW undis_view2 AS SELECT a, c FROM view_table table_name_for_view;
|
||||
CREATE VIEW another_schema.undis_view3 AS SELECT b, c FROM undis_view1 JOIN undis_view2 ON undis_view1.a = undis_view2.a;
|
||||
|
||||
SELECT schemaname, viewname, viewowner, definition FROM pg_views WHERE viewname LIKE 'undis\_view%' ORDER BY viewname;
|
||||
|
|
|
@ -207,15 +207,15 @@ UNION ALL
|
|||
INNER JOIN reporting_line rl ON e.manager_id = rl.employee_id;
|
||||
|
||||
-- Aliases are supported
|
||||
CREATE VIEW aliased_opt_prop_view(alias_1, alias_2) AS SELECT * FROM view_table_6;
|
||||
CREATE VIEW aliased_opt_prop_view(alias_1, alias_2) AS SELECT * FROM view_table_6 table_name_for_view;
|
||||
|
||||
-- View options are supported
|
||||
CREATE VIEW opt_prop_view
|
||||
WITH(check_option=CASCADED, security_barrier=true)
|
||||
AS SELECT * FROM view_table_6;
|
||||
AS SELECT * FROM view_table_6 table_name_for_view;
|
||||
|
||||
CREATE VIEW sep_opt_prop_view
|
||||
AS SELECT * FROM view_table_6
|
||||
AS SELECT * FROM view_table_6 table_name_for_view
|
||||
WITH LOCAL CHECK OPTION;
|
||||
|
||||
SELECT * FROM (SELECT pg_identify_object_as_address(classid, objid, objsubid) as obj_identifier from pg_catalog.pg_dist_object) as obj_identifiers where obj_identifier::text like '%opt_prop_view%' ORDER BY 1;
|
||||
|
@ -273,7 +273,7 @@ CREATE OR REPLACE VIEW view_for_unsup_commands AS SELECT id FROM table_to_test_u
|
|||
CREATE TABLE alter_view_table(id int, val1 text);
|
||||
SELECT create_distributed_table('alter_view_table','id');
|
||||
|
||||
CREATE VIEW alter_view_1 AS SELECT * FROM alter_view_table;
|
||||
CREATE VIEW alter_view_1 AS SELECT * FROM alter_view_table table_name_for_view;
|
||||
|
||||
-- Set/drop default value is not supported by Citus
|
||||
ALTER VIEW alter_view_1 ALTER COLUMN val1 SET DEFAULT random()::text;
|
||||
|
|
Loading…
Reference in New Issue