Skip to content

Commit 3fb980f

Browse files
authored
sql/ast: Implement ALTER TABLE RENAME column (#399)
1 parent 00bc70f commit 3fb980f

File tree

5 files changed

+59
-15
lines changed

5 files changed

+59
-15
lines changed

internal/postgresql/catalog_test.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -153,26 +153,26 @@ func TestUpdate(t *testing.T) {
153153
},
154154
},
155155
},
156-
/*
157-
{
158-
`
159-
CREATE TABLE foo (bar text);
160-
ALTER TABLE foo RENAME bar TO baz;
161-
`,
162-
pg.Catalog{
163-
Schemas: map[string]pg.Schema{
164-
"public": {
165-
Tables: map[string]pg.Table{
166-
"foo": pg.Table{
167-
Name: "foo",
168-
Columns: []pg.Column{{Name: "baz", DataType: "text", Table: pg.FQN{Schema: "public", Rel: "foo"}}},
169-
},
156+
{
157+
`
158+
CREATE TABLE foo (bar text);
159+
ALTER TABLE foo RENAME bar TO baz;
160+
`,
161+
&catalog.Schema{
162+
Name: "public",
163+
Tables: []*catalog.Table{
164+
{
165+
Rel: &ast.TableName{Name: "foo"},
166+
Columns: []*catalog.Column{
167+
{
168+
Name: "baz",
169+
Type: ast.TypeName{Name: "text"},
170170
},
171171
},
172172
},
173173
},
174174
},
175-
*/
175+
},
176176
{
177177
`
178178
CREATE TABLE foo (bar text);

internal/postgresql/parse.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,17 @@ func translate(node nodes.Node) (ast.Node, error) {
368368
case nodes.RenameStmt:
369369
switch n.RenameType {
370370

371+
case nodes.OBJECT_COLUMN:
372+
tbl, err := parseTableName(*n.Relation)
373+
if err != nil {
374+
return nil, err
375+
}
376+
return &ast.RenameColumnStmt{
377+
Table: tbl,
378+
Col: &ast.ColumnRef{Name: *n.Subname},
379+
NewName: n.Newname,
380+
}, nil
381+
371382
case nodes.OBJECT_TABLE:
372383
tbl, err := parseTableName(*n.Relation)
373384
if err != nil {

internal/sql/ast/ast.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,16 @@ func (n *CommentOnColumnStmt) Pos() int {
210210
return 0
211211
}
212212

213+
type RenameColumnStmt struct {
214+
Table *TableName
215+
Col *ColumnRef
216+
NewName *string
217+
}
218+
219+
func (n *RenameColumnStmt) Pos() int {
220+
return 0
221+
}
222+
213223
type RenameTableStmt struct {
214224
Table *TableName
215225
NewName *string

internal/sql/catalog/catalog.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ func (c *Catalog) Build(stmts []ast.Statement) error {
165165
err = c.dropTable(n)
166166
case *ast.DropTypeStmt:
167167
err = c.dropType(n)
168+
case *ast.RenameColumnStmt:
169+
err = c.renameColumn(n)
168170
case *ast.RenameTableStmt:
169171
err = c.renameTable(n)
170172
}

internal/sql/catalog/table.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,27 @@ func (c *Catalog) dropTable(stmt *ast.DropTableStmt) error {
146146
return nil
147147
}
148148

149+
func (c *Catalog) renameColumn(stmt *ast.RenameColumnStmt) error {
150+
_, tbl, err := c.getTable(stmt.Table)
151+
if err != nil {
152+
return err
153+
}
154+
idx := -1
155+
for i := range tbl.Columns {
156+
if tbl.Columns[i].Name == stmt.Col.Name {
157+
idx = i
158+
}
159+
if tbl.Columns[i].Name == *stmt.NewName {
160+
return sqlerr.ColumnExists(tbl.Rel.Name, *stmt.NewName)
161+
}
162+
}
163+
if idx == -1 {
164+
return sqlerr.ColumnNotFound(tbl.Rel.Name, stmt.Col.Name)
165+
}
166+
tbl.Columns[idx].Name = *stmt.NewName
167+
return nil
168+
}
169+
149170
func (c *Catalog) renameTable(stmt *ast.RenameTableStmt) error {
150171
_, tbl, err := c.getTable(stmt.Table)
151172
if err != nil {

0 commit comments

Comments
 (0)