{"record":{"id":"81466d639714ba07","repo":"influxdata/influxdb","slug":"min-min-max-max","errorCode":null,"errorMessage":"min ({min:?}) > max ({max:?})","messagePattern":"min \\((.+?)\\) > max \\((.+?)\\)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/iox_query/src/statistics/stats_utils.rs","lineNumber":49,"sourceCode":"\n/// Return min max of a ColumnStatistics with precise values\npub fn column_statistics_min_max(\n    column_statistics: ColumnStatistics,\n) -> Option<(ScalarValue, ScalarValue)> {\n    match (column_statistics.min_value, column_statistics.max_value) {\n        (Precision::Exact(min), Precision::Exact(max)) => Some((min, max)),\n        // the statistics values are absent or imprecise\n        _ => None,\n    }\n}\n\n/// Return true if at least 2 min_max ranges in the given array overlap\npub fn overlap(value_ranges: &[(ScalarValue, ScalarValue)]) -> Result<bool, DataFusionError> {\n    // interleave min and max into one iterator\n    let value_ranges_iter = value_ranges.iter().flat_map(|(min, max)| {\n        // panics if min > max\n        if min > max {\n            panic!(\"min ({min:?}) > max ({max:?})\");\n        }\n        vec![min.clone(), max.clone()]\n    });\n\n    let value_ranges = ScalarValue::iter_to_array(value_ranges_iter)?;\n\n    // rank it\n    let ranks = rank(&*value_ranges, None)?;\n\n    // check overlap by checking if the max is rank right behind its corresponding min\n    //  . non-overlap example: values of min-max pairs [3, 5,   9, 12,   1, 1,   6, 8]\n    //     ranks:  [3, 4,   7, 8,  2, 2,  5, 6] : max (even index) = its correspnding min (odd index) for same min max OR min + 1\n    //  . overlap example:  [3, 5,   9, 12,   1, 1,   4, 6] : pair [3, 5] interleaves with pair [4, 6]\n    //     ranks:  [3, 5,   7, 8,  2, 2,  4, 6]\n    for i in (0..ranks.len()).step_by(2) {\n        if !((ranks[i] == ranks[i + 1]) || (ranks[i + 1] == ranks[i] + 1)) {\n            return Ok(true);\n        }","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/core/iox_query/src/statistics/stats_utils.rs#L31-L67","documentation":"overlap() panics when any (min, max) pair in the value_ranges slice has min > max. The function builds an interleaved array of min/max values and requires each range be well-ordered, since an inverted range would corrupt the overlap check.","triggerScenarios":"Calling overlap (e.g. via overlap_all) with a range whose min ScalarValue is greater than its max — typically from corrupted or wrongly merged column statistics.","commonSituations":"Statistics union/merge code that swapped min and max; stats collected from differently sorted inputs; tests feeding hand-written ranges in the wrong order.","solutions":["Validate each (min, max) pair before passing it to overlap and swap/repair inverted ranges","Fix the statistics-producing code that emitted min > max","For tests, construct ranges with min <= max explicitly"],"exampleFix":"// before\noverlap(&[(ScalarValue::Int64(Some(10)), ScalarValue::Int64(Some(5)))])?;\n// after\nlet (min, max) = (ScalarValue::Int64(Some(5)), ScalarValue::Int64(Some(10)));\noverlap(&[(min, max)])?;","handlingStrategy":"validation","validationCode":"for (min, max) in ranges { if min > max { /* repair or reject */ } }","typeGuard":"fn is_well_ordered(r: &(ScalarValue, ScalarValue)) -> bool { r.0 <= r.1 }","tryCatchPattern":"// pre-sort each pair: let (min, max) = if min > max { (max, min) } else { (min, max) };","preventionTips":["Normalize min/max order before statistics merge","Validate ranges in statistics-producing code","Add overlap() round-trip tests to merge logic"],"tags":["rust","panic","statistics","min-max"],"backgroundTag":"invalid-argument-value","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}