From 387e470bf24d6459a23defe9958a2cee272739e0 Mon Sep 17 00:00:00 2001 From: Yibei Chen Date: Thu, 11 Jun 2026 16:05:02 -0400 Subject: [PATCH] Allow CLI queries of concept aliases --- cli/schist/sqlite_query.py | 3 ++- cli/tests/test_sqlite_query.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/cli/schist/sqlite_query.py b/cli/schist/sqlite_query.py index 5a10191..d33f7c2 100644 --- a/cli/schist/sqlite_query.py +++ b/cli/schist/sqlite_query.py @@ -6,7 +6,8 @@ import sys -ALLOWED_TABLES = {'docs', 'concepts', 'edges', 'docs_fts', 'paper_metadata'} +# Keep in sync with the read/queryable tables defined in schema.sql. +ALLOWED_TABLES = {'docs', 'concepts', 'edges', 'docs_fts', 'paper_metadata', 'concept_aliases'} # Keep in sync with mcp-server/src/sqlite-reader.ts REQUIRED_TABLES. REQUIRED_TABLES = {'docs', 'paper_metadata'} diff --git a/cli/tests/test_sqlite_query.py b/cli/tests/test_sqlite_query.py index 0cc0fc6..001a5e2 100644 --- a/cli/tests/test_sqlite_query.py +++ b/cli/tests/test_sqlite_query.py @@ -86,6 +86,35 @@ def test_validate_sql_still_rejects_stacked_write_statements(capsys) -> None: assert "DELETE statements are not allowed" in capsys.readouterr().err +def test_raw_query_allows_concept_aliases_table() -> None: + conn = _connect() + conn.execute(""" + CREATE TABLE concept_aliases ( + duplicate_slug TEXT NOT NULL, + canonical_slug TEXT NOT NULL, + reason TEXT, + created_by TEXT NOT NULL, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + PRIMARY KEY (duplicate_slug, canonical_slug) + ) + """) + conn.execute( + "INSERT INTO concept_aliases " + "(duplicate_slug, canonical_slug, reason, created_by) " + "VALUES ('ml', 'machine-learning', 'abbreviation', 'agent-a')" + ) + + result = raw_query( + conn, + "SELECT duplicate_slug, canonical_slug FROM concept_aliases", + ) + + assert result == { + "columns": ["duplicate_slug", "canonical_slug"], + "rows": [["ml", "machine-learning"]], + } + + def test_fts_search_sanitizes_special_syntax_without_traceback() -> None: conn = _connect() conn.execute("""