@@ -2,7 +2,6 @@ use std::sync::Arc;
22
33use arrow:: array:: { ArrayRef , ListBuilder , StringBuilder } ;
44use arrow_schema:: { DataType , Field } ;
5- use datafusion:: common:: { exec_datafusion_err, exec_err} ;
65use datafusion:: error:: Result ;
76use datafusion:: logical_expr:: {
87 ColumnarValue , ScalarFunctionArgs , ScalarUDFImpl , Signature , TypeSignature , Volatility ,
@@ -12,7 +11,10 @@ use parquet_variant::Variant;
1211use parquet_variant:: VariantPath ;
1312use parquet_variant_compute:: { GetOptions , VariantArray , variant_get as compute_variant_get} ;
1413
15- use crate :: shared:: { try_field_as_variant_array, try_parse_string_scalar} ;
14+ use crate :: shared:: {
15+ arg_field_meta_missing_err, arg_null_error, arg_shape_err, arg_type_err, args_count_err,
16+ try_field_as_variant_array, try_parse_string_scalar,
17+ } ;
1618
1719#[ derive( Debug , Hash , PartialEq , Eq ) ]
1820pub struct VariantObjectKeys {
@@ -70,26 +72,31 @@ impl ScalarUDFImpl for VariantObjectKeys {
7072 [ variant_arg] => ( variant_arg, None ) ,
7173 [ variant_arg, path_arg] => {
7274 let ColumnarValue :: Scalar ( path_scalar) = path_arg else {
73- return exec_err ! ( "expected scalar value for path" ) ;
75+ return Err ( arg_shape_err (
76+ self . name ( ) ,
77+ 2 ,
78+ "scalar string value" ,
79+ "array value" ,
80+ ) ) ;
7481 } ;
7582 let path = try_parse_string_scalar ( path_scalar) ?
76- . ok_or_else ( || exec_datafusion_err ! ( "expected non-null string for path ") ) ?;
83+ . ok_or_else ( || arg_null_error ( self . name ( ) , 2 , "a non-null string literal ") ) ?;
7784 ( variant_arg, Some ( path) )
7885 }
79- _ => return exec_err ! ( "expected 1 or 2 arguments" ) ,
86+ _ => return Err ( args_count_err ( self . name ( ) , " 1 or 2" , args . args . len ( ) ) ) ,
8087 } ;
8188
8289 let variant_field = args
8390 . arg_fields
8491 . first ( )
85- . ok_or_else ( || exec_datafusion_err ! ( "expected 1 argument field type" ) ) ?;
92+ . ok_or_else ( || arg_field_meta_missing_err ( self . name ( ) , 1 ) ) ?;
8693
8794 try_field_as_variant_array ( variant_field. as_ref ( ) ) ?;
8895
8996 let out = match variant_arg {
9097 ColumnarValue :: Scalar ( scalar_variant) => {
9198 let ScalarValue :: Struct ( struct_arr) = scalar_variant else {
92- return exec_err ! ( "expected variant scalar value" ) ;
99+ return arg_type_err ( self . name ( ) , 1 , "Struct" , & scalar_variant . data_type ( ) ) ;
93100 } ;
94101 let arr: ArrayRef = Arc :: clone ( struct_arr) as ArrayRef ;
95102
0 commit comments