DuckDB-Wasm的(动态)扩展加载是模仿常规DuckDB的扩展加载设计的,但由于平台的不同,存在一些相关的差异。
格式
DuckDB中的扩展是通过dlopen
动态加载的二进制文件。二进制文件附加了一个加密签名。
DuckDB-Wasm中的扩展是通过Emscripten的dlopen
动态加载的常规Wasm文件。Wasm文件附加了一个加密签名,作为WebAssembly自定义部分,称为duckdb_signature
。
这确保了文件仍然是一个有效的WebAssembly文件。
目前,我们要求这个自定义部分为最后一个部分,但这在未来可能会有所放宽。
INSTALL
和 LOAD
DuckDB 原生嵌入中的 INSTALL
语义是从 gzip
中获取、解压缩并将数据存储在本地磁盘上。
DuckDB 原生嵌入中的 LOAD
语义是(可选地)执行签名检查 并 动态加载与主 DuckDB 二进制文件一起的二进制文件。
在DuckDB-Wasm中,INSTALL
是一个无操作,因为没有持久的跨会话存储。LOAD
操作将获取(并在飞行中解压缩),执行签名检查 并且 通过 Emscripten 实现的 dlopen
动态加载。
自动加载
自动加载,即DuckDB能够动态添加扩展功能,在DuckDB-Wasm中默认启用。
官方可用扩展列表
扩展名称 | 描述 | 别名 |
---|---|---|
autocomplete | 在shell中添加自动完成支持 | |
excel | 添加对类似Excel格式字符串的支持 | |
fts | 增加对全文搜索索引的支持 | |
icu | 使用ICU库增加了对时区和排序规则的支持 | |
inet | 增加了对IP相关数据类型和函数的支持 | |
json | 添加对JSON操作的支持 | |
parquet | 添加了对读取和写入Parquet文件的支持 | |
sqlite | 增加对读取SQLite数据库文件的支持 | sqlite, sqlite3 |
sqlsmith | ||
substrait | 增加了对Substrait集成的支持 | |
tpcds | 添加TPC-DS数据生成和查询支持 | |
tpch | 添加TPC-H数据生成和查询支持 |
WebAssembly 基本上是一个额外的平台,可能存在特定平台的限制,使得一些扩展无法匹配其原生能力或以不同的方式执行。我们将在此记录与 DuckDB 托管的扩展相关的差异。
HTTPFS
目前,DuckDB-Wasm 中尚未提供 HTTPFS 扩展。Https 协议功能需要通过额外的层,即浏览器,这增加了与原生环境相比的差异和一些限制。
相反,DuckDB-Wasm 有一个独立的实现,在大多数情况下可以互换,但不支持所有用例(因为它必须遵循浏览器施加的安全规则,例如 CORS)。 由于这个 CORS 限制,使用 HTTPFS 扩展发出的任何数据请求必须针对允许(使用 CORS 头)托管 DuckDB-Wasm 实例的网站访问该数据的网站。 MDN 网站 是了解更多关于 CORS 信息的绝佳资源。
Extension Signing
与常规的DuckDB扩展一样,DuckDB-Wasm扩展在LOAD
时默认会检查签名,以确认扩展未被篡改。
可以通过配置选项禁用扩展签名验证。
签名是二进制文件本身的属性,因此复制DuckDB扩展(例如从不同位置提供服务)仍将保持有效的签名(例如,用于本地开发)。
获取 DuckDB-Wasm 扩展
官方的DuckDB扩展在extensions.duckdb.org
上提供,这也是default_extension_repository
选项的默认值。
在安装扩展时,将构建一个相关的URL,看起来像extensions.duckdb.org/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.gz
。
DuckDB-Wasm 扩展仅在加载时获取,URL 将类似于:extensions.duckdb.org/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm
。
请注意,文件夹结构中添加了一个额外的duckdb-wasm
,并且该文件以.wasm
文件的形式提供。
DuckDB-Wasm 扩展使用 Brotli 压缩进行预压缩。当从浏览器获取时,扩展将透明地解压缩。如果你想手动获取 duckdb-wasm
扩展,你可以使用 curl --compress extensions.duckdb.org/<...>/icu.duckdb_extension.wasm
。
从第三方仓库提供扩展
与常规的DuckDB一样,如果你使用SET custom_extension_repository = some.url.com
,后续的加载将会尝试在some.url.com/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm
进行。
请注意,浏览器需要启用CORS才能允许扩展的GET请求连接。
工具
DuckDB-Wasm 及其扩展已使用最新的打包 Emscripten 工具链进行编译。