mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-02-12 08:13:07 +00:00
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:
@@ -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 = `
|
||||
|
||||
Reference in New Issue
Block a user