Skip to content

Commit 317c485

Browse files
committed
refactor: order_by_all
1 parent 62b12e7 commit 317c485

File tree

9 files changed

+146
-135
lines changed

9 files changed

+146
-135
lines changed

src/ast/mod.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,15 @@ pub use self::query::{
6666
JsonTableColumn, JsonTableColumnErrorHandling, JsonTableNamedColumn, JsonTableNestedColumn,
6767
LateralView, LockClause, LockType, MatchRecognizePattern, MatchRecognizeSymbol, Measure,
6868
NamedWindowDefinition, NamedWindowExpr, NonBlock, Offset, OffsetRows, OpenJsonTableColumn,
69-
OrderBy, OrderByAll, OrderByExpr, OrderByExprsWithInterpolate, PivotValueSource,
70-
ProjectionSelect, Query, RenameSelectItem, RepetitionQuantifier, ReplaceSelectElement,
71-
ReplaceSelectItem, RowsPerMatch, Select, SelectFlavor, SelectInto, SelectItem,
72-
SelectItemQualifiedWildcardKind, SetExpr, SetOperator, SetQuantifier, Setting,
73-
SymbolDefinition, Table, TableAlias, TableAliasColumnDef, TableFactor, TableFunctionArgs,
74-
TableIndexHintForClause, TableIndexHintType, TableIndexHints, TableIndexType, TableSample,
75-
TableSampleBucket, TableSampleKind, TableSampleMethod, TableSampleModifier,
76-
TableSampleQuantity, TableSampleSeed, TableSampleSeedModifier, TableSampleUnit, TableVersion,
77-
TableWithJoins, Top, TopQuantity, UpdateTableFromKind, ValueTableMode, Values,
78-
WildcardAdditionalOptions, With, WithFill,
69+
OrderBy, OrderByAll, OrderByExpr, OrderByKind, PivotValueSource, ProjectionSelect, Query,
70+
RenameSelectItem, RepetitionQuantifier, ReplaceSelectElement, ReplaceSelectItem, RowsPerMatch,
71+
Select, SelectFlavor, SelectInto, SelectItem, SelectItemQualifiedWildcardKind, SetExpr,
72+
SetOperator, SetQuantifier, Setting, SymbolDefinition, Table, TableAlias, TableAliasColumnDef,
73+
TableFactor, TableFunctionArgs, TableIndexHintForClause, TableIndexHintType, TableIndexHints,
74+
TableIndexType, TableSample, TableSampleBucket, TableSampleKind, TableSampleMethod,
75+
TableSampleModifier, TableSampleQuantity, TableSampleSeed, TableSampleSeedModifier,
76+
TableSampleUnit, TableVersion, TableWithJoins, Top, TopQuantity, UpdateTableFromKind,
77+
ValueTableMode, Values, WildcardAdditionalOptions, With, WithFill,
7978
};
8079

8180
pub use self::trigger::{

src/ast/query.rs

Lines changed: 29 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,25 +2205,48 @@ pub enum JoinConstraint {
22052205
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
22062206
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
22072207
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2208-
pub enum OrderBy {
2208+
pub enum OrderByKind {
22092209
/// ALL syntax of [DuckDB] and [ClickHouse].
22102210
///
22112211
/// [DuckDB]: <https://duckdb.org/docs/sql/query_syntax/orderby>
22122212
/// [ClickHouse]: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by>
22132213
All(OrderByAll),
22142214

22152215
/// Expressions
2216-
Expressions(OrderByExprsWithInterpolate),
2216+
Expressions(Vec<OrderByExpr>),
2217+
}
2218+
2219+
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2220+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2221+
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2222+
pub struct OrderBy {
2223+
pub kind: OrderByKind,
2224+
2225+
/// Optional: `INTERPOLATE`
2226+
/// Supported by [ClickHouse syntax]
2227+
/// Note that when combined with `OrderByKind::All`, it should be None, as ClickHouse doesn't support using them together.
2228+
///
2229+
/// [ClickHouse syntax]: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by#order-by-expr-with-fill-modifier>
2230+
pub interpolate: Option<Interpolate>,
22172231
}
22182232

22192233
impl fmt::Display for OrderBy {
22202234
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
22212235
write!(f, "ORDER BY")?;
2222-
match self {
2223-
OrderBy::Expressions(exprs) => {
2224-
write!(f, "{}", exprs)?;
2236+
match &self.kind {
2237+
OrderByKind::Expressions(exprs) => {
2238+
write!(f, " {}", display_comma_separated(exprs))?;
2239+
2240+
if let Some(ref interpolate) = self.interpolate {
2241+
match &interpolate.exprs {
2242+
Some(exprs) => {
2243+
write!(f, " INTERPOLATE ({})", display_comma_separated(exprs))?
2244+
}
2245+
None => write!(f, " INTERPOLATE")?,
2246+
}
2247+
}
22252248
}
2226-
OrderBy::All(all) => {
2249+
OrderByKind::All(all) => {
22272250
write!(f, " ALL{}", all)?;
22282251
}
22292252
}
@@ -2232,23 +2255,6 @@ impl fmt::Display for OrderBy {
22322255
}
22332256
}
22342257

2235-
impl OrderBy {
2236-
pub fn get_exprs(&self) -> Option<&Vec<OrderByExpr>> {
2237-
match self {
2238-
OrderBy::Expressions(exprs_with_interpolate) => Some(&exprs_with_interpolate.exprs),
2239-
OrderBy::All(_) => None,
2240-
}
2241-
}
2242-
pub fn get_interpolate(&self) -> Option<&Interpolate> {
2243-
match self {
2244-
OrderBy::Expressions(exprs_with_interpolate) => {
2245-
exprs_with_interpolate.interpolate.as_ref()
2246-
}
2247-
OrderBy::All(_) => None,
2248-
}
2249-
}
2250-
}
2251-
22522258
/// An `ORDER BY` expression
22532259
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
22542260
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
@@ -2342,34 +2348,6 @@ impl fmt::Display for InterpolateExpr {
23422348
}
23432349
}
23442350

2345-
/// `ORDER BY` expressions with interpolate
2346-
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
2347-
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2348-
#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
2349-
pub struct OrderByExprsWithInterpolate {
2350-
pub exprs: Vec<OrderByExpr>,
2351-
/// Expressions
2352-
/// Optional: `INTERPOLATE`
2353-
/// Supported by [ClickHouse syntax]
2354-
/// [ClickHouse syntax]: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by#order-by-expr-with-fill-modifier>
2355-
pub interpolate: Option<Interpolate>,
2356-
}
2357-
2358-
impl fmt::Display for OrderByExprsWithInterpolate {
2359-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
2360-
if !self.exprs.is_empty() {
2361-
write!(f, " {}", display_comma_separated(&self.exprs))?;
2362-
}
2363-
if let Some(ref interpolate) = self.interpolate {
2364-
match &interpolate.exprs {
2365-
Some(exprs) => write!(f, " INTERPOLATE ({})", display_comma_separated(exprs))?,
2366-
None => write!(f, " INTERPOLATE")?,
2367-
}
2368-
}
2369-
Ok(())
2370-
}
2371-
}
2372-
23732351
/// 'ORDER BY ALL' clause
23742352
#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
23752353
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]

src/ast/spans.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use super::{
3030
GroupByExpr, HavingBound, IlikeSelectItem, Insert, Interpolate, InterpolateExpr, Join,
3131
JoinConstraint, JoinOperator, JsonPath, JsonPathElem, LateralView, MatchRecognizePattern,
3232
Measure, NamedWindowDefinition, ObjectName, ObjectNamePart, Offset, OnConflict,
33-
OnConflictAction, OnInsert, OrderBy, OrderByExpr, Partition, PivotValueSource,
33+
OnConflictAction, OnInsert, OrderBy, OrderByExpr, OrderByKind, Partition, PivotValueSource,
3434
ProjectionSelect, Query, ReferentialAction, RenameSelectItem, ReplaceSelectElement,
3535
ReplaceSelectItem, Select, SelectInto, SelectItem, SetExpr, SqlOption, Statement, Subscript,
3636
SymbolDefinition, TableAlias, TableAliasColumnDef, TableConstraint, TableFactor, TableObject,
@@ -1102,14 +1102,13 @@ impl Spanned for ProjectionSelect {
11021102
/// - [OrderBy::All]
11031103
impl Spanned for OrderBy {
11041104
fn span(&self) -> Span {
1105-
match self {
1106-
OrderBy::All(_) => Span::empty(),
1107-
OrderBy::Expressions(expressions) => union_spans(
1108-
expressions
1109-
.exprs
1105+
match &self.kind {
1106+
OrderByKind::All(_) => Span::empty(),
1107+
OrderByKind::Expressions(exprs) => union_spans(
1108+
exprs
11101109
.iter()
11111110
.map(|i| i.span())
1112-
.chain(expressions.interpolate.iter().map(|i| i.span())),
1111+
.chain(self.interpolate.iter().map(|i| i.span())),
11131112
),
11141113
}
11151114
}

src/dialect/clickhouse.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,9 @@ impl Dialect for ClickHouseDialect {
7979
fn supports_from_first_select(&self) -> bool {
8080
true
8181
}
82+
83+
// See <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by>
84+
fn supports_order_by_all(&self) -> bool {
85+
true
86+
}
8287
}

src/dialect/duckdb.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,9 @@ impl Dialect for DuckDbDialect {
8989
fn supports_from_first_select(&self) -> bool {
9090
true
9191
}
92+
93+
// See DuckDB <https://duckdb.org/docs/sql/query_syntax/orderby.html#order-by-all-examples>
94+
fn supports_order_by_all(&self) -> bool {
95+
true
96+
}
9297
}

src/dialect/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,16 @@ pub trait Dialect: Debug + Any {
912912
fn supports_array_typedef_size(&self) -> bool {
913913
false
914914
}
915+
916+
/// Returns true if the dialect supports `ORDER BY ALL`.
917+
/// `ALL` which means all columns of the SELECT clause.
918+
///
919+
/// DuckDB: <https://duckdb.org/docs/sql/query_syntax/orderby.html#order-by-all>
920+
/// ClickHouse: <https://clickhouse.com/docs/en/sql-reference/statements/select/order-by>
921+
/// For example: ```SELECT * FROM addresses ORDER BY ALL;```.
922+
fn supports_order_by_all(&self) -> bool {
923+
false
924+
}
915925
}
916926

917927
/// This represents the operators for which precedence must be defined

src/parser/mod.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9184,16 +9184,28 @@ impl<'a> Parser<'a> {
91849184
pub fn parse_optional_order_by(&mut self) -> Result<Option<OrderBy>, ParserError> {
91859185
if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
91869186
let order_by = if self.parse_keyword(Keyword::ALL) {
9187+
if !self.dialect.supports_order_by_all() {
9188+
return parser_err!(
9189+
"ALL is not supported in ORDER BY",
9190+
self.peek_token().span.start
9191+
);
9192+
}
91879193
let order_by_all = self.parse_order_by_all()?;
9188-
OrderBy::All(order_by_all)
9194+
OrderBy {
9195+
kind: OrderByKind::All(order_by_all),
9196+
interpolate: None,
9197+
}
91899198
} else {
91909199
let exprs = self.parse_comma_separated(Parser::parse_order_by_expr)?;
91919200
let interpolate = if dialect_of!(self is ClickHouseDialect | GenericDialect) {
91929201
self.parse_interpolations()?
91939202
} else {
91949203
None
91959204
};
9196-
OrderBy::Expressions(OrderByExprsWithInterpolate { exprs, interpolate })
9205+
OrderBy {
9206+
kind: OrderByKind::Expressions(exprs),
9207+
interpolate,
9208+
}
91979209
};
91989210
Ok(Some(order_by))
91999211
} else {

tests/sqlparser_clickhouse.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -322,15 +322,15 @@ fn parse_alter_table_add_projection() {
322322
vec![Identifier(Ident::new("a"))],
323323
vec![]
324324
)),
325-
order_by: Some(OrderBy::Expressions(OrderByExprsWithInterpolate {
326-
exprs: vec![OrderByExpr {
325+
order_by: Some(OrderBy {
326+
kind: OrderByKind::Expressions(vec![OrderByExpr {
327327
expr: Identifier(Ident::new("b")),
328328
asc: None,
329329
nulls_first: None,
330330
with_fill: None,
331-
}],
331+
}]),
332332
interpolate: None,
333-
})),
333+
}),
334334
}
335335
}
336336
)
@@ -1134,8 +1134,8 @@ fn parse_select_order_by_with_fill_interpolate() {
11341134
LIMIT 2";
11351135
let select = clickhouse().verified_query(sql);
11361136
assert_eq!(
1137-
OrderBy::Expressions(OrderByExprsWithInterpolate {
1138-
exprs: vec![
1137+
OrderBy {
1138+
kind: OrderByKind::Expressions(vec![
11391139
OrderByExpr {
11401140
expr: Expr::Identifier(Ident::new("fname")),
11411141
asc: Some(true),
@@ -1156,7 +1156,7 @@ fn parse_select_order_by_with_fill_interpolate() {
11561156
step: Some(Expr::Value(number("3"))),
11571157
}),
11581158
},
1159-
],
1159+
]),
11601160
interpolate: Some(Interpolate {
11611161
exprs: Some(vec![InterpolateExpr {
11621162
column: Ident::new("col1"),
@@ -1167,7 +1167,7 @@ fn parse_select_order_by_with_fill_interpolate() {
11671167
}),
11681168
}])
11691169
})
1170-
}),
1170+
},
11711171
select.order_by.expect("ORDER BY expected")
11721172
);
11731173
assert_eq!(Some(Expr::Value(number("2"))), select.limit);
@@ -1214,13 +1214,12 @@ fn parse_with_fill() {
12141214
from: Some(Expr::Value(number("10"))),
12151215
to: Some(Expr::Value(number("20"))),
12161216
step: Some(Expr::Value(number("2"))),
1217-
}),
1218-
select
1219-
.order_by
1220-
.expect("ORDER BY expected")
1221-
.get_exprs()
1222-
.unwrap()[0]
1223-
.with_fill
1217+
})
1218+
.as_ref(),
1219+
match select.order_by.expect("ORDER BY expected").kind {
1220+
OrderByKind::Expressions(ref exprs) => exprs[0].with_fill.as_ref(),
1221+
_ => None,
1222+
}
12241223
);
12251224
}
12261225

@@ -1276,7 +1275,8 @@ fn parse_interpolate_body_with_columns() {
12761275
select
12771276
.order_by
12781277
.expect("ORDER BY expected")
1279-
.get_interpolate()
1278+
.interpolate
1279+
.as_ref()
12801280
);
12811281
}
12821282

@@ -1289,7 +1289,8 @@ fn parse_interpolate_without_body() {
12891289
select
12901290
.order_by
12911291
.expect("ORDER BY expected")
1292-
.get_interpolate()
1292+
.interpolate
1293+
.as_ref()
12931294
);
12941295
}
12951296

@@ -1305,7 +1306,8 @@ fn parse_interpolate_with_empty_body() {
13051306
select
13061307
.order_by
13071308
.expect("ORDER BY expected")
1308-
.get_interpolate()
1309+
.interpolate
1310+
.as_ref()
13091311
);
13101312
}
13111313

0 commit comments

Comments
 (0)