Skip to content

Commit 4b756bb

Browse files
Cyberaxkyleconroy
andauthored
Allow sqlc.arg('argname') form for named params (#351)
* Allow sqlc.arg('argname') form for named params This pacifies static SQL analizers in IDEs. * Allow sqlc to be imported as a package for "go run github.com/kyleconroy/sqlc" Co-authored-by: Kyle Conroy <kyle@conroy.org>
1 parent b6636de commit 4b756bb

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

internal/dinosql/rewrite.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,21 @@ import (
99
)
1010

1111
// Given an AST node, return the string representation of names
12-
func flatten(root nodes.Node) string {
12+
func flatten(root nodes.Node) (string, bool) {
1313
sw := &stringWalker{}
1414
ast.Walk(sw, root)
15-
return sw.String
15+
return sw.String, sw.IsConst
1616
}
1717

1818
type stringWalker struct {
1919
String string
20+
IsConst bool
2021
}
2122

2223
func (s *stringWalker) Visit(node nodes.Node) ast.Visitor {
24+
if _, ok := node.(nodes.A_Const); ok {
25+
s.IsConst = true
26+
}
2327
if n, ok := node.(nodes.String); ok {
2428
s.String += n.Str
2529
}
@@ -61,7 +65,7 @@ func rewriteNamedParameters(raw nodes.RawStmt) (nodes.RawStmt, map[int]string, [
6165

6266
case isNamedParamFunc(node):
6367
fun := node.(nodes.FuncCall)
64-
param := flatten(fun.Args)
68+
param, isConst := flatten(fun.Args)
6569
if num, ok := args[param]; ok {
6670
cr.Replace(nodes.ParamRef{
6771
Number: num,
@@ -76,17 +80,23 @@ func rewriteNamedParameters(raw nodes.RawStmt) (nodes.RawStmt, map[int]string, [
7680
})
7781
}
7882
// TODO: This code assumes that sqlc.arg(name) is on a single line
83+
var old string
84+
if isConst {
85+
old = fmt.Sprintf("sqlc.arg('%s')", param)
86+
} else {
87+
old = fmt.Sprintf("sqlc.arg(%s)", param)
88+
}
7989
edits = append(edits, edit{
8090
Location: fun.Location - raw.StmtLocation,
81-
Old: fmt.Sprintf("sqlc.arg(%s)", param),
91+
Old: old,
8292
New: fmt.Sprintf("$%d", args[param]),
8393
})
8494
return false
8595

8696
case isNamedParamSignCast(node):
8797
expr := node.(nodes.A_Expr)
8898
cast := expr.Rexpr.(nodes.TypeCast)
89-
param := flatten(cast.Arg)
99+
param, _ := flatten(cast.Arg)
90100
if num, ok := args[param]; ok {
91101
cast.Arg = nodes.ParamRef{
92102
Number: num,
@@ -112,7 +122,7 @@ func rewriteNamedParameters(raw nodes.RawStmt) (nodes.RawStmt, map[int]string, [
112122

113123
case isNamedParamSign(node):
114124
expr := node.(nodes.A_Expr)
115-
param := flatten(expr.Rexpr)
125+
param, _ := flatten(expr.Rexpr)
116126
if num, ok := args[param]; ok {
117127
cr.Replace(nodes.ParamRef{
118128
Number: num,

internal/endtoend/testdata/named_param/query.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CREATE TABLE foo (name text not null, bio text not null);
22

33
-- name: FuncParams :many
4-
SELECT name FROM foo WHERE name = sqlc.arg(slug) AND sqlc.arg(filter)::bool;
4+
SELECT name FROM foo WHERE name = sqlc.arg('slug') AND sqlc.arg(filter)::bool;
55

66
-- name: AtParams :many
77
SELECT name FROM foo WHERE name = @slug AND @filter::bool;

placeholder.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package sqlc
2+
// This is a dummy file that allows SQLC to be "installed" as a module and locked using
3+
// go.mod and then run using "go run github.com/kyleconroy/sqlc"
4+
5+
type Placeholder struct{}

0 commit comments

Comments
 (0)