Repository navigation
Update dependency org.questdb:questdb to v9.4.3 - #319
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
October 10, 2025 21:10
f04eafe to
b78c53f
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
October 21, 2025 14:08
b78c53f to
a243acb
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
November 3, 2025 19:40
a243acb to
3578c1c
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
November 14, 2025 00:03
3578c1c to
cc81fda
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
November 25, 2025 17:32
cc81fda to
34cc8bd
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
December 1, 2025 16:14
34cc8bd to
f8e98c5
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
December 18, 2025 13:14
f8e98c5 to
5617ddb
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
December 30, 2025 14:04
5617ddb to
2d59c6e
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
January 9, 2026 13:36
2d59c6e to
3dd7f38
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
January 14, 2026 17:09
3dd7f38 to
1d2c13e
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
January 28, 2026 19:07
1d2c13e to
b86c4d4
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
February 25, 2026 17:02
b86c4d4 to
0e18f8f
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
March 13, 2026 10:58
0e18f8f to
4d53b3a
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
March 26, 2026 17:56
4d53b3a to
b72c863
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
April 13, 2026 18:13
b72c863 to
74b19d7
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
May 21, 2026 23:56
74b19d7 to
3044449
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
June 3, 2026 11:08
3044449 to
1bf6e80
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
June 9, 2026 16:11
1bf6e80 to
c44d3c4
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
June 15, 2026 20:54
c44d3c4 to
f874c2b
Compare
renovate
Bot
force-pushed
the
renovate/org.questdb-questdb-9.x
branch
from
October 13, 2026 12:45
f874c2b to
e60f602
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
9.0.3→9.4.3Release Notes
questdb/questdb (org.questdb:questdb)
v9.4.3Compare Source
QuestDB 9.4.3
QuestDB 9.4.3 brings some key bug-fixes, along with parquet-native tables and new parquet-querying performance enhancements, with order-of-magnitude speedups for
ORDER BY ... LIMITqueries.For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
Breaking changes 💥
LIMIT nullsemantics changed, aligningLIMIT lo, hiwithLIMIT n:LIMIT null, nnow returns the first N rows (previously the full sorted set)LIMIT n, nullnow returns the empty result (previously all rows).LIMIT nullis unchanged, and returns the full result set.EXPLAINplan output rewording for encodable sorts:Encode sort light.Highlights
Table-level Parquet format
Tables can now store partitions in
PARQUETformat by default, rather than onlyNATIVE. Previously, you would need to:ALTER TABLE ... CONVERT PARTITION ... TO PARQUETqueries to synchronously convert partitions in QuestDB OSS.STORAGE POLICYto asynchronously convert partitions in QuestDB Enterprise.Please note that:
FORMAT PARQUETcan only be set on partitioned write-ahead-log (WAL) tables.FORMAT PARQUETviaALTER TABLE, historical partitions will not be automatically converted.FORMAT NATIVEremains the default format for tables in QuestDB.Memory-budgeted Parquet decode cache
There is a fine balance of memory budget versus CPU time when scanning and decoding parquet row groups. A fixed number of decode slots was an inflexible way to balance these two concerns.
Therefore, we have introduced a new memory-budget configuration and deprecated the old slot-based config:
cairo.sql.parquet.cache.memory.sizecairo.sql.parquet.frame.cache.capacityFaster
ORDER BY ... LIMIT NThe query engine has a number of optimisations based on the native-format data layout. We've revised the long top-K query path for parquet partitions, by removing a sorting tree and pruning projected columns earlier in the process. This is most valuable for queries over wide tables, with a significant sort plus limit workload.
This dramatically reduces unnecessary row-group decoding, and thus improves the scalability of this query shape for larger limits:
Concurrent
ILP/TCPstale-writes fixILP/TCPis a mostly-deprecated ingestion path, though maintained for backwards compatibility. As part of this maintenance, we have fixed a bug which could cause stale data to be written to a table, affectingDECIMAL,LONG256and implicit casts fromBINARYtoSYMBOL. This only impacted concurrent writes, so a straightforward single worker TCP stream was unaffected.Thank you to our users who continue to use this feature and give us valuable feedback that helps us to keep it well-maintained.
With the upcoming QuestDB 10.0 release, we recommend planning an upgrade to our new ingestion API, which brings dramatically better performance and usability across the board.
Changelog
Features
is_end_of_monthSQL function by @Dracylfrr in #7214Performance
Fixes
Full Changelog: 9.4.2...9.4.3
v9.4.2Compare Source
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. It includes bugfixes for the new posting index, parquet tables, temporal joins, and a variety of other SQL queries. This release also brings a Web Console upgrade, which brings some fixes and a new utility for sharing queries with your colleagues.
For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
Breaking changes 💥
INDEX TYPE POSTING(noINCLUDE) is now non-covering.cairo.posting.index.auto.include.timestamp=truewas not intended to make all posting indexes covering by default.INCLUDElist if you do not include it yourself.SHOW CREATE TABLEnow rejects views and materialized views.CREATE TABLEstatement for any kind of entity. You should useSHOW CREATE MATERIALIZED VIEWandSHOW CREATE VIEWinstead for their corresponding entities.Highlights
Web Console
You can now share a query quick-link with your colleagues, via a new editor drop-down on the green 'run' button. Simply click the copy list entry and paste the resulting URL to a friend or colleague. The URL will automatically open and run the query, making collaboration easier.
For long-form collaboration, don't forget that you can share and version control entire editor tabs using Tab Exporting, or share production-ready queries via
CREATE VIEW.We've also improved the visibility of Storage Policy (an Enterprise feature) settings, and reduced the eagerness of query validation, which should smooth out the overall editor experience.
Changelist
Full Changelog: 9.4.1...9.4.2
v9.4.1Compare Source
QuestDB 9.4.1
QuestDB 9.4.1 is a hardening release that builds on 9.4.0. Introduction of our new SQL fuzz-testing engine and test framework improvements has flushed out more than 60 latent bugs around query correctness and resource leaks. 9.4.1 also brings additional hardening and bugfixes for the newly released posting/covering indexes, performance enhancements for materialised views, upgrades to parquet querying, and new aggregate and window functions.
For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
Breaking changes 💥
_pm) will be migrated to a new version at startup.INT - FLOATnow returnsFLOATtype, notDOUBLE.INTcalculations compared toLONGvalues will now run at 64-bit width.STRINGandVARCHARwith<=/>= nullcomparisons will now correctly return matching null rows.twap()now correctly rejects non-designated timestamps.EXPLAINplan output has changed for non-keyed group by/sample by, if you assert a particular shape of the query plan, you'll need to update your assertions.Highlights
New SQL Query fuzzer
QuestDB contains almost 1 million lines of test code, covering unit, integration, fuzz, and performance tests. This release includes a new fuzz testing mechanism specifically to improve the robustness of the SQL engine. This enhances our existing fuzz testing suite that runs 24/7, ensuring rare edge cases or flaky bugs are reproduced and fixed at the earliest opportunity.
Additionally, we've revised our unit testing API to ensure that additional assertions are executed and checked by default, closing some under-asserted tests.
So far, this has caught more than 60 bugs, and we're looking forward to finding and fixing more!
New SQL functions
array_agg()
A new aggregate that collects/rolls-up per-group values into a
DOUBLE[]:See the aggregate functions reference and the array type.
regr_r2()
regr_r2(y, x)is the standard SQL coefficient of determination — how well a linear regression of Y on X fits, on a 0–1 scale. It is handy for separating real trends from noise, e.g. finding sensors whose temperature is genuinely trending up versus drifting randomly.Window functions for DECIMAL columns
All six DECIMAL sub-types (D8–D256) now work with the window functions
first_value,last_value,nth_value,lag,lead,min,max,count,sum, andavg— across the same frame shapes (whole partition,ROWS BETWEEN,RANGE BETWEEN, partitioned and non-partitioned) supported for the primitive numeric types.See the window functions reference and the DECIMAL type.
Opt-in native memory caps for window functions and ORDER BY
Users can now opt-in to memory caps for SQL queries that rely on window functions and sorts:
This will help avoid any instability caused by edge case queries; for example, when a window function tries to sort a table with billions of rows.
Performance
Materialized Views
Refreshing materialised views during an out-of-order backfill will is much faster and more efficient. A new adaptive algorithm balances the number of rows refreshed versus the number of commits, ensuring that performance is maintained across varied or dynamic workloads. Refreshing a 512 symbol view with a constant -12 hours backfill plus live ingestion dropped from ~160ms to just ~2ms, with consistent performance.
Materialized Views will also now discard no-op transactions much earlier, avoiding wasted work.
SQL
twap()andsparkline. This has a small memory overhead for very high cardinality group by queries, approximately ~15%.Bug fixes
SQL
Storage, Parquet and WAL
Protocols
Changelog
Full Changelog: 9.4.0...9.4.1
v9.4.0Compare Source
QuestDB 9.4.0
QuestDB 9.4.0 introduces a compact, high-performance posting and covering index for SYMBOL columns, a local parquet metadata sidecar that unlocks row-group pruning, parallelised SAMPLE BY FILL with new cross-column FILL(PREV) syntax, three new window functions, and
sparkline()/bar()text visualisations. It also delivers meaningful GROUP BY / hash-join speed-ups and fixes a number of correctness issues across the SQL planner, the WAL apply path, and the PGWire protocol.For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
Highlights
Posting and covering index for SYMBOL columns
A new
INDEX TYPE POSTINGfor SYMBOL columns delivers ~13x smaller index files and 1.3-1.5x faster lookups vs. the BITMAP index, at a ~9% write-amplification cost. An optionalINCLUDE (...)list builds a covering sidecar so queries that read only the indexed column plus the included columns skip the column files entirely:Supported query shapes that benefit from the covering path include
WHERE sym = 'X',WHERE sym IN (...),LATEST ON ts PARTITION BY sym, andSELECT DISTINCT sym. Covering data is ALP-compressed for FLOAT/DOUBLE, FoR bit-packed for integer types, and FSST-compressed for STRING/VARCHAR. Native AVX2 decoding fast paths kick in for common bit-widths.A few practical notes:
ALTER TABLE <t> ALTER COLUMN <sym> DROP INDEXon every posting-indexed column first.INCLUDEwhen you supply anINCLUDEclause, soSHOW CREATE TABLErendersINCLUDE (price, qty)back asINCLUDE (price, qty, ts). Controlled bycairo.posting.index.auto.include.timestamp(defaulttrue).EXPLAIN— the plan showsCoveringIndex on: sym with: ..., withop: latestforLATEST ONqueries andop: distinctforSELECT DISTINCT.SHOW COLUMNSandtable_columns()also expose newindexTypeandindexIncludefields.EXPLAINshows a query picking the covering path and you see a regression, opt that query out with/*+ no_covering */(or/*+ no_index */to disable indexing entirely) until the optimisations land.See the posting index and covering index documentation for the full feature reference, encoding variants (
POSTING DELTA/POSTING EF, both for benchmarking), and storage layout details. by @bluestreak01 in #6861Local parquet metadata sidecar
Each parquet partition now ships with a compact binary
_pmsidecar that stores column descriptors, per-row-group byte ranges, encodings and min/max statistics. The query planner reads pruning information from_pmwithout ever openingdata.parquet, which is a prerequisite for efficient cold-storage scans. A migration (Mig940) generates_pmfiles for all existing parquet partitions on engine upgrade. by @RaphDal in #6913Cross-column FILL(PREV) and parallel SAMPLE BY FILL
Imagine a stream of FX quotes where you want one-minute bars of average bid and ask. On quiet minutes you want both prices to show the last known ask — not the last bid for
bid_priceand the last ask forask_price, which is whatFILL(PREV, PREV)would give you. Before 9.4.0 that meant dropping down to a CTE withlast_value(...) IGNORE NULLS OVER (...)and acoalesceper column. Now it is a one-liner:FILL(PREV(col_ref))carries the previous value of another aggregate column by alias. The reference must match the target column's type, cannot be broadcast across aggregates, and is rejected when either side is aSYMBOL.FILL(NULL),FILL(<constant>), and bareFILL(PREV)can be mixed freely in the same per-aggregate fill list.At the same time,
SAMPLE BY FILL(NULL | <constant> | PREV)moves from the sequential cursor path onto QuestDB's parallel GROUP BY path. Read-side wins compound for keyed queries on wide tables and for queries withFROM/TOboundaries — keyedFROM-TOwith constant bounds is also now supported natively, removing the previous cookbook workaround.Other fixes that ride along:
SAMPLE BYwithTIME ZONEandFROM/TOno longer misaligns the fill grid by the timezone offset.ALIGN TO CALENDAR WITH OFFSETcombined with FILL no longer falls into an infinite fill loop.FILL(LINEAR)andALIGN TO FIRST OBSERVATIONcontinue to use the cursor path. See the SAMPLE BY FILL options and the Fill from one column cookbook recipe. by @jovfer in #6946New window functions
ntile(n)— distributes rows of an ordered partition intonapproximately equal buckets.cume_dist()— cumulative distribution of the current row within its partition.nth_value(expr, n)— the n-th value within the current frame; supportsDOUBLE,LONG, andTIMESTAMParguments. Works withROWSandRANGEframes.All three honour
PARTITION BYandORDER BY. by @jovfer in #6925 and #7037Text visualisations: sparkline() and bar()
Two new functions render numeric data as Unicode glyphs directly in SQL output:
sparkline()is an aggregate that renders a trend line with auto-scaling, clamping and width control.bar()is a scalar that renders a single value as a horizontal bar with eight levels of sub-character precision. Both returnVARCHARand work across all clients. by @javier in #6975Configurable parquet encodings on export
PARQUET_ENCODING(...)now propagates through projected streaming parquet exports —COPY (SELECT ...) TO ... WITH format parquetand/exp?query=...preserve the configured encoding instead of silently reverting to defaults for pass-through columns. by @RaphDal in #6949Performance
count()over fixed-size keys and 1.4-1.8x on multi-aggregate GROUP BY queries. Also fixes a pre-existing data-correctness bug incount(uuid)for UUIDs whose high half equalsLong.MIN_VALUE. by @puzpuzpuz in #6959ORDER BY ... LIMIT Nnow uses the parallel top-K path even when a column projection (duplicate columns, computed columns) sits between the limit and the filtered scan. by @DHRUV6029 in #6993TIMESTAMPcolumn against a string bind variable (or any runtime constant) no longer re-parses the value on every row. EXPLAIN plans may show the equality arguments swapped. by @jerrinot in #6986Web Console
Create materialized view from the table menu: a new context-menu action on tables and existing materialized views generates a starter
CREATE MATERIALIZED VIEWstatement and drops it into the editor. From a base table the generator infersREFRESH IMMEDIATE,SAMPLE BY,PARTITION BYandTTLper QuestDB's default rules, and pickssum/lastaggregates by column-name pattern. From an existing materialized view it produces a downsample one rung up the SAMPLE BY ladder, re-rootsWITH BASEat the source view, rewrites aggregates against the layer-1 aliases, and stepsTTLup to match. Disabled on non-WAL tables and tables without a designated timestamp. in questdb/ui#557Context-aware SQL autocompletion: function suggestions now filter by grammar context, so the popup stops dumping the full function list at every identifier position. Examples:
SELECT * FROM trades WHERE price = c|previously mixed scalars and aggregates (coalesce,count,count_distinct,corr,covar_*, ...) and now suggests scalars only (coalesce,concat,cos,ceil).SELECT * FROM trades ASOF JOIN m|shrinks from 332 mixed entries to the three actual join targets (materialized_views,memory_metrics,table_writer_metrics).INSERT INTO trades VALUES (n|previously offered nothing; now suggestsnow,now_ns,nullif,nanos,netmask.Statement-start suggestions also include implicit-
SELECTtargets, and the editor no longer hangs on a trailing comma in the SELECT list. in questdb/ui#556Bug fixes
SQL planner and execution
avg(x) - avg(x) OVER ()combined with GROUP BY. Such shapes are now rejected at compile time with a clear error rather than computing silently incorrect output. by @jovfer in #6943max(avg(x) OVER ())patterns). by @jovfer in #6955EMA,VWEMAandKSUMfailures when combined with other window functions in the same query. by @jerrinot in #7030BETWEENevaluation inside sub-expressions (e.g. when it appears as an operand of a larger boolean expression). by @brunocalza in #7044y.a = y.b(both sides on the slave); fixedNOTrewriting in UNION ALL queries that previously only descended into the left side; isolated parser state to allow concurrentSqlParserinstances. by @bluestreak01 in #7027arg_max/arg_minreturning the wrong precision when the timestamp argument is aTIMESTAMP_NScolumn. by @bluestreak01 in #7078SAMPLE BYbucket timestamp after a DST-skipped day. by @bluestreak01 in #6988Storage and WAL
tables(). by @nwoolmer in #7047Protocols
CHARcolumn values in/execand/queryresponses. by @jerrinot in #7106Changelist
Full Changelog: 9.3.5...9.4.0
v9.3.5Compare Source
QuestDB 9.3.5
QuestDB 9.3.5 introduces lateral joins, SQL-standard UNNEST, statistical window functions, and corrects SAMPLE BY timezone handling during DST transitions. It also delivers multiple join performance improvements and important Parquet export fixes.
For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
Breaking changes 💥
Highlights
Lateral joins
QuestDB now supports lateral joins, enabling subqueries in the FROM clause to reference columns from preceding tables. The implementation uses a decorrelation optimizer that transforms correlated subqueries into efficient set-based execution.
LEFT LATERAL and implicit CROSS LATERAL are also supported:
SQL-standard UNNEST
The new UNNEST operator expands array columns and JSON arrays into rows, enabling relational operations on array data:
Multiple arrays can be unnested simultaneously with NULL padding for mismatched lengths, following PostgreSQL-compatible behavior.
Statistical window functions
New window functions for statistical analysis:
stddev_pop(),stddev_samp()/stddev()— standard deviationvar_pop(),var_samp()/variance()— variancecovar_pop(),covar_samp()— covariancecorr()— correlation coefficientAll functions support ROWS, RANGE, and PARTITION BY frame modes with bounded and unbounded frames. Non-removable frames use Welford's online algorithm for numerical stability.
Multi-table HORIZON JOIN
HORIZON JOIN now accepts multiple right-hand-side tables in a single query, aggregating columns from several time-series sources against a common master table:
Other
PARQUET()clause (e.g.,a VARCHAR PARQUET(BLOOM_FILTER)).ALTER TABLE ADD/DROP COLUMNnow works correctly on tables with Parquet-formatted partitions.arg_max(varchar, ...)group-by functions for timestamp, double, long, and int key types.SHOW TABLESresults sorted alphabetically (behindcairo.metadata.cache.snapshot.orderedconfig).Performance
Web Console
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.