Skip to content

Commit 9761692

Browse files
authored
internal/dinosql: Support named function arguments (#494)
* internal/dinosql: Support named function arguments * Test user-defined function with named parameters
1 parent 4d66770 commit 9761692

File tree

6 files changed

+142
-10
lines changed

6 files changed

+142
-10
lines changed

internal/dinosql/parser.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,6 @@ func parseQuery(c core.Catalog, stmt nodes.Node, source string, rewriteParameter
421421
return nil, errUnsupportedStatementType
422422
}
423423

424-
// spew.Dump(stmt)
425-
426424
rawSQL, err := pluckQuery(source, raw)
427425
if err != nil {
428426
return nil, err
@@ -1385,30 +1383,43 @@ func resolveCatalogRefs(c core.Catalog, rvs []nodes.RangeVar, args []paramRef, n
13851383
}
13861384
}
13871385
for i, item := range n.Args.Items {
1388-
pr, ok := item.(nodes.ParamRef)
1389-
if !ok {
1390-
continue
1391-
}
1392-
if pr.Number != ref.ref.Number {
1393-
continue
1386+
defaultName := fun.Name
1387+
switch inode := item.(type) {
1388+
case nodes.ParamRef:
1389+
if inode.Number != ref.ref.Number {
1390+
continue
1391+
}
1392+
case nodes.NamedArgExpr:
1393+
pr, ok := inode.Arg.(nodes.ParamRef)
1394+
if !ok {
1395+
continue
1396+
}
1397+
if pr.Number != ref.ref.Number {
1398+
continue
1399+
}
1400+
if inode.Name != nil {
1401+
defaultName = *inode.Name
1402+
}
13941403
}
1404+
13951405
if fun.Arguments == nil {
13961406
a = append(a, Parameter{
13971407
Number: ref.ref.Number,
13981408
Column: core.Column{
1399-
Name: parameterName(ref.ref.Number, fun.Name),
1409+
Name: parameterName(ref.ref.Number, defaultName),
14001410
DataType: "any",
14011411
},
14021412
})
14031413
continue
14041414
}
1415+
14051416
if i >= len(fun.Arguments) {
14061417
return nil, fmt.Errorf("incorrect number of arguments to %s", fun.Name)
14071418
}
14081419
arg := fun.Arguments[i]
14091420
name := arg.Name
14101421
if name == "" {
1411-
name = fun.Name
1422+
name = defaultName
14121423
}
14131424
a = append(a, Parameter{
14141425
Number: ref.ref.Number,

internal/endtoend/testdata/func_args/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/func_args/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/func_args/go/query.sql.go

Lines changed: 57 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
CREATE FUNCTION plus(a integer, b integer) RETURNS integer AS $$
2+
BEGIN
3+
RETURN a + b;
4+
END;
5+
$$ LANGUAGE plpgsql;
6+
7+
-- name: Plus :one
8+
SELECT plus(b => $2, a => $1);
9+
10+
-- name: MakeIntervalSecs :one
11+
SELECT make_interval(secs => $1);
12+
13+
-- name: MakeIntervalDays :one
14+
SELECT make_interval(days => $1::int);
15+
16+
-- name: MakeIntervalMonths :one
17+
SELECT make_interval(months => sqlc.arg('months')::int);
18+
19+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"name": "querytest",
7+
"schema": "query.sql",
8+
"queries": "query.sql"
9+
}
10+
]
11+
}

0 commit comments

Comments
 (0)