Skip to content

Commit

Permalink
Convert DROP COLUMN SQL to pgroll operation (#521)
Browse files Browse the repository at this point in the history
Part of #504
  • Loading branch information
ryanslade authored Dec 11, 2024
1 parent 957498d commit d1db25d
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 1 deletion.
31 changes: 31 additions & 0 deletions pkg/sql2pgroll/alter_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"

pgq "github.com/pganalyze/pg_query_go/v6"

"github.com/xataio/pgroll/pkg/migrations"
)

Expand Down Expand Up @@ -35,6 +36,8 @@ func convertAlterTableStmt(stmt *pgq.AlterTableStmt) (migrations.Operations, err
op, err = convertAlterTableAlterColumnType(stmt, alterTableCmd)
case pgq.AlterTableType_AT_AddConstraint:
op, err = convertAlterTableAddConstraint(stmt, alterTableCmd)
case pgq.AlterTableType_AT_DropColumn:
op, err = convertAlterTableDropColumn(stmt, alterTableCmd)
}

if err != nil {
Expand Down Expand Up @@ -155,6 +158,34 @@ func convertAlterTableAddUniqueConstraint(stmt *pgq.AlterTableStmt, constraint *
}, nil
}

// convertAlterTableDropColumn converts SQL statements like:
//
// `ALTER TABLE foo DROP COLUMN bar
//
// to an OpDropColumn operation.
func convertAlterTableDropColumn(stmt *pgq.AlterTableStmt, cmd *pgq.AlterTableCmd) (migrations.Operation, error) {
if !canConvertDropColumn(cmd) {
return nil, nil
}

return &migrations.OpDropColumn{
Table: stmt.GetRelation().GetRelname(),
Column: cmd.GetName(),
Down: PlaceHolderSQL,
}, nil
}

// canConvertDropColumn checks whether we can convert the command without losing any information.
func canConvertDropColumn(cmd *pgq.AlterTableCmd) bool {
if cmd.MissingOk {
return false
}
if cmd.Behavior == pgq.DropBehavior_DROP_CASCADE {
return false
}
return true
}

// canConvertUniqueConstraint checks if the unique constraint `constraint` can
// be faithfully converted to an OpCreateConstraint operation without losing
// information.
Expand Down
15 changes: 14 additions & 1 deletion pkg/sql2pgroll/alter_table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/xataio/pgroll/pkg/migrations"
"github.com/xataio/pgroll/pkg/sql2pgroll"
"github.com/xataio/pgroll/pkg/sql2pgroll/expect"
Expand Down Expand Up @@ -43,6 +44,14 @@ func TestConvertAlterTableStatements(t *testing.T) {
sql: "ALTER TABLE foo ADD CONSTRAINT bar UNIQUE (a, b)",
expectedOp: expect.CreateConstraintOp2,
},
{
sql: "ALTER TABLE foo DROP COLUMN bar",
expectedOp: expect.DropColumnOp1,
},
{
sql: "ALTER TABLE foo DROP COLUMN bar RESTRICT ",
expectedOp: expect.DropColumnOp1,
},
}

for _, tc := range tests {
Expand All @@ -57,7 +66,7 @@ func TestConvertAlterTableStatements(t *testing.T) {
}
}

func TestUnconvertableAlterTableAddConstraintStatements(t *testing.T) {
func TestUnconvertableAlterTableStatements(t *testing.T) {
t.Parallel()

tests := []string{
Expand All @@ -72,6 +81,10 @@ func TestUnconvertableAlterTableAddConstraintStatements(t *testing.T) {
// operations when changing data type.
`ALTER TABLE foo ALTER COLUMN a SET DATA TYPE text COLLATE "en_US"`,
"ALTER TABLE foo ALTER COLUMN a SET DATA TYPE text USING 'foo'",

// CASCADE and IF EXISTS clauses are not represented by OpDropColumn
"ALTER TABLE foo DROP COLUMN bar CASCADE",
"ALTER TABLE foo DROP COLUMN IF EXISTS bar",
}

for _, sql := range tests {
Expand Down
1 change: 1 addition & 0 deletions pkg/sql2pgroll/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"

pgq "github.com/pganalyze/pg_query_go/v6"

"github.com/xataio/pgroll/pkg/migrations"
)

Expand Down
1 change: 1 addition & 0 deletions pkg/sql2pgroll/create_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package sql2pgroll

import (
pgq "github.com/pganalyze/pg_query_go/v6"

"github.com/xataio/pgroll/pkg/migrations"
)

Expand Down
1 change: 1 addition & 0 deletions pkg/sql2pgroll/create_table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/xataio/pgroll/pkg/migrations"
"github.com/xataio/pgroll/pkg/sql2pgroll"
"github.com/xataio/pgroll/pkg/sql2pgroll/expect"
Expand Down
14 changes: 14 additions & 0 deletions pkg/sql2pgroll/expect/drop_column.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// SPDX-License-Identifier: Apache-2.0

package expect

import (
"github.com/xataio/pgroll/pkg/migrations"
"github.com/xataio/pgroll/pkg/sql2pgroll"
)

var DropColumnOp1 = &migrations.OpDropColumn{
Table: "foo",
Column: "bar",
Down: sql2pgroll.PlaceHolderSQL,
}
1 change: 1 addition & 0 deletions pkg/sql2pgroll/rename.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package sql2pgroll

import (
pgq "github.com/pganalyze/pg_query_go/v6"

"github.com/xataio/pgroll/pkg/migrations"
)

Expand Down
1 change: 1 addition & 0 deletions pkg/sql2pgroll/rename_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/xataio/pgroll/pkg/migrations"
"github.com/xataio/pgroll/pkg/sql2pgroll"
"github.com/xataio/pgroll/pkg/sql2pgroll/expect"
Expand Down

0 comments on commit d1db25d

Please sign in to comment.