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

[Bug] UPDATE of the distribution key fails with "can't split update for inherit table" after the child table is dropped

Aperta
#2,048 0 commenti 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
65/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
c, postgresql
Ambito
databases

Direzione di ricerca

The bug is in the Postgres planner code, likely in preptlist.c line 140. Start by examining the function that checks for inheritance children before splitting an UPDATE on a distribution key. Look at how relhassubclass is used versus find_inheritance_children() or pg_inherits. The fix should replace the hint check with a direct lookup of actual children. Run the provided reproduction script to verify the error and that ANALYZE clears it. Test with optimizer=off to ensure the fix works for the Postgres planner.

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

Descrizione

type: Bug
Apache Cloudberry version

main; REL_2_STABLE

What happened

UPDATE of a distribution-key column is rejected for a table that has inheritance children:

ERROR:  can't split update for inherit table: pinh (preptlist.c:140)

The error persists after all child tables are dropped. The check relies on pg_class.relhassubclass, which PostgreSQL does not clear when the last child is dropped; only ANALYZE or VACUUM clears it lazily. As a result, a plain table with no children refuses to update its distribution key until somebody runs ANALYZE on it.

On REL_2_STABLE, this happens with the Postgres planner (optimizer = off). With GPORCA, the same UPDATE after DROP TABLE cinh succeeds.

What you think should happen instead

Once the table has no inheritance children, updating its distribution key should work as it does for any other table. The check should look at the actual children (for example find_inheritance_children() / pg_inherits), not at relhassubclass, which is only a hint.

How to reproduce
create table pinh(a int, b int) distributed by (b);
create table cinh() inherits (pinh);
insert into pinh values (1,1);

update pinh set a = a + 1;   -- OK, not a distribution key
update pinh set b = b + 1;   -- ERROR: can't split update for inherit table: pinh

drop table cinh;
select count(*) from pg_inherits where inhparent = 'pinh'::regclass;   -- 0, no children
select relhassubclass from pg_class where oid = 'pinh'::regclass;      -- t, stale flag

update pinh set b = b + 1;   -- still ERROR: can't split update for inherit table: pinh

analyze pinh;
select relhassubclass from pg_class where oid = 'pinh'::regclass;      -- f
update pinh set b = b + 1;   -- UPDATE 1
Operating System

any

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.