From ed7130bba8a24c914534769e5b15d8b29ccaa679 Mon Sep 17 00:00:00 2001 From: Hein Date: Sun, 26 Apr 2026 17:35:15 +0200 Subject: [PATCH] refactor(pkg): canonicalize base types and adjust length handling * Update base types to keep explicit modifier forms * Modify length handling for vector types in tests --- pkg/pgsql/types_registry.go | 12 ++++++++---- pkg/pgsql/types_registry_test.go | 2 +- pkg/readers/bun/reader.go | 1 + pkg/readers/bun/reader_test.go | 6 +++--- pkg/readers/drawdb/reader_test.go | 2 +- pkg/readers/gorm/reader.go | 1 + pkg/readers/gorm/reader_test.go | 6 +++--- 7 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pkg/pgsql/types_registry.go b/pkg/pgsql/types_registry.go index 8b7f0f8..d0d507d 100644 --- a/pkg/pgsql/types_registry.go +++ b/pkg/pgsql/types_registry.go @@ -1,6 +1,9 @@ package pgsql -import "strings" +import ( + "sort" + "strings" +) // TypeSpec describes PostgreSQL type capabilities used by parsers/writers. type TypeSpec struct { @@ -106,9 +109,9 @@ var postgresBaseTypes = map[string]TypeSpec{ "ltree": {}, "lquery": {}, "ltxtquery": {}, - "vector": {SupportsLength: true}, // pgvector: vector(dim) - "halfvec": {SupportsLength: true}, // pgvector: halfvec(dim) - "sparsevec": {SupportsLength: true}, // pgvector: sparsevec(dim) + "vector": {}, // pgvector: keep explicit modifier form (vector(dim)) + "halfvec": {}, // pgvector: keep explicit modifier form (halfvec(dim)) + "sparsevec": {}, // pgvector: keep explicit modifier form (sparsevec(dim)) } var postgresTypeAliases = map[string]string{ @@ -148,6 +151,7 @@ func GetPostgresBaseTypes() []string { for t := range postgresBaseTypes { result = append(result, t) } + sort.Strings(result) return result } diff --git a/pkg/pgsql/types_registry_test.go b/pkg/pgsql/types_registry_test.go index 5ea920b..3a6c104 100644 --- a/pkg/pgsql/types_registry_test.go +++ b/pkg/pgsql/types_registry_test.go @@ -53,7 +53,7 @@ func TestPostgresTypeRegistry_TypeParsingAndCapabilities(t *testing.T) { wantBase: "vector", wantCanonicalBase: "vector", wantKnown: true, - wantLength: true, + wantLength: false, }, { input: "numeric(10,2)", diff --git a/pkg/readers/bun/reader.go b/pkg/readers/bun/reader.go index 3dfebaf..efcb263 100644 --- a/pkg/readers/bun/reader.go +++ b/pkg/readers/bun/reader.go @@ -711,6 +711,7 @@ func (r *Reader) parseTypeWithLength(typeStr string) (baseType string, length in rawBaseType := strings.TrimSpace(matches[1]) if pgsql.SupportsLength(rawBaseType) { if _, err := fmt.Sscanf(matches[2], "%d", &length); err == nil { + baseType = pgsql.CanonicalizeBaseType(rawBaseType) return } } diff --git a/pkg/readers/bun/reader_test.go b/pkg/readers/bun/reader_test.go index a5f2c33..62cf501 100644 --- a/pkg/readers/bun/reader_test.go +++ b/pkg/readers/bun/reader_test.go @@ -367,9 +367,9 @@ func TestParseTypeWithLength_PreservesExplicitTypeModifiers(t *testing.T) { wantType string wantLength int }{ - {"varchar(255)", "varchar(255)", 255}, - {"character varying(120)", "character varying(120)", 120}, - {"vector(1536)", "vector(1536)", 1536}, + {"varchar(255)", "varchar", 255}, + {"character varying(120)", "character varying", 120}, + {"vector(1536)", "vector(1536)", 0}, {"numeric(10,2)", "numeric(10,2)", 0}, } diff --git a/pkg/readers/drawdb/reader_test.go b/pkg/readers/drawdb/reader_test.go index 3ac2911..d5a736a 100644 --- a/pkg/readers/drawdb/reader_test.go +++ b/pkg/readers/drawdb/reader_test.go @@ -317,7 +317,7 @@ func TestConvertToColumn_PreservesExplicitTypeModifiers(t *testing.T) { name: "custom vector modifier", fieldType: "vector(1536)", wantType: "vector(1536)", - wantLength: 1536, + wantLength: 0, }, } diff --git a/pkg/readers/gorm/reader.go b/pkg/readers/gorm/reader.go index b2bc698..0550153 100644 --- a/pkg/readers/gorm/reader.go +++ b/pkg/readers/gorm/reader.go @@ -804,6 +804,7 @@ func (r *Reader) parseTypeWithLength(typeStr string) (baseType string, length in // This avoids converting custom modifiers like vector(1536) into Length. if pgsql.SupportsLength(rawBaseType) && !strings.Contains(parens, ",") { if _, err := fmt.Sscanf(parens, "%d", &length); err == nil { + baseType = pgsql.CanonicalizeBaseType(rawBaseType) return } } diff --git a/pkg/readers/gorm/reader_test.go b/pkg/readers/gorm/reader_test.go index b3bd9bc..9a5de45 100644 --- a/pkg/readers/gorm/reader_test.go +++ b/pkg/readers/gorm/reader_test.go @@ -374,9 +374,9 @@ func TestParseTypeWithLength_PreservesExplicitTypeModifiers(t *testing.T) { wantType string wantLength int }{ - {"varchar(255)", "varchar(255)", 255}, - {"character varying(120)", "character varying(120)", 120}, - {"vector(1536)", "vector(1536)", 1536}, + {"varchar(255)", "varchar", 255}, + {"character varying(120)", "character varying", 120}, + {"vector(1536)", "vector(1536)", 0}, {"numeric(10,2)", "numeric(10,2)", 0}, }