Skip to content

Commit 76dfb95

Browse files
authored
ast: Add AST for ALTER TABLE ADD / DROP COLUMN (#376)
* ast: Add AST for ALTER TABLE ADD / DROP COLUMN * Remove print statement
1 parent cf1d9ab commit 76dfb95

File tree

18 files changed

+460
-80
lines changed

18 files changed

+460
-80
lines changed

Makefile

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
build:
2+
go build ./...
3+
4+
test:
5+
go test --tags=exp ./...
6+
7+
sqlc-dev:
8+
go build -o ~/bin/sqlc-dev --tags=exp ./cmd/sqlc/
9+
10+
regen:
11+
cd internal/endtoend && ./regenerate.sh

internal/catalog/build.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ func Update(c *pg.Catalog, stmt nodes.Node) error {
311311
} else {
312312
c.Schemas[name] = pg.NewSchema()
313313
}
314+
314315
case nodes.DropStmt:
315316
for _, obj := range n.Objects.Items {
316317
if n.RemoveType == nodes.OBJECT_TABLE || n.RemoveType == nodes.OBJECT_TYPE {

internal/dolphin/parse.go

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313

1414
func NewParser() *Parser {
1515
return &Parser{parser.New()}
16-
1716
}
1817

1918
type Parser struct {
@@ -78,6 +77,13 @@ func text(nodes []pcast.Node) []string {
7877
return str
7978
}
8079

80+
func parseTableName(n *pcast.TableName) *ast.TableName {
81+
return &ast.TableName{
82+
Schema: n.Schema.String(),
83+
Name: n.Name.String(),
84+
}
85+
}
86+
8187
func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) {
8288
blob, err := ioutil.ReadAll(r)
8389
if err != nil {
@@ -92,12 +98,56 @@ func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) {
9298
var stmt ast.Node
9399
switch n := stmtNodes[i].(type) {
94100

101+
case *pcast.AlterTableStmt:
102+
alt := &ast.AlterTableStmt{
103+
Table: parseTableName(n.Table),
104+
Cmds: &ast.List{},
105+
}
106+
for _, spec := range n.Specs {
107+
switch spec.Tp {
108+
case pcast.AlterTableAddColumns:
109+
for _, def := range spec.NewColumns {
110+
name := def.Name.String()
111+
alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{
112+
Name: &name,
113+
Subtype: ast.AT_AddColumn,
114+
Def: &ast.ColumnDef{
115+
Colname: def.Name.String(),
116+
// TODO: Use def.Tp to generate type name
117+
TypeName: &ast.TypeName{Name: "text"},
118+
},
119+
})
120+
}
121+
122+
case pcast.AlterTableDropColumn:
123+
name := spec.OldColumnName.String()
124+
alt.Cmds.Items = append(alt.Cmds.Items, &ast.AlterTableCmd{
125+
Name: &name,
126+
Subtype: ast.AT_DropColumn,
127+
MissingOk: spec.IfExists,
128+
})
129+
130+
case pcast.AlterTableChangeColumn:
131+
// spew.Dump("change column", spec)
132+
133+
case pcast.AlterTableModifyColumn:
134+
// spew.Dump("modify column", spec)
135+
136+
case pcast.AlterTableAlterColumn:
137+
// spew.Dump("alter column", spec)
138+
139+
case pcast.AlterTableAddConstraint:
140+
// spew.Dump("add const", spec)
141+
142+
default:
143+
continue
144+
}
145+
}
146+
stmt = alt
147+
95148
case *pcast.CreateTableStmt:
96149
create := &ast.CreateTableStmt{
97-
Name: &ast.TableName{
98-
Schema: n.Table.Schema.String(),
99-
Name: n.Table.Name.String(),
100-
},
150+
Name: parseTableName(n.Table),
101151
IfNotExists: n.IfNotExists,
102152
}
103153
for _, def := range n.Cols {
@@ -112,10 +162,7 @@ func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) {
112162
case *pcast.DropTableStmt:
113163
drop := &ast.DropTableStmt{IfExists: n.IfExists}
114164
for _, name := range n.Tables {
115-
drop.Tables = append(drop.Tables, &ast.TableName{
116-
Schema: name.Schema.String(),
117-
Name: name.Name.String(),
118-
})
165+
drop.Tables = append(drop.Tables, parseTableName(name))
119166
}
120167
stmt = drop
121168

@@ -127,10 +174,7 @@ func (p *Parser) Parse(r io.Reader) ([]ast.Statement, error) {
127174
if !ok {
128175
return
129176
}
130-
tables = append(tables, &ast.TableName{
131-
Schema: name.Schema.String(),
132-
Name: name.Name.String(),
133-
})
177+
tables = append(tables, parseTableName(name))
134178
})
135179
var cols []ast.Node
136180
visit(n.Fields, func(n pcast.Node) {

internal/endtoend/testdata/experimental_dolphin/go/models.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
CREATE TABLE foo (
2+
bar text NOT NULL
3+
);
4+
5+
CREATE TABLE bar (
6+
baz text NOT NULL
7+
);
8+
9+
SELECT bar FROM foo;
10+
11+
DROP TABLE bar;
12+
DROP TABLE IF EXISTS bar;
13+
DROP TABLE IF EXISTS baz;
14+
15+
16+
CREATE TABLE baz (name text);
17+
ALTER TABLE baz ADD COLUMN email text;
18+
ALTER TABLE baz ADD COLUMN bar text;
19+
ALTER TABLE baz DROP COLUMN IF EXISTS foo;
20+
ALTER TABLE baz DROP COLUMN bar;
21+
ALTER TABLE baz DROP COLUMN IF EXISTS bar;

internal/endtoend/testdata/experimental_dolphin/sqlc.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"path": "go",
66
"name": "querytest",
77
"engine": "_dolphin",
8-
"schema": "../experimental.sql",
9-
"queries": "../experimental.sql"
8+
"schema": "query.sql",
9+
"queries": "query.sql"
1010
}
1111
]
1212
}

internal/endtoend/testdata/experimental_elephant/go/models.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
CREATE TABLE foo (
2+
bar text NOT NULL
3+
);
4+
5+
CREATE TABLE bar (
6+
baz text NOT NULL
7+
);
8+
9+
SELECT bar FROM foo;
10+
11+
DROP TABLE bar;
12+
DROP TABLE IF EXISTS bar;
13+
DROP TABLE IF EXISTS baz;
14+
15+
16+
CREATE TABLE baz (name text);
17+
ALTER TABLE baz ADD COLUMN email text;
18+
ALTER TABLE baz ADD COLUMN bar text;
19+
ALTER TABLE baz DROP COLUMN IF EXISTS foo;
20+
ALTER TABLE baz DROP COLUMN bar;
21+
ALTER TABLE baz DROP COLUMN IF EXISTS bar;

internal/endtoend/testdata/experimental_elephant/sqlc.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"path": "go",
66
"name": "querytest",
77
"engine": "_elephant",
8-
"schema": "../experimental.sql",
9-
"queries": "../experimental.sql"
8+
"schema": "query.sql",
9+
"queries": "query.sql"
1010
}
1111
]
1212
}

internal/endtoend/testdata/experimental_lemon/go/models.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)