Virtuoso 08.03.3335 Release Notes
We are pleased to announce the immediate availability of a new Virtuoso Maintenance Release comprising a wide variety of feature enhancements and bug fixes across the following functionality realms:
- Virtuoso DBMS Engine Core
- Web Server
- SPARQL Query Processor
- SHACL Processor
- Virtuoso Replication
- Data Transformation Middleware Layer (“Sponger”)
- Faceted Search and Browsing
- Virtuoso Authentication Layer (VAL)
- HTML-based Admin Interface (“Conductor”)
- R2RML
- OpenLink AI Layer (OPAL)
- OpenLink Data Spaces
- JDBC, Jena and RDF4j Providers
This release introduces support for the wikibase:mwapi SERVICE handler, multiple publications in RDF transactional replication, delta sharing, JSON canonicalization, and a Machine Payments Protocol (MPP/x402) handler spanning the HTTP server and VAL authentication layers.
Additional highlights include SQL Optimizer and SPARQL improvements, VAL authentication with Passkey support, significant improvements to the OpenLink AI Layer, and Sponger LLM meta-processing enhancements. The release also delivers widespread memory safety, and correctness bug fixes throughout the core engine, HTTP server, OpenLink Dataspaces, and R2RML layers.
Also note the following sections:
Virtuoso DBMS Engine Core
- Added initial support for delta-sharing
- Added JSON canonicalization function for use with JWS and related standards.
- Added missing C99 math functions.
- Added initial support for
getaddrinfo()andgetnameinfo(). - Added support for
poll()to replaceselect(). - Added TCP socket BIFs to the unsafe list.
- Added assert to check if MP is busy.
- Added support for zlib version 1.3.2
- Fixed deep stack check in vectorised execution.
- Fixed MD5 used for shared compilation cache key — avoids keeping extra text copy, reduces memory fragmentation.
- Fixed check for dead virtual database connections.
- Fixed ODBC API sequence causing error when attaching table from PostgreSQL.
- Fixed check for unsupported
INSERT INTOview viaSELECT - Fixed OR expression with NULLs now handles UNKNOWN correctly per SQL semantics.
- Fixed
col=coloptimisation — only applied when column is non-null or not a column reference. - Fixed
NOT(equality)incorrectly transformed to always false in subquery/EXISTcontext. - Fixed OR with true at left-hand side — now correctly reduced rather than rewritten as AND.
- Fixed
EXISTnot restricting max rows to one during local test on vector seek. - Fixed
INTERSECTwhen using hash. - Fixed
FLOOR()andCEILING()to return double. - Fixed crash when using
SAMPLEwith union and group by. - Fixed TPC-H Q2 RDF query failure when
enable_dfgwas set. - Fixed scalar subq top-1 not applying top-k trick correctly with join test.
- Fixed VDB union with const expression in select branch causing bad SSL ref.
- Fixed redundant NULL removal in
IN (const1, const2). - Fixed check for upper MP limit increment in optimiser.
- Fixed max memory pool size handling at 4 GB boundary.
- Fixed infinite optimisation loop in
sparp_simplify_expn_with_req. - Fixed wrong condition when traversing constants — IRI flag mask corruption.
- Fixed long-running query on v8 for EUPO.
- Fixed SPARQL optimizer incorrectly inlining
gby(?var)when var is bound. - Fixed recursive hash call resulting in stack overflow.
- Fixed false positives in
HRNG_INhash lookup results. - Fixed bloom pre-filtering silently dropping hash members.
- Fixed unused estimate on
chash_in. - Fixed bad constant expression in hash fill.
- Fixed transitivity node 2-ways — duplicate
rgs_ackremoval and missing unbound graph indt2wayunion. - Fixed derived table and transitive direction — only same-DT columns drive direction.
- Fixed issue with call not yet traversed — now creates new DFE.
- Fixed variable used outside of scope.
- Fixed missing check for star in function call.
- Fixed missing check for
DFE_FALSE. - Fixed missing check for right outer-join table.
- Fixed aggregate not returning error in UA.
- Fixed GEO const using ANY type for result.
- Fixed check for false shortcut in plan.
- Fixed aggregate on constant with no result.
- Fixed re-compiling module proc — new QR must not be dropped as it is referenced by all new module proc QRs.
- Fixed join sampling on out cols.
- Fixed enabled QRC issue.
- Fixed case/qualified name issue.
- Fixed
CONCATover RDF box string literal containing UTF-8 — must not cast to default. - Fixed
concat()with non-string and RDF box. - Fixed TSV string encoding — tab, newline, and carriage return now encoded as
\t,\n, and\rrespectively; triple-quote forms not used. - Fixed JSON-LD unknown bnode with many types — takes first result instead of stopping load.
- Fixed pointer type mismatch in conditional expression in JSON parser.
- Fixed timezone hour field length in
dateTimeconstructor causing some dates to be converted to strings in RDF. - Fixed
xsd:timeconversion forcast(THH:mm:SS as time). - Fixed thread tmp pool not released on time.
- Fixed overflow check before assign.
- Fixed buffer read after boundary in
cha_any. - Fixed buffer underflow when column value is empty string.
- Fixed interpolation function reading after boundary.
- Fixed ptr of local array used out of scope.
- Fixed
box_lengthcalled on non-box variable. - Fixed scanner tokens now correctly allocated as MP box.
- Fixed
fvectorsize/length —sizeof(float)throughout; no double allocation. - Fixed numeric DTP when column is bound — boxed correctly.
- Fixed non-parsable numeric set to NaN.
- Fixed missing
IS_TScheck. - Fixed missing critical section in PL remove.
- Fixed missing client enter assert with
mtx_debug. - Fixed mutex issue with
status('l')and async queue on independent branches (visible as hang). - Fixed recent crashes from VOS GitHub issues.
- Fixed
position()andcasemode_strcmp()for NULL arguments. - Fixed
ws_sessioncheck — can be WebSocket callback. - Fixed TCN order by server-side QS.
- Fixed WebID check for nobody perms.
- Fixed boolean type of UDT field not serialised in SOAP.
- Fixed error codes for COL and VEC.
- Fixed missing test for star.
- Fixed missing test for table existence in
DROP COLUMN. - Fixed password handling — uses params instead of truncating.
- Fixed broken output when copy param is not printed.
- Fixed SSL ref reset outside of scope.
HTTP (Web) Server
- Added MPP (Machine Payments Protocol) handler for x402 and HTTP 402 responses.
- Added ACL cleanup for
http_reaper. - Added fail code to HTTP advanced DAV ACLs.
- Added support for JSON-LD formats.
- Fixed HTTP log CR/LF in request line after HTTP 509.
- Fixed OPTIONS against authenticated calls no longer returns 401; responds 204 with CORS headers.
- Fixed OPTIONS on
.well-knownproducing response body. - Fixed XSLT post-process cleanup — memory leak that could cause crash.
- Fixed SSE not read when content length is already given.
- Fixed
obj2jsonto pass max depth in recursive call; preserve null input. - Fixed outstanding locks released before sending content.
- Fixed HTTP web bot signatures.
- Updated Turtle/JSON-LD upload handler to correctly apply LDP clear when the flag is reset.
SPARQL Query Processor
- Added support for
wikibase:mwapiSERVICE handler. - Added support for generating VoID graph for a graph group.
- Added DBA-configurable information box on the
/sparqlform viaregistry_set. - Fixed graph caching exposing private graphs as public when VAL not installed.
- Fixed SPARQL
FILTERonOPTIONAL— bound/unbound miscounting and performance issue. - Fixed filter using
BIND()result inside optional. - Fixed filter outside of optional causing wrong IRI equality.
- Fixed timing-out query with inference and multiple unions — disabled GP flattening in this case.
- Fixed bad eq idx check — disconnect eq from outer via backward loop.
- Fixed subq filter and language of literals.
- Fixed tightening against non-existing constraint.
- Fixed
isBlankauto mode — no longer errors, behaves likeisIRI. - Fixed SPARQL vars options and permalink.
- Fixed generic literal class — no longer derives when mapping to same IRI class name.
- Fixed parse not skipped when timeout already reached.
- Fixed infinite optimisation loop.
- Fixed 64-bit IRI IDs for graph groups and membership.
- Fixed RDF view single primary key on date — not previously supported.
- Fixed input check for prefix in RDF view/maps.
- Fixed RDF Views total count stats optimisation.
- Fixed virtual graphs excluded from WebID lookup.
- Fixed
/sparqlUI help links made relative.
SHACL Processor
- Added
sh:messagein SHACL report upon validation failure.
Virtuoso Replication
- Added initial support for multiple publications via graph groups in RDF transactional replication.
- Added replication unsubscribe RPC to handle void subscriptions on publisher.
Data Transformation Middleware Layer (“Sponger”)
- Added multiple task types for LLM meta processing.
- Fixed callback query to retrieve all literals of a subject.
- Fixed LLM cartridge to call embeddings extraction in chain.
- Fixed authenticated VAL user now recorded and checked in batch cartridge.
- Fixed typo in table name.
- Fixed explicit
get:cartridge noneno longer runs meta cartridges. - Updated to use API for retrieving embedding task.
Faceted Search and Browsing
- Removed deprecated support for AddThis.
- Fixed potential XSS vulnerabilities.
- Fixed encoding issues with URIs and labels.
- Fixed VSP escapes.
- Fixed grammar and spelling mistakes.
Virtuoso Authentication Layer (VAL)
- Added Machine Payments Protocol
MPP402 callback hooks for SPARQL endpoints. - Added 402 Payment Required handlers for access-gated resources.
- Added VAL login option in Conductor UI.
- Added option to return all restriction values from VAL APIs.
- Added common authentication layer for RESTful APIs.
- Added support for HTTP
HEADmethod. - Added
sql:big-data-constannotation to ensure correct compilation for SPARQLINSERT DATAstatements. - Added initial support for Passkey authentication.
- Added sandbox mode global state preservation across calls.
- Fixed HTTP 402 Payment Required error state preserved across request lifecycle.
- Fixed missing request access dialog.
- Fixed session entry now correctly committed and returned.
- Fixed VAL to accept both
httpandhttpswhen resolving person IRIs generated by ODS. - Fixed bitmask value handling in tests.
- Fixed null realm now treated as default realm, preventing wrong rule/group/restriction graph selection.
- Fixed realm assignment issue.
- Fixed API restriction storage to use SPARQL Update (SPARUL) for insert/delete operations.
- Fixed HTTP error codes returned by VAL public API.
- Fixed DAV normalize path no longer attempting to resolve paths already under
/DAV/. - Fixed netid set to owner correctly when authorizing on their behalf.
- Fixed min/max choice logic to correctly assign value params.
- Fixed VAL operations via OPAL tools.
- Fixed restriction values handling.
HTML-based Admin Interface (“Conductor”)
- Added initial support for multiple publications via graph groups.
- Added support for OpalFs.
- Added option to login in Conductor via VAL.
- Fixed issue with Linked Data / SPARQL page.
- Fixed syntax error on page.
- Fixed grammar and spelling mistakes in Conductor.
- Fixed missing bold tag on table headers.
- Removed bold from first column on Monitor Version and HTTP tabs.
- Fixed clear float on
attention_box. - Fixed potential XSS vulnerabilities in fct.
- Fixed format attribute, value attributes,
hrefandsrcattributes, and URL parameters to use correct%V,%H, and%Uescapes. - Replaced simple
http()calls withhttp_value()/<?V ?>equivalents. - Fixed DAV browser in root dir adding duplicate directory delimiters.
- Fixed ACME-related key storage to suppress ODS triggers.
- Fixed
&encoding in style producing . - Fixed select list for user names capped at 1,000 entries.
R2RML
- Fixed issue with RML type mappings
- Fixed missing dot that confused parser.
- Fixed IRI class with one argument not accepting dates as
dt. - Fixed issue parsing qualifier when table already exists.
- Fixed arg name for IRI classes.
- Fixed string literal constants no longer incorrectly defaulting to IRI type.
OpenLink AI Layer (OPAL)
- Added OPAL Skills.
- Added MPP over JSON-RPC.
- Added MPP handler call.
- Added API Catalog and MCP discovery endpoints.
- Added skills input for RESTful APIs.
- Added skill tools rendering.
- Added tools page for WebMCP.
- Added agent tracking; consolidated MCP/REST API logic.
- Added UCP RESTful implementation.
- Added MCP transport.
- Added unzip callback on JSON/assistant config folder.
- Added DAV batch callback and embeddings support.
- Added Gemini batch API support.
- Added embedding models support in batch APIs.
- Added Gemini native API for file search and related operations.
- Added file attach for Gemini via OpenAI compat API.
- Added image generation via Gemini models.
- Added file management tool with list support.
- Added file search in OPAL UI.
- Added vector stores MCP tools.
- Added support for uploading blobs (capped at 10 MB).
- Added attributes for file search to JSON assistant config.
- Added Gemini file get support.
- Added initial support for OPAL File DET.
- Added debug SSE for assistant API.
- Added filter and group action on models UI.
- Added Linked Data view for chat sessions.
- Added remote SPARQL service tool.
- Added Sponge tool.
- Added Web Fetch tool (OpenAI and Claude).
- Added
ADM.DBA.val_acl_restrictionstool. - Added new “Class” tool.
- Added SPARQL to VAL assistant.
- Added timeout to chat tool.
- Added agent class.
- Added max prompts per interval restrictions.
- Added enabled tools to the restriction mix.
- Added tool for configuring subscription cache interval.
- Added tools to manage ACL-only purchases for the shop.
- Added gemma model to Google domain.
- Added function to isolate table ref in Sponger code.
- Fixed Gemini 4 models context window set to 256K.
- Fixed DB schema tool arguments and instructions.
- Fixed Gemini tool call handling with text and signature.
- Fixed skill with STDP instructions handling.
- Fixed session check for unauthorized access.
- Fixed Claude function call without args when combined with other calls; skill retrieval tool.
- Fixed
list_modelsto handle Claude. - Fixed scheduled task to check for dummy key.
- Fixed vector store upload.
- Fixed vector store API to include provider.
- Fixed empty media type handling.
- Fixed Gemini API missing selection — force on non-empty.
- Fixed Gemini 3 function tool OpenAI compatibility.
- Fixed attachments enabled for GPT-5.
- Fixed complete message wrapper — handles various file inputs; merged common code.
- Fixed responses OAI API handlers: stop flag not reset, cursor used for last, subselect issue.
- Fixed responses API arrangement; fixed missing file/image inputs.
- Fixed chat complete MCP tool to use responses API; added Gemini signatures.
- Fixed file expiration check — hash on content no longer unique for
f_idwhen file is obsoleted. - Fixed Gemini file expiration — expiration date now stored.
- Fixed resumable upload to ensure filename; fixed files API re-get.
- Fixed large file upload to OpenAI; fixed empty string API key in params.
- Fixed chat session copy missing new fields.
- Fixed instructions not used for embeddings.
- Fixed content splitting when embeddings are batched.
- Fixed deleting task should clear FK reference.
- Fixed missing grant.
- Fixed file store sync for last-used timestamp.
- Fixed link for embedding batch items.
- Fixed faster pattern match for models.
- Fixed callback query to get all literals of subject.
- Fixed bitmask setting check.
- Fixed copy of store ID on continue from shared session.
- Fixed VAL tools to signal sandboxing.
- Fixed tools authentication for responses API.
- Fixed Claude batch item handling with file.
- Fixed Claude: empty text no longer passed as input;
top_pandtempnot sent to Claude models. - Fixed Claude-Opus errors re
top_p; model context window increased. - Fixed admin permissions.
- Fixed check for admin access.
- Fixed transactions in chat complete tool.
- Fixed enabled modules error on position.
- Fixed wrong functions parameter.
- Fixed shadow variable.
- Fixed attribute concatenation.
- Fixed
OAI.DBA.chatModelsmissing decorations. - Fixed
urn:chat:modulerestriction to keep comma-separated list of modules/assistants. - Fixed function results token estimate to handle web pages.
- Fixed Gemini context size to 1M.
- Fixed
gpt-4o-minias default model; fallback to last used or default when no model selected. - Fixed
chatModels/GETas public alias forgetModels. - Fixed VAL assistant.
- Fixed input checking to map empty strings to NULL — LLMs often use empty string as none.
- Fixed RDF view fragment identifier.
- Fixed tool timeout and error message.
- Fixed clean button on new session from stopped state.
- Fixed ACL check on DAV-hosted assistant configs.
- Fixed assistant config list filtered by restriction.
- Fixed issue initializing session state — new session now sends selected tools.
- Fixed module accessibility when netid is restricted to it.
- Fixed chat complete tool stopping at many sequential tool calls; default limit raised to 10.
- Fixed MCP done notification before exit proc.
- Fixed idempotency key required only for complete and cancel in MCP.
- Updated OPAL ontology.
- Updated OpenAI API.
- Deprecated assistant API; disabled refresh.
- Discarded thoughts from model output.
- Tool execution now runs in its own transaction.
- Updated VAL tools with new parameter.
- Updated to load offer and restriction information from a file.
- Moved ontology and added to VAD.
- Disabled tool optimisation for larger models.
- Moved Skill Resources Retriever after BPE init.
OpenLink Data Spaces
- Added delegated ODS API authentication via admin account OAuth2 tokens.
- Added VAL ACL rules for private graphs.
- Added
returnurlto mail verification email links. - Added passkeys support in ODS.
- Added
emailverifyoption toserver.getInfo. - Added reCAPTCHA to registration — site key stored in registry, verified server-side before
user.register. - Added option to register using third-party accounts.
- Fixed VAL-backed SPARQL to use graph caching.
- Fixed S3 DET to avoid deep recursion.
- Fixed SSL ref-before-set and sqlx/sql-xml statements for RSS comments.
- Fixed user profile in TTL being empty when graph security is enabled and default rules are applied.
- Fixed VAL ACL rule cache now cleared when private graph rules are added.
- Fixed
DESCRIBEto handle bothhttpandhttpsshop IRIs. - Fixed null encoding — no longer attempts to encode null values.
- Fixed missing SPARQL pragmas in sem ping and API.
- Fixed sem ping and API to use physical store.
- Fixed passkey error handling.
- Fixed registration email to use alternate multipart format.
- Fixed cursor join order to prevent optimizer issue.
- Fixed ODS API: no longer removes server caps for local servers; fixed non-XML error parsing; removed debug output.
- Fixed third-party account binding no longer rolled back — commit and notify instead.
- Fixed missing realm in third-party callback.
- Fixed
dctermsprefix declaration. - Fixed inserts to use explicit
iri(). - Fixed SPARQL query to use physical store.
JDBC, Jena and RDF4j Connectors (Providers)
The latest Virtuoso JDBC, Jena and RDF4j providers are also available via the Maven Central repository.
Installer Availability
On-premise Installers and Docker Containers
- On-premise Installers for Linux, macOS, and Windows
- Docker Containers
Cloud Edition Releases for Amazon AWS, Microsoft Azure, and Google Cloud Platform
Amazon AWS
- Virtuoso Virtual Machines for the Amazon AWS Cloud
- OpenLink AI Layer (OPAL) Virtual Machine for the Amazon AWS Cloud
- DBpedia Snapshot (Virtuoso PAGO) for Ubuntu on the Amazon AWS Cloud
Microsoft Azure
- Virtuoso Virtual Machines for the Microsoft Azure Cloud
- OpenLink AI Layer (OPAL) for the Microsoft Azure Cloud
- DBpedia Snapshot (Virtuoso PAGO) for Ubuntu on the Microsoft Azure Cloud
Google Cloud Platform
- Virtuoso Virtual Machines for the Google Cloud Platform
- OpenLink AI Layer for the Google Cloud Platform (GCP)
Upgrade Notes
For All Upgrades
-
Always make sure the database has been properly shut down and the transaction log (
virtuoso.trx) is empty before performing any update/upgrade. This is easily done by launching Virtuoso with the extra command-line argument+checkpoint-only. Virtuoso will launch, replay the transaction log, run a checkpoint (which zeroes the transaction log), and exit cleanly. -
Before upgrading any database, it is always a wise precaution to make a proper backup.
Upgrading an Existing Cloud Instance Virtual Machine
Execute the relevant command for your operating system distribution:
- Ubuntu and related —
apt update && apt upgrade - RedHat and related —
yum update
Manually Overwriting an Older Binary with the Latest Edition
Start with the documentation of manual upgrades.
If you choose to manually replace the Virtuoso server binary (virtuoso-iodbc-t) in-situ, you MUST also update the libraries in the Virtuoso hosting/ subdirectory due to incompatibilities between the latest binary and previous plugin versions. We also strongly RECOMMEND that you update the VAD packages in the vad/ subdirectory.
Upgrading from Any Previous Version to the Latest Version
For best results with existing installations, we recommend following our simple step-by-step guide to upgrade from any previous version of Virtuoso to the latest version.
Additional Information
- OpenLink Personal Assistant — VAD Installation, Configuration, and Usage Guide
- Introducing Native GraphQL Support in Virtuoso
- Usage Guide — Virtuoso GraphQL Views Creation & Management
- Virtuoso “Encryption At Rest” (EAR) Usage Guide
- Virtuoso Database Upgrade Notes
- Virtuoso artifacts on Maven Central