mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-10-09 21:42:05 +00:00
Add support for parsing MsSql alias with equals (#1467)
This commit is contained in:
parent
7c20d4ae1f
commit
1dd7d26fbb
4 changed files with 50 additions and 0 deletions
|
@ -561,6 +561,17 @@ pub trait Dialect: Debug + Any {
|
||||||
fn supports_asc_desc_in_column_definition(&self) -> bool {
|
fn supports_asc_desc_in_column_definition(&self) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if this dialect supports treating the equals operator `=` within a `SelectItem`
|
||||||
|
/// as an alias assignment operator, rather than a boolean expression.
|
||||||
|
/// For example: the following statements are equivalent for such a dialect:
|
||||||
|
/// ```sql
|
||||||
|
/// SELECT col_alias = col FROM tbl;
|
||||||
|
/// SELECT col_alias AS col FROM tbl;
|
||||||
|
/// ```
|
||||||
|
fn supports_eq_alias_assigment(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This represents the operators for which precedence must be defined
|
/// This represents the operators for which precedence must be defined
|
||||||
|
|
|
@ -49,4 +49,8 @@ impl Dialect for MsSqlDialect {
|
||||||
fn supports_connect_by(&self) -> bool {
|
fn supports_connect_by(&self) -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn supports_eq_alias_assigment(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11181,6 +11181,24 @@ impl<'a> Parser<'a> {
|
||||||
self.peek_token().location
|
self.peek_token().location
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Expr::BinaryOp {
|
||||||
|
left,
|
||||||
|
op: BinaryOperator::Eq,
|
||||||
|
right,
|
||||||
|
} if self.dialect.supports_eq_alias_assigment()
|
||||||
|
&& matches!(left.as_ref(), Expr::Identifier(_)) =>
|
||||||
|
{
|
||||||
|
let Expr::Identifier(alias) = *left else {
|
||||||
|
return parser_err!(
|
||||||
|
"BUG: expected identifier expression as alias",
|
||||||
|
self.peek_token().location
|
||||||
|
);
|
||||||
|
};
|
||||||
|
Ok(SelectItem::ExprWithAlias {
|
||||||
|
expr: *right,
|
||||||
|
alias,
|
||||||
|
})
|
||||||
|
}
|
||||||
expr => self
|
expr => self
|
||||||
.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
|
.parse_optional_alias(keywords::RESERVED_FOR_COLUMN_ALIAS)
|
||||||
.map(|alias| match alias {
|
.map(|alias| match alias {
|
||||||
|
|
|
@ -11432,3 +11432,20 @@ fn test_any_some_all_comparison() {
|
||||||
verified_stmt("SELECT c1 FROM tbl WHERE c1 <> SOME(SELECT c2 FROM tbl)");
|
verified_stmt("SELECT c1 FROM tbl WHERE c1 <> SOME(SELECT c2 FROM tbl)");
|
||||||
verified_stmt("SELECT 1 = ANY(WITH x AS (SELECT 1) SELECT * FROM x)");
|
verified_stmt("SELECT 1 = ANY(WITH x AS (SELECT 1) SELECT * FROM x)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_alias_equal_expr() {
|
||||||
|
let dialects = all_dialects_where(|d| d.supports_eq_alias_assigment());
|
||||||
|
let sql = r#"SELECT some_alias = some_column FROM some_table"#;
|
||||||
|
let expected = r#"SELECT some_column AS some_alias FROM some_table"#;
|
||||||
|
let _ = dialects.one_statement_parses_to(sql, expected);
|
||||||
|
|
||||||
|
let sql = r#"SELECT some_alias = (a*b) FROM some_table"#;
|
||||||
|
let expected = r#"SELECT (a * b) AS some_alias FROM some_table"#;
|
||||||
|
let _ = dialects.one_statement_parses_to(sql, expected);
|
||||||
|
|
||||||
|
let dialects = all_dialects_where(|d| !d.supports_eq_alias_assigment());
|
||||||
|
let sql = r#"SELECT x = (a * b) FROM some_table"#;
|
||||||
|
let expected = r#"SELECT x = (a * b) FROM some_table"#;
|
||||||
|
let _ = dialects.one_statement_parses_to(sql, expected);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue