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: ReferenceVisitor::GetReferencedFieldIds dereferences null on a bound COUNT(*)

Đang mở Phù hợp với người mới
#978 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

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

Chưa có ai nhận issue này.

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
82/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ệ
cpp
Lĩnh vực
backend

Hướng nghiên cứu

Bắt đầu với src/iceberg/expression/binder.cc, đặc biệt là ReferenceVisitor::Aggregate, và so sánh cách BoundAggregate::reference() xử lý COUNT(*) với việc xây dựng aggregate trong src/iceberg/expression/aggregate.cc. Kiểm tra phạm vi kiểm thử aggregate hiện có trong aggregate_test.cc; được xem là hoàn tất khi việc gọi GetReferencedFieldIds trên một COUNT(*) đã bind không còn gây crash và không đóng góp bất kỳ field id nào.

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

Mô tả

Summary

ReferenceVisitor::GetReferencedFieldIds (exported via ICEBERG_EXPORT) crashes with a SIGSEGV when the expression tree contains a bound COUNT(*). ReferenceVisitor::Aggregate runs referenced_field_ids_.insert(aggregate->reference()->field_id()), but a COUNT(*) aggregate has a null term, so reference() returns nullptr and ->field_id() dereferences it.

Root Cause

CountStarAggregate is constructed with a null term (src/iceberg/expression/aggregate.cc), and BoundAggregate::reference() returns term() ? term()->reference() : nullptr, so it is nullptr for COUNT(*). src/iceberg/expression/binder.cc dereferences it with no guard. Visit() routes any bound aggregate to Aggregate(), so binding Expressions::CountStar() and calling GetReferencedFieldIds segfaults. COUNT(col) / MAX / MIN have non-null terms and are unaffected.

Impact

No in-tree scan path passes aggregates to GetReferencedFieldIds today (table_scan.cc and manifest_group.cc pass row filters), so the crash lands on a library consumer that does aggregate pushdown through the exported API. COUNT(*) is the most common aggregate, and binding it is a supported, tested workflow (aggregate_test.cc). Java's ReferenceVisitor base throws UnsupportedOperationException on aggregates, a catchable error; the C++ port instead crashes the process.

Proposed Fix

Insert the field id only when reference() is non-null. COUNT(*) then contributes no field ids, which is the correct result for field projection (counting rows reads no columns).

Ngôn ngữ chính
C++
Star
226
Fork
132
Merge trung bình
1 ngày 11 giờ
Pull request đã merge (30 ngày)
27

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

Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.

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/iceberg-cpp

Tất cả issue của apache/iceberg-cpp

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.