Skip to content

Commit 87d8334

Browse files
committed
Add ENABLE/DISABLE TRIGGER statement parsing and enable 2 tests
Implement EnableDisableTriggerStatement AST type with parsing for: - ENABLE/DISABLE TRIGGER ALL ON table_name - ENABLE/DISABLE TRIGGER name1, name2 ON table_name - ENABLE/DISABLE TRIGGER name ON ALL SERVER - ENABLE/DISABLE TRIGGER name ON DATABASE Enable EnableDisableTriggerStatementTests and Baselines90_EnableDisableTriggerStatementTests.
1 parent 430cb17 commit 87d8334

6 files changed

Lines changed: 117 additions & 2 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package ast
2+
3+
// EnableDisableTriggerStatement represents ENABLE/DISABLE TRIGGER statements
4+
type EnableDisableTriggerStatement struct {
5+
TriggerEnforcement string // "Enable" or "Disable"
6+
All bool // true if ENABLE/DISABLE TRIGGER ALL
7+
TriggerNames []*SchemaObjectName
8+
TriggerObject *TriggerObject
9+
}
10+
11+
func (s *EnableDisableTriggerStatement) statement() {}
12+
func (s *EnableDisableTriggerStatement) node() {}

parser/marshal.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ func statementToJSON(stmt ast.Statement) jsonNode {
324324
return alterTriggerStatementToJSON(s)
325325
case *ast.CreateTriggerStatement:
326326
return createTriggerStatementToJSON(s)
327+
case *ast.EnableDisableTriggerStatement:
328+
return enableDisableTriggerStatementToJSON(s)
327329
case *ast.CreateDatabaseStatement:
328330
return createDatabaseStatementToJSON(s)
329331
case *ast.CreateLoginStatement:
@@ -5113,6 +5115,25 @@ func triggerActionToJSON(a *ast.TriggerAction) jsonNode {
51135115
return node
51145116
}
51155117

5118+
func enableDisableTriggerStatementToJSON(s *ast.EnableDisableTriggerStatement) jsonNode {
5119+
node := jsonNode{
5120+
"$type": "EnableDisableTriggerStatement",
5121+
"TriggerEnforcement": s.TriggerEnforcement,
5122+
"All": s.All,
5123+
}
5124+
if len(s.TriggerNames) > 0 {
5125+
names := make([]jsonNode, len(s.TriggerNames))
5126+
for i, n := range s.TriggerNames {
5127+
names[i] = schemaObjectNameToJSON(n)
5128+
}
5129+
node["TriggerNames"] = names
5130+
}
5131+
if s.TriggerObject != nil {
5132+
node["TriggerObject"] = triggerObjectToJSON(s.TriggerObject)
5133+
}
5134+
return node
5135+
}
5136+
51165137
func alterIndexStatementToJSON(s *ast.AlterIndexStatement) jsonNode {
51175138
node := jsonNode{
51185139
"$type": "AlterIndexStatement",

parser/parse_statements.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5229,3 +5229,77 @@ func toTitleCase(s string) string {
52295229
}
52305230
return strings.Join(parts, "")
52315231
}
5232+
5233+
// parseEnableDisableTriggerStatement parses ENABLE/DISABLE TRIGGER statements
5234+
func (p *Parser) parseEnableDisableTriggerStatement(enforcement string) (*ast.EnableDisableTriggerStatement, error) {
5235+
// Consume ENABLE or DISABLE
5236+
p.nextToken()
5237+
5238+
// Expect TRIGGER
5239+
if strings.ToUpper(p.curTok.Literal) != "TRIGGER" {
5240+
return nil, fmt.Errorf("expected TRIGGER after %s, got %s", enforcement, p.curTok.Literal)
5241+
}
5242+
p.nextToken()
5243+
5244+
stmt := &ast.EnableDisableTriggerStatement{
5245+
TriggerEnforcement: enforcement,
5246+
}
5247+
5248+
// Check for ALL
5249+
if strings.ToUpper(p.curTok.Literal) == "ALL" {
5250+
stmt.All = true
5251+
p.nextToken()
5252+
} else {
5253+
stmt.All = false
5254+
// Parse trigger names (comma-separated)
5255+
for {
5256+
name, err := p.parseSchemaObjectName()
5257+
if err != nil {
5258+
return nil, err
5259+
}
5260+
stmt.TriggerNames = append(stmt.TriggerNames, name)
5261+
5262+
if p.curTok.Type != TokenComma {
5263+
break
5264+
}
5265+
p.nextToken() // consume comma
5266+
}
5267+
}
5268+
5269+
// Expect ON
5270+
if p.curTok.Type != TokenOn {
5271+
return nil, fmt.Errorf("expected ON after trigger names, got %s", p.curTok.Literal)
5272+
}
5273+
p.nextToken()
5274+
5275+
// Check for ALL SERVER or DATABASE or table name
5276+
stmt.TriggerObject = &ast.TriggerObject{}
5277+
5278+
if strings.ToUpper(p.curTok.Literal) == "ALL" {
5279+
p.nextToken()
5280+
if strings.ToUpper(p.curTok.Literal) == "SERVER" {
5281+
stmt.TriggerObject.TriggerScope = "AllServer"
5282+
p.nextToken()
5283+
} else {
5284+
return nil, fmt.Errorf("expected SERVER after ALL, got %s", p.curTok.Literal)
5285+
}
5286+
} else if strings.ToUpper(p.curTok.Literal) == "DATABASE" {
5287+
stmt.TriggerObject.TriggerScope = "Database"
5288+
p.nextToken()
5289+
} else {
5290+
// Parse table name
5291+
tableName, err := p.parseSchemaObjectName()
5292+
if err != nil {
5293+
return nil, err
5294+
}
5295+
stmt.TriggerObject.Name = tableName
5296+
stmt.TriggerObject.TriggerScope = "Normal"
5297+
}
5298+
5299+
// Skip optional semicolon
5300+
if p.curTok.Type == TokenSemicolon {
5301+
p.nextToken()
5302+
}
5303+
5304+
return stmt, nil
5305+
}

parser/parser.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,14 @@ func (p *Parser) parseStatement() (ast.Statement, error) {
198198
if strings.ToUpper(p.curTok.Literal) == "DEALLOCATE" {
199199
return p.parseDeallocateCursorStatement()
200200
}
201+
// Check for ENABLE TRIGGER
202+
if strings.ToUpper(p.curTok.Literal) == "ENABLE" {
203+
return p.parseEnableDisableTriggerStatement("Enable")
204+
}
205+
// Check for DISABLE TRIGGER
206+
if strings.ToUpper(p.curTok.Literal) == "DISABLE" {
207+
return p.parseEnableDisableTriggerStatement("Disable")
208+
}
201209
// Check for label (identifier followed by colon)
202210
return p.parseLabelOrError()
203211
default:
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"skip": true}
1+
{"skip": false}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"skip": true}
1+
{"skip": false}

0 commit comments

Comments
 (0)