{"record":{"id":"af035c4dc21f80c3","repo":"pola-rs/polars","slug":"out-of-range-duration","errorCode":null,"errorMessage":"out-of-range duration","messagePattern":"out-of-range duration","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/polars-arrow/src/temporal_conversions.rs","lineNumber":79,"sourceCode":"        .expect(\"invalid or out-of-range datetime\")\n}\n\n/// converts a `i64` representing a `date64` to [`NaiveDate`]\n#[inline]\npub fn date64_to_date(milliseconds: i64) -> NaiveDate {\n    date64_to_datetime(milliseconds).date()\n}\n\n/// converts a `i32` representing a `time32(s)` to [`NaiveTime`]\n#[inline]\npub fn time32s_to_time(v: i32) -> NaiveTime {\n    NaiveTime::from_num_seconds_from_midnight_opt(v as u32, 0).expect(\"invalid time\")\n}\n\n/// converts a `i64` representing a `duration(s)` to [`Duration`]\n#[inline]\npub fn duration_s_to_duration(v: i64) -> Duration {\n    Duration::try_seconds(v).expect(\"out-of-range duration\")\n}\n\n/// converts a `i64` representing a `duration(ms)` to [`Duration`]\n#[inline]\npub fn duration_ms_to_duration(v: i64) -> Duration {\n    Duration::try_milliseconds(v).expect(\"out-of-range in duration conversion\")\n}\n\n/// converts a `i64` representing a `duration(us)` to [`Duration`]\n#[inline]\npub fn duration_us_to_duration(v: i64) -> Duration {\n    Duration::microseconds(v)\n}\n\n/// converts a `i64` representing a `duration(ns)` to [`Duration`]\n#[inline]\npub fn duration_ns_to_duration(v: i64) -> Duration {\n    Duration::nanoseconds(v)","sourceCodeStart":61,"sourceCodeEnd":97,"githubUrl":"https://github.com/pola-rs/polars/blob/df599052daf96e7a9cc30a3b0c6bd25d6947e3c0/crates/polars-arrow/src/temporal_conversions.rs#L61-L97","documentation":"Panics inside duration_s_to_duration: Duration::try_seconds returns None when the i64 seconds count exceeds chrono Duration's capacity (durations are capped at i64 milliseconds), i.e. |v| > i64::MAX/1000, and the infallible wrapper .expect panics.","triggerScenarios":"Converting duration(s) arrow values whose magnitude is astronomically large - sentinels like i64::MIN/MAX or wrong-unit data (nanosecond deltas stored in a seconds column).","commonSituations":"Unit mixups when producing arrow duration arrays; corrupt numeric columns; sentinel-filled buffers read as durations.","solutions":["Range-check: require |v| <= 9_223_372_036_854_775 before converting","Null out or clip out-of-range values","Fix the producer so the duration column carries seconds","Handle the Option from Duration::try_seconds directly instead of the panicking helper"],"exampleFix":"// before\nlet d = duration_s_to_duration(v); // panics on |v| > i64::MAX/1000\n\n// after\nlet d = Duration::try_seconds(v) // Option<Duration>\n    .unwrap_or_default(); // or map to null","handlingStrategy":"validation","validationCode":"fn duration_s_valid(v: i64) -> bool {\n    v.unsigned_abs() <= (i64::MAX / 1000) as u64 // chrono caps at i64 ms\n}","typeGuard":"fn is_valid_duration_s(v: i64) -> bool {\n    v.unsigned_abs() <= (i64::MAX / 1000) as u64\n}","tryCatchPattern":null,"preventionTips":["Use Duration::try_seconds (Option) rather than the panicking helper on untrusted data","Null out i64::MIN/MAX sentinels in duration columns","Double-check the duration unit (s vs ms vs ns) when receiving arrow data","Validate magnitudes at the ingestion boundary"],"tags":["rust","polars","arrow","temporal","duration","panic"],"backgroundTag":null,"analyzedSha":"df599052daf96e7a9cc30a3b0c6bd25d6947e3c0","analyzedAt":"2026-08-16T12:10:03.978Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}