`PrimitiveArray::validate_decimal_precision` rejects every decimal array with a negative scale

Chiusa Adatta ai principianti
#12,095 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@Phoenix500526 ci sta già lavorando.

Dal 6/11/2026.

  • #12101 di @Phoenix500526 — integrata

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust
Ambito
backend

Direzione di ricerca

Leggi arrow-array/src/array/primitive_array.rs intorno a PrimitiveArray::validate_decimal_precision, poi confronta il suo controllo della scala con validate_decimal_precision_and_scale in arrow-array/src/types.rs. Aggiungi un test di regressione per un Decimal128Array con scala negativa, come il caso dell’issue con precision 5 e scale -2; il lavoro è completato quando quel valore viene convalidato correttamente e i controlli esistenti per le scale positive continuano a passare.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Describe the bug

PrimitiveArray::validate_decimal_precision returns Decimal precision {precision} is less than scale {scale} for any array whose scale is negative, whatever its precision and values. Its guard compares precision < self.scale() as u8, and a negative scale cast to u8 wraps, so -2 becomes 254.

https://github.com/apache/arrow-rs/blob/cc58320c2da359b757814db5a9651397d829b601/arrow-array/src/array/primitive_array.rs#L1708-L1714

The type-level check validate_decimal_precision_and_scale guards the same comparison with scale > 0:

https://github.com/apache/arrow-rs/blob/cc58320c2da359b757814db5a9651397d829b601/arrow-array/src/types.rs#L1465-L1469

The guard came in with #8396, first released in 57.0.0.

To Reproduce

On main at cc58320c2d:

use arrow_array::Decimal128Array;

fn main() {
    // 1 at scale -2 is 100, which fits in precision 5
    let a = Decimal128Array::from(vec![1])
        .with_precision_and_scale(5, -2)
        .unwrap();
    println!("{:?}", a.validate_decimal_precision(5));
    // Err(InvalidArgumentError("Decimal precision 5 is less than scale -2"))

    // The same value at scale 2 passes
    let b = Decimal128Array::from(vec![1])
        .with_precision_and_scale(5, 2)
        .unwrap();
    println!("{:?}", b.validate_decimal_precision(5));
    // Ok(())
}

Expected behavior

Ok(()) for the first array, since its value fits precision 5. A guard of self.scale() > 0 && precision < self.scale() as u8 would match validate_decimal_precision_and_scale.

Additional context

Property-based tests found it on a generated Decimal128(5, -2) array. Checking each value with DecimalType::validate_decimal_precision works around it.

Lingua principale
Rust
Stelle
3.7k
Fork
1.4k
Merge medio
2g 7h
PR unite (30g)
292

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/arrow-rs

Tutte le issue di apache/arrow-rs

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.