Skip to content

Commit 0c589c9

Browse files
authored
codegen: Add the :execresult query annotation (#542)
1 parent 0478ca8 commit 0c589c9

File tree

10 files changed

+141
-2
lines changed

10 files changed

+141
-2
lines changed

docs/annotations.md

+16
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,22 @@ func (q *Queries) DeleteAuthor(ctx context.Context, id int64) error {
6565
}
6666
```
6767

68+
### `:execresult`
69+
70+
The generated method will return the [sql.Result](https://golang.org/pkg/database/sql/#Result) returned by
71+
[ExecContext](https://golang.org/pkg/database/sql/#DB.ExecContext).
72+
73+
```sql
74+
-- name: DeleteAllAuthors :execresult
75+
DELETE FROM authors;
76+
```
77+
78+
```go
79+
func (q *Queries) DeleteAllAuthors(ctx context.Context) (sql.Result, error) {
80+
return q.db.ExecContext(ctx, deleteAllAuthors)
81+
}
82+
```
83+
6884
### `:execrows`
6985

7086
The generated method will return the number of affected rows from the

internal/codegen/golang/gen.go

+26
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/kyleconroy/sqlc/internal/codegen"
1313
"github.com/kyleconroy/sqlc/internal/config"
14+
"github.com/kyleconroy/sqlc/internal/metadata"
1415
)
1516

1617
type Generateable interface {
@@ -124,6 +125,11 @@ func interfaceImports(r Generateable, settings config.CombinedSettings) fileImpo
124125
if uses("sql.Null") {
125126
std["database/sql"] = struct{}{}
126127
}
128+
for _, q := range gq {
129+
if q.Cmd == metadata.CmdExecResult {
130+
std["database/sql"] = struct{}{}
131+
}
132+
}
127133
if uses("json.RawMessage") {
128134
std["encoding/json"] = struct{}{}
129135
}
@@ -324,6 +330,11 @@ func queryImports(r Generateable, settings config.CombinedSettings, filename str
324330
if uses("sql.Null") {
325331
std["database/sql"] = struct{}{}
326332
}
333+
for _, q := range gq {
334+
if q.Cmd == metadata.CmdExecResult {
335+
std["database/sql"] = struct{}{}
336+
}
337+
}
327338
if uses("json.RawMessage") {
328339
std["encoding/json"] = struct{}{}
329340
}
@@ -518,6 +529,9 @@ type Querier interface {
518529
{{- if eq .Cmd ":execrows"}}
519530
{{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error)
520531
{{- end}}
532+
{{- if eq .Cmd ":execresult"}}
533+
{{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (sql.Result, error)
534+
{{- end}}
521535
{{- end}}
522536
}
523537
@@ -684,6 +698,18 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er
684698
return result.RowsAffected()
685699
}
686700
{{end}}
701+
702+
{{if eq .Cmd ":execresult"}}
703+
{{range .Comments}}//{{.}}
704+
{{end -}}
705+
func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (sql.Result, error) {
706+
{{- if $.EmitPreparedQueries}}
707+
return := q.exec(ctx, q.{{.FieldName}}, {{.ConstantName}}, {{.Arg.Params}})
708+
{{- else}}
709+
return q.db.ExecContext(ctx, {{.ConstantName}}, {{.Arg.Params}})
710+
{{- end}}
711+
}
712+
{{end}}
687713
{{end}}
688714
{{end}}
689715
{{end}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"experimental_parser_only": true
3+
}
4+

internal/endtoend/testdata/exec_result/go/db.go

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

internal/endtoend/testdata/exec_result/go/models.go

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

internal/endtoend/testdata/exec_result/go/querier.go

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

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

+17
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,4 @@
1+
CREATE TABLE bar (id serial not null);
2+
3+
-- name: DeleteBarByID :execresult
4+
DELETE FROM bar WHERE id = $1;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"name": "querytest",
7+
"schema": "query.sql",
8+
"queries": "query.sql",
9+
"emit_interface": true
10+
}
11+
]
12+
}

internal/metadata/meta.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ const (
1414
CommentSyntaxHash
1515
)
1616

17+
const (
18+
CmdExec = ":exec"
19+
CmdExecResult = ":execresult"
20+
CmdExecRows = ":execrows"
21+
CmdMany = ":many"
22+
CmdOne = ":one"
23+
)
24+
1725
// A query name must be a valid Go identifier
1826
//
1927
// https://golang.org/ref/spec#Identifiers
@@ -47,15 +55,15 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) {
4755
part = part[:len(part)-1] // removes the trailing "*/" element
4856
}
4957
if len(part) == 2 {
50-
return "", "", fmt.Errorf("missing query type [':one', ':many', ':exec', ':execrows']: %s", line)
58+
return "", "", fmt.Errorf("missing query type [':one', ':many', ':exec', ':execrows', ':execresult']: %s", line)
5159
}
5260
if len(part) != 4 {
5361
return "", "", fmt.Errorf("invalid query comment: %s", line)
5462
}
5563
queryName := part[2]
5664
queryType := strings.TrimSpace(part[3])
5765
switch queryType {
58-
case ":one", ":many", ":exec", ":execrows":
66+
case CmdOne, CmdMany, CmdExec, CmdExecResult, CmdExecRows:
5967
default:
6068
return "", "", fmt.Errorf("invalid query type: %s", queryType)
6169
}

0 commit comments

Comments
 (0)