Skip to content

Commit

Permalink
Use pg_query_go to deparse TypeName AST nodes (#542)
Browse files Browse the repository at this point in the history
Replace our manual AST traversal to deparse `TypeName` nodes with
the`TypeName` deparsing functionality from `pg_query_go` as exposed in
xataio/pg_query_go#5.

This affects deparsing of column types in `CREATE TABLE` and `ALTER
TABLE ... ALTER COLUMN ... SET DATA TYPE` statements and allows us to
remove our manual deparsing code.
  • Loading branch information
andrew-farries authored Dec 17, 2024
1 parent 91f65ea commit 92244d9
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 66 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ require (
github.com/stretchr/testify v1.10.0
github.com/testcontainers/testcontainers-go v0.34.0
github.com/testcontainers/testcontainers-go/modules/postgres v0.34.0
github.com/xataio/pg_query_go/v6 v6.0.0-20241216080535-894186571799
github.com/xataio/pg_query_go/v6 v6.0.0-20241217092625-e7ba1fbaf89e
golang.org/x/tools v0.28.0
)

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,8 @@ github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZ
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
github.com/xataio/pg_query_go/v6 v6.0.0-20241216080535-894186571799 h1:FUY7PHaOXMicK0kSh32BdLGwd6svrbNZrnup69jG0DM=
github.com/xataio/pg_query_go/v6 v6.0.0-20241216080535-894186571799/go.mod h1:GK6bpfAhPtZb7wG/IccqvnH+cz3cmvvRTkC+MosESGo=
github.com/xataio/pg_query_go/v6 v6.0.0-20241217092625-e7ba1fbaf89e h1:9DShoOhR7/IsNPwTAMkTMbsEZRVcuJCb20RIVGQTIdU=
github.com/xataio/pg_query_go/v6 v6.0.0-20241217092625-e7ba1fbaf89e/go.mod h1:GK6bpfAhPtZb7wG/IccqvnH+cz3cmvvRTkC+MosESGo=
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
Expand Down
7 changes: 6 additions & 1 deletion pkg/sql2pgroll/alter_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,19 @@ func convertAlterTableAlterColumnType(stmt *pgq.AlterTableStmt, cmd *pgq.AlterTa
return nil, fmt.Errorf("expected column definition, got %T", cmd.GetDef().Node)
}

typeName, err := pgq.DeparseTypeName(node.ColumnDef.GetTypeName())
if err != nil {
return nil, fmt.Errorf("failed to deparse type name: %w", err)
}

if !canConvertColumnForSetDataType(node.ColumnDef) {
return nil, nil
}

return &migrations.OpAlterColumn{
Table: stmt.GetRelation().GetRelname(),
Column: cmd.GetName(),
Type: ptr(convertTypeName(node.ColumnDef.GetTypeName())),
Type: ptr(typeName),
Up: PlaceHolderSQL,
Down: PlaceHolderSQL,
}, nil
Expand Down
19 changes: 14 additions & 5 deletions pkg/sql2pgroll/create_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
package sql2pgroll

import (
"fmt"

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

"github.com/xataio/pgroll/pkg/migrations"
Expand All @@ -12,7 +14,11 @@ import (
func convertCreateStmt(stmt *pgq.CreateStmt) (migrations.Operations, error) {
columns := make([]migrations.Column, 0, len(stmt.TableElts))
for _, elt := range stmt.TableElts {
columns = append(columns, convertColumnDef(elt.GetColumnDef()))
column, err := convertColumnDef(elt.GetColumnDef())
if err != nil {
return nil, fmt.Errorf("error converting column definition: %w", err)
}
columns = append(columns, *column)
}

return migrations.Operations{
Expand All @@ -23,9 +29,12 @@ func convertCreateStmt(stmt *pgq.CreateStmt) (migrations.Operations, error) {
}, nil
}

func convertColumnDef(col *pgq.ColumnDef) migrations.Column {
func convertColumnDef(col *pgq.ColumnDef) (*migrations.Column, error) {
// Convert the column type
typeString := convertTypeName(col.TypeName)
typeString, err := pgq.DeparseTypeName(col.TypeName)
if err != nil {
return nil, fmt.Errorf("error deparsing column type: %w", err)
}

// Determine column nullability, uniqueness, and primary key status
var notNull, unique, pk bool
Expand All @@ -43,12 +52,12 @@ func convertColumnDef(col *pgq.ColumnDef) migrations.Column {
}
}

return migrations.Column{
return &migrations.Column{
Name: col.Colname,
Type: typeString,
Nullable: !notNull,
Unique: unique,
Default: defaultValue,
Pk: pk,
}
}, nil
}
10 changes: 5 additions & 5 deletions pkg/sql2pgroll/expect/create_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ var CreateTableOp1 = &migrations.OpCreateTable{
Columns: []migrations.Column{
{
Name: "a",
Type: "int4",
Type: "int",
Nullable: true,
},
},
Expand All @@ -20,7 +20,7 @@ var CreateTableOp2 = &migrations.OpCreateTable{
Columns: []migrations.Column{
{
Name: "a",
Type: "int4",
Type: "int",
},
},
}
Expand All @@ -41,7 +41,7 @@ var CreateTableOp4 = &migrations.OpCreateTable{
Columns: []migrations.Column{
{
Name: "a",
Type: "numeric(10,2)",
Type: "numeric(10, 2)",
Nullable: true,
},
},
Expand All @@ -52,7 +52,7 @@ var CreateTableOp5 = &migrations.OpCreateTable{
Columns: []migrations.Column{
{
Name: "a",
Type: "int4",
Type: "int",
Nullable: true,
Unique: true,
},
Expand All @@ -64,7 +64,7 @@ var CreateTableOp6 = &migrations.OpCreateTable{
Columns: []migrations.Column{
{
Name: "a",
Type: "int4",
Type: "int",
Pk: true,
},
},
Expand Down
52 changes: 0 additions & 52 deletions pkg/sql2pgroll/typename.go

This file was deleted.

0 comments on commit 92244d9

Please sign in to comment.