Zum Inhalt springen

Erweiterungen

Das (dynamische) Laden von Erweiterungen in DuckDB-Wasm orientiert sich am regulären Laden von Erweiterungen in DuckDB, mit einigen relevanten Unterschieden aufgrund der anderen Plattform.

Format

Erweiterungen in DuckDB sind Binärdateien, die dynamisch über dlopen geladen werden. An die Binärdatei wird eine kryptografische Signatur angehängt. Eine Erweiterung in DuckDB-Wasm ist eine reguläre Wasm-Datei, die dynamisch über Emscriptens dlopen geladen wird. Eine kryptografische Signatur wird als WebAssembly-Custom-Section namens duckdb_signature an die Wasm-Datei angehängt. Dadurch bleibt die Datei eine gültige WebAssembly-Datei.

Derzeit muss diese Custom Section die letzte sein; das kann in Zukunft möglicherweise gelockert werden.

INSTALL und LOAD

Die Semantik von INSTALL in nativen DuckDB-Einbettungen besteht darin, Daten abzurufen, aus gzip zu entpacken und auf der lokalen Festplatte zu speichern. Die Semantik von LOAD in nativen DuckDB-Einbettungen besteht darin, (optional) Signaturprüfungen durchzuführen und die Binärdatei dynamisch mit der DuckDB-Hauptbinärdatei zu laden.

In DuckDB-Wasm ist INSTALL ein No-Op, da es keinen dauerhaften sitzungsübergreifenden Speicher gibt. Die Operation LOAD holt die Datei (und entpackt sie on the fly), führt Signaturprüfungen durch und lädt dynamisch über die Emscripten-Implementierung von dlopen.

Autoloading

Autoloading, also die Möglichkeit für DuckDB, Erweiterungsfunktionalität on-the-fly hinzuzufügen, ist in DuckDB-Wasm standardmäßig aktiviert.

Liste der offiziell verfügbaren Erweiterungen

Name der Erweiterung Beschreibung Aliase
autocomplete Fügt Autovervollständigung in der Shell hinzu
excel Fügt Unterstützung für Excel-ähnliche Formatstrings hinzu
fts Fügt Unterstützung für Full-Text-Search-Indizes hinzu
icu Fügt Unterstützung für Zeitzonen und Kollationen über die ICU-Bibliothek hinzu
inet Fügt Unterstützung für IP-bezogene Datentypen und Funktionen hinzu
json Fügt Unterstützung für JSON-Operationen hinzu
parquet Fügt Unterstützung zum Lesen und Schreiben von Parquet-Dateien hinzu
sqlite Fügt Unterstützung zum Lesen von SQLite-Datenbankdateien hinzu sqlite, sqlite3
sqlsmith
tpcds Fügt TPC-DS-Datengenerierung und Abfrageunterstützung hinzu
tpch Fügt TPC-H-Datengenerierung und Abfrageunterstützung hinzu

WebAssembly ist im Wesentlichen eine zusätzliche Plattform, und es können plattformspezifische Einschränkungen bestehen, durch die einige Erweiterungen ihre nativen Fähigkeiten nicht vollständig abbilden oder auf andere Weise umsetzen. Relevante Unterschiede für von DuckDB gehostete Erweiterungen dokumentieren wir hier.

HTTPFS

Die HTTPFS-Erweiterung ist derzeit in DuckDB-Wasm nicht verfügbar. HTTPS-Protokollfähigkeiten müssen eine zusätzliche Schicht durchlaufen, den Browser, der sowohl Unterschiede als auch Einschränkungen gegenüber dem nativen Fall mitbringt.

Stattdessen hat DuckDB-Wasm eine eigene Implementierung, die für die meisten Zwecke austauschbar ist, aber nicht alle Anwendungsfälle unterstützt (da sie den vom Browser vorgegebenen Sicherheitsregeln wie CORS folgen muss). Aufgrund dieser CORS-Einschränkung müssen Anfragen nach Daten über die HTTPFS-Erweiterung an Websites gehen, die (über CORS-Header) der Website, die die DuckDB-Wasm-Instanz hostet, den Zugriff auf diese Daten erlauben. Die MDN-Website ist eine gute Quelle für weitere Informationen zu CORS.

Signatur von Erweiterungen

Wie bei regulären DuckDB-Erweiterungen werden DuckDB-Wasm-Erweiterungen standardmäßig bei LOAD geprüft, um die Signatur zu verifizieren und zu bestätigen, dass die Erweiterung nicht manipuliert wurde. Die Signaturprüfung von Erweiterungen kann über eine Konfigurationsoption deaktiviert werden. Die Signatur ist eine Eigenschaft der Binärdatei selbst; das Kopieren einer DuckDB-Erweiterung (etwa um sie von einem anderen Ort auszuliefern) behält daher eine gültige Signatur (z. B. für die lokale Entwicklung).

DuckDB-Wasm-Erweiterungen abrufen

Offizielle DuckDB-Erweiterungen werden unter extensions.duckdb.org bereitgestellt; das ist auch der Standardwert der Option default_extension_repository. Beim Installieren von Erweiterungen wird eine entsprechende URL aufgebaut, die etwa so aussieht: extensions.duckdb.org/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.gz.

DuckDB-Wasm-Erweiterungen werden nur beim Laden abgerufen, und die URL sieht so aus: extensions.duckdb.org/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm.

Beachten Sie, dass in der Ordnerstruktur ein zusätzliches duckdb-wasm eingefügt wird und die Datei als .wasm-Datei ausgeliefert wird.

DuckDB-Wasm-Erweiterungen werden mit Brotli-Kompression vorkomprimiert ausgeliefert. Beim Abruf aus einem Browser werden Erweiterungen transparent entpackt. Wenn Sie die duckdb-wasm-Erweiterung manuell abrufen möchten, können Sie curl --compress extensions.duckdb.org/<...>/icu.duckdb_extension.wasm verwenden.

Erweiterungen aus einem Drittanbieter-Repository ausliefern

Wie bei regulärem DuckDB werden bei SET custom_extension_repository = 'https://some.url.com' nachfolgende Ladevorgänge unter https://some.url.com/duckdb-wasm/$duckdb_version_hash/$duckdb_platform/$name.duckdb_extension.wasm versucht.

Beachten Sie, dass GET-Anfragen auf die Erweiterungen CORS-aktiviert sein müssen, damit ein Browser die Verbindung zulässt.

Tooling

Sowohl DuckDB-Wasm als auch seine Erweiterungen wurden mit der aktuellsten paketierten Emscripten-Toolchain kompiliert.