|
14 | 14 |
|
15 | 15 | use databend_common_exception::ErrorCode; |
16 | 16 | use databend_common_exception::Result; |
| 17 | +use databend_common_expression::types::DataType; |
17 | 18 | use databend_common_settings::Settings; |
18 | 19 | use databend_common_sql::binder::is_range_join_condition; |
19 | 20 | use databend_common_sql::optimizer::ir::RelExpr; |
20 | 21 | use databend_common_sql::optimizer::ir::SExpr; |
21 | 22 | use databend_common_sql::plans::FunctionCall; |
22 | 23 | use databend_common_sql::plans::Join; |
| 24 | +use databend_common_sql::plans::JoinEquiCondition; |
23 | 25 | use databend_common_sql::plans::JoinType; |
24 | 26 | use databend_common_sql::ColumnSet; |
25 | 27 | use databend_common_sql::ScalarExpr; |
@@ -63,17 +65,9 @@ fn physical_join(join: &Join, s_expr: &SExpr, settings: &Settings) -> Result<Phy |
63 | 65 | let conditions = join |
64 | 66 | .non_equi_conditions |
65 | 67 | .iter() |
66 | | - .cloned() |
67 | | - .chain(join.equi_conditions.iter().cloned().map(|condition| { |
68 | | - FunctionCall { |
69 | | - span: condition.left.span(), |
70 | | - func_name: "eq".to_string(), |
71 | | - params: vec![], |
72 | | - arguments: vec![condition.left, condition.right], |
73 | | - } |
74 | | - .into() |
75 | | - })) |
76 | | - .collect(); |
| 68 | + .map(|c| Ok(c.clone())) |
| 69 | + .chain(join.equi_conditions.iter().map(condition_to_expr)) |
| 70 | + .collect::<Result<_>>()?; |
77 | 71 | return Ok(PhysicalJoinType::LoopJoin { conditions }); |
78 | 72 | }; |
79 | 73 |
|
@@ -229,3 +223,28 @@ impl PhysicalPlanBuilder { |
229 | 223 | } |
230 | 224 | } |
231 | 225 | } |
| 226 | + |
| 227 | +fn condition_to_expr(condition: &JoinEquiCondition) -> Result<ScalarExpr> { |
| 228 | + let left_type = condition.left.data_type()?; |
| 229 | + let right_type = condition.right.data_type()?; |
| 230 | + |
| 231 | + let arguments = match (&left_type, &right_type) { |
| 232 | + (DataType::Nullable(left), right) if **left == *right => vec![ |
| 233 | + condition.left.clone(), |
| 234 | + condition.right.clone().unify_to_data_type(&left_type), |
| 235 | + ], |
| 236 | + (left, DataType::Nullable(right)) if *left == **right => vec![ |
| 237 | + condition.left.clone().unify_to_data_type(&right_type), |
| 238 | + condition.right.clone(), |
| 239 | + ], |
| 240 | + _ => vec![condition.left.clone(), condition.right.clone()], |
| 241 | + }; |
| 242 | + |
| 243 | + Ok(FunctionCall { |
| 244 | + span: condition.left.span(), |
| 245 | + func_name: "eq".to_string(), |
| 246 | + params: vec![], |
| 247 | + arguments, |
| 248 | + } |
| 249 | + .into()) |
| 250 | +} |
0 commit comments