Skip to content

Commit d94d3b4

Browse files
Convert RENAME COLUMN to pgroll operation (#511)
Convert SQL statements of the form: ```sql ALTER TABLE foo RENAME COLUMN a TO b ALTER TABLE foo RENAME a TO b ``` to the equivalent `OpAlterColumn` operation: ```json [ { "alter_column": { "table": "foo", "column": "a", "name": "b" } } ] ``` Part of #504
1 parent 0d3e17d commit d94d3b4

File tree

4 files changed

+75
-0
lines changed

4 files changed

+75
-0
lines changed

pkg/sql2pgroll/convert.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ func convert(sql string) (migrations.Operations, error) {
4242
return convertCreateStmt(node.CreateStmt)
4343
case *pgq.Node_AlterTableStmt:
4444
return convertAlterTableStmt(node.AlterTableStmt)
45+
case *pgq.Node_RenameStmt:
46+
return convertRenameStmt(node.RenameStmt)
4547
default:
4648
return makeRawSQLOperation(sql), nil
4749
}

pkg/sql2pgroll/expect/alter_table.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ var AlterTableOp5 = &migrations.OpCreateConstraint{
5555
},
5656
}
5757

58+
var AlterTableOp6 = &migrations.OpAlterColumn{
59+
Table: "foo",
60+
Column: "a",
61+
Name: ptr("b"),
62+
}
63+
5864
func ptr[T any](v T) *T {
5965
return &v
6066
}

pkg/sql2pgroll/rename.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
package sql2pgroll
4+
5+
import (
6+
pgq "github.com/pganalyze/pg_query_go/v6"
7+
"github.com/xataio/pgroll/pkg/migrations"
8+
)
9+
10+
func convertRenameStmt(stmt *pgq.RenameStmt) (migrations.Operations, error) {
11+
if stmt.GetRelationType() != pgq.ObjectType_OBJECT_TABLE {
12+
return nil, nil
13+
}
14+
if stmt.GetRenameType() != pgq.ObjectType_OBJECT_COLUMN {
15+
return nil, nil
16+
}
17+
18+
return migrations.Operations{
19+
&migrations.OpAlterColumn{
20+
Table: stmt.GetRelation().GetRelname(),
21+
Column: stmt.GetSubname(),
22+
Name: ptr(stmt.GetNewname()),
23+
},
24+
}, nil
25+
}

pkg/sql2pgroll/rename_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
package sql2pgroll_test
4+
5+
import (
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
"github.com/xataio/pgroll/pkg/migrations"
11+
"github.com/xataio/pgroll/pkg/sql2pgroll"
12+
"github.com/xataio/pgroll/pkg/sql2pgroll/expect"
13+
)
14+
15+
func TestConvertRenameColumnStatements(t *testing.T) {
16+
t.Parallel()
17+
18+
tests := []struct {
19+
sql string
20+
expectedOp migrations.Operation
21+
}{
22+
{
23+
sql: "ALTER TABLE foo RENAME COLUMN a TO b",
24+
expectedOp: expect.AlterTableOp6,
25+
},
26+
{
27+
sql: "ALTER TABLE foo RENAME a TO b",
28+
expectedOp: expect.AlterTableOp6,
29+
},
30+
}
31+
32+
for _, tc := range tests {
33+
t.Run(tc.sql, func(t *testing.T) {
34+
ops, err := sql2pgroll.Convert(tc.sql)
35+
require.NoError(t, err)
36+
37+
require.Len(t, ops, 1)
38+
39+
assert.Equal(t, tc.expectedOp, ops[0])
40+
})
41+
}
42+
}

0 commit comments

Comments
 (0)