Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e546de5
feat: add ASOF join physical operator
Xuanwo Jul 23, 2026
bd58e1d
feat: add ASOF join logical semantics
Xuanwo Jul 23, 2026
fe3b182
feat: support ASOF JOIN SQL
Xuanwo Jul 23, 2026
68ac8ec
Merge remote-tracking branch 'origin/main' into xuanwo/asof-physical
Xuanwo Jul 23, 2026
c8c4813
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Jul 23, 2026
67d65dd
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Jul 23, 2026
73fd599
Merge remote-tracking branch 'origin/main' into xuanwo/asof-physical
Xuanwo Jul 27, 2026
43110a3
feat: broadcast ASOF right input
Xuanwo Jul 27, 2026
a15b693
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Jul 27, 2026
0ddb676
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Jul 27, 2026
23e6060
test: cover broadcast ASOF SQL execution
Xuanwo Jul 27, 2026
339d785
fix: account shared ASOF build buffers once
Xuanwo Jul 27, 2026
a71c19f
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Jul 27, 2026
3a4f995
fix: align ASOF logical contracts
Xuanwo Jul 27, 2026
a503c09
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Jul 27, 2026
fd8fddb
fix: align ASOF USING and broadcast docs
Xuanwo Jul 27, 2026
34552d1
perf: compare ASOF keys without scalar materialization
Xuanwo Jul 28, 2026
d618879
test: cover temporal and multi-partition ASOF joins
Xuanwo Jul 28, 2026
c967002
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Jul 28, 2026
80f7572
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Jul 28, 2026
f157eae
test: remove ASOF filter pushdown coverage
Xuanwo Aug 1, 2026
a127baa
refactor: simplify ASOF physical operator
Xuanwo Aug 1, 2026
763a06e
test: expand ASOF SQL coverage
Xuanwo Aug 1, 2026
6a84164
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Aug 1, 2026
83b7380
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Aug 1, 2026
450bffb
Update datafusion/physical-plan/src/joins/asof_join.rs
Xuanwo Aug 11, 2026
4aa77dc
refactor: align ASOF physical operator with join conventions
Xuanwo Aug 11, 2026
0dee525
Merge remote-tracking branch 'origin/main' into xuanwo/asof-physical
Xuanwo Aug 11, 2026
00ae56b
fix: expose ASOF physical expressions
Xuanwo Aug 11, 2026
88227f8
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Aug 11, 2026
ede4259
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Aug 11, 2026
bb58ee0
fix: align ASOF planner projection
Xuanwo Aug 11, 2026
9e0cea6
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Aug 11, 2026
70b8145
Merge remote-tracking branch 'origin/main' into xuanwo/asof-physical
Xuanwo Aug 11, 2026
549a580
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-logical
Xuanwo Aug 11, 2026
fed277f
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Aug 11, 2026
f6697b9
Merge remote-tracking branch 'origin/main' into xuanwo/asof-physical
Xuanwo Aug 14, 2026
5248402
fix: reject floating ASOF equality keys
Xuanwo Aug 14, 2026
e570325
fix: support floating ASOF equality keys
Xuanwo Aug 14, 2026
38e8b3d
Merge branch 'xuanwo/asof-float-equality' into xuanwo/asof-logical
Xuanwo Aug 14, 2026
df56165
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Aug 14, 2026
5201c34
refactor: make ASOF join state a stream
Xuanwo Aug 16, 2026
1232b3e
Merge branch 'xuanwo/asof-physical' into xuanwo/asof-float-equality
Xuanwo Aug 16, 2026
4eb3c28
Merge branch 'xuanwo/asof-float-equality' into xuanwo/asof-logical
Xuanwo Aug 16, 2026
7f0da93
Merge branch 'xuanwo/asof-logical' into xuanwo/asof-sql
Xuanwo Aug 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 48 additions & 1 deletion datafusion/core/src/physical_planner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ use crate::physical_plan::explain::ExplainExec;
use crate::physical_plan::filter::FilterExecBuilder;
use crate::physical_plan::joins::utils as join_utils;
use crate::physical_plan::joins::{
CrossJoinExec, HashJoinExec, NestedLoopJoinExec, PartitionMode, SortMergeJoinExec,
AsOfJoinExec, AsOfMatchExpr, CrossJoinExec, HashJoinExec, NestedLoopJoinExec,
PartitionMode, SortMergeJoinExec,
};
use crate::physical_plan::limit::{GlobalLimitExec, LocalLimitExec};
use crate::physical_plan::projection::{ProjectionExec, ProjectionExpr};
Expand Down Expand Up @@ -1794,6 +1795,51 @@ impl DefaultPhysicalPlanner {
join
}
}
LogicalPlan::AsOfJoin(join) => {
let [physical_left, physical_right] = children.two()?;
let join_on = join
.on
.iter()
.map(|(left, right)| {
Ok((
create_physical_expr(
left,
join.left.schema(),
execution_props,
planning_ctx,
)?,
create_physical_expr(
right,
join.right.schema(),
execution_props,
planning_ctx,
)?,
))
})
.collect::<Result<join_utils::JoinOn>>()?;
let match_condition = AsOfMatchExpr::new(
create_physical_expr(
&join.match_condition.left,
join.left.schema(),
execution_props,
planning_ctx,
)?,
join.match_condition.op,
create_physical_expr(
&join.match_condition.right,
join.right.schema(),
execution_props,
planning_ctx,
)?,
);
Arc::new(AsOfJoinExec::try_new(
physical_left,
physical_right,
join_on,
match_condition,
None,
)?)
}
LogicalPlan::RecursiveQuery(RecursiveQuery {
name,
is_distinct,
Expand Down Expand Up @@ -2293,6 +2339,7 @@ fn extract_dml_filters(
| LogicalPlan::Sort(_)
| LogicalPlan::Union(_)
| LogicalPlan::Join(_)
| LogicalPlan::AsOfJoin(_)
| LogicalPlan::Repartition(_)
| LogicalPlan::Aggregate(_)
| LogicalPlan::Window(_)
Expand Down
Loading