Skip to content

Commit

Permalink
Use pgtype.PreallocBytes in LargeObject's Read.
Browse files Browse the repository at this point in the history
Fixes #1876.
  • Loading branch information
mitar committed May 12, 2024
1 parent 48cdd7b commit 3c4cd9c
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions large_objects.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"context"
"errors"
"io"

"github.com/jackc/pgx/v5/pgtype"
)

// The PostgreSQL wire protocol has a limit of 1 GB - 1 per message. See definition of
Expand Down Expand Up @@ -115,9 +117,10 @@ func (o *LargeObject) Read(p []byte) (int, error) {
expected = maxLargeObjectMessageLength
}

var res []byte
res := pgtype.PreallocBytes(p[nTotal:])
err := o.tx.QueryRow(o.ctx, "select loread($1, $2)", o.fd, expected).Scan(&res)
copy(p[nTotal:], res)
// We compute expected so that it always fits into p, so it should never happen
// that PreallocBytes's ScanBytes had to allocate a new slice.
nTotal += len(res)
if err != nil {
return nTotal, err
Expand Down

0 comments on commit 3c4cd9c

Please sign in to comment.