Skip to content

Commit c48d32d

Browse files
committed
Add CREATE OR ALTER support for procedure, trigger, and view statements
- Add CreateOrAlterProcedureStatement AST type - Add CreateOrAlterTriggerStatement AST type - Add CreateOrAlterViewStatement AST type - Update parsing to return correct CreateOrAlter types - Add JSON marshaling for all three new types This enables 2 tests: Baselines130_CreateOrAlterStatementTests130 and CreateOrAlterStatementTests130.
1 parent a3dbf52 commit c48d32d

6 files changed

Lines changed: 188 additions & 11 deletions

File tree

ast/create_procedure_statement.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@ type CreateProcedureStatement struct {
1313
func (c *CreateProcedureStatement) node() {}
1414
func (c *CreateProcedureStatement) statement() {}
1515

16+
// CreateOrAlterProcedureStatement represents a CREATE OR ALTER PROCEDURE statement.
17+
type CreateOrAlterProcedureStatement struct {
18+
ProcedureReference *ProcedureReference
19+
Parameters []*ProcedureParameter
20+
StatementList *StatementList
21+
IsForReplication bool
22+
Options []ProcedureOptionBase
23+
MethodSpecifier *MethodSpecifier
24+
}
25+
26+
func (c *CreateOrAlterProcedureStatement) node() {}
27+
func (c *CreateOrAlterProcedureStatement) statement() {}
28+
1629
// ProcedureParameter represents a parameter in a procedure definition.
1730
type ProcedureParameter struct {
1831
VariableName *Identifier

ast/create_trigger_statement.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@ type CreateTriggerStatement struct {
1616
func (s *CreateTriggerStatement) statement() {}
1717
func (s *CreateTriggerStatement) node() {}
1818

19+
// CreateOrAlterTriggerStatement represents a CREATE OR ALTER TRIGGER statement
20+
type CreateOrAlterTriggerStatement struct {
21+
Name *SchemaObjectName
22+
TriggerObject *TriggerObject
23+
TriggerType string // "For", "After", "InsteadOf"
24+
TriggerActions []*TriggerAction
25+
Options []TriggerOptionType
26+
WithAppend bool
27+
IsNotForReplication bool
28+
MethodSpecifier *MethodSpecifier
29+
StatementList *StatementList
30+
}
31+
32+
func (s *CreateOrAlterTriggerStatement) statement() {}
33+
func (s *CreateOrAlterTriggerStatement) node() {}
34+
1935
// EventTypeContainer represents an event type container
2036
type EventTypeContainer struct {
2137
EventType string `json:"EventType,omitempty"`

ast/create_view_statement.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,19 @@ type CreateViewStatement struct {
1313
func (c *CreateViewStatement) node() {}
1414
func (c *CreateViewStatement) statement() {}
1515

16+
// CreateOrAlterViewStatement represents a CREATE OR ALTER VIEW statement.
17+
type CreateOrAlterViewStatement struct {
18+
SchemaObjectName *SchemaObjectName `json:"SchemaObjectName,omitempty"`
19+
Columns []*Identifier `json:"Columns,omitempty"`
20+
SelectStatement *SelectStatement `json:"SelectStatement,omitempty"`
21+
WithCheckOption bool `json:"WithCheckOption"`
22+
ViewOptions []ViewOption `json:"ViewOptions,omitempty"`
23+
IsMaterialized bool `json:"IsMaterialized"`
24+
}
25+
26+
func (c *CreateOrAlterViewStatement) node() {}
27+
func (c *CreateOrAlterViewStatement) statement() {}
28+
1629
// ViewOption is an interface for different view option types.
1730
type ViewOption interface {
1831
viewOption()

parser/marshal.go

Lines changed: 144 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,14 @@ func statementToJSON(stmt ast.Statement) jsonNode {
7878
return beginConversationTimerStatementToJSON(s)
7979
case *ast.CreateViewStatement:
8080
return createViewStatementToJSON(s)
81+
case *ast.CreateOrAlterViewStatement:
82+
return createOrAlterViewStatementToJSON(s)
8183
case *ast.CreateSchemaStatement:
8284
return createSchemaStatementToJSON(s)
8385
case *ast.CreateProcedureStatement:
8486
return createProcedureStatementToJSON(s)
87+
case *ast.CreateOrAlterProcedureStatement:
88+
return createOrAlterProcedureStatementToJSON(s)
8589
case *ast.AlterProcedureStatement:
8690
return alterProcedureStatementToJSON(s)
8791
case *ast.CreateRoleStatement:
@@ -380,6 +384,8 @@ func statementToJSON(stmt ast.Statement) jsonNode {
380384
return alterTriggerStatementToJSON(s)
381385
case *ast.CreateTriggerStatement:
382386
return createTriggerStatementToJSON(s)
387+
case *ast.CreateOrAlterTriggerStatement:
388+
return createOrAlterTriggerStatementToJSON(s)
383389
case *ast.EnableDisableTriggerStatement:
384390
return enableDisableTriggerStatementToJSON(s)
385391
case *ast.EndConversationStatement:
@@ -2973,6 +2979,35 @@ func createViewStatementToJSON(s *ast.CreateViewStatement) jsonNode {
29732979
return node
29742980
}
29752981

2982+
func createOrAlterViewStatementToJSON(s *ast.CreateOrAlterViewStatement) jsonNode {
2983+
node := jsonNode{
2984+
"$type": "CreateOrAlterViewStatement",
2985+
}
2986+
if s.SchemaObjectName != nil {
2987+
node["SchemaObjectName"] = schemaObjectNameToJSON(s.SchemaObjectName)
2988+
}
2989+
if len(s.Columns) > 0 {
2990+
cols := make([]jsonNode, len(s.Columns))
2991+
for i, c := range s.Columns {
2992+
cols[i] = identifierToJSON(c)
2993+
}
2994+
node["Columns"] = cols
2995+
}
2996+
if len(s.ViewOptions) > 0 {
2997+
opts := make([]jsonNode, len(s.ViewOptions))
2998+
for i, opt := range s.ViewOptions {
2999+
opts[i] = viewOptionToJSON(opt)
3000+
}
3001+
node["ViewOptions"] = opts
3002+
}
3003+
if s.SelectStatement != nil {
3004+
node["SelectStatement"] = selectStatementToJSON(s.SelectStatement)
3005+
}
3006+
node["WithCheckOption"] = s.WithCheckOption
3007+
node["IsMaterialized"] = s.IsMaterialized
3008+
return node
3009+
}
3010+
29763011
func viewOptionToJSON(opt ast.ViewOption) jsonNode {
29773012
switch o := opt.(type) {
29783013
case *ast.ViewStatementOption:
@@ -6339,6 +6374,37 @@ func createProcedureStatementToJSON(s *ast.CreateProcedureStatement) jsonNode {
63396374
return node
63406375
}
63416376

6377+
func createOrAlterProcedureStatementToJSON(s *ast.CreateOrAlterProcedureStatement) jsonNode {
6378+
node := jsonNode{
6379+
"$type": "CreateOrAlterProcedureStatement",
6380+
"IsForReplication": s.IsForReplication,
6381+
}
6382+
if s.ProcedureReference != nil {
6383+
node["ProcedureReference"] = procedureReferenceToJSON(s.ProcedureReference)
6384+
}
6385+
if len(s.Options) > 0 {
6386+
options := make([]jsonNode, len(s.Options))
6387+
for i, opt := range s.Options {
6388+
options[i] = procedureOptionToJSON(opt)
6389+
}
6390+
node["Options"] = options
6391+
}
6392+
if len(s.Parameters) > 0 {
6393+
params := make([]jsonNode, len(s.Parameters))
6394+
for i, p := range s.Parameters {
6395+
params[i] = procedureParameterToJSON(p)
6396+
}
6397+
node["Parameters"] = params
6398+
}
6399+
if s.MethodSpecifier != nil {
6400+
node["MethodSpecifier"] = methodSpecifierToJSON(s.MethodSpecifier)
6401+
}
6402+
if s.StatementList != nil {
6403+
node["StatementList"] = statementListToJSON(s.StatementList)
6404+
}
6405+
return node
6406+
}
6407+
63426408
func procedureOptionToJSON(opt ast.ProcedureOptionBase) jsonNode {
63436409
switch o := opt.(type) {
63446410
case *ast.ProcedureOption:
@@ -8553,21 +8619,57 @@ func (p *Parser) parseCreateOrAlterFunctionStatement() (*ast.CreateOrAlterFuncti
85538619
}
85548620

85558621
// parseCreateOrAlterProcedureStatement parses a CREATE OR ALTER PROCEDURE statement
8556-
func (p *Parser) parseCreateOrAlterProcedureStatement() (*ast.CreateProcedureStatement, error) {
8557-
// For now, delegate to regular CREATE PROCEDURE parsing
8558-
return p.parseCreateProcedureStatement()
8622+
func (p *Parser) parseCreateOrAlterProcedureStatement() (*ast.CreateOrAlterProcedureStatement, error) {
8623+
// Parse as regular CREATE PROCEDURE, then convert to CreateOrAlter type
8624+
stmt, err := p.parseCreateProcedureStatement()
8625+
if err != nil {
8626+
return nil, err
8627+
}
8628+
return &ast.CreateOrAlterProcedureStatement{
8629+
ProcedureReference: stmt.ProcedureReference,
8630+
Parameters: stmt.Parameters,
8631+
StatementList: stmt.StatementList,
8632+
IsForReplication: stmt.IsForReplication,
8633+
Options: stmt.Options,
8634+
MethodSpecifier: stmt.MethodSpecifier,
8635+
}, nil
85598636
}
85608637

85618638
// parseCreateOrAlterViewStatement parses a CREATE OR ALTER VIEW statement
8562-
func (p *Parser) parseCreateOrAlterViewStatement() (*ast.CreateViewStatement, error) {
8563-
// For now, delegate to regular CREATE VIEW parsing
8564-
return p.parseCreateViewStatement()
8639+
func (p *Parser) parseCreateOrAlterViewStatement() (*ast.CreateOrAlterViewStatement, error) {
8640+
// Parse as regular CREATE VIEW, then convert to CreateOrAlter type
8641+
stmt, err := p.parseCreateViewStatement()
8642+
if err != nil {
8643+
return nil, err
8644+
}
8645+
return &ast.CreateOrAlterViewStatement{
8646+
SchemaObjectName: stmt.SchemaObjectName,
8647+
Columns: stmt.Columns,
8648+
SelectStatement: stmt.SelectStatement,
8649+
WithCheckOption: stmt.WithCheckOption,
8650+
ViewOptions: stmt.ViewOptions,
8651+
IsMaterialized: stmt.IsMaterialized,
8652+
}, nil
85658653
}
85668654

85678655
// parseCreateOrAlterTriggerStatement parses a CREATE OR ALTER TRIGGER statement
8568-
func (p *Parser) parseCreateOrAlterTriggerStatement() (*ast.CreateTriggerStatement, error) {
8569-
// For now, delegate to regular CREATE TRIGGER parsing
8570-
return p.parseCreateTriggerStatement()
8656+
func (p *Parser) parseCreateOrAlterTriggerStatement() (*ast.CreateOrAlterTriggerStatement, error) {
8657+
// Parse as regular CREATE TRIGGER, then convert to CreateOrAlter type
8658+
stmt, err := p.parseCreateTriggerStatement()
8659+
if err != nil {
8660+
return nil, err
8661+
}
8662+
return &ast.CreateOrAlterTriggerStatement{
8663+
Name: stmt.Name,
8664+
TriggerObject: stmt.TriggerObject,
8665+
TriggerType: stmt.TriggerType,
8666+
TriggerActions: stmt.TriggerActions,
8667+
Options: stmt.Options,
8668+
WithAppend: stmt.WithAppend,
8669+
IsNotForReplication: stmt.IsNotForReplication,
8670+
MethodSpecifier: stmt.MethodSpecifier,
8671+
StatementList: stmt.StatementList,
8672+
}, nil
85718673
}
85728674

85738675
// parseCreateTriggerStatement parses a CREATE TRIGGER statement
@@ -9580,6 +9682,39 @@ func createTriggerStatementToJSON(s *ast.CreateTriggerStatement) jsonNode {
95809682
return node
95819683
}
95829684

9685+
func createOrAlterTriggerStatementToJSON(s *ast.CreateOrAlterTriggerStatement) jsonNode {
9686+
node := jsonNode{
9687+
"$type": "CreateOrAlterTriggerStatement",
9688+
"TriggerType": s.TriggerType,
9689+
"WithAppend": s.WithAppend,
9690+
"IsNotForReplication": s.IsNotForReplication,
9691+
}
9692+
if s.Name != nil {
9693+
node["Name"] = schemaObjectNameToJSON(s.Name)
9694+
}
9695+
if s.TriggerObject != nil {
9696+
node["TriggerObject"] = triggerObjectToJSON(s.TriggerObject)
9697+
}
9698+
if len(s.Options) > 0 {
9699+
options := make([]jsonNode, len(s.Options))
9700+
for i, o := range s.Options {
9701+
options[i] = triggerOptionTypeToJSON(o)
9702+
}
9703+
node["Options"] = options
9704+
}
9705+
if len(s.TriggerActions) > 0 {
9706+
actions := make([]jsonNode, len(s.TriggerActions))
9707+
for i, a := range s.TriggerActions {
9708+
actions[i] = triggerActionToJSON(a)
9709+
}
9710+
node["TriggerActions"] = actions
9711+
}
9712+
if s.StatementList != nil {
9713+
node["StatementList"] = statementListToJSON(s.StatementList)
9714+
}
9715+
return node
9716+
}
9717+
95839718
func triggerOptionTypeToJSON(o ast.TriggerOptionType) jsonNode {
95849719
switch opt := o.(type) {
95859720
case *ast.TriggerOption:
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"todo": true}
1+
{}

0 commit comments

Comments
 (0)