array_min / array_max fail on a zero-row batch for non-primitive element types
メンテナーはふだん 1 日以内に返信
評価
調査の方向性
datafusion/functions-nested/src/min_max.rs の array_min_max_helper から始め、非プリミティブ要素型に対するフォールバックを追ってください。0 行の List<Utf8> 入力のテストを追加し、関数がエラーなしで 0 行を返すことを確認してください。既存のプリミティブ型の動作と比較してください。
索引モデルが issue の本文から書いたものです。
説明
Describe the bug
array_min / array_max on a zero-row List<Utf8> (or any non-primitive element type) fails:
Execution error: Empty iterator passed to ScalarValue::iter_to_array
A zero-row List<Int64> works. array_min_max_helper (datafusion/functions-nested/src/min_max.rs) only has a fast path for primitive types; the fallback builds a Vec<ScalarValue> and calls ScalarValue::iter_to_array, which rejects an empty iterator.
Zero-row batches do reach these functions in practice: ProjectionExec and TopK evaluate expressions on every batch, so ORDER BY array_min(tags) LIMIT n fails whenever an input emits an empty batch.
To Reproduce
use std::sync::Arc;
use datafusion::arrow::array::{ArrayRef, ListBuilder, StringBuilder};
use datafusion::arrow::record_batch::RecordBatch;
use datafusion::prelude::SessionContext;
#[tokio::main]
async fn main() -> datafusion::error::Result<()> {
let ctx = SessionContext::new();
let tags: ArrayRef = Arc::new(ListBuilder::new(StringBuilder::new()).finish());
ctx.register_batch("t", RecordBatch::try_from_iter(vec![("tags", tags)])?)?;
ctx.sql("SELECT array_min(tags) FROM t").await?.show().await?; // error
Ok(())
}
Seen on 54.0.0; the code is unchanged on main.
Expected behavior
Zero rows, the same as for primitive element types.
Additional context
Found in OpenSearch's DataFusion backend when sorting on multi-valued keyword fields with an empty shard. Proposed fix: return new_empty_array(&array.value_type()) for an empty input before the fallback. PR to follow.
- 主要言語
- Rust
- スター
- 9.4k
- フォーク
- 2.5k
- 平均マージ
- 4日 5時間
- マージ済み PR(30日)
- 344
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/datafusion のほかの issue
-
`array_concat` with an untyped `NULL` argument fails with "does not support type Int64"対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
apache/datafusion#26243 ·
メンテナーはふだん 1 日以内に返信
-
BaselineMetrics output_bytes converts every column to ArrayData for every batch対応中かも @minhh-nguyen が 6 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
apache/datafusion#26071 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Replace manual `RowSelection` bitmap conversion with `force_mask()` after arrow-rs release対応中かも @isabellehuangg が 8 日前に担当しました。 オープンenhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
apache/datafusion#26030 · コメント 1 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
Lambda examples in the SQL function docs fail with the default dialect対応中かも @Prajwal-k-tech が 8 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
apache/datafusion#25960 ·
メンテナーはふだん 1 日以内に返信
-
Spark `xxhash64` hashes the raw bits of a NaN instead of the canonical NaN対応中かも @mrhard9090 が 11 日前に担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
apache/datafusion#25913 ·
メンテナーはふだん 1 日以内に返信
apache/datafusion の issue をすべて見る
似ている issue
-
Add Mimirオープン
難易度 1/5 1時間未満 初心者へのやさしさ 78/100
slavakurilyak/awesome-ai-agents#759 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
compiler-explorer/compiler-explorer#9272 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 63/100
pop-os/cosmic-files#2117 ·
メンテナーはふだん 2 日以内に返信
-
L: java:gradle L: java:maven L: ruby:bundler T: bug 🐞
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
dependabot/dependabot-core#16547 ·
メンテナーはふだん 1 日以内に返信
-
bug status:ready-for-test
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
UniClipboard/UniClipboard#1985 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信