github eXist-db/exist eXist-7.0.0-beta3

pre-release3 months ago

Release Notes — eXist-db 7.0.0-beta3

NOTE Mac DMG and win exe installers are signed but not yet working.

Overview

We are pleased to announce the 7.0.0-beta3 release of eXist-db, representing 3,457 commits by 23 contributors since eXist-6.4.1, with 1,115 merged pull requests closing 299 issues.

This is a major version bump reflecting substantial infrastructure changes, breaking compatibility improvements, and significant W3C conformance work. Users migrating from any 6.x.x release should carefully review the breaking changes below.

Note: This is a beta release — not recommended for production use. Given the large number of breaking changes (Java 21, Jetty 12, XML:DB API 2.0, Lucene 10, and several behavioural changes), we are releasing this beta to gather feedback from the community before the final 7.0.0 release. We have tested extensively but invite all users to report both positive and negative experiences. As always, please ensure you have frequent and correct backups of your database.

For users of our existdb/existdb container images, please note that the moving tag :release now points to this beta. The last v6 tag is :6.4.1 depending on your use case you might need to adjust your automation pipelines.


Breaking Changes

Java 21 Required

eXist-db 7.0.0 requires Java 21 or later. Java 8 through 20 are no longer supported. The build and runtime have been updated accordingly including migration to ZGC as the default garbage collector.

On JDK 21+, the jdk.incubator.vector module is available for SIMD-accelerated vector operations in Lucene's vectorized code paths, powered by the Panama Vector API.

Jetty 12 (Jakarta EE 10 / Servlet 6.0)

Upgraded from Jetty 11 to Jetty 12.0.x with Jakarta EE 10 (Servlet 6.0). This introduces a breaking API change — all javax.servlet namespace references have been migrated to jakarta.servlet. Third-party Java extensions and applications compiled against the previous servlet API will need to be updated.

XML:DB API 2.0

Upgraded to XML:DB API 2.0.0, which uses Jakarta EE 9+ namespace (javax.xml.xmldb → package updates). Existing Java clients using the XML:DB API must be recompiled against the new version.

Secure XML Processing Enabled by Default

Secure XML processing (XML parsing with external entity expansion disabled) is now the default configuration (parser.secure-processing=true in conf.xml). Previously this was opt-in. Applications relying on DOCTYPE-based entity expansion or external DTD fetching must explicitly enable these in their configuration.

XML Declaration Preservation (On-Disk Format Change)

XML declarations (e.g., <?xml version="1.0" encoding="UTF-8"?>) are now persisted and serialized by default. This changes the on-disk storage format. A full backup and restore is required when migrating from 6.x.x. The REST API, Java Admin Client, and WebDAV endpoints all default to preserving the original XML declaration. New query parameters _omit-xml-declaration and _omit-original-xml-declaration provide fine-grained control.

fn:collection Spec Compliance

The fn:collection function signature has been made compliant with the XQuery 3.1 F&O specification. The xmldb:xcollection function has been re-aligned accordingly. Code using non-standard argument patterns may break.

map:merge Use-First Default

map:merge now uses the first occurrence of duplicate keys (per the XQuery 3.1 specification), rather than the last. This is a behavioral change — code relying on the previous "last wins" semantics must be reviewed.

Default Order for Empty Sequences: "Empty Least"

The implementation-defined behavior for ordering empty sequences has changed from "empty greatest" to "empty least", aligning with Saxon and BaseX. Queries with order by that assume empty values sort to the end may produce different results.

Cardinality Enforcement

Stricter enforcement of cardinality in function signatures and type checking has been introduced. Previously permissive handling of sequences where single items were expected may now raise errors.

Legacy JSON Utilities Removed

The deprecated json.xq and jsonp.xq library modules have been deleted. Code using these should migrate to fn:json-to-xml, fn:xml-to-json, or the JSON serialization support built into eXist-db's adaptive serializer.

IPrange Filter Removed

The IP address range filter has been removed from the distribution. Existing configurations referencing this filter will need to be updated.

EXPath HTTP Client Namespace Prefix Alignment

The default EXPath HTTP Client namespace prefix has been aligned with the specification. Existing code using custom prefixes should continue to work, but reliance on the old default may require updates.

JAXB 4 Upgrade

Upgraded from JAXB 3 to JAXB 4 (Jakarta XML Binding). Java code compiled against JAXB 3 will require recompilation.

Deprecated Cardinality._MANY

The Cardinality._MANY constant has been deprecated. Use Cardinality.ZERO_OR_MORE or Cardinality.ONE_OR_MORE as appropriate.

Lucene Analyzer & Query Parser Classes (collection.xconf)

Existing collection.xconf files may reference obsolete Lucene classes that have been removed or relocated:

  • org.apache.lucene.queryparser.analyzing.AnalyzingQueryParser — removed in Lucene 7.x; omit the <parser> element to use the default parser, or reference a current Lucene 10 query parser class
  • org.apache.lucene.queryParser.* (capital P) — package renamed to lowercase; update to org.apache.lucene.queryparser.*
  • org.apache.lucene.analysis.util.* — moved to org.apache.lucene.analysis.*
  • org.apache.lucene.analysis.standard.StandardFilter / StandardFilterFactory — removed (no-op)
  • org.apache.lucene.util.Version — removed; analyzer constructors no longer accept a Version argument
  • org.exist.indexing.lucene.analyzers.NoDiacriticsStandardAnalyzer — removed; use org.apache.lucene.analysis.standard.StandardAnalyzer instead

See the Lucene 10 Migration Guide for details.


Major Features

XQuery W3C Conformance Improvements

  • Tumbling Window Expressions — support for the W3C XQuery 3.0 tumbling window clause (via PR #4529)
  • Sliding Window Expressions — support for sliding window clauses (via PR #4529)
  • Count Expressions — support for the XQuery 3.0 count clause in FLWOR expressions (via PR #4530)
  • XPath Regex Validation — improved compliance with W3C regex validation including XPath 4.0 lookaround support
  • fn:contains-token — fixed collation parameter to correctly accept empty sequence
  • fn:unparsed-text — improved conformance, BOM stripping, and security-gated file:// URI resolution
  • fn:matches / fn:analyze-string / fn:replace / fn:tokenize — fixed error codes and empty-pattern handling per spec

XQTS compliance

One of the main goals of this release was to push towards full XQuery 3.1 compliance. We now pass over 90% of close to 32 thousand test cases that make up the latest version of the entire test-suite. This is more than 10% of what our current release 6.4.1 passed.

And we plan to improve even further before the main release as there are a couple of low hanging fruits left.

For those of you who like raw stats here is a summary. Both runs were done on the same hardware (MacBookPro M1Max with 32 Gb of hardware) but keep in mind that the spec is not a good performance benchmark and we have seen quite a lot of variance in timings. Overall it is safe to say that even though we now pass more of the tests the overall execution time has gone down significantly.

exist-db version Tests Failures Errors Skipped Success rate Time
6.4.1 31815 4720 296 1185 80,5% 279.741
7.0.0-beta 31815 1608 134 1259 90,57% 155.328

Serialization Compliance (W3C)

Major serialization compliance overhaul:

  • Spec-compliant DOCTYPE for XHTML/HTML serialization
  • HTML5/XHTML5 fragment and DOCTYPE serialization fixes
  • HTML5 PI serialization per W3C 3.1 and HTML5 PR2372
  • Duplicate Content-Type/charset meta suppression in HTML/XHTML head
  • cdata-section-elements prefix resolution via static namespaces
  • xmlns="" undeclaration via proper namespace stack in XMLWriter
  • XML 1.1 namespace undeclaration support in element constructors
  • Parameter-document serialization parameter implementation
  • Bulk-write and raw-text fast path optimizations for HTML/XML serialization
  • JSON and adaptive serializer improvements for W3C compliance
  • Improved XQuerySerializer for W3C serialization compliance

Lucene Index Improvements

  • Lucene 10 migration — upgraded from Lucene 4 to Lucene 10.3.0, removing all deprecated APIs and obsolete query parser classes
  • Vector KNN search — new KnnFloatVectorField / KnnFloatVectorQuery support enabling semantic search via:
    • ft:query-vector($nodes, $vector, $k?) — KNN vector search with optional top-k parameter
    • ft:query-field-vector($field, $vector, $k?) — field-scoped vector search
    • Filter queries, range filters, and facet drill-down combined with vector search
  • Vector embedding module (vector:* namespace http://exist-db.org/xquery/vector):
    • vector:embed($text, $model, $model-path?, $api-key?) — single-text embedding
    • vector:embed-batch($texts, $model, $model-path?, $api-key?) — batch embedding
    • vector:models() — list known embedding models
    • vector:diagnostics() — provider status and model cache info
  • Embedding providers — ONNX Runtime (local CPU/GPU models) and HTTP providers (OpenAI, Cohere-style APIs)
  • Vector storevector.dbx (native BFile) for persistent embedding storage, participating in native backup/restore
  • vector-store modesdb (Lucene + vector.dbx) or lucene (Lucene-only, recomputes from text)
  • Reindex scopesxmldb:reindex($collection, $mode?) with "all", "fulltext", or "vector" modes
  • vector-field index config in collection.xconf with dimension, similarity (cosine/euclidean/dot_product), encoding (base64/text), embedding (local/http), model and model-path attributes
  • Optimized memory allocation for NodePath
  • Named Lucene field preservation during xmldb:reindex
  • Batched delete strategy for collection reindex (tunable via exist.lucene.reindex.delete.batchClauses, default 256)
  • Fix facet counts with field queries
  • Multiple index configuration search coverage
  • enforce-index-use default set to strict

Performance Optimizations

  • Object lock allocation optimizations (backported from FusionDB)
  • Reduced garbage collection pressure from Document/Collection locks
  • Path expression optimization in predicates and extension expressions
  • Bulk-write serialization paths
  • FilteredExpr and Union expression context sequence optimization
  • Attribute prefix coalescence in XMLWriter
  • Caffeine cache configuration with expireAfterWrite

Build & Infrastructure

  • Maven Daemon (mvnd) support for faster CI builds
  • Docker: multi-architecture images (x86_64 + arm64)
  • Universal binary DMGs for macOS
  • XQTS runner 2.0.0 integration with previous-run comparison
  • Modernized Maven build and release pipeline
  • Codesigning and notarization for macOS DMGs

JMX Monitoring

  • Switched from CompositeData to TabularData for Running/Recent Queries, Running Jobs, and Scheduled Jobs — improved interoperability with monitoring tools.

exist:time Pragma

A new and improved exist:time XQuery pragma for timing query execution (backported from FusionDB).

XQSuite Improvements

  • Support for additional XDM argument types (including custom assertions)
  • %test:assertEqualsPermutation fix for argument order
  • Proper error handling when effectiveBooleanValue fails
  • Safe effective boolean value evaluation
  • Support for default element namespace

Mail Module

  • Authentication support in mail:get-mail-session function
  • Jakarta Mail upgrade

Bundled Packages

  • existdb-openapi 0.9.5 (new) — OpenAPI endpoint for eXist-db, providing language-service and cursor namespaces
  • roaster 1.12.1 (new) — OpenAPI router for XQuery REST routing
  • eXide 4.0.0 — major update modernizing around roaster and existdb-openapi and CodeMirror dependencies
  • Monex 5.1.0 — updated for eXist 7 JMX monitoring changes
  • exist-documentation 7.0.0 — updated for eXist 7 API changes
  • Function documentation (fundocs) 3.0.1 — updated for eXist 7 function signatures

Bug Fixes

  • Fix type conversion to Saxon types in fn:transform (#5882)
  • Fix fn:transform URI resolution and global parameter passing
  • Fix serialization parameter handling for W3C compliance (multiple PRs)
  • Fix PathExpr iteration for atomic, context-independent RHS (#798)
  • Fix AbstractDateTimeValue subtype comparisons (#5478)
  • Fix RootNode context-item dependency
  • Fix NPE in nested anonymous functions (#5717)
  • Fix URL rewrite view pipeline for XHTML-serialized HTML documents
  • Fix variable declaration error codes for XQuery 3.1 compliance
  • Fix JettyMaxFormContentSize configuration exposure
  • Fix AVLTreeNodeSet item type tracking for correct return-type checks
  • Fix XQTS comparison failures: reserved names, context, promotions
  • Fix module import resolution and circular imports
  • Fix fn:load-xquery-module version checking
  • Fix SequenceType function-arity restriction
  • Fix XPointer xmlns() declaration handling in multi-scheme parsing
  • Fix formatting of small numbers with exponents (#5954)
  • Fix JMX servlet startup error (#5835)
  • Fix Monex query history key generation (#5881)
  • Fix map:merge duplicate key handling (use-first per spec)
  • Fix util:describe-function QName output
  • Fix InputStream.available() abuse (#4979)
  • Fix invalid query HTTP response code (500 vs 400) (#4639)
  • Fix location hint resolution for relative modules from filesystem
  • Fix CastExpression.toFunction cardinality (#4971)
  • Fix tails of subsequence off by one (#4830)

Updated Application Dependencies (compared to eXist-db 6.4.1)

Dependency Old Version New Version
ANTLR Maven Plugin 2.3 2.4
AppBundler 2.0.0 3.2.0
AspectJ 1.9.9.1 1.25.1
Bouncy Castle 1.78.1 1.84
ByteBuddy 1.14.x 1.18.8
Caffeine 2.9.3 / 3.1.x 3.2.4
Commons Codec 1.15 1.22.0
Commons Compress 1.22 1.28.0
Commons IO 2.11.0 2.22.0
Commons Lang3 3.12.0 3.20.0
Fastutil 8.5.11 8.5.18
GeoTools 32.x / 33.x 34.4
H2 2.1.214 2.4.240
IzPack 5.2.0 5.2.5
Jackson 2.13.4 / 2.15.2 2.21.3
Jakarta Activation 1.x / 2.0 2.1+
Jakarta Mail 1.x / 2.0 2.1+
Java 8/11 21
JAXB 3 4
Jetty 11.0.x 12.0.x
JLine 3.22.0 4.0.14
Log4j 2.19.0 2.25.4
Lucene 4.x 10.4.0
SLF4J 2.0.6 2.0.18
Tika 2.7.0 3.3.1
XML:DB API 1.x 2.0.0

Full changelog: compare eXist-6.4.1 to develop


Backwards Compatibility

eXist-db 7.0.0-beta is not backwards binary compatible with previous 6.x.x releases due to:

  • Java 21 requirement
  • Jetty 12 / Jakarta EE 10 (javax.servlet → jakarta.servlet)
  • XML:DB API 2.0 API changes
  • JAXB 4 namespace changes
  • On-disk format change for XML declaration preservation

A full backup and restore is required when migrating from any 6.x.x release. Applications should be reviewed for the breaking changes detailed above, particularly around serialization behavior, function signatures, and namespace management.

For users migrating from 4.x.x or 5.x.x versions, please first upgrade to the latest 6.x.x release before migrating to 7.0.0-beta.

Don't miss a new exist release

NewReleases is sending notifications on new releases.