jackc/pgx · error
invalid multirange, expected
Error message
invalid multirange, expected '{' got %v What it means
A textual multirange must be brace-enclosed: '{range,range,...}'. After skipping whitespace the parser reads the first rune and this guard fires when it is anything other than '{' — the value does not start the multirange literal as required.
Solutions
- Store the value in brace-enclosed multirange text format
- Validate input strings before writing them to a multirange column
- Use binary format to avoid text parsing
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at pgtype/multirange.go:345 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/40f9a54aef1fb717.
Report an issue: GitHub.
Appendix: source
Thrown at pgtype/multirange.go:345
var multirange Multirange[Range[any]]
err := m.PlanScan(oid, format, &multirange).Scan(src, &multirange)
return multirange, err
}
func parseUntypedTextMultirange(src []byte) ([]string, error) {
elements := make([]string, 0)
buf := bytes.NewBuffer(src)
skipWhitespace(buf)
r, _, err := buf.ReadRune()
if err != nil {
return nil, fmt.Errorf("invalid array: %w", err)
}
if r != '{' {
return nil, fmt.Errorf("invalid multirange, expected '{' got %v", r)
}
parseValueLoop:
for {
r, _, err = buf.ReadRune()
if err != nil {
return nil, fmt.Errorf("invalid multirange: %w", err)
}
switch r {
case ',': // skip range separator
case '}':
break parseValueLoop
default:
buf.UnreadRune()
value, err := parseRange(buf)
if err != nil {
return nil, fmt.Errorf("invalid multirange value: %w", err)View on GitHub (pinned to ec1a0befd2)