@@ -19,7 +19,7 @@ use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
1919use datafusion_common:: {
2020 not_impl_err, plan_datafusion_err, plan_err, Column , DFSchema , Result ,
2121} ;
22- use datafusion_expr:: expr:: Sort ;
22+ use datafusion_expr:: expr:: { OrderByExprs , Sort } ;
2323use datafusion_expr:: { Expr , SortExpr } ;
2424use sqlparser:: ast:: {
2525 Expr as SQLExpr , OrderByExpr , OrderByOptions , Value , ValueWithSpan ,
@@ -41,16 +41,12 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
4141 /// If false, interpret numeric literals as constant values.
4242 pub ( crate ) fn order_by_to_sort_expr (
4343 & self ,
44- exprs : Vec < OrderByExpr > ,
44+ order_by_exprs : OrderByExprs ,
4545 input_schema : & DFSchema ,
4646 planner_context : & mut PlannerContext ,
4747 literal_to_column : bool ,
4848 additional_schema : Option < & DFSchema > ,
4949 ) -> Result < Vec < SortExpr > > {
50- if exprs. is_empty ( ) {
51- return Ok ( vec ! [ ] ) ;
52- }
53-
5450 let mut combined_schema;
5551 let order_by_schema = match additional_schema {
5652 Some ( schema) => {
@@ -61,56 +57,78 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
6157 None => input_schema,
6258 } ;
6359
64- let mut expr_vec = vec ! [ ] ;
65- for e in exprs {
66- let OrderByExpr {
67- expr,
68- options : OrderByOptions { asc, nulls_first } ,
69- with_fill,
70- } = e;
60+ if order_by_exprs. is_empty ( ) {
61+ return Ok ( vec ! [ ] ) ;
62+ }
7163
72- if let Some ( with_fill) = with_fill {
73- return not_impl_err ! ( "ORDER BY WITH FILL is not supported: {with_fill}" ) ;
74- }
64+ let mut sort_expr_vec = vec ! [ ] ;
7565
76- let expr = match expr {
77- SQLExpr :: Value ( ValueWithSpan {
78- value : Value :: Number ( v , _ ) ,
79- span : _ ,
80- } ) if literal_to_column => {
81- let field_index = v
82- . parse :: < usize > ( )
83- . map_err ( |err| plan_datafusion_err ! ( "{}" , err ) ) ? ;
66+ let make_sort_expr =
67+ | expr : Expr , asc : Option < bool > , nulls_first : Option < bool > | {
68+ let asc = asc . unwrap_or ( true ) ;
69+ // When asc is true, by default nulls last to be consistent with postgres
70+ // postgres rule: https://www.postgresql.org/docs/current/queries-order.html
71+ let nulls_first = nulls_first . unwrap_or ( !asc ) ;
72+ Sort :: new ( expr , asc , nulls_first )
73+ } ;
8474
85- if field_index == 0 {
86- return plan_err ! (
87- "Order by index starts at 1 for column indexes"
88- ) ;
89- } else if input_schema. fields ( ) . len ( ) < field_index {
90- return plan_err ! (
91- "Order by column out of bounds, specified: {}, max: {}" ,
92- field_index,
93- input_schema. fields( ) . len( )
75+ match order_by_exprs {
76+ OrderByExprs :: OrderByExprVec ( expressions) => {
77+ for e in expressions {
78+ let OrderByExpr {
79+ expr,
80+ options : OrderByOptions { asc, nulls_first } ,
81+ with_fill,
82+ } = e;
83+
84+ if let Some ( with_fill) = with_fill {
85+ return not_impl_err ! (
86+ "ORDER BY WITH FILL is not supported: {with_fill}"
9487 ) ;
9588 }
9689
97- Expr :: Column ( Column :: from (
98- input_schema. qualified_field ( field_index - 1 ) ,
99- ) )
90+ let expr = match expr {
91+ SQLExpr :: Value ( ValueWithSpan {
92+ value : Value :: Number ( v, _) ,
93+ span : _,
94+ } ) if literal_to_column => {
95+ let field_index = v
96+ . parse :: < usize > ( )
97+ . map_err ( |err| plan_datafusion_err ! ( "{}" , err) ) ?;
98+
99+ if field_index == 0 {
100+ return plan_err ! (
101+ "Order by index starts at 1 for column indexes"
102+ ) ;
103+ } else if input_schema. fields ( ) . len ( ) < field_index {
104+ return plan_err ! (
105+ "Order by column out of bounds, specified: {}, max: {}" ,
106+ field_index,
107+ input_schema. fields( ) . len( )
108+ ) ;
109+ }
110+
111+ Expr :: Column ( Column :: from (
112+ input_schema. qualified_field ( field_index - 1 ) ,
113+ ) )
114+ }
115+ e => self . sql_expr_to_logical_expr (
116+ e,
117+ order_by_schema,
118+ planner_context,
119+ ) ?,
120+ } ;
121+ sort_expr_vec. push ( make_sort_expr ( expr, asc, nulls_first) ) ;
100122 }
101- e => {
102- self . sql_expr_to_logical_expr ( e, order_by_schema, planner_context) ?
123+ }
124+ OrderByExprs :: All { exprs, options } => {
125+ let OrderByOptions { asc, nulls_first } = options;
126+ for expr in exprs {
127+ sort_expr_vec. push ( make_sort_expr ( expr, asc, nulls_first) ) ;
103128 }
104- } ;
105- let asc = asc. unwrap_or ( true ) ;
106- expr_vec. push ( Sort :: new (
107- expr,
108- asc,
109- // When asc is true, by default nulls last to be consistent with postgres
110- // postgres rule: https://www.postgresql.org/docs/current/queries-order.html
111- nulls_first. unwrap_or ( !asc) ,
112- ) )
113- }
114- Ok ( expr_vec)
129+ }
130+ } ;
131+
132+ Ok ( sort_expr_vec)
115133 }
116134}
0 commit comments