File tree Expand file tree Collapse file tree 3 files changed +16
-1
lines changed
Expand file tree Collapse file tree 3 files changed +16
-1
lines changed Original file line number Diff line number Diff 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`
Original file line number Diff line number Diff 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()?)
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments