Skip to content

Commit 383226c

Browse files
committed
Add support for parsing MsSql alias with equals
1 parent a4fa9e0 commit 383226c

File tree

2 files changed

+44
-6
lines changed

2 files changed

+44
-6
lines changed

src/parser/mod.rs

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11173,15 +11173,42 @@ impl<'a> Parser<'a> {
1117311173
self.peek_token().location
1117411174
)
1117511175
}
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+
}
1118211188
}
1118311189
}
1118411190

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+
1118511212
/// Parse an [`WildcardAdditionalOptions`] information for wildcard select items.
1118611213
///
1118711214
/// If it is not possible to parse it, will return an option.

tests/sqlparser_mssql.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,6 +1024,17 @@ fn parse_create_table_with_identity_column() {
10241024
}
10251025
}
10261026

1027+
#[test]
1028+
fn test_alias_equal_expr() {
1029+
let sql = r#"SELECT some_alias = some_column FROM some_table"#;
1030+
let expected = r#"SELECT some_column AS some_alias FROM some_table"#;
1031+
let _ = ms().one_statement_parses_to(sql, expected);
1032+
1033+
let sql = r#"SELECT some_alias = (a*b) FROM some_table"#;
1034+
let expected = r#"SELECT (a * b) AS some_alias FROM some_table"#;
1035+
let _ = ms().one_statement_parses_to(sql, expected);
1036+
}
1037+
10271038
fn ms() -> TestedDialects {
10281039
TestedDialects {
10291040
dialects: vec![Box::new(MsSqlDialect {})],

0 commit comments

Comments
 (0)