[Bug] Incorrect result of COUNT(DISTINCT expr) FILTER (WHERE condition) in Cloudberry 2.1.0
Maintainer thường phản hồi trong vòng 3 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 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
- Lĩnh vực
- databases, distributed-systems
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện ví dụ SQL khi gp_enable_multiphase_agg được bật và tắt, sau đó lần theo cách xử lý aggregate multiphase cho các biểu thức DISTINCT có mệnh đề FILTER. Công việc được xem là hoàn tất khi cả hai biểu thức tương đương về ngữ nghĩa đều trả về cùng một giá trị ở cả hai chế độ, kèm theo coverage hồi quy cho trường hợp đã được báo cáo.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Issue Body
Describe the bug
Apache Cloudberry returns incorrect results for COUNT(DISTINCT ...) FILTER (WHERE ...)
when gp_enable_multiphase_agg is enabled.
Two semantically equivalent aggregate expressions return different results.
Example:
COUNT(DISTINCT goods_gid)
FILTER (WHERE invqty = 0)
COUNT(DISTINCT CASE WHEN invqty = 0 THEN goods_gid END)
According to SQL semantics, these two expressions should always return the same value.
However, with gp_enable_multiphase_agg=on, Cloudberry returns different results.
To Reproduce
Create test table:
CREATE TABLE test_cnt
(
goods_gid int,
invqty int
)
DISTRIBUTED BY (goods_gid);
Insert test data:
INSERT INTO test_cnt VALUES
(1,0),
(1,1),
(2,0),
(3,1);
Run query with multiphase aggregation enabled:
SET gp_enable_multiphase_agg=on;
SELECT
COUNT(DISTINCT goods_gid)
FILTER (WHERE invqty = 0) AS cnt1,
COUNT(DISTINCT CASE
WHEN invqty = 0 THEN goods_gid
END) AS cnt2
FROM test_cnt;
query plan :
Aggregate (cost=1.12..1.13 rows=1 width=16) (actual time=1.000..1.000 rows=1 loops=1)
-> Gather Motion 8:1 (slice1; segments: 8) (cost=0.00..1.07 rows=5 width=8) (actual time=0.000..0.000 rows=5 loops=1)
-> Seq Scan on test_cnt (cost=0.00..1.01 rows=1 width=8) (actual time=0.000..0.000 rows=2 loops=1)
Planning Time: 1.111 ms
(slice0) Executor memory: 31K bytes.
(slice1) Executor memory: 39K bytes avg x 8x(0) workers, 112K bytes max (seg0).
Memory used: 128000kB
Optimizer: Postgres query optimizer
Execution Time: 4.177 ms
Actual result:
cnt1 | cnt2
-----+-----
3 | 2
This result is incorrect.
Disable multiphase aggregation:
SET gp_enable_multiphase_agg=off;
SELECT
COUNT(DISTINCT goods_gid)
FILTER (WHERE invqty = 0) AS cnt1,
COUNT(DISTINCT CASE
WHEN invqty = 0 THEN goods_gid
END) AS cnt2
FROM test_cnt;
Result:
cnt1 | cnt2
-----+-----
2 | 2
The result is correct.
Expected behavior
The following expressions should always return identical results:
COUNT(DISTINCT expression)
FILTER (WHERE condition)
and
COUNT(DISTINCT CASE WHEN condition THEN expression END)
The value should not depend on whether multiphase aggregation is enabled.
Actual behavior
When:
gp_enable_multiphase_agg=on
Cloudberry returns incorrect aggregate results.
When:
gp_enable_multiphase_agg=off
the result is correct.
Additional information
The issue is reproducible in our production environment.
The problem appears related to the combination of:
COUNT(DISTINCT ...)
FILTER clause
Multiphase aggregation
MPP aggregate execution
The workaround is to rewrite:
COUNT(DISTINCT col)
FILTER (WHERE condition)
as:
COUNT(DISTINCT CASE WHEN condition THEN col END)
or disable:
SET gp_enable_multiphase_agg=off;
- Ngôn ngữ chính
- C
- Star
- 1.4k
- Fork
- 260
- Merge trung bình
- 4 ngày 19 giờ
- Pull request đã merge (30 ngày)
- 54
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của apache/cloudberry
-
[Bug] Expand fails to recognize user-defined tablespacesCó thể đã có người làm @nix-oss đã nhận 58 ngày trước. Đang mởtype: Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
apache/cloudberry#1885 · 2 reaction ·
Maintainer thường phản hồi trong vòng 3 ngày
-
gpexpand first stage fails: 'SyncPackages' object has no attribute 'ret' (extension sync never runs; regression)Có thể đã có người làm @talmacschen-arch đã nhận 120 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
apache/cloudberry#1825 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
type: Bug
Độ khó 3/5 Nửa ngày Mức phù hợp với người mới 58/100
apache/cloudberry#2137 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
type: Proposal
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 22/100
apache/cloudberry#2136 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 3 ngày
-
type: Bug
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
apache/cloudberry#2135 ·
Maintainer thường phản hồi trong vòng 3 ngày
Tất cả issue của apache/cloudberry
Issue tương tự
-
VIEW_TYPE set for computer playersCó thể đã có người làm @Loobinex đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Maintainer thường phản hồi trong vòng 2 ngày
-
bug
Độ khó 2/5 Dưới một giờ Mức phù hợp với người mới 78/100
brunodev85/winlator-app#90 ·
-
documentation
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
grayscale-lang/grayscale#3133 ·
Maintainer thường phản hồi trong vòng 1 ngày