Skip to content

Commit 4fbe2ea

Browse files
committed
Add CREATE DATABASE CONTAINMENT and WITH options parsing
Add support for: - CONTAINMENT = NONE/PARTIAL option - TRANSFORM_NOISE_WORDS = ON/OFF option - DB_CHAINING ON/OFF option (without = sign) - NESTED_TRIGGERS = ON/OFF option Enabled tests: - Baselines140_CreateDatabaseTests140 - CreateDatabaseTests140
1 parent 2c93200 commit 4fbe2ea

5 files changed

Lines changed: 89 additions & 11 deletions

File tree

ast/create_simple_statements.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,25 @@ package ast
22

33
// CreateDatabaseStatement represents a CREATE DATABASE statement.
44
type CreateDatabaseStatement struct {
5-
DatabaseName *Identifier `json:"DatabaseName,omitempty"`
6-
Options []CreateDatabaseOption `json:"Options,omitempty"`
7-
AttachMode string `json:"AttachMode,omitempty"` // "None", "Attach", "AttachRebuildLog"
8-
CopyOf *MultiPartIdentifier `json:"CopyOf,omitempty"` // For AS COPY OF syntax
9-
FileGroups []*FileGroupDefinition `json:"FileGroups,omitempty"`
10-
LogOn []*FileDeclaration `json:"LogOn,omitempty"`
11-
Collation *Identifier `json:"Collation,omitempty"`
5+
DatabaseName *Identifier `json:"DatabaseName,omitempty"`
6+
Options []CreateDatabaseOption `json:"Options,omitempty"`
7+
AttachMode string `json:"AttachMode,omitempty"` // "None", "Attach", "AttachRebuildLog"
8+
CopyOf *MultiPartIdentifier `json:"CopyOf,omitempty"` // For AS COPY OF syntax
9+
FileGroups []*FileGroupDefinition `json:"FileGroups,omitempty"`
10+
LogOn []*FileDeclaration `json:"LogOn,omitempty"`
11+
Collation *Identifier `json:"Collation,omitempty"`
12+
Containment *ContainmentDatabaseOption `json:"Containment,omitempty"`
1213
}
1314

15+
// ContainmentDatabaseOption represents CONTAINMENT = NONE/PARTIAL
16+
type ContainmentDatabaseOption struct {
17+
Value string // "None" or "Partial"
18+
OptionKind string // Always "Containment"
19+
}
20+
21+
func (c *ContainmentDatabaseOption) node() {}
22+
func (c *ContainmentDatabaseOption) createDatabaseOption() {}
23+
1424
func (s *CreateDatabaseStatement) node() {}
1525
func (s *CreateDatabaseStatement) statement() {}
1626

parser/marshal.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9008,6 +9008,9 @@ func createDatabaseStatementToJSON(s *ast.CreateDatabaseStatement) jsonNode {
90089008
if s.DatabaseName != nil {
90099009
node["DatabaseName"] = identifierToJSON(s.DatabaseName)
90109010
}
9011+
if s.Containment != nil {
9012+
node["Containment"] = containmentDatabaseOptionToJSON(s.Containment)
9013+
}
90119014
if len(s.Options) > 0 {
90129015
opts := make([]jsonNode, len(s.Options))
90139016
for i, opt := range s.Options {
@@ -9029,8 +9032,8 @@ func createDatabaseStatementToJSON(s *ast.CreateDatabaseStatement) jsonNode {
90299032
}
90309033
node["LogOn"] = logs
90319034
}
9032-
// AttachMode is output when there are FileGroups, Options, Collation, or CopyOf
9033-
if len(s.FileGroups) > 0 || len(s.Options) > 0 || s.Collation != nil || s.CopyOf != nil {
9035+
// AttachMode is output when there are FileGroups, Options, Collation, CopyOf, or Containment
9036+
if len(s.FileGroups) > 0 || len(s.Options) > 0 || s.Collation != nil || s.CopyOf != nil || s.Containment != nil {
90349037
node["AttachMode"] = s.AttachMode
90359038
}
90369039
if s.CopyOf != nil {
@@ -9042,6 +9045,14 @@ func createDatabaseStatementToJSON(s *ast.CreateDatabaseStatement) jsonNode {
90429045
return node
90439046
}
90449047

9048+
func containmentDatabaseOptionToJSON(c *ast.ContainmentDatabaseOption) jsonNode {
9049+
return jsonNode{
9050+
"$type": "ContainmentDatabaseOption",
9051+
"Value": c.Value,
9052+
"OptionKind": c.OptionKind,
9053+
}
9054+
}
9055+
90459056
func fileGroupDefinitionToJSON(fg *ast.FileGroupDefinition) jsonNode {
90469057
node := jsonNode{
90479058
"$type": "FileGroupDefinition",

parser/parse_statements.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5782,6 +5782,24 @@ func (p *Parser) parseCreateDatabaseStatement() (ast.Statement, error) {
57825782
}
57835783
}
57845784

5785+
// Check for CONTAINMENT = NONE/PARTIAL
5786+
if strings.ToUpper(p.curTok.Literal) == "CONTAINMENT" {
5787+
p.nextToken() // consume CONTAINMENT
5788+
if p.curTok.Type == TokenEquals {
5789+
p.nextToken() // consume =
5790+
}
5791+
val := strings.ToUpper(p.curTok.Literal)
5792+
containmentVal := "None"
5793+
if val == "PARTIAL" {
5794+
containmentVal = "Partial"
5795+
}
5796+
stmt.Containment = &ast.ContainmentDatabaseOption{
5797+
Value: containmentVal,
5798+
OptionKind: "Containment",
5799+
}
5800+
p.nextToken()
5801+
}
5802+
57855803
// Check for AS COPY OF syntax
57865804
if p.curTok.Type == TokenAs {
57875805
p.nextToken() // consume AS
@@ -5895,6 +5913,45 @@ func (p *Parser) parseCreateDatabaseOptions() ([]ast.CreateDatabaseOption, error
58955913
}
58965914
options = append(options, opt)
58975915

5916+
case "TRANSFORM_NOISE_WORDS":
5917+
p.nextToken() // consume TRANSFORM_NOISE_WORDS
5918+
if p.curTok.Type == TokenEquals {
5919+
p.nextToken() // consume =
5920+
}
5921+
state := strings.ToUpper(p.curTok.Literal)
5922+
p.nextToken() // consume ON/OFF
5923+
opt := &ast.OnOffDatabaseOption{
5924+
OptionKind: "TransformNoiseWords",
5925+
OptionState: capitalizeFirst(state),
5926+
}
5927+
options = append(options, opt)
5928+
5929+
case "DB_CHAINING":
5930+
p.nextToken() // consume DB_CHAINING
5931+
if p.curTok.Type == TokenEquals {
5932+
p.nextToken() // consume = (optional)
5933+
}
5934+
state := strings.ToUpper(p.curTok.Literal)
5935+
p.nextToken() // consume ON/OFF
5936+
opt := &ast.OnOffDatabaseOption{
5937+
OptionKind: "DBChaining",
5938+
OptionState: capitalizeFirst(state),
5939+
}
5940+
options = append(options, opt)
5941+
5942+
case "NESTED_TRIGGERS":
5943+
p.nextToken() // consume NESTED_TRIGGERS
5944+
if p.curTok.Type == TokenEquals {
5945+
p.nextToken() // consume =
5946+
}
5947+
state := strings.ToUpper(p.curTok.Literal)
5948+
p.nextToken() // consume ON/OFF
5949+
opt := &ast.OnOffDatabaseOption{
5950+
OptionKind: "NestedTriggers",
5951+
OptionState: capitalizeFirst(state),
5952+
}
5953+
options = append(options, opt)
5954+
58985955
default:
58995956
// Unknown option, return what we have
59005957
return options, nil
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)