|
17 | 17 |
|
18 | 18 | //! Converts Spark physical plan to DataFusion physical plan |
19 | 19 |
|
20 | | -use super::expressions::EvalMode; |
21 | 20 | use crate::execution::operators::CopyMode; |
22 | 21 | use crate::execution::operators::FilterExec as CometFilterExec; |
23 | 22 | use crate::{ |
@@ -62,8 +61,8 @@ use datafusion::{ |
62 | 61 | prelude::SessionContext, |
63 | 62 | }; |
64 | 63 | use datafusion_comet_spark_expr::{ |
65 | | - create_comet_physical_fun, create_negate_expr, BloomFilterAgg, BloomFilterMightContain, |
66 | | - SparkHour, SparkMinute, SparkSecond, |
| 64 | + create_comet_physical_fun, create_modulo_expr, create_negate_expr, BloomFilterAgg, |
| 65 | + BloomFilterMightContain, EvalMode, SparkHour, SparkMinute, SparkSecond, |
67 | 66 | }; |
68 | 67 |
|
69 | 68 | use crate::execution::operators::ExecutionError::GeneralError; |
@@ -268,13 +267,22 @@ impl PhysicalPlanner { |
268 | 267 | is_integral_div: true, |
269 | 268 | }, |
270 | 269 | ), |
271 | | - ExprStruct::Remainder(expr) => self.create_binary_expr( |
272 | | - expr.left.as_ref().unwrap(), |
273 | | - expr.right.as_ref().unwrap(), |
274 | | - expr.return_type.as_ref(), |
275 | | - DataFusionOperator::Modulo, |
276 | | - input_schema, |
277 | | - ), |
| 270 | + ExprStruct::Remainder(expr) => { |
| 271 | + let left = |
| 272 | + self.create_expr(expr.left.as_ref().unwrap(), Arc::clone(&input_schema))?; |
| 273 | + let right = |
| 274 | + self.create_expr(expr.right.as_ref().unwrap(), Arc::clone(&input_schema))?; |
| 275 | + |
| 276 | + let result = create_modulo_expr( |
| 277 | + left, |
| 278 | + right, |
| 279 | + expr.return_type.as_ref().map(to_arrow_datatype).unwrap(), |
| 280 | + input_schema, |
| 281 | + expr.fail_on_error, |
| 282 | + &self.session_ctx.state(), |
| 283 | + ); |
| 284 | + result.map_err(|e| GeneralError(e.to_string())) |
| 285 | + } |
278 | 286 | ExprStruct::Eq(expr) => { |
279 | 287 | let left = |
280 | 288 | self.create_expr(expr.left.as_ref().unwrap(), Arc::clone(&input_schema))?; |
@@ -851,19 +859,13 @@ impl PhysicalPlanner { |
851 | 859 | right.data_type(&input_schema), |
852 | 860 | ) { |
853 | 861 | ( |
854 | | - DataFusionOperator::Plus |
855 | | - | DataFusionOperator::Minus |
856 | | - | DataFusionOperator::Multiply |
857 | | - | DataFusionOperator::Modulo, |
| 862 | + DataFusionOperator::Plus | DataFusionOperator::Minus | DataFusionOperator::Multiply, |
858 | 863 | Ok(DataType::Decimal128(p1, s1)), |
859 | 864 | Ok(DataType::Decimal128(p2, s2)), |
860 | 865 | ) if ((op == DataFusionOperator::Plus || op == DataFusionOperator::Minus) |
861 | 866 | && max(s1, s2) as u8 + max(p1 - s1 as u8, p2 - s2 as u8) |
862 | 867 | >= DECIMAL128_MAX_PRECISION) |
863 | | - || (op == DataFusionOperator::Multiply && p1 + p2 >= DECIMAL128_MAX_PRECISION) |
864 | | - || (op == DataFusionOperator::Modulo |
865 | | - && max(s1, s2) as u8 + max(p1 - s1 as u8, p2 - s2 as u8) |
866 | | - > DECIMAL128_MAX_PRECISION) => |
| 868 | + || (op == DataFusionOperator::Multiply && p1 + p2 >= DECIMAL128_MAX_PRECISION) => |
867 | 869 | { |
868 | 870 | let data_type = return_type.map(to_arrow_datatype).unwrap(); |
869 | 871 | // For some Decimal128 operations, we need wider internal digits. |
@@ -903,6 +905,7 @@ impl PhysicalPlanner { |
903 | 905 | func_name, |
904 | 906 | data_type.clone(), |
905 | 907 | &self.session_ctx.state(), |
| 908 | + None, |
906 | 909 | )?; |
907 | 910 | Ok(Arc::new(ScalarFunctionExpr::new( |
908 | 911 | func_name, |
@@ -2305,8 +2308,12 @@ impl PhysicalPlanner { |
2305 | 2308 | } |
2306 | 2309 | }; |
2307 | 2310 |
|
2308 | | - let fun_expr = |
2309 | | - create_comet_physical_fun(fun_name, data_type.clone(), &self.session_ctx.state())?; |
| 2311 | + let fun_expr = create_comet_physical_fun( |
| 2312 | + fun_name, |
| 2313 | + data_type.clone(), |
| 2314 | + &self.session_ctx.state(), |
| 2315 | + None, |
| 2316 | + )?; |
2310 | 2317 |
|
2311 | 2318 | let args = args |
2312 | 2319 | .into_iter() |
|
0 commit comments