Skip to content

fix: #478 column completion and incomplete SELECT validate#479

Open
Cythia828 wants to merge 1 commit into
DTStack:nextfrom
Cythia828:fix_related_table_columns
Open

fix: #478 column completion and incomplete SELECT validate#479
Cythia828 wants to merge 1 commit into
DTStack:nextfrom
Cythia828:fix_related_table_columns

Conversation

@Cythia828

@Cythia828 Cythia828 commented Jun 11, 2026

Copy link
Copy Markdown
Collaborator

相关issue

解决问题

解决了上面两个issue中描述的问题:
1、mysqlpgsqltrino JOIN...ON...关联语法后面无法提示字段列表
2、mysql SELECT age from orders WHERE age GROUP BY ORDER BY 语句中 ORDER BYGROUP BY后面无法提示字段
3、pgsqlSELECT FROM a这种情况下无法正常抛错
以上为客户需求中明确描述需要的功能

变更描述

  1. Mysql

变更1 — JOIN ON 空列路径
columnNamePath 新增 # columnNamePath_dot_empty:uid DOT emptyColumn,配合 shouldMatchEmpty() 仅在补全/实体收集模式匹配
columnNamePathAllowEmpty 重构:先走 columnNamePath,再走裸 emptyColumn
joinSpec 已有 columnNamePathAllowEmpty,配合上述规则支持 ON o.

变更 2 — ORDER BY / GROUP BY / HAVING 补全
orderByExpressiongroupByItemhavingClause 均增加 | columnNamePathAllowEmpty 分支(与 fromClause 中 WHERE 的处理对称)

变更 3 — 补全候选映射(mysql/index.ts)
preferredRules 加入 RULE_columnNamePathAllowEmpty
processCandidates 白名单:仅在 joinSpec / fromClause / orderByExpression / groupByItem / havingClause 上下文将候选识别为 COLUMN

变更 4 — 实体收集(mysqlEntityCollector.ts)
新增 exitColumnNamePath_dot_empty,在 o. 空列位置 push COLUMN 实体

  1. PGSQL

变更 1 — JOIN ON 空列路径
columnNamePath 新增 # columnNamePath_dot_empty(同 MySQL 思路)
postgreEntityCollector 增加 exitColumnNamePath_dot_empty
postgresql/index.tscolumnNamePathruleList 白名单中加入 RULE_joinQual

变更 2 — 不完整 SELECT 飘红(核心 validate 修复)
sqlExpressiontargetList? targetList 必填
targetList 允许空清单的条件(语义谓词):

  • isFollowedByInto():下一 token 为 INTO → 支持 SELECT DISTINCT ON (...) INTO ... FROM ...
  • isFollowedByEnd():下一 token 为 ; 或 EOF → 支持合法 SELECT;、SELECT INTO new_table;
    下一 token 为 FROM 时两个谓词均为 false → 必须有 targetEl → SELECT FROM ... 仍报错
    使用 PostgreSqlParser.KW_INTO / SEMI 静态常量(非 this.KW_INTO,避免 antlr4ng 实例上为 undefined)
  1. Trino

变更 1 — JOIN ON 专用解析路径
新增 joinColumnEquality / joinColumnReference 规则,支持 ON o. = u.
joinColumnReferenceidentifier DOT emptyColumn(仅 entityCollecting 时)或 columnName

变更 2 — 实体收集 vs validate 分流
joinCriteria:KW_ON (joinColumnEquality | {notEntityCollecting()}? booleanExpression)

  • 实体收集:走 joinColumnEquality,解析不完整 ON
  • validate:走 booleanExpression,不完整 ON 仍报错

变更 3 — 补全与 bugfix(trino/index.ts)
RULE_columnName 白名单增加 RULE_joinCriteria
补上缺失的 break,避免 case fall-through

预览地址

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

测试SQL

create table orders ( id BIGINT, age int, name VARCHAR ); create table t1 ( id1 BIGINT, age1 int, name1 VARCHAR ); SELECT o.age, u.age1 FROM orders o JOIN t1 u ON o. = u.;
create table orders ( id BIGINT, age int, name VARCHAR ); create table t1 ( id1 BIGINT, age1 int, name1 VARCHAR ); SELECT age FROM orders o where order by group by

@Cythia828 Cythia828 requested review from liuxy0551 and mumiao June 11, 2026 10:55
@Cythia828

Copy link
Copy Markdown
Collaborator Author

@liuxy0551 @mumiao 客户需求中涉及到这块内容,有空可尽快review

Comment thread src/parser/mysql/index.ts
candidateRule.ruleList.includes(MySqlParser.RULE_fromClause) ||
candidateRule.ruleList.includes(MySqlParser.RULE_orderByExpression) ||
candidateRule.ruleList.includes(MySqlParser.RULE_groupByItem) ||
candidateRule.ruleList.includes(MySqlParser.RULE_havingClause)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个 if 的判断条件写法可以优化下,将使用到的规则统一管理

const ALLOW_EMPTY_COLUMN_PARENT_RULES = new Set([
    MySqlParser.RULE_joinSpec,
    MySqlParser.RULE_fromClause,
    MySqlParser.RULE_orderByExpression,
    MySqlParser.RULE_groupByItem,
    MySqlParser.RULE_havingClause,
]);
if (candidateRule.ruleList.some((rule) => ALLOW_EMPTY_COLUMN_PARENT_RULES.has(rule))) {
    syntaxContextType = EntityContextType.COLUMN;
}

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