mirror of https://github.com/citusdata/citus.git
Add tests for [NOT] MATERIALEZED
parent
326dfab44a
commit
fe3827e499
|
@ -37,6 +37,24 @@ DEBUG: Plan is router executable
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- Should still not be inlined even if NOT MATERIALIZED is passed
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
*, (SELECT 1)
|
||||||
|
FROM
|
||||||
|
cte_1;
|
||||||
|
DEBUG: CTE cte_1 is going to be inlined via distributed planning
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE cte_1: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT key, value, other_value, (SELECT 1) FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) cte_1
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
key | value | other_value | ?column?
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- the cte can be inlined because the unsupported
|
-- the cte can be inlined because the unsupported
|
||||||
-- part of the query (subquery in WHERE clause)
|
-- part of the query (subquery in WHERE clause)
|
||||||
-- doesn't access the cte
|
-- doesn't access the cte
|
||||||
|
@ -275,6 +293,98 @@ DETAIL: distribution column value: 1
|
||||||
0
|
0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- explicitely using NOT MATERIALIZED should result in the same
|
||||||
|
WITH a AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
DEBUG: CTE a is going to be inlined via distributed planning
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
DETAIL: distribution column value: 1
|
||||||
|
count
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
0
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- using MATERIALIZED should cause inlining not to happen
|
||||||
|
WITH a AS MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE a: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) a WHERE (key OPERATOR(pg_catalog.=) 1)
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
count
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
0
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- EXPLAIN should show the difference between materialized an not materialized
|
||||||
|
EXPLAIN (COSTS OFF) WITH a AS (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
DEBUG: CTE a is going to be inlined via distributed planning
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
DETAIL: distribution column value: 1
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Custom Scan (Citus Adaptive)
|
||||||
|
Task Count: 1
|
||||||
|
Tasks Shown: All
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Aggregate
|
||||||
|
-> Seq Scan on test_table_1960000 test_table
|
||||||
|
Filter: (key = 1)
|
||||||
|
(8 rows)
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) WITH a AS MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE a: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) a WHERE (key OPERATOR(pg_catalog.=) 1)
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Custom Scan (Citus Adaptive)
|
||||||
|
-> Distributed Subplan XXX_1
|
||||||
|
-> Custom Scan (Citus Adaptive)
|
||||||
|
Task Count: 4
|
||||||
|
Tasks Shown: One of 4
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Seq Scan on test_table_1960000 test_table
|
||||||
|
Task Count: 1
|
||||||
|
Tasks Shown: All
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Aggregate
|
||||||
|
-> Function Scan on read_intermediate_result intermediate_result
|
||||||
|
Filter: (key = 1)
|
||||||
|
(15 rows)
|
||||||
|
|
||||||
-- citus should not inline the CTE because it is used multiple times
|
-- citus should not inline the CTE because it is used multiple times
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -295,6 +405,112 @@ DEBUG: Plan is router executable
|
||||||
0
|
0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should cause the query to be inlined twice
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
DEBUG: CTE cte_1 is going to be inlined via distributed planning
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: join prunable for intervals [-2147483648,-1073741825] and [-1073741824,-1]
|
||||||
|
DEBUG: join prunable for intervals [-2147483648,-1073741825] and [0,1073741823]
|
||||||
|
DEBUG: join prunable for intervals [-2147483648,-1073741825] and [1073741824,2147483647]
|
||||||
|
DEBUG: join prunable for intervals [-1073741824,-1] and [-2147483648,-1073741825]
|
||||||
|
DEBUG: join prunable for intervals [-1073741824,-1] and [0,1073741823]
|
||||||
|
DEBUG: join prunable for intervals [-1073741824,-1] and [1073741824,2147483647]
|
||||||
|
DEBUG: join prunable for intervals [0,1073741823] and [-2147483648,-1073741825]
|
||||||
|
DEBUG: join prunable for intervals [0,1073741823] and [-1073741824,-1]
|
||||||
|
DEBUG: join prunable for intervals [0,1073741823] and [1073741824,2147483647]
|
||||||
|
DEBUG: join prunable for intervals [1073741824,2147483647] and [-2147483648,-1073741825]
|
||||||
|
DEBUG: join prunable for intervals [1073741824,2147483647] and [-1073741824,-1]
|
||||||
|
DEBUG: join prunable for intervals [1073741824,2147483647] and [0,1073741823]
|
||||||
|
count
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
0
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- EXPLAIN should show the differences between MATERIALIZED and NOT MATERIALIZED
|
||||||
|
EXPLAIN (COSTS OFF) WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE cte_1: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM ((SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) first_entry JOIN (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) second_entry USING (key))
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Custom Scan (Citus Adaptive)
|
||||||
|
-> Distributed Subplan XXX_1
|
||||||
|
-> Custom Scan (Citus Adaptive)
|
||||||
|
Task Count: 4
|
||||||
|
Tasks Shown: One of 4
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Seq Scan on test_table_1960000 test_table
|
||||||
|
Task Count: 1
|
||||||
|
Tasks Shown: All
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Aggregate
|
||||||
|
-> Merge Join
|
||||||
|
Merge Cond: (intermediate_result.key = intermediate_result_1.key)
|
||||||
|
-> Sort
|
||||||
|
Sort Key: intermediate_result.key
|
||||||
|
-> Function Scan on read_intermediate_result intermediate_result
|
||||||
|
-> Sort
|
||||||
|
Sort Key: intermediate_result_1.key
|
||||||
|
-> Function Scan on read_intermediate_result intermediate_result_1
|
||||||
|
(21 rows)
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
DEBUG: CTE cte_1 is going to be inlined via distributed planning
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: join prunable for intervals [-2147483648,-1073741825] and [-1073741824,-1]
|
||||||
|
DEBUG: join prunable for intervals [-2147483648,-1073741825] and [0,1073741823]
|
||||||
|
DEBUG: join prunable for intervals [-2147483648,-1073741825] and [1073741824,2147483647]
|
||||||
|
DEBUG: join prunable for intervals [-1073741824,-1] and [-2147483648,-1073741825]
|
||||||
|
DEBUG: join prunable for intervals [-1073741824,-1] and [0,1073741823]
|
||||||
|
DEBUG: join prunable for intervals [-1073741824,-1] and [1073741824,2147483647]
|
||||||
|
DEBUG: join prunable for intervals [0,1073741823] and [-2147483648,-1073741825]
|
||||||
|
DEBUG: join prunable for intervals [0,1073741823] and [-1073741824,-1]
|
||||||
|
DEBUG: join prunable for intervals [0,1073741823] and [1073741824,2147483647]
|
||||||
|
DEBUG: join prunable for intervals [1073741824,2147483647] and [-2147483648,-1073741825]
|
||||||
|
DEBUG: join prunable for intervals [1073741824,2147483647] and [-1073741824,-1]
|
||||||
|
DEBUG: join prunable for intervals [1073741824,2147483647] and [0,1073741823]
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Aggregate
|
||||||
|
-> Custom Scan (Citus Adaptive)
|
||||||
|
Task Count: 4
|
||||||
|
Tasks Shown: One of 4
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Aggregate
|
||||||
|
-> Hash Join
|
||||||
|
Hash Cond: (test_table.key = test_table_1.key)
|
||||||
|
-> Seq Scan on test_table_1960000 test_table
|
||||||
|
-> Hash
|
||||||
|
-> Seq Scan on test_table_1960000 test_table_1
|
||||||
|
(12 rows)
|
||||||
|
|
||||||
-- ctes with volatile functions are not
|
-- ctes with volatile functions are not
|
||||||
-- inlined
|
-- inlined
|
||||||
WITH cte_1 AS (SELECT *, random() FROM test_table)
|
WITH cte_1 AS (SELECT *, random() FROM test_table)
|
||||||
|
@ -312,6 +528,22 @@ DEBUG: Plan is router executable
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- even with NOT MATERIALIZED volatile functions should not be inlined
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT *, random() FROM test_table)
|
||||||
|
SELECT
|
||||||
|
*
|
||||||
|
FROM
|
||||||
|
cte_1;
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE cte_1: SELECT key, value, other_value, random() AS random FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT key, value, other_value, random FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value, intermediate_result.random FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb, random double precision)) cte_1
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
key | value | other_value | random
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- cte_1 should be able to inlined even if
|
-- cte_1 should be able to inlined even if
|
||||||
-- it is used one level below
|
-- it is used one level below
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
|
@ -622,6 +854,16 @@ DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: DELETE FROM cte_inline.test_table WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT cte_1.key FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) cte_1)))
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: DELETE FROM cte_inline.test_table WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT cte_1.key FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) cte_1)))
|
||||||
DEBUG: Creating router plan
|
DEBUG: Creating router plan
|
||||||
DEBUG: Plan is router executable
|
DEBUG: Plan is router executable
|
||||||
|
-- NOT MATERIALIZED should not CTEs that are used in a modifying query, because
|
||||||
|
-- we de still don't support it
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
DELETE FROM test_table WHERE key NOT IN (SELECT key FROM cte_1);
|
||||||
|
DEBUG: complex joins are only supported when all distributed tables are co-located and joined on their distribution columns
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE cte_1: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: DELETE FROM cte_inline.test_table WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT cte_1.key FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) cte_1)))
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
-- we don't inline CTEs if they are modifying CTEs
|
-- we don't inline CTEs if they are modifying CTEs
|
||||||
WITH cte_1 AS (DELETE FROM test_table RETURNING key)
|
WITH cte_1 AS (DELETE FROM test_table RETURNING key)
|
||||||
SELECT * FROM cte_1;
|
SELECT * FROM cte_1;
|
||||||
|
@ -636,6 +878,20 @@ DEBUG: Plan is router executable
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should not affect modifying CTEs
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (DELETE FROM test_table RETURNING key)
|
||||||
|
SELECT * FROM cte_1;
|
||||||
|
DEBUG: data-modifying statements are not supported in the WITH clauses of distributed queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE cte_1: DELETE FROM cte_inline.test_table RETURNING key
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT key FROM (SELECT intermediate_result.key FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer)) cte_1
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
key
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- cte with column aliases
|
-- cte with column aliases
|
||||||
SELECT * FROM test_table,
|
SELECT * FROM test_table,
|
||||||
(WITH cte_1 (x,y) AS (SELECT * FROM test_table),
|
(WITH cte_1 (x,y) AS (SELECT * FROM test_table),
|
||||||
|
|
|
@ -37,6 +37,13 @@ DEBUG: Plan is router executable
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- Should still not be inlined even if NOT MATERIALIZED is passed
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
*, (SELECT 1)
|
||||||
|
FROM
|
||||||
|
cte_1;
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
-- the cte can be inlined because the unsupported
|
-- the cte can be inlined because the unsupported
|
||||||
-- part of the query (subquery in WHERE clause)
|
-- part of the query (subquery in WHERE clause)
|
||||||
-- doesn't access the cte
|
-- doesn't access the cte
|
||||||
|
@ -279,6 +286,67 @@ DEBUG: Plan is router executable
|
||||||
0
|
0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- explicitely using NOT MATERIALIZED should result in the same
|
||||||
|
WITH a AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
|
-- using MATERIALIZED should cause inlining not to happen
|
||||||
|
WITH a AS MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
ERROR: syntax error at or near "MATERIALIZED"
|
||||||
|
-- EXPLAIN should show the difference between materialized an not materialized
|
||||||
|
EXPLAIN (COSTS OFF) WITH a AS (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
DEBUG: CTE a is going to be inlined via distributed planning
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE a: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) a WHERE (key OPERATOR(pg_catalog.=) 1)
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Custom Scan (Citus Adaptive)
|
||||||
|
-> Distributed Subplan XXX_1
|
||||||
|
-> Custom Scan (Citus Adaptive)
|
||||||
|
Task Count: 4
|
||||||
|
Tasks Shown: One of 4
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Seq Scan on test_table_1960000 test_table
|
||||||
|
Task Count: 1
|
||||||
|
Tasks Shown: All
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Aggregate
|
||||||
|
-> Function Scan on read_intermediate_result intermediate_result
|
||||||
|
Filter: (key = 1)
|
||||||
|
(15 rows)
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) WITH a AS MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
ERROR: syntax error at or near "MATERIALIZED"
|
||||||
-- citus should not inline the CTE because it is used multiple times
|
-- citus should not inline the CTE because it is used multiple times
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -299,6 +367,65 @@ DEBUG: Plan is router executable
|
||||||
0
|
0
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should cause the query to be inlined twice
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
|
-- EXPLAIN should show the differences between MATERIALIZED and NOT MATERIALIZED
|
||||||
|
EXPLAIN (COSTS OFF) WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: generating subplan XXX_1 for CTE cte_1: SELECT key, value, other_value FROM cte_inline.test_table
|
||||||
|
DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: SELECT count(*) AS count FROM ((SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) first_entry JOIN (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) second_entry USING (key))
|
||||||
|
DEBUG: Creating router plan
|
||||||
|
DEBUG: Plan is router executable
|
||||||
|
QUERY PLAN
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
Custom Scan (Citus Adaptive)
|
||||||
|
-> Distributed Subplan XXX_1
|
||||||
|
-> Custom Scan (Citus Adaptive)
|
||||||
|
Task Count: 4
|
||||||
|
Tasks Shown: One of 4
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Seq Scan on test_table_1960000 test_table
|
||||||
|
Task Count: 1
|
||||||
|
Tasks Shown: All
|
||||||
|
-> Task
|
||||||
|
Node: host=localhost port=xxxxx dbname=regression
|
||||||
|
-> Aggregate
|
||||||
|
-> Merge Join
|
||||||
|
Merge Cond: (intermediate_result.key = intermediate_result_1.key)
|
||||||
|
-> Sort
|
||||||
|
Sort Key: intermediate_result.key
|
||||||
|
-> Function Scan on read_intermediate_result intermediate_result
|
||||||
|
-> Sort
|
||||||
|
Sort Key: intermediate_result_1.key
|
||||||
|
-> Function Scan on read_intermediate_result intermediate_result_1
|
||||||
|
(21 rows)
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
-- ctes with volatile functions are not
|
-- ctes with volatile functions are not
|
||||||
-- inlined
|
-- inlined
|
||||||
WITH cte_1 AS (SELECT *, random() FROM test_table)
|
WITH cte_1 AS (SELECT *, random() FROM test_table)
|
||||||
|
@ -316,6 +443,13 @@ DEBUG: Plan is router executable
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- even with NOT MATERIALIZED volatile functions should not be inlined
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT *, random() FROM test_table)
|
||||||
|
SELECT
|
||||||
|
*
|
||||||
|
FROM
|
||||||
|
cte_1;
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
-- cte_1 should be able to inlined even if
|
-- cte_1 should be able to inlined even if
|
||||||
-- it is used one level below
|
-- it is used one level below
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
|
@ -692,6 +826,11 @@ DEBUG: Router planner cannot handle multi-shard select queries
|
||||||
DEBUG: Plan XXX query after replacing subqueries and CTEs: DELETE FROM cte_inline.test_table WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT cte_1.key FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) cte_1)))
|
DEBUG: Plan XXX query after replacing subqueries and CTEs: DELETE FROM cte_inline.test_table WHERE (NOT (key OPERATOR(pg_catalog.=) ANY (SELECT cte_1.key FROM (SELECT intermediate_result.key, intermediate_result.value, intermediate_result.other_value FROM read_intermediate_result('XXX_1'::text, 'binary'::citus_copy_format) intermediate_result(key integer, value text, other_value jsonb)) cte_1)))
|
||||||
DEBUG: Creating router plan
|
DEBUG: Creating router plan
|
||||||
DEBUG: Plan is router executable
|
DEBUG: Plan is router executable
|
||||||
|
-- NOT MATERIALIZED should not CTEs that are used in a modifying query, because
|
||||||
|
-- we de still don't support it
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
DELETE FROM test_table WHERE key NOT IN (SELECT key FROM cte_1);
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
-- we don't inline CTEs if they are modifying CTEs
|
-- we don't inline CTEs if they are modifying CTEs
|
||||||
WITH cte_1 AS (DELETE FROM test_table RETURNING key)
|
WITH cte_1 AS (DELETE FROM test_table RETURNING key)
|
||||||
SELECT * FROM cte_1;
|
SELECT * FROM cte_1;
|
||||||
|
@ -706,6 +845,10 @@ DEBUG: Plan is router executable
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should not affect modifying CTEs
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (DELETE FROM test_table RETURNING key)
|
||||||
|
SELECT * FROM cte_1;
|
||||||
|
ERROR: syntax error at or near "NOT"
|
||||||
-- cte with column aliases
|
-- cte with column aliases
|
||||||
SELECT * FROM test_table,
|
SELECT * FROM test_table,
|
||||||
(WITH cte_1 (x,y) AS (SELECT * FROM test_table),
|
(WITH cte_1 (x,y) AS (SELECT * FROM test_table),
|
||||||
|
|
|
@ -19,6 +19,13 @@ SELECT
|
||||||
FROM
|
FROM
|
||||||
cte_1;
|
cte_1;
|
||||||
|
|
||||||
|
-- Should still not be inlined even if NOT MATERIALIZED is passed
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
*, (SELECT 1)
|
||||||
|
FROM
|
||||||
|
cte_1;
|
||||||
|
|
||||||
-- the cte can be inlined because the unsupported
|
-- the cte can be inlined because the unsupported
|
||||||
-- part of the query (subquery in WHERE clause)
|
-- part of the query (subquery in WHERE clause)
|
||||||
-- doesn't access the cte
|
-- doesn't access the cte
|
||||||
|
@ -152,6 +159,42 @@ FROM
|
||||||
WHERE
|
WHERE
|
||||||
key = 1;
|
key = 1;
|
||||||
|
|
||||||
|
-- explicitely using NOT MATERIALIZED should result in the same
|
||||||
|
WITH a AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
|
||||||
|
-- using MATERIALIZED should cause inlining not to happen
|
||||||
|
WITH a AS MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
|
||||||
|
-- EXPLAIN should show the difference between materialized an not materialized
|
||||||
|
EXPLAIN (COSTS OFF) WITH a AS (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) WITH a AS MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
a
|
||||||
|
WHERE
|
||||||
|
key = 1;
|
||||||
|
|
||||||
|
|
||||||
-- citus should not inline the CTE because it is used multiple times
|
-- citus should not inline the CTE because it is used multiple times
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -162,6 +205,37 @@ FROM
|
||||||
cte_1 as second_entry
|
cte_1 as second_entry
|
||||||
USING (key);
|
USING (key);
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should cause the query to be inlined twice
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
|
||||||
|
-- EXPLAIN should show the differences between MATERIALIZED and NOT MATERIALIZED
|
||||||
|
EXPLAIN (COSTS OFF) WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
|
||||||
|
EXPLAIN (COSTS OFF) WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
SELECT
|
||||||
|
count(*)
|
||||||
|
FROM
|
||||||
|
cte_1 as first_entry
|
||||||
|
JOIN
|
||||||
|
cte_1 as second_entry
|
||||||
|
USING (key);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- ctes with volatile functions are not
|
-- ctes with volatile functions are not
|
||||||
-- inlined
|
-- inlined
|
||||||
WITH cte_1 AS (SELECT *, random() FROM test_table)
|
WITH cte_1 AS (SELECT *, random() FROM test_table)
|
||||||
|
@ -170,6 +244,14 @@ SELECT
|
||||||
FROM
|
FROM
|
||||||
cte_1;
|
cte_1;
|
||||||
|
|
||||||
|
-- even with NOT MATERIALIZED volatile functions should not be inlined
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT *, random() FROM test_table)
|
||||||
|
SELECT
|
||||||
|
*
|
||||||
|
FROM
|
||||||
|
cte_1;
|
||||||
|
|
||||||
|
|
||||||
-- cte_1 should be able to inlined even if
|
-- cte_1 should be able to inlined even if
|
||||||
-- it is used one level below
|
-- it is used one level below
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
|
@ -347,10 +429,19 @@ WITH fist_table_cte AS
|
||||||
WITH cte_1 AS (SELECT * FROM test_table)
|
WITH cte_1 AS (SELECT * FROM test_table)
|
||||||
DELETE FROM test_table WHERE key NOT IN (SELECT key FROM cte_1);
|
DELETE FROM test_table WHERE key NOT IN (SELECT key FROM cte_1);
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should not CTEs that are used in a modifying query, because
|
||||||
|
-- we de still don't support it
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (SELECT * FROM test_table)
|
||||||
|
DELETE FROM test_table WHERE key NOT IN (SELECT key FROM cte_1);
|
||||||
|
|
||||||
-- we don't inline CTEs if they are modifying CTEs
|
-- we don't inline CTEs if they are modifying CTEs
|
||||||
WITH cte_1 AS (DELETE FROM test_table RETURNING key)
|
WITH cte_1 AS (DELETE FROM test_table RETURNING key)
|
||||||
SELECT * FROM cte_1;
|
SELECT * FROM cte_1;
|
||||||
|
|
||||||
|
-- NOT MATERIALIZED should not affect modifying CTEs
|
||||||
|
WITH cte_1 AS NOT MATERIALIZED (DELETE FROM test_table RETURNING key)
|
||||||
|
SELECT * FROM cte_1;
|
||||||
|
|
||||||
-- cte with column aliases
|
-- cte with column aliases
|
||||||
SELECT * FROM test_table,
|
SELECT * FROM test_table,
|
||||||
(WITH cte_1 (x,y) AS (SELECT * FROM test_table),
|
(WITH cte_1 (x,y) AS (SELECT * FROM test_table),
|
||||||
|
|
Loading…
Reference in New Issue