diff --git a/datafusion/optimizer/src/type_coercion.rs b/datafusion/optimizer/src/type_coercion.rs index 018e0b9fc5e21..07ad1612d4506 100644 --- a/datafusion/optimizer/src/type_coercion.rs +++ b/datafusion/optimizer/src/type_coercion.rs @@ -239,6 +239,32 @@ mod test { Ok(()) } + #[test] + fn scalar_udf_invalid_input() -> Result<()> { + let empty = empty(); + let return_type: ReturnTypeFunction = + Arc::new(move |_| Ok(Arc::new(DataType::Utf8))); + let fun: ScalarFunctionImplementation = Arc::new(move |_| unimplemented!()); + let udf = Expr::ScalarUDF { + fun: Arc::new(ScalarUDF::new( + "TestScalarUDF", + &Signature::uniform(1, vec![DataType::Int32], Volatility::Stable), + &return_type, + &fun, + )), + args: vec![lit("Apple")], + }; + let plan = LogicalPlan::Projection(Projection::try_new(vec![udf], empty, None)?); + let rule = TypeCoercion::new(); + let mut config = OptimizerConfig::default(); + let plan = rule.optimize(&plan, &mut config).err().unwrap(); + assert_eq!( + "Plan(\"Coercion from [Utf8] to the signature Uniform(1, [Int32]) failed.\")", + &format!("{:?}", plan) + ); + Ok(()) + } + fn empty() -> Arc { let empty = Arc::new(LogicalPlan::EmptyRelation(EmptyRelation { produce_one_row: false,