2025-11-12
Ankündigung: DuckDB 1.4.2 LTS
The DuckDB team
In diesem Blogbeitrag heben wir einige wichtige Fixes und Komfortverbesserungen in DuckDB v1.4.2 hervor, dem zweiten Patch-Release der DuckDB-1.4-LTS-Linie. Die vollständige Liste der Updates steht in den Release Notes auf GitHub.
Obwohl das ein Patch-Release ist, liefern wir einige kleine Features. In LTS-Releases können die in zwei Formen kommen:
- Wir fügen kleine Opt-in-Features hinzu, etwa Zugriff auf die Profiler-Ausgabe über den Logger in diesem Release. Diese Features waren in der Community stark nachgefragt, und wir sind zuversichtlich, dass sie beim Upgrade auf das neueste Release keine Probleme verursachen. Vorsichtig eingesetzt können sie helfen, Performance-Regressionen zu erkennen und zu verstehen.
- Einige DuckDB-Extensions, die als „experimental“ markiert sind, liefern vollwertige Features. So haben wir zum Beispiel Unterstützung für Iceberg-Deletes und -Updates ausgerollt. Extensions sind von Natur aus opt-in: Wer bei Kern-DuckDB und seinen stabilen Extensions bleibt, wird von Änderungen in experimentellen Extensions nicht in der Stabilität der Installation betroffen.
Zur Installation der neuen Version besuchen Sie bitte die Installationsseite. Hinweis: Es kann Stunden bis Tage dauern, bis einige Client-Bibliotheken (z. B. R, Rust) erscheinen, wegen der zusätzlichen Änderungen und Review-Runden.
Features und Verbesserungen
Iceberg-Verbesserungen
Ähnlich wie im v1.4.1-Release-Blogbeitrag können wir mit guten Nachrichten für unsere Iceberg-Nutzerinnen und -Nutzer beginnen: DuckDB v1.4.2 bringt eine Reihe von Verbesserungen für die iceberg-Erweiterung. Insert-, Update- und Delete-Anweisungen werden jetzt alle unterstützt:
Klicken Sie, um das SQL-Codebeispiel für Iceberg-Updates zu sehen.
```sql ATTACH '⟨warehouse_name⟩' AS iceberg_catalog ( TYPE iceberg, ⟨other options⟩ );CREATE TABLE iceberg_catalog.default.simple_table (col1 INTEGER, col2 VARCHAR);
INSERT INTO iceberg_catalog.default.simple_table VALUES (1, ‘hello’), (2, ‘world’), (3, ‘duckdb is great’);
DELETE FROM iceberg_catalog.default.simple_table WHERE col1 = 2;
UPDATE iceberg_catalog.default.simple_table SET col1 = col1 + 5 WHERE col1 = 1;
</details>
<!-- markdownlint-enable MD040 -->
Wir werden in Kürze einen eigenen Blogbeitrag zu diesen Verbesserungen veröffentlichen. Bleiben Sie dran!
### Logger- und Profiler-Verbesserungen
#### HTTP-Requests zeitlich erfassen
Der Logger kann jetzt die Dauer von HTTP-Requests loggen ([`#19691`](https://github.com/duckdb/duckdb/pull/19691)).Wenn wir zum Beispiel die niederländische Bahn-Tariftabelle als Parquet-Datei abfragen ([`tariffs.parquet`](https://blobs.duckdb.org/tariffs.parquet)),sehen wir mehrere HTTP-Requests: einen `HEAD`-Request und drei `GET`-Requests:
```sqlCALL enable_logging('HTTP');CREATE TABLE railway_tariffs AS FROM 'https://blobs.duckdb.org/tariffs.parquet';SELECT request.type, request.url, request.duration_msFROM duckdb_logs_parsed('HTTP');┌─────────┬──────────────────────────────────────────┬─────────────┐│ type │ url │ duration_ms ││ varchar │ varchar │ int64 │├─────────┼──────────────────────────────────────────┼─────────────┤│ HEAD │ https://blobs.duckdb.org/tariffs.parquet │ 177 ││ GET │ https://blobs.duckdb.org/tariffs.parquet │ 103 ││ GET │ https://blobs.duckdb.org/tariffs.parquet │ 176 ││ GET │ https://blobs.duckdb.org/tariffs.parquet │ 182 │└─────────┴──────────────────────────────────────────┴─────────────┘Zugriff auf die Profiler-Ausgabe über den Logger
Der Logger kann jetzt auch auf die Profiler-Ausgabe zugreifen (#19572).
Das heißt: Wenn Profiler und Logger aktiviert sind, können Sie Informationen wie die Ausführungszeit von Abfragen loggen:
-- Enable profiling to JSON file-- This is necessary to make sure that queries are profiledPRAGMA profiling_output = 'profiling_output.json';PRAGMA enable_profiling = 'json';
-- Enable logging to an in-memory tableCALL enable_logging();
-- Run some queriesCREATE TABLE small AS FROM range(1_000_000);CREATE TABLE large AS FROM range(1_000_000_000);
PRAGMA disable_profiling;
SELECT query_id, type, metric, value::DECIMAL(15, 3) AS valueFROM duckdb_logs_parsed('Metrics')WHERE metric = 'CPU_TIME';In der Ausgabe sehen Sie, dass die erste CREATE-Anweisung etwa 3 Millisekunden gedauert hat, die zweite 3,3 Sekunden.
┌──────────┬─────────┬──────────┬───────────────┐│ query_id │ type │ metric │ value ││ uint64 │ varchar │ varchar │ decimal(15,3) │├──────────┼─────────┼──────────┼───────────────┤│ 8 │ Metrics │ CPU_TIME │ 0.003 ││ 9 │ Metrics │ CPU_TIME │ 3.267 │└──────────┴─────────┴──────────┴───────────────┘Profiler-Metriken
Der Profiler unterstützt jetzt mehrere neue Metriken. Damit verstehen Sie tiefer, wo die Ausführungszeit in Abfragen hingeht.
Performance-Verbesserungen
DuckDB v1.4.2 bringt auch kleine Performance-Verbesserungen:
#19477DuckDB now buffers WAL index deletes, not only appends#19644Detaching from a database is now faster
Vortex-Unterstützung
DuckDB unterstützt jetzt das Vortex-Dateiformat über die vortex-Erweiterung auf Linux und macOS.
Um vortex zu nutzen, zuerst die Erweiterung installieren und laden:
INSTALL vortex;LOAD vortex;Dann können Sie Vortex-Dateien so schreiben:
COPY (SELECT * FROM generate_series(0, 3) t(i))TO 'my.vortex' (FORMAT vortex);Und sie mit der Funktion read_vortex lesen:
SELECT * FROM read_vortex('my.vortex');┌───────┐│ i ││ int64 │├───────┤│ 0 ││ 1 ││ 2 │└───────┘Fixes
Wir haben eine Schwachstelle, mehrere Abstürze, interne Fehler, falsche Ergebnisse und Regressionen behoben. Außerdem haben wir mehrere Issues behoben, die unser Fuzzer entdeckt hat.
Schwachstellen
Wir haben vier Schwachstellen in DuckDBs Datenbankverschlüsselung behoben:
- DuckDB kann auf einen unsicheren Zufallszahlengenerator (
pcg32) zurückfallen, um kryptografische Schlüssel oder IVs zu erzeugen. - Beim Löschen von Schlüsseln aus dem Speicher kann der Compiler das memset() entfernen und sensible Daten auf dem Heap hinterlassen
- Durch Änderung des Datenbank-Headers könnte ein Angreifer den Verschlüsselungsmodus von GCM auf CTR herabstufen, um Integritätsprüfungen zu umgehen.
- Fehlende Prüfung des Rückgabewerts beim Aufruf von OpenSSL
rand_bytes().
Details stehen im Security Advisory.
Wenn Sie Datenbankverschlüsselung nutzen, raten wir dringend zum Update auf DuckDB v1.4.2.
Wir danken Greg Rubin und Sławek Kosowski für die Meldung dieser Schwachstellen!
Abstürze und interne Fehler
#19238MERGE INTOIceberg table withTIMESTAMPTZcolumns crashes#19355Unknown expression type invalidates database#19357Expected unified vector format of typeVARCHAR, but found typeINT32#19455MERGE INTOfailed: logical operator type mismatch#19498Window function crash withpdqsort_loop#19700RLE select bug
Falsche Ergebnisse
#17757UUID Comparison in aggregation filter broken on Linux#19327Wrong result forDISTINCTandLEFT JOIN#19377Array with values shows null depending on query
Regressionen
Storage
#19424Fix issue in MetadataManager triggered when doing concurrent reads while checkpointing#19527Ensure that DuckDB outputs the expectedSTORAGE_VERSION#19543Error when settingforce_compression = 'zstd'in an in-memory environment database