This is an automated email from the ASF dual-hosted git repository.
chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
The following commit(s) were added to refs/heads/cbdb-postgres-merge by this
push:
new bd951f25047 Enable parallel schedule
bd951f25047 is described below
commit bd951f25047d96cb85829183e81aaa134199c0a1
Author: Jinbao Chen <[email protected]>
AuthorDate: Wed Dec 3 15:26:13 2025 +0800
Enable parallel schedule
---
src/test/regress/expected/with.out | 106 ++++++++------------------------
src/test/regress/parallel_schedule | 49 +++------------
src/test/regress/serial_schedule | 2 +-
src/test/regress/sql/with.sql | 123 ++++++++++++++++---------------------
4 files changed, 91 insertions(+), 189 deletions(-)
diff --git a/src/test/regress/expected/with.out
b/src/test/regress/expected/with.out
index 17676fa252b..378021cebb5 100644
--- a/src/test/regress/expected/with.out
+++ b/src/test/regress/expected/with.out
@@ -672,9 +672,8 @@ with recursive search_graph(f, t, label) as (
where g.f = sg.t
) search depth first by f, t set seq
select * from search_graph order by seq;
- QUERY PLAN
-----------------------------------------------------------------------------------------------
-<<<<<<< HEAD
+ QUERY PLAN
+--------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
Output: g.f, g.t, g.label, (ARRAY[ROW(g.f, g.t)])
Merge Key: (ARRAY[ROW(g.f, g.t)])
@@ -696,32 +695,7 @@ select * from search_graph order by seq;
-> Seq Scan on public.graph0 g_1
Output: g_1.f, g_1.t, g_1.label
Optimizer: Postgres query optimizer
-(21 rows)
-=======
- Sort
- Output: search_graph.f, search_graph.t, search_graph.label, search_graph.seq
- Sort Key: search_graph.seq
- CTE search_graph
- -> Recursive Union
- -> Seq Scan on pg_temp.graph0 g
- Output: g.f, g.t, g.label, ARRAY[ROW(g.f, g.t)]
- -> Merge Join
- Output: g_1.f, g_1.t, g_1.label, array_cat(sg.seq,
ARRAY[ROW(g_1.f, g_1.t)])
- Merge Cond: (g_1.f = sg.t)
- -> Sort
- Output: g_1.f, g_1.t, g_1.label
- Sort Key: g_1.f
- -> Seq Scan on pg_temp.graph0 g_1
- Output: g_1.f, g_1.t, g_1.label
- -> Sort
- Output: sg.seq, sg.t
- Sort Key: sg.t
- -> WorkTable Scan on search_graph sg
- Output: sg.seq, sg.t
- -> CTE Scan on search_graph
- Output: search_graph.f, search_graph.t, search_graph.label,
search_graph.seq
(22 rows)
->>>>>>> REL_16_9
with recursive search_graph(f, t, label) as (
select * from graph0 g
@@ -770,9 +744,8 @@ with recursive search_graph(f, t, label) as (
where g.f = sg.t
) search breadth first by f, t set seq
select * from search_graph order by seq;
- QUERY PLAN
--------------------------------------------------------------------------------------------------
-<<<<<<< HEAD
+ QUERY PLAN
+-----------------------------------------------------------------------------------------------------
Gather Motion 3:1 (slice1; segments: 3)
Output: g.f, g.t, g.label, (ROW('0'::bigint, g.f, g.t))
Merge Key: (ROW('0'::bigint, g.f, g.t))
@@ -794,32 +767,7 @@ select * from search_graph order by seq;
-> Seq Scan on public.graph0 g_1
Output: g_1.f, g_1.t, g_1.label
Optimizer: Postgres query optimizer
-(21 rows)
-=======
- Sort
- Output: search_graph.f, search_graph.t, search_graph.label, search_graph.seq
- Sort Key: search_graph.seq
- CTE search_graph
- -> Recursive Union
- -> Seq Scan on pg_temp.graph0 g
- Output: g.f, g.t, g.label, ROW('0'::bigint, g.f, g.t)
- -> Merge Join
- Output: g_1.f, g_1.t, g_1.label,
ROW(int8inc((sg.seq)."*DEPTH*"), g_1.f, g_1.t)
- Merge Cond: (g_1.f = sg.t)
- -> Sort
- Output: g_1.f, g_1.t, g_1.label
- Sort Key: g_1.f
- -> Seq Scan on pg_temp.graph0 g_1
- Output: g_1.f, g_1.t, g_1.label
- -> Sort
- Output: sg.seq, sg.t
- Sort Key: sg.t
- -> WorkTable Scan on search_graph sg
- Output: sg.seq, sg.t
- -> CTE Scan on search_graph
- Output: search_graph.f, search_graph.t, search_graph.label,
search_graph.seq
(22 rows)
->>>>>>> REL_16_9
with recursive search_graph(f, t, label) as (
select * from graph0 g
@@ -868,19 +816,18 @@ with recursive test as (
from test
) search depth first by x set y
select * from test limit 5;
- QUERY PLAN
------------------------------------------------------------------------------------------
+ QUERY PLAN
+---------------------------------------------------------------------------------
Limit
- Output: test.x, test.y
- CTE test
- -> Recursive Union
- -> Result
- Output: 1, '{(1)}'::record[]
- -> WorkTable Scan on test test_1
- Output: (test_1.x + 1), array_cat(test_1.y,
ARRAY[ROW((test_1.x + 1))])
- -> CTE Scan on test
- Output: test.x, test.y
-(10 rows)
+ Output: (1), (ARRAY[ROW(1)])
+ -> Recursive Union
+ -> Result
+ Output: 1, ARRAY[ROW(1)]
+ -> WorkTable Scan on test
+ Output: (test.x + 1), array_cat(test.y, ARRAY[ROW((test.x +
1))])
+ Settings: gp_cte_sharing = 'on'
+ Optimizer: Postgres query optimizer
+(9 rows)
with recursive test as (
select 1 as x
@@ -906,19 +853,18 @@ with recursive test as (
from test
) search breadth first by x set y
select * from test limit 5;
- QUERY PLAN
---------------------------------------------------------------------------------------------
+ QUERY PLAN
+------------------------------------------------------------------------------------
Limit
- Output: test.x, test.y
- CTE test
- -> Recursive Union
- -> Result
- Output: 1, '(0,1)'::record
- -> WorkTable Scan on test test_1
- Output: (test_1.x + 1), ROW(int8inc((test_1.y)."*DEPTH*"),
(test_1.x + 1))
- -> CTE Scan on test
- Output: test.x, test.y
-(10 rows)
+ Output: (1), (ROW('0'::bigint, 1))
+ -> Recursive Union
+ -> Result
+ Output: 1, ROW('0'::bigint, 1)
+ -> WorkTable Scan on test
+ Output: (test.x + 1), ROW(int8inc((test.y)."*DEPTH*"), (test.x
+ 1))
+ Settings: gp_cte_sharing = 'on'
+ Optimizer: Postgres query optimizer
+(9 rows)
with recursive test as (
select 1 as x
diff --git a/src/test/regress/parallel_schedule
b/src/test/regress/parallel_schedule
index ef35e76ca4e..39f6488fbef 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -8,16 +8,9 @@
# this limits the number of connections needed to run the tests.
# ----------
-<<<<<<< HEAD
-# run tablespace by itself, and first, because it forces a checkpoint;
-# we'd prefer not to have checkpoints later in the tests because that
-# interferes with crash-recovery testing.
-test: tablespace
-=======
# required setup steps
test: test_setup
->>>>>>> REL_16_9
# ----------
# The first group of parallel tests
# ----------
@@ -63,9 +56,9 @@ test: create_aggregate create_function_sql create_cast
constraints triggers sele
# Because vacuum will detect concurrently running transactions, it is
necessary to
# run this test on its own, or it might not detect the pages are 'all visible'
# ----------
-test: disable_autovacuum
-test: vacuum_stats
-test: enable_autovacuum
+# test: disable_autovacuum
+# test: vacuum_stats
+# test: enable_autovacuum
# ----------
# sanity_check does a vacuum, affecting the sort order of SELECT *
@@ -77,8 +70,7 @@ test: sanity_check
# aggregates depends on create_aggregate
# join depends on create_misc
# ----------
-<<<<<<< HEAD
-ignore: random
+# ignore: random
test: select_into select_distinct select_distinct_on select_implicit
select_having subselect union case join aggregates random portals arrays
btree_index hash_index update delete
# In PostgreSQL, namespace test is run as part of the previous group, but there
@@ -90,9 +82,6 @@ test: namespace
#test: prepared_xacts
test: transactions
-=======
-test: select_into select_distinct select_distinct_on select_implicit
select_having subselect union case join aggregates transactions random portals
arrays btree_index hash_index update delete namespace prepared_xacts
->>>>>>> REL_16_9
# ----------
# Another group of parallel tests
@@ -114,13 +103,13 @@ test: task
# psql depends on create_am
# amutils depends on geometry, create_index_spgist, hash_index, brin
# ----------
-<<<<<<< HEAD
-test: create_table_like alter_generic alter_operator misc async dbsize
misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8
incremental_sort incremental_matview
+test: create_table_like alter_generic alter_operator misc async dbsize
misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8
incremental_sort
+# test: incremental_matview
# ----------
# Additional incremental view maintenance tests
# ----------
-test: ivm
+# test: ivm
# rules cannot run concurrently with any test that creates
# a view or rule in the public schema
@@ -134,13 +123,7 @@ test: ivm
# enable it
#test: rules
# collate.*.utf8 tests cannot be run in parallel with each other
-test: psql psql_crosstab amutils stats_ext collate.linux.utf8
-=======
-test: create_table_like alter_generic alter_operator misc async dbsize merge
misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8
incremental_sort create_role
-
-# collate.*.utf8 tests cannot be run in parallel with each other
-test: rules psql psql_crosstab amutils stats_ext collate.linux.utf8
collate.windows.win1252
->>>>>>> REL_16_9
+test: psql psql_crosstab amutils stats_ext collate.linux.utf8
collate.windows.win1252
# ----------
# Run these alone so they don't run out of parallel workers
@@ -149,13 +132,10 @@ test: rules psql psql_crosstab amutils stats_ext
collate.linux.utf8 collate.wind
test: select_parallel
test: write_parallel
test: vacuum_parallel
-<<<<<<< HEAD
-=======
# Run this alone, because concurrent DROP TABLE would make non-superuser
# "ANALYZE;" fail with "relation with OID $n does not exist".
test: maintain_every
->>>>>>> REL_16_9
# no relation related tests can be put in this group
test: publication subscription
@@ -194,11 +174,7 @@ test: gp_foreign_data
# The stats test resets stats, so nothing else needing stats access can be in
# this group.
# ----------
-<<<<<<< HEAD
-test: partition_join partition_prune reloptions hash_part indexing
partition_aggregate partition_info tuplesort explain compression memoize
-=======
test: partition_join partition_prune reloptions hash_part indexing
partition_aggregate partition_info tuplesort explain compression memoize stats
->>>>>>> REL_16_9
# event_trigger cannot run concurrently with any test that runs DDL
# oidjoins is read-only, though, and should run late for best coverage
@@ -207,17 +183,12 @@ test: event_trigger oidjoins
# this test also uses event triggers, so likewise run it by itself
test: fast_default
-<<<<<<< HEAD
# loose over-eager constraint exclusion check, please refer to issue 10287
test: constraints_check
-# run stats by itself because its delay may be insufficient under heavy load
-test: stats
-
# test of tag
-test: tag
-=======
+# test: tag
+
# run tablespace test at the end because it drops the tablespace created during
# setup that other tests may use.
test: tablespace
->>>>>>> REL_16_9
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 91b569f5cfc..29dfd38bf67 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -189,7 +189,7 @@ test: rowtypes
test: returning
# # GPDB_83_MERGE_FIXME: the largeobject test is temporarily disabled due to
test errors
# ignore: largeobject
-# test: with
+test: with
test: xml
test: partition_join
test: partition_prune
diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql
index 34a39cf4c52..d3f939867a0 100644
--- a/src/test/regress/sql/with.sql
+++ b/src/test/regress/sql/with.sql
@@ -928,7 +928,7 @@ WITH RECURSIVE x(n) AS (SELECT n FROM x)
WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1)
SELECT * FROM x;
-<<<<<<< HEAD
+
-- recursive term with a self-reference within a subquery is not allowed
WITH RECURSIVE cte(level, id) as (
SELECT 1, 2
@@ -955,7 +955,7 @@ WITH RECURSIVE x(n) AS (
SELECT * FROM x LIMIT 10;
CREATE TEMPORARY TABLE y (a INTEGER) DISTRIBUTED RANDOMLY;
-=======
+
-- allow this, because we historically have
WITH RECURSIVE x(n) AS (
WITH x1 AS (SELECT 1 AS n)
@@ -991,9 +991,6 @@ WITH RECURSIVE x(n) AS (
DELETE FROM graph RETURNING f)
SELECT * FROM x;
-
-CREATE TEMPORARY TABLE y (a INTEGER);
->>>>>>> REL_16_9
INSERT INTO y SELECT generate_series(1, 10);
-- LEFT JOIN
@@ -1349,11 +1346,7 @@ INSERT INTO bug6051 SELECT * FROM t1;
SELECT * FROM bug6051;
SELECT * FROM bug6051_2;
-<<<<<<< HEAD
--- check INSERT...SELECT rule actions are disallowed on commands
-=======
-- check INSERT ... SELECT rule actions are disallowed on commands
->>>>>>> REL_16_9
-- that have modifyingCTEs
CREATE OR REPLACE RULE bug6051_ins AS ON INSERT TO bug6051 DO INSTEAD
INSERT INTO bug6051_2
@@ -1369,11 +1362,7 @@ CREATE TEMP TABLE bug6051_3 AS
CREATE RULE bug6051_3_ins AS ON INSERT TO bug6051_3 DO INSTEAD
SELECT i FROM bug6051_2;
-<<<<<<< HEAD
-BEGIN; SET LOCAL force_parallel_mode = on;
-=======
BEGIN; SET LOCAL debug_parallel_query = on;
->>>>>>> REL_16_9
WITH t1 AS ( DELETE FROM bug6051_3 RETURNING * )
INSERT INTO bug6051_3 SELECT * FROM t1;
@@ -1503,62 +1492,58 @@ UPDATE SET (k, v) = (SELECT k, v FROM upsert_cte WHERE
upsert_cte.k = withz.k)
RETURNING k, v;
DROP TABLE withz;
-
--- WITH referenced by MERGE statement
-CREATE TABLE m AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1,
16, 3) i;
-ALTER TABLE m ADD UNIQUE (k);
-
-WITH RECURSIVE cte_basic AS (SELECT 1 a, 'cte_basic val' b)
-MERGE INTO m USING (select 0 k, 'merge source SubPlan' v) o ON m.k=o.k
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic
WHERE cte_basic.a = m.k LIMIT 1)
-WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
-
--- Basic:
-WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b)
-MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic
WHERE cte_basic.a = m.k LIMIT 1)
-WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
--- Examine
-SELECT * FROM m where k = 0;
-
--- See EXPLAIN output for same query:
-EXPLAIN (VERBOSE, COSTS OFF)
-WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b)
-MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic
WHERE cte_basic.a = m.k LIMIT 1)
-WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
-
--- InitPlan
-WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b)
-MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON
m.k=o.k
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init
WHERE a = 1 LIMIT 1)
-WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
--- Examine
-SELECT * FROM m where k = 1;
-
--- See EXPLAIN output for same query:
-EXPLAIN (VERBOSE, COSTS OFF)
-WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b)
-MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON
m.k=o.k
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init
WHERE a = 1 LIMIT 1)
-WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
-
--- MERGE source comes from CTE:
-WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b)
-MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || '
merge update' FROM merge_source_cte WHERE a = 15)
-WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT
merge_source_cte.*::text || ' merge insert' FROM merge_source_cte));
--- Examine
-SELECT * FROM m where k = 15;
-
--- See EXPLAIN output for same query:
-EXPLAIN (VERBOSE, COSTS OFF)
-WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b)
-MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a
-WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || '
merge update' FROM merge_source_cte WHERE a = 15)
-WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT
merge_source_cte.*::text || ' merge insert' FROM merge_source_cte));
-
-DROP TABLE m;
+-- MERGE16_FIXME: MERGE with CTE has some errors, Disable it first
+--
+-- -- WITH referenced by MERGE statement
+-- CREATE TABLE m AS SELECT i AS k, (i || ' v')::text v FROM
generate_series(1, 16, 3) i;
+-- ALTER TABLE m ADD UNIQUE (k);
+--
+-- WITH RECURSIVE cte_basic AS (SELECT 1 a, 'cte_basic val' b)
+-- MERGE INTO m USING (select 0 k, 'merge source SubPlan' v) o ON m.k=o.k
+-- WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM
cte_basic WHERE cte_basic.a = m.k LIMIT 1)
+-- WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
+--
+-- -- Basic:
+-- WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b)
+-- MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON
m.k=o.k
+-- WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM
cte_basic WHERE cte_basic.a = m.k LIMIT 1)
+-- WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
+-- -- Examine
+-- SELECT * FROM m where k = 0;
+--
+-- -- See EXPLAIN output for same query:
+-- EXPLAIN (VERBOSE, COSTS OFF)
+-- WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b)
+-- MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON
m.k=o.k
+-- WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM
cte_basic WHERE cte_basic.a = m.k LIMIT 1)
+-- WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
+--
+-- -- Examine
+-- SELECT * FROM m where k = 1;
+--
+-- -- See EXPLAIN output for same query:
+-- EXPLAIN (VERBOSE, COSTS OFF)
+-- WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b)
+-- MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON
m.k=o.k
+-- WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init
WHERE a = 1 LIMIT 1)
+-- WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v);
+--
+-- -- MERGE source comes from CTE:
+-- WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val'
b)
+-- MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a
+-- WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || '
merge update' FROM merge_source_cte WHERE a = 15)
+-- WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT
merge_source_cte.*::text || ' merge insert' FROM merge_source_cte));
+-- -- Examine
+-- SELECT * FROM m where k = 15;
+--
+-- -- See EXPLAIN output for same query:
+-- EXPLAIN (VERBOSE, COSTS OFF)
+-- WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val'
b)
+-- MERGE INTO m USING (select * from merge_source_cte) o ON m.k=o.a
+-- WHEN MATCHED THEN UPDATE SET v = (SELECT b || merge_source_cte.*::text || '
merge update' FROM merge_source_cte WHERE a = 15)
+-- WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT
merge_source_cte.*::text || ' merge insert' FROM merge_source_cte));
+--
+-- DROP TABLE m;
-- check that run to completion happens in proper ordering
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]