Query-farm/vgi-code

GitHub: Query-farm/vgi-code

一个基于 tree-sitter 的 DuckDB VGI worker,将源代码的符号、导入、注释等结构化解析能力引入 SQL 查询环境。

Stars: 0 | Forks: 0

Vector Gateway Interface (VGI)

一个用于 DuckDB 的 Query.Farm VGI worker。

# 使用 Tree-sitter 解析源代码 — DuckDB 中的符号、导入与注释 一个 [VGI](https://query.farm) worker(Rust 编写的编译二进制文件),它基于 Apache Arrow 将 **源代码结构** — 符号、导入、注释、字符串字面量、行数统计以及任意 [tree-sitter](https://tree-sitter.github.io/tree-sitter/) 查询 — 引入到 DuckDB / SQL 中。DuckDB 会启动该 worker 并通过 Arrow IPC 与其通信;这些函数将显示在 `code` catalog 下的 `main` schema 中。 解析由 [tree-sitter](https://crates.io/crates/tree-sitter) 和一组精心挑选的 grammar crate 提供支持。源代码被视为**文本**(永远不会被执行),并且 tree-sitter 是一个**具备错误恢复能力**的解析器,因此格式错误的输入会被尽最大努力进行解析,且永远不会导致 worker 崩溃。 ``` LOAD vgi; ATTACH 'code' (TYPE vgi, LOCATION './target/release/code-worker'); SET search_path = 'code.main'; -- Infer a language from a filename. SELECT language_of('main.rs'); -- → 'rust' -- Per-row analysis of a source column. SELECT path, count_functions(content, language_of(path)) AS fns, loc(content, language_of(path)) AS code_lines FROM files; -- One import per row. SELECT UNNEST(extract_imports(content, 'python')) FROM files; -- The power feature: run any tree-sitter query. SELECT UNNEST(ts_query(content, 'rust', '(function_item name: (identifier) @n)')) FROM files; -- Structural symbols of one document (table function). SELECT * FROM symbols('fn add(a:i32,b:i32)->i32{a+b}', 'rust'); -- kind | name | start_line | end_line -- function | add | 1 | 1 -- Arbitrary query matches as rows. SELECT * FROM ts_nodes('func A(){}', 'go', '(function_declaration) @f'); -- Discover what the worker can parse. SELECT * FROM supported_languages(); ``` ## 函数 ### 标量函数(仅限位置参数) | 函数 | 返回类型 | 描述 | | --- | --- | --- | | `language_of(filename)` | `VARCHAR` | 根据文件扩展名推断的语言(未知则为 `NULL`)。 | | `count_lines(source)` | `INT` | 物理总行数。 | | `loc(source, language)` | `INT` | 代码行数(LOC):非空行、非注释行。 | | `count_functions(source, language)` | `INT` | 函数 / 方法定义的数量。 | | `extract_imports(source, language)` | `VARCHAR[]` | import / use / require 语句。 | | `extract_comments(source, language)` | `VARCHAR[]` | 注释文本。 | | `extract_strings(source, language)` | `VARCHAR[]` | 字符串字面量文本。 | | `ts_query(source, language, query)` | `VARCHAR[]` | tree-sitter 查询捕获到的节点文本。 | | `code_version()` | `VARCHAR` | Worker 版本字符串。 | ### 表函数(常量参数,按位置传递) | 函数 | 列 | 描述 | | --- | --- | --- | | `symbols(source, language)` | `kind VARCHAR, name VARCHAR, start_line INT, end_line INT` | 函数、类、方法、结构体、枚举等。 | | `ts_nodes(source, language, query)` | `seq BIGINT, capture VARCHAR, text VARCHAR, start_line INT, end_line INT` | tree-sitter 查询的每一次捕获。 | | `supported_languages()` | `language VARCHAR` | worker 能够解析的语言 ID。 | ## 支持的语言 `rust`、`python`、`javascript`、`typescript`、`go`、`java`、`c`、`cpp`、`json`。 `language` 参数是一个字符串 ID(接受诸如 `py`、`js`、`c++` 之类的常见别名)。未知语言将明确报错。 ## 行为与健壮性 * 源代码是**文本**,永远不会被执行。 * tree-sitter 是一个**具备错误恢复能力**的解析器:格式错误或被截断的源代码会被尽最大努力进行解析,并返回任何能够找到的结构 — 永远不会导致崩溃。 * 输入是有**上限的**(每个源代码 16 MiB),以防御病态输入。 * `NULL` 输入 → `NULL` 输出(标量函数)或无数据行(表函数)。 * **未知语言**或**格式错误的 tree-sitter 查询**会导致明确的 DuckDB 错误(这两者都是调用者的错误,而非不可信的数据问题)。 ## 构建与测试 ``` cargo build --release # build the worker cargo test --workspace # unit + integration tests cargo clippy --all-targets --all-features -- -D warnings # lint cargo fmt --all -- --check # format check make test-sql # DuckDB SQL end-to-end ``` `make test-sql` 会构建 release 版本的 worker,将 `VGI_CODE_WORKER` 指向它,并在 `test/sql/` 下运行 [`haybarn-unittest`](https://pypi.org/project/haybarn-unittest/) sqllogictest 测试套件。只需使用 `uv tool install haybarn-unittest` 安装一次运行器即可。 ## 依赖项的开源许可 该 worker 采用 MIT 许可证(参见 [LICENSE](LICENSE))。`tree-sitter` 及所有 grammar crate (`tree-sitter-rust`、`-python`、`-javascript`、`-typescript`、`-go`、`-java`、 `-c`、`-cpp`、`-json`)均采用 MIT 许可证(少数为双重 MIT/Apache-2.0 许可),它们均与此项目的 MIT 许可证兼容。 ## 许可证 MIT — 参见 [LICENSE](LICENSE)。 ## 作者身份与许可证 由 [Query.Farm](https://query.farm) 编写。 版权所有 2026 Query Farm LLC - https://query.farm
标签:Apache Arrow, DuckDB, IPv6支持, Rust, Tree-sitter, 代码分析, 凭证管理, 可视化界面, 数据库扩展, 网络流量审计, 通知系统