可选的 SQL 策略扩展¶
Dosi 可以独立使用,也可以绑定请求级 SQL 策略实现。公开 Dosi 不依赖具体策略包。 配置了策略实现的请求必须成功加载并校验该实现;失败时拒绝编译和执行。
原生 CLI¶
安装与 Dosi 操作系统和 CPU 架构一致、实现 dosi_policy_plugin_v1 的可信动态库。
通过 dosi info --format json 查看原生 ABI 和 SQL AST schema 版本。
Python 扩展文件不能作为 CLI 策略动态库使用。
# connections.yaml
datasources:
warehouse:
type: duckdb
uri: data.duckdb
default: true
sql_policy:
library: plugins/libpolicy.so
config: policy.yaml
context: request.json
sql_policy.library、config 和可选的 context 路径相对于 connections 文件解析。
macOS 使用 .dylib,Windows 使用 .dll。配置与上下文是由具体策略实现解释的
YAML/JSON 对象;身份认证与角色管理由可信宿主负责。
也可以使用 --policy-library、--policy-config、--policy-context-file,或对应环境变量
DOSI_POLICY_LIBRARY、DOSI_POLICY_CONFIG、DOSI_POLICY_CONTEXT。
需要策略保护时,即使没有 --execute,编译也会打开选中的执行连接来读取元数据。
指标、明细、归因查询均使用受保护的编译接口,并在执行前验证绑定凭据。 策略实现接收完整 lowering 后的 SQL AST,可保护独立生成的子查询读取。 通用宿主不会对返回结果再次应用策略。
Python 宿主¶
policy、policy_required 参数按请求传入。策略实现可提供 bind_execution_host(host),
绑定 Dosi 实际使用的原生执行连接。宿主提供 context_json(连接提示)、target、
metadata_query(sql)(返回 JSON 对象行)和 verify_context();实际命名空间捕获、
物理表和列解析由策略实现负责。
指定连接的编译、执行、明细和归因查询均会先重新绑定策略。只编译的实现可提供
for_compilation();没有执行连接且无法安全获取元数据时,应拒绝编译。
没有策略时不加载实现、不进行策略元数据查询。POLICY_EXECUTION_HOST_VERSION
用于声明这一可选绑定能力。
实现策略扩展¶
dosi-policy-api 定义通用 Rust 接口、原生 ffi 模块和可选 dynamic 加载器。
公开宿主不包含私有依赖,包括可选 Cargo 私有依赖;策略实现可以单独分发。
原生 ABI v1 使用兼容 C 的结构体和带版本的 JSON。输入和宿主回调只在一次同步调用 内借用,不能保留。响应缓冲区必须由生产方提供的函数释放且只能释放一次。 动态库是可信原生代码;宿主在所有请求作用域释放后才卸载动态库。 ABI 或 AST schema 不匹配时,在绑定前拒绝加载。
元数据回调使用最终执行器执行内部元数据 SQL,避免重新进入策略改写。 策略实现负责验证命名空间变化,并通过该连接解析原生列元数据。 SQLite 存储提供只读的原生 SQLite 元数据连接以保留声明类型,业务 SQL 仍通过 DuckDB SQLite 扩展执行。