[Bug] make_dt_interval returns NULL for more than about 1.49 million days, Spark returns the interval

オープン 初心者向け
#109 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@Subodh-17 がすでに取り組んでいます。

2026年11月15日 から。

  • #119 @Subodh-17 による — オープン

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
78/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
rust, spark, sql
領域
data

調査の方向性

オーバーフローは crates/spark/src/function/datetime/make_dt_interval.rs の make_interval_dt_nano、185行目付近にあり、days * 24 * 60 が i32 で計算されています。まずその関数と、そのすぐ近くにある単体テストを読み、次に issue 内の SQL で再現してください。1500000 や 106751991 のような大きな日数で、NULL ではなくインターバルが返ることを確認し、既存の make_dt_interval テストがすべて通れば完了です。

索引モデルが issue の本文から書いたものです。

説明

Describe the bug

make_dt_interval returns NULL for values that fit in the result. make_interval_dt_nano (make_dt_interval.rs#L185) adds up hours and minutes in i32, so days * 24 * 60 overflows once days is above 1,491,308. The result is a microsecond count in i64, which can hold about 106,751,991 days. Spark does this arithmetic in Long.

To Reproduce
SELECT make_dt_interval(1491308, 0, 0, 0);
-- 1491308 days 0 hours 0 mins 0.000000 secs
SELECT make_dt_interval(1500000, 0, 0, 0);
-- datafusion-spark: NULL
-- Spark 4.2.0: INTERVAL '1500000 00:00:00' DAY TO SECOND

Spark 4.2.0 also returns a value for make_dt_interval(106751991, 0, 0, 0).

Expected behavior

Do the intermediate arithmetic in i64, so that every value that fits in the result is returned.

Additional context

This is separate from #20, which is about what happens on a real overflow (NULL here, an error in Spark). Spark results come from PySpark 4.2.0 with a UTC session.

主要言語
Rust
スター
7
フォーク
15
平均マージ
16時間 43分
マージ済み PR(30日)
26

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

apache/datafusion-spark のほかの issue

apache/datafusion-spark の issue をすべて見る

似ている issue

Rust の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。