Apply NULL mask to the result using NullBuffer::union
(
result: ColumnarValue,
null_mask: NullMaskResolution,
return_type: &DataType,
)
| 73 | |
| 74 | /// Apply NULL mask to the result using NullBuffer::union |
| 75 | pub(crate) fn apply_null_mask( |
| 76 | result: ColumnarValue, |
| 77 | null_mask: NullMaskResolution, |
| 78 | return_type: &DataType, |
| 79 | ) -> Result<ColumnarValue> { |
| 80 | match (result, null_mask) { |
| 81 | // Scalar with ReturnNull mask means return NULL of the correct type |
| 82 | (ColumnarValue::Scalar(_), NullMaskResolution::ReturnNull) => { |
| 83 | Ok(ColumnarValue::Scalar(ScalarValue::try_from(return_type)?)) |
| 84 | } |
| 85 | // Scalar without mask, return as-is |
| 86 | (scalar @ ColumnarValue::Scalar(_), NullMaskResolution::NoMask) => Ok(scalar), |
| 87 | // Array with NULL mask - use NullBuffer::union to combine nulls |
| 88 | (ColumnarValue::Array(array), NullMaskResolution::Apply(null_mask)) => { |
| 89 | // Combine the result's existing nulls with our computed null mask |
| 90 | let combined_nulls = NullBuffer::union(array.nulls(), Some(&null_mask)); |
| 91 | |
| 92 | // Create new array with combined nulls |
| 93 | let new_array = array |
| 94 | .into_data() |
| 95 | .into_builder() |
| 96 | .nulls(combined_nulls) |
| 97 | .build()?; |
| 98 | |
| 99 | Ok(ColumnarValue::Array(Arc::new(arrow::array::make_array( |
| 100 | new_array, |
| 101 | )))) |
| 102 | } |
| 103 | // Array without NULL mask, return as-is |
| 104 | (array @ ColumnarValue::Array(_), NullMaskResolution::NoMask) => Ok(array), |
| 105 | // Edge cases that shouldn't happen in practice |
| 106 | (scalar, _) => Ok(scalar), |
| 107 | } |
| 108 | } |
no test coverage detected
searching dependent graphs…