Spark-compatible `pmod` function In ANSI mode, division by zero throws an error. In legacy mode, division by zero returns NULL (Spark behavior).
(
args: &[ColumnarValue],
enable_ansi_mode: bool,
)
| 69 | /// In ANSI mode, division by zero throws an error. |
| 70 | /// In legacy mode, division by zero returns NULL (Spark behavior). |
| 71 | pub fn spark_pmod( |
| 72 | args: &[ColumnarValue], |
| 73 | enable_ansi_mode: bool, |
| 74 | ) -> Result<ColumnarValue> { |
| 75 | assert_eq_or_internal_err!(args.len(), 2, "pmod expects exactly two arguments"); |
| 76 | let args = ColumnarValue::values_to_arrays(args)?; |
| 77 | let left = &args[0]; |
| 78 | let right = &args[1]; |
| 79 | let zero = ScalarValue::new_zero(left.data_type())?.to_array_of_size(left.len())?; |
| 80 | let result = try_rem(left, right, enable_ansi_mode)?; |
| 81 | let neg = lt(&result, &zero)?; |
| 82 | let plus = zip(&neg, right, &zero)?; |
| 83 | let result = add(&plus, &result)?; |
| 84 | let result = try_rem(&result, right, enable_ansi_mode)?; |
| 85 | Ok(ColumnarValue::Array(result)) |
| 86 | } |
| 87 | |
| 88 | /// SparkMod implements the Spark-compatible modulo function |
| 89 | #[derive(Debug, PartialEq, Eq, Hash)] |
searching dependent graphs…