From f91bff68be87df84870694be65ba27ba1cf0a09f Mon Sep 17 00:00:00 2001 From: Pawel Rog Date: Fri, 18 Oct 2024 15:05:45 +0200 Subject: [PATCH] fix(compiler): fix typename comparison in function overloading --- .../postgresql/pgx/v4/schema.sql | 1 + .../postgresql/pgx/v5/schema.sql | 1 + internal/engine/postgresql/parse.go | 7 ++++++- internal/sql/catalog/types.go | 10 ++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v4/schema.sql b/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v4/schema.sql index 876d0f8e80..bf1239c31c 100644 --- a/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v4/schema.sql +++ b/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v4/schema.sql @@ -1,2 +1,3 @@ CREATE FUNCTION foo(bar TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql; +CREATE FUNCTION foo(bar TEXT[]) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql; CREATE FUNCTION foo(bar INTEGER) RETURNS TEXT AS $$ SELECT 'baz' $$ LANGUAGE sql; diff --git a/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v5/schema.sql b/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v5/schema.sql index 876d0f8e80..bf1239c31c 100644 --- a/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v5/schema.sql +++ b/internal/endtoend/testdata/ddl_create_function_types/postgresql/pgx/v5/schema.sql @@ -1,2 +1,3 @@ CREATE FUNCTION foo(bar TEXT) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql; +CREATE FUNCTION foo(bar TEXT[]) RETURNS bool AS $$ SELECT true $$ LANGUAGE sql; CREATE FUNCTION foo(bar INTEGER) RETURNS TEXT AS $$ SELECT 'baz' $$ LANGUAGE sql; diff --git a/internal/engine/postgresql/parse.go b/internal/engine/postgresql/parse.go index 659f1011db..1bf857b500 100644 --- a/internal/engine/postgresql/parse.go +++ b/internal/engine/postgresql/parse.go @@ -498,6 +498,10 @@ func translate(node *nodes.Node) (ast.Node, error) { for _, item := range n.Parameters { arg := item.Node.(*nodes.Node_FunctionParameter).FunctionParameter rel, err := parseRelationFromNodes(arg.ArgType.Names) + + relType := rel.TypeName() + relType.ArrayBounds = convertSlice(arg.ArgType.ArrayBounds) + if err != nil { return nil, err } @@ -505,9 +509,10 @@ func translate(node *nodes.Node) (ast.Node, error) { if err != nil { return nil, err } + fp := &ast.FuncParam{ Name: &arg.Name, - Type: rel.TypeName(), + Type: relType, Mode: mode, } if arg.Defexpr != nil { diff --git a/internal/sql/catalog/types.go b/internal/sql/catalog/types.go index 464472bcf2..17aed6f215 100644 --- a/internal/sql/catalog/types.go +++ b/internal/sql/catalog/types.go @@ -39,6 +39,13 @@ func (ct *CompositeType) SetComment(c string) { ct.Comment = c } +func arrayDims(n *ast.TypeName) int { + if n == nil || n.ArrayBounds == nil { + return 0 + } + return len(n.ArrayBounds.Items) +} + func sameType(a, b *ast.TypeName) bool { if a.Catalog != b.Catalog { return false @@ -59,6 +66,9 @@ func sameType(a, b *ast.TypeName) bool { if a.Name != b.Name { return false } + if arrayDims(a) != arrayDims(b) { + return false + } return true }