Skip to content

Commit ba125cc

Browse files
authored
sql/catalog: Add support for variadic functions (#798)
* sql/catalog: Add support for variadic functions
1 parent 1165df0 commit ba125cc

File tree

8 files changed

+154
-9
lines changed

8 files changed

+154
-9
lines changed

internal/endtoend/testdata/json_build/go/db.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/json_build/go/models.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/json_build/go/query.sql.go

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- name: SelectJSONBuildObject :one
2+
SELECT
3+
json_build_object('foo'),
4+
json_build_object('foo', 1),
5+
json_build_object('foo', 1, 2),
6+
json_build_object('foo', 1, 2, 'bar');
7+
8+
-- name: SelectJSONBuildArray :one
9+
SELECT
10+
json_build_array(1),
11+
json_build_array(1, 2),
12+
json_build_array(1, 2, 'foo'),
13+
json_build_array(1, 2, 'foo', 4);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"engine": "postgresql",
7+
"name": "querytest",
8+
"schema": "query.sql",
9+
"queries": "query.sql"
10+
}
11+
]
12+
}

internal/engine/postgresql/pg_catalog.go

Lines changed: 14 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/sql/catalog/catalog.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ type Argument struct {
251251
Name string
252252
Type *ast.TypeName
253253
HasDefault bool
254+
Variadic bool
254255
Mode ast.FuncParamMode
255256
}
256257

internal/sql/catalog/public.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,32 @@ func (c *Catalog) ResolveFuncCall(call *ast.FuncCall) (*Function, error) {
6666
for _, fun := range funs {
6767
args := fun.InArgs()
6868
var defaults int
69+
var variadic bool
6970
known := map[string]struct{}{}
7071
for _, arg := range args {
7172
if arg.HasDefault {
7273
defaults += 1
7374
}
75+
if arg.Variadic {
76+
variadic = true
77+
}
7478
if arg.Name != "" {
7579
known[arg.Name] = struct{}{}
7680
}
7781
}
78-
if (len(named) + len(positional)) > len(args) {
79-
continue
80-
}
81-
if (len(named) + len(positional)) < (len(args) - defaults) {
82-
continue
82+
83+
if variadic {
84+
// For now, assume variadic fucntions can't also have defaults
85+
if (len(named) + len(positional)) < len(args) {
86+
continue
87+
}
88+
} else {
89+
if (len(named) + len(positional)) > len(args) {
90+
continue
91+
}
92+
if (len(named) + len(positional)) < (len(args) - defaults) {
93+
continue
94+
}
8395
}
8496

8597
// Validate that the provided named arguments exist in the function

0 commit comments

Comments
 (0)