jackc/pgx · error
multirange
Error message
multirange: %w
What it means
When decoding a binary multirange, the element count is derived by dividing the remaining byte length by 4 (the per-element length prefix). This wrapper fires when the underlying reader signals an error during that computation — the payload is too short or otherwise malformed for the binary multirange header.
Solutions
- Verify the value is a valid binary multirange and wasn't truncated
- Use text format for the multirange column as a workaround
- Check custom binary encoding if the value was client-generated
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at pgtype/multirange.go:212 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of jackc/pgx@ec1a0befd2 (2026-08-04).
Data as JSON: /api/errors/4bd5052235812d5a.
Report an issue: GitHub.
Appendix: source
Thrown at pgtype/multirange.go:212
if _, ok := elementScanPlan.(*scanPlanFail); ok {
return nil
}
return &scanPlanMultirangeCodec{
multirangeCodec: c,
m: m,
oid: oid,
formatCode: format,
}
}
func (c *MultirangeCodec) decodeBinary(m *Map, multirangeOID uint32, src []byte, multirange MultirangeSetter) error {
r := pgio.NewReader(src)
// Each element requires at least 4 bytes for its length prefix.
elementCount := r.Count(4)
if err := r.Err(); err != nil {
return fmt.Errorf("multirange: %w", err)
}
err := multirange.SetLen(elementCount)
if err != nil {
return err
}
if elementCount == 0 {
return r.Finish()
}
elementScanPlan := c.ElementType.Codec.PlanScan(m, c.ElementType.OID, BinaryFormatCode, multirange.ScanIndex(0))
if elementScanPlan == nil {
elementScanPlan = m.PlanScan(c.ElementType.OID, BinaryFormatCode, multirange.ScanIndex(0))
}
for i := range elementCount {
elem := multirange.ScanIndex(i)View on GitHub (pinned to ec1a0befd2)