Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[Bug] ORCA misses direct dispatch for multi-value predicates (IN / OR of equalities) on the distribution key

Aperta
#1,839 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
68/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
c, postgresql, sql

Direzione di ricerca

Inizia dal percorso di traduzione DXL-to-PlannedStmt e analizza come viene popolato PlanSlice->directDispatch.contentIds, confrontandolo con MergeDirectDispatchCalculationInfo in src/backend/cdb/cdbmutate.c e con la linea di discendenza di directdispatch.c. Riproduci il problema usando gli esempi SQL a tre segmenti, con l’optimizer attivato e disattivato, includendo sia predicati IN sia predicati OR espliciti. Il lavoro è completato quando ORCA segnala ed esegue il dispatch solo verso l’unione dei segmenti target per i predicati con più valori sulla chiave di distribuzione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

type: Bug
Apache Cloudberry version

All versions

What happened

For a predicate that restricts the distribution key to a small set of
constants, e.g. WHERE dist_key IN (c1, c2), GPORCA only performs direct
dispatch when ALL values happen to hash to the SAME segment. If the values
hash to different segments, ORCA gives up entirely and dispatches the slice
to every segment, while the Postgres planner correctly direct-dispatches to
the union of the target segments.

Results are correct — this is a performance issue (missed direct dispatch),
not a wrong-results bug. I'm filing it as a bug rather than a feature request
because the optimizer side already emits the complete multi-value dispatch
info into the DXL plan, and the DXL-to-PlannedStmt translator silently drops
it (details in "Anything else").

What you think should happen instead

ORCA should dispatch to the union of the segments the constants hash to,
like the Postgres planner does (see MergeDirectDispatchCalculationInfo in
src/backend/cdb/cdbmutate.c / directdispatch.c lineage). For the
reproduction below, the planner produces:

  Gather Motion 2:1  (slice1; segments: 2)
  INFO:  (slice 1) Dispatch command to PARTIAL contents: 1 2

while ORCA produces:

  Gather Motion 3:1  (slice1; segments: 3)
  INFO:  (slice 1) Dispatch command to ALL contents: 0 1 2

The infrastructure already supports this: PlanSlice->directDispatch.contentIds
is a List, and the dispatcher handles multiple content ids today (the planner
populates it with more than one; so does ORCA's own raw-values path for
gp_segment_id IN (...) predicates on randomly distributed tables).

How to reproduce

On a 3-segment demo cluster:

create table t_dd (a int, b text) distributed by (a);
insert into t_dd select i, 'x' from generate_series(1, 10) i;
-- on my cluster: a=1 -> seg1, a=2,3 -> seg0, a=5 -> seg2
-- (cdbhash of int is deterministic, so a 3-segment cluster gets the same mapping)

set gp_test_print_direct_dispatch_info = on;

set optimizer = on;
explain (costs off) select * from t_dd where a in (1, 5);
--  Gather Motion 3:1  (slice1; segments: 3)      <-- all segments
select * from t_dd where a in (1, 5);
--  INFO:  (slice 1) Dispatch command to ALL contents: 0 1 2

explain (costs off) select * from t_dd where a in (2, 3);
--  Gather Motion 1:1  (slice1; segments: 1)      <-- works, but only because
--                                                    both values hash to seg0
set optimizer = off;
explain (costs off) select * from t_dd where a in (1, 5);
--  Gather Motion 2:1  (slice1; segments: 2)      <-- planner dispatches to
select * from t_dd where a in (1, 5);             --    the union {seg1, seg2}
--  INFO:  (slice 1) Dispatch command to PARTIAL contents: 1 2

The explicit OR form (a = 1 or a = 5) behaves the same way.

Operating System

Rocky Linux 9.5

Anything else

No response

Are you willing to submit PR?
  • Yes, I am willing to submit a PR!
Code of Conduct
Lingua principale
C
Stelle
1.4k
Fork
248
Merge medio
4g 10h
PR unite (30g)
40

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/cloudberry

Tutte le issue di apache/cloudberry

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.