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.