diff --git a/pgtype/array_codec.go b/pgtype/array_codec.go index cd8c8ce22..19eb56fd3 100644 --- a/pgtype/array_codec.go +++ b/pgtype/array_codec.go @@ -145,7 +145,15 @@ func (p *encodePlanArrayCodecText) Encode(value any, buf []byte) (newBuf []byte, return nil, err } } else if callNilDriverValuer { - elemBuf, err = (&encodePlanDriverValuer{m: p.m, oid: p.ac.ElementType.OID, formatCode: TextFormatCode}).Encode(elem, inElemBuf) + elemType := reflect.TypeOf(elem) + if lastElemType != elemType { + lastElemType = elemType + encodePlan = p.m.PlanEncode(p.ac.ElementType.OID, TextFormatCode, elem) + if encodePlan == nil { + return nil, fmt.Errorf("unable to encode %v", array.Index(i)) + } + } + elemBuf, err = encodePlan.Encode(elem, inElemBuf) if err != nil { return nil, err } @@ -215,7 +223,15 @@ func (p *encodePlanArrayCodecBinary) Encode(value any, buf []byte) (newBuf []byt return nil, err } } else if callNilDriverValuer { - elemBuf, err = (&encodePlanDriverValuer{m: p.m, oid: p.ac.ElementType.OID, formatCode: BinaryFormatCode}).Encode(elem, buf) + elemType := reflect.TypeOf(elem) + if lastElemType != elemType { + lastElemType = elemType + encodePlan = p.m.PlanEncode(p.ac.ElementType.OID, BinaryFormatCode, elem) + if encodePlan == nil { + return nil, fmt.Errorf("unable to encode %v", array.Index(i)) + } + } + elemBuf, err = encodePlan.Encode(elem, buf) if err != nil { return nil, err } diff --git a/pgtype/composite.go b/pgtype/composite.go index bcce0016c..5fda55d5c 100644 --- a/pgtype/composite.go +++ b/pgtype/composite.go @@ -494,7 +494,10 @@ func (b *CompositeBinaryBuilder) AppendValue(oid uint32, field any) { var plan EncodePlan if isNil { - plan = &encodePlanDriverValuer{m: b.m, oid: oid, formatCode: BinaryFormatCode} + plan = b.m.PlanEncode(oid, BinaryFormatCode, field) + if plan == nil { + plan = &encodePlanDriverValuer{m: b.m, oid: oid, formatCode: BinaryFormatCode} + } } else { plan = b.m.PlanEncode(oid, BinaryFormatCode, field) if plan == nil { @@ -555,7 +558,10 @@ func (b *CompositeTextBuilder) AppendValue(oid uint32, field any) { var plan EncodePlan if isNil { - plan = &encodePlanDriverValuer{m: b.m, oid: oid, formatCode: TextFormatCode} + plan = b.m.PlanEncode(oid, TextFormatCode, field) + if plan == nil { + plan = &encodePlanDriverValuer{m: b.m, oid: oid, formatCode: TextFormatCode} + } } else { plan = b.m.PlanEncode(oid, TextFormatCode, field) if plan == nil {