From 4b4ffd324e6fc59aa77b66878169acac2c8d55cb Mon Sep 17 00:00:00 2001 From: jayendra13 Date: Wed, 11 Mar 2026 09:37:53 +0530 Subject: [PATCH] feat: add DROP pipe operator support --- datafusion/sql/src/query.rs | 21 ++++++++++++--- .../sqllogictest/test_files/pipe_operator.slt | 27 +++++++++++++++++++ docs/source/user-guide/sql/select.md | 17 ++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/datafusion/sql/src/query.rs b/datafusion/sql/src/query.rs index 1b7bb856a592b..4f433d61a268b 100644 --- a/datafusion/sql/src/query.rs +++ b/datafusion/sql/src/query.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use crate::planner::{ContextProvider, PlannerContext, SqlToRel}; use crate::stack::StackGuard; -use datafusion_common::{Constraints, DFSchema, Result, not_impl_err}; +use datafusion_common::{Constraints, DFSchema, Result, not_impl_err, plan_err}; use datafusion_expr::expr::{Sort, WildcardOptions}; use datafusion_expr::select_expr::SelectExpr; @@ -28,9 +28,9 @@ use datafusion_expr::{ CreateMemoryTable, DdlStatement, Distinct, Expr, LogicalPlan, LogicalPlanBuilder, }; use sqlparser::ast::{ - Expr as SQLExpr, ExprWithAliasAndOrderBy, Ident, LimitClause, Offset, OffsetRows, - OrderBy, OrderByExpr, OrderByKind, PipeOperator, Query, SelectInto, SetExpr, - SetOperator, SetQuantifier, TableAlias, + ExceptSelectItem, Expr as SQLExpr, ExprWithAliasAndOrderBy, Ident, LimitClause, + Offset, OffsetRows, OrderBy, OrderByExpr, OrderByKind, PipeOperator, Query, + SelectInto, SetExpr, SetOperator, SetQuantifier, TableAlias, }; use sqlparser::tokenizer::Span; @@ -215,6 +215,19 @@ impl SqlToRel<'_, S> { PipeOperator::Join(join) => { self.parse_relation_join(plan, join, planner_context) } + PipeOperator::Drop { columns } => { + let Some((first, rest)) = columns.split_first() else { + return plan_err!("DROP requires at least one column"); + }; + let options = WildcardOptions { + except: Some(ExceptSelectItem { + first_element: first.clone(), + additional_elements: rest.to_vec(), + }), + ..WildcardOptions::default() + }; + self.project(plan, vec![SelectExpr::Wildcard(options)]) + } x => not_impl_err!("`{x}` pipe operator is not supported yet"), } diff --git a/datafusion/sqllogictest/test_files/pipe_operator.slt b/datafusion/sqllogictest/test_files/pipe_operator.slt index 5908b3d6b2a4d..e813a617f1f6d 100644 --- a/datafusion/sqllogictest/test_files/pipe_operator.slt +++ b/datafusion/sqllogictest/test_files/pipe_operator.slt @@ -195,3 +195,30 @@ query TII ---- apples 2 123 bananas 5 NULL + +# DROP pipe - drop two columns +query RT +SELECT * FROM test |> DROP a, n +---- +1.1 a +2.2 b +3.3 c + +# DROP pipe - drop single column +query IRT +SELECT * FROM test |> DROP n +---- +1 1.1 a +2 2.2 b +3 3.3 c + +# DROP pipe - chained with other operators +query R +SELECT * FROM test |> WHERE a > 1 |> DROP a, c, n +---- +2.2 +3.3 + +# Error: DROP non-existent column +statement error +SELECT * FROM test |> DROP nonexistent diff --git a/docs/source/user-guide/sql/select.md b/docs/source/user-guide/sql/select.md index baacf432f5fde..b7b1cab54dae0 100644 --- a/docs/source/user-guide/sql/select.md +++ b/docs/source/user-guide/sql/select.md @@ -351,6 +351,7 @@ DataFusion currently supports the following pipe operators: - [EXCEPT](#pipe_except) - [AGGREGATE](#pipe_aggregate) - [JOIN](#pipe_join) +- [DROP](#pipe_drop) (pipe_where)= @@ -540,3 +541,19 @@ select * from range(0,3) | bananas| 5 | NULL | +--------+-------+------+ ``` + +(pipe_drop)= + +### DROP + +Removes columns from the output, equivalent to `SELECT * EXCEPT(columns)`. + +```sql +select 1 as a, 2 as b, 3 as c +|> drop b; ++---+---+ +| a | c | ++---+---+ +| 1 | 3 | ++---+---+ +```