diff --git a/codex/cli.py b/codex/cli.py index 33ab2c8..28130b7 100644 --- a/codex/cli.py +++ b/codex/cli.py @@ -84,10 +84,10 @@ def search_paper( rows = conn.execute( """ SELECT id, title, year, - abstract_emb <-> %(emb)s AS distance + abstract_emb <-> %(emb)s::vector AS distance FROM papers WHERE abstract_emb IS NOT NULL - ORDER BY abstract_emb <-> %(emb)s + ORDER BY abstract_emb <-> %(emb)s::vector LIMIT %(limit)s """, {"emb": emb, "limit": limit}, diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 4d15713..9561191 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -106,6 +106,13 @@ class TestSearch: assert "Test Paper" 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: """Test `search formula` command with mocked DB.""" with patch("codex.db.get_conn") as mock_get_conn: