@@ -860,7 +860,7 @@ func (p *Parser) parseAlterTableDelete(pos Pos) (AlterTableClause, error) {
860860 }, nil
861861}
862862
863- // Syntax: ALTER TABLE UPDATE column1 = expr1 [, column2 = expr2, ...] WHERE condition
863+ // Syntax: ALTER TABLE UPDATE column1 = expr1 [, column2 = expr2, ...] [IN PARTITION partition_id] WHERE condition
864864func (p * Parser ) parseAlterTableUpdate (pos Pos ) (AlterTableClause , error ) {
865865 if err := p .expectKeyword (KeywordUpdate ); err != nil {
866866 return nil , err
@@ -883,6 +883,13 @@ func (p *Parser) parseAlterTableUpdate(pos Pos) (AlterTableClause, error) {
883883 assignments = append (assignments , assignment )
884884 }
885885
886+ var inPartition * PartitionClause
887+ if p .tryConsumeKeywords (KeywordIn ) {
888+ inPartition , err = p .parsePartitionClause (p .Pos ())
889+ if err != nil {
890+ return nil , err
891+ }
892+ }
886893 if err := p .expectKeyword (KeywordWhere ); err != nil {
887894 return nil , err
888895 }
@@ -896,6 +903,7 @@ func (p *Parser) parseAlterTableUpdate(pos Pos) (AlterTableClause, error) {
896903 UpdatePos : pos ,
897904 StatementEnd : whereExpr .End (),
898905 Assignments : assignments ,
906+ InPartition : inPartition ,
899907 WhereClause : whereExpr ,
900908 }, nil
901909}
@@ -911,7 +919,10 @@ func (p *Parser) parseUpdateAssignment(pos Pos) (*UpdateAssignment, error) {
911919 return nil , err
912920 }
913921
914- expr , err := p .parseExpr (p .Pos ())
922+ // Why don't we use parseExpr here? Because `ALTER TABLE UPDATE` syntax allows to
923+ // use `IN PARTITION` keywords after assignments. So we need to limit the precedence
924+ // to avoid parsing `IN PARTITION` as part of the expression.
925+ expr , err := p .parseSubExpr (p .Pos (), precedenceIn )
915926 if err != nil {
916927 return nil , err
917928 }
0 commit comments