Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion cli/schist/sqlite_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'}

Expand Down
29 changes: 29 additions & 0 deletions cli/tests/test_sqlite_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -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("""
Expand Down
Loading