Latest version: v0.6.0

PyUp actively tracks 471,271 Python packages for vulnerabilities to keep your Python environments secure.

Scan your dependencies


This preview release of DuckDB is named "Oxyura" after the [White-headed duck (Oxyura leucocephala)]( which is an endangered species native to Eurasia.

This time, Mytherin has written a [blog post explaining the quite long and exciting list of new features]( in this release.

Binary builds are listed at the bottom of this post. Please note that it can take a couple of hours until binary builds for all platforms and environments are available.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the `EXPORT DATABASE` command with the old version followed by `IMPORT DATABASE` with the new version to migrate your data. See the [documentation]( for details.

Featured Changes
* Optimistically write data to disk when batch loading data into the system by Mytherin in
* Parallel non-order preserving CREATE TABLE AS and INSERT INTO by Mytherin in
* Parallel order preserving CREATE TABLE AS and INSERT INTO by Mytherin in
* FSST compression by samansmink in
* CHIMP128 Compression by Tishj in
* Patas Compression (float/double) (variation on Chimp) by Tishj in
* Parallel CSV Reader by pdet in
* Parallelize CREATE INDEX of ART by taniabogatsch in
* Improve memory management of ART indexes by Mytherin in
* DISTINCT aggregates *with* GROUP BY are now executed in parallel by Tishj in
* Nested "UNION"-type by Maxxen in
* Allow for queries to start with FROM, instead of with SELECT by Mytherin in
* Support for the COLUMNS expression, which allows expanding computations on multiple columns by Mytherin in
* Python-style list-comprehension syntax Mytherin in
* Improvements to Out-of-Core Hash Join by lnkuiper in
* jemalloc "extension" for Linux by lnkuiper in
* Improve rendering of result sets for the shell by Mytherin in
* Add auto-complete support to the shell by Mytherin in
* Nicer looking progress bar by Mytherin in

All Changes
* Fix 4747: Handle pandas num categories between 128 and 256 by pankajp in
* Julia 0.5.1 by Mytherin in
* Fix 3595: avoid using system hash for floating point values by Mytherin in
* Fix 4704. Correct the column name for pragma_storage_info with generated column by zippond in
* Allow to load extensions through compiler variable definitions by pdet in
* Fix some typo in code comments by buaazhwb in
* Enhance duckdb_constraints() by krlmlr in
* Issue 4764: Window Ignore Nulls by hawkfish in
* [Python (Relational)] Query now returns a DuckDBPyRelation by Tishj in
* R types expansion by hannes in
* Add json_contains by lnkuiper in
* Fix 4152: create base table reference in returning clause so generated columns are correctly resolved by Mytherin in
* Fix Exists and ANY correlated subquerys by lokax in
* Fix for ORDER BY on large dictionary vectors: correctly pass offset into get_index of selection vector by Mytherin in
* Missing json_contains in extension list by Mytherin in
* Extensible Casts & Cast Function Rework by Mytherin in
* Bump sqlite scanner by hannes in
* Improve sorting for strings and push projections into sort operator by lnkuiper in
* Parquet: Refactor decompression, including more complete datapage v2 support by wisp3rwind in
* Parallelize CREATE INDEX of ART by taniabogatsch in
* Unify LocalStorage and DataTable Storage by Mytherin in
* feat: support passing all db config to jdbc driver by Mause in
* Fix 4806: correctly use offset index in pragma_table_info on view by Mytherin in
* Map VARCHAR, JSON, ENUM to Julia String by nickrobinson251 in
* fix: support SHOW query types in jdbc client by Mause in
* Replacement Open Hooks by hannes in
* Build multiple out of tree extensions in one pass by Mytherin in
* fix(jdbc): release results before releasing statements by Mause in
* Fix for 4827 by PedroTadim in
* Multiblock2 by jkub in
* Disconnect after test by krlmlr in
* Check prefix length, not string_t::INLINE_LENGTH when comparing strings while sorting by lnkuiper in
* Adding a CI workflow to re-build individual out-of-tree extensions by hannes in
* fix: json getColumnType error by Mause in
* Attempt two at rebuilding old extensions by hannes in
* Updating postgres scanner by hannes in
* Extension Rebuild Attempt 3 by hannes in
* Adding overwrite flag to R duckdb_register by hannes in
* Move LocalStorage row groups directly to DataTable instead of re-appending by Mytherin in
* fix for macos CI by samansmink in
* Fully qualified s3url by LindsayWray in
* FSST compression by samansmink in
* Julia: add support for handling errors in replacement scans by Mytherin in
* Extension build: turn IGNORE_WARNINGS into generic OPTIONS field, and add --main-only field by Mytherin in
* Issue 4867: Approximate Quantile Hugeint by hawkfish in
* Install OpenSSH on ubuntu 16 by Mytherin in
* Join order regression test: add 20% threshold to cardinalities before we care about regressions by Mytherin in
* Move LocalStorage row groups directly to DataTable if there are enough rows being appended by Mytherin in
* Allow referencing of aliases in SELECT clause and TPC-DS extension clean-up by Mytherin in
* Add github to known hosts by Mytherin in
* Adding a serialized version of all TPCH queries and test we can read them by bleskes in
* Add support for custom bind functions to RegisterCastFunction, and propagate client context to the bind function by Mytherin in
* CSV reader: quoted NULL values should be kept as non-NULL by Mytherin in
* fix: add numpy to setup_requires to fix build from source by Mause in
* fix openFlags overwriting in shell fixing 4894 by kouta-kun in
* Remove filter columns from table scans if they are unused in the remainder of the plan by lnkuiper in
* feat: add duckdb_library_version method and fix extension load state by Mause in
* uuid.cpp: GenerateRandomUUID: fix indexing by nodakai in
* Update serialized plans by Mytherin in
* Add CPython 3.11 to build matrix by edgarrmondragon in
* Support UNION_BY_NAME option in read_csv_auto by douenergy in
* support for virtualizing storage layer by jkub in
* Reduce data set size of IE join test by Mytherin in
* Making sure parquet column readers return the expected amount of rows by hannes in
* Issue 3187: TIMESTAMPTZ <=> VARCHAR by hawkfish in
* Fix breaking CI on unused variable errors by Tishj in
* Issue 4912: NOW returns TIMESTAMPTZ by hawkfish in
* Add ClickBench to benchmark suite by Mytherin in
* Add auto-complete support to the shell by Mytherin in
* Add support for list parameters to read_csv and read_csv_auto by Mytherin in
* + methods for sink_schema by alitrack in
* Add Python-style list-comprehension syntax support to SQL by Mytherin in
* Auto-complete: prioritize files with known extensions, and include position at which completion should be placed by Mytherin in
* Fix ART by lokax in
* [Python] Add support for Protocols by Tishj in
* Work-around for 4935: throw internal error if there is no node by Mytherin in
* Fix 4933: avoid introducing NULL value on first value after empty row by Mytherin in
* Issue 4942: Check DESC Errors by hawkfish in
* Issue 4944: Negative Unpadded Centuries by hawkfish in
* Issue 4943: Date Nanosecond Overflow by hawkfish in
* feat: add copy method for logical_operator by stephaniewang526 in
* Bug fix for segmentation fault in list apply by taniabogatsch in
* Fixing hmac for large secrets in S3FS by hannes in
* buffered by jkub in
* Caching Database Instances by pdet in
* Faster ART key allocations, faster index join by taniabogatsch in
* Add CI run with disabled string inlining by Mytherin in
* Split row-group append into Initialize/Append/Finalize and separate append code from version info append by Mytherin in
* Issue 4965: DateDiff Day Overflow by hawkfish in
* noswizzle by jkub in
* Issue 4978: DATE_SUB Subtraction Overflows by hawkfish in
* feat: request that people raise scanner issues in the right repos by Mause in
* avoid double-writing the index data by jkub in
* [Python] Optional Pandas Date as datetime by pdet in
* Optimistically write data to disk when batch loading data into the system by Mytherin in
* Bring substrait-extension build back by pdet in
* fix(jdbc): shutdown database after last connection is closed by Mause in
* Add support for TRUNCATE [TABLE] syntax by Mytherin in
* Directly merge row groups from local storage into table even if the table has indexes by Mytherin in
* String to list casting by LindsayWray in
* Optimize away DELIM_JOIN even when the child join with the DELIM_GET is an inequality join by lnkuiper in
* JDBC: Add public getter for statement return type by Jens-H in
* Remove duplicate code by lokax in
* Fix lambda bug for struct extract by taniabogatsch in
* Fixing 4859, correctly passing struct type to recursive calls by hannes in
* [CSV] Added line number to 'maximum_line_size' exceeded error by Tishj in
* ODBC/JDBC Database Instance Cache by Mytherin in
* String functions: count unicode codepoints instead of grapheme clusters by Mytherin in
* Support file_search_path with globbing by whscullin in
* First cut at TypeScript type declarations for DuckDb by antonycourtney in
* Undefined behavior sanitizer error fix by Tishj in
* [Compression] CHIMP128 Compression Algorithm by Tishj in
* Parallel non-order preserving CREATE TABLE AS and INSERT INTO by Mytherin in
* fsst bugfix by samansmink in
* Avoid installing git for ODBC Windows CI Run by Mytherin in
* Fix for shell auto-complete by Mytherin in
* Fix a race condition in an assert by Mytherin in
* [Python] Accept 'schema' in table reference by Tishj in
* Fix levenshtein(s1, s2) for empty strings by lmores in
* Correctly handle NULL values in compound ART keys by taniabogatsch in
* Issue 5023: Fully Parallel Partitioning by hawkfish in
* Enable remote optimizer test by Y-- in
* make wal impl more reusable by jkub in
* Optionally allow for queries to start with FROM, instead of with SELECT by Mytherin in
* [Python] Fall back to DOUBLE for unsupported DECIMAL widths by Tishj in
* Issue 5046: Window Size Restriction by hawkfish in
* Shell: fixes for auto-complete of home directory and absolute paths by Mytherin in
* Varsizeblock by jkub in
* Parallel order preserving CREATE TABLE AS and INSERT INTO by Mytherin in
* Fix 5077: correctly handle carriage return newlines in CSV auto-detection by Mytherin in
* caching table-in-out-functions & chunk cache refactor by samansmink in
* Fix for 4935: throw internal error if there is no node by Tmonster in
* Add nested "union"-type by Maxxen in
* Row Group Collection - smaller allocations for tiny tables by Mytherin in
* chore: pin setuptools_scm to py3.6 compatible version by Mause in
* Correctly scan unaligned row groups in DataTable::ScanTableSegment by Mytherin in
* feat: implement DatabaseMetadatagetFunctions() by Mause in
* Support batch index in arrow scans by Mytherin in
* Arrow support for JDBC ResultSet by hannes in
* fix(jdbc): gracefully handle null bytes in strings by Mause in
* Add file_row_number flag to parquet reader by hannes in
* Fix comment by zhouliqi in
* Add ErrorManager class, allow SQLLogicTests to verify error messages, and improve CSV reader errors by Mytherin in
* Add support for the COLUMNS expression, which allows expanding computations on multiple columns by Mytherin in
* Issue 5107: ICU Data Scripts by hawkfish in
* Batch Insert: Add support for eagerly merging of small adjacent batch indexes by Mytherin in
* Add temporary 'skip_reload' to problematic test by Tishj in
* [Python] Add MSVC `/utf-8` flag by metab0t in
* Convert values whose data types do not have explicit support in NodeJS into strings by jwills in
* Download OpenSSL from Github instead by Mytherin in
* Add BoxRenderer class - which improves rendering of result sets for the shell by Mytherin in
* [Dev] Add `extension` to excluded folder in `' (format-fix/master) by Tishj in
* Fix 5124: correctly deal with DICTIONARY vectors inside LIST vectors for various functions by Mytherin in
* [Aggregate] DISTINCT aggregates *with* GROUP BY are now executed in parallel by Tishj in
* [Python] Exceptions encountered in 'with' body are now properly propagated by Tishj in
* Create enum type from query by lokax in
* Fix 5149: better tracking of query location in column reference, and improve error message by Mytherin in
* Allow builder to set `GIT_COMMIT_HASH` by Y-- in
* Fsst bug by samansmink in
* [Python] Arrow Dataset type requirement is now less strict by Tishj in
* Fix progress bar of regular table scan by Mytherin in
* Document highlight features in the shell by Mytherin in
* Support parallel (batch) insertion into tables that have indexes by Mytherin in
* Support casting of hex strings to integer types by IanCal in
* [Aggregate] Fix regressions caused by latest distinct HT operator PR by Tishj in
* R: Remove duckdb:: qualifier by krlmlr in
* [Compression] Patas Compression (float/double) (variation on Chimp) by Tishj in
* [C-API] Decimal casting to other type fixes by Tishj in
* Default NULL handing for CARDINALITY function by lokax in
* Update OpenSSL to 1.1.1s by sjaenick in
* Box renderer: Always display "0 rows" if there are no rows by Mytherin in
* chore: request OS version and architecture in bug reports by Mause in
* String to struct cast by LindsayWray in
* Optimize String Split by Mytherin in
* Nicer looking progress bar by Mytherin in
* Correctly call Reset on cast_chunk in CSV writer to prevent string heap from continuously accumulating data by Mytherin in
* Increase vector size to 2048 by Mytherin in
* Issue 5131: Time Zone 2022f … by hawkfish in
* jemalloc "extension" for Linux by lnkuiper in
* Further clarify database invalidation error, unify db/transaction invalidation, and move errors to error manager by Mytherin in
* fix: build NodeJS bindings for M1 by Mause in
* Arrow extension by samansmink in
* Fix distinct aggregate race: insert next event before scheduling tasks by Mytherin in
* Avoid exporting SQLite symbols from our sqlite_api_wrapper when building the shell by Mytherin in
* buffermanager accounting by jkub in
* Allow NULL bytes in strings by Mytherin in
* Use cmake's find_package to trace git executable by bleskes in
* Issue 5197: Deterministic TimeZone Abbreviations by hawkfish in
* Issue 5239: DATE_DIFF Microseconds Overflow by hawkfish in
* Various CI Improvements/Speed Ups by Mytherin in
* Issue 5240: DATE_TRUNC Statistics Orientation by hawkfish in
* Improvements to Out-of-Core Hash Join by lnkuiper in
* Add support for extension aliases by Mytherin in
* Physical batch insert: correctly optimistically flush batches to disk that are close to our row group size by Mytherin in
* Fix Python stub test by Mytherin in
* DISTINCT grouped aggregate lowered memory consumption optimization by Tishj in
* fix: bump node-gyp version by Mause in
* json_extract bugfixes and memory accounting bugfix by lnkuiper in
* [Python] Add support for strided `float32` and `float64` data by Tishj in
* Issue 4978 - 4. Cardinality estimator assertion errors and filter errors by Tmonster in
* Adding total_uncompressed_size to parquet column chunk metadata by hannes in
* Issue 5258: Inverse Percentile NULLs by hawkfish in
* Issue 5205: TIMESTAMPTZ Casting by hawkfish in
* 6. Like empty list assertion error by LindsayWray in
* fix: fix python stub test by Mause in
* Issue 5254: Validate Collation Expressions by hawkfish in
* Cast overflow varchar to decimal by LindsayWray in
* Issue 5259: ChunkCollection Sort Values by hawkfish in
* Parallel CSV Reader by pdet in
* Add Java constant for default schema name by michaeljohnalbers in
* Fix/4978 substring overflow by Maxxen in
* token url encoding bug in S3 glob by samansmink in
* fix: don't build M1 NodeJS binaries on node versions that don't support M1 by Mause in
* Several CI fixes by Mytherin in
* Fix several fuzzer issues, move client context into ExpressionExecutor, and ColumnList index rework by Mytherin in
* feat: prebuild for NodeJS 19 by Mause in
* Calendar overflow Fixes by hawkfish in
* Add correlated columns to LogicalDistinct::distinct_targets when flattening dependent joins by lnkuiper in
* Fuzzer fixes - 4978 (16) Binder assertion error by Tmonster in
* [Fuzzer] Fix triggered assertion in LogicalOperator::Verify by Tishj in
* Disable url decoding of http header values by samansmink in
* fix: pg constraint foreign key by Mause in
* Improve memory management of ART indexes by Mytherin in
* Several parallel CSV reader fixes by Mytherin in
* [Python] support for pandas experimental NA type by Tishj in
* Add internal verification to unpinning buffer blocks by lnkuiper in
* [Python] Fix support for UInt64 and similar by Tishj in
* Add support for quoted schema/column in DESCRIBE statement by Tishj in
* Increase SQLite scanner version by Mytherin in
* node / TypesScript bindings: add missing accessMode argument to Database constructor. by antonycourtney in
* Initial version of extension to allow creating operators outside of duckdb core lib by rjatwal in
* Improve progress bar & box rendering by Mytherin in
* Parallel csv auto fixes by pdet in
* Current fix for Issue 5266 Returning error with rowid by Tmonster in
* [Fuzzer] Add support for use of generated columns in GROUP BY expression by Tishj in
* [Fuzzer] Generated columns now work properly with query-level aliases by Tishj in
* fix: use oldest supported numpy to build for a given python version by Mause in
* [UB sanitizer] Prevent doing arithmetic on NaN in 'logical_limit_percent.cpp' by Tishj in
* Fix OSX Builds on Master - Revert 5319 by Mytherin in
* Bump Postgres Scanner by hannes in
* disable node client arrow ipc replacement scans by samansmink in
* Shared ColumnDataAllocator: hold lock for just a bit longer by lnkuiper in

**Full Changelog**:


Not secure
This is a bug fix release for various issues discovered after we released 0.5.0. There are no new features, just bug fixes. The following PRs were included in this release:

* [Fuzzer] Issue 4152 - Lag window function issue by lokax in
* Fix zonemap check for VARCHAR by lokax in
* Remove the DLLEXPORT from deleted API methods by emmenlau in
* Fix update statement on generated column by lokax in
* [Fuzzer] Issue 4152 - Limit 0% on ANY subquery by lokax in
* [Fuzzer] Issue 4610 - Vacuum table with generated column by lokax in
* [Fuzzer] Decimal scale+width overflows too quickly by Tishj in
* [Fuzzer] issue 4566 by Tishj in
* Issue 4635: DATE_DIFF Week Boundaries by hawkfish in
* Fix issue 4630 by lnkuiper in
* [Python] Fix unwanted conversion from NaN -> NULL in param list by Tishj in
* Fix home directory setter by attilahorvath in
* fix(jdbc): correct mapping for TIMESTAMP_WITH_TIME_ZONE by Mause in
* Fix bug changing input order on array_sort column by taniabogatsch in
* Fix issue 4625 by lnkuiper in
* [Extensions] Suggesting which extension to Load/Install by pdet in
* Fixes issue 4123 by Tishj in
* Updating jdbc deploy script by hannes in
* Consistent struct definitions by hannes in
* Fix 4666 by taofengliu in
* Fix for 3417 by PedroTadim in
* feat: improve python replacement scan error by Mause in
* [C-API] Data chunk invalid left-shift by Tishj in
* fix: correct mislabelling of amd64 libs in jars by Mause in
* Fix 4647 by taofengliu in
* Throw error if attempting to delete from table without physical columns by Tishj in
* Fix 4475: allow ignore_errors in read_csv and read_csv_auto by Mytherin in
* Fix 4442: correctly handle TIMESTAMP logicalType in Parquet files by Mytherin in
* Fix 4699: when no file is found globbing, fallback to using the literal string name as a path by Mytherin in
* Fuzzer fixes batch 1 by Mytherin in
* Fix 4677. Correctly set_not_null when table contains generated column by zippond in
* Fix 4703 by taofengliu in
* Fixing Extension naming CI Checker by pdet in
* [Python(pandas)] Scan multiple chunks worth of values from a 'object' dtype DataFrame by Tishj in
* Fix 4694: Keep shared pointer to pipelines around in additionally scheduled events by Mytherin in
* Fuzzer Batch Fixes 2 by Mytherin in
* Fix 4702. Correctly use index when generated column is involved by zippond in
* Fix for 4583 by PedroTadim in
* Fuzzer fix batch 3 by Mytherin in
* Fix 4562: generate table index for dummy scan generated from VALUES clause by Mytherin in
* [Arrow] Guarantee threads don't call get_next after stream is done. by pdet in
* Correctly catch and report exceptions thrown during a pipeline's scheduling by Mytherin in
* Fix for issue 4708 by PedroTadim in
* Fix 4568: correctly handle casts in deliminator by Mytherin in
* No longer disable vptr sanitizer on M1 macs by Mytherin in
* Use version tag as dir for extensions for releases by samansmink in
* Correctly call ::Skip function of child of structs by Mytherin in
* [Map] Map extract now properly uses the selection vectors of the `map` and `key` vectors by Tishj in
* Fix 4356 by taofengliu in
* Fuzzer Batch 4 by Mytherin in
* feat: bump Julia package version by Mause in
* Julia API: Add load! to add a DataFrame as a table by jfb-h in
* aarch64 extensions by samansmink in
* Faster hive part filters by samansmink in
* [Python] DECIMAL with value 0.00... issue fix by Tishj in
* enable out-of-tree extensions for aarch64 by samansmink in

**Full Changelog**:


Not secure
This preview release of DuckDB is named "Pulchellus" after the [Green pygmy goose (Nettapus pulchellus)]( which is native to Australia where [VLDB 2022]( is starting today. Despite being called a "goose" it is actually a duck.

Binary builds are listed at the bottom of this post. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the `EXPORT DATABASE` command with the old version followed by `IMPORT DATABASE` with the new version to migrate your data. See the [documentation]( for details.

Below a list of changes in this release

Major Changes & Features

- 4189: Implement Out-of-Core Hash Join and Re-Work Query Verification
- 4022: Art Index Storage
- 4274: Join Order Optimizer improvements
- 4420: Logical Plan Serialization
- 4137, 4347, 4293, 4190, 4178, 4177, 3954 & 4159: Scalability and performance improvements for Window operator
- 4004: Add support for extensions to the parser, and add an example of this to the loadable extension demo
- 4089: Signed Extensions
- 4097 & 4211: Filename column + Hive partitioning support for Parquet Reader
- 4501, 4511: Aarch64 Linux builds of CLI, shared library, JDBC & ODBC

Minor Changes & Bug Fixes
- 4594: [Map] Fix map_extract from multiple rows
- 4585: Fix for r test instability, 4549
- 4560: Support all basic integer types in node API
- 4558: [CPP-API] Comment no longer causes crash
- 4552: [Fuzzer] Issue 4152 - Remove ToString roundtrip in query verification
- 4543: Fixing silent assertions
- 4542: Check if database is still alive when trying to connect for nodejs
- 4541: fix for issue 4533
- 4539: Paralelization non-dependent on Arrow rows
- 4524: Explicitly deleting default connection on js side
- 4522: Correct architecture name for Linux aarch64
- 4521: Adding correct substrait release tag to out-of-tree extension deployment
- 4520: Added test cases for several fixed JDBC issues
- 4516: Fix 4455, dont set default schema in transform
- 4513: Issue 4502
- 4510: [Casting] Varchar -> Decimal cast fix
- 4507: [CSV] Fixed bug related to invalidated iterators
- 4505: extension trigger event
- 4504: fix: short-circuit hash and version discovery
- 4496: [Fuzzer] Issue 4152 - Force no cross-product issue
- 4495: Build ODBC driver binary for OSX
- 4494: [Fuzzer] Issue 4152 - Analyze inexisting column
- 4493: Declare all variables for nodejs.
- 4491: Issue 4419: Range Join Swizzling
- 4488: Making the parquet extension loadable
- 4484: fix: ignore status message from output of mypy stubs check
- 4483: [Development bug] unittest result_helper.cpp triggers assertion
- 4480: Remove REST server
- 4479: Remove assertion
- 4477: Removing Substrait From DuckDB Repo
- 4474: WIP 4152
- 4472: [Python] Removed mutable default parameters
- 4470: Fix hidden merge conflict with fetchmany
- 4465: [Python] `fetchmany` implemented
- 4458: Issue 4454: VARCHAR/DATE Reversibility
- 4448: Issue 3954: Pinned Heap Blocks
- 4440: Added support for HUGEINT input type to BIT_COUNT scalar function
- 4434: Python: Add PyRelation.fetchnumpy()
- 4429: Allow indicating a format version that should be used to write/read from (De)serializer and use it for plans
- 4427: Python: Improve docstrings for DuckDBPyRelation and DuckDBPyResult
- 4418: Fix typo
- 4416: Fix several update issues
- 4413: Correctly schedule mix of union/child pipelines (again)
- 4409: Increase timeout for coverage checks
- 4405: Hybrid ART Leaf Part I
- 4404: Add support for TS_MS, TS_NS, and TS_S
- 4400: Issue 4388: DATE_TRUNC Low Precision
- 4398: fix: correct object return types for arrow functions
- 4395: Fix name of environment variable
- 4390: Support UNION BY NAME set operation
- 4383: Missing LISTs are NULL
- 4382: Include PID in test directory name
- 4380: R: Avoid `translate_duckdb()` in tests
- 4377: R: Full BLOB support
- 4372: Fix 4370: correctly handle non-flat vectors in list_sort
- 4371: [Python] Changed all RuntimeErrors thrown in the Python client
- 4368: Fixes issue 4365 - Not null constraint is no longer duplicated
- 4364: Allow extra parameters in list_aggr to be passed in, as long as they are constant and only used during the bind
- 4363: Fix for array_position with NaNs: use Equals::Operation instead of regular equality
- 4362: Allow table functions to set cardinality stats through the C API - and utilize this in Julia DataFrame scans
- 4359: Mark slow tests
- 4355: Fix typo in exception text
- 4354: R: Use preinstalled symbol
- 4353: Shell: Add missing newline in help output
- 4352: Tweak contributing guide [ci skip]
- 4345: [Substrait] Pushing-down projections and filters to read relation
- 4340: Correctly schedule pipeline dependencies when scheduling mix of UNION and FULL OUTER JOINs
- 4336: feat: add basic json support to jdbc client
- 4334: Bring ibis/substrait tests to a sane state
- 4332: Fix Julia parallelism interleaving with the garbage collector, and expose Pending Query Result in C interface
- 4328: Allow specifying a custom home directory using the SET home_directory option
- 4327: [Aggregate] DISTINCT aggregates without GROUP BY are now executed in parallel
- 4324: Fix 4309: fix for multiple foreign key constraints on the same table-table pair
- 4323: Optimizer profiling
- 4322: Print NOT operator correctly
- 4319: feat: add missing node versions to CI
- 4317: refactor: remove dead code in python client
- 4316: R: Add rlang as suggested dependency
- 4315: Column Data Collection, Arrow Result conversion rework, Cross Product performance fixes & more
- 4312: R: Install tidy CLI tool
- 4310: R: Add test for `test_all_types()`
- 4304: Improve numeric hash function to a better but slightly slower hash function
- 4301: Add unit of measurement in timer function
- 4300: Support root type on expressions 4278
- 4298: Feature/nodejs client docs
- 4297: fix: remove nodejs test focus
- 4296: Avoid infinite loop in range(NULL)
- 4294: 4276 Serializing data types on table schema in substrait
- 4289: [Python/Pandas] fix +/- inf wrongly converting to NaN (NULL)
- 4288: Fix fuzzer issue w.r.t. NULL values in generate_series
- 4286: [Python - Relation] CreateView on a filtered relation does not cause infinite loop anymore
- 4285: chore: remove cython constraint now that bug is fixed
- 4284: Pandas timezone
- 4283: Return errors from RecordBatchReader
- 4280: R: Remove nycflights13 dependency
- 4279: R: Don't export duckdb_explain()
- 4277: feat: update links
- 4272: Allow 0 as a seed parameter
- 4266: R: Only quote non-syntactic and reserved words
- 4265: Specialize LIST aggregate function implementation
- 4263: R: Avoid attaching package during tests
- 4259: Add ANY_VALUE agg function
- 4256: Schedule child pipeline correctly
- 4255: Disable ibis substrait tests for now
- 4250: C API: Report appender error in case conversion fails
- 4240: DELIM_JOIN now propagate statistics correctly
- 4237: fix: pin cython to work around bug
- 4236: Integer types now correctly increase `width` of DECIMAL type.
- 4235: Parquet writer: Write dictionary_page_offset, and distinct_count for dictionary encoded strings/enum
- 4234: Implement json_merge_patch and jsonlines output mode
- 4233: feat: fix pandas types in docstrings/python types
- 4230: Handle nulls in structs and lists
- 4225: Add Jaro Winkler
- 4215: Use right template for smallint
- 4213: feat: update instructions for installing master builds in bug report template
- 4212: Improve error message
- 4210: PARQUET: Move StringColumnWriter dictionary to use string_t to avoid allocations
- 4209: Remove unused PhysicalTypes
- 4207: Disable GC during Julia execution to avoid internal GC deadlock in DataFrame scan
- 4206: Fix 4202: in the comparison simplification optimizer, we can only shift the cast to the constant if both casts are invertible
- 4199: feat: Use pip to install and uninstall python client
- 4198: [capi] impl clear bindings for prepared stmt
- 4197: feat: port to bug_report.yml
- 4196: Fix RTTI issue across extension boundaries on OSX
- 4192: Correctly call SetFilePointerEx on Windows so the truncate works as expected
- 4191: Fix Expanded CI test case by adding swap space to test
- 4187: [Storage] FOR compression
- 4185: ISSUE 3248 Support for ALTER TABLE altering columns NOT NULL
- 4183: Julia multi-threading fix: avoid using a time-out to cancel threads in case there are no tasks
- 4179: node: add async-iterator-based streaming
- 4175: [CI] Python Build with Sanitizer
- 4172: Update stubs test
- 4168: Issue 4161: Create WindowExecutor
- 4167: node: report memory usage to the node GC
- 4166: Fix 4165: correctly fill in false_sel when performing comparison with constant null value
- 4160: node: don't crash on syntax errors
- 4154: Making date_trunc statistics handling consistent with date_part
- 4153: Support for int64 round trips in R driver using the bit64 package
- 4151: Fix orrify merge conflict
- 4143: Correctly handle query parameters in JDBC
- 4140: CI Fixes
- 4139: Remove redundant code
- 4138: Support struct.* to retrieve all struct fields in SELECT list
- 4134: Fuzzer Fixes
- 4133: Remove DUCKDB_API for deletes. (For Windows/ZIG)
- 4132: [Python] `project` now correctly inherits owning references to PyObjects
- 4131: Missing error messages
- 4125: Fix Orrify rename merge conflicts
- 4124: [Substrait] [Python] [R] Upgrade Substrait and introduce function to export query plan as a substrait - JSON
- 4117: (Hopefully) fix signing extension signing on master
- 4112: PARQUET: Add data pages encodings to their metadata
- 4111: Fix off-by-one in plan cost regression test script
- 4110: Rename Orrify -> ToUnifiedFormat, VectorData -> UnifiedVectorFormat, Normalify -> Flatten
- 4108: ODBC: fixing multicolumn parameter binding
- 4107: Refactor: rename simple aggregate to ungrouped aggregate
- 4104: Support Parquet's `RLE_DICTIONARY` encoding for string columns
- 4103: Ntile fixes
- 4101: Some follow up fixes for extension signing
- 4096: Implement ANALYZE
- 4093: Support ORDER BY and LIMIT in correlated subqueries, and add support for the ARRAY(subquery) syntax
- 4090: Fix for non varchar input for sequence functions
- 4088: Fix Issue 3813 - fixedsize PyArrow List -> DuckDB conversion
- 4083: JDBC Change getTimestamp to throw an error for wrong data types
- 4080: Several parser improvements
- 4076: Unentangle Parquet ColumnWriter and StandardColumnWriterState
- 4075: feat(breaking): improve python exceptions
- 4070: [JDBC] CachedRowSet support
- 4069: Improve error messages of extension install
- 4068: Fix bug with PhysicalStreamingWindow
- 4065: Better handling plus encoding in urls
- 4061: Fix 3991: use case_insensitive_map for headers
- 4060: Null handling unification
- 4059: Prepared Statement Verification & many prepared statement fixes
- 4058: nodejs: use less memory in each
- 4057: Fixed an error in comment
- 4053: [R] [CI] Run arrow test single threaded to avoid wrong fp comparison
- 4050: Bump sqlite scanner version
- 4049: Remove need for locks in TPC-H dbgen
- 4048: Test query profiler shouldn't output profiling info to the console
- 4045: Making delayload flags dependent on whether we are NOT doing a static…
- 4044: Issue 3593: avoid duplicate eliminating correlated columns in subqueries when they involve LIST columns
- 4039: Making memory leak sanitizer happy with DuckDB Shell
- 4035: Fix several memory-allocation related issues - use Allocator in many places, and reduce many allocations all over
- 4033: Plan cost regression tests
- 4032: Add missing python test dependencies
- 4031: Fix issue 3989
- 4012: Fix amalgamated build with multiple .cpp
- 4011: Fix amalgamation script when --splits is used
- 4009: `EXPLAIN ANALYSE` should honor profiler output format
- 4005: Fix for 3997
- 4002: fix fts/httpfs include directories
- 3999: Include guard renaming for amalgamation export
- 3996: Fix for issue 3951
- 3990: Substrait Interface in R API
- 3988: feat: implement DuckDBConnectiongetSchema for JDBC
- 3985: Pandas->DuckDB Series of dtype='O' conversion
- 3982: Expose dbgen text buffer size as a parameter and Python Replacement Scans Leak fix
- 3978: Enhance bound parameters error message
- 3977: Adding alias part 2
- 3973: Using aggregate input data for aggregate functions
- 3971: Issue 3079: When installed system RAM cannot be determined, default to no memory limit
- 3967: Use fmt library for Value::ToString of float/double types
- 3965: Fix 3942: avoid converting + to space in httplib::decode_url
- 3964: Add support for DATEFORMAT and TIMESTAMPFORMAT to COPY TO
- 3963: Atomic extension install: use UUID in temp file
- 3961: Fix 3960: avoid returning an error when a blob contains a NULL character in duckdb_append_blob
- 3958: Fix 3955: correctly compute width/scale when combining decimal type of different width/scale
- 3957: [Java] Implement appender support for all? UTF-8 characters 😜
- 3953: Fix missing LIST type in duckdb_types
- 3952: Windows FileExists regression fix: need to use _wstati64 instead of _wstat64i32
- 3950: Atomic extension installation
- 3945: Fuzzer 55: Remove Normalify Call
- 3939: Issue 3937: Casting infinite times
- 3928: Adding alias type struct and map
- 3927: Fix failing TPC-E test
- 3925: New Julia package requires 0.4 of DuckDB_jll
- 3921: Retire `LogicalTypeId::HASH` and replace it with `LogicalTypeId::UBIGINT`
- 3919: ODBC: SingleExecuteStmt and error message
- 3918: Julia compat version
- 3917: Ignore invalid UTF8 in fuzzer scripts
- 3916: Julia Guidelines fix
- 3915: Add duckdb_extensions function
- 3914: Expanding jdbc deploy script to be able to automatically release, too
- 3912: Julia UUID and version bump
- 3911: Making universal builds of OSX Extensions
- 3910: Fix for export of current_time, current_timestamp, etc functions
- 3909: More fuzzer fixes
- 3903: Issue 3881: DATE_TRUNC statistics
- 3900: Add newlines at EOF
- 3897: feat: add extension load/install methods to python client
- 3882: Uncompressed string improvements
- 3868: Bump yyjson version
- 3867: Enable exporting macro's
- 3866: Add default for function NULL handling
- 3864: [Python] Relation Explain
- 3853: Feature/struct_insert function
- 3814: Expose dbgen text buffer size as a parameter
- 3694: List lambdas
- 3618: Struct Types for Node.js UDFs
- 3600: Issue 1466: added `map_from_entries` function


Not secure
This preview release of DuckDB is named "Ferruginea" after the [Andean Duck](

Binary builds are listed below. Feedback is very welcome.

Note: This release should be backwards-compatible wrt the on-disk storage format, but the next release may very well be incompatible again. So please don't rely on this just yet. We suggest you use the `EXPORT DATABASE` command with the old version followed by `IMPORT DATABASE` with the new version to migrate your data. See the [documentation]( for details.

Also note: DuckDB is switching to [semantic versioning]( Version numbers look like this: `MAJOR.MINOR.PATCH` with changes to
- MAJOR version when you make incompatible API changes,
- MINOR version when you add functionality in a backwards compatible manner, and
- PATCH version when you make backwards compatible bug fixes.

However, note that because `MAJOR` is currently 0, "Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable."

Below a list of changes in this release

Major Changes & Features
- 3767: Table function rework, parallel Julia DF scans & Python regression tests
- 3749 & 3747: Query cancellation with CTRL-C for R and Python clients
- 3700: Support Parallel Order-Preserving Result Set Materialization
- 3696: Support WINDOW FILTER
- 3620: HTTP read optimization
- 3668: Adding alias type
- 3435: Add support for reading newline-delimited JSON
- 3783: Extension loading by statically linking DuckDB

Minor Changes & Bug Fixes
- 3905: Fix SQLancer CI
- 3904: Fix 3896: correctly compute GroupRowsAvailable in struct reader in case a child-entry is not just a list, but a struct with only list entries
- 3902: Fuzzer: fix sanitization of address sanitizer error
- 3901: R: Extract DetectLogicalType() function
- 3899: R: Check query return type instead of query type in dbFetch()
- 3898: Issue 3880: Rebind DATE_TRUNC dates
- 3894: Purge concurrent queue when enqueueing entries to prevent entries from piling up
- 3892: Fix for issue 3878
- 3889: Fix TreeRenderer crash on invalid UTF8
- 3888: Julia Table Functions: add stack trace to errors reported
- 3887: Correctly reset interrupted flag so verification does not overwrite original error
- 3886: Remove the check_tread from python connection
- 3879: Avoid title is too long error in fuzzer issue submission
- 3877: Fix use-after-free in create view with prepared statement parameter
- 3872: Glob with search paths
- 3871: [Python] Making new connections to cursors and adding lock on queries over sampe connection
- 3869: Several OSSFuzz fixes
- 3865: Fix 3860: add support for creating foreign keys on temporary tables, and for now disable support for cross-schema foreign keys
- 3863: Out-of-tree Extensions for Windows
- 3862: Rework of Struct <> Dictionary Vectors, and add test_vector_types function
- 3852: Added support for generated columns to TableCatalogEntry->ToSQL()
- 3850: Enable EXTENSION_STATIC_BUILD for Mac too
- 3849: [Python] Unbundle Substrait
- 3848: Parquet: fix for fixed length byte arrays in dictionary column reader
- 3847: Expand oss-fuzz tests to run queries and check for internal errors
- 3846: Pass through read only flag for node connector
- 3845: Add queries over Arrow to Python regression tests, and time entirety of TPC-H
- 3843: [JDBC] Pass through scale and precision for decimal types from DuckDBColumnTypeMetaData
- 3842: Allow to use custom memory allocator through DuckDB API on Windows
- 3837: Fix overflow in generate_series and overflow in abs operator
- 3832: Issue 3816: Parquet Time Zones
- 3831: s3fs decode keys correctly
- 3828: Update testthat snapshots
- 3818: Add SQLancer to CI Fuzzing Framework
- 3815: Out-of-tree Extension Builds
- 3812: Fix several issues found by Valgrind
- 3810: DuckDB.jl Julia Package History
- 3809: Add `shell: bash` everywhere
- 3802: fix ci breaking from extension PR
- 3799: Optimisation rule for regexp_matches with literal pattern
- 3798: Substrait: Adding more compatibility with Substrait and Ibis
- 3792: Issue 3790: Temporal IsFinite/IsInf
- 3791: Issue 3721: Rightshift Negative Hugeint
- 3786: Fix binding of fully qualified view reference
- 3785: Python: Allowing cursor to set check threads flag
- 3784: Improve speed of ALTER TABLE ADD COLUMN
- 3778: More node types
- 3777: Python: Updating Stubs and Bringing Stubs tests back
- 3776: Simplify `clangd` target
- 3775: Expose dbgen speed_seed functions on header file and add missing ones
- 3771: Increment R package version
- 3765: Issue 3759: Node Time Zone
- 3764: Issue 3763: List Min/Max Problems
- 3761: Fix .import not creating missing table in CLI
- 3760: Requiring keys provided to `map` to be unique
- 3757: Fix 3756: fix issue when running blockwise NL join on dictionary vectors of structs
- 3752: Fixed error handling for node exec()
- 3751: Decreasing the overallocation for list aggregates
- 3750: Fix a bug in HyperLogLog
- 3746: Check if replacement scans don't leak memory
- 3745: Arrow/Pandas Case Insensitive Columns
- 3744: Treating ENUM Case in pyresult describe
- 3739: DuckDBPyRelation: support `offset` argument for `limit()`
- 3738: Fix 3730: avoid modifying the payload in-place in aggregate hash table, because it might be used multiple times in case of grouping sets
- 3736: JDBC better error handling
- 3733: Progress bar clean-up: fix thread sanitizer issue, and move progress bar code to individual operators
- 3720: Issue 3515: Add statistical rounding
- 3707: Fix 3702: avoid assertion that we are not storing internal entries in the file
- 3706: Implement sqlite3_file_control and sqlite3_sleep
- 3705: Add support for ENUM converted types in the Parquet reader
- 3699: Zero-copy scans for non-list uncompressed segments
- 3695: Only rename pandas columns that have duplicates
- 3692: Compatibility with dev dbplyr
- 3691: Fix 3690: correctly assign catalog set to default objects to avoid crash when used as dependency
- 3681: R: Fail CI/CD on NOTEs, check examples on UBSAN, log valgrind output
- 3677: Fuzzer fix: avoid reporting non-internal errors
- 3676: More ccache removal from OSX Extension Release
- 3675: More extensive SQLLogicTest testing, and temporarily disable OR pushdown
- 3667: Handling dataframes with repeated names in columns outside the bind. Now when registering df for scan.
- 3665: Delete correct revision in pypi cleanup script
- 3664: try/except in pypi cleanup
- 3663: Return PY registered objects from temporary views
- 3662: Remove CCache from the OSX Extensions Release build
- 3661: Automatic PyPI cleanup in CI
- 3653: Fixing enum comparison at where clause to TRY_CAST
- 3652: to issue3475 optimize CSG & CMP enumeration of join order optimizer
- 3650: Issue 3610 mem leak
- 3648: Julia DataFrame Scan Performance Improvements & TPC-H Tests
- 3646: ODBC: adjustments because of ADO
- 3643: Fix for 3639, dont use string copy and value api to fill factor vector
- 3635: Avoid running approx quantile with vsize=2
- 3634: Fix some issues with the fuzzer auto-closing issue behavior
- 3633: Add default type generator, move built-in types to default type class and improve error reporting for types
- 3632: Check for div by zero in distinct stats
- 3630: Fix issue 3611
- 3629: S3 Minio fix
- 3628: Issue 3625: Adding canonical guards around Arrow CData Interface
- 3624: Add interval to DBAPI description
- 3615: Fix 1785: correctly copy constraints in ADD COLUMN of alter table
- 3614: Correctly propagate what a statement returns from the binder
- 3613: SQLSmith fuzzer fixes
- 3612: SQLite UDF fixes for writefile and friends
- 3609: Fix operator precedence of ** in the parser
- 3608: Turn the expression depth limit into a configureable parameter
- 3607: Implements __enter__ and __exit__ functions on pyconnection to allow the use of context managers
- 3606: Use Python 3 for configuring R
- 3604: Equal or null optimization
- 3603: Fixing ascii bug in histogram strings
- 3602: Support for Arrow Timezone
- 3598: Add auto-commit off to JDBC Connection
- 3594: Issue 3588: Half constant BETWEEN
- 3592: Issue 3444: Approximate quantile lists
- 3589: Issue 1187: Virtual Generated Columns
- 3576: More compliant with substrait and upgrading version up to 0.1.2
- 3575: Issue 3534: Remove TIMESTAMPTZ casts
- 3574: Issue 3430: Temporal Infinity Values
- 3571: Fixing JNI, matching function signature exactly
- 3569: Implicit struct_pack
- 3564: Fix for 3562
- 3551: Issue 2309: Update benchmark info in README.
- 3550: ICU Extension Rework: clangd for extensions
- 3547: Issue 3273 support multistatments for JDBC driver
- 3546: Issue 2910: Support pandas boolean datatype
- 3533: Exit with the correct exit code in the regression test runner
- 3531: Correctly increment list offset on histogram aggregation
- 3528: Julia Client - re-enable parallelism by executing tasks on dedicated Julia threads
- 3524: Rework table-in-out function API, and move Unnest table function to table-in-out function
- 3523: Improve HyperLogLog
- 3519: Support in-place updates for unsigned integers
- 3516: Issue 3497: Round DECIMAL casts
- 3514: Issue 3453: Window Partition Collections
- 3512: Issue 3418: Match Multiple Spaces
- 3511: Fix 3505: Correctly handle Foreign Key syntax for when primary-key columns are not specified
- 3507: Fix merge conflicts
- 3504: ODBC: issue 3398
- 3503: ODBC: issue 3478
- 3502: Random-value generation clean-up, and move aux data in client context to separate ClientData class
- 3500: Bug fixes for ENUMs
- 3498: Relational API basics for R client
- 3495: R: support structs
- 3481: List distinct and list unique functionality
- 3474: Unified BufferedCSVReaderOptions parsing
- 3470: Force aggregates to have a Combine method, expose bind data in combine & general bind data clean up
- 3469: Add duckdb.lib to Windows release package
- 3467: ODBC: PowerBI showing column headers
- 3464: CSVReader option 'ignore_errors'
- 3456: Add C API functions to build list/map types and read map types
- 3454: CMake install DLL file on Windows platform
- 3442: ICU Extension Rework: No longer use ICU amalgamation, and update ICU data to 71
- 3437: Implement JNI class, method and field caching
- 3420: Expose get table names from conn to python
- 3416: R extension loading
- 3410: Turn SQLSmith into an extension, add CI fuzzing framework, and add automatic SQL test case reduce functionality
- 3405: Issue 3403: Logical Type Append
- 3389: Issue 3187: Implement strptime_icu
- 3388: CI: Use ccache and clang-tidy-cache
- 3386: Issue 3384: DATE_TRUNC for INTERVAL
- 3382: Fixing python dependency memory leaks
- 3375: Rebind prepared statements in case of type ambiguities, rather than default to VARCHAR
- 3346: list_sort function support


Not secure
This is a bug fix release that we need to create because uploading artefacts failed for the last one. Contents are the same as plus some minor bug fixes.

Note: We are going to switch to a new versioning scheme, so the next proper release will be 0.4.0


Not secure
This preview release of DuckDB is named "Sansaniensis" after the (regrettably extinct) [Chenoanas sansaniensis](

Binary builds are listed below. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the `EXPORT DATABASE` command with the old version followed by `IMPORT DATABASE` with the new version to migrate your data. See the [documentation]( for details.

Below a list of changes in this release

Major Changes & Features

- 2926: DuckDB SQL backend for dbplyr
- 2970: JSON extension
- 2998: Support explicit aggregate state export, re-combination and finalisation
- 3069: S3 writes and 3225: S3 file glob
- 3092: Basic UDF support for Node API
- 3109: Storage dictionary compression
- 3111: Simple filtered aggregates
- 3165: Add support for a `DESCRIBE` statement that gives a summary of all tables
- 3178: 1-based indexing for lists and strings
- 3195: Add support for `FOREIGN KEY`
- 3253: Julia Client & C API Extensions
- 3292: Support NaN and Infinity in floating point columns

Minor Changes & Bug Fixes

- 2954: JDBC enable usage of LocalDateTime via get/setObject
- 2985: Issue 2590: Add overwrite flag to CSV copy, overwrite only if query completes
- 3006: JDBC BigDecimal support
- 3007: Feature: Add support for Excel text format (Update 2996)
- 3010: R: Arrow timestamps in seconds, milliseconds and nanoseconds
- 3027: Allow literal option for regex
- 3030: Macros for floored division and modulo
- 3034: Substrait Installable Extension
- 3038: Issue 3037: DATE + TIME
- 3045: fix for STRING_AGG(...) failing (vector type mismatch) assertion when used with DISTINCT and ORDER BY inside STRING_AGG.
- 3050: R-pkg: cpp11-ify
- 3051: Enable printing of EXPLAIN query trees in the R client
- 3060: Issue 3056: Null list scatter
- 3065: Implementation of list_contains
- 3066: Report dlopen/dlsym errors in extension load
- 3067: ODBC: Many changes
- 3071: c-api: support decimal and prevent invalid type throws
- 3072: Add CMake setting to disable linking of extensions
- 3077: Issue 2498: Consistent NULL hashing
- 3084: Hmb1 select macro feature mr
- 3085: First batch of aggregation functions for python rapi
- 3087: Fix incorrect link for testing docs
- 3088: Add LIST_EXTRACT support for several missing types (including booleans)
- 3090: Fix for Arrow Timezone CI Fail
- 3093: Test/add parser error on missing newline
- 3097: Fix remaining winsock error
- 3098: Round-trippable Expression ToString()
- 3101: Issue 3100: MAKE_DATE struct variant
- 3102: Add flatten function for nested list
- 3107: Allow multiple statements in the R-client
- 3112: Issue 1423: PiecewiseMergeJoin multiple predicates
- 3115: ODBC: SQLGetDescRec and SQLSetDescRec
- 3116: NodeJS Windows CI Fix Attempt
- 3120: Fix 3119: correctly perform case insensitive comparisons in default function/view/schema creation
- 3121: Fix 3108: support ILIKE ESCAPE
- 3123: Issue 3020: Unify column names of DESCRIBE and SUMMARIZE
- 3124: Add Alias to projected columns
- 3125: Adds support for the REPLACE keyword in CREATE TABLE AS ... SELECT (CTAS) statements
- 3126: BLOB support for aggregate state combine
- 3139: More Python Relational API Functions
- 3142: Fix type hints for query_df
- 3147: Python: Relation dependency on Connection
- 3148: Alter Type of column from varchar to enum
- 3151: Support trailing commas in many lists in the parser
- 3154: JDBC - Bugfix - Negative timestamp fix
- 3156: JDBC - Add timestamp with timezone support
- 3158: Enable DISABLE_VPTR_SANITIZER by default on M1
- 3161: Implementation of unnest(null), list_position, rewrites
- 3162: Add support for list parameters in the Python API
- 3163: ODBC: Diagnostic Feature
- 3166: Move test_group_by_parallel out of the coverage tests
- 3171: Fix 3169: verify that WAL exists in PRAGMA database_size
- 3173: Adding chunk size parameter to functions that return arrow objects.
- 3174: Correctly zero-initialize pg_parser allocation heap to prevent potential corruption in clean up of parser state of SQL strings
- 3179: Change pipe so it doesnt print on terminal
- 3180: Fix for build error of R package on Windows
- 3190: Fix Python avoid deleting all locally installed libraries and instead only remove installed DuckDB libraries
- 3191: Returning feature for INSERT
- 3192: Tear down connections
- 3196: linking fixes for extensions
- 3197: Fix convert uuid to arrow str error
- 3199: Dbplyr-backend SQL translation of must use only IS NULL
- 3201: Enable universal builds for OSX
- 3208: numeric md5 functions
- 3209: JDBC - Fix missing metadata
- 3213: Making the deliminator more flexible and Q 02/17/20 of TPC-H for Substrait
- 3214: Extension linking fix
- 3218: Fixed empty list aggregates
- 3219: Issue 1423: IEJoin Implementation
- 3220: Fix for 3200
- 3221: FIX for parquet reader on diff files
- 3224: feat: expose from_substrait in python package
- 3226: ODBC: Windows setup
- 3230: Fix for 3215
- 3231: CodeCov apparently does not like target anymore, + validate codecov configuration in CI
- 3232: Fix 3223: Prune trees with LIMIT 0
- 3233: Fix 3205: implement skip for struct and list column readers
- 3234: Fix 3222: avoid int overflow in RleBpDecoder
- 3235: Removing std::binary_function because its deprecated in cpp11
- 3238: Parquet globbing: Better support for schema evolution
- 3239: Properly send mapped function on RAPI
- 3244: Returning feature for update and delete statements
- 3245: test: prevent master ci from being canceled
- 3251: Improving CI performance
- 3255: Adding check_same_thread option to py connector
- 3256: ci: restructure to run format/tidy/codecov for python
- 3263: JDBC - Enable useage of ENUM type
- 3264: Allow the use of native replacement scan of parquet/csv files with the dbplyr-backend
- 3266: Fix 3260: if a schema name is provided, pass along the schema name and table name to the replacement scan
- 3268: Add python module constants from PEP249
- 3270: python extension loading tests
- 3274: Implementation of the list aggregate function
- 3276: Properly resizing DuckDB batches that reference arrow batches
- 3281: ODBC: LibreOffice on Linux
- 3287: Several Julia API enhancements
- 3289: ODBC: windows installer has to copy and pass program parameters
- 3293: Issue 3262: Nested comparison fixes
- 3295: Allow strftime arguments to be specified in both orders
- 3299: [Arrow] Read Record Batch Reader and Scanners
- 3301: Use FieldWriter/FieldReader in Checkpoint Manager
- 3303: Add benchmark_runner based regression test, and remove random engine from cycle counter
- 3305: Fix 3304: correctly trigger old result-set materialization prior in duckdb_value_is_null
- 3307: Fix 3271: correctly check for negative limit and offset
- 3308: Cleanup some unused include
- 3311: Fix 3272: avoid incorrectly moving LIMIT to before the ORDER clause in certain cases
- 3312: Issue 3290: Histogram Temporal Bindings
- 3313: Issue 3275: Global Operator State
- 3314: Issue 3262: Dead Code Removal
- 3318: R bug-fixes: Pipes in tests and silence R NOTE
- 3323: Fix 3291: delete root entries after a catalog entry is deleted and no more transactions can reference it
- 3328: Fix 3294: initialize validity mask to correct size in placeholder code
- 3329: Fix use after free bug in local storage
- 3331: Add automatic issue labeler
- 3335: 3324 Throw error instead of crashing when misusing prepared statements
- 3338: Issue 3298: Nested Unflat MinMax
- 3339: Add a create_value for strings to the Julia API
- 3342: Issue 1423: IEJoin Performance Improvements
- 3343: Issue 3118: Non-string Formats
- 3355: Fix 3349: correctly handle empty table case in grouping set
- 3356: Fix 3350: correctly update statistics after a SINGLE join, since SINGLE joins may introduce NULL values
- 3357: Fix 3351: avoid double-binding functions in subqueries after an initial binding error
- 3358: Fix 3352: fix several bugs with index selection for verifying foreign key constraints
- 3359: Fix 3353: check if any results are returned in sqlite api wrapper before looking at the chunk
- 3360: Fix 3354: add missing recursive CTE node traversal in correlated subquery flattening
- 3362: ODBC:
- 3363: Fix 3361: correctly handle overflows in sequences with cycles
- 3369: Fix 3367: correctly detect overflow in statistics propagation for ORDER BY
- 3370: Fix 3366: check for invalid double values in progress bar
- 3372: Fix 3365: correctly handle overflows in left-shifts
- 3376: Fix Python Windows CI
- 3378: Correctly handle rowid scans in Julia DataFrame scan (for COUNT(*))
- 3380: ArgMinMax: correctly manage memory of strings in both values and arguments
- 3381: Python extension loading
- 3383: ODBC: usage message
- 3399: removed -k param for gzip
- 3406: Install AWS CLI in CentOS Extension


Not secure
This preview release of DuckDB is named "Gibberifrons" after the [Sunda teal](

Binary builds are listed below. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the `EXPORT DATABASE` command with the old version followed by `IMPORT DATABASE` with the new version to migrate your data. See the [documentation]( for details.

Below a list of changes in this release

- 2797: Add interface support for incremental/deferred query execution in main thread
- 2682: Issue 561: Time Zone Support, 2703: 561: Time Zone Foundations
- 2578: Enable support for multi-dot column references
- 2613: Add support for EXPLAIN ANALYZE
- 2569: Support installation of extensions from central repository
- 2843: Parquet Writer: Support writing all types (test_all_types), and write column statistics, 2838: Add support for reading and writing the MAP type to the Parquet reader/writer, 2832: Parquet Writer Rework: Support complex types, 2597: Extend Parquet writer support for UNSIGNED types, various timestamp types, and correctly set converted types in more cases

Minor Changes & Bug Fixes

- 3042: Issue 3029: Prevent CURRENT_QUERY folding
- 3041: Fix 3017: detect recursive view construction and throw an appropriate error
- 3040: Fix 3015: fix edge case issue with many null values in physical Top N
- 3039: Update Java DuckDBAppender to allow appending null values - fixes issue 3035
- 3028: Install covr from main development branch
- 3026: Issue 2965: CTE parameter binding
- 3024: Issue 3023: Simple filtered aggregates
- 3021: Move install_extension test to test_slow
- 3016: Issue 2923: Quote ENUM types
- 3014: Issue 2908: UTF8 BOM Headers
- 3013: Fix 3005: correctly normalify vector in array_slice
- 3012: Fix 2999: Support ANY_JOIN in flattening correlated subqueries
- 3011: Fix 2986: correctly copy old data over when calling repalloc in parser
- 3004: Fix 2997: allow maximum CSV line size to be configurable
- 3001: Document installation of dependencies in Python package README
- 3000: Lookup parent frames for replacement scans
- 2983: Fix 2975: fix off-by-one in transform of string constant to decimal in case of large negative numbers
- 2982: Python API - allow duckdb.query to run arbitrary queries
- 2980: Fix dead link in readme
- 2979: Fixing Python CI
- 2978: Ensure that users cant run concurrent queries using cursor()
- 2974: Use cpp11 for rpkg
- 2973: ODBC: SQLGetTypeInfo, SQLTables, and SQLColumns
- 2971: Arrow use_async argument deprecation
- 2969: FieldWriter/FieldReader for Backwards/Forwards Compatible Storage
- 2963: Fixing parquet scan with or filters (issue 2955)
- 2957: Fixing wrongful release of arrow arrays
- 2956: fix: use selection vector to ensure ids are ordered
- 2953: Fix cancellation configuration
- 2952: Check coverage for R
- 2951: Adding Cross Product Relation
- 2949: Update copyright info to name DuckDB Foundation
- 2946: Style R code
- 2943: Disable arrow integration tests on Windows
- 2941: Prefix inlined third party libraries with duckdb_
- 2940: CMakeLists.txt: Add 'delayimp.lib' to delay-loaded DLL on MSVC
- 2939: src/include/duckdb/common/assert.hpp: Added winapi
- 2937: Install Python 3.7 from source on Ubuntu 16
- 2935: adding the v to the amalgamation version string
- 2930: list_slice test fix
- 2925: Enable building the HTTPFS extension for both Windows and OSX
- 2924: Add Node 17 to build factory
- 2921: Fix for array_slice when end index is out of bounds
- 2920: ODBC: cursor functions
- 2919: Preserve Identifier Case by default, rather than lower-casing all unquoted identifiers
- 2918: Add left join type to python relational API
- 2917: list_slice alias for array_slice
- 2912: Fixing Arrow Stream Output Error
- 2906: not export deletes to allow crosscompile
- 2905: Use difftime_str instead of hms class
- 2904: Use correct hms value
- 2903: Robust cancellation via concurrency
- 2901: Minor tweaks in R code
- 2899: Support for GROUP BY ALL/ORDER BY ALL
- 2895: Add duckdb_keywords function
- 2894: OSS Fuzz Fixes
- 2890: ODBC driver assets
- 2888: Add JDBC's setTimestamp method
- 2886: Use double to store scale factor in TPC-H answers
- 2885: Better support for Parquet 2 Page Layout
- 2880: fix python profile html generator to support updated JSON format.
- 2871: Issue 1423: Refactor PiecewiseMergeJoin
- 2870: bug fix for order by header
- 2869: Value Rework: Make all members private and use accessors
- 2867: test: fixed typo for decimal type in test_all_types
- 2865: Issue 2782: Non-Gregorian Calendars
- 2864: C API: Deprecate direct access into duckdb_result and duckdb_column structs
- 2863: ODBC: conformance core level of SQLAllocHandle, SQLFreeStmt, SQLGetDiagRec, SQLSetStmtAttr, and descriptors
- 2856: Issue 2842: Implement make_date/time/timestamp
- 2855: right case for winsock2.h
- 2854: Issue 2831: Disable WINDOW FILTER
- 2852: Issue 2827: Postgres datepart compatibility
- 2851: When using Replace, keep the alias of the original column
- 2850: Avoid reading past the end of the string when parsing a time as part of an interval
- 2848: Fix 2847: Write parquet files to test dir
- 2846: Issue 2780: Remove DATETZ type
- 2845: Turn FileSync into a nop in the PipeFileSystem, and add clear error message when ParquetReader is used to read from a FIFO stream (e.g. /dev/stdin)
- 2844: Support read_csv_auto from /dev/stdin
- 2837: Fix potential use after move detected by linter, and add DISABLE_DUCKDB_REMOTE_INSTALL define
- 2835: Issue 2834: ICU BindAdapterData::Equals
- 2833: CI Fixes, TSAN Fix
- 2830: Fix 2828: BUILD_HTTPFS does not work
- 2825: Fix 2823: Correctly alter cardinality estimation in LIMIT/SAMPLE clauses
- 2822: Issue 2779: DATE_PART structs
- 2819: add `INTERVAL` support to node.js
- 2818: Adding Parquet extension to node module
- 2817: R: Make method definition more similar to S3
- 2808: Revert stack-overflow detection back to having a maximum (expression) depth in the transformer
- 2807: Add discord badge
- 2806: Refactor SQLLogicTest
- 2802: R-Dataset: Add flag to enable async scanner
- 2801: Add support for list equivalent of range/generate_series with timestamp+interval
- 2800: Fix 2749: avoid copying subquery in BETWEEN expressions
- 2799: Fix 2791: allocate data and mask locations to correctly handle counts > vector_size in the row_gather
- 2798: Fix issue in perfect hash join when (max - min) does not fit into an INT64
- 2796: Addition of QUALIFY clause
- 2794: Add Extension Install CI tests, and fix various issues found through this process
- 2793: Enum Functions
- 2792: PhysicalStreamingWindow operator
- 2788: Issue 2778: Missing date parts
- 2784: adds `BOOLEAN` support to node.js bindings
- 2773: Fix 2761: correctly check that stderr is pointing to a terminal
- 2770: Fix a bug in the sqlite3_api_wrapper that resulted in not correctly reporting why a database could not be opened
- 2767: Issue 561: Implement ICU AGE
- 2765: Add Connection::GetTableNames method to C++ API that allows you to extract the required table names from a query
- 2760: Issue 561: Implement ICU DATEDIFF
- 2759: Fix string constructor usage
- 2757: Extension dashes to underscores
- 2756: Issue 561: Implement ICU DATESUB
- 2753: Python - Test All Types
- 2751: Fix 2750: check enable_external_access flag in more locations
- 2748: Cleanup pointer swizzling code
- 2746: Fix 2745: correctly detect when a RECURSIVE CTE does not contain a reference to itself (i.e. is not a recursive CTE at all)
- 2744: C++17 warning fixes, plus CI tests for compiling (parquet) amalgamation with C++17
- 2742: Common: typo and remove unused files
- 2739: Add test_all_types function
- 2738: GH Actions: avoid upload on master, and try to fix codecov failures on master
- 2737: Typo: Rename Alises to Aliases
- 2732: Tests for Python + 1732
- 2731: Pushing down OR filters
- 2730: Issue 561: ICU Date addition
- 2729: Add duckdb_functions table function
- 2727: RAII for SortedBlock
- 2725: Windows: Remove OVERLAPPED IO flag, it is not required and seems to cause concurrency problems
- 2723: Fix 2471: correctly handle offset passed by ::UpdateSegment, and handle it earlier to clean up code
- 2722: Infer COPY TO format from file extension
- 2721: Update of PERCENT keyword in the LIMIT clause(2671)
- 2719: Fix 2713: correctly bind multi-part column references in correlated subqueries
- 2718: Add "position" as an alias to the "instr" function
- 2712: Use and_kleene for Arrow filters
- 2711: Fix CSE optimizer: keep around expressions as they might be referenced in the expression_map
- 2710: Modify LEAST/GREATEST to ignore NULL values
- 2708: Fix 2701: Handle VALUES lists in correlated subqueries
- 2706: Ignore cancel request on master
- 2702: Rename snappy namespace to duckdb_snappy, and enable Parquet extension for the exported symbol checker
- 2697: Support reading of ZSTD files, and add support for writing GZIP and ZSTD files
- 2696: FetchDF for nested types (Lists, Maps and Structs)
- 2693: Fix 2663: correctly implement EXTRACT(EPOCH from TIME) as seconds since midnight
- 2692: Fix 2678: Fix undefined behavior for sequences close to INT64 min/INT64 max
- 2691: Correctly handle synchronous I/O being returned from Windows API
- 2690: Use templated memcpy/memcmp more
- 2689: Reduce memory footprint of Python/R compilation by default by disabling unity builds unless DUCKDB_BUILD_UNITY flag is enabled
- 2686: Fix 2685: prevent CSE optimizer from causing short-circuiting issues, and add disable_optimizers setting
- 2684: Python 3.10 builds
- 2681: Benchmark/test format cleanup
- 2679: Bitpacking storage compression
- 2673: remove extra semicolon.
- 2665: Merge arrow_register into register function
- 2662: Fix 2656: correctly transform DISTINCT with ORDER BY into DISTINCT ON
- 2660: Issue 2614: Wide windows
- 2659: Fix 2652: Make struct fields case insensitive
- 2658: Fix various Windows unicode issues
- 2657: Initializing matchers to avoid valgrind complaints
- 2655: Add templated memcpy/memcmp
- 2650: Fix bug in parquet reader causing list columns to be parsed incorrectly (2557)
- 2648: Fix 686: remove hard-coded memory limit in parser and fix error message propagation from exceptions thrown in parser
- 2644: Fix 2641: correctly handle tab delimiters in COPY TO/FROM
- 2642: Issue 2552: SUBSTR BIGINT
- 2639: Fix 2586: correct semantics for extract(second, ...) from intervals
- 2636: Hashing enum values (Enum comparison bug fix)
- 2635: Fix for R factor scans
- 2631: ODBC: Refactoring Parameter Descriptor
- 2630: Try to Cast Enums to other types
- 2626: Escape column names in dbWriteTable() Fixes 2622
- 2623: Fix 2612: Correctly check that default is set on copy of SetDefaultInfo
- 2611: Multithreaded Python
- 2609: Configuration Rework & Cleanup
- 2602: Adding pragma option for parquet binary as string
- 2583: Issue 2549: Support IGNORE NULLS
- 2576: Add generate_subscripts macro
- 2526: Sequence ownership


Not secure
This preview release of DuckDB is named "Spectabilis" after the [King Eider](

Binary builds are listed below. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the [documentation]( for details.

Below a list of changes in this release

- 2393: Switch to Push-Based Execution Model
- 2347: Support for ENUM Types & 2404: Native mapping between R factors and DuckDB ENUMs
- 2419: Allow WHERE clause referring aliases defined in SELECT clause
- 2473: Adding Compression Option for Column Definitions to SQL Parser
- 2489: Implement MAD (Moving Absolute Deviation) Aggregate
- 2520: Add LIST_CONCAT and LIST_APPEND functions
- 2522: MSD (Most Significant Digit) Radix Sort
- 2529: Implement REGEXP_EXTRACT
- 2482: Add support for EVEN
- 2555: Adding BINARY_AS_STRING parameter to the parquet scan

**Minor Changes & Bug Fixes**
- 2377: Fix current_schema() and current_schemas()
- 2380: Add tests for "did you mean" error message
- 2381: Let FTS index creation respect the current schema.
- 2382: Dropping support to Python 2
- 2385: BLOB support for JDBC
- 2389: Replace __getattr__ on PyBind11 classes with individual properties.
- 2390: Moving big categorical tests to tests_slow folder
- 2394: Add SET s3_endpoint support for in-house Ceph
- 2397: Add Python .pyi stubs
- 2402: GH Actions Upload: retry asset upload with timeout
- 2403: Not altering original DF when renaming columns in the binder
- 2405: Fix bug with enum::varchar cast on null values
- 2408: Rewrite Arrow table register for R using replacement scans
- 2409: Adding dependency on Enum Types -> Tables
- 2412: Updated src readme to state we use push-based execution.
- 2413: Fix for 2411
- 2421: Fix 2407: use correct template parameters for DATE in arg_min/arg_max
- 2423: Fix 2416: fix binding issues related to binding parameters, null values, etc in list_extract and array_length
- 2424: Issue 2388: QUANTILE_DISC for VARCHAR
- 2430: Fix for 2426
- 2431: More fixes for 2416
- 2434: Issue 2388: Moving VARCHAR QUANTILE_DISC
- 2437: implement GEN_RANDOM_UUID
- 2438: Issue 2432: PERCENTILE_XXXX ignores DESC
- 2439: fix: pass absolute path to `System.load()` in Java
- 2444: Fix 2440: correctly report run-time errors in Python client
- 2445: Several OSS Fuzz Fixes
- 2448: Move to codecov v2, and use add_library for vector operations for low RAM machines
- 2449: Enum to Enum Comparisons
- 2451: Hooold the loooock for Python Strings under Dataframe Object Columns
- 2453: Fix when getting single values from ENUMs
- 2455: Doc Improve: Trying to Update doc in `QueryResult`
- 2456: Add --test-dir parameter to unittest so we can test out-of-tree extensions with it
- 2462: Fix 2452: Implement Coalesce instead of rewriting to CASE chain
- 2463: More OSS Fuzz fixes
- 2474: Allow Fetch of chunks containing a multiple of vector sizes for the Arrow Record Batch Reader
- 2476: Really holding the lock this time
- 2477: Sorted aggregate: only re-order when ordering count > 0
- 2485: Benchmarks: Handle comparisons for values that do not have a VARCHAR ->TYPE cast (e.g. complex/list types)
- 2487: Conditionally define UNLIKELY in Thrift
- 2488: ODBC: fetching the first chunk in SQLExecute
- 2490: Clean up RadixSort code
- 2491: These tests are now passing with arrow 6
- 2494: Emit full vectors from VALUES lists instead of emitting individual tuples
- 2497: Upgrade Catch to v2.13.7
- 2500: Fix nested string order
- 2501: Add CIFuzz action
- 2503: Fix for py string conversion on large strings
- 2504: More precision for `SUM` and `AVG`
- 2517: Move Kahan sum to separate method (fsum, sum_kahan)
- 2521: Issue 2515: Windowed quantile list
- 2527: testing: Add oss-fuzz fuzzer
- 2536: Fix 2518: in read_csv_auto don't override names if names have been provided
- 2537: Fix 2531: in recursive CTE avoid waiting for events to finish if an event has thrown an error
- 2539: Restructuring CI Workflow
- 2542: Issue 2530: Reset windowed lists
- 2550: ODBC: Running PSQLODBC tests on Win64
- 2556: Fixed directory separator bug
- 2558: Fixing positional reference binding in ORDER BY clause
- 2559: Issue 2552: General ordered aggregates
- 2561: Fix master CI: Python workflow needs auth tokens for deployment
- 2563: Move ExtensionHelper into main DuckDB Class
- 2564: R Client: Moving UTF encoding to R to avoid multithreading issues
- 2567: Fix 2538: crash in CSV auto-detect when reading ZSTD data
- 2573: Move HTTPFS builds to separate test to avoid deploying them by default on Linux
- 2574: Naming optimizer-created aggregates so plans are interpretable
- 2579: Support to Arrow 6
- 2580: Check magic bytes before checksum when opening a DuckDB database file
- 2585: Fix 2584: correctly handle edge cases for bigger than 1 increments in range table function
- 2587: Replacement Scans for Arrow Objects
- 2592: Fix 2577: Rework case statement to avoid rewrite into nested binary cases
- 2593: Fix 2591: avoid using ungrouped aggregate for non-combineable aggregates
- 2594: Fix 2588: timestamp -> date cast is not invertible
- 2595: Fix 2543: case insensitive replacement scans
- 2598: OSS Fuzz Fixes
- 2603: The asset upload script for releases was broken somehow
- 2605: Clean up reupload by splitting it into two functions
- 2604: Fix 2599: maintain correct dependencies between UNION ALL nodes so that output is deterministic/in-line with what a sequential execution would produce


Not secure
This preview release of DuckDB is named "Gracilis" after the [Grey Teal](

Binary builds are listed below. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the [documentation]( for details.

This release contains a novel join method, the 1959: Perfect Hash Join. Otherwise there are many improvements and bug fixes however, a list is below:

- 2377: Fix current_schema() and current_schemas()
- 2371: Installing pandoc so R pkg can be fully checked
- 2369: More CI fixes
- 2361: ODBC: First version Winsetup
- 2360: Issue 2348: Support bankers rounding as default function
- 2359: Implement UUID data type
- 2358: Fixes minor flag comment
- 2357: Issue 2351: Ordered aggregate transformation
- 2356: Issue 2286: Numeric SUMMARIZE stats
- 2353: Get rid of a couple of Clang warnings.
- 2346: Avoid re-using RE2 regex between threads, since RE2 regex objects have locks internally
- 2328: CI Fixes
- 2321: Issue 1998: Exact Timestamp Subtraction
- 2320: Change SET's default scope from GLOBAL to (PG-compatible) SESSION.
- 2319: Fix 2315: correctly detect that index joins cannot be used for multi-column indexes, and clean up TPC-DS extension
- 2318: Remove extra semicolon.
- 2317: Support SET SCHEMA and SET SEARCH_PATH
- 2316: Fix for 2304
- 2314: Fix 2313: No Out of Range Error in Index Benchmark
- 2311: Issue 2310: Create Index Benchmark
- 2306: Windows (64 bits) and -DDISABLE_UNITY=1
- 2302: Fix 2301: ART Leaf Node shrink
- 2300: Fix 2293: Correctly escape all special characters (quotes, newlines, tabs, etc) in JSON output of query profiler
- 2299: Fix 2296: Avoid requesting O_RDWR permissions when we only need O_WRONLY so we can write to FIFO streams
- 2298: Fix 2294: In CSV reader correctly generate column names with many columns
- 2297: Issue 2241: Transacted Index Reinsert
- 2290: Fix 2289: align default continue prompt
- 2287: ODBC: list catalog, schema and test_blob
- 2284: Make S3 credentials session scoped
- 2282: Fix for bug 2281
- 2280: Initial support to read lists from R client
- 2279: Fix 2277: add support for lists of structs to LIST_EXTRACT
- 2276: Add support for EXCLUDE and REPLACE clauses
- 2275: Run only CRAN tests for valgrind
- 2274: Fix 2267: For structs, get the required amount of rows from a non-list child if there is one
- 2272: Rename force_parallelism to verify_parallelism
- 2271: Make regression run parallel with 2 Threads
- 2266: A refactoring around FileSystem
- 2265: Allow optional extensions when building the R package
- 2263: Regression Test: TPC-DS/H20AI and other adjustments
- 2262: Fix 2261: add support for filters pushed down into decimal columns in Parquet files
- 2259: Fix a TSAN error for test/sql/window/test_partition_flushing.test
- 2255: Make sorting even faster
- 2254: More descriptive out-of-memory error when db is launched in-memory
- 2253: Regression Tests
- 2251: Changes from CRAN 0.2.9 release
- 2234: Add support for S3 session token (STS)
- 2228: Date functions on Windows


Not secure
This preview release of DuckDB is named "Platyrhynchos" after the very well-known [Mallard](, πλατυρυγχος meaning "broad-billed".

Binary builds are listed below. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the [documentation]( for details.

Major changes (not listing minor bug fixes and small changes):

- 2099: **Persistent Storage Compression Framework** & RLE compression for numeric columns
- 2157: Multi-Occupancy Blocks in the Storage

- 2247: Support session and global `SET` statement variable scopes.
- 2230: Full Case Insensitivity in the Binder & Catalog
- 2208: Allow duplicate column names in subqueries/`CREATE TABLE AS`, similar to SQLite
- 2206: Allow unnamed subqueries
- 2189: Add support for `SUMMARIZE` of SQL statement/table
- 2158: `ORDER BY` aggregates
- 2171: Implement `LAST`
- 2146: Support for `RANGE` and `ARRAY_LENGTH` scalar functions
- 2133: Implement `DATESUB` & 2090: Implement `DATEDIFF`
- 2128: Fall back to VARCHAR when the type of a prepared statement parameter is ambiguous

Performance Improvements
- 2226: Issue 1657: Reduce Window copying
- 2221: Prefetch Parquet Meta Data
- 2172: Top-N Rework using new sort code
- 2167: Use new sort code in window functions
- 2098: Reduce unnecessary sorting overhead
- 2077: Fetch Arrow - Streaming

C Client:
- 2173: Don't strdup error msg
- 2115: Improve performance of duckdb_value functions, add support for HUGEINT type and add extra result helper functions
- 2107: CAPI Cleanup & DATE/TIME/TIMESTAMP rework

R Client
- 2250: Support column subsets in dbAppendTable()
- 2134: Implement dbAppendTable()
- 2136: Implement dbBind() according to specification
- 2119: Enable more DBItest tests

ODBC Client
- 2184: Enabling pyodbc & 2124: Enable nanodbc & 2159: Making the R odbc package work with our ODBC driver
- 2169: Supporting SQLPutData, SQLParamData, SQLMoreResults & - 2096: SQLFetchScroll and SQLGetPrivateProfileString
- 2236: Windows x64 Support


Not secure
This preview release of DuckDB is named "Ceruttii" after a [long-extinct relative of the present-day Harleqin Duck]( (Histrionicus Ceruttii).
Binary builds are listed below. Feedback is very welcome.

Note: Again, this release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the [documentation]( for details.


- 2064: `RANGE`/`GENERATE_SERIES` for timestamp + interval
- 1905: Add `PARQUET_METADATA` and `PARQUET_SCHEMA` functions
- 2059, 1995, 2020 & 1960: Window `RANGE` framing, `NTH_VALUE` and other improvements


- [Many Arrow integration improvements](
- [Many ODBC driver improvements](
- 1815: Initial version: SQLite UDF API
- 2001: Support DBConfig in C API


- 1975, 1876 & 2009: Unified row layout for sorting, aggregate & joins
- 1930 & 1904: List Storage
- 2050: CSV Reader/Casting Framework Refactor & add support for `TRY_CAST`
- 1950: Add Constant Segment Compression to Storage
- 1957: Add pipe/stream file system


Not secure
This preview release of DuckDB is named "Mollissima" after the Common Eider (Somateria mollissima).
Binary builds are listed below. Feedback is very welcome.

Note: This release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the documentation for details.

Major changes:

- 1847: Unify catalog access functions, and provide views for common PostgreSQL catalog functions
- 1822: Python/JSON-Style Struct & List Syntax
- 1862: 1584 Implementing `NEXTAFTER` for float and double
- 1860: `FIRST` implementation for nested types
- 1858: `UNNEST` table function & array syntax in parser
- 1761: Issue 1746: Moving `QUANTILE`


- 1852, 1840, 1831, 1819 and 1779: Improvements to Arrow Integration
- 1843: First iteration of ODBC driver
- 1832: Add visualizer extension
- 1803: Converting Nested Types to native python
- 1773: Add support for key/value style configuration, and expose this in the Python API

- 1808: Row-Group Based Storage
- 1842: Add (Persistent) Struct Storage Support
- 1859: Read and write atomically with offsets
- 1851: Internal Type Rework
- 1845: Nested join payloads
- 1813: Aggregate Row Layout
- 1836: Join Row Layout
- 1804: Use Allocator class in buffer manager and add a test for a custom allocator usage


Not secure
This preview release of DuckDB is named "Jamaicensis" after the [blue-billed Ruddy Duck (Oxyura jamaicensis)]( Binary builds are listed below. Feedback is very welcome.

Note: This release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the documentation for details.

Also note: Due to changes in the internal storage (1530), databases created with this release wil require somewhat more disk space. This is transient as we are working hard to finalise the on-disk storage format.

Major changes:

- 1666: External merge sort, 1580: Parallel scan of ordered result and 1561: Rework physical ORDER BY
- 1520 & 1574: Window function computation parallelism
- 1540: Add table functions that take a subquery parameter
- 1533: Using vectors, instead of column chunks as lists
- 1530: Store null values separate from main data in a Validity Segment

- 1568: Positional Reference Operator `1` etc.
- 1671: `QUANTILE` variants and 1685: Temporal quantiles
- 1695: New Timestamp Types `TIMESTAMP_NS`, `TIMESTAMP_MS` and `TIMESTAMP_NS`
- 1647: Add support for UTC offset timestamp parsing to regular timestamp conversion
- 1659: Add support for `USING` keyword in `DELETE` statement
- 1638, 1663, 1621 & 1484: Many changes arount `ARRAY` syntax
- 1610: Add support for `CURRVAL`
- 1544: Add `SKIP` as an option to `READ_CSV` and `COPY`

- 1525: Add loadable extensions support
- 1711: Parallel Arrow Scans
- 1569: Map-style UDFs for Python API
- 1534: Extensible Replacement Scans & Automatic Pandas Scans and 1487: Automatically use parquet or CSV scan when using a table name that ends in `.parquet` or `.csv`
- 1649: Add a QueryRelation object that can be used to convert a query directly into a relation object, 1665: Adding from_query to python api
- 1550: Shell: Add support for Ctrl + arrow keys to linenoise, and make Ctrl+C terminate the current query instead of the process
- 1514: Using `ALTREP` to speed up string column transfer to R
- 1502: R: implementation of Rstudio connection-contract tab


Not secure
This preview release of DuckDB is named "Falcata" after the Falcated Duck (Mareca falcata). Binary builds are listed below. Feedback is very welcome.

Note: This release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the documentation for details.

Major Changes:

- 1356: **Incremental Checkpointing**
- 1422: Optimize Top N Implementation

- 1406, 1372, 1387: Many, many new aggregate functions
- 1460: `QUANTILE` aggregate variant that takes a list of quantiles & 1346: Approximate Quantiles
- 1461: `JACCARD`, 1441 `LEVENSHTEIN` & `HAMMING` distance scalar function
- 1370: `FACTORIAL` scalar function and ! postfix operator
- 1385: `LIST_EXTRACT` to get a single element from a list
- 1361: Aliases in the `HAVING` clause (fixes issue 1358)
- 1355: Limit clause with non constant values

- 1430 & 1424: **DuckDB WASM builds**
- 1419: Exporting the appender api to C
- 1408: Add blob support to C API
- 1432, 1459 & 1456: Progress Bar
- 1440: Detailed profiler.


Not secure
This preview release of DuckDB is named "Jubata" after the [Australian Wood Duck]( (Chenonetta jubata). Binary builds are listed below. Feedback is very welcome.

Note: This release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the documentation for details.

Major changes:
- 1231: Full Text Search extension
- 1309: Filter Clause for Aggregates
- 1195: `SAMPLE` Operator
- 1244: `SHOW` select queries
- 1301: `CHR` and `ASCII` functions & 1252: Add `GAMMA` and `LGAMMA` functions

- 1211: (Mostly) Lock-Free Buffer Manager
- 1325: Unsigned Integer Types Support
- 1229: Filter Pull Up Optimizer
- 1296: Optimizer that removes redundant `DELIM_GET` and `DELIM_JOIN` operators
- 1219: `DATE`, `TIME` and `TIMESTAMP` rework: move to epoch format & microsecond support

- 1287 and 1275: Improving JDBC compatibility
- 1260: Rework client API and prepared statements, and improve DuckDB -> Pandas conversion
- 1230: Add support for parallel scanning of pandas data frames
- 1256: JNI appender
- 1209: Write shell history to file when added to allow crash recovery, and fix crash when .importing file with invalid
- 1204: Add support for blobs to the R API and 1202: Add blob support to the python api

- 1314: Refactor and nested types support for Parquet Reader


Not secure
This preview release of DuckDB is named "Serrator" after the Red-breasted merganser (Mergus serrator). Binary builds are listed below. Feedback is very welcome.

Note: This release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the EXPORT DATABASE command with the old version followed by IMPORT DATABASE with the new version to migrate your data. See the documentation for details.

Major changes:

- 1179: Interval Cleanup & Extended `INTERVAL` Syntax
- 1147: Add exact `MEDIAN` and `QUANTILE` functions
- 1129: Support scalar functions with `CREATE FUNCTION`
- 1137: Add support for (`NOT`) `ILIKE`, and optimize certain types of `LIKE` expressions

- 1160: Perfect Aggregate Hash Tables
- 1133: Statistics Rework & Statistics Propagation
- 1144: Common Aggregate Optimizer, 1143: CSE Optimizer and 1135: Optimizing expressions in grouping keys
- 1138: Use predication in filters
- 1071: Removing string null termination requirement

- 1112: Add DuckDB node.js API
- 1168: Add support for Pandas category types
- 1181: Extend DuckDB::LibraryVersion() to output dev version in format `0.2.3-devXXX` & 1176: Python binding: Add module attributes for introspecting DuckDB version

Parquet Reader:
- 1183: Filter pushdown for Parquet reader
- 1167: Exporting Parquet statistics to DuckDB
- 1162: Add support for compression codec in Parquet writer & 1163: Add ZSTD Compression Code and add ZSTD codec as option for Parquet export
- 1103: Add object cache and Parquet metadata cache


Not secure
This is a preview release of DuckDB.
Starting from this release, releases get named as well. Names are chosen from species of ducks (of course). We start with "Clypeata".

*Note*: This release introduces a backwards-incompatible change to the on-disk storage format. We suggest you use the `EXPORT DATABASE` command with the old version followed by `IMPORT DATABASE` with the new version to migrate your data. See the [documentation]( for details.

Binary builds are listed below. Feedback is very welcome. Major changes:

- 1057: Add PRAGMA for enabling/disabling optimizer & extend output for query graph
- 1048: Allow CTEs in subqueries (including CTEs themselves) and 987: Allow CTEs in CREATE VIEW statements
- 1046: Prettify Explain/Query Profiler output
- 1037: Support FROM clauses in UPDATE statements
- 1000: Implement MD5 function
- 936: Add GLOB support to Parquet & CSV readers
- 899: Table functions information_schema_schemata() and information_schema_tables() and 903: Add table function information_schema_columns()

- 984: Parallel grouped aggregations and 1045: Some performance fixes for aggregate hash table
- 1008: Index Join
- 991: Local Storage Rework: Per-morsel version info and flush intermediate chunks to the base tables
- 906: Parallel scanning of single Parquet files and 982: ZSTD Support in Parquet library
- 883: Unify Table Scans with Table Functions
- 873: TPC-H Extension
- 884: Remove NFC-normalization requirement for all data and add COLLATE NFC

- 1001: Dynamic Syntax Highlighting in Shell
- 933: Upgrade shell.c to 3330000
- 918: Add in support for Python datetime types in bindings
- 950: Support dates and times output into arrow
- 893: Support for Arrow NULL columns


Not secure
This is a preview release of DuckDB. Binary builds are listed below. Feedback is very welcome. Major changes:

- 770: Enable Inter-Pipeline Parallelism
- 835: Type system updates with 779: `INTERVAL` Type, 858: Fixed-precision `DECIMAL` types & 819: `HUGEINT` type
- 790: Parquet write support

- 866: Initial Arrow support
- 809: Aggregate UDF support with 843: Generic `CreateAggregateFunction()` & 752: `CreateVectorizedFunction()` using only template parameters

- 824: `strftime` and `strptime`
- 832: read_csv(_auto) improvements: optional parameters, configurable sample size, line number info


Not secure
This is a preview release of DuckDB. Binary builds are listed below. Feedback is very welcome.

- 730: `FULL OUTER JOIN` Support
- 732: Support for `NULLS FIRST`/`NULLS LAST`
- 698: Add implementation of the `LEAST`/`GREATEST` functions
- 772: Implement `TRIM` function and add optional second parameter to `RTRIM`/`LTRIM`/`TRIM`
- 771: Extended Regex Options

- Python: 720: Making Pandas optional and add support for PyPy
- C++: 712: C++ UDF API


Not secure
This is a preview release of DuckDB. Binary are listed below. Feedback is very welcome. Major changes:
New [website]( [woo-ho](!

- 653: Parquet reader integration

- 685: Case insensitive binding of column names
- 662: add `EPOCH_MS` function and test cases

- 681: JDBC Read-only mode for and 677 duplicate()` method to allow multiple connections to same database


Not secure
This is a preview release of DuckDB. Feedback is very welcome.

- SQL functions `IF` and `IFNULL` 644
- SQL string functions `LEFT` 620 and `RIGHT` 631
- 641: `BLOB` type support
- 640: `LIKE` escape support

- 627: Insertion support for Python relation API


Not secure
This is the sixth preview release of DuckDB. Feedback is very welcome.
[Binary builds are available as well](

- [Add / remove columns, change default values & column type]( #612
- [Collation support](
- CSV sniffer `READ_CSV_AUTO` for dialect, data type and header detection 582
- `SHOW` & `DESCRIBE` Tables 501
- String function `CONTAINS` 488
- String functions `LPAD` / `RPAD`, `LTRIM` / `RTRIM`, `REPEAT`, `REPLACE` & `UNICODE` 597
- Bit functions `BIT_LENGTH`, `BIT_COUNT`, `BIT_AND`, `BIT_OR`, `BIT_XOR` & `BIT_AGG` 608

- `LIKE` optimization rules 559
- Adaptive filters in table scans 574
- ICU Extension for extended Collations & Extension Support 594
- Extended zone map support in scans 551
- Disallow NaN/INF in the system 541
- Use UTF Grapheme Cluster Breakers in Reverse and Shell 570

- Relation API for C++ 509 and Python 598
- Java (TM) JDBC (R) Client for DuckDB 492 520 550


Not secure
This is the fifth preview release of DuckDB. Feedback is very welcome.
Binary builds can be found here:

- 455 Table renames `ALTER TABLE tbl RENAME TO tbl2`
- 457 Nested list type can be created using `LIST` aggregation and unpacked with the new `UNNEST` operator
- 463 `INSTR` string function, 477 `PREFIX` string function, 480 `SUFFIX` string function

- 442 Optimized casting performance to strings
- 444 Variable return types for table-producing functions
- 453 Rework aggregate function interface
- 474 Selection vector rework
- 478 UTF8 NFC normalization of all incoming strings
- 482 Skipping table segments during scan based on min/max indices

Python client
- 451 `date` / `datetime` support
- 467 `description` field for cursor
- 473 Adding `read_only` flag to `connect`
- 481 Rewrite of Python API using `pybind11`

R client
- 468 Support for prepared statements in R client
- 479 Adding automatic CSV to table function `read_csv_duckdb`
- 483 Direct scan operator for R `data.frame` objects


Not secure
This is the fourth preview release of DuckDB. Feedback is very welcome. Note: The v0.1.4 version was skipped because of a Python packaging issue.

Binary builds can be found here:

Major changes:
- 409 Vector Overhaul
- 423 Remove individual vector cardinalities
- 418 `DATE_TRUNC` SQL function
- 424 `REVERSE` SQL function
- 416 Support for `SELECT table.* FROM table`
- 414 STRUCT types in query execution
- 431 Changed internal string representation
- 433 Rename internal type `index_t` to `idx_t`
- 439 Support for temporary structures in read-only mode
- 440 Builds on Solaris & OpenBSD

*Note*: This release contains a bug in the Python API that leads to crashes when fetching strings to NumPy/Pandas 447


Not secure
This is the third preview release of DuckDB. Feedback is very welcome.
Binary builds can be found here:

Major changes:
* 388 Major updates to shell
* 390 Unused Column & Column Lifetime Optimizers
* 402 String and compound keys in indices/primary keys
* 406 Adaptive reordering of filter expressions


Not secure
This is the third preview release of DuckDB. Feedback is very welcome.
Binary builds can be found here:


Not secure
This is the second preview release of DuckDB. Feedback is very welcome.
Binary builds can be found here:


Not secure
This is the first preview release of DuckDB. Feedback is very welcome.

Binary builds can be found here: