You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by GitBox <gi...@apache.org> on 2020/09/16 12:32:17 UTC

[GitHub] [arrow] jhorstmann opened a new pull request #8204: Arrow 10016 Implement is null / is not null kernels

jhorstmann opened a new pull request #8204:
URL: https://github.com/apache/arrow/pull/8204


   Needs to be rebased after #8183 is merged


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] jorgecarleitao commented on a change in pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
jorgecarleitao commented on a change in pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#discussion_r489891307



##########
File path: rust/datafusion/src/physical_plan/expressions.rs
##########
@@ -1331,6 +1331,82 @@ pub fn not(arg: Arc<dyn PhysicalExpr>) -> Arc<dyn PhysicalExpr> {
     Arc::new(NotExpr::new(arg))
 }
 
+/// IS NULL expression
+#[derive(Debug)]
+pub struct IsNullExpr {
+    arg: Arc<dyn PhysicalExpr>,
+}
+
+impl IsNullExpr {
+    /// Create new not expression
+    pub fn new(arg: Arc<dyn PhysicalExpr>) -> Self {
+        Self { arg }
+    }
+}
+
+impl fmt::Display for IsNullExpr {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} IS NULL", self.arg)
+    }
+}
+impl PhysicalExpr for IsNullExpr {
+    fn data_type(&self, _input_schema: &Schema) -> Result<DataType> {
+        return Ok(DataType::Boolean);
+    }
+
+    fn nullable(&self, _input_schema: &Schema) -> Result<bool> {
+        Ok(false)
+    }
+
+    fn evaluate(&self, batch: &RecordBatch) -> Result<ArrayRef> {
+        let arg = self.arg.evaluate(batch)?;
+        return Ok(Arc::new(arrow::compute::is_null(&arg)?));
+    }
+}
+
+/// Create an IS NULL expression
+pub fn is_null(arg: Arc<dyn PhysicalExpr>) -> Result<Arc<dyn PhysicalExpr>> {
+    Ok(Arc::new(IsNullExpr::new(arg)))
+}
+
+/// IS NULL expression
+#[derive(Debug)]
+pub struct IsNotNullExpr {
+    arg: Arc<dyn PhysicalExpr>,
+}
+
+impl IsNotNullExpr {
+    /// Create new not expression
+    pub fn new(arg: Arc<dyn PhysicalExpr>) -> Self {
+        Self { arg }
+    }
+}
+
+impl fmt::Display for IsNotNullExpr {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{} IS NULL", self.arg)

Review comment:
       `IS NOT NULL`?

##########
File path: rust/arrow/src/compute/kernels/boolean.rs
##########
@@ -266,4 +334,150 @@ mod tests {
         assert_eq!(false, c.value(2));
         assert_eq!(true, c.value(3));
     }
+
+    #[test]
+    fn test_nonnull_array_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4]));
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(false, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(false, res.value(3));
+    }
+
+    #[test]
+    fn test_nonnull_array_with_offset_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1,
+        ]));
+        let a = a.slice(8, 4);
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(false, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(false, res.value(3));
+    }
+
+    #[test]
+    fn test_nonnull_array_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4]));
+
+        let res = is_not_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(true, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(true, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nonnull_array_with_offset_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1,
+        ]));
+        let a = a.slice(8, 4);
+
+        let res = is_not_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(true, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(true, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![Some(1), None, Some(3), None]));
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_with_offset_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            Some(1),
+            None,
+            Some(2),
+            None,
+            Some(3),
+            Some(4),
+            None,
+            None,
+        ]));
+        let a = a.slice(8, 4);
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![Some(1), None, Some(3), None]));
+
+        let res = is_not_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(true, res.value(0));
+        assert_eq!(false, res.value(1));
+        assert_eq!(true, res.value(2));
+        assert_eq!(false, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_with_offset_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            Some(1),

Review comment:
       `// offset 8 starts here` ? ^_^

##########
File path: rust/datafusion/tests/sql.rs
##########
@@ -797,3 +797,51 @@ fn to_timstamp() -> Result<()> {
     assert_eq!(expected, actual);
     Ok(())
 }
+
+#[test]
+fn query_is_null() -> Result<()> {
+    let schema = Arc::new(Schema::new(vec![Field::new("c1", DataType::Float64, true)]));
+
+    let data = RecordBatch::try_new(
+        schema.clone(),
+        vec![Arc::new(Float64Array::from(vec![
+            Some(1.0),
+            None,
+            Some(f64::NAN),

Review comment:
       💯 nan is not null :)

##########
File path: rust/arrow/src/compute/kernels/boolean.rs
##########
@@ -266,4 +334,150 @@ mod tests {
         assert_eq!(false, c.value(2));
         assert_eq!(true, c.value(3));
     }
+
+    #[test]
+    fn test_nonnull_array_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4]));
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(false, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(false, res.value(3));
+    }
+
+    #[test]
+    fn test_nonnull_array_with_offset_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1,
+        ]));
+        let a = a.slice(8, 4);
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(false, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(false, res.value(3));
+    }
+
+    #[test]
+    fn test_nonnull_array_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4]));
+
+        let res = is_not_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(true, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(true, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nonnull_array_with_offset_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1,
+        ]));
+        let a = a.slice(8, 4);
+
+        let res = is_not_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(true, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(true, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![Some(1), None, Some(3), None]));
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_with_offset_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            None,
+            Some(1),
+            None,
+            Some(2),
+            None,
+            Some(3),
+            Some(4),
+            None,
+            None,
+        ]));
+        let a = a.slice(8, 4);
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());
+        assert_eq!(false, res.value(0));
+        assert_eq!(true, res.value(1));
+        assert_eq!(false, res.value(2));
+        assert_eq!(true, res.value(3));
+    }
+
+    #[test]
+    fn test_nullable_array_is_not_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![Some(1), None, Some(3), None]));
+
+        let res = is_not_null(&a).unwrap();
+
+        assert_eq!(4, res.len());

Review comment:
       assert no null counts?

##########
File path: rust/arrow/src/compute/kernels/boolean.rs
##########
@@ -266,4 +334,150 @@ mod tests {
         assert_eq!(false, c.value(2));
         assert_eq!(true, c.value(3));
     }
+
+    #[test]
+    fn test_nonnull_array_is_null() {
+        let a: ArrayRef = Arc::new(Int32Array::from(vec![1, 2, 3, 4]));
+
+        let res = is_null(&a).unwrap();
+
+        assert_eq!(4, res.len());

Review comment:
       assert no null counts?

##########
File path: rust/datafusion/src/physical_plan/expressions.rs
##########
@@ -2499,4 +2574,56 @@ mod tests {
 
         Ok(())
     }
+
+    #[test]
+    fn is_null_op() -> Result<()> {
+        let schema = Schema::new(vec![Field::new("a", DataType::Utf8, true)]);
+        let a = StringArray::from(vec![Some("foo"), None]);
+        let batch = RecordBatch::try_new(Arc::new(schema.clone()), vec![Arc::new(a)])?;
+
+        // expression: "a is null"
+        let expr = is_null(col("a")).unwrap();
+        let result = expr.evaluate(&batch)?;
+
+        let expected = vec![false, true];
+
+        let result = result
+            .as_any()
+            .downcast_ref::<BooleanArray>()
+            .expect("failed to downcast to BooleanArray");
+
+        assert_eq!(result.len(), expected.len());
+
+        for i in 0..expected.len() {
+            assert_eq!(result.value(i), expected[i]);
+        }
+
+        Ok(())
+    }
+
+    #[test]
+    fn is_not_null_op() -> Result<()> {
+        let schema = Schema::new(vec![Field::new("a", DataType::Utf8, true)]);
+        let a = StringArray::from(vec![Some("foo"), None]);
+        let batch = RecordBatch::try_new(Arc::new(schema.clone()), vec![Arc::new(a)])?;
+
+        // expression: "a is null"

Review comment:
       not null?

##########
File path: rust/datafusion/src/physical_plan/expressions.rs
##########
@@ -2499,4 +2574,56 @@ mod tests {
 
         Ok(())
     }
+
+    #[test]
+    fn is_null_op() -> Result<()> {
+        let schema = Schema::new(vec![Field::new("a", DataType::Utf8, true)]);
+        let a = StringArray::from(vec![Some("foo"), None]);
+        let batch = RecordBatch::try_new(Arc::new(schema.clone()), vec![Arc::new(a)])?;
+
+        // expression: "a is null"
+        let expr = is_null(col("a")).unwrap();
+        let result = expr.evaluate(&batch)?;
+
+        let expected = vec![false, true];
+
+        let result = result
+            .as_any()
+            .downcast_ref::<BooleanArray>()
+            .expect("failed to downcast to BooleanArray");
+
+        assert_eq!(result.len(), expected.len());
+
+        for i in 0..expected.len() {
+            assert_eq!(result.value(i), expected[i]);
+        }
+
+        Ok(())
+    }
+
+    #[test]
+    fn is_not_null_op() -> Result<()> {
+        let schema = Schema::new(vec![Field::new("a", DataType::Utf8, true)]);
+        let a = StringArray::from(vec![Some("foo"), None]);
+        let batch = RecordBatch::try_new(Arc::new(schema.clone()), vec![Arc::new(a)])?;
+
+        // expression: "a is null"
+        let expr = is_not_null(col("a")).unwrap();
+        let result = expr.evaluate(&batch)?;
+
+        let expected = vec![true, false];
+
+        let result = result
+            .as_any()
+            .downcast_ref::<BooleanArray>()
+            .expect("failed to downcast to BooleanArray");
+
+        assert_eq!(result.len(), expected.len());
+

Review comment:
       If we use
   ```
   let expected = &BooleanArray::from(vec![true, false]);
   ```
   
   then we can use 
   
   ```
   assert_eq!(result, expected);
   ```
   
   here, which may be more expressive of our intent.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] jhorstmann commented on a change in pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
jhorstmann commented on a change in pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#discussion_r490852595



##########
File path: rust/arrow/src/compute/kernels/filter.rs
##########
@@ -241,11 +241,21 @@ impl FilterContext {
         let filter_mask: Vec<u64> = (0..64).map(|x| 1u64 << x).collect();
         let filter_bytes = filter_array.data_ref().buffers()[0].data();
         let filtered_count = bit_util::count_set_bits(filter_bytes);
+
         // transmute filter_bytes to &[u64]
         let mut u64_buffer = MutableBuffer::new(filter_bytes.len());
-        u64_buffer
-            .write_bytes(filter_bytes, u64_buffer.capacity() - filter_bytes.len())?;
-        let filter_u64 = u64_buffer.typed_data_mut::<u64>().to_owned();
+        // add to the resulting len so is is a multiple of the size of u64
+        let pad_addional_len = 8 - filter_bytes.len() % 8;
+        u64_buffer.write_bytes(filter_bytes, pad_addional_len)?;
+        let mut filter_u64 = u64_buffer.typed_data_mut::<u64>().to_owned();
+
+        // mask of any bits outside of the given len
+        if filter_array.len() % 64 != 0 {
+            let last_idx = filter_u64.len() - 1;
+            let mask = u64::MAX >> (64 - filter_array.len() % 64);
+            filter_u64[last_idx] &= mask;

Review comment:
       This fixes the issue I reported about accessing bits outside of len in https://issues.apache.org/jira/browse/ARROW-10025




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] jhorstmann commented on a change in pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
jhorstmann commented on a change in pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#discussion_r490853068



##########
File path: rust/arrow/src/compute/kernels/filter.rs
##########
@@ -241,11 +241,21 @@ impl FilterContext {
         let filter_mask: Vec<u64> = (0..64).map(|x| 1u64 << x).collect();
         let filter_bytes = filter_array.data_ref().buffers()[0].data();
         let filtered_count = bit_util::count_set_bits(filter_bytes);
+
         // transmute filter_bytes to &[u64]
         let mut u64_buffer = MutableBuffer::new(filter_bytes.len());
-        u64_buffer
-            .write_bytes(filter_bytes, u64_buffer.capacity() - filter_bytes.len())?;
-        let filter_u64 = u64_buffer.typed_data_mut::<u64>().to_owned();
+        // add to the resulting len so is is a multiple of the size of u64
+        let pad_addional_len = 8 - filter_bytes.len() % 8;

Review comment:
       The previous code padded to a multiple of 64 bytes which does not seem necessary and makes masking of the last element more difficult.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] nevi-me closed pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
nevi-me closed pull request #8204:
URL: https://github.com/apache/arrow/pull/8204


   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] andygrove commented on pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
andygrove commented on pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#issuecomment-696744882


   @jhorstmann Looks like there is cargo fmt issue


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] jhorstmann commented on a change in pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
jhorstmann commented on a change in pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#discussion_r490863732



##########
File path: rust/arrow/src/compute/kernels/boolean.rs
##########
@@ -123,9 +125,78 @@ pub fn not(left: &BooleanArray) -> Result<BooleanArray> {
     Ok(BooleanArray::from(Arc::new(data)))
 }
 
+pub fn is_null(input: &ArrayRef) -> Result<BooleanArray> {
+    if input.offset() % 8 != 0 {

Review comment:
       This is currently a limitation of several kernels that operate on boolean arrays or null bitmaps because we try to operate on whole bytes (or larger) instead of individual bits for performance reasons. We would need a nicer abstraction for those bit packed buffers to iterate over chunks, regardless of offsets. I think it makes sense to look into such an implementation together with @jorgecarleitao proposal for an iterator interface.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] github-actions[bot] commented on pull request #8204: ARROW-10016: [RUST] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
github-actions[bot] commented on pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#issuecomment-693377243


   https://issues.apache.org/jira/browse/ARROW-10016


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] jhorstmann commented on pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
jhorstmann commented on pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#issuecomment-697172063


   @andygrove format issue is solved


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] nevi-me commented on a change in pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
nevi-me commented on a change in pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#discussion_r490879919



##########
File path: rust/arrow/src/compute/kernels/boolean.rs
##########
@@ -123,9 +125,78 @@ pub fn not(left: &BooleanArray) -> Result<BooleanArray> {
     Ok(BooleanArray::from(Arc::new(data)))
 }
 
+pub fn is_null(input: &ArrayRef) -> Result<BooleanArray> {
+    if input.offset() % 8 != 0 {

Review comment:
       Oh yes, I remember that now. I tried looking at bit manipulation that would address this, but I can't remember where; maybe as part of the Parquet writer 🤔
   
   It's def something that we need to do, if I have more time in the coming months I'll look into it. We could also take inspiration from c++ as I think they have this.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] nevi-me commented on a change in pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
nevi-me commented on a change in pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#discussion_r490853034



##########
File path: rust/arrow/src/compute/kernels/boolean.rs
##########
@@ -123,9 +125,78 @@ pub fn not(left: &BooleanArray) -> Result<BooleanArray> {
     Ok(BooleanArray::from(Arc::new(data)))
 }
 
+pub fn is_null(input: &ArrayRef) -> Result<BooleanArray> {
+    if input.offset() % 8 != 0 {

Review comment:
       Is this limitation fine, or is there a potential way around it? Does it mean that `array[len = 30].slice(5, 20).is_null()` would fail?




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] jhorstmann commented on pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
jhorstmann commented on pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#issuecomment-693526565


   The `IS NULL` and probably also the `NOT` kernel seem to have some unexpected interactions with the filter kernel, which accesses bits outside of the len. I created a ticket for that at https://issues.apache.org/jira/browse/ARROW-10025


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [arrow] andygrove commented on pull request #8204: ARROW-10016: [Rust] Implement is null / is not null kernels

Posted by GitBox <gi...@apache.org>.
andygrove commented on pull request #8204:
URL: https://github.com/apache/arrow/pull/8204#issuecomment-696744882


   @jhorstmann Looks like there is cargo fmt issue


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org