This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new a6f4a7719 feat: Support bitwise operations for unsigned integer types
(#5476)
a6f4a7719 is described below
commit a6f4a7719e4cf449fe3f85a68cdd06a7f9bece85
Author: Igor Izvekov <[email protected]>
AuthorDate: Mon Mar 6 21:32:06 2023 +0300
feat: Support bitwise operations for unsigned integer types (#5476)
* feat: Support bitwise operations for unsigned integer types
* fix: remove useless .unwrap()
* feat: add some tests to scalar.slt for uint types
* fix: tests in scalar.slt
* fix: merge tables into one table in scalat.slt
* fix: documentation for new tests in scalar.slt
* add: "query I rowsort" to selection in scalar.slt
---
.../core/tests/sqllogictests/test_files/scalar.slt | 50 ++-
datafusion/expr/src/type_coercion/binary.rs | 59 ++-
datafusion/physical-expr/src/expressions/binary.rs | 99 ++++-
.../src/expressions/binary/kernels.rs | 400 +++++++++++++++++++--
4 files changed, 567 insertions(+), 41 deletions(-)
diff --git a/datafusion/core/tests/sqllogictests/test_files/scalar.slt
b/datafusion/core/tests/sqllogictests/test_files/scalar.slt
index bd6346c16..348789bd0 100644
--- a/datafusion/core/tests/sqllogictests/test_files/scalar.slt
+++ b/datafusion/core/tests/sqllogictests/test_files/scalar.slt
@@ -22,11 +22,13 @@
statement ok
CREATE TABLE t1(
a INT,
- b INT
+ b INT,
+ c INT,
+ d INT
) as VALUES
- (1, 100),
- (2, 1000),
- (3, 10000)
+ (1, 100, 567, 1024),
+ (2, 1000, 123, 256),
+ (3, 10000, 978, 2048)
;
# log scalar function
@@ -68,3 +70,43 @@ query RR rowsort
select log(0) a, log(1, 64) b
----
-Infinity Infinity
+
+# bitwise and with column and scalar
+query I rowsort
+select c & 856 from t1;
+----
+528
+848
+88
+
+# bitwise or with column and scalar
+query I rowsort
+select c | 856 from t1;
+----
+891
+895
+986
+
+# bitwise xor with column and scalar
+query I rowsort
+select c ^ 856 from t1;
+----
+138
+367
+803
+
+# right shift with column and scalar
+query I rowsort
+select d >> 2 from t1;
+----
+256
+512
+64
+
+# left shift with column and scalar
+query I rowsort
+select d << 2 from t1;
+----
+1024
+4096
+8192
diff --git a/datafusion/expr/src/type_coercion/binary.rs
b/datafusion/expr/src/type_coercion/binary.rs
index ba24f4a90..d2e081af1 100644
--- a/datafusion/expr/src/type_coercion/binary.rs
+++ b/datafusion/expr/src/type_coercion/binary.rs
@@ -173,12 +173,27 @@ fn bitwise_coercion(left_type: &DataType, right_type:
&DataType) -> Option<DataT
return Some(left_type.clone());
}
- // TODO support other data type
match (left_type, right_type) {
- (Int64, _) | (_, Int64) => Some(Int64),
- (Int32, _) | (_, Int32) => Some(Int32),
- (Int16, _) | (_, Int16) => Some(Int16),
+ (UInt64, _) | (_, UInt64) => Some(UInt64),
+ (Int64, _)
+ | (_, Int64)
+ | (UInt32, Int8)
+ | (Int8, UInt32)
+ | (UInt32, Int16)
+ | (Int16, UInt32)
+ | (UInt32, Int32)
+ | (Int32, UInt32) => Some(Int64),
+ (Int32, _)
+ | (_, Int32)
+ | (UInt16, Int16)
+ | (Int16, UInt16)
+ | (UInt16, Int8)
+ | (Int8, UInt16) => Some(Int32),
+ (UInt32, _) | (_, UInt32) => Some(UInt32),
+ (Int16, _) | (_, Int16) | (Int8, UInt8) | (UInt8, Int8) => Some(Int16),
+ (UInt16, _) | (_, UInt16) => Some(UInt16),
(Int8, _) | (_, Int8) => Some(Int8),
+ (UInt8, _) | (_, UInt8) => Some(UInt8),
_ => None,
}
}
@@ -1035,6 +1050,42 @@ mod tests {
Operator::BitwiseAnd,
DataType::Int64
);
+ test_coercion_binary_rule!(
+ DataType::UInt64,
+ DataType::UInt64,
+ Operator::BitwiseAnd,
+ DataType::UInt64
+ );
+ test_coercion_binary_rule!(
+ DataType::Int8,
+ DataType::UInt32,
+ Operator::BitwiseAnd,
+ DataType::Int64
+ );
+ test_coercion_binary_rule!(
+ DataType::UInt32,
+ DataType::Int32,
+ Operator::BitwiseAnd,
+ DataType::Int64
+ );
+ test_coercion_binary_rule!(
+ DataType::UInt16,
+ DataType::Int16,
+ Operator::BitwiseAnd,
+ DataType::Int32
+ );
+ test_coercion_binary_rule!(
+ DataType::UInt32,
+ DataType::UInt32,
+ Operator::BitwiseAnd,
+ DataType::UInt32
+ );
+ test_coercion_binary_rule!(
+ DataType::UInt16,
+ DataType::UInt32,
+ Operator::BitwiseAnd,
+ DataType::UInt32
+ );
Ok(())
}
diff --git a/datafusion/physical-expr/src/expressions/binary.rs
b/datafusion/physical-expr/src/expressions/binary.rs
index a0dd9a41d..fe268c5a3 100644
--- a/datafusion/physical-expr/src/expressions/binary.rs
+++ b/datafusion/physical-expr/src/expressions/binary.rs
@@ -1663,16 +1663,28 @@ mod tests {
vec![0i64, 0i64, 1i64],
);
test_coercion!(
- Int16Array,
- DataType::Int16,
- vec![1i16, 2i16, 3i16],
- Int64Array,
- DataType::Int64,
- vec![10i64, 4i64, 5i64],
+ UInt16Array,
+ DataType::UInt16,
+ vec![1u16, 2u16, 3u16],
+ UInt64Array,
+ DataType::UInt64,
+ vec![10u64, 4u64, 5u64],
+ Operator::BitwiseAnd,
+ UInt64Array,
+ DataType::UInt64,
+ vec![0u64, 0u64, 1u64],
+ );
+ test_coercion!(
+ UInt16Array,
+ DataType::UInt16,
+ vec![1u16, 2u16, 3u16],
+ UInt64Array,
+ DataType::UInt64,
+ vec![10u64, 4u64, 5u64],
Operator::BitwiseOr,
- Int64Array,
- DataType::Int64,
- vec![11i64, 6i64, 7i64],
+ UInt64Array,
+ DataType::UInt64,
+ vec![11u64, 6u64, 7u64],
);
test_coercion!(
Int16Array,
@@ -1686,6 +1698,18 @@ mod tests {
DataType::Int64,
vec![9i64, 4i64, 6i64],
);
+ test_coercion!(
+ UInt16Array,
+ DataType::UInt16,
+ vec![3u16, 2u16, 3u16],
+ UInt64Array,
+ DataType::UInt64,
+ vec![10u64, 6u64, 5u64],
+ Operator::BitwiseXor,
+ UInt64Array,
+ DataType::UInt64,
+ vec![9u64, 4u64, 6u64],
+ );
Ok(())
}
@@ -4093,6 +4117,22 @@ mod tests {
let expected = Int32Array::from(vec![Some(13), None, Some(12)]);
assert_eq!(result.as_ref(), &expected);
+ let left =
+ Arc::new(UInt32Array::from(vec![Some(12), None, Some(11)])) as
ArrayRef;
+ let right =
+ Arc::new(UInt32Array::from(vec![Some(1), Some(3), Some(7)])) as
ArrayRef;
+ let mut result = bitwise_and(left.clone(), right.clone())?;
+ let expected = UInt32Array::from(vec![Some(0), None, Some(3)]);
+ assert_eq!(result.as_ref(), &expected);
+
+ result = bitwise_or(left.clone(), right.clone())?;
+ let expected = UInt32Array::from(vec![Some(13), None, Some(15)]);
+ assert_eq!(result.as_ref(), &expected);
+
+ result = bitwise_xor(left.clone(), right.clone())?;
+ let expected = UInt32Array::from(vec![Some(13), None, Some(12)]);
+ assert_eq!(result.as_ref(), &expected);
+
Ok(())
}
@@ -4109,6 +4149,17 @@ mod tests {
result = bitwise_shift_right(result.clone(), modules.clone())?;
assert_eq!(result.as_ref(), &input);
+ let input =
+ Arc::new(UInt32Array::from(vec![Some(2), None, Some(10)])) as
ArrayRef;
+ let modules =
+ Arc::new(UInt32Array::from(vec![Some(2), Some(4), Some(8)])) as
ArrayRef;
+ let mut result = bitwise_shift_left(input.clone(), modules.clone())?;
+
+ let expected = UInt32Array::from(vec![Some(8), None, Some(2560)]);
+ assert_eq!(result.as_ref(), &expected);
+
+ result = bitwise_shift_right(result.clone(), modules.clone())?;
+ assert_eq!(result.as_ref(), &input);
Ok(())
}
@@ -4121,6 +4172,12 @@ mod tests {
let expected = Int32Array::from(vec![Some(32)]);
assert_eq!(result.as_ref(), &expected);
+ let input = Arc::new(UInt32Array::from(vec![Some(2)])) as ArrayRef;
+ let modules = Arc::new(UInt32Array::from(vec![Some(100)])) as ArrayRef;
+ let result = bitwise_shift_left(input.clone(), modules.clone())?;
+
+ let expected = UInt32Array::from(vec![Some(32)]);
+ assert_eq!(result.as_ref(), &expected);
Ok(())
}
@@ -4139,6 +4196,21 @@ mod tests {
result = bitwise_xor_scalar(&left, right).unwrap()?;
let expected = Int32Array::from(vec![Some(15), None, Some(8)]);
assert_eq!(result.as_ref(), &expected);
+
+ let left =
+ Arc::new(UInt32Array::from(vec![Some(12), None, Some(11)])) as
ArrayRef;
+ let right = ScalarValue::from(3u32);
+ let mut result = bitwise_and_scalar(&left, right.clone()).unwrap()?;
+ let expected = UInt32Array::from(vec![Some(0), None, Some(3)]);
+ assert_eq!(result.as_ref(), &expected);
+
+ result = bitwise_or_scalar(&left, right.clone()).unwrap()?;
+ let expected = UInt32Array::from(vec![Some(15), None, Some(11)]);
+ assert_eq!(result.as_ref(), &expected);
+
+ result = bitwise_xor_scalar(&left, right).unwrap()?;
+ let expected = UInt32Array::from(vec![Some(15), None, Some(8)]);
+ assert_eq!(result.as_ref(), &expected);
Ok(())
}
@@ -4154,6 +4226,15 @@ mod tests {
result = bitwise_shift_right_scalar(&result, module).unwrap()?;
assert_eq!(result.as_ref(), &input);
+ let input = Arc::new(UInt32Array::from(vec![Some(2), None, Some(4)]))
as ArrayRef;
+ let module = ScalarValue::from(10u32);
+ let mut result = bitwise_shift_left_scalar(&input,
module.clone()).unwrap()?;
+
+ let expected = UInt32Array::from(vec![Some(2048), None, Some(4096)]);
+ assert_eq!(result.as_ref(), &expected);
+
+ result = bitwise_shift_right_scalar(&result, module).unwrap()?;
+ assert_eq!(result.as_ref(), &input);
Ok(())
}
diff --git a/datafusion/physical-expr/src/expressions/binary/kernels.rs
b/datafusion/physical-expr/src/expressions/binary/kernels.rs
index 9414ea11c..f38180e92 100644
--- a/datafusion/physical-expr/src/expressions/binary/kernels.rs
+++ b/datafusion/physical-expr/src/expressions/binary/kernels.rs
@@ -76,16 +76,28 @@ macro_rules! binary_bitwise_array_scalar {
pub(crate) fn bitwise_and(left: ArrayRef, right: ArrayRef) -> Result<ArrayRef>
{
match &left.data_type() {
DataType::Int8 => {
- binary_bitwise_array_op!(left, right, |a, b| a & b, Int8Array)
+ binary_bitwise_array_op!(left, right, |a: i8, b: i8| a & b,
Int8Array)
}
DataType::Int16 => {
- binary_bitwise_array_op!(left, right, |a, b| a & b, Int16Array)
+ binary_bitwise_array_op!(left, right, |a: i16, b: i16| a & b,
Int16Array)
}
DataType::Int32 => {
- binary_bitwise_array_op!(left, right, |a, b| a & b, Int32Array)
+ binary_bitwise_array_op!(left, right, |a: i32, b: i32| a & b,
Int32Array)
}
DataType::Int64 => {
- binary_bitwise_array_op!(left, right, |a, b| a & b, Int64Array)
+ binary_bitwise_array_op!(left, right, |a: i64, b: i64| a & b,
Int64Array)
+ }
+ DataType::UInt8 => {
+ binary_bitwise_array_op!(left, right, |a: u8, b: u8| a & b,
UInt8Array)
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_op!(left, right, |a: u16, b: u16| a & b,
UInt16Array)
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_op!(left, right, |a: u32, b: u32| a & b,
UInt32Array)
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_op!(left, right, |a: u64, b: u64| a & b,
UInt64Array)
}
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
@@ -129,6 +141,38 @@ pub(crate) fn bitwise_shift_right(left: ArrayRef, right:
ArrayRef) -> Result<Arr
Int64Array
)
}
+ DataType::UInt8 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u8, b: u8| a.wrapping_shr(b as u32),
+ UInt8Array
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u16, b: u16| a.wrapping_shr(b as u32),
+ UInt16Array
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u32, b: u32| a.wrapping_shr(b),
+ UInt32Array
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u64, b: u64| a.wrapping_shr(b.try_into().unwrap()),
+ UInt64Array
+ )
+ }
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
other,
@@ -171,6 +215,38 @@ pub(crate) fn bitwise_shift_left(left: ArrayRef, right:
ArrayRef) -> Result<Arra
Int64Array
)
}
+ DataType::UInt8 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u8, b: u8| a.wrapping_shl(b as u32),
+ UInt8Array
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u16, b: u16| a.wrapping_shl(b as u32),
+ UInt16Array
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u32, b: u32| a.wrapping_shl(b),
+ UInt32Array
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_op!(
+ left,
+ right,
+ |a: u64, b: u64| a.wrapping_shr(b.try_into().unwrap()),
+ UInt64Array
+ )
+ }
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
other,
@@ -182,16 +258,28 @@ pub(crate) fn bitwise_shift_left(left: ArrayRef, right:
ArrayRef) -> Result<Arra
pub(crate) fn bitwise_or(left: ArrayRef, right: ArrayRef) -> Result<ArrayRef> {
match &left.data_type() {
DataType::Int8 => {
- binary_bitwise_array_op!(left, right, |a, b| a | b, Int8Array)
+ binary_bitwise_array_op!(left, right, |a: i8, b: i8| a | b,
Int8Array)
}
DataType::Int16 => {
- binary_bitwise_array_op!(left, right, |a, b| a | b, Int16Array)
+ binary_bitwise_array_op!(left, right, |a: i16, b: i16| a | b,
Int16Array)
}
DataType::Int32 => {
- binary_bitwise_array_op!(left, right, |a, b| a | b, Int32Array)
+ binary_bitwise_array_op!(left, right, |a: i32, b: i32| a | b,
Int32Array)
}
DataType::Int64 => {
- binary_bitwise_array_op!(left, right, |a, b| a | b, Int64Array)
+ binary_bitwise_array_op!(left, right, |a: i64, b: i64| a | b,
Int64Array)
+ }
+ DataType::UInt8 => {
+ binary_bitwise_array_op!(left, right, |a: u8, b: u8| a | b,
UInt8Array)
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_op!(left, right, |a: u16, b: u16| a | b,
UInt16Array)
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_op!(left, right, |a: u32, b: u32| a | b,
UInt32Array)
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_op!(left, right, |a: u64, b: u64| a | b,
UInt64Array)
}
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
@@ -204,16 +292,28 @@ pub(crate) fn bitwise_or(left: ArrayRef, right: ArrayRef)
-> Result<ArrayRef> {
pub(crate) fn bitwise_xor(left: ArrayRef, right: ArrayRef) -> Result<ArrayRef>
{
match &left.data_type() {
DataType::Int8 => {
- binary_bitwise_array_op!(left, right, |a, b| a ^ b, Int8Array)
+ binary_bitwise_array_op!(left, right, |a: i8, b: i8| a ^ b,
Int8Array)
}
DataType::Int16 => {
- binary_bitwise_array_op!(left, right, |a, b| a ^ b, Int16Array)
+ binary_bitwise_array_op!(left, right, |a: i16, b: i16| a ^ b,
Int16Array)
}
DataType::Int32 => {
- binary_bitwise_array_op!(left, right, |a, b| a ^ b, Int32Array)
+ binary_bitwise_array_op!(left, right, |a: i32, b: i32| a ^ b,
Int32Array)
}
DataType::Int64 => {
- binary_bitwise_array_op!(left, right, |a, b| a ^ b, Int64Array)
+ binary_bitwise_array_op!(left, right, |a: i64, b: i64| a ^ b,
Int64Array)
+ }
+ DataType::UInt8 => {
+ binary_bitwise_array_op!(left, right, |a: u8, b: u8| a ^ b,
UInt8Array)
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_op!(left, right, |a: u16, b: u16| a ^ b,
UInt16Array)
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_op!(left, right, |a: u32, b: u32| a ^ b,
UInt32Array)
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_op!(left, right, |a: u64, b: u64| a ^ b,
UInt64Array)
}
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
@@ -229,16 +329,76 @@ pub(crate) fn bitwise_and_scalar(
) -> Option<Result<ArrayRef>> {
let result = match array.data_type() {
DataType::Int8 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a & b,
Int8Array, i8)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i8, b: i8| a & b,
+ Int8Array,
+ i8
+ )
}
DataType::Int16 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a & b,
Int16Array, i16)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i16, b: i16| a & b,
+ Int16Array,
+ i16
+ )
}
DataType::Int32 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a & b,
Int32Array, i32)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i32, b: i32| a & b,
+ Int32Array,
+ i32
+ )
}
DataType::Int64 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a & b,
Int64Array, i64)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i64, b: i64| a & b,
+ Int64Array,
+ i64
+ )
+ }
+ DataType::UInt8 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u8, b: u8| a & b,
+ UInt8Array,
+ u8
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u16, b: u16| a & b,
+ UInt16Array,
+ u16
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u32, b: u32| a & b,
+ UInt32Array,
+ u32
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u64, b: u64| a & b,
+ UInt64Array,
+ u64
+ )
}
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
@@ -255,16 +415,76 @@ pub(crate) fn bitwise_or_scalar(
) -> Option<Result<ArrayRef>> {
let result = match array.data_type() {
DataType::Int8 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a | b,
Int8Array, i8)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i8, b: i8| a | b,
+ Int8Array,
+ i8
+ )
}
DataType::Int16 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a | b,
Int16Array, i16)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i16, b: i16| a | b,
+ Int16Array,
+ i16
+ )
}
DataType::Int32 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a | b,
Int32Array, i32)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i32, b: i32| a | b,
+ Int32Array,
+ i32
+ )
}
DataType::Int64 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a | b,
Int64Array, i64)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i64, b: i64| a | b,
+ Int64Array,
+ i64
+ )
+ }
+ DataType::UInt8 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u8, b: u8| a | b,
+ UInt8Array,
+ u8
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u16, b: u16| a | b,
+ UInt16Array,
+ u16
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u32, b: u32| a | b,
+ UInt32Array,
+ u32
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u64, b: u64| a | b,
+ UInt64Array,
+ u64
+ )
}
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
@@ -281,16 +501,76 @@ pub(crate) fn bitwise_xor_scalar(
) -> Option<Result<ArrayRef>> {
let result = match array.data_type() {
DataType::Int8 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a ^ b,
Int8Array, i8)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i8, b: i8| a ^ b,
+ Int8Array,
+ i8
+ )
}
DataType::Int16 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a ^ b,
Int16Array, i16)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i16, b: i16| a ^ b,
+ Int16Array,
+ i16
+ )
}
DataType::Int32 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a ^ b,
Int32Array, i32)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i32, b: i32| a ^ b,
+ Int32Array,
+ i32
+ )
}
DataType::Int64 => {
- binary_bitwise_array_scalar!(array, scalar, |a, b| a ^ b,
Int64Array, i64)
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: i64, b: i64| a ^ b,
+ Int64Array,
+ i64
+ )
+ }
+ DataType::UInt8 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u8, b: u8| a ^ b,
+ UInt8Array,
+ u8
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u16, b: u16| a ^ b,
+ UInt16Array,
+ u16
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u32, b: u32| a ^ b,
+ UInt32Array,
+ u32
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u64, b: u64| a ^ b,
+ UInt64Array,
+ u64
+ )
}
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
@@ -342,6 +622,42 @@ pub(crate) fn bitwise_shift_right_scalar(
i64
)
}
+ DataType::UInt8 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u8, b: u8| a.wrapping_shr(b as u32),
+ UInt8Array,
+ u8
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u16, b: u16| a.wrapping_shr(b as u32),
+ UInt16Array,
+ u16
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u32, b: u32| a.wrapping_shr(b),
+ UInt32Array,
+ u32
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u64, b: u32| a.wrapping_shr(b),
+ UInt64Array,
+ u32
+ )
+ }
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
other,
@@ -392,6 +708,42 @@ pub(crate) fn bitwise_shift_left_scalar(
i64
)
}
+ DataType::UInt8 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u8, b: u8| a.wrapping_shl(b as u32),
+ UInt8Array,
+ u8
+ )
+ }
+ DataType::UInt16 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u16, b: u16| a.wrapping_shl(b as u32),
+ UInt16Array,
+ u16
+ )
+ }
+ DataType::UInt32 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u32, b: u32| a.wrapping_shl(b),
+ UInt32Array,
+ u32
+ )
+ }
+ DataType::UInt64 => {
+ binary_bitwise_array_scalar!(
+ array,
+ scalar,
+ |a: u64, b: u32| a.wrapping_shr(b),
+ UInt64Array,
+ u32
+ )
+ }
other => Err(DataFusionError::Internal(format!(
"Data type {:?} not supported for binary operation '{}' on dyn
arrays",
other,