ArcadeDB 26.4.2 Release Notes
Overview
ArcadeDB 26.4.2 is a major release with over 340 commits and 100+ resolved issues. The headline is a brand-new Raft-based High Availability stack built on Apache Ratis, alongside a deep wave of OpenCypher correctness and performance work, expanded wire-protocol security (BOLT + TLS), a new end-to-end Query Profiler, and a long list of SQL, HA, storage, and Studio improvements.
Highlights
Raft-based High Availability using Apache Ratis
ArcadeDB now ships a new HA mode backed by Apache Ratis, bringing a battle-tested Raft consensus implementation to the server. Leader election, log replication, and membership changes are all delegated to Ratis, giving stronger correctness guarantees for replicated writes and simpler operational semantics for clusters running on Kubernetes and bare metal #3730.
End-to-end Query Profiler
The query profiler has been promoted to a first-class feature across every query entrypoint (HTTP, Studio, embedded, drivers). In addition to planner and executor timings, it now also accounts for record deserialization and result serialization, giving a complete picture of where the time goes. Studio surfaces the new serialization cost directly in the results panel #3894.
OpenCypher: major correctness and optimization round
Dozens of OpenCypher issues have been closed in this release. Highlights:
- Filter pushdown for list predicates (
any/all/none/single) inWHEREclauses, which dramatically reduces scanned rows on complex predicates - PR #3891, #3888 - Index usage for
MATCH WHERE ID(n) = <expr>when the expression is dynamic (was falling back to full scan) - PR #3865 - Aggregation with
CASEno longer returns multiple rows from an implicitGROUP BY- #3858 CREATE CONSTRAINT ... IS TYPEDis now supported - #3800CREATE INDEXstatement is now supported - #3763- Path Mode (
WALK,TRAIL,ACYCLIC) support - #3710 WITH *+ extraASalias no longer drops the extra items - #3761- Cypher support removed from the Gremlin module in favor of the native engine - #3811
- Many subquery fixes:
EXISTS { MATCH ... }when relationship type embeds a Cypher keyword after underscore - #3952CALLsubquery withUNWINDno longer multiplies outer rows - #3944CALLsubquery reusing an outer variable name no longer drops rows - #3959CALL+UNION ALLkeeps all branches - #3958COLLECT { ... }returns the list instead ofnull- #3957COUNT { ... }pattern subqueries return the count, not the bound node - #3955, #3956- Inline relationship
WHEREpredicate is now applied - #3951 - Existential pattern predicate in
WHEREcorrectly filters by target node - #3938 - Standalone
ORDER BY ... LIMIT ...beforeMATCHpreserves the selected row - #3950
- Expression and null handling fixes:
tail(null)returnsnull(not[]) - #3920CASE null WHEN nullreturnsnot_matched- #3922- List / string concatenation
||withnullreturnsnull- #3921, #3926, #3927, #3928 - Dynamic label matching with
$()- #3923 - Quantified path pattern
->+matches 1+ relationships - #3924 - Variable-length pattern
*2..2no longer includes distance-1 nodes - #3931 RETURN ALLraises a syntax error as expected - #3925- Fixes from the TCK run: 10 OpenCypher TCK failures from optimizer clause ordering resolved
- Parameterized queries match correctly in property maps when an edge is present - #3765
- Label expression predicate with
nullnode returnsnull- #3935 - Mandatory
MATCHover existing relationships consistent withOPTIONAL MATCHand SQL - #3711 - Cypher self-join on the same edge type - #3758
- Stack Overflow workload result divergence from Neo4j - #3759
- Concatenation of constant string to list with
+operator - #3771 - Subquery with
UNIONonly returning first branch - #3772 - Types automatically created when creating a constraint - #3760
BOLT + TLS
The Neo4j Bolt wire protocol now supports TLS, and the plugin no longer binds to a random ephemeral port when a port is configured.
- TLS support: #3799
- Port binding fix: #3809
- Parameterized query fix when forwarded through HA - PR #3961
SQL function options map and new function surface
All complex SQL functions now accept a trailing options map as an alternative to long lists of positional optional arguments. This is adopted across:
- Full-text search: #3880 (also adds
fulltext.*namespace aliases) - Graph algorithms:
shortestPath,dijkstra,bellmanFord,astar- #3881 - Time-series:
movingAvg,timeBucket,interpolate,promql- #3882 - Vector scoring:
vectorRRFScore,multiVectorScore,vectorHybridScore- #3883 - Geo / date:
geo.buffer, date functions - #3884 - General SQL function support - #3879
vectorNeighborsaccepts a map of optional argumentsallSimplePathsnow supports an exclusion list of edge types (commit8bd74916d)- All stateless Cypher functions (e.g.
text.jaroWinklerDistance) are now reachable from SQL - #3866
SQL: batch UPDATE / DELETE / TRUNCATE
Bulk mutation workflows are significantly faster thanks to true batch execution for UPDATE, DELETE, and TRUNCATE:
BATCHsupport in SQLUPDATEandDELETE- #3806- Batch delete path in SQL
TRUNCATE
Case-insensitive indexes (COLLATE)
SQL indexes can now be declared case-insensitive via COLLATE, enabling indexed lookups on text fields without case normalization at query time. #3726
Production mode safety
When the server is started in SERVER_MODE = production:
fsyncis automatically set totrueto protect durability on crash - #3808- A new startup security checklist surfaces misconfigurations before the server accepts traffic
HTTP: restore database + Studio integration
A new HTTP command allows restoring a database directly over the REST API, with Studio UI support and a progress bar for long-running imports and restores. #3764
The legacy BACKUP DATABASE command now also gives a clear error when handed an http(s):// URL. #3716
RemoteGraphBatch client API
A client-side RemoteGraphBatch batching API with auto-flush targets the server-side /batch endpoint, making high-volume ingestion from remote drivers much easier. #3817
Performance
- Custom collections and maps in hot paths reduce RAM usage and improve iteration throughput - #3965
- TimeSeries: batch writes per shard to reduce transaction overhead - #3862
- Neo4j importer uses the new
BatchGraphAPI, drops more than 80% of RAM with numeric Neo4j ids - #3770 - Vector index: speed-ups using JVector hidden features - #3721, faster Cypher batch creation with vector indexes - #3864
- GraphImporter rewrite for real-world datasets like StackOverflow - #3708, with basic filtering conditions
- JSON to
float[]conversion path optimized for vector ingestion - Buffered vectors are flushed on a configurable timeout so partial batches are never left pending - #3737
Studio
- Horizontal scroll in the query result table - #3969
- MCP template works with Claude Code - #3892; Studio MCP fixes
- Quick start panel at first run; datasets are now clickable and self-downloading
- Progress bar for imports and restores
- Edit record popup polish, plus/minus property controls, color picker for vertices restored
- Result table headers no longer forced to uppercase - #3733
- Edge
@IN/@OUTproperties are now hyperlinks - #3718 - Query history: clicking no longer auto-executes the query
- Drop property / drop index no longer forces a full page refresh
- Small improvements to the pager, page-size reset, and the auto-generated default query
Other notable features
IMPORT DATABASEacceptsedgeBidirectional = falsefor CSV edge import - #3713- CSV importer skips null fields and auto-sets vertex types - #3818
- Vector index built by default on vector properties
- MCP server: better init instructions and helpful database errors - PR #3966
DatabaseRIDis used by the user API to improve backward compatibility across thedatabaseproperty removal fromRID
Major Fixes
Storage and integrity
- SQL: infinite loop iterating in
DESCorder over a non-unique LSM-tree index - #3964 - Edge case with concurrency during index insert (commit
3997a8af3) - Hash index: multiple fixes including duplicated records with unique hash indexes
- Backup concurrency race on Linux: the flush thread was ignoring
isSuspended- PR #3774 - Graph rebuild crash (OOM) and vector index rebuild error resolved - #3867, #3868
- Vector graph rebuild fallback scan is now scoped to the correct bucket, not the whole type
- TimeSeries: concurrent writes no longer cause MVCC 503 errors / data duplication on retry - #3861
DROPon time series works correctly - #3863- Build failure on systems with large GID / UID fixed by switching to POSIX tar - #3939
SQL
ORDER BY CASE WHEN ... ENDno longer fails withNullPointerExceptiononbaseExpr.identifier- #3777ORDER BY $score DESCno longer hangs when combined with non-FTSWHEREpredicates;$scoreon polymorphic supertype full-text indexes returns sensible values - #3776REFRESH MATERIALIZED VIEWcommits immediately in async HTTP commands - #3941CREATE MATERIALIZED VIEWaccepts symbols in the query - #3878- Trailing selector resolved in
SELECT ... LET- #3872 DELETEresolves variables in the type field - #3871UPDATEresolves expressions / commands that return a RID - #3813- Arithmetic on
LETvariables in SQLScript CREATE PROPERTY ... IF NOT EXISTScorrectly checks supertypes - #3812PRECISIONsupported in time-series grammar- Parenthesis parsing fix - #3735
- Parser: sealed JavaCC escape hatches; ANTLR is now always used
- HTTP/SQL "Variable length quantity is too long" on certain payloads - #3714
Wire protocols and integrations
- InfluxDB line protocol: silent data loss and missing gzip support - #3819, PR #3833
- BOLT plugin no longer binds to a random ephemeral port - #3809
- BOLT protocol registration fix
- Gremlin
GremlinValueComparatorfix - PR #3870 - GremlinServerPlugin failure to start fixed by reverting Groovy to 4.0.28 - #3724
- Neo4j importer
OutOfMemoryError- #3768 - Postgres / HTTP:
Not a JSON Array: "admin"for non-root users onopenDatabase- #3779
Security
- Enforce per-database access in the HTTP command handler
- Startup security checklist in production mode
Dependencies
A large number of runtime and build dependencies have been refreshed, including notable version bumps:
- Apache TinkerPop Gremlin: 3.8.0 to 3.8.1
- Neo4j Java Driver: 6.0.3 to 6.0.5
- JLine: 3.30.6 to 4.0.12
- Netty: 4.2.10 to 4.2.12
- Protobuf: 4.34.0 to 4.34.1
- Swagger (core and parser): 2.2.45 to 2.2.48
- Micrometer (core and Prometheus registry): 1.16.4 to 1.16.5
- lz4-java: 1.10.4 to 1.11.0
- Apache Groovy: temporarily reverted from 5.0.4 to 4.0.28 while the Gremlin server plugin regression is resolved upstream
- Apache Commons Configuration2, Jackson Databind, Undertow, protobuf-maven-plugin, proto-google-common-protos
- Eclipse Temurin base image in the Docker build
- Plus the usual refresh of Testcontainers, Playwright, GitHub Actions, pre-commit hooks, Prettier, Studio JS dependencies (marked, swagger-ui-dist, postcss, webpack, browserslist, caniuse-lite, electron-to-chromium, png-js, Swagger UI), Python e2e dependencies (psycopg, asyncpg, pytest family, testcontainers, requests, setuptools), TypeScript 6.0.2 to 6.0.3, and many more.
Thanks to everyone who contributed issues, pull requests, and feedback, with a special welcome to first-time contributor Subhashini (@subha0319) who shipped the OpenCypher filter-pushdown optimization.
Full changelog: 26.3.2...26.4.2