diff --git a/datafusion/sql/src/set_expr.rs b/datafusion/sql/src/set_expr.rs index 51b11f3087095..bf82d10ae50d5 100644 --- a/datafusion/sql/src/set_expr.rs +++ b/datafusion/sql/src/set_expr.rs @@ -167,12 +167,13 @@ impl SqlToRel<'_, S> { (SetOperator::Intersect, SetQuantifier::Distinct | SetQuantifier::None) => { LogicalPlanBuilder::intersect(left_plan, right_plan, false) } - (SetOperator::Except, SetQuantifier::All) => { + (SetOperator::Except | SetOperator::Minus, SetQuantifier::All) => { LogicalPlanBuilder::except(left_plan, right_plan, true) } - (SetOperator::Except, SetQuantifier::Distinct | SetQuantifier::None) => { - LogicalPlanBuilder::except(left_plan, right_plan, false) - } + ( + SetOperator::Except | SetOperator::Minus, + SetQuantifier::Distinct | SetQuantifier::None, + ) => LogicalPlanBuilder::except(left_plan, right_plan, false), (op, quantifier) => { not_impl_err!("{op} {quantifier} not implemented") } diff --git a/datafusion/sql/tests/sql_integration.rs b/datafusion/sql/tests/sql_integration.rs index 899b642f03c27..1fa5ce2d6cfd5 100644 --- a/datafusion/sql/tests/sql_integration.rs +++ b/datafusion/sql/tests/sql_integration.rs @@ -3436,6 +3436,25 @@ fn except_with_duplicate_expressions() { ); } +#[test] +fn minus_is_an_alias_for_except() { + let sql = "SELECT order_id FROM orders MINUS SELECT order_id FROM orders"; + let plan = logical_plan_with_dialect(sql, &SnowflakeDialect {}).unwrap(); + assert_snapshot!( + plan, + @r" + LeftAnti Join: left.order_id = right.order_id + Distinct: + SubqueryAlias: left + Projection: orders.order_id + TableScan: orders + SubqueryAlias: right + Projection: orders.order_id + TableScan: orders + " + ); +} + #[test] fn empty_over() { let sql = "SELECT order_id, MAX(order_id) OVER () from orders";