@@ -804,3 +804,57 @@ func (p *Parser) parseRefreshStatement() (*ast.RefreshMaterializedViewStatement,
804804
805805 return stmt , nil
806806}
807+
808+ // parseTruncateStatement parses TRUNCATE TABLE statement
809+ // Syntax: TRUNCATE [TABLE] table_name [, table_name ...] [RESTART IDENTITY | CONTINUE IDENTITY] [CASCADE | RESTRICT]
810+ func (p * Parser ) parseTruncateStatement () (* ast.TruncateStatement , error ) {
811+ stmt := & ast.TruncateStatement {}
812+
813+ // Optional TABLE keyword
814+ if p .isType (models .TokenTypeTable ) {
815+ p .advance () // Consume TABLE
816+ }
817+
818+ // Parse table names (can be comma-separated)
819+ for {
820+ if ! p .isType (models .TokenTypeIdentifier ) {
821+ return nil , p .expectedError ("table name" )
822+ }
823+ stmt .Tables = append (stmt .Tables , p .currentToken .Literal )
824+ p .advance ()
825+
826+ if p .isType (models .TokenTypeComma ) {
827+ p .advance () // Consume comma
828+ continue
829+ }
830+ break
831+ }
832+
833+ // Parse optional RESTART IDENTITY / CONTINUE IDENTITY
834+ if p .isTokenMatch ("RESTART" ) {
835+ p .advance () // Consume RESTART
836+ if ! p .isTokenMatch ("IDENTITY" ) {
837+ return nil , p .expectedError ("IDENTITY after RESTART" )
838+ }
839+ p .advance () // Consume IDENTITY
840+ stmt .RestartIdentity = true
841+ } else if p .isTokenMatch ("CONTINUE" ) {
842+ p .advance () // Consume CONTINUE
843+ if ! p .isTokenMatch ("IDENTITY" ) {
844+ return nil , p .expectedError ("IDENTITY after CONTINUE" )
845+ }
846+ p .advance () // Consume IDENTITY
847+ stmt .ContinueIdentity = true
848+ }
849+
850+ // Parse optional CASCADE/RESTRICT
851+ if p .isType (models .TokenTypeCascade ) {
852+ stmt .CascadeType = "CASCADE"
853+ p .advance ()
854+ } else if p .isType (models .TokenTypeRestrict ) {
855+ stmt .CascadeType = "RESTRICT"
856+ p .advance ()
857+ }
858+
859+ return stmt , nil
860+ }
0 commit comments