跳到主要内容

函数描述

DuckDB 的 C 扩展 API 没有设置函数描述与示例的接口:duckdb_scalar_function_set_name、 _set_return_type、_set_varargs、_set_volatile…… 就到这儿,没有 _set_description, 也没有 _add_example。所以社区扩展页 (扩展列表) 上那张 Added Functions 表要是没人帮忙,就只是一列光秃秃的函数名。

这份文本紧挨着被描述的函数,写在 #[duck_*] 属性上(本扩展的两处分别在 functions/aggregate_html/html_returns.rs 与 html_prices.rs):

#[duck_aggregate_function(
description = "Renders one quantstats HTML report per symbol from a long table of periodic returns",
comment = "Groups by symbol internally, so the SQL needs no GROUP BY …",
examples = ["SELECT unnest(qs_html_reports(…)) FROM daily_returns", "…"]
)]

从属性到发布出去的那张表,链路是这样的:

三个键都可选(example 单条、examples 多条,二者互斥),不参与注册:宏只把它们连同注册名收进 inventory。导出:

just docs_csv # -> target/function_descriptions.csv
cargo run --bin duckfn -- function_descriptions --all # -> target/function_descriptions_all.csv
# (含还没写描述的函数,当清单用)

这一步不加载扩展、不查 catalog、也不需要 DuckDB 在场:纯粹读编译期记下来的东西,路径固定为项目的 target/ 下。src/bin/duckfn.rs 里那句 #[path = "../extension/mod.rs"] mod extension; 是必需的 —— inventory 的静态构造器只在真正被链接进最终二进制的目标文件里生效,改成 use duckfn_quantstats::… 的话 CSV 会静默变空(不报错,只是没内容)。

文本本身还有三条规矩:多条示例导出时用 "; " 拼接、每条去掉结尾分号;换行会压成一个空格(生成页是 Markdown 表格,单元格里的换行会断行);逗号、引号与非 ASCII 原样通过。所以照「一句一条完整 SQL」 写即可。文案一律英文 —— 它会被原样贴到文档页上。

发社区扩展时,把这份 CSV 放进 community-extensions 仓的 extensions/duckfn_quantstats/docs/function_descriptions.csv(它由那个仓的 generate_md.sh 按 function_name 左连接覆盖函数表);本仓不必留副本,改完代码重新生成即可。见 社区扩展。