Skip to content

Conversation

@JackWang032
Copy link
Collaborator

@JackWang032 JackWang032 commented Dec 17, 2025

当输入的SQL不完整时,特别是没有输入字段或者输入了表名table1.<empty>时,会导致语法解析错误恢复失败,最终的语法解析树无法作为实体收集的参考模板, 实体收集失败。

如在MySQL中输入SELECT t1. FROM t1,没法收集到任何实体,那么就没法去提供对应的补全
image

我们已在 grammar 中对 columnName 添加了{this.shouldMatchEmpty()}? 语义谓词分支的支持,使在实体收集时能够匹配空字段,但这仅能覆盖一小部分情况,当where、order by、join on等场景时(会匹配 expression )无效,并且输入点时也无法命中。

一般来说 grammar 中将字段拆分成了 columnNamecolumnNamePath 两个规则, columnName在select item中匹配,columnNamePath 在表达式中匹配。

目前有两种方法利用语义谓词解决该问题:

方案一

columnNamePath也添加空字段的语义谓词分支,但该方式会导致比较多的语法校验单测失败(语义谓词分支会影响预测,即使该语义谓词分支没有匹配上),影响范围也没法确定。目前PGSQL尝试使用了该方式。

方案二

最小化改动原则(当前尝试的方式),在具体规则(where、 order by、 join on等)后添加语义谓词,基本不会导致现有的单测报错。

如果采用方案一,其表现效果很好,但需要深入分析下语义谓词对antlr4 预测、错误恢复等阶段的影响,避免其影响到非实体收集上下文时的功能。
如果采用方案二,需要处理很多不同 expression下的场景,如需要处理 join ... on t1.id = t2.id中 比较操作符=可能会嵌套递归的情况

使用语义谓词后语法解析树基本能保证完整
image

Preview地址 https://jackwang032.github.io/monaco-sql-languages/

@JackWang032 JackWang032 marked this pull request as draft December 17, 2025 11:32
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.

2 participants