Skip to content

Commit edb1a92

Browse files
committed
fix: left join returns wrong answer
1 parent ee772bd commit edb1a92

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

src/query/service/src/sql/planner/binder/join.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -448,9 +448,11 @@ impl<'a> JoinConditionResolver<'a> {
448448
// Bump types of left conditions and right conditions
449449
let left_type = left.data_type();
450450
let right_type = right.data_type();
451-
let least_super_type = compare_coercion(&left_type, &right_type)?;
452-
left = wrap_cast_if_needed(left, &least_super_type);
453-
right = wrap_cast_if_needed(right, &least_super_type);
451+
if left_type.ne(&right_type) {
452+
let least_super_type = compare_coercion(&left_type, &right_type)?;
453+
left = wrap_cast_if_needed(left, &least_super_type);
454+
right = wrap_cast_if_needed(right, &least_super_type);
455+
}
454456

455457
if left_used_columns.is_subset(&left_columns)
456458
&& right_used_columns.is_subset(&right_columns)

src/query/service/src/sql/planner/binder/scalar_common.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,12 @@ pub fn split_equivalent_predicate(scalar: &Scalar) -> Option<(Scalar, Scalar)> {
8686
}
8787

8888
pub fn wrap_cast_if_needed(scalar: Scalar, target_type: &DataTypeImpl) -> Scalar {
89-
if scalar.data_type() != *target_type {
90-
let cast = CastExpr {
91-
from_type: Box::new(scalar.data_type()),
92-
argument: Box::new(scalar),
93-
target_type: Box::new(target_type.clone()),
94-
};
95-
cast.into()
96-
} else {
97-
scalar
89+
CastExpr {
90+
from_type: Box::new(scalar.data_type()),
91+
argument: Box::new(scalar),
92+
target_type: Box::new(target_type.clone()),
9893
}
94+
.into()
9995
}
10096

10197
pub fn satisfied_by(scalar: &Scalar, prop: &RelationalProperty) -> bool {

tests/logictest/suites/crdb/join

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,15 @@ B NULL B
661661
C NULL C
662662
E NULL E
663663

664+
statement query ITIT
665+
SELECT * FROM str1 LEFT OUTER JOIN str2 ON str1.s = str2.s order by str1.a;
666+
667+
----
668+
1 a NULL NULL
669+
2 A 1 A
670+
3 c NULL NULL
671+
4 D NULL NULL
672+
664673
-- statement query
665674
-- SELECT s, str1.s, str2.s FROM str1 FULL OUTER JOIN str2 USING(s);
666675

0 commit comments

Comments
 (0)