Skip to content

feat: suggest CTE names and script-created tables in completion demo - #230

Open
Cythia828 wants to merge 1 commit into
nextfrom
feat/support_CTE_entity
Open

Cythia828 wants to merge 1 commit into
nextfrom
feat/support_CTE_entity

Conversation

@Cythia828

@Cythia828 Cythia828 commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

功能

playground 补全新增 CTE 名称(WITH ... AS)与脚本内 CREATE TABLE 建表名的建议,并修复语法错误场景下把整段子句当成补全项、以及同名表/列重复出现的问题。同时带上 1.2.1 发布元信息、dt-sql-parser 升级与仓库指引 AGENTS.md。

分支:feat/support_CTE_entity → next(3 个提交,基线 4b9461f)

预览地址

https://cythia828.github.io/monaco-sql-languages/

变更描述

一、playground 补全支持 CTE 实体与脚本建表

主要改动集中在 website/src/languages/helpers/completionService.ts。

解决的问题

  1. CTE 名称不参与补全。WITH 定义的 CTE 在实体模型中表现为 TABLE + declareType = EXPRESSION,而原有逻辑只收集 TABLE_CREATE(脚本建表)实体,因此 WITH t AS (...) SELECT * FROM | 的补全列表里看不到 t。
  2. 无别名引用的 CTE 取不到列。getSpecificDerivedTableColumns 仅在传入 displayAlias 时才匹配实体(displayAlias ? ... : false),FROM myCte 这类无别名引用直接返回空,派生表列补全缺失。
  3. 语法错误会产出脏补全项。实体文本是源码的原始切片,语法错误下的错误恢复可能把上下文拉伸到整个子句:FROM 后接 JOIN myOwn 会得到表实体文本 JOIN myOwn\nORDER BY 1,并被直接当作补全 label 展示。
  4. 重复项。可访问源表与脚本建表同名时会重复出现(如 FROM orders JOIN t1 ON 中 orders、t1 各出现两次);CTE 的定义实体与引用实体共享同一份对外列,逐条 map 会产出重复列项。

实现方案

(1)新增 isEntityName 名称合法性校验

要求实体文本"长得像标识符"才允许成为补全项:

  • 反引号包裹的标识符(`my table`)整体视为不透明,直接通过——parseEntityText 对内容不是裸标识符的反引号标识符会保留反引号,因此必须保持有效;
  • 其余按 . 切分,每段均需匹配 /^[A-Za-z0-9_$]+$/。

在 getSpecificTableColumns、getSpecificDerivedTableColumns、getSpecificCTASTableColumns、sourceTables 表项与 CREATE TABLE 表项处统一接入,从源头过滤脏实体。

(2)新增 getCteTableCompletions

遍历 isAccessible 且 declareType === EXPRESSION 的 TABLE 实体收集可见 CTE 名称,按小写去重(定义与引用共享 text,只保留一个),输出 detail: 'derived table' 的补全项。

(3)getSpecificDerivedTableColumns 支持无别名引用

新增第三个参数 tableText:有 displayAlias 时按别名匹配;否则按 tb.text === tableText 或 getPureEntityText 相等匹配。命中后只取 matched[0]——CTE 定义实体与引用实体共享同一份对外列,取首条即可避免列项重复。表名解析顺序为 displayAlias || getPureEntityText(tableText) || alias || getPureEntityText(tb.text),同样经过 isEntityName。

(4)触发时机与去重

  • CTE 建议在 syntaxContextType 为 TABLE 或 COLUMN、words.length <= 1 时注入,覆盖未完成的 FROM / JOIN / ON 位置;
  • 脚本建表建议的触发条件从仅 TABLE 放宽为 TABLE || COLUMN,使 JOIN t ON | 这类连接条件也能看到表名;
  • 新增 sourceTableLabels(可访问源表标签,小写)集合,脚本建表项与之同名时跳过;sourceTables 侧改用 flatMap + seenTableLabels 去重,并跳过无别名的 EXPRESSION 实体(其名称已由 CTE 建议统一提供,避免重复)。

(5)列名刻意不做 isEntityName 校验

无别名的列通常是表达式(UPPER(name)、amount * 2),作为 label 仍然可用,因此三处列处理分支保留原逻辑并补充注释说明。

二、chore(release): 1.2.1

三、feat: add agent guidelines

新增 AGENTS.md(206 行),面向在本仓库工作的 agent 的指引:目录布局、常用命令与"完成标准"(改动类型 → 需要跑的校验)、双 worker 流水线架构、各方言接线方式与新增方言步骤、playground 的三个集成点、format 入口的注册机制、约定与测试框架限制(test/all.js 不支持子集运行)等。

四、依赖与版本

dt-sql-parser 4.5.1 → 4.5.2-beta.0(CTE 实体信息由解析器侧提供),pnpm-lock.yaml 同步更新;package.json 版本 1.2.1 → 1.2.2-beta.0。

变更文件

文件 变更
website/src/languages/helpers/completionService.ts CTE / 脚本建表补全、isEntityName 校验、去重(+185 / -67)
AGENTS.md 新增仓库 agent 指引(+206)
CHANGELOG.md 补充 1.2.1 条目(+15)
package.json 版本号与 dt-sql-parser 依赖、deploy 远端
pnpm-lock.yaml 依赖锁同步

验证方式

website/ 目录下没有测试用例,该改动只能手工验证:

  1. 根目录 pnpm build(或保持 pnpm watch-esm 运行);
  2. cd website && pnpm install && pnpm dev;
  3. 在 playground 中依次确认:
    • WITH t AS (SELECT ...) SELECT * FROM | 能看到 CTE 名称 t;
    • FROM myCte(无别名)能补全出该 CTE 的列;
    • 脚本内 CREATE TABLE 后,后续语句能补全出该表名;
    • FROM orders JOIN t1 ON | 中表名不重复出现;
    • 制造语法错误(如 FROM 后直接接 JOIN)时,补全列表不出现 JOIN ... ORDER BY ... 这类整段子句文本。

已执行 prettier --check(覆盖 CI 的 check 任务),结果:All matched files use Prettier code style!。website/ 不在根 pnpm build / pnpm test 覆盖范围内,未跑其他校验。

@Cythia828
Cythia828 requested a review from liuxy0551 October 8, 2026 02:39
@Cythia828
Cythia828 force-pushed the feat/support_CTE_entity branch from 8f72ba4 to 3e367c3 Compare October 8, 2026 02:45

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant