@@ -844,17 +844,15 @@ macro_rules! compute_utf8_op_scalar {
844844
845845/// Invoke a compute kernel on a data array and a scalar value
846846macro_rules! compute_utf8_op_dyn_scalar {
847- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
847+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
848848 if let Some ( string_value) = $RIGHT {
849849 Ok ( Arc :: new( paste:: expr! { [ <$OP _dyn_utf8_scalar>] } (
850850 $LEFT,
851851 & string_value,
852852 ) ?) )
853853 } 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( ) ) ) )
858856 }
859857 } } ;
860858}
@@ -878,7 +876,7 @@ macro_rules! compute_bool_op_scalar {
878876
879877/// Invoke a compute kernel on a boolean data array and a scalar value
880878macro_rules! compute_bool_op_dyn_scalar {
881- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
879+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
882880 // generate the scalar function name, such as lt_dyn_bool_scalar, from the $OP parameter
883881 // (which could have a value of lt) and the suffix _scalar
884882 if let Some ( b) = $RIGHT {
@@ -887,10 +885,8 @@ macro_rules! compute_bool_op_dyn_scalar {
887885 b,
888886 ) ?) )
889887 } 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( ) ) ) )
894890 }
895891 } } ;
896892}
@@ -938,8 +934,9 @@ macro_rules! compute_op_scalar {
938934
939935/// Invoke a dyn compute kernel on a data array and a scalar value
940936/// LEFT is Primitive or Dictionart array of numeric values, RIGHT is scalar value
937+ /// OP_TYPE is the return type of scalar function
941938macro_rules! compute_op_dyn_scalar {
942- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
939+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
943940 // generate the scalar function name, such as lt_dyn_scalar, from the $OP parameter
944941 // (which could have a value of lt_dyn) and the suffix _scalar
945942 if let Some ( value) = $RIGHT {
@@ -948,10 +945,8 @@ macro_rules! compute_op_dyn_scalar {
948945 value,
949946 ) ?) )
950947 } 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( ) ) ) )
955950 }
956951 } } ;
957952}
@@ -1359,22 +1354,22 @@ impl PhysicalExpr for BinaryExpr {
13591354/// such as Utf8 strings.
13601355#[ macro_export]
13611356macro_rules! binary_array_op_dyn_scalar {
1362- ( $LEFT: expr, $RIGHT: expr, $OP: ident) => { {
1357+ ( $LEFT: expr, $RIGHT: expr, $OP: ident, $OP_TYPE : expr ) => { {
13631358 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 ) ,
13651360 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 ) ,
13781373 ScalarValue :: Date32 ( _) => compute_op_scalar!( $LEFT, $RIGHT, $OP, Date32Array ) ,
13791374 ScalarValue :: Date64 ( _) => compute_op_scalar!( $LEFT, $RIGHT, $OP, Date64Array ) ,
13801375 ScalarValue :: TimestampSecond ( ..) => compute_op_scalar!( $LEFT, $RIGHT, $OP, TimestampSecondArray ) ,
@@ -1397,22 +1392,37 @@ impl BinaryExpr {
13971392 ) -> Result < Option < Result < ArrayRef > > > {
13981393 let scalar_result = match & self . op {
13991394 Operator :: Lt => {
1400- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , lt)
1395+ binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , lt, & DataType :: Boolean )
14011396 }
14021397 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+ )
14041404 }
14051405 Operator :: Gt => {
1406- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , gt)
1406+ binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , gt, & DataType :: Boolean )
14071407 }
14081408 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+ )
14101415 }
14111416 Operator :: Eq => {
1412- binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , eq)
1417+ binary_array_op_dyn_scalar ! ( array, scalar. clone( ) , eq, & DataType :: Boolean )
14131418 }
14141419 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+ )
14161426 }
14171427 Operator :: Like => {
14181428 binary_string_array_op_scalar ! ( array, scalar. clone( ) , like)
0 commit comments