Based on the user's query, read the appropriate reference file:
Query TypeReference FileQuery routing (start here)references/scenarios.mdMCP integrationreferences/mcp-integration.md时序DDL (创建时序库/表)references/ts-ddl.md聚合操作及降采样 (每小时/每天统计)references/ts-downsampling.md插值/填充缺失值references/ts-interpolation.md最新值查询references/ts-latest-value.md滑动窗口/session/eventreferences/ts-window-events.md关系表查询references/relational.md跨模查询(时序表+关系表)references/cross-model.md时序函数语法速查references/ts-functions.md关系函数语法速查references/relational-functions.md
NL PatternSQL Pattern最近N分钟/小时/天的数据WHERE ts >= NOW() - INTERVAL 'N hour'每小时/每天的平均值time_bucket(ts, '1h/1d') + avg(col)每N分钟/小时/天降采样time_bucket(ts, 'X') + aggregation填充缺失值time_bucket_gapfill() + interpolate()最新数据last(col) or ORDER BY ts DESC LIMIT 1滑动窗口TIME_WINDOW(ts, '1h', '15m')关联设备信息JOIN devices ON ...
Detect MCP availability: Call read-query with SELECT 1
Get database name (if not provided by user):
SHOW DATABASES to list all databasesDiscover tables in database: Execute SHOW TABLES FROM {database_name}
Identify candidate tables:
Get table schema: Execute SHOW CREATE TABLE {database_name}.{table_name}, do not use DESCRIBE
Proceed to Phase 1 with verified schema
When MCP is unavailable:
Read scenarios.md: references/scenarios.md - single entry point with decision tree
Route to scenario file based on query type:
ts-downsampling.mdts-interpolation.mdts-latest-value.mdts-window-events.mdcross-model.mdrelational.mdFunction syntax → see ts-functions.md (time-series) or relational-functions.md (relational)
assets/output-template.mdPrerequisite: SQL has been generated in Phase 2 and formatted in Phase 3.
Note: If MCP was successfully used in Phase 0 and schema was discovered, MCP is available. If Phase 0 indicated MCP was unavailable, skip this phase entirely.
If MCP availability is unknown (e.g., Phase 0 was skipped), verify now:
read-query with SELECT 1Prompt user:
text
生成的 SQL 已准备就绪。是否需要通过 kwdb-mcp-server 执行该 SQL?
- 输入 "是" 或 "执行" → 继续执行
- 输入 "否" 或 "跳过" → 结束,不再执行
If user declines → end workflow.
Analyze the generated SQL:
read-querywrite-queryCall the appropriate MCP tool:
For read queries ( read-query):
json
{
"sql": "<generated SQL>"
}
For write queries ( write-query):
json
{
"sql": "<generated SQL>"
}
On Success: Report to user:
text
## Execution Result
- Status: success
- Query Type: read / write
- Row Count: N
- Auto-Limited: true/false
### Results
[formatted table if applicable]
On Failure:
Parse the error message to identify error type (see Error Type table in Error Handling section below)
If error indicates SQL generation issue (wrong table name, wrong column, syntax error):
Explain to user: "SQL 执行失败,正在分析错误原因..."
Report the error and analysis: text
## Execution Result
- Return to **Phase 1** with error context to regenerate SQL
3. If error indicates **user data issue** (constraint violation, permission issue, etc.):
- Report the error and suggest fixes, but do not auto-regenerate
## Reference Files
- `references/scenarios.md` \- Query routing entry point (decision tree)
- `references/mcp-integration.md` \- How to use kwdb-mcp-server for schema discovery
- `references/ts-ddl.md` \- Time series DDL (CREATE DATABASE/TABLE with TAGS)
- `references/ts-downsampling.md` \- time\_bucket for fixed-interval downsampling
- `references/ts-interpolation.md` \- time\_bucket\_gapfill + interpolate for gap filling
- `references/ts-latest-value.md` \- first/last/last\_row for latest value queries
- `references/ts-window-events.md` \- TIME\_WINDOW, SESSION\_WINDOW, EVENT\_WINDOW, TWA, diff
- `references/relational.md` \- Standard SQL for relational tables
- `references/cross-model.md` \- JOIN between relational and time series
- `references/ts-functions.md` \- KWDB time-series function syntax reference
- `references/relational-functions.md` \- KWDB relational function syntax reference
## Guardrails
1. **Always verify table existence** when MCP is available
2. **Confirm column names** match actual schema before generating SQL
3. **Ask for time range** if user doesn't specify
4. **Add LIMIT clause** for queries without one (MCP auto-adds LIMIT 20, but you should be explicit)
5. **Mark assumed schema** when MCP is unavailable
6. **Handle ambiguous NL** by asking clarifying questions
## Error Handling (Authoritative Reference)
This Error Type table is used by:
- **Phase 4 Step 5** when SQL execution fails
- **When user reports** that generated SQL failed
When a user reports that generated SQL failed, diagnose and regenerate:
Error TypeLikely CauseFix`relation "xxx" does not exist`Wrong table nameAsk user to confirm table name, re-discover via MCP`column "xxx" not found`Wrong column nameUse MCP to re-read schema, update field mapping`syntax error`SQL syntax issueReview KWDB SQL syntax, check function parameter order`invalid interval`Wrong interval formatUse format like `'1h'`, `'1d'`, `'5m'` — not复合格式 like `'1d1h'`Overflow / out of rangeAggregation result too largeAdd filters to reduce result set size`ambiguous column reference`Column name exists in both joined tablesUse fully-qualified column names ( `table.column`)`permission denied`No write permissionReport to user, do not regenerate`duplicate key`Constraint violationReport to user, do not regenerate
When SQL fails:
1. Read the error message to identify the error type
2. If schema issue → re-run MCP discovery
3. If syntax issue → check `ts-functions.md` or `relational-functions.md` and relevant reference file
4. If data issue → ask user for clarification
5. Regenerate corrected SQL with explanation
## Schema Discovery via MCP
Use `read-query` tool to execute SHOW commands:
SQL CommandPurpose`SHOW DATABASES`List all databases`SHOW TABLES FROM {database_name}`List all tables in a database`SHOW CREATE TABLE {database_name}.{table_name}`Get table structure (columns, types, tags, comments)