This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+14 more
Affected surfaces
ReleasePort's take
Moderate signal`SHOW CREATE TABLE` now rejects views and materialized views; several Parquet‑related bugs are fixed.
Why it matters: The breaking change eliminates unexpected schema output for view objects, while fixes prevent JVM crashes and data loss in Parquet reads—critical for stable query execution.
Summary
AI summaryBroad release touches SQL, Parquet, Breaking changes :boom, and Posting and covering index.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | High |
`SHOW CREATE TABLE` now rejects views and materialized views. `SHOW CREATE TABLE` now rejects views and materialized views. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Feature | Medium |
Upgrades web console to version 1.2.3, adding share links, storage‑policy display, and SSO logout fixes. Upgrades web console to version 1.2.3, adding share links, storage‑policy display, and SSO logout fixes. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes JVM crash (SIGSEGV) on random access over a Parquet partition with `LIMIT`. Fixes JVM crash (SIGSEGV) on random access over a Parquet partition with `LIMIT`. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes Parquet read failure on all‑null integer columns, preventing table suspension. Fixes Parquet read failure on all‑null integer columns, preventing table suspension. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Hardens Parquet reader against malformed or foreign‑produced files, returning clean errors instead of JVM aborts. Hardens Parquet reader against malformed or foreign‑produced files, returning clean errors instead of JVM aborts. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes crashes in ASOF/LT joins between `STRING`/`VARCHAR` and `SYMBOL` keys on both full‑fat and Light paths. Fixes crashes in ASOF/LT joins between `STRING`/`VARCHAR` and `SYMBOL` keys on both full‑fat and Light paths. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes assertion crash when a NULL array value is used as a GROUP BY map key. Fixes assertion crash when a NULL array value is used as a GROUP BY map key. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes aggregate over `UNION ALL` of aliased sub‑queries crashing query compilation. Fixes aggregate over `UNION ALL` of aliased sub‑queries crashing query compilation. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes posting‑index crash and missing rows after partition squash, O3 commit, or WAL auto‑squash. Fixes posting‑index crash and missing rows after partition squash, O3 commit, or WAL auto‑squash. Source: llm_adapter@2026-06-09 Confidence: high |
— |
| Bugfix | High |
Fixes covered reads returning NULL for a whole partition after Parquet index reseal. Fixes covered reads returning NULL for a whole partition after Parquet index reseal. Source: llm_adapter@2026-06-09 Confidence: high |
— |
Full changelog
QuestDB 9.4.2
QuestDB 9.4.2 is a hardening release that builds on 9.4.1, driven by continued fuzz testing and stricter query-result assertions. The posting and covering index introduced in 9.4.0 gets the most attention: this release fixes incorrect results from indexed reads and a crash on specific partition-maintenance paths, and reclaims an on-disk file leak. On the Parquet side, one fix keeps a table from being suspended when an all-null column is converted back to native form, and others harden reads of malformed or foreign files. The remaining fixes span temporal joins, GROUP BY, SELECT DISTINCT, and aggregates. The release also upgrades the web console to 1.2.3.
Two behavior changes are worth noting before upgrading: a bare INDEX TYPE POSTING is now non-covering by default, and SHOW CREATE TABLE now rejects views and materialized views. Both are detailed below.
For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
Breaking changes :boom:
- A bare
INDEX TYPE POSTING(noINCLUDE) is now non-covering. In 9.4.0–9.4.1 a posting index declared without an explicitINCLUDEclause silently auto-appended the designated timestamp to its covering set, turning it into a covering index — an unintended default. From 9.4.2, a posting index with noINCLUDEis non-covering; the timestamp auto-include (cairo.posting.index.auto.include.timestamp, still defaulttrue) now only rounds out an explicitINCLUDEset and never makes a non-covering index covering on its own. Existing tables are unaffected — the covering flag is persisted per-column in_metaand read back unchanged — so this changes only newly created or re-declared indexes.SHOW CREATE TABLEnow renders such a column asINDEX TYPE POSTINGrather thanINDEX TYPE POSTING INCLUDE (ts), and aWHERE sym = ...predicate takes the plain posting-filter cursor instead of the covering cursor. (#7203) SHOW CREATE TABLEnow rejects views and materialized views. Previously it rendered a misleadingCREATE TABLEstatement for any object kind; executing that DDL would have created a plain table rather than the view. It now errors withtable name expected, got view or materialized view name. UseSHOW CREATE VIEW/SHOW CREATE MATERIALIZED VIEWfor those objects. The sibling statements now also name the actual object kind in their mismatch errors. (#7208)
Web Console
Upgraded to 1.2.3 (#7199):
- Share links to queries from the editor dropdown and via keyboard shortcuts.
- Storage policy now shows in table details and is supported in the "create materialized view" quick action.
- Fixed stale user and data after SSO logout.
- Increased the query-validation debounce time.
Bug fixes
SQL
- Fixed a use-after-free crash (SIGSEGV) on random access over a Parquet partition — for example a query with
LIMITover a Parquet-backed scan. (#7195) - Fixed a
ClassCastExceptioncrash in parallel keyed GROUP BY reading through a covering index. (#7150) - Fixed crashes in ASOF/LT joins between
STRING/VARCHARandSYMBOLkeys, on both the full-fat and Light paths. (#7150) - Fixed an assertion crash when a NULL array value is used as a GROUP BY map key. (#7150)
- Fixed an aggregate (
count(),sum(), ...) over aUNION ALLof aliased sub-queries crashing query compilation with an internal error (a 500 in the web console).UNIONcolumns are now matched by position; the previous by-name matching was silently wrong for differently-aliased branches. Acairo.sql.legacy.union.column.propagationflag (defaultfalse) restores the old behavior as an operational rollback. (#7210) - Fixed an ASOF join (Dense algorithm) dropping matches when its cursor is read more than once — for example by a window function, a cached factory re-running the query, or a parent operator. (#7195)
- Fixed
<symbols> IN (...) LATEST ON tsover a multi-partition table returning rows not ordered by the designated timestamp. (#7195) - Fixed
count()over a keyed GROUP BY subquery filtered on the aggregate alias (a HAVING-style predicate) reporting phantom duplicate groups that do not exist. (#7202) - Fixed
count(*)and full-scan size calculation throwing instead of contributing zero rows when an empty partition is absent from disk — for example one omitted by a backup or restore. (#7195) - Fixed
LIMIT lo, hiand result-size calculation over a cross join with an unknown-size input counting or skipping too few rows. (#7195) - Fixed compile-time failures (
Invalid column,ArrayIndexOutOfBoundsException) onSELECT DISTINCTand GROUP BY queries with qualified (t.col), duplicated, or constant-aliased projections. (#7150) - Fixed
last()/mode()over a constantSYMBOLreturning the constant instead of NULL. (#7150) - Fixed wrong JIT-filter results when a
LONGvalue appears only as a literal inside narrow-integer arithmetic; the JIT path now matches the scalar path at 64-bit width. (#7150) - Fixed native-memory leaks: posting-index reader buffers stranded when a row cursor errors mid-iteration, and per-worker array GROUP BY keys orphaned under a mixed thread-safe / non-thread-safe key set. (#7150)
INnow accepts IPv4 list literals, e.g.addr IN ('1.2.3.4'::ipv4, '5.6.7.8'::ipv4), instead of failing to compile. (#7150)
Posting and covering index
- Fixed a JVM crash (covering index) or missing/short indexed counts (non-covering index) after a partition squash, an in-range O3 commit, or a WAL auto-squash that spills past the indexer budget on a hot key. (#7203)
- Fixed covered reads returning NULL for a whole partition after an O3 or squash reseal of a Parquet partition carrying a covering posting index. (#7203)
- Fixed an incomplete covered sidecar on the WAL fast-lag apply path when a mid-stream spill flush occurred during indexing, which could over-read on a later covered read. (#7203)
- Fixed the covering configuration being lost after
ALTER TABLE ... ALTER COLUMN ... SYMBOL CAPACITY, which silently demoted the posting index to non-covering for all later readers. (#7203) - Fixed an on-disk value-file (
.pv) leak when a Parquet index reseal spilled; the superseded intermediate file is now reclaimed through the writer's scoreboard-gated purge queue. (#7203) - Hardened the Parquet seal-purge state with a single leaf lock, so the concurrent O3-worker and writer-thread paths are safe by construction rather than by thread-join timing. (#7203)
Parquet
- Fixed a Parquet read failure on an all-null integer column (
INT/LONG) page that usedDELTA_BINARY_PACKEDencoding. The failure surfaced on an eager, full-row-group read — converting a Parquet partition back to native, or WAL apply re-running that conversion, notably under replication where it suspended the table on both primary and replica — while a lazySELECTover the same partition was unaffected. Files already written by affected versions stay readable; newly written files carry a valid header. There is no format or version bump. (#7212) - Hardened the Parquet reader against malformed or foreign-produced files reachable through the
read_parquet()function and partition conversion: a range of inputs (out-of-range delta bit widths, badDELTA_BINARY_PACKEDheaders, integer-overflowing miniblock sizes, oversized varint values) that previously aborted the JVM via a Rust panic now return a clean error instead. Valid files decode exactly as before. (#7212)
Changelog
- chore(ui): upgrade web console to 1.2.3 by @emrberk in #7199
- fix(core): fix posting index crash and missing rows after partition squash by @nwoolmer in #7203
- fix(core): fix all-null Parquet column reads and crashes on malformed files by @glasstiger in #7212
- fix(sql): fix wrong results and memory leaks in posting-index, join and group-by queries by @puzpuzpuz in #7150
- fix(sql): fix a parquet query crash and wrong results in latest-by, ASOF joins, and counts by @bluestreak01 in #7195
- fix(sql): fix count() over a GROUP BY subquery reporting phantom duplicates by @ideoma in #7202
- fix(sql): fix UNION ALL column mismatch under aggregates by @nwoolmer in #7210
- fix(sql): reject views and materialized views in SHOW CREATE TABLE by @nwoolmer in #7208
Full Changelog: 9.4.1...9.4.2
Breaking Changes
- `INDEX TYPE POSTING` without `INCLUDE` is now non‑covering by default; previously it auto‑included the timestamp and became covering.
- `SHOW CREATE TABLE` now rejects views and materialized views, returning an error instead of a misleading DDL statement.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
Beta — feedback welcome: [email protected]