Skip to content

Commit 4baea8f

Browse files
committed
Add stacker and recursive
1 parent f190fc6 commit 4baea8f

File tree

13 files changed

+76
-0
lines changed

13 files changed

+76
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ prost = "0.13.1"
142142
prost-derive = "0.13.1"
143143
rand = "0.8"
144144
regex = "1.8"
145+
recursive = "0.1.1"
145146
rstest = "0.23.0"
146147
serde_json = "1"
147148
sqlparser = { version = "0.51.0", features = ["visitor"] }

datafusion-cli/Cargo.lock

Lines changed: 46 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

datafusion/common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ libc = "0.2.140"
6161
num_cpus = { workspace = true }
6262
object_store = { workspace = true, optional = true }
6363
parquet = { workspace = true, optional = true, default-features = true }
64+
recursive = { workspace = true }
6465
paste = "1.0.15"
6566
pyo3 = { version = "0.22.0", optional = true }
6667
sqlparser = { workspace = true }

datafusion/common/src/tree_node.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
//! [`TreeNode`] for visiting and rewriting expression and plan trees
1919
20+
use recursive::recursive;
2021
use std::sync::Arc;
2122

2223
use crate::Result;
@@ -123,6 +124,7 @@ pub trait TreeNode: Sized {
123124
/// TreeNodeVisitor::f_up(ChildNode2)
124125
/// TreeNodeVisitor::f_up(ParentNode)
125126
/// ```
127+
#[recursive]
126128
fn visit<'n, V: TreeNodeVisitor<'n, Node = Self>>(
127129
&'n self,
128130
visitor: &mut V,
@@ -172,6 +174,7 @@ pub trait TreeNode: Sized {
172174
/// TreeNodeRewriter::f_up(ChildNode2)
173175
/// TreeNodeRewriter::f_up(ParentNode)
174176
/// ```
177+
#[recursive]
175178
fn rewrite<R: TreeNodeRewriter<Node = Self>>(
176179
self,
177180
rewriter: &mut R,
@@ -194,6 +197,7 @@ pub trait TreeNode: Sized {
194197
&'n self,
195198
mut f: F,
196199
) -> Result<TreeNodeRecursion> {
200+
#[recursive]
197201
fn apply_impl<'n, N: TreeNode, F: FnMut(&'n N) -> Result<TreeNodeRecursion>>(
198202
node: &'n N,
199203
f: &mut F,
@@ -228,6 +232,7 @@ pub trait TreeNode: Sized {
228232
self,
229233
mut f: F,
230234
) -> Result<Transformed<Self>> {
235+
#[recursive]
231236
fn transform_down_impl<N: TreeNode, F: FnMut(N) -> Result<Transformed<N>>>(
232237
node: N,
233238
f: &mut F,
@@ -251,6 +256,7 @@ pub trait TreeNode: Sized {
251256
self,
252257
mut f: F,
253258
) -> Result<Transformed<Self>> {
259+
#[recursive]
254260
fn transform_up_impl<N: TreeNode, F: FnMut(N) -> Result<Transformed<N>>>(
255261
node: N,
256262
f: &mut F,
@@ -365,6 +371,7 @@ pub trait TreeNode: Sized {
365371
mut f_down: FD,
366372
mut f_up: FU,
367373
) -> Result<Transformed<Self>> {
374+
#[recursive]
368375
fn transform_down_up_impl<
369376
N: TreeNode,
370377
FD: FnMut(N) -> Result<Transformed<N>>,

datafusion/expr/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ datafusion-functions-window-common = { workspace = true }
5050
datafusion-physical-expr-common = { workspace = true }
5151
indexmap = { workspace = true }
5252
paste = "^1.0"
53+
recursive = { workspace = true }
5354
serde_json = { workspace = true }
5455
sqlparser = { workspace = true }
5556
strum = { version = "0.26.1", features = ["derive"] }

datafusion/expr/src/logical_plan/tree_node.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use crate::{
4343
Sort, Subquery, SubqueryAlias, TableScan, Union, Unnest, UserDefinedLogicalNode,
4444
Values, Window,
4545
};
46+
use recursive::recursive;
4647
use std::ops::Deref;
4748
use std::sync::Arc;
4849

@@ -773,6 +774,7 @@ impl LogicalPlan {
773774

774775
/// Visits a plan similarly to [`Self::visit`], including subqueries that
775776
/// may appear in expressions such as `IN (SELECT ...)`.
777+
#[recursive]
776778
pub fn visit_with_subqueries<V: for<'n> TreeNodeVisitor<'n, Node = Self>>(
777779
&self,
778780
visitor: &mut V,
@@ -789,6 +791,7 @@ impl LogicalPlan {
789791
/// Similarly to [`Self::rewrite`], rewrites this node and its inputs using `f`,
790792
/// including subqueries that may appear in expressions such as `IN (SELECT
791793
/// ...)`.
794+
#[recursive]
792795
pub fn rewrite_with_subqueries<R: TreeNodeRewriter<Node = Self>>(
793796
self,
794797
rewriter: &mut R,
@@ -807,6 +810,7 @@ impl LogicalPlan {
807810
&self,
808811
mut f: F,
809812
) -> Result<TreeNodeRecursion> {
813+
#[recursive]
810814
fn apply_with_subqueries_impl<
811815
F: FnMut(&LogicalPlan) -> Result<TreeNodeRecursion>,
812816
>(
@@ -842,6 +846,7 @@ impl LogicalPlan {
842846
self,
843847
mut f: F,
844848
) -> Result<Transformed<Self>> {
849+
#[recursive]
845850
fn transform_down_with_subqueries_impl<
846851
F: FnMut(LogicalPlan) -> Result<Transformed<LogicalPlan>>,
847852
>(
@@ -867,6 +872,7 @@ impl LogicalPlan {
867872
self,
868873
mut f: F,
869874
) -> Result<Transformed<Self>> {
875+
#[recursive]
870876
fn transform_up_with_subqueries_impl<
871877
F: FnMut(LogicalPlan) -> Result<Transformed<LogicalPlan>>,
872878
>(
@@ -894,6 +900,7 @@ impl LogicalPlan {
894900
mut f_down: FD,
895901
mut f_up: FU,
896902
) -> Result<Transformed<Self>> {
903+
#[recursive]
897904
fn transform_down_up_with_subqueries_impl<
898905
FD: FnMut(LogicalPlan) -> Result<Transformed<LogicalPlan>>,
899906
FU: FnMut(LogicalPlan) -> Result<Transformed<LogicalPlan>>,

datafusion/optimizer/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ indexmap = { workspace = true }
4747
itertools = { workspace = true }
4848
log = { workspace = true }
4949
paste = "1.0.14"
50+
recursive = { workspace = true }
5051
regex-syntax = "0.8.0"
5152

5253
[dev-dependencies]

datafusion/optimizer/src/analyzer/subquery.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
use crate::analyzer::check_plan;
1919
use crate::utils::collect_subquery_cols;
20+
use recursive::recursive;
2021

2122
use datafusion_common::tree_node::{TreeNode, TreeNodeRecursion};
2223
use datafusion_common::{plan_err, Result};
@@ -128,6 +129,7 @@ fn check_correlations_in_subquery(inner_plan: &LogicalPlan) -> Result<()> {
128129
}
129130

130131
// Recursively check the unsupported outer references in the sub query plan.
132+
#[recursive]
131133
fn check_inner_plan(inner_plan: &LogicalPlan, can_contain_outer_ref: bool) -> Result<()> {
132134
if !can_contain_outer_ref && inner_plan.contains_outer_reference() {
133135
return plan_err!("Accessing outer reference columns is not allowed in the plan");

datafusion/optimizer/src/common_subexpr_eliminate.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use std::fmt::Debug;
2222
use std::sync::Arc;
2323

2424
use crate::{OptimizerConfig, OptimizerRule};
25+
use recursive::recursive;
2526

2627
use crate::optimizer::ApplyOrder;
2728
use crate::utils::NamePreserver;
@@ -531,6 +532,7 @@ impl OptimizerRule for CommonSubexprEliminate {
531532
None
532533
}
533534

535+
#[recursive]
534536
fn rewrite(
535537
&self,
536538
plan: LogicalPlan,

datafusion/sql/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ datafusion-common = { workspace = true, default-features = true }
4848
datafusion-expr = { workspace = true }
4949
indexmap = { workspace = true }
5050
log = { workspace = true }
51+
recursive = { workspace = true }
5152
regex = { workspace = true }
5253
sqlparser = { workspace = true }
5354
strum = { version = "0.26.1", features = ["derive"] }

0 commit comments

Comments
 (0)