@@ -11173,15 +11173,42 @@ impl<'a> Parser<'a> {
11173
11173
self . peek_token( ) . location
11174
11174
)
11175
11175
}
11176
- expr => self
11177
- . parse_optional_alias ( keywords:: RESERVED_FOR_COLUMN_ALIAS )
11178
- . map ( |alias| match alias {
11179
- Some ( alias) => SelectItem :: ExprWithAlias { expr, alias } ,
11180
- None => SelectItem :: UnnamedExpr ( expr) ,
11181
- } ) ,
11176
+ expr => {
11177
+ if dialect_of ! ( self is MsSqlDialect ) {
11178
+ if let Some ( select_item) = self . parse_mssql_alias_with_equal ( & expr) {
11179
+ return Ok ( select_item) ;
11180
+ }
11181
+ }
11182
+ self . parse_optional_alias ( keywords:: RESERVED_FOR_COLUMN_ALIAS )
11183
+ . map ( |alias| match alias {
11184
+ Some ( alias) => SelectItem :: ExprWithAlias { expr, alias } ,
11185
+ None => SelectItem :: UnnamedExpr ( expr) ,
11186
+ } )
11187
+ }
11182
11188
}
11183
11189
}
11184
11190
11191
+ /// Parse a [`SelectItem`] based on an MsSql syntax that uses the equal sign
11192
+ /// to denote an alias, for example: SELECT col_alias = col FROM tbl
11193
+ /// <https://learn.microsoft.com/en-us/sql/t-sql/queries/select-examples-transact-sql?view=sql-server-ver16#b-use-select-with-column-headings-and-calculations>
11194
+ fn parse_mssql_alias_with_equal ( & mut self , expr : & Expr ) -> Option < SelectItem > {
11195
+ if let Expr :: BinaryOp {
11196
+ left, op, right, ..
11197
+ } = expr
11198
+ {
11199
+ if op == & BinaryOperator :: Eq {
11200
+ if let Expr :: Identifier ( ref alias) = * * left {
11201
+ return Some ( SelectItem :: ExprWithAlias {
11202
+ expr : * right. clone ( ) ,
11203
+ alias : alias. clone ( ) ,
11204
+ } ) ;
11205
+ }
11206
+ }
11207
+ }
11208
+
11209
+ None
11210
+ }
11211
+
11185
11212
/// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
11186
11213
///
11187
11214
/// If it is not possible to parse it, will return an option.
0 commit comments