diff --git a/ir/normalize.go b/ir/normalize.go index 98ab062e..a6473a7f 100644 --- a/ir/normalize.go +++ b/ir/normalize.go @@ -780,6 +780,12 @@ func normalizePostgreSQLType(input string) string { return after } + // Handle custom array types (internal PostgreSQL array notation) + // e.g., _my_enum_type -> my_enum_type[] + if strings.HasPrefix(typeName, "_") { + return typeName[1:] + "[]" + } + // Return as-is if no mapping found return typeName } diff --git a/testdata/diff/create_table/enum_array_column/diff.sql b/testdata/diff/create_table/enum_array_column/diff.sql new file mode 100644 index 00000000..f088d604 --- /dev/null +++ b/testdata/diff/create_table/enum_array_column/diff.sql @@ -0,0 +1 @@ +ALTER TABLE items ADD COLUMN statuses status[]; diff --git a/testdata/diff/create_table/enum_array_column/new.sql b/testdata/diff/create_table/enum_array_column/new.sql new file mode 100644 index 00000000..3a9d488f --- /dev/null +++ b/testdata/diff/create_table/enum_array_column/new.sql @@ -0,0 +1,12 @@ +CREATE TYPE status AS ENUM ( + 'pending', + 'active', + 'inactive', + 'archived' +); + +CREATE TABLE items ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + name varchar(255) NOT NULL, + statuses status[] +); diff --git a/testdata/diff/create_table/enum_array_column/old.sql b/testdata/diff/create_table/enum_array_column/old.sql new file mode 100644 index 00000000..f787bd60 --- /dev/null +++ b/testdata/diff/create_table/enum_array_column/old.sql @@ -0,0 +1,11 @@ +CREATE TYPE status AS ENUM ( + 'pending', + 'active', + 'inactive', + 'archived' +); + +CREATE TABLE items ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + name varchar(255) NOT NULL +); diff --git a/testdata/diff/create_table/enum_array_column/plan.json b/testdata/diff/create_table/enum_array_column/plan.json new file mode 100644 index 00000000..6e2cee3c --- /dev/null +++ b/testdata/diff/create_table/enum_array_column/plan.json @@ -0,0 +1,20 @@ +{ + "version": "1.0.0", + "pgschema_version": "1.4.0", + "created_at": "1970-01-01T00:00:00Z", + "source_fingerprint": { + "hash": "68e81c1d995e4acafbcc1d7cb0f4d8e866e177daf6d08e6f00c69e1338c6a14c" + }, + "groups": [ + { + "steps": [ + { + "sql": "ALTER TABLE items ADD COLUMN statuses status[];", + "type": "table.column", + "operation": "create", + "path": "public.items.statuses" + } + ] + } + ] +} diff --git a/testdata/diff/create_table/enum_array_column/plan.sql b/testdata/diff/create_table/enum_array_column/plan.sql new file mode 100644 index 00000000..f088d604 --- /dev/null +++ b/testdata/diff/create_table/enum_array_column/plan.sql @@ -0,0 +1 @@ +ALTER TABLE items ADD COLUMN statuses status[]; diff --git a/testdata/diff/create_table/enum_array_column/plan.txt b/testdata/diff/create_table/enum_array_column/plan.txt new file mode 100644 index 00000000..ab655a9f --- /dev/null +++ b/testdata/diff/create_table/enum_array_column/plan.txt @@ -0,0 +1,13 @@ +Plan: 1 to modify. + +Summary by type: + tables: 1 to modify + +Tables: + ~ items + + statuses (column) + +DDL to be executed: +-------------------------------------------------- + +ALTER TABLE items ADD COLUMN statuses status[];