fix: resolve SQL parsing for triggers in schema initialization

**Issue**: 30 CI tests failing with "incomplete input" database error
- tests/unit/mcp/get-node-essentials-examples.test.ts (16 tests)
- tests/unit/mcp/search-nodes-examples.test.ts (14 tests)

**Root Cause**:
Both `src/mcp/server.ts` and `tests/integration/database/test-utils.ts`
used naive `schema.split(';')` to parse SQL statements. This breaks
trigger definitions containing semicolons inside BEGIN...END blocks:

```sql
CREATE TRIGGER nodes_fts_insert AFTER INSERT ON nodes
BEGIN
  INSERT INTO nodes_fts(...) VALUES (...);  -- ← semicolon inside block
END;
```

Splitting by ';' created incomplete statements, causing SQLite parse errors.

**Fix**:
- Added `parseSQLStatements()` method to both files
- Tracks `inBlock` state when entering BEGIN...END blocks
- Only splits on ';' when NOT inside a block
- Skips SQL comments and empty lines
- Preserves complete trigger definitions

**Documentation**:
Added clarifying comments to explain FTS5 search architecture:
- `NodeRepository.searchNodes()`: Legacy LIKE-based search for direct repository usage
- `MCPServer.searchNodes()`: Production FTS5 search used by ALL MCP tools

This addresses confusion from code review where FTS5 appeared unused.
In reality, FTS5 IS used via MCPServer.searchNodes() (lines 1189-1203).

**Verification**:
 get-node-essentials-examples.test.ts: 16 tests passed
 search-nodes-examples.test.ts: 14 tests passed
 CI database validation: 25 tests passed
 Build successful with no TypeScript errors

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2025-10-10 09:42:53 +02:00
parent cfd2325ca4
commit f072b2e003
3 changed files with 135 additions and 13 deletions

View File

@@ -123,10 +123,22 @@ export class NodeRepository {
return rows.map(row => this.parseNodeRow(row));
}
/**
* Legacy LIKE-based search method for direct repository usage.
*
* NOTE: MCP tools do NOT use this method. They use MCPServer.searchNodes()
* which automatically detects and uses FTS5 full-text search when available.
* See src/mcp/server.ts:1135-1148 for FTS5 implementation.
*
* This method remains for:
* - Direct repository access in scripts/benchmarks
* - Fallback when FTS5 table doesn't exist
* - Legacy compatibility
*/
searchNodes(query: string, mode: 'OR' | 'AND' | 'FUZZY' = 'OR', limit: number = 20): any[] {
let sql = '';
const params: any[] = [];
if (mode === 'FUZZY') {
// Simple fuzzy search
sql = `