Skip to content

fix(hnsw): resolve segfault with parameterized queries (#141)#142

Merged
ruvnet merged 5 commits intomainfrom
fix/hnsw-parameterized-query-segfault-141
Jan 28, 2026
Merged

fix(hnsw): resolve segfault with parameterized queries (#141)#142
ruvnet merged 5 commits intomainfrom
fix/hnsw-parameterized-query-segfault-141

Conversation

@ruvnet
Copy link
Copy Markdown
Owner

@ruvnet ruvnet commented Jan 28, 2026

Summary

This PR fixes a critical P0 bug where HNSW indexes crash PostgreSQL with segmentation faults when using parameterized queries (prepared statements, ORMs, application drivers).

  • Implements multi-method query vector extraction pipeline
  • Adds validation gates before search execution
  • Applies same fix to IVFFlat for consistency
  • Adds regression tests

Root Cause

The hnsw_rescan callback only handled direct ruvector datum extraction. Parameterized queries pass text representations that require conversion - this path was missing. When extraction failed, the code fell back to a zero vector which caused the segfault.

Changes

File Change
hnsw_am.rs Multi-method extraction, validation, zero-vector check
ivfflat_am.rs Parallel fix for consistency
hnsw_index_tests.sql Regression tests
ADR-0027-*.md Architecture decision record

Test Plan

  • Literal query works (baseline)
  • Prepared statement with parameter (was crashing, now works)
  • Function with text parameter (was crashing, now works)
  • Zero vector produces error (not crash)
  • Dimension mismatch produces error (not crash)
  • 384-dimension vectors work

Release

  • Crate published: ruvector-postgres v2.0.1 on crates.io ✅
  • Docker image: ruvnet/ruvector-postgres:2.0.1 building 🔄

Fixes #141

🤖 Generated with Claude Code

ruvnet and others added 3 commits January 28, 2026 16:34
This commit fixes a critical P0 bug where HNSW indexes on ruvector
columns would crash PostgreSQL with a segmentation fault when using
parameterized queries (prepared statements, ORMs, application drivers).

Root Cause:
- Query vector extraction failed for parameterized queries
- Code fell back to zero vector without validation
- Zero vector caused segfault during HNSW search

Changes:
- Add multi-method query vector extraction pipeline
  1. Direct RuVector::from_polymorphic_datum()
  2. Text parameter conversion for parameterized queries
  3. Validated varlena fallback with dimension checking
- Add query_valid flag to track extraction success
- Add validation before search execution:
  - Reject empty/invalid query vectors with clear errors
  - Reject all-zero vectors (invalid for similarity search)
  - Validate dimension match between query and index
- Apply same fixes to IVFFlat for consistency

Testing:
- Added regression tests for parameterized queries
- Added tests for zero vector error handling
- Added tests for dimension mismatch errors
- Added 384-dimension production-scale tests

Fixes: #141
See: docs/adr/ADR-0027-hnsw-parameterized-query-fix.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
ruvnet and others added 2 commits January 28, 2026 16:55
- Move datum and false arguments to same line in from_polymorphic_datum
- Join split let text_len = ... assignment to single line

These changes fix CI rustfmt check failures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Run rustfmt on all Rust files to fix CI formatting checks.
This addresses pre-existing formatting inconsistencies across:
- cognitum-gate-kernel
- cognitum-gate-tilezero
- prime-radiant
- ruvector-* crates
- examples/benchmarks
- and other crates

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@ruvnet ruvnet merged commit e76f01a into main Jan 28, 2026
14 checks passed
ruvnet added a commit that referenced this pull request Feb 20, 2026
…ault-141

fix(hnsw): resolve segfault with parameterized queries (#141)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Critical: HNSW Index Segmentation Fault with Parameterized Queries on ruvector(384) Columns

1 participant