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

MIN/MAX don't unwrap nested encodings inside Dictionary columns

Đang mở Phù hợp với người mới
#26,290 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

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

Từ ngày 15/10/2026.

  • #26371 của @grevend — đang mở

Đá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
72/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ệ
rust
Lĩnh vực
data

Hướng nghiên cứu

Bắt đầu từ hàm get_min_max_result_type, nơi nhánh RunEndEncoded đã đệ quy vào các giá trị của nó, còn nhánh Dictionary chỉ bóc một cấp. Kiểm tra các test MIN/MAX để xem một cột dictionary hoặc run-end được tạo và truy vấn qua MemTable như thế nào. Hoàn thành khi max trên cả hai cột mã hóa lồng nhau trả về giá trị UInt32 thuần, có kiểu UInt32, với một test cho mỗi trường hợp.

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

Mô tả

bug
Describe the bug

get_min_max_result_type recurses into RunEndEncoded values but unwraps Dictionary only one level. When a dictionary's values are themselves encoded, MIN/MAX don't reach the plain value type:

Column type max(c)
Dictionary<Int32, RunEndEncoded<Int32, UInt32>> Internal error: Min/Max accumulator not implemented for type RunEndEncoded(...)
Dictionary<Int32, Dictionary<Int32, UInt32>> correct value, typed Dictionary(Int32, UInt32) instead of UInt32
To Reproduce

arrow_cast can't build these types, so they only come from a TableProvider, e.g. a MemTable:

let values = RunArray::<Int32Type>::try_new(&Int32Array::from(vec![1, 2]), &UInt32Array::from(vec![1, 3]))?;
let column: ArrayRef = Arc::new(DictionaryArray::<Int32Type>::try_new(Int32Array::from(vec![0, 0, 1]), Arc::new(values))?);
// register `column` as `c` in a MemTable `t`, then:
ctx.sql("SELECT max(c) FROM t").await?.collect().await?; // internal error
Expected behavior

Both columns return max(c) = 3 as UInt32, the same as RunEndEncoded<_, Dictionary<_, UInt32>>.

Additional context

Follow-up to https://github.com/apache/datafusion/pull/26248#discussion_r4267916127. Making the Dictionary arm recurse like the RunEndEncoded arm fixes both cases:

DataType::Dictionary(_, values) => get_min_max_result_type(&[values.deref().clone()]),
Willingness to contribute

I plan to contribute a fix for this bug independently

Ngôn ngữ chính
Rust
Star
9.4k
Fork
2.5k
Merge trung bình
4 ngày 13 giờ
Pull request đã merge (30 ngày)
353

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

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

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/datafusion

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

Issue tương tự

Thêm issue về Rust

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.