DuckDB v0.5.0stable Released Sep 05, 2022
⚠️ Breaking Change Impact Score: 7/10

DuckDB: 0.5.0 Preview Release "Pulchellus"

Source available β€” automated, not human-reviewed

Component: duckdb Β· Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-01.

Breaking-change evidence from the source

  • - #4075: feat(breaking): improve python exceptions
Read the original context β†—
Source flags breaking changes β€” review applicability
πŸ“„ .MD
⚑ Executive Summary (TL;DR)

DuckDB v0.5.0. Source highlight: 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.

Who Does This Impact? (Role-Based Analysis)

πŸ’» Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

πŸ“Š Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

βš™οΈ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

⚠️ Breaking Changes & Deprecations (1)

  • - #4075: feat(breaking): improve python exceptions

✨ New Features & Capabilities (6)

  • #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

πŸ”§ Bug Fixes & Patches (6)

  • #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
πŸ“„ View Raw Release Notes (Original Developer Log)
This preview release of DuckDB is named "Pulchellus" after the [Green pygmy goose (Nettapus pulchellus)](https://en.wikipedia.org/wiki/Green_pygmy_goose) which is native to Australia where [VLDB 2022](https://vldb.org/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](https://duckdb.org/docs/sql/statements/export) 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 setup.py 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 bug_report.md 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 - #4188: ALTER SEQUENCE IF EXISTS fix - #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 DuckDBConnection#getSchema 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