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:

  1. 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.
  2. 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:
```sql
CALL enable_logging('HTTP');
CREATE TABLE railway_tariffs AS
FROM 'https://blobs.duckdb.org/tariffs.parquet';
SELECT request.type, request.url, request.duration_ms
FROM 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 profiled
PRAGMA profiling_output = 'profiling_output.json';
PRAGMA enable_profiling = 'json';
-- Enable logging to an in-memory table
CALL enable_logging();
-- Run some queries
CREATE 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 value
FROM 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:

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:

  1. DuckDB kann auf einen unsicheren Zufallszahlengenerator (pcg32) zurückfallen, um kryptografische Schlüssel oder IVs zu erzeugen.
  2. Beim Löschen von Schlüsseln aus dem Speicher kann der Compiler das memset() entfernen und sensible Daten auf dem Heap hinterlassen
  3. Durch Änderung des Datenbank-Headers könnte ein Angreifer den Verschlüsselungsmodus von GCM auf CTR herabstufen, um Integritätsprüfungen zu umgehen.
  4. 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

Falsche Ergebnisse

Regressionen

Storage

Vom Fuzzer entdeckte Issues