fix(search): cast query embedding to ::vector in search paper (DQ-4)
`codex search paper` crashed on the live DB with "operator does not exist: vector <-> double precision[]". The pgvector `<->` operator needs its RHS typed as vector; peer call sites (mcp_server.py, wiki.py) cast but the CLI did not. Mocked unit tests never exercise real pgvector, so it went unseen. Add the cast to both `<->` occurrences and a regression guard asserting the SQL contains `::vector`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -84,10 +84,10 @@ def search_paper(
|
|||||||
rows = conn.execute(
|
rows = conn.execute(
|
||||||
"""
|
"""
|
||||||
SELECT id, title, year,
|
SELECT id, title, year,
|
||||||
abstract_emb <-> %(emb)s AS distance
|
abstract_emb <-> %(emb)s::vector AS distance
|
||||||
FROM papers
|
FROM papers
|
||||||
WHERE abstract_emb IS NOT NULL
|
WHERE abstract_emb IS NOT NULL
|
||||||
ORDER BY abstract_emb <-> %(emb)s
|
ORDER BY abstract_emb <-> %(emb)s::vector
|
||||||
LIMIT %(limit)s
|
LIMIT %(limit)s
|
||||||
""",
|
""",
|
||||||
{"emb": emb, "limit": limit},
|
{"emb": emb, "limit": limit},
|
||||||
|
|||||||
@@ -106,6 +106,13 @@ class TestSearch:
|
|||||||
assert "Test Paper" in result.stdout
|
assert "Test Paper" in result.stdout
|
||||||
assert "0.123" in result.stdout
|
assert "0.123" in result.stdout
|
||||||
|
|
||||||
|
# Regression guard (DQ-4): the pgvector `<->` operator requires the
|
||||||
|
# query embedding cast to ::vector. Without it, real Postgres raises
|
||||||
|
# "operator does not exist: vector <-> double precision[]". Mocked DBs
|
||||||
|
# don't catch the type error, so assert the cast is in the SQL.
|
||||||
|
executed_sql = mock_conn.execute.call_args_list[0][0][0]
|
||||||
|
assert "<->" in executed_sql and "::vector" in executed_sql
|
||||||
|
|
||||||
def test_search_formula_command(self) -> None:
|
def test_search_formula_command(self) -> None:
|
||||||
"""Test `search formula` command with mocked DB."""
|
"""Test `search formula` command with mocked DB."""
|
||||||
with patch("codex.db.get_conn") as mock_get_conn:
|
with patch("codex.db.get_conn") as mock_get_conn:
|
||||||
|
|||||||
Reference in New Issue
Block a user