Skip to content

Commit 7488273

Browse files
committed
fix: prevent batch infinite loop with arg length
1 parent 2a5a5c6 commit 7488273

File tree

4 files changed

+58
-12
lines changed

4 files changed

+58
-12
lines changed

examples/batch/postgresql/batch.go

Lines changed: 20 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/codegen/golang/templates/pgx/batchCode.tmpl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const {{.ConstantName}} = {{$.Q}}-- name: {{.MethodName}} {{.Cmd}}
88
type {{.MethodName}}BatchResults struct {
99
br pgx.BatchResults
1010
ind int
11+
tot int
1112
}
1213

1314
{{if .Arg.EmitStruct}}
@@ -41,16 +42,19 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ if $.EmitMethodsWithDB
4142
batch.Queue({{.ConstantName}}, vals...)
4243
}
4344
br := {{if not $.EmitMethodsWithDBArgument}}q.{{end}}db.SendBatch(ctx, batch)
44-
return &{{.MethodName}}BatchResults{br,0}
45+
return &{{.MethodName}}BatchResults{br,0,len({{.Arg.Name}})}
4546
}
4647

4748
{{if eq .Cmd ":batchexec"}}
4849
func (b *{{.MethodName}}BatchResults) Exec(f func(int, error)) {
4950
for {
50-
_, err := b.br.Exec()
51+
if b.ind >= b.tot {
52+
break
53+
}
54+
_, err := b.br.Exec()
5155
if err != nil && (err.Error() == "no result" || err.Error() == "batch already closed"){
5256
break
53-
}
57+
}
5458
if f != nil {
5559
f(b.ind, err)
5660
}
@@ -62,6 +66,9 @@ func (b *{{.MethodName}}BatchResults) Exec(f func(int, error)) {
6266
{{if eq .Cmd ":batchmany"}}
6367
func (b *{{.MethodName}}BatchResults) Query(f func(int, []{{.Ret.DefineType}}, error)) {
6468
for {
69+
if b.ind >= b.tot {
70+
break
71+
}
6572
rows, err := b.br.Query()
6673
if err != nil && (err.Error() == "no result" || err.Error() == "batch already closed") {
6774
break
@@ -91,6 +98,9 @@ func (b *{{.MethodName}}BatchResults) Query(f func(int, []{{.Ret.DefineType}}, e
9198
{{if eq .Cmd ":batchone"}}
9299
func (b *{{.MethodName}}BatchResults) QueryRow(f func(int, {{.Ret.DefineType}}, error)) {
93100
for {
101+
if b.ind >= b.tot {
102+
break
103+
}
94104
row := b.br.QueryRow()
95105
var {{.Ret.Name}} {{.Ret.Type}}
96106
err := row.Scan({{.Ret.Scan}})

internal/endtoend/testdata/batch/postgresql/pgx/go/batch.go

Lines changed: 15 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/batch_imports/postgresql/pgx/go/batch.go

Lines changed: 10 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)