Skip to content

Commit 593b79e

Browse files
authored
feat(compiler): Always create parameter (#3112)
* feat(compiler): Don't drop unknown params * Add test data Make sure that params are always added
1 parent 1ad910e commit 593b79e

File tree

13 files changed

+289
-11
lines changed

13 files changed

+289
-11
lines changed

internal/compiler/resolve.go

+25-11
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,20 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
9898
}
9999

100100
var a []Parameter
101+
102+
addUnknownParam := func(ref paramRef) {
103+
defaultP := named.NewInferredParam(ref.name, false)
104+
p, isNamed := params.FetchMerge(ref.ref.Number, defaultP)
105+
a = append(a, Parameter{
106+
Number: ref.ref.Number,
107+
Column: &Column{
108+
Name: p.Name(),
109+
DataType: "any",
110+
IsNamedParam: isNamed,
111+
},
112+
})
113+
}
114+
101115
for _, ref := range args {
102116
switch n := ref.parent.(type) {
103117

@@ -318,6 +332,8 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
318332
ReturnType: &ast.TypeName{Name: "any"},
319333
}
320334
}
335+
336+
var added bool
321337
for i, item := range n.Args.Items {
322338
funcName := fun.Name
323339
var argName string
@@ -357,6 +373,7 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
357373

358374
defaultP := named.NewInferredParam(defaultName, false)
359375
p, isNamed := params.FetchMerge(ref.ref.Number, defaultP)
376+
added = true
360377
a = append(a, Parameter{
361378
Number: ref.ref.Number,
362379
Column: &Column{
@@ -398,6 +415,7 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
398415

399416
defaultP := named.NewInferredParam(paramName, true)
400417
p, isNamed := params.FetchMerge(ref.ref.Number, defaultP)
418+
added = true
401419
a = append(a, Parameter{
402420
Number: ref.ref.Number,
403421
Column: &Column{
@@ -411,6 +429,9 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
411429
}
412430

413431
if fun.ReturnType == nil {
432+
if !added {
433+
addUnknownParam(ref)
434+
}
414435
continue
415436
}
416437

@@ -420,7 +441,9 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
420441
Name: fun.ReturnType.Name,
421442
})
422443
if err != nil {
423-
// The return type wasn't a table.
444+
if !added {
445+
addUnknownParam(ref)
446+
}
424447
continue
425448
}
426449
err = indexTable(table)
@@ -607,16 +630,7 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
607630

608631
default:
609632
slog.Debug("unsupported reference type", "type", fmt.Sprintf("%T", n))
610-
defaultP := named.NewInferredParam(ref.name, false)
611-
p, isNamed := params.FetchMerge(ref.ref.Number, defaultP)
612-
a = append(a, Parameter{
613-
Number: ref.ref.Number,
614-
Column: &Column{
615-
Name: p.Name(),
616-
DataType: "any",
617-
IsNamedParam: isNamed,
618-
},
619-
})
633+
addUnknownParam(ref)
620634
}
621635
}
622636
return a, nil

internal/endtoend/testdata/params_in_nested_func/mysql/db/db.go

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

internal/endtoend/testdata/params_in_nested_func/mysql/db/models.go

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

internal/endtoend/testdata/params_in_nested_func/mysql/db/query.sql.go

+55
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,9 @@
1+
-- name: GetGroups :many
2+
SELECT
3+
rg.groupId,
4+
rg.groupName
5+
FROM
6+
RouterGroup rg
7+
WHERE
8+
rg.groupName LIKE CONCAT('%', COALESCE(sqlc.narg('groupName'), rg.groupName), '%') AND
9+
rg.groupId = COALESCE(sqlc.narg('groupId'), rg.groupId);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
create table RouterGroup
2+
(
3+
groupId int unsigned auto_increment primary key,
4+
groupName varchar(100) not null,
5+
defaultConfigId int unsigned null,
6+
defaultFirmwareVersion varchar(12) null,
7+
parentGroupId int unsigned null,
8+
firmwarePolicy varchar(45) null,
9+
styles text null
10+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: '2'
2+
sql:
3+
- schema: schema.sql
4+
queries: query.sql
5+
engine: mysql
6+
gen:
7+
go:
8+
out: db

internal/endtoend/testdata/params_in_nested_func/postgresql/db/db.go

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

internal/endtoend/testdata/params_in_nested_func/postgresql/db/models.go

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

internal/endtoend/testdata/params_in_nested_func/postgresql/db/query.sql.go

+55
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,9 @@
1+
-- name: GetGroups :many
2+
SELECT
3+
rg.groupId,
4+
rg.groupName
5+
FROM
6+
RouterGroup rg
7+
WHERE
8+
rg.groupName LIKE CONCAT('%', COALESCE(sqlc.narg('groupName')::text, rg.groupName), '%') AND
9+
rg.groupId = COALESCE(sqlc.narg('groupId'), rg.groupId);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
create table RouterGroup
2+
(
3+
groupId serial primary key,
4+
groupName varchar(100) not null,
5+
defaultConfigId int null,
6+
defaultFirmwareVersion varchar(12) null,
7+
parentGroupId int null,
8+
firmwarePolicy varchar(45) null,
9+
styles text null
10+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
version: '2'
2+
sql:
3+
- schema: schema.sql
4+
queries: query.sql
5+
engine: postgresql
6+
gen:
7+
go:
8+
out: db

0 commit comments

Comments
 (0)