From b423eefdecc45eea59ffd2067213063dfafbcae4 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 18 Dec 2024 09:39:23 +0000 Subject: [PATCH 1/3] Fall back to raw SQL for `STORAGE` options Column storage options are not representable by `pgroll` `Column` definitions. --- pkg/sql2pgroll/create_table.go | 18 ++++++++++++++++++ pkg/sql2pgroll/create_table_test.go | 3 +++ 2 files changed, 21 insertions(+) diff --git a/pkg/sql2pgroll/create_table.go b/pkg/sql2pgroll/create_table.go index 5f055fef..ffd24513 100644 --- a/pkg/sql2pgroll/create_table.go +++ b/pkg/sql2pgroll/create_table.go @@ -29,6 +29,9 @@ func convertCreateStmt(stmt *pgq.CreateStmt) (migrations.Operations, error) { if err != nil { return nil, fmt.Errorf("error converting column definition: %w", err) } + if column == nil { + return nil, nil + } columns = append(columns, *column) default: return nil, nil @@ -80,6 +83,10 @@ func canConvertCreateStatement(stmt *pgq.CreateStmt) bool { } func convertColumnDef(col *pgq.ColumnDef) (*migrations.Column, error) { + if !canConvertColumnDef(col) { + return nil, nil + } + // Convert the column type typeString, err := pgq.DeparseTypeName(col.TypeName) if err != nil { @@ -111,3 +118,14 @@ func convertColumnDef(col *pgq.ColumnDef) (*migrations.Column, error) { Pk: pk, }, nil } + +// canConvertColumnDef returns true iff `col` can be converted to a pgroll +// `Column` definition. +func canConvertColumnDef(col *pgq.ColumnDef) bool { + // Column storage options are not supported + if col.GetStorageName() != "" { + return false + } + + return true +} diff --git a/pkg/sql2pgroll/create_table_test.go b/pkg/sql2pgroll/create_table_test.go index f705a7d2..21225032 100644 --- a/pkg/sql2pgroll/create_table_test.go +++ b/pkg/sql2pgroll/create_table_test.go @@ -112,6 +112,9 @@ func TestUnconvertableCreateTableStatements(t *testing.T) { // The LIKE clause is not supported "CREATE TABLE foo(a int, LIKE bar)", "CREATE TABLE foo(LIKE bar)", + + // column `STORAGE` options are not supported + "CREATE TABLE foo(a int STORAGE PLAIN)", } for _, sql := range tests { From a80d716472fe3d4c7abeed517c3fed62b159c9c6 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 18 Dec 2024 09:45:58 +0000 Subject: [PATCH 2/3] Fall back to raw SQL for `COMPRESSION` options Column compression options are not representable by `pgroll` `Column` definitions. --- pkg/sql2pgroll/create_table.go | 10 +++++++--- pkg/sql2pgroll/create_table_test.go | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pkg/sql2pgroll/create_table.go b/pkg/sql2pgroll/create_table.go index ffd24513..53cdbe16 100644 --- a/pkg/sql2pgroll/create_table.go +++ b/pkg/sql2pgroll/create_table.go @@ -122,10 +122,14 @@ func convertColumnDef(col *pgq.ColumnDef) (*migrations.Column, error) { // canConvertColumnDef returns true iff `col` can be converted to a pgroll // `Column` definition. func canConvertColumnDef(col *pgq.ColumnDef) bool { + switch { // Column storage options are not supported - if col.GetStorageName() != "" { + case col.GetStorageName() != "": + return false + // Column compression options are not supported + case col.GetCompression() != "": return false + default: + return true } - - return true } diff --git a/pkg/sql2pgroll/create_table_test.go b/pkg/sql2pgroll/create_table_test.go index 21225032..d98209f1 100644 --- a/pkg/sql2pgroll/create_table_test.go +++ b/pkg/sql2pgroll/create_table_test.go @@ -113,8 +113,11 @@ func TestUnconvertableCreateTableStatements(t *testing.T) { "CREATE TABLE foo(a int, LIKE bar)", "CREATE TABLE foo(LIKE bar)", - // column `STORAGE` options are not supported + // Column `STORAGE` options are not supported "CREATE TABLE foo(a int STORAGE PLAIN)", + + // Column compression options are not supported + "CREATE TABLE foo(a text COMPRESSION pglz)", } for _, sql := range tests { From 3d33a39d544272885d2db06190a97464af4d9417 Mon Sep 17 00:00:00 2001 From: Andrew Farries Date: Wed, 18 Dec 2024 09:49:37 +0000 Subject: [PATCH 3/3] Fall back to raw SQL for `COLLATE` options Column collation options are not representable by `pgroll` `Column` definitions. --- pkg/sql2pgroll/create_table.go | 5 ++++- pkg/sql2pgroll/create_table_test.go | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pkg/sql2pgroll/create_table.go b/pkg/sql2pgroll/create_table.go index 53cdbe16..2eac0a88 100644 --- a/pkg/sql2pgroll/create_table.go +++ b/pkg/sql2pgroll/create_table.go @@ -126,9 +126,12 @@ func canConvertColumnDef(col *pgq.ColumnDef) bool { // Column storage options are not supported case col.GetStorageName() != "": return false - // Column compression options are not supported + // Column compression options are not supported case col.GetCompression() != "": return false + // Column collation options are not supported + case col.GetCollClause() != nil: + return false default: return true } diff --git a/pkg/sql2pgroll/create_table_test.go b/pkg/sql2pgroll/create_table_test.go index d98209f1..325a786a 100644 --- a/pkg/sql2pgroll/create_table_test.go +++ b/pkg/sql2pgroll/create_table_test.go @@ -118,6 +118,9 @@ func TestUnconvertableCreateTableStatements(t *testing.T) { // Column compression options are not supported "CREATE TABLE foo(a text COMPRESSION pglz)", + + // Column collation is not supported + "CREATE TABLE foo(a text COLLATE en_US)", } for _, sql := range tests {