Skip to content

Commit 02f19c2

Browse files
committed
use optimizer rule instead
Signed-off-by: Ruihang Xia <[email protected]>
1 parent 5d12582 commit 02f19c2

File tree

6 files changed

+28
-13
lines changed

6 files changed

+28
-13
lines changed

datafusion/optimizer/src/analyzer/mod.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,13 @@ use datafusion_expr::expr_rewriter::FunctionRewrite;
2929
use datafusion_expr::{InvariantLevel, LogicalPlan};
3030

3131
use crate::analyzer::resolve_grouping_function::ResolveGroupingFunction;
32-
use crate::analyzer::set_comparison::RewriteSetComparison;
3332
use crate::analyzer::type_coercion::TypeCoercion;
3433
use crate::utils::log_plan;
3534

3635
use self::function_rewrite::ApplyFunctionRewrites;
3736

3837
pub mod function_rewrite;
3938
pub mod resolve_grouping_function;
40-
pub mod set_comparison;
4139
pub mod type_coercion;
4240

4341
/// [`AnalyzerRule`]s transform [`LogicalPlan`]s in some way to make
@@ -89,7 +87,6 @@ impl Analyzer {
8987
pub fn new() -> Self {
9088
let rules: Vec<Arc<dyn AnalyzerRule + Send + Sync>> = vec![
9189
Arc::new(ResolveGroupingFunction::new()),
92-
Arc::new(RewriteSetComparison::new()),
9390
Arc::new(TypeCoercion::new()),
9491
];
9592
Self::with_rules(rules)

datafusion/optimizer/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ pub mod propagate_empty_relation;
6565
pub mod push_down_filter;
6666
pub mod push_down_limit;
6767
pub mod replace_distinct_aggregate;
68+
pub mod rewrite_set_comparison;
6869
pub mod scalar_subquery_to_join;
6970
pub mod simplify_expressions;
7071
pub mod single_distinct_to_groupby;

datafusion/optimizer/src/optimizer.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ use crate::propagate_empty_relation::PropagateEmptyRelation;
5151
use crate::push_down_filter::PushDownFilter;
5252
use crate::push_down_limit::PushDownLimit;
5353
use crate::replace_distinct_aggregate::ReplaceDistinctWithAggregate;
54+
use crate::rewrite_set_comparison::RewriteSetComparison;
5455
use crate::scalar_subquery_to_join::ScalarSubqueryToJoin;
5556
use crate::simplify_expressions::SimplifyExpressions;
5657
use crate::single_distinct_to_groupby::SingleDistinctToGroupBy;
@@ -227,6 +228,7 @@ impl Optimizer {
227228
/// Create a new optimizer using the recommended list of rules
228229
pub fn new() -> Self {
229230
let rules: Vec<Arc<dyn OptimizerRule + Sync + Send>> = vec![
231+
Arc::new(RewriteSetComparison::new()),
230232
Arc::new(OptimizeUnions::new()),
231233
Arc::new(SimplifyExpressions::new()),
232234
Arc::new(ReplaceDistinctWithAggregate::new()),

datafusion/optimizer/src/analyzer/set_comparison.rs renamed to datafusion/optimizer/src/rewrite_set_comparison.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18-
//! Rewrite `SetComparison` subqueries (e.g. `= ANY`, `> ALL`) into
19-
//! boolean expressions built from `EXISTS` subqueries that capture SQL
20-
//! three-valued logic.
18+
//! Optimizer rule rewriting `SetComparison` subqueries (e.g. `= ANY`,
19+
//! `> ALL`) into boolean expressions built from `EXISTS` subqueries
20+
//! that capture SQL three-valued logic.
2121
22-
use super::AnalyzerRule;
23-
use datafusion_common::config::ConfigOptions;
22+
use crate::{OptimizerConfig, OptimizerRule};
2423
use datafusion_common::tree_node::{Transformed, TreeNode};
25-
use datafusion_common::{plan_datafusion_err, DFSchema, ExprSchema, Result, ScalarValue};
24+
use datafusion_common::ExprSchema;
25+
use datafusion_common::{plan_datafusion_err, DFSchema, Result, ScalarValue};
2626
use datafusion_expr::expr::{self, Exists, SetComparison, SetQuantifier};
2727
use datafusion_expr::logical_plan::builder::LogicalPlanBuilder;
2828
use datafusion_expr::logical_plan::Subquery;
@@ -52,14 +52,17 @@ impl RewriteSetComparison {
5252
}
5353
}
5454

55-
impl AnalyzerRule for RewriteSetComparison {
55+
impl OptimizerRule for RewriteSetComparison {
5656
fn name(&self) -> &str {
5757
"rewrite_set_comparison"
5858
}
5959

60-
fn analyze(&self, plan: LogicalPlan, _config: &ConfigOptions) -> Result<LogicalPlan> {
60+
fn rewrite(
61+
&self,
62+
plan: LogicalPlan,
63+
_config: &dyn OptimizerConfig,
64+
) -> Result<Transformed<LogicalPlan>> {
6165
plan.transform_up_with_subqueries(|plan| self.rewrite_plan(plan))
62-
.map(|t| t.data)
6366
}
6467
}
6568

datafusion/sql/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ log = { workspace = true }
6161
recursive = { workspace = true, optional = true }
6262
regex = { workspace = true }
6363
sqlparser = { workspace = true }
64+
datafusion-functions-nested = { workspace = true, features = ["sql"] }
6465

6566
[dev-dependencies]
6667
ctor = { workspace = true }

datafusion/sql/src/expr/mod.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ use datafusion_expr::{
4040
};
4141

4242
use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
43+
use datafusion_functions_nested::expr_fn::array_has;
4344

4445
mod binary_op;
4546
mod function;
@@ -605,7 +606,17 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
605606
planner_context,
606607
),
607608
_ => {
608-
not_impl_err!("ANY/SOME only supports subquery comparison currently")
609+
if compare_op != BinaryOperator::Eq {
610+
plan_err!(
611+
"Unsupported AnyOp: '{compare_op}', only '=' is supported"
612+
)
613+
} else {
614+
let left_expr =
615+
self.sql_to_expr(*left, schema, planner_context)?;
616+
let right_expr =
617+
self.sql_to_expr(*right, schema, planner_context)?;
618+
Ok(array_has(right_expr, left_expr))
619+
}
609620
}
610621
},
611622
SQLExpr::AllOp {

0 commit comments

Comments
 (0)