parsePartitionDefinition parses a single partition definition
()
| 478 | |
| 479 | // parsePartitionDefinition parses a single partition definition |
| 480 | func (p *Parser) parsePartitionDefinition() (*ast.PartitionDefinition, error) { |
| 481 | partDef := &ast.PartitionDefinition{} |
| 482 | |
| 483 | // Expect PARTITION keyword |
| 484 | if !p.isType(models.TokenTypePartition) { |
| 485 | return nil, p.expectedError("PARTITION") |
| 486 | } |
| 487 | p.advance() // Consume PARTITION |
| 488 | |
| 489 | // Parse partition name (supports double-quoted identifiers) |
| 490 | if !p.isIdentifier() { |
| 491 | return nil, p.expectedError("partition name") |
| 492 | } |
| 493 | partDef.Name = p.currentToken.Token.Value |
| 494 | p.advance() |
| 495 | |
| 496 | // Parse VALUES clause |
| 497 | if !p.isType(models.TokenTypeValues) { |
| 498 | return nil, p.expectedError("VALUES") |
| 499 | } |
| 500 | p.advance() // Consume VALUES |
| 501 | |
| 502 | // Parse value specification |
| 503 | if p.isTokenMatch("LESS") { |
| 504 | p.advance() // Consume LESS |
| 505 | if !p.isTokenMatch("THAN") { |
| 506 | return nil, p.expectedError("THAN after LESS") |
| 507 | } |
| 508 | p.advance() // Consume THAN |
| 509 | partDef.Type = "LESS THAN" |
| 510 | |
| 511 | // Parse value or MAXVALUE |
| 512 | if p.isType(models.TokenTypeLParen) { |
| 513 | p.advance() // Consume ( |
| 514 | if p.isTokenMatch("MAXVALUE") { |
| 515 | partDef.LessThan = &ast.Identifier{Name: "MAXVALUE"} |
| 516 | p.advance() |
| 517 | } else { |
| 518 | expr, err := p.parseExpression() |
| 519 | if err != nil { |
| 520 | return nil, err |
| 521 | } |
| 522 | partDef.LessThan = expr |
| 523 | } |
| 524 | if !p.isType(models.TokenTypeRParen) { |
| 525 | return nil, p.expectedError(")") |
| 526 | } |
| 527 | p.advance() // Consume ) |
| 528 | } else if p.isTokenMatch("MAXVALUE") { |
| 529 | partDef.LessThan = &ast.Identifier{Name: "MAXVALUE"} |
| 530 | p.advance() |
| 531 | } |
| 532 | } else if p.isType(models.TokenTypeIn) { |
| 533 | p.advance() // Consume IN |
| 534 | partDef.Type = "IN" |
| 535 | |
| 536 | // Parse value list |
| 537 | if !p.isType(models.TokenTypeLParen) { |
no test coverage detected