Skip to content

Commit bed358f

Browse files
committed
inital commit
1 parent 7867ba3 commit bed358f

File tree

3 files changed

+16
-1
lines changed

3 files changed

+16
-1
lines changed

src/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,7 @@ pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
940940
// Reserved for Snowflake table sample
941941
Keyword::SAMPLE,
942942
Keyword::TABLESAMPLE,
943+
Keyword::FROM,
943944
];
944945

945946
/// Can't be used as a column alias, so that `SELECT <expr> alias`

src/parser/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11679,14 +11679,21 @@ impl<'a> Parser<'a> {
1167911679
pub fn parse_update(&mut self) -> Result<Statement, ParserError> {
1168011680
let or = self.parse_conflict_clause();
1168111681
let table = self.parse_table_and_joins()?;
11682+
let from_before_set = if self.parse_keyword(Keyword::FROM)
11683+
&& dialect_of!(self is GenericDialect | PostgreSqlDialect | DuckDbDialect | BigQueryDialect | SnowflakeDialect | RedshiftSqlDialect | MsSqlDialect | SQLiteDialect )
11684+
{
11685+
Some(self.parse_table_and_joins()?)
11686+
} else {
11687+
None
11688+
};
1168211689
self.expect_keyword(Keyword::SET)?;
1168311690
let assignments = self.parse_comma_separated(Parser::parse_assignment)?;
1168411691
let from = if self.parse_keyword(Keyword::FROM)
1168511692
&& dialect_of!(self is GenericDialect | PostgreSqlDialect | DuckDbDialect | BigQueryDialect | SnowflakeDialect | RedshiftSqlDialect | MsSqlDialect | SQLiteDialect )
1168611693
{
1168711694
Some(self.parse_table_and_joins()?)
1168811695
} else {
11689-
None
11696+
from_before_set
1169011697
};
1169111698
let selection = if self.parse_keyword(Keyword::WHERE) {
1169211699
Some(self.parse_expr()?)

tests/sqlparser_snowflake.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2974,3 +2974,10 @@ fn test_table_sample() {
29742974
snowflake_and_generic().verified_stmt("SELECT id FROM mytable TABLESAMPLE (10) REPEATABLE (1)");
29752975
snowflake_and_generic().verified_stmt("SELECT id FROM mytable TABLESAMPLE (10) SEED (1)");
29762976
}
2977+
2978+
#[test]
2979+
fn parse_update_from_before_select() {
2980+
assert!(snowflake()
2981+
.parse_sql_statements("UPDATE t1 FROM (SELECT name, id FROM t1 GROUP BY id) AS t2 SET name = t2.name WHERE t1.id = t2.id")
2982+
.is_ok());
2983+
}

0 commit comments

Comments
 (0)