From 15763f60cce326c7e42e3dd685c20a8dc46f4577 Mon Sep 17 00:00:00 2001 From: Hein Date: Thu, 30 Apr 2026 20:35:06 +0200 Subject: [PATCH] Fix GIN opclass handling for array columns --- pkg/writers/pgsql/writer.go | 3 +++ pkg/writers/pgsql/writer_test.go | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/pkg/writers/pgsql/writer.go b/pkg/writers/pgsql/writer.go index 9a1b241..613fa36 100644 --- a/pkg/writers/pgsql/writer.go +++ b/pkg/writers/pgsql/writer.go @@ -1251,6 +1251,9 @@ func isIntegerType(colType string) bool { func isTextType(colType string) bool { textTypes := []string{"text", "varchar", "character varying", "char", "character", "string"} lowerType := strings.ToLower(colType) + if strings.HasSuffix(lowerType, "[]") { + return false + } for _, t := range textTypes { if strings.HasPrefix(lowerType, t) { return true diff --git a/pkg/writers/pgsql/writer_test.go b/pkg/writers/pgsql/writer_test.go index 776f6f1..356a6d2 100644 --- a/pkg/writers/pgsql/writer_test.go +++ b/pkg/writers/pgsql/writer_test.go @@ -87,6 +87,43 @@ func TestWriteDatabase(t *testing.T) { } } +func TestWriteDatabase_GinIndexOnTextArrayDoesNotUseTrigramOperatorClass(t *testing.T) { + db := models.InitDatabase("testdb") + schema := models.InitSchema("public") + + table := models.InitTable("plans", "public") + + tagsCol := models.InitColumn("tags", "plans", "public") + tagsCol.Type = "text[]" + table.Columns["tags"] = tagsCol + + index := &models.Index{ + Name: "idx_plans_tags", + Type: "gin", + Columns: []string{"tags"}, + } + table.Indexes[index.Name] = index + + schema.Tables = append(schema.Tables, table) + db.Schemas = append(db.Schemas, schema) + + var buf bytes.Buffer + writer := NewWriter(&writers.WriterOptions{}) + writer.writer = &buf + + if err := writer.WriteDatabase(db); err != nil { + t.Fatalf("WriteDatabase failed: %v", err) + } + + output := buf.String() + if !strings.Contains(output, `USING gin (tags)`) { + t.Fatalf("expected GIN index on array column without explicit trigram opclass, got:\n%s", output) + } + if strings.Contains(output, "gin_trgm_ops") { + t.Fatalf("did not expect gin_trgm_ops for text[] column, got:\n%s", output) + } +} + func TestWriteForeignKeys(t *testing.T) { // Create a test database with two related tables db := models.InitDatabase("testdb")