Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

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

Đang mở
#2,048 5 bình luận 1 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 3 ngày

@aryan9948 đang làm issue này rồi.

Từ ngày 28/9/2026.

Đánh giá

Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
65/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
c, postgresql
Lĩnh vực
databases

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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
Ngôn ngữ chính
C
Star
1.4k
Fork
262
Merge trung bình
4 ngày 20 giờ
Pull request đã merge (30 ngày)
57

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/cloudberry

Tất cả issue của apache/cloudberry

Issue tương tự

Thêm issue về C

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.