{"record":{"id":"2aff369eca2bbfb1","repo":"influxdata/influxdb","slug":"expected-float64array","errorCode":null,"errorMessage":"expected Float64Array","messagePattern":"expected Float64Array","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/query_functions/src/derivative.rs","lineNumber":436,"sourceCode":"\n    #[test]\n    fn evaluate_identical_times_returns_infinity() {\n        use arrow::array::{Float64Array, TimestampNanosecondArray};\n\n        let udwf = DerivativeUDWF::new();\n        let (exprs, fields) = evaluator_args(None);\n        let args = PartitionEvaluatorArgs::new(&exprs, &fields, false, false);\n        let mut evaluator = udwf.partition_evaluator(args).unwrap();\n\n        let values: Vec<ArrayRef> = vec![\n            Arc::new(Float64Array::from(vec![1.0, 2.0, 3.0])),\n            Arc::new(TimestampNanosecondArray::from(vec![100, 100, 100])),\n        ];\n        let result = evaluator.evaluate_all(&values, 3).unwrap();\n        let result = result\n            .as_any()\n            .downcast_ref::<Float64Array>()\n            .expect(\"expected Float64Array\");\n\n        assert!(result.is_null(0)); // first row is always null\n        assert_eq!(result.value(1), f64::INFINITY); // dt == 0, dv > 0 => +inf\n        assert_eq!(result.value(2), f64::INFINITY); // dt == 0, dv > 0 => +inf\n    }\n\n    #[test]\n    fn evaluate_identical_times_zero_delta_returns_nan() {\n        use arrow::array::{Float64Array, TimestampNanosecondArray};\n\n        let udwf = DerivativeUDWF::new();\n        let (exprs, fields) = evaluator_args(None);\n        let args = PartitionEvaluatorArgs::new(&exprs, &fields, false, false);\n        let mut evaluator = udwf.partition_evaluator(args).unwrap();\n\n        let values: Vec<ArrayRef> = vec![\n            Arc::new(Float64Array::from(vec![5.0, 5.0])),\n            Arc::new(TimestampNanosecondArray::from(vec![100, 100])),","sourceCodeStart":418,"sourceCodeEnd":454,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/core/query_functions/src/derivative.rs#L418-L454","documentation":"A test panic in derivative.rs (`evaluate_identical_times_returns_infinity`). After the derivative evaluator's `evaluate_all` returns a RecordBatch/ArrayVector, the test downcasts the result array to Float64Array via `expect(\"expected Float64Array\")`. The panic means the evaluator returned a different physical array type than Float64 for the derivative column.","triggerScenarios":"Calling evaluate_all with value/time arrays (Float64 values, TimestampNanosecond times with duplicate timestamps) and downcasting the output to Float64Array — the panic fires when the result is another type (e.g. Float32, or wrapped differently after a refactor).","commonSituations":"Developers changing the derivative implementation's output type, or altering how evaluate_all packages results, hit this in unit tests. Also occurs if a test helper change swaps value column types.","solutions":["Reproduce with `cargo test -p query_functions evaluate_identical_times_returns_infinity`.","Log result.data_type() before the downcast to see the actual returned type.","Fix the evaluator so derivatives are always emitted as Float64Array, or update the test downcast to the new type."],"exampleFix":"// before\n.expect(\"expected Float64Array\");\n// after\n.expect(\"expected Float64Array\")\n// or defensively:\nlet Some(result) = result.as_any().downcast_ref::<Float64Array>() else {\n    panic!(\"expected Float64Array, got {:?}\", result.data_type());\n};","handlingStrategy":"type-guard","validationCode":"assert_eq!(result.data_type(), DataType::Float64, \"derivative output must be Float64\");","typeGuard":"fn as_f64(arr: &dyn Array) -> Option<&Float64Array> {\n    arr.as_any().downcast_ref::<Float64Array>()\n}","tryCatchPattern":"let Some(result) = result.as_any().downcast_ref::<Float64Array>() else {\n    panic!(\"expected Float64Array, got {:?}\", result.data_type());\n};","preventionTips":["Pin the evaluator's output dtype to Float64 and assert it in a shared test helper","Check array data types before downcasting in every derivative test","Run derivative unit tests after any change to evaluate_all result packaging"],"tags":["rust","test-panic","downcast","float64array"],"backgroundTag":"dtype-mismatch","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"}