ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

dbx 的 Doris 与 SelectDB SQL 函数辅助:从函数目录生成到补全、签名提示与语义建模

dbx 的 Doris 与 SelectDB SQL 函数辅助:从函数目录生成到补全、签名提示与语义建模 dbx 的 Doris 与 SelectDB SQL 函数辅助从函数目录生成到补全、签名提示与语义建模【免费下载链接】dbx20 MB lightweight cross-platform database client for 90 databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90 数据库提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。项目地址: https://gitcode.com/gh_mirrors/dbx7/dbx导读本文围绕 dbx 桌面端apps/desktop内置的Doris 与 SelectDB SQL 函数辅助功能展开它如何从 Apache Doris 官方文档站点自动提取 496 个 SQL 函数的目录与签名如何把这些目录注入 SQL 编辑器的函数补全、签名提示Signature Help和语义分析以及如何让 SelectDB、StarRocks 等 Doris 兼容系连接复用同一套辅助能力。读完本文你将理解该功能的完整数据链路生成脚本 → 生成产物 → 运行时消费并掌握如何自行重新生成、验证与排查这套函数目录。该功能的官方说明位于 apps/desktop/src/lib/sql/doris/README.md本文以其为主体结合仓库源码与测试用例展开深入讲解。功能概览Doris 系连接的 SQL 辅助能力DorisApache Doris与 SelectDB 是两款高度 MySQL 兼容的 OLAP 数据库。dbx 在为这类连接提供 SQL 编辑体验时不能简单套用 MySQL 的函数库——Doris 拥有大量自有函数BITMAP_UNION_COUNT、HLL_UNION_AGG、EXPLODE_SPLIT、PERCENTILE_APPROX、DATE_TRUNC等这些函数在 MySQL 中并不存在。为此dbx 在 apps/desktop/src/lib/sql/doris/ 目录下维护了一套完整的 Doris 函数辅助体系包含三个层次文件角色README.md功能说明与再生成指引本文主体functions.generated.json生成产物496 个函数的目录、签名与文档链接functions.ts运行时消费层把 JSON 目录解析为补全/提示用的数据结构从源码结构看该目录的职责非常单一目录数据全部来自生成脚本运行时只做解析与注入不维护任何手写的函数清单仅有一个针对JSON_EXTRACT_STRING的兼容性补丁见下文。目录来源Apache Doris 官方 SQL 手册README 明确说明函数目录派生自 Apache Doris 2.1 与 3.x 版本的 SQL 手册The function catalogue is derived from the Apache Doris 2.1 and 3.x SQL manuals。这一点在生成产物中有直接证据functions.generated.json 的根级元数据记录了{ source: https://github.com/apache/doris-website, revision: b28541fb0fc91425ab97c8324af5abd0f72d1ef0, license: Apache-2.0 }也就是说目录数据来自 Apache 官方文档仓库 [apache/doris-website]Apache License 2.0并精确记录到生成时的 Git 提交revision保证目录可追溯、可复现。再生成流程从 doris-website 检出重建目录README 给出了再生成命令node scripts/generate-doris-functions.mjs /path/to/doris-website其中/path/to/doris-website是本地 Apachedoris-website仓库检出路径。该脚本位于 scripts/generate-doris-functions.mjs其完整处理流水线如下输入校验从process.argv[2]读取 docs 根目录缺失时直接报错退出Usage: node scripts/generate-doris-functions.mjs /path/to/doris-website。记录修订号通过git -C docsRoot rev-parse HEAD获取 doris-website 检出的当前提交写入产物revision字段。递归收集 Markdown 文档递归扫描versioned_docs/version-2.1/sql-manual/sql-functions与versioned_docs/version-3.x/sql-manual/sql-functions下所有.md文件。解析 frontmatter 与签名读取每个文档的 YAML frontmatter 提取函数名title转为大写过滤掉 draft、OVERVIEW页面以及combinators/目录下的内容再从## Syntax章节中提取代码块与行内代码用括号配对算法截取完整的函数调用签名。归类与拼接文档链接以相对路径生成category如scalar-functions/numeric-functions与官方文档 URLhttps://doris.apache.org/docs/version/sql-manual/sql-functions/path/。合并 2.1 与 3.x 两版以 3.x 为主表按函数名合并 2.1 的定义生成documentedIn覆盖标记仅存在于 2.1 的函数也保留标记为[2.1]。排序输出按函数名en 排序写入apps/desktop/src/lib/sql/doris/functions.generated.json并打印生成统计。当前产物规模与覆盖标记对当前仓库中的生成产物做统计见 functions.generated.json函数总数496 个documentedIn分布466 个函数同时被 2.1 与 3.x 手册记录24 个仅见于 3.x6 个仅见于 2.1函数类别分布category字段日期时间函数 90、字符串函数 72、数值函数 42、聚合函数 48、数组函数 48、位图函数 27、JSON 函数 30、IP 函数 23、空间函数 20、加密摘要函数 15、表函数 11、表值函数 14、窗口函数 10以及位运算、条件、HLL、Map、Quantile、Struct、System 等其他类别。关于documentedIn字段的语义README 特意强调了一处易误解点documentedInrecords documentation coverage, not a minimum server version: the 3.x manuals also contain functions added after 3.0.即documentedIn表示该函数在哪些版本的官方手册中“有文档记录”并不表示函数的最低服务器版本要求——3.x 手册同样收录了 3.0 之后新增的函数。因此在阅读产物时不能把[3.x]误读为“需要 Doris 3.x 才能用”它只说明官方文档已覆盖。运行时消费从 JSON 目录到补全与签名提示生成产物不能直接用于补全需要经过 functions.ts 的解析层。其关键逻辑类型定义DorisFunctionDefinition接口包含name、category、signatures、docs、documentedIn五个字段与生成产物的函数条目一一对应。splitParameters按逗号拆分参数同时追踪( )、 、[ ]三层括号深度深度为 0 时才在逗号处切分——这保证MAPSTRING,INT、ARRAYINT这类泛型类型不会被误拆。parameterName从占位符中提取参数名清理成合法的标识符空格转_剔除非法字符空则回退为argN例如签名ABS(x)得到参数名x。parametersFor取第一条含(的签名提取括号内参数列表过滤...最终产出补全占位符所需的参数名数组。导出三个运行时数据结构DORIS_FUNCTION_DEFINITIONS完整定义数组DORIS_FUNCTION_SIGNATURESMap函数名, 参数名数组供补全插入与签名提示使用DORIS_FUNCTION_DOCSMap函数名, 分类 · 文档链接供补全项的描述展示。兼容性补丁JSON_EXTRACT_STRINGfunctions.ts 中还内置了一个手工兼容性补丁const compatibilityOverrides: DorisFunctionDefinition[] [ { name: JSON_EXTRACT_STRING, category: JSON, signatures: [JSON_EXTRACT_STRING(json_string, path)], docs: Extracts a string value from a JSON string by path., documentedIn: [Apache Doris JSON function compatibility], }, ];该函数以Apache Doris JSON 函数兼容性的名义补充进目录且仅在目录中不存在同名函数时追加if (!DORIS_FUNCTION_DEFINITIONS.some(...))避免与自动生成的定义冲突。这一设计体现了自动生成 少量手工兜底的双轨策略。接入 SQL 编辑器补全注册、描述与签名帮助函数目录最终注入 SQL 补全系统。核心入口是 apps/desktop/src/lib/sql/sqlCompletion.tsimport { DORIS_FUNCTION_DOCS, DORIS_FUNCTION_SIGNATURES } from /lib/sql/doris/functions; ... const DATABASE_FUNCTION_SIGNATURES: PartialRecordDatabaseType, Mapstring, string[] { ... doris: DORIS_FUNCTION_SIGNATURES, starrocks: DORIS_FUNCTION_SIGNATURES, };从源码可以看出doris 与 starrocks 两种数据库类型共用同一套 Doris 函数签名表同文件中还定义了DORIS_FUNCTION_DESCRIPTIONS new Map(DORIS_FUNCTION_DOCS)把分类 · 文档链接作为补全项的说明文字description展示给用户鼠标悬停即可看到函数所属分类与官方文档地址。补全项的插入形式Doris 函数的补全项以函数补全项type: function形式提供apply内容包含完整调用前缀例如BITMAP_UNION_COUNT(。其参数占位符由DORIS_FUNCTION_SIGNATURES中的参数名数组生成用户在补全后可直接 Tab 跳转填写参数。签名帮助Signature Help补全之外getSqlFunctionSignatureHelp使用同一份签名数据提供函数签名帮助当光标位于BITMAP_UNION_COUNT(括号内时编辑器会弹出该函数的形式参数说明。其覆盖范围同样包括 Doris/StarRocks/SelectDB。连接路由SelectDB 与 StarRocks 如何共享 Doris 辅助README 中有一句关键说明SelectDB connections use the Doris capability family throughjdbcDialect.ts.SelectDB 连接通过jdbcDialect.ts复用 Doris 能力族。在 apps/desktop/src/lib/database/jdbcDialect.ts 中有对应实现if (profile doris || profile selectdb) return doris;即当连接的驱动 profile 为doris或selectdb时其有效数据库类型effectiveDatabaseType被归并为doris从而自动获得完整的 Doris 函数补全、语义方言与各类数据库能力。这一归并逻辑被测试 apps/desktop/src/lib/tests/sql/dorisCompletion.spec.ts 显式验证it.each([doris, selectdb])(routes the %s profile to Doris assistance, (driver_profile) { expect(effectiveDatabaseTypeForConnection({ db_type: mysql, driver_profile })).toBe(doris); });注意db_type为mysql、driver_profile为selectdb的连接其辅助能力仍路由到 Doris——这正是MySQL 兼容协议、Doris 能力族这一设计意图的体现。Doris 语义方言标识符、注释与 LATERAL VIEW除函数补全外Doris 在 SQL 语义层也有独立方言。在 apps/desktop/src/lib/sql/semantic/dialect.ts 中doris: { id: doris, identifierQuotes: [ { open: , close: }, { open: , close: }, ], supportsAsForTableAlias: true, projectionAliasVisibility: { where: false, groupBy: true, having: true, orderBy: true }, normalizeIdentifier: defaultNormalize, quoteIdentifier: (identifier) quoteWith(identifier, ), qualifierRole: roleForMysqlLikeQualifier, },该适配器定义了 Doris 的标识符引用方式反引号与双引号均可用默认以反引号包裹投影别名可见性WHERE中不可用别名GROUP BY/HAVING/ORDER BY中可用——与 MySQL 系行为一致限定符角色解析复用 MySQL 风格catalog 维度按schema处理。在方言选择上dialect.ts 中有两条关键规则sqlReferenceAnalysisDialectFordatabaseType为doris或starrocks时返回doris不回退到 MySQLsqlSemanticDialectFor即使编辑器传入的 dialect 是mysqlDoris 连接在 CodeMirror 层走 MySQL 回退方言databaseType为doris/starrocks时仍强制选用 doris 适配器——源码注释明确说明这是为了不让 mysql 方言掩盖 Doris 的LATERAL VIEW建模等能力。Doris 语法的一个显著特征是#行注释。测试用例验证了这一点见 dorisCompletion.spec.tsit(treats # as a line comment for Doris, () { const tokens tokenizeSqlSemantic(SELECT 1 # trailing note\nFROM t, doris); expect(tokens).toContainEqual(expect.objectContaining({ kind: comment, text: # trailing note })); });LATERAL VIEW 的表函数建模Doris 使用LATERAL VIEW explode(...)将数组/Map 展开为多行。dbx 的语义模型把每个LATERAL VIEW的输出建模为表函数行源kind: table_function并支持链式 LATERAL VIEW多个视图依次展开以及LATERAL VIEW OUTER形式it(models chained LATERAL VIEW outputs as local columns, () { const sql SELECT e, part FROM events t LATERAL VIEW explode(t.tags) a AS e LATERAL VIEW explode_split(t.name, ,) b AS part; const model buildSqlSemanticModel(sql, sql.indexOf(e,) 1, { databaseType: doris, dialect: doris }); expect(model.rowSources).toEqual(expect.arrayContaining([...])); });这意味着在编辑器中explode/explode_split展开出的列如e、part会被识别为当前行的局部列参与后续补全与解析。测试验证Doris 辅助功能的质量保障Doris 辅助功能有专门的测试套件 apps/desktop/src/lib/tests/sql/dorisCompletion.spec.ts覆盖以下关键场景测试点验证内容profile 路由doris、selectdbprofile 均路由到 Doris 辅助函数补全与签名帮助BITMAP_UNION_COUNT、HLL_UNION_AGG、ARRAY_MAP、JSON_EXTRACT_STRING、DATE_TRUNC、PERCENTILE_APPROX、EXPLODE_SPLIT均产出可插入的补全项与签名帮助排序优先级匹配的列名排在函数前缀匹配之前bitmap_value优先于BITMAP_UNION_COUNT方言保持databaseType: doris时解析方言为 doris 而非 mysql链式 LATERAL VIEW多个LATERAL VIEW的输出建模为局部列编辑器方言形态编辑器传入 mysql 回退方言时doris 适配器不被掩盖#注释Doris 下#被识别为行注释LATERAL VIEW OUTER与普通形式同等建模此外databaseFeatureSupport.ts 中driverProfile doris || driverProfile selectdb || driverProfile starrocks的判定以及 dorisCatalogCapability.spec.ts 中catalog 能力的测试进一步表明 Doris 系连接在整个客户端对象浏览器、用户管理、数据迁移等中均按统一能力族处理。实战如何更新与验证 Doris 函数目录如果你想在本地同步最新的 Doris 官方函数文档操作步骤如下准备 doris-website 检出克隆 Apachedoris-website仓库并切换到包含versioned_docs/version-2.1与versioned_docs/version-3.x的版本分支注意该仓库采用版本化文档目录结构。执行生成脚本node scripts/generate-doris-functions.mjs /path/to/doris-website检查输出脚本会打印Generated N Doris functions from revision并将结果写入 apps/desktop/src/lib/sql/doris/functions.generated.json。验证集成运行 Doris 辅助测试套件确认补全、签名帮助与语义建模行为未回归pnpm vitest run apps/desktop/src/lib/__tests__/sql/dorisCompletion.spec.ts核对元数据确认产物的source、revision、license字段与所用 doris-website 检出一致保证目录可追溯。小结dbx 的 Doris 与 SelectDB SQL 函数辅助是一条官方文档 → 生成脚本 → JSON 产物 → 运行时补全/语义的完整数据链路数据可信目录派生自 Apache Doris 2.1/3.x 官方 SQL 手册Apache License 2.0并记录源仓库 revision自动可再生成一条命令即可从 scripts/generate-doris-functions.mjs 重建 496 个函数的目录语义清晰documentedIn只表示文档覆盖范围而非最低版本要求能力复用SelectDB、StarRocks 通过 jdbcDialect.ts 路由到同一套 Doris 能力族质量有保障dorisCompletion.spec.ts 覆盖了补全、签名帮助、方言选择与 LATERAL VIEW 建模等关键行为。如果你正在使用 Doris、SelectDB 或 StarRocks 连接编写 SQL本套辅助能让BITMAP_UNION_COUNT、HLL_UNION_AGG、EXPLODE_SPLIT等 Doris 专有函数获得与主流数据库一致的补全与提示体验。【免费下载链接】dbx20 MB lightweight cross-platform database client for 90 databases, including MySQL, PostgreSQL, SQLite, Redis, MongoDB, DuckDB, SQL Server, and Dameng. Built-in AI, MCP Server, CLI, desktop and Docker. | 轻量级跨平台数据库管理工具支持 MySQL、PostgreSQL、SQLite、Redis、MongoDB、达梦等 90 数据库提供桌面端、Docker、CLI、内置 AI 助手和 MCP Server。项目地址: https://gitcode.com/gh_mirrors/dbx7/dbx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表