Skip to content

Commit d814704

Browse files
author
B Vadlamani
committed
init_fmt_check
1 parent 9c4cea8 commit d814704

2 files changed

Lines changed: 29 additions & 8 deletions

File tree

datafusion/physical-plan/src/joins/utils.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,18 +1789,27 @@ pub(super) fn equal_rows_arr(
17891789

17901790
let mut is_equal = true;
17911791
for (col_idx, cmp) in comparators.iter().enumerate() {
1792-
match (null_equality, cmp(left_idx, right_idx)) {
1793-
(NullEquality::NullEqualsNull, Ordering::Equal) => continue,
1794-
(NullEquality::NullEqualsNothing, Ordering::Equal) => {
1795-
if left_arrays.get(col_idx).unwrap().is_null(left_idx) {
1792+
let left_arr = left_arrays.get(col_idx).unwrap();
1793+
let right_arr = right_arrays.get(col_idx).unwrap();
1794+
let left_null = left_arr.data_type() == &DataType::Null || left_arr.is_null(left_idx);
1795+
let right_null = right_arr.data_type() == &DataType::Null || right_arr.is_null(right_idx);
1796+
1797+
match (null_equality, left_null, right_null) {
1798+
(NullEquality::NullEqualsNull, true, true) => continue, // Nulls match
1799+
(NullEquality::NullEqualsNothing, true, _) | (NullEquality::NullEqualsNothing, _, true) => {
1800+
is_equal = false; // Nulls never match
1801+
break;
1802+
}
1803+
(_, true, false) | (_, false, true) => {
1804+
is_equal = false; // Different null states
1805+
break;
1806+
}
1807+
(_, false, false) => {
1808+
if cmp(left_idx, right_idx) != Ordering::Equal {
17961809
is_equal = false;
17971810
break;
17981811
}
17991812
}
1800-
_ => {
1801-
is_equal = false;
1802-
break;
1803-
}
18041813
}
18051814
}
18061815

test_null_join.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use datafusion::prelude::*;
2+
use datafusion_common::Result;
3+
use std::sync::Arc;
4+
5+
#[tokio::main]
6+
async fn main() -> Result<()> {
7+
let ctx = SessionContext::new();
8+
let sql = "SELECT * FROM (SELECT null AS id1) t1 INNER JOIN (SELECT null AS id2) t2 ON id1 = id2";
9+
let df = ctx.sql(sql).await?;
10+
df.show().await?;
11+
Ok(())
12+
}

0 commit comments

Comments
 (0)