diff --git a/conn.go b/conn.go index 3414d7cf..bdb229a9 100644 --- a/conn.go +++ b/conn.go @@ -984,7 +984,18 @@ func (c *Conn) sendPreparedQuery(ps *PreparedStatement, arguments ...interface{} case string, *string: wbuf.WriteInt16(TextFormatCode) default: - wbuf.WriteInt16(internalNativeGoTypeFormats[oid]) + if dt, ok := c.ConnInfo.DataTypeForOid(oid); ok { + switch dt.Value.(type) { + case pgtype.BinaryEncoder: + wbuf.WriteInt16(BinaryFormatCode) + case pgtype.TextEncoder: + wbuf.WriteInt16(TextFormatCode) + default: + return fmt.Errorf("value for oid %v does not implement pgtype.BinaryEncoder or pgtype.TextEncoder", oid) + } + } else { + return fmt.Errorf("unknown type for oid %v", oid) + } } } diff --git a/values.go b/values.go index 682245eb..1df63945 100644 --- a/values.go +++ b/values.go @@ -72,9 +72,6 @@ const minInt = -maxInt - 1 // set here. var DefaultTypeFormats map[string]int16 -// internalNativeGoTypeFormats lists the encoding type for native Go types (not handled with Encoder interface) -var internalNativeGoTypeFormats map[pgtype.Oid]int16 - func init() { DefaultTypeFormats = map[string]int16{ "_aclitem": TextFormatCode, // Pg's src/backend/utils/adt/acl.c has only in/out (text) not send/recv (bin) @@ -111,38 +108,6 @@ func init() { "timestamptz": BinaryFormatCode, "xid": BinaryFormatCode, } - - internalNativeGoTypeFormats = map[pgtype.Oid]int16{ - BoolArrayOid: BinaryFormatCode, - BoolOid: BinaryFormatCode, - ByteaArrayOid: BinaryFormatCode, - ByteaOid: BinaryFormatCode, - CidrArrayOid: BinaryFormatCode, - CidrOid: BinaryFormatCode, - DateOid: BinaryFormatCode, - Float4ArrayOid: BinaryFormatCode, - Float4Oid: BinaryFormatCode, - Float8ArrayOid: BinaryFormatCode, - Float8Oid: BinaryFormatCode, - InetArrayOid: BinaryFormatCode, - InetOid: BinaryFormatCode, - Int2ArrayOid: BinaryFormatCode, - Int2Oid: BinaryFormatCode, - Int4ArrayOid: BinaryFormatCode, - Int4Oid: BinaryFormatCode, - Int8ArrayOid: BinaryFormatCode, - Int8Oid: BinaryFormatCode, - JsonbOid: BinaryFormatCode, - JsonOid: BinaryFormatCode, - OidOid: BinaryFormatCode, - RecordOid: BinaryFormatCode, - TextArrayOid: BinaryFormatCode, - TimestampArrayOid: BinaryFormatCode, - TimestampOid: BinaryFormatCode, - TimestampTzArrayOid: BinaryFormatCode, - TimestampTzOid: BinaryFormatCode, - VarcharArrayOid: BinaryFormatCode, - } } // SerializationError occurs on failure to encode or decode a value