@@ -53,8 +53,12 @@ func (p *Parser) parseAlterTable(pos Pos) (*AlterTable, error) {
5353 alter , err = p .parseAlterTableMaterialize (p .Pos ())
5454 case p .matchKeyword (KeywordReset ):
5555 alter , err = p .parseAlterTableReset (p .Pos ())
56+ case p .matchKeyword (KeywordDelete ):
57+ alter , err = p .parseAlterTableDelete (p .Pos ())
58+ case p .matchKeyword (KeywordUpdate ):
59+ alter , err = p .parseAlterTableUpdate (p .Pos ())
5660 default :
57- return nil , errors .New ("expected token: ADD|DROP|ATTACH|DETACH|FREEZE|REMOVE|CLEAR|MODIFY|REPLACE|MATERIALIZE|RESET" )
61+ return nil , errors .New ("expected token: ADD|DROP|ATTACH|DETACH|FREEZE|REMOVE|CLEAR|MODIFY|REPLACE|MATERIALIZE|RESET|DELETE|UPDATE " )
5862 }
5963 if err != nil {
6064 return nil , err
@@ -833,3 +837,88 @@ func (p *Parser) parseAlterTableReset(pos Pos) (AlterTableClause, error) {
833837 Settings : settings ,
834838 }, nil
835839}
840+
841+ // Syntax: ALTER TABLE DELETE WHERE condition
842+ func (p * Parser ) parseAlterTableDelete (pos Pos ) (AlterTableClause , error ) {
843+ if err := p .expectKeyword (KeywordDelete ); err != nil {
844+ return nil , err
845+ }
846+
847+ if err := p .expectKeyword (KeywordWhere ); err != nil {
848+ return nil , err
849+ }
850+
851+ whereExpr , err := p .parseExpr (p .Pos ())
852+ if err != nil {
853+ return nil , err
854+ }
855+
856+ return & AlterTableDelete {
857+ DeletePos : pos ,
858+ StatementEnd : whereExpr .End (),
859+ WhereClause : whereExpr ,
860+ }, nil
861+ }
862+
863+ // Syntax: ALTER TABLE UPDATE column1 = expr1 [, column2 = expr2, ...] WHERE condition
864+ func (p * Parser ) parseAlterTableUpdate (pos Pos ) (AlterTableClause , error ) {
865+ if err := p .expectKeyword (KeywordUpdate ); err != nil {
866+ return nil , err
867+ }
868+
869+ // Parse at least one assignment
870+ assignments := make ([]* UpdateAssignment , 0 )
871+ assignment , err := p .parseUpdateAssignment (p .Pos ())
872+ if err != nil {
873+ return nil , err
874+ }
875+ assignments = append (assignments , assignment )
876+
877+ // Parse additional comma-separated assignments
878+ for p .tryConsumeTokenKind (TokenKindComma ) != nil {
879+ assignment , err = p .parseUpdateAssignment (p .Pos ())
880+ if err != nil {
881+ return nil , err
882+ }
883+ assignments = append (assignments , assignment )
884+ }
885+
886+ if err := p .expectKeyword (KeywordWhere ); err != nil {
887+ return nil , err
888+ }
889+
890+ whereExpr , err := p .parseExpr (p .Pos ())
891+ if err != nil {
892+ return nil , err
893+ }
894+
895+ return & AlterTableUpdate {
896+ UpdatePos : pos ,
897+ StatementEnd : whereExpr .End (),
898+ Assignments : assignments ,
899+ WhereClause : whereExpr ,
900+ }, nil
901+ }
902+
903+ // Parse column = expression assignment
904+ func (p * Parser ) parseUpdateAssignment (pos Pos ) (* UpdateAssignment , error ) {
905+ column , err := p .ParseNestedIdentifier (p .Pos ())
906+ if err != nil {
907+ return nil , err
908+ }
909+
910+ if err := p .expectTokenKind (TokenKindSingleEQ ); err != nil {
911+ return nil , err
912+ }
913+
914+ expr , err := p .parseExpr (p .Pos ())
915+ if err != nil {
916+ return nil , err
917+ }
918+
919+ return & UpdateAssignment {
920+ AssignmentPos : pos ,
921+ Column : column ,
922+ Expr : expr ,
923+ }, nil
924+ }
0 commit comments