jackc/pgx · error

missing lower bound, instead got

Error message

missing lower bound, instead got: %v

What it means

The first non-whitespace character of a range literal must be '(' (exclusive) or '[' (inclusive), but a different character was read. The offending character is included so the caller can see exactly what started the string instead of a lower bound bracket.

Solutions

  1. Ensure the range literal starts with '(' or '[' after optional leading whitespace
  2. Normalize the value through the database before scanning
  3. Pre-validate range strings against PostgreSQL's range text grammar
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pgtype/range.go:52 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/9e0eb025df828c1f. Report an issue: GitHub.

Appendix: source

Thrown at pgtype/range.go:52

		utr.UpperType = Empty
		return utr, nil
	}

	buf := bytes.NewBufferString(src)

	skipWhitespace(buf)

	r, _, err := buf.ReadRune()
	if err != nil {
		return nil, fmt.Errorf("invalid lower bound: %w", err)
	}
	switch r {
	case '(':
		utr.LowerType = Exclusive
	case '[':
		utr.LowerType = Inclusive
	default:
		return nil, fmt.Errorf("missing lower bound, instead got: %v", string(r))
	}

	r, _, err = buf.ReadRune()
	if err != nil {
		return nil, fmt.Errorf("invalid lower value: %w", err)
	}
	buf.UnreadRune()

	if r == ',' {
		utr.LowerType = Unbounded
	} else {
		utr.Lower, err = rangeParseValue(buf)
		if err != nil {
			return nil, fmt.Errorf("invalid lower value: %w", err)
		}
	}

	r, _, err = buf.ReadRune()

View on GitHub (pinned to ec1a0befd2)