Fix unknown OID scanning into string and []byte
This commit is contained in:
@@ -9,6 +9,7 @@ require (
|
||||
github.com/lib/pq v1.1.0
|
||||
github.com/satori/go.uuid v1.2.0
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24
|
||||
github.com/stretchr/testify v1.3.0
|
||||
go.uber.org/atomic v1.3.2 // indirect
|
||||
go.uber.org/multierr v1.1.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
|
||||
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
|
||||
@@ -28,6 +29,7 @@ github.com/lib/pq v1.1.0 h1:/5u4a+KGJptBRqGzPvYQL9p0d/tPR4S31+Tnzj9lEO4=
|
||||
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||
github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
|
||||
@@ -38,6 +40,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
|
||||
|
||||
@@ -342,7 +342,27 @@ func (ci *ConnInfo) Scan(oid OID, formatCode int16, buf []byte, dest interface{}
|
||||
return value.AssignTo(dest)
|
||||
}
|
||||
}
|
||||
return errors.Errorf("unknown oid: %v", oid)
|
||||
|
||||
return scanUnknownType(oid, formatCode, buf, dest)
|
||||
}
|
||||
|
||||
func scanUnknownType(oid OID, formatCode int16, buf []byte, dest interface{}) error {
|
||||
switch dest := dest.(type) {
|
||||
case *string:
|
||||
if formatCode == BinaryFormatCode {
|
||||
return errors.Errorf("unknown oid %d in binary format cannot be scanned into %t", oid, dest)
|
||||
}
|
||||
*dest = string(buf)
|
||||
return nil
|
||||
case *[]byte:
|
||||
*dest = buf
|
||||
return nil
|
||||
default:
|
||||
if nextDst, retry := GetAssignToDstType(dest); retry {
|
||||
return scanUnknownType(oid, formatCode, buf, nextDst)
|
||||
}
|
||||
return errors.Errorf("unknown oid %d cannot be scanned into %t", oid, dest)
|
||||
}
|
||||
}
|
||||
|
||||
var nameValues map[string]Value
|
||||
|
||||
@@ -4,8 +4,11 @@ import (
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
"github.com/jackc/pgtype"
|
||||
"github.com/jackc/pgx/v4"
|
||||
_ "github.com/jackc/pgx/v4/stdlib"
|
||||
_ "github.com/lib/pq"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
// Test for renamed types
|
||||
@@ -37,3 +40,37 @@ func mustParseMacaddr(t testing.TB, s string) net.HardwareAddr {
|
||||
|
||||
return addr
|
||||
}
|
||||
|
||||
func TestConnInfoScanUnknownOID(t *testing.T) {
|
||||
unknownOID := pgtype.OID(999999)
|
||||
srcBuf := []byte("foo")
|
||||
ci := pgtype.NewConnInfo()
|
||||
|
||||
var s string
|
||||
err := ci.Scan(unknownOID, pgx.TextFormatCode, srcBuf, &s)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "foo", s)
|
||||
|
||||
var rs _string
|
||||
err = ci.Scan(unknownOID, pgx.TextFormatCode, srcBuf, &rs)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "foo", string(rs))
|
||||
|
||||
var b []byte
|
||||
err = ci.Scan(unknownOID, pgx.TextFormatCode, srcBuf, &b)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []byte("foo"), b)
|
||||
|
||||
err = ci.Scan(unknownOID, pgx.BinaryFormatCode, srcBuf, &b)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []byte("foo"), b)
|
||||
|
||||
var rb _byteSlice
|
||||
err = ci.Scan(unknownOID, pgx.TextFormatCode, srcBuf, &rb)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []byte("foo"), []byte(rb))
|
||||
|
||||
err = ci.Scan(unknownOID, pgx.BinaryFormatCode, srcBuf, &b)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, []byte("foo"), []byte(rb))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user