Repository navigation
feat: SQL 查询结果支持按来源分析补全字段注释 - #428
Merged
feigeCode merged 1 commit intoOct 20, 2026
Merged
Conversation
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
「设置 - 列头显示字段注释」开关此前只对「表数据」页签生效:打开表能看到字段注释,
但通过「新建查询」执行 SQL 得到的结果列始终没有注释。
本次改动让该开关同时覆盖表数据与 SQL 查询结果,并通过 SQL 来源分析(column
lineage)把结果列可靠地映射回源表字段,重点解决 join、CTE、列别名、表达式/函数
等查询无法显示注释的问题。
实现思路
新增一个基于
sqlparserAST 的保守型来源分析模块,从 SELECT 语句推导每个结果列对应的基表字段;执行查询后再按分析结果并发拉取相关表的列元数据,把注释贴回结果
列。无法唯一确定来源时宁可不显示,避免出现错误注释。
来源分析
join:限定列u.id、db.table.col/schema.table.col;非限定列在所有候选表中唯一存在时才继承注释
SELECT name AS label仍映射回nameSELECT */u.*按源表列顺序展开UPPER(name)、SUM(amount)、COUNT(DISTINCT name)等只引用一个源字段的表达式继承该字段注释
price * qty)、常量、多来源表达式不显示注释SELECT * EXCLUDE、表函数等结构标记为「分析不完整」,退化为按列名唯一匹配的保守兜底
注释解析策略
性能与时机
join_all并发读取,单表失败不影响其它表主要改动
crates/db/src/result_column_lineage.rs(新增)结果列来源分析模块:
ResultColumnLineage/ResultColumnSource/ColumnReference公共数据结构Analyzer内部实现:作用域解析、CTE/派生表展开、通配符展开、表达式引用收集analyze_sql_lineage入口,解析失败或非 SELECT 语句返回Nonecrates/db/src/lib.rs/crates/db/src/plugin.rsDatabasePlugin新增默认方法analyze_result_column_lineage,复用各插件已有的sql_dialect(),无需逐个数据库实现crates/db_view/src/table_data/data_grid.rsload_sql_result_column_comments:SQL 结果页签补全注释的入口load_lineage_table_columns_on_runtime:并发获取多张基表的列元数据resolve_result_column_comments/resolve_reference_comment/resolve_column_comments_by_name:按来源映射注释及保守兜底load_data_with_sql刷新路径同步支持注释补全,并保持 generation 校验防止过期回写sql_result_needs_schema_meta及其测试crates/db_view/src/table_data/results_delegate.rsset_column_comments:只更新列注释,保留结果集自带的列类型信息crates/db_view/src/sql_result_tab.rsload_sql_result_column_comments兼容性说明
测试
新增 16 个单元测试:
单字段函数、多字段表达式、UNION、递归 CTE
不显示、单字段表达式继承、分析不完整时按列名兜底、元数据缺失时不显示
测试结果:
cargo test -p db --lib:1363 passedcargo test -p db_view --lib:950 passedcargo check -p db_view --tests:通过手动验证建议
SELECT * FROM usersSELECT u.id, u.name AS user_name FROM users uSELECT u.id, o.amount FROM users u JOIN orders o ON u.id = o.user_idWITH recent AS (SELECT id, name FROM users) SELECT name FROM recentSELECT t.n FROM (SELECT name AS n FROM users) tSELECT UPPER(name) FROM users(应继承name注释)SELECT price * qty FROM items(不应显示注释)SELECT id FROM users u JOIN orders o ON u.id = o.user_id(歧义列不应显示注释)