Displaying a `Date64` scalar of `i64::MIN` panics

Abierto Apto para principiantes
#24,892 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
84/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
rust

Línea de trabajo

Comienza en datafusion/common/src/scalar/mod.rs, en la rama Date64 de impl fmt::Display for ScalarValue, y reproduce el fallo con EXPLAIN SELECT arrow_cast(-9223372036854775808, 'Date64'). Comprueba el tratamiento adyacente de los offsets de epoch no representables. La tarea estará terminada cuando mostrar este valor i64::MIN ya no provoque un panic y siga el comportamiento existente para la cadena vacía.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Describe the bug

Formatting a ScalarValue::Date64 whose value is i64::MIN panics. The Display impl unwraps chrono::Duration::try_milliseconds(v), which returns None for i64::MIN because that value is outside the range chrono::Duration can represent (datafusion/common/src/scalar/mod.rs, Date64 arm of impl fmt::Display for ScalarValue).

Any code path that prints such a literal hits it, e.g. plan display.

To Reproduce
EXPLAIN SELECT arrow_cast(-9223372036854775808, 'Date64');
thread 'main' panicked at datafusion/common/src/scalar/mod.rs:5661:82:
called `Option::unwrap()` on a `None` value

Also reachable during execution, e.g. a RANGE window frame over a Date64 column that contains i64::MIN:

SELECT count(*) OVER (ORDER BY x RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)
FROM (VALUES (arrow_cast(9223372036854775807, 'Date64')), (arrow_cast(-9223372036854775808, 'Date64'))) t(x);
Expected behavior

No panic. The neighbouring branch already maps an unrepresentable epoch offset to an empty string (added for apache/arrow-rs#7728); i64::MIN should behave the same way.

Additional context

Found while running a corpus of extreme-value literals against a debug build of datafusion-cli.

Lenguaje dominante
Rust
Estrellas
9.3k
Forks
2.4k
Merge medio
3 d 8 h
PR fusionados (30 d)
354

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de apache/datafusion

Todos los issues de apache/datafusion

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.