Skip to content

Commit 72cd05c

Browse files
apstndbmakenowjust
andauthored
Implement ALTER DATABASE statement (#161)
* Implement ALTER DATABASE statement * Fix ast/ast_test.go --------- Co-authored-by: Hiroya Fujinami <make.just.on@gmail.com>
1 parent f2d6500 commit 72cd05c

File tree

8 files changed

+218
-0
lines changed

8 files changed

+218
-0
lines changed

ast/ast.go

+15
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type Statement interface {
5757

5858
func (QueryStatement) isStatement() {}
5959
func (CreateDatabase) isStatement() {}
60+
func (AlterDatabase) isStatement() {}
6061
func (CreateTable) isStatement() {}
6162
func (AlterTable) isStatement() {}
6263
func (DropTable) isStatement() {}
@@ -265,6 +266,7 @@ type DDL interface {
265266
// - https://cloud.google.com/spanner/docs/reference/standard-sql/data-definition-language
266267

267268
func (CreateDatabase) isDDL() {}
269+
func (AlterDatabase) isDDL() {}
268270
func (CreateTable) isDDL() {}
269271
func (AlterTable) isDDL() {}
270272
func (DropTable) isDDL() {}
@@ -1636,6 +1638,19 @@ type CreateDatabase struct {
16361638
Name *Ident
16371639
}
16381640

1641+
// AlterDatabase is ALTER DATABASE statement node.
1642+
//
1643+
// ALTER DATABASE {{.Name | sql}} SET {{.Options | sql}}
1644+
type AlterDatabase struct {
1645+
// pos = Alter
1646+
// end = Name.end
1647+
1648+
Alter token.Pos // position of "ALTER" keyword
1649+
1650+
Name *Ident
1651+
Options *Options
1652+
}
1653+
16391654
// CreateTable is CREATE TABLE statement node.
16401655
//
16411656
// CREATE TABLE {{if .IfNotExists}}IF NOT EXISTS{{end}} {{.Name | sql}} (

ast/ast_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
func TestStatement(t *testing.T) {
88
Statement(&QueryStatement{}).isStatement()
99
Statement(&CreateDatabase{}).isStatement()
10+
Statement(&AlterDatabase{}).isStatement()
1011
Statement(&CreateTable{}).isStatement()
1112
Statement(&AlterTable{}).isStatement()
1213
Statement(&DropTable{}).isStatement()
@@ -136,6 +137,7 @@ func TestStringValue(t *testing.T) {
136137

137138
func TestDDL(t *testing.T) {
138139
DDL(&CreateDatabase{}).isDDL()
140+
DDL(&AlterDatabase{}).isDDL()
139141
DDL(&CreateTable{}).isDDL()
140142
DDL(&AlterTable{}).isDDL()
141143
DDL(&DropTable{}).isDDL()

ast/pos.go

+3
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,9 @@ func (g *OptionsDef) End() token.Pos { return g.Value.End() }
549549
func (c *CreateDatabase) Pos() token.Pos { return c.Create }
550550
func (c *CreateDatabase) End() token.Pos { return c.Name.End() }
551551

552+
func (d *AlterDatabase) Pos() token.Pos { return d.Alter }
553+
func (d *AlterDatabase) End() token.Pos { return d.Options.End() }
554+
552555
func (c *CreateTable) Pos() token.Pos {
553556
return c.Create
554557
}

ast/sql.go

+4
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,10 @@ func (c *CreateDatabase) SQL() string {
767767
return "CREATE DATABASE " + c.Name.SQL()
768768
}
769769

770+
func (d *AlterDatabase) SQL() string {
771+
return "ALTER DATABASE " + d.Name.SQL() + " SET " + d.Options.SQL()
772+
}
773+
770774
func (c *CreateTable) SQL() string {
771775
return "CREATE TABLE " +
772776
strOpt(c.IfNotExists, "IF NOT EXISTS ") +

parser.go

+15
Original file line numberDiff line numberDiff line change
@@ -2171,6 +2171,8 @@ func (p *Parser) parseDDL() ast.DDL {
21712171
switch {
21722172
case p.Token.IsKeywordLike("TABLE"):
21732173
return p.parseAlterTable(pos)
2174+
case p.Token.IsKeywordLike("DATABASE"):
2175+
return p.parseAlterDatabase(pos)
21742176
case p.Token.IsKeywordLike("INDEX"):
21752177
return p.parseAlterIndex(pos)
21762178
case p.Token.IsKeywordLike("SEQUENCE"):
@@ -2222,6 +2224,19 @@ func (p *Parser) parseCreateDatabase(pos token.Pos) *ast.CreateDatabase {
22222224
}
22232225
}
22242226

2227+
func (p *Parser) parseAlterDatabase(pos token.Pos) *ast.AlterDatabase {
2228+
p.expectKeywordLike("DATABASE")
2229+
name := p.parseIdent()
2230+
p.expect("SET")
2231+
options := p.parseOptions()
2232+
2233+
return &ast.AlterDatabase{
2234+
Alter: pos,
2235+
Name: name,
2236+
Options: options,
2237+
}
2238+
}
2239+
22252240
func (p *Parser) parseCreateTable(pos token.Pos) *ast.CreateTable {
22262241
p.expectKeywordLike("TABLE")
22272242
ifNotExists := p.parseIfNotExists()

testdata/input/ddl/alter_database.sql

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ALTER DATABASE dbname SET OPTIONS (
2+
optimizer_version=2,
3+
optimizer_statistics_package='auto_20191128_14_47_22UTC',
4+
version_retention_period='7d',
5+
enable_key_visualizer=true,
6+
default_leader='europe-west1'
7+
)
+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
--- alter_database.sql
2+
ALTER DATABASE dbname SET OPTIONS (
3+
optimizer_version=2,
4+
optimizer_statistics_package='auto_20191128_14_47_22UTC',
5+
version_retention_period='7d',
6+
enable_key_visualizer=true,
7+
default_leader='europe-west1'
8+
)
9+
--- AST
10+
&ast.AlterDatabase{
11+
Alter: 0,
12+
Name: &ast.Ident{
13+
NamePos: 15,
14+
NameEnd: 21,
15+
Name: "dbname",
16+
},
17+
Options: &ast.Options{
18+
Options: 26,
19+
Rparen: 226,
20+
Records: []*ast.OptionsDef{
21+
&ast.OptionsDef{
22+
Name: &ast.Ident{
23+
NamePos: 40,
24+
NameEnd: 57,
25+
Name: "optimizer_version",
26+
},
27+
Value: &ast.IntLiteral{
28+
ValuePos: 58,
29+
ValueEnd: 59,
30+
Base: 10,
31+
Value: "2",
32+
},
33+
},
34+
&ast.OptionsDef{
35+
Name: &ast.Ident{
36+
NamePos: 65,
37+
NameEnd: 93,
38+
Name: "optimizer_statistics_package",
39+
},
40+
Value: &ast.StringLiteral{
41+
ValuePos: 94,
42+
ValueEnd: 121,
43+
Value: "auto_20191128_14_47_22UTC",
44+
},
45+
},
46+
&ast.OptionsDef{
47+
Name: &ast.Ident{
48+
NamePos: 127,
49+
NameEnd: 151,
50+
Name: "version_retention_period",
51+
},
52+
Value: &ast.StringLiteral{
53+
ValuePos: 152,
54+
ValueEnd: 156,
55+
Value: "7d",
56+
},
57+
},
58+
&ast.OptionsDef{
59+
Name: &ast.Ident{
60+
NamePos: 162,
61+
NameEnd: 183,
62+
Name: "enable_key_visualizer",
63+
},
64+
Value: &ast.BoolLiteral{
65+
ValuePos: 184,
66+
Value: true,
67+
},
68+
},
69+
&ast.OptionsDef{
70+
Name: &ast.Ident{
71+
NamePos: 194,
72+
NameEnd: 208,
73+
Name: "default_leader",
74+
},
75+
Value: &ast.StringLiteral{
76+
ValuePos: 209,
77+
ValueEnd: 223,
78+
Value: "europe-west1",
79+
},
80+
},
81+
},
82+
},
83+
}
84+
85+
--- SQL
86+
ALTER DATABASE dbname SET OPTIONS (optimizer_version = 2, optimizer_statistics_package = "auto_20191128_14_47_22UTC", version_retention_period = "7d", enable_key_visualizer = true, default_leader = "europe-west1")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
--- alter_database.sql
2+
ALTER DATABASE dbname SET OPTIONS (
3+
optimizer_version=2,
4+
optimizer_statistics_package='auto_20191128_14_47_22UTC',
5+
version_retention_period='7d',
6+
enable_key_visualizer=true,
7+
default_leader='europe-west1'
8+
)
9+
--- AST
10+
&ast.AlterDatabase{
11+
Alter: 0,
12+
Name: &ast.Ident{
13+
NamePos: 15,
14+
NameEnd: 21,
15+
Name: "dbname",
16+
},
17+
Options: &ast.Options{
18+
Options: 26,
19+
Rparen: 226,
20+
Records: []*ast.OptionsDef{
21+
&ast.OptionsDef{
22+
Name: &ast.Ident{
23+
NamePos: 40,
24+
NameEnd: 57,
25+
Name: "optimizer_version",
26+
},
27+
Value: &ast.IntLiteral{
28+
ValuePos: 58,
29+
ValueEnd: 59,
30+
Base: 10,
31+
Value: "2",
32+
},
33+
},
34+
&ast.OptionsDef{
35+
Name: &ast.Ident{
36+
NamePos: 65,
37+
NameEnd: 93,
38+
Name: "optimizer_statistics_package",
39+
},
40+
Value: &ast.StringLiteral{
41+
ValuePos: 94,
42+
ValueEnd: 121,
43+
Value: "auto_20191128_14_47_22UTC",
44+
},
45+
},
46+
&ast.OptionsDef{
47+
Name: &ast.Ident{
48+
NamePos: 127,
49+
NameEnd: 151,
50+
Name: "version_retention_period",
51+
},
52+
Value: &ast.StringLiteral{
53+
ValuePos: 152,
54+
ValueEnd: 156,
55+
Value: "7d",
56+
},
57+
},
58+
&ast.OptionsDef{
59+
Name: &ast.Ident{
60+
NamePos: 162,
61+
NameEnd: 183,
62+
Name: "enable_key_visualizer",
63+
},
64+
Value: &ast.BoolLiteral{
65+
ValuePos: 184,
66+
Value: true,
67+
},
68+
},
69+
&ast.OptionsDef{
70+
Name: &ast.Ident{
71+
NamePos: 194,
72+
NameEnd: 208,
73+
Name: "default_leader",
74+
},
75+
Value: &ast.StringLiteral{
76+
ValuePos: 209,
77+
ValueEnd: 223,
78+
Value: "europe-west1",
79+
},
80+
},
81+
},
82+
},
83+
}
84+
85+
--- SQL
86+
ALTER DATABASE dbname SET OPTIONS (optimizer_version = 2, optimizer_statistics_package = "auto_20191128_14_47_22UTC", version_retention_period = "7d", enable_key_visualizer = true, default_leader = "europe-west1")

0 commit comments

Comments
 (0)