jackc/pgx · error
tsvector
Error message
tsvector: %w
What it means
Binary tsvector decode guard: r.Count(3) failed while reading/bounding the lexeme count header, meaning the payload is too short or unreadable; the wrapped reader error explains the failure. Protects against maliciously large counts.
Solutions
- Fail the scan; the binary tsvector is malformed
- Check for data corruption between server and client
- Verify the column is actually tsvector
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at pgtype/tsvector.go:198 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/8f4d0d1aad9f2dd9.
Report an issue: GitHub.
Appendix: source
Thrown at pgtype/tsvector.go:198
}
type scanPlanBinaryTSVectorToTSVectorScanner struct{}
func (scanPlanBinaryTSVectorToTSVectorScanner) Scan(src []byte, dst any) error {
scanner := (dst).(TSVectorScanner)
if src == nil {
return scanner.ScanTSVector(TSVector{})
}
r := pgio.NewReader(src)
// Each lexeme carries at minimum a 1-byte NUL terminator and a 2-byte position count. This
// bounds the up-front make() against a malicious server claiming a huge lexeme count in a
// small message.
entryCount := r.Count(3)
if err := r.Err(); err != nil {
return fmt.Errorf("tsvector: %w", err)
}
var tsv TSVector
if entryCount > 0 {
tsv.Lexemes = make([]TSVectorLexeme, entryCount)
}
for i := range entryCount {
lexeme := TSVectorLexeme{Word: string(r.CString())}
numPositions := int(r.Uint16())
if err := r.Err(); err != nil {
return fmt.Errorf("invalid tsvector binary format: lexeme %d: %w", i, err)
}
// Each packed position is weight (2 bits) | position (14 bits). numPositions came from a
// uint16, so it cannot ask for an unreasonable allocation here.
if numPositions > 0 {View on GitHub (pinned to ec1a0befd2)