jackc/pgx · error

invalid length for tid

Error message

invalid length for tid: %v

What it means

scanPlanTextAnyToTIDScanner minimum-length guard: a text tid must look like '(block,offset)' with at least 5 characters ('(0,0)'); shorter input cannot contain a valid TID and is rejected before parsing.

Solutions

  1. Check the tid string for truncation before scanning
  2. Ensure the value comes from a ctid column or equivalent
  3. Reject empty or unrelated strings at the application boundary
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pgtype/tid.go:210 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/370606fb69eac1a4. Report an issue: GitHub.

Appendix: source

Thrown at pgtype/tid.go:210

	}

	return scanner.ScanText(Text{
		String: fmt.Sprintf(`(%d,%d)`, blockNumber, offsetNumber),
		Valid:  true,
	})
}

type scanPlanTextAnyToTIDScanner struct{}

func (scanPlanTextAnyToTIDScanner) Scan(src []byte, dst any) error {
	scanner := (dst).(TIDScanner)

	if src == nil {
		return scanner.ScanTID(TID{})
	}

	if len(src) < 5 {
		return fmt.Errorf("invalid length for tid: %v", len(src))
	}

	block, offset, found := strings.Cut(string(src[1:len(src)-1]), ",")
	if !found {
		return fmt.Errorf("invalid format for tid")
	}

	blockNumber, err := strconv.ParseUint(block, 10, 32)
	if err != nil {
		return err
	}

	offsetNumber, err := strconv.ParseUint(offset, 10, 16)
	if err != nil {
		return err
	}

	return scanner.ScanTID(TID{BlockNumber: uint32(blockNumber), OffsetNumber: uint16(offsetNumber), Valid: true})

View on GitHub (pinned to ec1a0befd2)