DuckDB upgrades break working setups
37 posts from 28 people20d activeFading, +0 this week
Posts per day
The posts behind it
Amazon provider 9.38.0+: AwsDuckDBHook imports duckdb at module level, segfaulting preloaded gunicorn workers on exit
### Apache Airflow Provider(s) amazon ### Versions of Apache Airflow Providers `apache-airflow-providers-amazon` 9.38.0 and 9.39.0 (`hooks/duckdb.py` is unchanged on `main`). 9.37.0 is not affected because it has no `hooks/duckdb.py`. ### Apache Airflow version 2.11.2 ###...
Parser regression in 2.0: COALESCE() not allowed in CREATE SECRET
### What happens? I am upgrading from DuckDB 1.5.6 to 2.0.0 and noticed a regression in the parser for `CREATE SECRET`, where `COALESCE(...)` cannot be parsed in a position where it was previously allowed. I can work around this by using `SET VARIABLE` and `getvariable()`, but...
2.0 regression: type_pushdown turns TRY_CAST over read_csv into a strict cast (Conversion Error)
### What happens? In 2.0.0, `TRY_CAST(col AS DOUBLE)` over a `read_csv` column that is read as `VARCHAR` raises a conversion error on the first non-numeric value, instead of returning `NULL`. In 1.5.6 the same query returns `NULL` for that row. The new `type_pushdown` optimizer...
ARRAY row-selection regression in DuckDB 2.0, especially in CASE comparisons
### What happens? Fixed-size `FLOAT[N]` embedding comparisons are slower in DuckDB 2.0.0 than in 1.5.6 when used in a CASE expression containing a NULL/exact-match guard followed by several cosine thresholds. All result counts match. A single-cosine control is much less...
rowids change within a transaction when a checkpoint vacuums the table
### What happens? A rowid that a transaction has read can point to a different row, or to no row at all, a moment later, because another connection ran a checkpoint that vacuumed the table in between. No error is raised: queries return wrong rows, and `DELETE`/`UPDATE` by rowid...
Wrong result: comparing a negated DOUBLE column with a NaN constant returns the wrong rows (regression vs v1.5.6; correct with expression_rewriter disabled)
### What happens? A comparison of a negated DOUBLE column with a NaN constant returns wrong rows. DuckDB orders NaN above every other value (including infinity), so `-d > 'nan'::DOUBLE` is false for every row and must return no rows, and `-d 'nan'::DOUBLE`, query 2 is `-d c] as...
Hash join pushes no min/max bounds to table functions when it chooses a prefix-range filter (regression from v1.5)
### What happens? On v2.0, when a hash join chooses a prefix-range filter for an equality key, `JoinFilterPushdownInfo::FinalizeFilters` registers the PRF and `continue`s past `CreateDynamicMinMaxFilters`. The probe-side scan then gets no min/max bounds. That is fine for DuckDB...
DuckDB: expose connect-time config_options in profiles.yml
Related to the [DuckDB adapter epic, #14393](https://github.com/dbt-labs/dbt/issues/14393). ## Problem Please support a `config_options` profile mapping that is passed to DuckDB before the database is opened, matching the purpose of `config_options` in the Python `dbt-duckdb`...
INTERNAL Error "dict-surviving cache: global dictionary column N changed identity" when a CASE passes a joined global dictionary through for some chunks only (v2.0.0 regression)
### What happens? A query joins two tables, computes a column with a CASE whose ELSE branch is a column from the join's build side, and filters selectively on the result. It throws an internal error and invalidates the database: In the reproduction under "To Reproduce", a hash...
HTTP PUT requests retain a reference to the caller’s content-type string
### What happens? `PutRequestInfo` stores `content_type` as `const string &`. Modifying the caller's string after constructing a request changes the request's content type. If that string is destroyed, the request retains a dangling reference. The request should own its content...
Incorrect narrowing cast causes DISTINCT SUM to fail after wrapping a predicate in CASE
...should not change the result. Additional observations: - Removing `DISTINCT` from the failing query makes it return `400`. - In the original reproduction, both `PRAGMA disable_optimizer` and disabling only `compressed_materialization` avoid the error. - The original failing plan...
After a COMMIT fails, acknowledged INSERTs into the same table are lost after CHECKPOINT and reopen (storage version < v2.0.0, table with an index)
...that runs DML on table `a`, `ALTER TABLE a`, and also inserts into `b`. That transaction fails to commit with a spurious "another transaction has altered this table" (fixed on main). - 1.4.5 keeps the rows in both the WAL-error and the single-connection variant. Likely cause...
`CREATE INDEX` racing a committed UPDATE of the indexed column keeps the old value in the ART: lookups miss the row by its new value and return it for its old value, also after restart
### What happens? One connection runs `CREATE INDEX ib ON t(b)`. Another connection commits `UPDATE t SET b = ... WHERE id = ...` while the index is being built. Both statements succeed. Afterwards the index holds the row under its old value: - `WHERE b = ` (index scan) returns...
ALTER COLUMN ... TYPE still drops an UPDATE that commits while the column is being rewritten (after #25008)
### What happens? An UPDATE that commits while another connection's `ALTER TABLE ... ALTER COLUMN ... TYPE` is rewriting that column reports success. Its change to the retyped column is then lost, while its change to the other columns stays. The loss persists after close and...
Parquet: nested columns read on demand skip the external file cache, so every scan reads them again (regression from 1.5)
...again (2.37 MB at offset 1138) in one read, and only f is registered for prefetch. Workarounds I found: - Writing the file with DATA_PAGE_SIZE_LIMIT 524288 makes the pages fit the fallback buffer, and the second scan reads 0 bytes. - read_parquet(..., prefetch_strategy =...
Wrong results for sum() over a LEFT JOIN with an empty right side (statistics propagation, regression in 2.0.0)
### What happens? Since v2.0.0, `sum()` over a LEFT JOIN against an empty table can give wrong results. Comparisons on the sum are folded to the wrong constant, and an integer sum can silently overflow. v1.5.6 returns the correct results. Disabling the `statistics_propagation`...
CREATE VIEW rejects fully qualified `db.db.t` as ambiguous when the view is in `db` (2.0.0 regression)
### What happens? On 2.0.0, `CREATE VIEW` in a database fails when its body references a table of that database by its fully qualified name and the table's schema shares a name with an attached database, including the view's own: The same reference works in `SELECT`, in `CREATE...
Files written with `STORAGE_VERSION 'v1.3.x'` by DuckDB ≥ 1.4 are read as all-NULL strings by DuckDB 1.3 (block-less DICT_FSST validity segment)
### What happens? A database written by DuckDB 1.4.0 or later (including current main) with `STORAGE_VERSION 'v1.3.2'` (or `storage_compatibility_version = 'v1.3.2'`) opens in DuckDB 1.3.0-1.3.2 without an error, but every string of a `DICT_FSST`-compressed `VARCHAR` column is...
Performance regression from 1.5.6 to 2.0: about 2x per-statement overhead (prepare and execute)
### What happens? Every statement costs about 2× as much on 2.0 as on 1.5.6: plain `SELECT`, `EXECUTE` of a prepared statement and `SELECT 1` alike. It's a fixed per-statement cost, so it hits OLTP-style workloads and client drivers. A .NET driver benchmark shows prepared...
CSV round trip with default options strips single quotes: `COPY TO` writes `'x'` unquoted, `COPY FROM` sniffs `'` as the quote character
### What happens? `COPY s TO 't.csv'` followed by `COPY d FROM 't.csv'`, both with default options, changes every value that is wrapped in single quotes: `'x'` comes back as `x`, and `'2024-01-01'` as `2024-01-01`. There is no error and the row count is right. The file itself is...
INTERNAL Error `physical_index != DConstants::INVALID_INDEX` in propagate_get.cpp when statistics fold a pushed-down filter's column away
### What happens? On current `main`, built with assertions enabled (`make relassert`), this valid query fails with an assertion INTERNAL error instead of returning an empty result. The v1.5.6 release returns 0 rows. After the error the database instance is invalidated. ## SQL ##...
Performance regression from 1.5.6 to 2.0: recursive CTE joined to a large table scans the whole table at each step (dynamic filters no longer applied)
### What happens? A recursive CTE that walks a few steps from one node, joining a large table on a key the table is sorted by, reads the whole table on 2.0, where 1.5.6 reads only the matching row groups. The time grows with the table's size on 2.0 and stays flat on 1.5.6....
IEJoin LEFT/RIGHT join crashes with INTERNAL Error when non-preserved side has a LIST column
### What happens? An IEJoin outer join (LEFT/RIGHT) whose non-preserved side carries a `LIST` column crashes with an internal error as soon as the list contents are consumed (writing it with CTAS, or `v[1]`): After the error the database is invalidated, so every later statement...
INTERNAL Error "Failed to bind column reference" for SELECT DISTINCT over a FULL JOIN with a filter on one side and NOT IN on a column of the other side (regression since v1.5.6)
...`SELECT DISTINCT` over a `FULL JOIN` fails in the physical planner with an internal error when the `WHERE` clause has a filter on one join side and a `NOT IN (subquery)` on a column of the other side: The query is valid: it returns rows without `DISTINCT`, with `GROUP BY`...
Shell sets active_grammar_extensions=['shell'] wholesale, disabling grammar extensions registered by other loaded extensions
### What happens? Since #26914 the CLI runs `SET active_grammar_extensions=['shell']` on its connection right after opening the database ([`tools/shell/shell.cpp`](https://github.com/duckdb/duckdb/blob/v2.0-cyanoptera/tools/shell/shell.cpp#L1313)). The setting is assigned...
Stale BlockHandle after DROP TABLE of a foreign-key parent: overflow strings read back wrong until reopen (1.3.2–1.4.5; fixed in 1.5.0, not in 1.4 LTS)
### What happens? After dropping a table that is referenced by a foreign key and checkpointing, strings stored in overflow blocks that reuse the dropped table's block id are read back with the **old block's bytes** for the rest of the session. The data on disk is correct:...
Planning time grows super-linearly with the number of count(DISTINCT) aggregates in 2.0 dev (regression from 1.5.5)
### What happens? On the 2.0 dev builds, planning a query with many `count(DISTINCT ...)` aggregates (one per column) is super-linear in the number of aggregates. The time is spent before execution: `EXPLAIN` alone takes as long as running the query. On 1.5.5 the same query...
INTERNAL Error "Failed to cast expression to type" in TopNWindowElimination when the filter has a range predicate and an OR (regression in 1.5.6)
...'%2%')` | OK | | `n BETWEEN 1 AND 50 AND (x LIKE '%1%' OR y LIKE '%2%')` | OK | | same failing query without the `QUALIFY` | OK | How we hit it in practice: `CAST(ts AS DATE) BETWEEN DATE '...' AND DATE '...'` on a `TIMESTAMPTZ` column, plus a free-text search `(col1 ILIKE ? OR...
ManualVuln35 NaN Quantile Bypasses Range Guard in approx_quantile and Aborts Process via Out-of-Bounds Index
### What happens? `CheckApproxQuantile` in `extension/core_functions/aggregate/holistic/approximate_quantile.cpp` (line 343) validates the quantile parameter with `if (quantile 1)`, but does not check for NaN before or after the range test. Because all IEEE 754 comparisons with...
2.0 preview: repeated json_serialize_sql of tiny SELECTs is much slower than 1.5.5 (plain CLI reproduction)
### What happens? ## What happens? `json_serialize_sql` is much slower in this 2.0 preview when called for many small, distinct SQL strings. Serializing 1,000 trivial SELECTs takes about **4 ms on 1.5.5 versus 2.79 seconds on the preview** on the same Windows host. Every...
NewVuln2: One-Byte Heap OOB Read in GZipFileSystem::UncompressGZIPString via FNAME Flag
### What happens? In `GZipFileSystem::UncompressGZIPString()` (`src/common/gzip_file_system.cpp`), the guard `if (size < GZIP_HEADER_MINSIZE)` permits `size == 10`, which leaves `body_ptr` equal to `data + size` after the header is consumed. When the `FNAME` flag is set in the...
NewVuln16: Use-After-Free in checkpoint() via PREPARE+DETACH+EXECUTE
### What happens? In `src/function/table/checkpoint.cpp`, `CheckpointBind()` stores the target `AttachedDatabase` as a raw `optional_ptr` in `CheckpointBindData::db` without retaining shared ownership. When `DETACH` is issued after the `PREPARE` transaction has committed, the...
Use-after-free of join-pushed table filters during read-ahead drain in TableScanGlobalSourceState teardown
### What happens? Non-deterministic SIGSEGV on an async I/O thread at query teardown: a read-ahead `FileOpenTask` copies the scan's table filters after the `TableScanGlobalSourceState` that owns them has already freed them. `TableScanGlobalSourceState`...
a wide join containing an ANTI JOIN mis-binds its columns
...An eight-table join containing one `ANTI JOIN`, aggregated with `count(DISTINCT …)`, fails to bind after the join-order optimizer rewrites it: This is not a wrong answer - it is a hard failure on a query that is plainly valid, and *valid* is not a judgement call here: **the same...
Released 1.4.x–1.5.x: WAL replay with interleaved ALTER TABLE / CREATE INDEX corrupts unbound index buffers → SIGSEGV on next indexed write (fixed on main & v1.5 branch; no release tag contains the fix)
**Summary** A WAL that interleaves `CREATE INDEX` / `ALTER TABLE … ADD COLUMN` with row-data transactions poisons unbound index buffers during replay. On release builds (asserts off) the next index-maintaining write - or an automatic checkpoint - SIGSEGVs. On assert builds,...
Segfault / INTERNAL Error in CompressedMaterialization::Compress for filtered ORDER BY ... LIMIT that eliminates all rows (2.x regression)
### What happens? On current 2.x nightlies, planning a `SELECT * ... WHERE (a = ... AND b LIKE ...) ORDER BY x, y LIMIT n` over a table where no row can pass the filter (e.g. an empty table) crashes inside the compressed materialization optimizer. Depending on the build it...
Parquet reader truncates INT96 timestamps to microseconds; no way to read their nanosecond part
...their data through DuckDB changes values without a warning. There is currently no way to opt into the full precision: - casting the column to `TIMESTAMP_NS` happens after the value was already read at microsecond precision; - the `schema` parameter of `read_parquet` is keyed by...
Companies and products named
About this problem
Evidence
37 posts from 28 people in 3 places, about 5 a week over 47 days. Mostly on duckdb/duckdb, dbt-labs/dbt, apache/airflow. Tools named alongside: GitHub, Docker, PyPI, AWS.
Frustration Frustration 0 of 3· Seen on GitHub issues
Summary, model-written
DuckDB users experience performance slowdowns, crashes, corrupted WAL replays, unreadable compressed strings, and silently altered data values after updates or specific operations.
How it was grouped
Posts that state a pain and match the "breaking-changes" rule about DuckDB. First post Sep 17, 2026, latest Nov 2, 2026. Corroborated: 3 or more posts from 2 or more people or places. Method
The same problem elsewhere
GitHub upgrades break working setups
87 posts from 75 people on GitHub issues, Hacker News, Stack Overflow.
Upgrades and new releases break working setups
76 posts from 62 people on GitHub issues, Reddit, App Store reviews.
Claude Code upgrades break working setups
67 posts from 60 people on GitHub issues, Hacker News, Reddit.
Codex upgrades break working setups
65 posts from 58 people on GitHub issues, Reddit.
Claude upgrades break working setups
35 posts from 34 people on GitHub issues, Reddit, Hacker News.
ClickHouse upgrades break working setups
31 posts from 20 people on GitHub issues.
Anthropic upgrades break working setups
27 posts from 22 people on GitHub issues.
PyTorch upgrades break working setups
26 posts from 21 people on GitHub issues, Reddit.
ChatGPT upgrades break working setups
26 posts from 26 people on GitHub issues, Community forums, App Store reviews.
OpenAI upgrades break working setups
25 posts from 25 people on GitHub issues, Reddit, Community forums.
Open WebUI upgrades break working setups
25 posts from 2 people on GitHub issues.
Gemini upgrades break working setups
24 posts from 24 people on GitHub issues, Community forums, Reddit.
Other DuckDB problems
DuckDB users keep filing bugs
Top post: "latest alpha DuckDB 2.0 with Quack server on Windows/Linux got `Authentication failed` since several days ago", one of 23 posts from 15 people on GitHub issues.
Trouble with DuckDB internal
Top post: "duckdb 2.0.0 fails to launch on BE: `INTERNAL Error: The time zone data is corrupt`", one of 14 posts from 7 people on GitHub issues.
DuckDB error messages are cryptic
11 posts from 7 people on GitHub issues.
Trouble with DuckDB returns
Top post: "Comparison simplification returns an incorrect result when a narrowing `DECIMAL` cast is used", one of 9 posts from 9 people on GitHub issues.
Trouble with DuckDB join
Top post: "Segfault in `dense_rank() OVER ()` over a RIGHT_ANTI hash join that returns its unmatched rows", one of 9 posts from 8 people on GitHub issues.
Trouble with DuckDB column
Top post: "2.0 alpha: comparing a CASE/split_part result to a constant fails with BindBuiltinScalarFunction did not", one of 7 posts from 5 people on GitHub issues.
Trouble with DuckDB cast
Top post: "TRY_CAST of an empty BLOB to BIT escapes a non-fallible __cast and invalidates the database", one of 7 posts from 6 people on GitHub issues.
Trouble with DuckDB null
Top post: "DuckDB: `HAVING` of `(φ IS TRUE) OR NOT (φ IS TRUE) AND …` is empty for a NULL `φ`, but the same boolean as", one of 6 posts from 6 people on GitHub issues.
Trouble with DuckDB values
Top post: "ManualVuln37 Unbounded Recursion in EncodeVariantValue Causes Stack Overflow via variant_comparator on Deeply", one of 6 posts from 6 people on GitHub issues.
Experiments on DuckDB are hard to reproduce and track
6 posts from 4 people on GitHub issues.
Trouble with DuckDB parquet
Top post: "External file cache range metadata grows for deleted local Parquet files in v1.5.6 despite buffer eviction", one of 5 posts from 5 people on GitHub issues.
DuckDB costs outgrow the value it gives
4 posts from 4 people on GitHub issues.
History