@@ -844,17 +844,15 @@ macro_rules! compute_utf8_op_scalar {
844
844
845
845
/// Invoke a compute kernel on a data array and a scalar value
846
846
macro_rules! compute_utf8_op_dyn_scalar {
847
- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
847
+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
848
848
if let Some ( string_value) = $RIGHT {
849
849
Ok ( Arc :: new( paste:: expr! { [ <$OP _dyn_utf8_scalar>] } (
850
850
$LEFT,
851
851
& string_value,
852
852
) ?) )
853
853
} else {
854
- Err ( DataFusionError :: Internal ( format!(
855
- "compute_utf8_op_scalar for '{}' failed with literal 'none' value" ,
856
- stringify!( $OP) ,
857
- ) ) )
854
+ // when the $RIGHT is a NULL, generate a NULL array of $OP_TYPE
855
+ Ok ( Arc :: new( new_null_array( $OP_TYPE, $LEFT. len( ) ) ) )
858
856
}
859
857
} } ;
860
858
}
@@ -878,7 +876,7 @@ macro_rules! compute_bool_op_scalar {
878
876
879
877
/// Invoke a compute kernel on a boolean data array and a scalar value
880
878
macro_rules! compute_bool_op_dyn_scalar {
881
- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
879
+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
882
880
// generate the scalar function name, such as lt_dyn_bool_scalar, from the $OP parameter
883
881
// (which could have a value of lt) and the suffix _scalar
884
882
if let Some ( b) = $RIGHT {
@@ -887,10 +885,8 @@ macro_rules! compute_bool_op_dyn_scalar {
887
885
b,
888
886
) ?) )
889
887
} else {
890
- Err ( DataFusionError :: Internal ( format!(
891
- "compute_utf8_op_scalar for '{}' failed with literal 'none' value" ,
892
- stringify!( $OP) ,
893
- ) ) )
888
+ // when the $RIGHT is a NULL, generate a NULL array of $OP_TYPE
889
+ Ok ( Arc :: new( new_null_array( $OP_TYPE, $LEFT. len( ) ) ) )
894
890
}
895
891
} } ;
896
892
}
@@ -938,8 +934,9 @@ macro_rules! compute_op_scalar {
938
934
939
935
/// Invoke a dyn compute kernel on a data array and a scalar value
940
936
/// LEFT is Primitive or Dictionart array of numeric values, RIGHT is scalar value
937
+ /// OP_TYPE is the return type of scalar function
941
938
macro_rules! compute_op_dyn_scalar {
942
- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
939
+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
943
940
// generate the scalar function name, such as lt_dyn_scalar, from the $OP parameter
944
941
// (which could have a value of lt_dyn) and the suffix _scalar
945
942
if let Some ( value) = $RIGHT {
@@ -948,10 +945,8 @@ macro_rules! compute_op_dyn_scalar {
948
945
value,
949
946
) ?) )
950
947
} else {
951
- Err ( DataFusionError :: Internal ( format!(
952
- "compute_utf8_op_scalar for '{}' failed with literal 'none' value" ,
953
- stringify!( $OP) ,
954
- ) ) )
948
+ // when the $RIGHT is a NULL, generate a NULL array of $OP_TYPE
949
+ Ok ( Arc :: new( new_null_array( $OP_TYPE, $LEFT. len( ) ) ) )
955
950
}
956
951
} } ;
957
952
}
@@ -1359,22 +1354,22 @@ impl PhysicalExpr for BinaryExpr {
1359
1354
/// such as Utf8 strings.
1360
1355
#[ macro_export]
1361
1356
macro_rules! binary_array_op_dyn_scalar {
1362
- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
1357
+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
1363
1358
let result: Result <Arc <dyn Array >> = match $RIGHT {
1364
- ScalarValue :: Boolean ( b) => compute_bool_op_dyn_scalar!( $LEFT, b, $OP) ,
1359
+ ScalarValue :: Boolean ( b) => compute_bool_op_dyn_scalar!( $LEFT, b, $OP, $OP_TYPE ) ,
1365
1360
ScalarValue :: Decimal128 ( ..) => compute_decimal_op_scalar!( $LEFT, $RIGHT, $OP, DecimalArray ) ,
1366
- ScalarValue :: Utf8 ( v) => compute_utf8_op_dyn_scalar!( $LEFT, v, $OP) ,
1367
- ScalarValue :: LargeUtf8 ( v) => compute_utf8_op_dyn_scalar!( $LEFT, v, $OP) ,
1368
- ScalarValue :: Int8 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1369
- ScalarValue :: Int16 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1370
- ScalarValue :: Int32 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1371
- ScalarValue :: Int64 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1372
- ScalarValue :: UInt8 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1373
- ScalarValue :: UInt16 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1374
- ScalarValue :: UInt32 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1375
- ScalarValue :: UInt64 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP) ,
1376
- ScalarValue :: Float32 ( _ ) => compute_op_scalar !( $LEFT, $RIGHT , $OP, Float32Array ) ,
1377
- ScalarValue :: Float64 ( _ ) => compute_op_scalar !( $LEFT, $RIGHT , $OP, Float64Array ) ,
1361
+ ScalarValue :: Utf8 ( v) => compute_utf8_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1362
+ ScalarValue :: LargeUtf8 ( v) => compute_utf8_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1363
+ ScalarValue :: Int8 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1364
+ ScalarValue :: Int16 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1365
+ ScalarValue :: Int32 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1366
+ ScalarValue :: Int64 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1367
+ ScalarValue :: UInt8 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1368
+ ScalarValue :: UInt16 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1369
+ ScalarValue :: UInt32 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1370
+ ScalarValue :: UInt64 ( v) => compute_op_dyn_scalar!( $LEFT, v, $OP, $OP_TYPE ) ,
1371
+ ScalarValue :: Float32 ( v ) => compute_op_dyn_scalar !( $LEFT, v , $OP, $OP_TYPE ) ,
1372
+ ScalarValue :: Float64 ( v ) => compute_op_dyn_scalar !( $LEFT, v , $OP, $OP_TYPE ) ,
1378
1373
ScalarValue :: Date32 ( _) => compute_op_scalar!( $LEFT, $RIGHT, $OP, Date32Array ) ,
1379
1374
ScalarValue :: Date64 ( _) => compute_op_scalar!( $LEFT, $RIGHT, $OP, Date64Array ) ,
1380
1375
ScalarValue :: TimestampSecond ( ..) => compute_op_scalar!( $LEFT, $RIGHT, $OP, TimestampSecondArray ) ,
@@ -1397,22 +1392,37 @@ impl BinaryExpr {
1397
1392
) -> Result < Option < Result < ArrayRef > > > {
1398
1393
let scalar_result = match & self . op {
1399
1394
Operator :: Lt => {
1400
- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , lt)
1395
+ binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , lt, & DataType :: Boolean )
1401
1396
}
1402
1397
Operator :: LtEq => {
1403
- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , lt_eq)
1398
+ binary_array_op_dyn_scalar ! (
1399
+ array,
1400
+ scalar. clone( ) ,
1401
+ lt_eq,
1402
+ & DataType :: Boolean
1403
+ )
1404
1404
}
1405
1405
Operator :: Gt => {
1406
- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , gt)
1406
+ binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , gt, & DataType :: Boolean )
1407
1407
}
1408
1408
Operator :: GtEq => {
1409
- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , gt_eq)
1409
+ binary_array_op_dyn_scalar ! (
1410
+ array,
1411
+ scalar. clone( ) ,
1412
+ gt_eq,
1413
+ & DataType :: Boolean
1414
+ )
1410
1415
}
1411
1416
Operator :: Eq => {
1412
- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , eq)
1417
+ binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , eq, & DataType :: Boolean )
1413
1418
}
1414
1419
Operator :: NotEq => {
1415
- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , neq)
1420
+ binary_array_op_dyn_scalar ! (
1421
+ array,
1422
+ scalar. clone( ) ,
1423
+ neq,
1424
+ & DataType :: Boolean
1425
+ )
1416
1426
}
1417
1427
Operator :: Like => {
1418
1428
binary_string_array_op_scalar ! ( array, scalar. clone( ) , like)
0 commit comments