Skip to content

Commit 8f4da49

Browse files
MsSql: Disallow unquoted FROM keyword as alias assignment expression (#2546)
1 parent bfc7d38 commit 8f4da49

3 files changed

Lines changed: 30 additions & 0 deletions

File tree

‎src/parser/mod.rs‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19289,6 +19289,13 @@ impl<'a> Parser<'a> {
1928919289
} if self.dialect.supports_eq_alias_assignment()
1929019290
&& matches!(left.as_ref(), Expr::Identifier(_)) =>
1929119291
{
19292+
if matches!(right.as_ref(), Expr::Identifier(v) if v.value.to_lowercase() == "from" && v.quote_style.is_none())
19293+
{
19294+
return parser_err!(
19295+
format!("Expected an expression, found: {right}"),
19296+
self.peek_token_ref().span.start
19297+
);
19298+
}
1929219299
let Expr::Identifier(alias) = *left else {
1929319300
return parser_err!(
1929419301
"BUG: expected identifier expression as alias",

‎tests/sqlparser_common.rs‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15270,6 +15270,24 @@ fn test_alias_equal_expr() {
1527015270
let expected = r#"SELECT (a * b) AS some_alias FROM some_table"#;
1527115271
let _ = dialects.one_statement_parses_to(sql, expected);
1527215272

15273+
let sql = r#"SELECT some_alias = "from" FROM some_table"#;
15274+
let expected = r#"SELECT "from" AS some_alias FROM some_table"#;
15275+
let _ = dialects.one_statement_parses_to(sql, expected);
15276+
15277+
assert_eq!(
15278+
dialects
15279+
.parse_sql_statements("SELECT a = FROM")
15280+
.unwrap_err(),
15281+
ParserError::ParserError("Expected an expression, found: FROM".to_string())
15282+
);
15283+
15284+
assert_eq!(
15285+
dialects
15286+
.parse_sql_statements("SELECT a = FROM some_table")
15287+
.unwrap_err(),
15288+
ParserError::ParserError("Expected an expression, found: FROM".to_string())
15289+
);
15290+
1527315291
let dialects = all_dialects_where(|d| !d.supports_eq_alias_assignment());
1527415292
let sql = r#"SELECT x = (a * b) FROM some_table"#;
1527515293
let expected = r#"SELECT x = (a * b) FROM some_table"#;

‎tests/sqlparser_mssql.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2942,6 +2942,11 @@ fn parse_bracket_quoted_function_argument_name() {
29422942
);
29432943
}
29442944

2945+
#[test]
2946+
fn parse_bracket_quoted_eq_alias_assignment() {
2947+
ms().one_statement_parses_to("SELECT a = [from] FROM t", "SELECT [from] AS a FROM t");
2948+
}
2949+
29452950
#[test]
29462951
fn parse_create_proc() {
29472952
ms().one_statement_parses_to(

0 commit comments

Comments
 (0)