Skip to content

Commit 6e82cf8

Browse files
committed
fix
1 parent f822514 commit 6e82cf8

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

src/query/service/src/physical_plans/physical_join.rs

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414

1515
use databend_common_exception::ErrorCode;
1616
use databend_common_exception::Result;
17+
use databend_common_expression::types::DataType;
1718
use databend_common_settings::Settings;
1819
use databend_common_sql::binder::is_range_join_condition;
1920
use databend_common_sql::optimizer::ir::RelExpr;
2021
use databend_common_sql::optimizer::ir::SExpr;
2122
use databend_common_sql::plans::FunctionCall;
2223
use databend_common_sql::plans::Join;
24+
use databend_common_sql::plans::JoinEquiCondition;
2325
use databend_common_sql::plans::JoinType;
2426
use databend_common_sql::ColumnSet;
2527
use databend_common_sql::ScalarExpr;
@@ -63,17 +65,9 @@ fn physical_join(join: &Join, s_expr: &SExpr, settings: &Settings) -> Result<Phy
6365
let conditions = join
6466
.non_equi_conditions
6567
.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<_>>()?;
7771
return Ok(PhysicalJoinType::LoopJoin { conditions });
7872
};
7973

@@ -229,3 +223,28 @@ impl PhysicalPlanBuilder {
229223
}
230224
}
231225
}
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+
}

src/query/sql/src/planner/plans/join.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,11 @@ impl JoinEquiCondition {
222222
left.into_iter()
223223
.zip(right)
224224
.enumerate()
225-
.map(|(index, (l, r))| JoinEquiCondition::new(l, r, is_null_equal.contains(&index)))
225+
.map(|(index, (left, right))| Self {
226+
left,
227+
right,
228+
is_null_equal: is_null_equal.contains(&index),
229+
})
226230
.collect()
227231
}
228232
}

0 commit comments

Comments
 (0)