Skip to content

Commit 79a91d8

Browse files
committed
Go back to helper function
1 parent 1fedea7 commit 79a91d8

File tree

4 files changed

+45
-34
lines changed

4 files changed

+45
-34
lines changed

src/dialect/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,13 @@ pub trait Dialect: Debug + Any {
562562
false
563563
}
564564

565-
/// For example: SELECT col_alias = col FROM tbl
565+
/// Returns true if this dialect supports treating the equals operator `=` within a [`SelectItem`]
566+
/// as an alias assignment operator, rather than a boolean expression.
567+
/// For example: the following statements are equivalent for such a dialect:
568+
/// ```sql
569+
/// SELECT col_alias = col FROM tbl;
570+
/// SELECT col_alias AS col FROM tbl;
571+
/// ```
566572
fn supports_eq_alias_assigment(&self) -> bool {
567573
false
568574
}

src/parser/mod.rs

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11182,29 +11182,11 @@ impl<'a> Parser<'a> {
1118211182
)
1118311183
}
1118411184
expr => {
11185-
// Parse a [`SelectItem`] based on an [MsSql] syntax that uses the equal sign
11186-
// to denote an alias, for example: SELECT col_alias = col FROM tbl
11187-
// [MsSql]: 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
11188-
let expr = if self.dialect.supports_eq_alias_assigment() {
11189-
if let Expr::BinaryOp {
11190-
ref left,
11191-
op: BinaryOperator::Eq,
11192-
ref right,
11193-
} = expr
11194-
{
11195-
if let Expr::Identifier(alias) = left.as_ref() {
11196-
return Ok(SelectItem::ExprWithAlias {
11197-
expr: *right.clone(),
11198-
alias: alias.clone(),
11199-
});
11200-
}
11185+
if self.dialect.supports_eq_alias_assigment() {
11186+
if let Some(select_item) = Self::maybe_unpack_alias_assignment(&expr) {
11187+
return Ok(select_item);
1120111188
}
11202-
expr
11203-
} else {
11204-
expr
11205-
};
11206-
11207-
// Parse the common AS keyword for aliasing a column
11189+
}
1120811190
self.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
1120911191
.map(|alias| match alias {
1121011192
Some(alias) => SelectItem::ExprWithAlias { expr, alias },
@@ -12220,6 +12202,28 @@ impl<'a> Parser<'a> {
1222012202
}
1222112203
false
1222212204
}
12205+
12206+
/// Parse a [`SelectItem`] based on an [MsSql] syntax that uses the equal sign
12207+
/// to denote an alias, for example: SELECT col_alias = col FROM tbl
12208+
/// [MsSql]: <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>
12209+
fn maybe_unpack_alias_assignment(expr: &Expr) -> Option<SelectItem> {
12210+
if let Expr::BinaryOp {
12211+
left,
12212+
op: BinaryOperator::Eq,
12213+
right,
12214+
..
12215+
} = expr
12216+
{
12217+
if let Expr::Identifier(ref alias) = **left {
12218+
return Some(SelectItem::ExprWithAlias {
12219+
expr: *right.clone(),
12220+
alias: alias.clone(),
12221+
});
12222+
}
12223+
}
12224+
12225+
None
12226+
}
1222312227
}
1222412228

1222512229
impl Word {

tests/sqlparser_common.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11432,3 +11432,15 @@ fn test_any_some_all_comparison() {
1143211432
verified_stmt("SELECT c1 FROM tbl WHERE c1 <> SOME(SELECT c2 FROM tbl)");
1143311433
verified_stmt("SELECT 1 = ANY(WITH x AS (SELECT 1) SELECT * FROM x)");
1143411434
}
11435+
11436+
#[test]
11437+
fn test_alias_equal_expr() {
11438+
let dialects = all_dialects_where(|d| d.supports_eq_alias_assigment());
11439+
let sql = r#"SELECT some_alias = some_column FROM some_table"#;
11440+
let expected = r#"SELECT some_column AS some_alias FROM some_table"#;
11441+
let _ = dialects.one_statement_parses_to(sql, expected);
11442+
11443+
let sql = r#"SELECT some_alias = (a*b) FROM some_table"#;
11444+
let expected = r#"SELECT (a * b) AS some_alias FROM some_table"#;
11445+
let _ = dialects.one_statement_parses_to(sql, expected);
11446+
}

tests/sqlparser_mssql.rs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,17 +1024,6 @@ 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-
10381027
fn ms() -> TestedDialects {
10391028
TestedDialects {
10401029
dialects: vec![Box::new(MsSqlDialect {})],

0 commit comments

Comments
 (0)