⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Extensions

DuckDB-Wasm的(动态)扩展加载是模仿常规DuckDB的扩展加载设计的,但由于平台的不同,存在一些相关的差异。

格式

DuckDB中的扩展是通过dlopen动态加载的二进制文件。二进制文件附加了一个加密签名。 DuckDB-Wasm中的扩展是通过Emscripten的dlopen动态加载的常规Wasm文件。Wasm文件附加了一个加密签名,作为WebAssembly自定义部分,称为duckdb_signature。 这确保了文件仍然是一个有效的WebAssembly文件。

目前,我们要求这个自定义部分为最后一个部分,但这在未来可能会有所放宽。

INSTALLLOAD

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 工具链进行编译。