From a71384d54bb767eb8b9a7ce6e4844b4d00a34a25 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Sun, 22 Nov 2020 09:47:18 -0800 Subject: [PATCH] catalog: Improve variadic argument support --- Makefile | 11 ++++++++++- internal/endtoend/testdata/json_build/go/query.sql.go | 6 ++++++ internal/endtoend/testdata/json_build/query.sql | 2 ++ internal/engine/postgresql/pg_catalog.go | 8 ++++---- internal/sql/catalog/catalog.go | 1 - internal/sql/catalog/public.go | 6 +++--- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 4e4893f381..692b35514d 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build test test-examples regen +.PHONY: build test test-examples regen start psql mysqlsh build: go build ./... @@ -17,3 +17,12 @@ sqlc-dev: sqlc-pg-gen: go build -o ~/bin/sqlc-pg-gen ./internal/tools/sqlc-pg-gen + +start: + docker-compose up -d + +psql: + PGPASSWORD=mysecretpassword psql --host=127.0.0.1 --port=5432 --username=postgres dinotest + +mysqlsh: + mysqlsh --sql --user root --password mysecretpassword --database dinotest 127.0.0.1:3306 diff --git a/internal/endtoend/testdata/json_build/go/query.sql.go b/internal/endtoend/testdata/json_build/go/query.sql.go index 9444d909df..5be6c2aae8 100644 --- a/internal/endtoend/testdata/json_build/go/query.sql.go +++ b/internal/endtoend/testdata/json_build/go/query.sql.go @@ -10,6 +10,7 @@ import ( const selectJSONBuildArray = `-- name: SelectJSONBuildArray :one SELECT + json_build_array(), json_build_array(1), json_build_array(1, 2), json_build_array(1, 2, 'foo'), @@ -21,6 +22,7 @@ type SelectJSONBuildArrayRow struct { JsonBuildArray_2 json.RawMessage JsonBuildArray_3 json.RawMessage JsonBuildArray_4 json.RawMessage + JsonBuildArray_5 json.RawMessage } func (q *Queries) SelectJSONBuildArray(ctx context.Context) (SelectJSONBuildArrayRow, error) { @@ -31,12 +33,14 @@ func (q *Queries) SelectJSONBuildArray(ctx context.Context) (SelectJSONBuildArra &i.JsonBuildArray_2, &i.JsonBuildArray_3, &i.JsonBuildArray_4, + &i.JsonBuildArray_5, ) return i, err } const selectJSONBuildObject = `-- name: SelectJSONBuildObject :one SELECT + json_build_object(), json_build_object('foo'), json_build_object('foo', 1), json_build_object('foo', 1, 2), @@ -48,6 +52,7 @@ type SelectJSONBuildObjectRow struct { JsonBuildObject_2 json.RawMessage JsonBuildObject_3 json.RawMessage JsonBuildObject_4 json.RawMessage + JsonBuildObject_5 json.RawMessage } func (q *Queries) SelectJSONBuildObject(ctx context.Context) (SelectJSONBuildObjectRow, error) { @@ -58,6 +63,7 @@ func (q *Queries) SelectJSONBuildObject(ctx context.Context) (SelectJSONBuildObj &i.JsonBuildObject_2, &i.JsonBuildObject_3, &i.JsonBuildObject_4, + &i.JsonBuildObject_5, ) return i, err } diff --git a/internal/endtoend/testdata/json_build/query.sql b/internal/endtoend/testdata/json_build/query.sql index eafb8477a7..7b8321b25e 100644 --- a/internal/endtoend/testdata/json_build/query.sql +++ b/internal/endtoend/testdata/json_build/query.sql @@ -1,5 +1,6 @@ -- name: SelectJSONBuildObject :one SELECT + json_build_object(), json_build_object('foo'), json_build_object('foo', 1), json_build_object('foo', 1, 2), @@ -7,6 +8,7 @@ SELECT -- name: SelectJSONBuildArray :one SELECT + json_build_array(), json_build_array(1), json_build_array(1, 2), json_build_array(1, 2, 'foo'), diff --git a/internal/engine/postgresql/pg_catalog.go b/internal/engine/postgresql/pg_catalog.go index ba2652ba40..9600917006 100644 --- a/internal/engine/postgresql/pg_catalog.go +++ b/internal/engine/postgresql/pg_catalog.go @@ -11649,8 +11649,8 @@ func genPGCatalog() *catalog.Schema { Name: "json_build_array", Args: []*catalog.Argument{ { - Type: &ast.TypeName{Name: "any"}, - Variadic: true, + Type: &ast.TypeName{Name: "any"}, + Mode: ast.FuncParamVariadic, }, }, ReturnType: &ast.TypeName{Name: "json"}, @@ -11659,8 +11659,8 @@ func genPGCatalog() *catalog.Schema { Name: "json_build_object", Args: []*catalog.Argument{ { - Type: &ast.TypeName{Name: "any"}, - Variadic: true, + Type: &ast.TypeName{Name: "any"}, + Mode: ast.FuncParamVariadic, }, }, ReturnType: &ast.TypeName{Name: "json"}, diff --git a/internal/sql/catalog/catalog.go b/internal/sql/catalog/catalog.go index 403d82302e..38d93b6d60 100644 --- a/internal/sql/catalog/catalog.go +++ b/internal/sql/catalog/catalog.go @@ -251,7 +251,6 @@ type Argument struct { Name string Type *ast.TypeName HasDefault bool - Variadic bool Mode ast.FuncParamMode } diff --git a/internal/sql/catalog/public.go b/internal/sql/catalog/public.go index 864a6d29ea..19ccd84005 100644 --- a/internal/sql/catalog/public.go +++ b/internal/sql/catalog/public.go @@ -72,8 +72,9 @@ func (c *Catalog) ResolveFuncCall(call *ast.FuncCall) (*Function, error) { if arg.HasDefault { defaults += 1 } - if arg.Variadic { + if arg.Mode == ast.FuncParamVariadic { variadic = true + defaults += 1 } if arg.Name != "" { known[arg.Name] = struct{}{} @@ -81,8 +82,7 @@ func (c *Catalog) ResolveFuncCall(call *ast.FuncCall) (*Function, error) { } if variadic { - // For now, assume variadic fucntions can't also have defaults - if (len(named) + len(positional)) < len(args) { + if (len(named) + len(positional)) < (len(args) - defaults) { continue } } else {