Skip to content

Commit 98b8bf2

Browse files
authored
Support SCHEMA DDL statements (#179)
* Implement CREATE SCHEMA and DROP SCHEMA statements * Update testdata
1 parent db40951 commit 98b8bf2

10 files changed

+128
-0
lines changed

ast/ast.go

+28
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ type Statement interface {
6060
// - https://cloud.google.com/spanner/docs/reference/standard-sql/dml-syntax
6161

6262
func (QueryStatement) isStatement() {}
63+
func (CreateSchema) isStatement() {}
64+
func (DropSchema) isStatement() {}
6365
func (CreateDatabase) isStatement() {}
6466
func (AlterDatabase) isStatement() {}
6567
func (CreateTable) isStatement() {}
@@ -297,6 +299,8 @@ type DDL interface {
297299
//
298300
// - https://cloud.google.com/spanner/docs/reference/standard-sql/data-definition-language
299301

302+
func (CreateSchema) isDDL() {}
303+
func (DropSchema) isDDL() {}
300304
func (CreateDatabase) isDDL() {}
301305
func (AlterDatabase) isDDL() {}
302306
func (CreateTable) isDDL() {}
@@ -1765,6 +1769,30 @@ type OptionsDef struct {
17651769
Value Expr
17661770
}
17671771

1772+
// CreateSchema is CREATE SCHEMA statement node.
1773+
//
1774+
// CREATE SCHEMA {{.Name | sql}}
1775+
type CreateSchema struct {
1776+
// pos = Create
1777+
// end = Name.end
1778+
1779+
Create token.Pos // position of "CREATE" keyword
1780+
1781+
Name *Ident
1782+
}
1783+
1784+
// DropSchema is DROP SCHEMA statement node.
1785+
//
1786+
// DROP SCHEMA {{.Name | sql}}
1787+
type DropSchema struct {
1788+
// pos = Drop
1789+
// end = Name.end
1790+
1791+
Drop token.Pos // position of "DROP" keyword
1792+
1793+
Name *Ident
1794+
}
1795+
17681796
// CreateDatabase is CREATE DATABASE statement node.
17691797
//
17701798
// CREATE DATABASE {{.Name | sql}}

ast/pos.go

+16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ast/sql.go

+4
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,10 @@ func (c *CreateDatabase) SQL() string {
786786
return "CREATE DATABASE " + c.Name.SQL()
787787
}
788788

789+
func (s *CreateSchema) SQL() string { return "CREATE SCHEMA " + s.Name.SQL() }
790+
791+
func (s *DropSchema) SQL() string { return "DROP SCHEMA " + s.Name.SQL() }
792+
789793
func (d *AlterDatabase) SQL() string {
790794
return "ALTER DATABASE " + d.Name.SQL() + " SET " + d.Options.SQL()
791795
}

parser.go

+22
Original file line numberDiff line numberDiff line change
@@ -2299,6 +2299,8 @@ func (p *Parser) parseDDL() ast.DDL {
22992299
case p.Token.Kind == "CREATE":
23002300
p.nextToken()
23012301
switch {
2302+
case p.Token.IsKeywordLike("SCHEMA"):
2303+
return p.parseCreateSchema(pos)
23022304
case p.Token.IsKeywordLike("DATABASE"):
23032305
return p.parseCreateDatabase(pos)
23042306
case p.Token.IsKeywordLike("TABLE"):
@@ -2341,6 +2343,8 @@ func (p *Parser) parseDDL() ast.DDL {
23412343
case p.Token.IsKeywordLike("DROP"):
23422344
p.nextToken()
23432345
switch {
2346+
case p.Token.IsKeywordLike("SCHEMA"):
2347+
return p.parseDropSchema(pos)
23442348
case p.Token.IsKeywordLike("TABLE"):
23452349
return p.parseDropTable(pos)
23462350
case p.Token.IsKeywordLike("INDEX"):
@@ -2377,6 +2381,24 @@ func (p *Parser) parseDDL() ast.DDL {
23772381
panic(p.errorfAtToken(&p.Token, "expected pseudo keyword: ALTER, DROP, but: %s", p.Token.AsString))
23782382
}
23792383

2384+
func (p *Parser) parseCreateSchema(pos token.Pos) *ast.CreateSchema {
2385+
p.expectKeywordLike("SCHEMA")
2386+
name := p.parseIdent()
2387+
return &ast.CreateSchema{
2388+
Create: pos,
2389+
Name: name,
2390+
}
2391+
}
2392+
2393+
func (p *Parser) parseDropSchema(pos token.Pos) *ast.DropSchema {
2394+
p.expectKeywordLike("SCHEMA")
2395+
name := p.parseIdent()
2396+
return &ast.DropSchema{
2397+
Drop: pos,
2398+
Name: name,
2399+
}
2400+
}
2401+
23802402
func (p *Parser) parseCreateDatabase(pos token.Pos) *ast.CreateDatabase {
23812403
p.expectKeywordLike("DATABASE")
23822404
name := p.parseIdent()

testdata/input/ddl/create_schema.sql

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CREATE SCHEMA sch1

testdata/input/ddl/drop_schema.sql

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP SCHEMA sch1
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- create_schema.sql
2+
CREATE SCHEMA sch1
3+
--- AST
4+
&ast.CreateSchema{
5+
Create: 0,
6+
Name: &ast.Ident{
7+
NamePos: 14,
8+
NameEnd: 18,
9+
Name: "sch1",
10+
},
11+
}
12+
13+
--- SQL
14+
CREATE SCHEMA sch1
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- drop_schema.sql
2+
DROP SCHEMA sch1
3+
--- AST
4+
&ast.DropSchema{
5+
Drop: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 16,
9+
Name: "sch1",
10+
},
11+
}
12+
13+
--- SQL
14+
DROP SCHEMA sch1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- create_schema.sql
2+
CREATE SCHEMA sch1
3+
--- AST
4+
&ast.CreateSchema{
5+
Create: 0,
6+
Name: &ast.Ident{
7+
NamePos: 14,
8+
NameEnd: 18,
9+
Name: "sch1",
10+
},
11+
}
12+
13+
--- SQL
14+
CREATE SCHEMA sch1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- drop_schema.sql
2+
DROP SCHEMA sch1
3+
--- AST
4+
&ast.DropSchema{
5+
Drop: 0,
6+
Name: &ast.Ident{
7+
NamePos: 12,
8+
NameEnd: 16,
9+
Name: "sch1",
10+
},
11+
}
12+
13+
--- SQL
14+
DROP SCHEMA sch1

0 commit comments

Comments
 (0)