This is an automated email from the ASF dual-hosted git repository.

avamingli pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/main by this push:
     new 0cd5c6067de Fix NULL locus of Shared Scan.
0cd5c6067de is described below

commit 0cd5c6067de85c50119a995a1477bd96aa1c4765
Author: Zhang Mingli <[email protected]>
AuthorDate: Mon Sep 29 17:38:32 2025 +0800

    Fix NULL locus of Shared Scan.
    
    The shared scan needs its locus type and parallel number to be
    explicitly set when `gp_cte_sharing` is used, even without
    parallelism. Failing to do so resulted in an incorrect NULL locus
    appearing in the query plan.
    
    Fix https://github.com/apache/cloudberry/issues/1376
    
    Authored-by: Zhang Mingli [email protected]
---
 src/backend/optimizer/plan/planshare.c      |  3 ++
 src/test/regress/expected/cbdb_parallel.out | 54 ++++++++++++++++++++++++++++-
 src/test/regress/sql/cbdb_parallel.sql      | 15 +++++++-
 3 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/src/backend/optimizer/plan/planshare.c 
b/src/backend/optimizer/plan/planshare.c
index f60f45f933e..f3b716364ca 100644
--- a/src/backend/optimizer/plan/planshare.c
+++ b/src/backend/optimizer/plan/planshare.c
@@ -52,6 +52,9 @@ make_shareinputscan(PlannerInfo *root, Plan *inputplan)
        sisc->scan.plan.plan_rows = inputplan->plan_rows;
        sisc->scan.plan.plan_width = inputplan->plan_width;
 
+       sisc->scan.plan.locustype = inputplan->locustype;
+       sisc->scan.plan.parallel = 0; /* No parallel ShareInputScan */
+
        return sisc;
 }
 
diff --git a/src/test/regress/expected/cbdb_parallel.out 
b/src/test/regress/expected/cbdb_parallel.out
index 942705e7471..da3216896ff 100644
--- a/src/test/regress/expected/cbdb_parallel.out
+++ b/src/test/regress/expected/cbdb_parallel.out
@@ -3516,7 +3516,59 @@ WHERE e.salary > (
  David
 (2 rows)
 
-  
+--
+-- Test https://github.com/apache/cloudberry/issues/1376
+--
+create table t1(a int, b int);
+NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'a' 
as the Apache Cloudberry data distribution key for this table.
+HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make 
sure column(s) chosen are the optimal data distribution key to minimize skew.
+create table t2 (like t1);
+NOTICE:  table doesn't have 'DISTRIBUTED BY' clause, defaulting to 
distribution columns from LIKE table
+set gp_cte_sharing = on;
+explain(locus, costs off) with x as
+  (select a, count(*) as b from t1 group by a union all
+    select a, count(*) as b from t2 group by a)
+  select count(*) from x a join x b on a.a = b.b;
+                               QUERY PLAN                               
+------------------------------------------------------------------------
+ Finalize Aggregate
+   Locus: Entry
+   ->  Gather Motion 3:1  (slice1; segments: 3)
+         Locus: Entry
+         ->  Partial Aggregate
+               Locus: Hashed
+               ->  Hash Join
+                     Locus: Hashed
+                     Hash Cond: (b.b = a.a)
+                     ->  Redistribute Motion 3:3  (slice2; segments: 3)
+                           Locus: Hashed
+                           Hash Key: b.b
+                           ->  Subquery Scan on b
+                                 Locus: Strewn
+                                 ->  Shared Scan (share slice:id 2:0)
+                                       Locus: Hashed
+                     ->  Hash
+                           Locus: Hashed
+                           ->  Subquery Scan on a
+                                 Locus: Hashed
+                                 ->  Shared Scan (share slice:id 1:0)
+                                       Locus: Hashed
+                                       ->  Append
+                                             Locus: Hashed
+                                             ->  HashAggregate
+                                                   Locus: Hashed
+                                                   Group Key: t1.a
+                                                   ->  Seq Scan on t1
+                                                         Locus: Hashed
+                                             ->  HashAggregate
+                                                   Locus: Hashed
+                                                   Group Key: t2.a
+                                                   ->  Seq Scan on t2
+                                                         Locus: Hashed
+ Optimizer: Postgres query optimizer
+(35 rows)
+
+reset gp_cte_sharing;
 reset enable_parallel;
 reset min_parallel_table_scan_size;
 -- start_ignore
diff --git a/src/test/regress/sql/cbdb_parallel.sql 
b/src/test/regress/sql/cbdb_parallel.sql
index 0ee6f72cb2a..f9d01dd8a00 100644
--- a/src/test/regress/sql/cbdb_parallel.sql
+++ b/src/test/regress/sql/cbdb_parallel.sql
@@ -1132,7 +1132,20 @@ WHERE e.salary > (
     SELECT AVG(salary)
     FROM employees
     WHERE department_id = e.department_id);
-  
+
+--
+-- Test https://github.com/apache/cloudberry/issues/1376
+--
+create table t1(a int, b int);
+create table t2 (like t1);
+set gp_cte_sharing = on;
+
+explain(locus, costs off) with x as
+  (select a, count(*) as b from t1 group by a union all
+    select a, count(*) as b from t2 group by a)
+  select count(*) from x a join x b on a.a = b.b;
+
+reset gp_cte_sharing;
 reset enable_parallel;
 reset min_parallel_table_scan_size;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to