Skip to content

Commit 397cfc3

Browse files
Prevent panics when building argument lists for variadic functions (#2093)
1 parent 81b15a3 commit 397cfc3

File tree

7 files changed

+118
-3
lines changed

7 files changed

+118
-3
lines changed

internal/compiler/resolve.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,12 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
334334

335335
var paramName string
336336
var paramType *ast.TypeName
337+
337338
if argName == "" {
338-
paramName = fun.Args[i].Name
339-
paramType = fun.Args[i].Type
339+
if i < len(fun.Args) {
340+
paramName = fun.Args[i].Name
341+
paramType = fun.Args[i].Type
342+
}
340343
} else {
341344
paramName = argName
342345
for _, arg := range fun.Args {
@@ -351,6 +354,9 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
351354
if paramName == "" {
352355
paramName = funcName
353356
}
357+
if paramType == nil {
358+
paramType = &ast.TypeName{Name: ""}
359+
}
354360

355361
defaultP := named.NewInferredParam(paramName, true)
356362
p, isNamed := params.FetchMerge(ref.ref.Number, defaultP)

internal/endtoend/testdata/func_variadic/postgresql/stdlib/go/db.go

+31
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/func_variadic/postgresql/stdlib/go/models.go

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/func_variadic/postgresql/stdlib/go/query.sql.go

+39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
CREATE TABLE test (
2+
id integer,
3+
j jsonb NOT NULL
4+
);
5+
6+
-- name: UpdateJ :exec
7+
UPDATE
8+
test
9+
SET
10+
j = jsonb_build_object($1, $2, $3, $4)
11+
WHERE
12+
id = $5;
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/sql/catalog/func.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
// Function describes a database function
1111
//
12-
// A database function is a method written to performs specific operation on data within the database.
12+
// A database function is a method written to perform a specific operation on data within the database.
1313
type Function struct {
1414
Name string
1515
Args []*Argument

0 commit comments

Comments
 (0)