Announcing DuckDB 1.4.3 LTS
TL;DR: Today we are releasing DuckDB 1.4.3. Along with bugfixes, we are shipping native extensions and Python support for Windows ARM64.
In this blog post, we highlight a few important fixes in DuckDB v1.4.3, the third patch release in DuckDB's 1.4 LTS line. You can find the complete release notes on GitHub.
To install the new version, please visit the installation page.
Fixes
This version ships a number of performance improvements and bugfixes.
Correctness
#18782Incorrect “rows affected” was reported by ART index#19313Wrong result in corner case: aHAVINGclause without aGROUP BYreturned an incorrect result#19517JOINwith aLIKEpattern resulted in columns being incorrectly included#19924The optimizer incorrectly removed theORDER BYfrom aggregates#19970Fixed updates on indexed tables with DICT_FSST compression#20009Fixed updates with DICT_FSST compression
Crashes and Internal Errors
#19469Potential error occurred in constraint violation message when checking foreign key constraints#19754Race condition could trigger a segfault in the encryption key cache#20044Fixed edge case in index deletion code path
Performance
#18997Macro binding had slow performance for unbalanced trees#19901Memory management has been improved during WAL replay in the presence of indexes- The
vortexextension ships significant performance improvements for writing Vortex files
Miscellaneous
#19575Invalid Unicode error withLIKEexpressions#19916The default time zone of DuckDB-Wasm had an offset inverted from what it should be#19884Copying to Parquet with a prepared statement did not work
Windows ARM64
With this release, we are introducing beta support for Windows ARM64 by distributing native DuckDB extensions and Python wheels.
Extension Distribution for Windows ARM64
On Windows ARM64, you can now natively install core extensions, including complex ones like spatial:
duckdb
PRAGMA platform;
┌───────────────┐
│ platform │
│ varchar │
├───────────────┤
│ windows_arm64 │
└───────────────┘
INSTALL spatial;
LOAD spatial;
SELECT ST_Area(ST_GeomFromText(
'POLYGON((0 0, 4 0, 4 3, 0 3, 0 0))'
)) AS area;
┌────────┐
│ area │
│ double │
├────────┤
│ 12.0 │
└────────┘
Python Wheel Distribution for Windows ARM64
We now distribute Python wheels for Windows ARM64. This means that you take e.g. a Copilot+ PC and run:
pip install duckdb
This installs the duckdb package using the binary distributed through PyPI.
python
Python 3.13.9 (tags/v3.13.9:8183fa5, Oct 14 2025, 14:51:39) [MSC v.1944 64 bit (ARM64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import duckdb
>>> duckdb.__version__
'1.4.3'
Currently, many Python installations that you'll find on Windows ARM64 computers use the x86_64 (AMD64) Python distribution and run through Microsoft's Prism emulator. For example, if you install Python through the Windows Store, you will get the Python AMD64 installation.
To understand which platform your Python installation is using, observe the Python CLI's first line (e.g.,
Python 3.13.9 ... (ARM64)).
We used the tpch extension to perform a quick benchmark by running the queries on the TPC-H SF100 dataset.
We executed the benchmark on a Microsoft Copilot+ Laptop with a 12-core Snapdragon CPU running at 3.4 GHz, 64 GB RAM and 1 TB disk:
Click here to see the benchmark snippet
import duckdb
import os
import time
con = duckdb.connect("tpch-sf100.db")
con.execute("INSTALL tpch")
con.execute("LOAD tpch")
con.execute("CREATE OR REPLACE TABLE timings(query INTEGER, runtime DOUBLE)")
print(f"Architecture: {os.environ.get('PROCESSOR_ARCHITECTURE')}")
for i in range(1, 23):
start = time.time()
con.execute(f"PRAGMA tpch({i})")
duration = time.time() - start
print(f"Q{i}: {duration:.02f}")
con.execute(f"INSERT INTO timings VALUES ({i}, {duration})")
res = con.execute(f"""
SELECT median(runtime)::DECIMAL(8, 2), geomean(runtime)::DECIMAL(8, 2)
FROM timings""").fetchall()
print(f"Median runtime: {res[0][0]}")
print(f"Geomean runtime: {res[0][1]}")
Click here to see the detailed TPC-H SF100 results on Windows ARM64
| Architecture | AMD64 | ARM64 (native) |
|---|---|---|
| Q1 | 2.87 | 2.10 |
| Q2 | 0.56 | 0.40 |
| Q3 | 2.36 | 1.58 |
| Q4 | 2.01 | 1.45 |
| Q5 | 2.29 | 1.61 |
| Q6 | 0.50 | 0.39 |
| Q7 | 2.04 | 1.52 |
| Q8 | 2.13 | 1.46 |
| Q9 | 7.39 | 7.32 |
| Q10 | 4.18 | 6.98 |
| Q11 | 0.43 | 0.57 |
| Q12 | 2.92 | 1.04 |
| Q13 | 6.65 | 0.54 |
| Q14 | 1.56 | 1.12 |
| Q15 | 0.90 | 0.55 |
| Q16 | 0.97 | 0.74 |
| Q17 | 2.57 | 1.67 |
| Q18 | 4.86 | 5.15 |
| Q19 | 2.96 | 1.72 |
| Q20 | 1.75 | 1.12 |
| Q21 | 7.05 | 4.44 |
| Q22 | 1.78 | 0.97 |
| Median | 2.21 | 1.49 |
| Geomean | 2.09 | 1.59 |
The AMD64 package (running in the emulator) yielded a geometric mean runtime of 2.09 seconds, while the native ARM64 package had a geomean runtime of 1.59 seconds – a 24% performance improvement.
Conclusion
This post was a short summary of the changes in v1.4.3. As usual, you can find the full release notes on GitHub. We would like to thank our contributors for providing detailed issue reports and patches. Stay tuned for DuckDB v1.4.4 and v1.5.0, both released early next year!