9.0 Release Notes

Note

  • To deploy a SingleStore 9.0 cluster, refer to the Deploy SingleStore Guide.

  • To upgrade a self-managed install to this release, follow this guide.

  • To make a backup of a database in this release or to restore a database backup to this release, follow this guide.

  • New deployments of SingleStore 9.0 require a 64-bit version of RHEL/AlmaLinux 7 or later, or Debian 8 or later, with kernel 3.10 or later and glibc 2.17 or later. Refer to the System Requirements and Recommendations for additional information.

Release Highlights

Feature: Sequences - The addition of a SEQUENCE modifier for AUTO_INCREMENT ensures that a unique sequence of numbers is generated, while greatly reducing the difference between the generated numbers. Additionally, the SEQUENCE modifier allows you to set the column type for AUTO_INCREMENT columns to other integer types and specify custom starting values. Refer to AUTO_INCREMENT AS SEQUENCE for more information.

Feature: Automatic Query Reoptimization with Feedback - This feature, also referred to as Feedback Reoptimization (FR), uses statistics from previous query runs to improve query plans and performance. FR reoptimizes queries using statistics collected during query execution so the query optimizer can generate plans based on actual runtime data instead of estimates.

Feature: Multi-value Index for JSON - The new multi-value hash index enables 100x faster analytics performance on JSON arrays. By indexing each value in arrays in JSON documents, the new index avoids scanning large JSON collections and improves query performance for JSON_MATCH_ANY queries.

Enhancement: Enhanced Query History - The updated Query History feature provides users with a powerful tool for monitoring and optimizing SQL query performance. This feature enables high-frequency event tracing, allowing users to identify which queries consume substantial resources or fail during execution and then trace and debug those query executions. Enhanced metrics like CPU time, disk time, network time, various lock times, and more are now included.

Preview Feature: Distributed Plancache (DPC)  - The Distributed Plancache adds a third layer to the plancache, supplementing the existing in-memory plancache and on-disk persistent plancache (PPC). The DPC allows nodes to share plans. Nodes newly added to the cluster will start with a warm plancache instead of building one from scratch. The DPC improves query performance and reduces CPU usage after operations like scaling or rebalance. Plans compiled on one aggregator will be asynchronously synced to other aggregators so that plans do not need to be compiled separately on each aggregator.

  • Enabled synchronous Distributed Plancache lookup during query execution.

  • Distributed Plancache pool size adjustment fails gracefully.

  • Prevented the drop of Distributed Plancache files on regular Persistent Plancache GC.

Changes in Default Behavior

Collation Change

The default collation for new (9.0+) clusters has been changed to utf8mb4_bin from utf8mb4_general_ci to improve default performance of string comparisons, which can substantially improve query speed. The utf8mb4_bin collation is not case sensitive and provides performance advantages when case sensitivity is not required.

  • For existing clusters that are upgraded to 9.0+, the collation is not changed.

  • For new (9.0+) clusters, the default collation will be utf8mb4_bin.

  • The default collation for the utf8 and utf8mb4 charsets has been changed. If a charset, e.g. utf8mb4 is used in new (9.0+) clusters without an explicit collation, the default collation will be utf8mb4_bin instead of utf8mb4_general_ci.

  • Refer to Specifying Character Set and Collation for Clusters for additional information.

Enhancements

  • Added full-text pushdown optimization that works with any filter in the WHERE clause.

  • Added a new metadata table to track full-text search indexes eligible for merging.

  • Added support for custom stopword lists for full-text search version 2.

  • Added new nori (Korean) analyzer customizations for full-text search version 2.

Iceberg

  • Implemented support for automatically generated column mappings (for primitive data types and structures) as part of Iceberg schema inference.

  • Added support for file filtering based on the WHERE clause in the pipeline declaration. Refer to Iceberg Ingest for more information.

JSON

  • Introduced Multi-Value Hash Index for JSON columns. This index optimizes key-path and array-value lookups in JSON columns.

  • Extended a rewrite to allow merging derived tables with JSON functions.

  • Added a new JSON_BUILD_ARRAY function.

  • Added support for JSON arrays in pipelines loading JSON files. Each JSON record in the array is loaded as a separate row.

  • Enabled the use of the MATCH_ANY tokenizer option with underscore in multi-value index settings.

  • Added charset validation for JSON type values in external functions.

  • Added support for the JSON data type in external functions.

Observability

  • Improved performance of profiled query plans by introducing a new profile codegen mode.

  • Included aggregator activity statistics in Query_completion event traces.

  • Added the auditlog_root_only engine variable that enables audit logging for only the root user.

  • Added activity_tracking_id field in activity structure to track the resource consumption by pipelines.

  • Updated the default values of enable_auto_profile and auto_profile_type engine variable to ON and SMART, respectively.

  • Added the SHOW BOTTOMLESS_PLANCACHE STATUS command that returns observability metrics for the distributed plancache.

  • Added estimates for query memory usage based on static row count and row size estimates to improve Workload Manager (WM) memory management.

  • Added an internal allocator Alloc_connection_context which tracks certain per-connection allocations that were previously tracked using the standard allocator.

  • Added an option to run queries that failed asynchronous compilation, allowing users to introspect the compilation results.

  • Added logging for LRU compiled unit eviction.

Pipelines

  • Added support for the PIPELINE <pipeline_name> clause to the SHOW PROFILE command which allows you to view profile information for the specified pipeline.

  • Added support for SHOW PROFILE PIPELINE on Helios.

  • Added the CREATE_USER and ALTER_USER fields in the PIPELINES information schema view. For more information, refer to PIPELINES.

  • Added a HEADER DETECTION ON/OFF clause to control inference from CSV files. For more information, refer to Schema and Pipeline Inference.

  • Added support for inferring Parquet files with the INFER PIPELINE command. For more information, refer to Schema and Pipeline Inference.

  • Added support for inferring Iceberg schemas automatically on pipeline creation with the INFER PIPELINE command. For more information, refer to Schema and Pipeline Inference.

  • Added SHOW CREATE LINK command that allows you to view the CREATE statement for the specified link.

  • Added support for TIME(0), TIME(6), DATETIME(0), and DATETIME(6) types for the CAST command for use with computed columns and the SET clause for use with pipelines and LOAD DATA.

  • Added support to infer CSV files with a single column when the file contains no field terminators in any record.

  • Implemented exponential backoff sleep between batch retries.

  • Added support for metadata garbage collection for Azure pipelines.

Query Execution

  • Added Join Memory Reduction Optimization. This optimization is a new query optimization feature designed to help prevent memory overflow (spilling) during hash joins on large datasets. When enabled, it automatically rewrites qualifying joins into smaller, manageable pieces—reducing memory pressure and the risk of out-of-memory (OOM) errors. This feature is especially useful when joining large tables on high-cardinality columns, where traditional hash joins could exceed memory limits. Added engine variables cardinality_threshold_for_join_split_rewrite and target_group_size_for_join_split_rewrite to control the behavior of this optimization. Refer to Join Memory Reduction Optimization for details. 

  • Added segment metadata that allows the engine to determine if columns are fully enclosed in (or pass) a filter and allows the engine to do segment elimination on queries with an IS NULL filter.

  • Added the CHARACTER SET <charset> and COLLATE <collation> clauses to the ALTER TABLE command that allows converting the character set and collation of a table, respectively.

  • Added support for parameterized IN-lists in BSON multi-value index optimization enabling improved performance for queries with same-type constant literals and single-argument built-in expressions. Previously limited to hex literals.

  • Disabled the pushdown of INSERT SELECT queries to leaf nodes for shard key affecting columns.

  • Enabled expression pushdown from join into hash builds on materialized CTEs.

  • Enabled the rewriting of correlated subselects that depend on more than one outer table with correlation conditions other than = and AND.

  • Extended predicate pushdowns to identify more cases.

  • Extended rewrite for EXISTS subselects to handle arbitrarily nested EXISTS subselects under AND or OR.

  • Added the ability to ignore join selectivity estimates of zero.

Security

  • Enabled mutual TLS authentication between the client and server.

  • Added support for manual password activation and expiration to the ALTER USER command.

  • Added the password_expiration_mode engine variable. When set to LIMITED_ACCESS, users are allowed to log in even after password expiration and run password update commands, such as ALTER USER or SET PASSWORD.

  • Internal roles and groups cannot be deleted anymore.

  • Passwords are now masked in extractor subprocess logs.

  • A warning is now raised for every query if the user's password is expiring soon.

  • Added the VECTOR_INDEX information schema view which shows the amount of memory and disk used by each vector index.

  • Added a fallback mechanism so that when the engine detects that an indexed vector search followed by filters yields fewer than LIMIT rows, the engine falls back to a full table scan to ensure sufficient rows are produced. The fallback mechanism can be disabled by setting the engine variable vector_index_fallback_non_index_scan to FALSE.

  • Extended the VECTOR_SUM aggregate function to support the VECTOR data type.

  • Added a vector index cache to limit the amount of memory used by vector indexes. Refer to Vector Indexing for details.

General Updates

  • Added events to indicate the start and end of asynchronous upgrades.

  • Added the ENSURE_ONLINE_NODES clause to the REBALANCE ALL DATABASES and REBALANCE PARTITIONS commands which allows rebalancing to run only if all the leaf nodes are online.

  • Allowed background merger to run while OPTIMIZE TABLE is running.

  • For deployments with small cache size, changed the default blob cache size to 75% of the disk. Refer to Setting the Blob Cache for details.

  • Connected the distributed plancache to the plancache manager.

  • Disabled unnecessary collection of block statistics.

  • All distributed plancache operations are now asynchronous.

  • Added support for reusing autostats file on recovery.

  • Added support for spilling if input data has NULL rows.

  • Aggregators now periodically synchronize query plans across the deployment.

  • DROP RESOURCE POOL command cannot delete the current resource pool anymore.

  • The engine now waits until asynchronous upgrade steps complete before taking a snapshot.

  • Added support for NULL type in Wasm UDF return types and parameters.

  • Added support for expressions, builtin functions, and user-defined variables in addition to hex literals in Multi-Value index for BSON. Refer to Multi-Value Hash Index (BSON) for more information.

  • Extended redundant GROUP BY detection to outer join predicates.

  • Users with database visibility can now query the *_BOTTOMLESS_* information schema views in the respective database. CLUSTER permissions are no longer enforced for querying these views.

  • Columns with extended types now use the correct default table collation.

  • Enabled correlating fields in subselects to reference outer selects more than one level up.

  • Enabled skipping of non-alterable tables from asynchronous DDL queries.

  • Updated to use a consistent snapshot while performing a shallow table copy.

  • Disabled segment elimination for IN clauses for which the left-hand expression is not a table column.

  • Improved the error message returned when invalid key is specified in the CONFIG/CREDENTIALS JSON.

  • Improved the error message for parameter count mismatch during query parsing.

  • Users with SHOW METADATA privilege can now access the LOAD_DATA_ERRORS information schema view.

  • Added support for delimited batch sets in external functions.

  • Added support for the LIMIT clause in prepared statements.

  • Computed column definitions now support the SPLIT function.

  • The DROP and ALTER TABLE commands no longer have to wait for the plan garbage collector.

  • Added support for updated Standard and Enterprise licenses.

  • Improved the garbage collection behavior for plancache.

  • Introduced support for placeholders for partition ID and timestamp in the SELECT INTO ... filename command.

  • Added Lucene logs to the cluster report.

  • Added statistics related to AWS S3 lookup latency.

  • Added knob to disable cardinality estimates on JSON/BSON columns during analyze.

Engine Variables

This update adds the following new engine variables:

  • auditlog_root_only: Enables audit logging for only the root user.

  • disk_plan_gc_pause_seconds_on_startup: Disables disk plan garbage collection on startup. This variable prevents hot plans from being unintentionally disk garbage collected.

  • disk_plan_gc_pause_minutes_for_detached_tables: Specifies the number of seconds to cache detached table modules before eviction from disk.

  • enable_gc_events: Enables reporting of garbage collection events. Gates the MV_GC_EVENTS information schema view that provides visibility into garbage collection passes.

  • info_schema_show_null_dbs: Allows non-privileged users to view the rows in *_BOTTOMLESS_* information schema views where associated database name is NULL.

  • managed_functions_max_connections: Specifies the maximum number of HTTP connections per node for managed external functions, such as Python User Defined Function (UDF)s.

  • optimizer_disable_analyze_cardinality_on_json: Controls if the cardinality of JSON columns is collected by autostats in PERIODIC mode.

  • optimizer_max_table_row_count_as_default_cardinality: Controls the maximum estimated table row count to be used as the per column cardinality when no column-level statistics exists.

  • password_expiration_mode: When set to LIMITED_ACCESS, users are allowed to log in even after password expiration and run password update commands, such as ALTER USER or SET PASSWORD.

  • regexp_error_handling_level: Controls the behavior of error handling for regexp operations.

  • scheduler_slow_loop_seconds: Specifies the threshold for triggering the verbose logging of scheduler thread timing.

  • ssl_ca_for_client_cert: Support for client certification.

  • suppress_dml_warnings: Suppresses all DML query warnings.

  • vector_index_fallback_non_index_scan: Controls a fallback mechanism so that when the engine detects that an indexed vector search followed by filters yields fewer than LIMIT rows, the engine falls back to a full table scan to ensure sufficient rows are produced. 

  • Distributed Plan Cache: Added the following engine variables to control this feature: enable_distributed_plancache, distributed_plancache_worker_threads, distributed_plancache_max_download_plans, distributed_plancache_agg_sync_s, enable_periodic_distributed_plancache_agg_sync, enable_synchronous_dpc_lookup.

  • Join Memory Reduction Optimization : Added cardinality_threshold_for_join_split_rewrite and target_group_size_for_join_split_rewrite to control the behavior of this optimization.

  • Replication: Note: Only use the following under the guidance of, or as directed by, SingleStore Support.

    • repl_page_desc_limit_before_stall: Limits the number of page descriptors in the page map that a 'ReplLog' can use before stalling new transactions.

    • repl_io_buffer_limit: Limits the number of IO buffers that a 'ReplLog' can use before stalling new transactions.[dr_]

    • repl_network_buffer_size: Replication tries to set both send and receive buffer sizes to reduce waits on TCP ACK packets. Can be set for both DR and non-DR replicas.[dr_]

    • repl_max_chunk_size: When sending logs or snapshots to a replica, limit the chunk size to this value

Information Schema

This update adds the following information schema views and columns:

  • MV_ACTIVE_METADATA_VERSIONS. Provides visibility into active metadata transaction read versions.

  • MV_COLUMNSTORE_ACTIVE_MERGE_PLANS and LMV_COLUMNSTORE_ACTIVE_MERGE_PLANS. Show internal details on currently running merge plans.

  • MV_GC_EVENTS. Provides visibility into garbage collection passes. This view is gated behind the preview feature and engine variable enable_gc_events.

  • MV_TABLE_COUNTERS and LMV_TABLE_COUNTERS. Show cumulative per-table metrics, i.e., the amount of work performed by the background merger.

  • VECTOR_INDEX. Shows the amount of memory and cache used by each vector index.

  • Added the UPLOAD_BLOB_LEAD_PAGES column to information_schema.MV_BOTTOMLESS_SUMMARY. Ensures that uploading log chunks to the remote storage does not keep falling behind.

  • Added more metrics to information_schema.MV_CLOUD_PER_COMPUTE_REMOTE_STATS and information_schema.MV_CLOUD_PER_STORAGE_REMOTE_STATS. Tracks retention log chunks and snapshots.

  • Added the ATTACH DATABASE, DETACH DATABASE, CREATE DATABASE, and DROP DATABASE columns to information_schema.MV_EVENTS.

  • Added the CREATE_USER and ALTER_USER fields to information_schema.PIPELINES.

  • source_type is now included as part of the config_json in information_schema.pipelines.

Bug Fixes

  • Fixed a case where long running background work was blocking in-memory garbage collection of database metadata.

  • Fixed a memory allocation bug during query compilation.

  • Limited the number of retries on plan compilation errors; this fix limits resource usage.

  • Fixed a deadlock in result table creation during reshuffle with the always-false filter.

  • Fixed a crash when a BM25 function in a subselect referenced a table in the outer select.

  • Fixed a crash during replay when a table uses an FTS index with JSON options.

  • Fixed a potential replay failure on a table that uses full-text search version 2.

  • Fixed how JSON_PRETTY builtin function escapes characters.

  • Fixed a bug that caused JSON_TO_ARRAY join queries to return wrong results where the quotes on strings were removed incorrectly.

  • Fixed using delimited batch sets with JSON format.

  • Fixed performance regression for queries involving JSON string extraction (e.g. JSON_EXTRACT_STRING and JSON_ARRAY_CONTAINS_STRING) in situations where there are a large number of JSON values.

  • Fixed incorrect aggregation of leaf query stats in Query_completion tracing.

  • Fixed an issue that caused an error if column names had trailing spaces in CREATE PIPELINE statements.

  • Fixed an issue where monitoring pipelines would sometimes fail to produce data for large source clusters.

  • Fixed a wrong result in ORDER BY <sort key> LIMIT query that skipped rows with NULL values in the sort key.

  • Added support for the IF NOT EXISTS clause to the CREATE VIEW command.

  • Added support for table-level collations.

  • Improved optimization speed of parameterized IN-lists by limiting traversal depth.

  • OPTIMIZE TABLE ... INDEX is now more responsive to KILL QUERY statements.

  • Enabled using the estimated table row count as default column cardinality for better join estimation.

  • Added support for PSQL ARRAY type arguments to the TO_JSON built-in function.

  • Removed the CAST operator if a redundant cast is performed.

  • Improved error handling for regular expressions: errors are now properly raised instead of returning SQL NULL. To avoid breaking existing apps the regexp_error_handling_level engine variable was added. This variable controls the behavior of error handling for regexp operations.

  • Fixed an issue where concurrent DDL and PROMOTE AGGREGATOR TO MASTER statements were not forwarded to the Master Aggregator.

  • Fixed the projection DDL output in the debug profile.

  • Fixed an error named ER_BAD_TABLE_ERROR on UPDATE or DELETE queries with a specific shape.

  • Fixed an issue in CTE query rewrites caused when a CTE referenced a recursive CTE.

  • Fixed the predicate pushdown logic for materialized common table expressions.

  • Fixed query performance issue caused by heuristic estimate selectivity being overwritten.

  • Fixed row count estimation for union subquery containing Materialized Common Table Expression (MCTE)s.

  • Resolved an issue where the regular expression engine would return SQL NULL when hitting the memory limit during execution. It now raises an appropriate error instead.

  • Fixed resource pool and workload management CPU limiting.

  • Fixed a locking bug related to table module eviction during recovery.

  • Fixed a deadlock in a rare scenario related to low memory conditions.

  • Fixed a rare race condition which caused a node to get stuck in offline mode after recovery.

  • Fixed an issue that led to undefined behavior if a node failed concurrently with the computation of the replication distribution tree.

  • Fixed a race condition that caused autostats file leak while reprovisioning.

  • Fixed incorrect autostats in a rare failover case during asynchronous replication.

  • Fixed a race condition in autostats between table refresh and table deletion.

  • Fixed a race condition that could cause shutdown to hang.

  • Fixed a rare crash in synchronized variables initialization.

  • Fixed a bug in the deadlock avoidance algorithm that could lead to deadlocks.

  • Fixed a bug that caused nodes to crash when ALTER TABLE queries ignored foreign keys.

  • Fixed a rare deadlock related to temporary tables.

  • Fixed a crash in SHOW PROCESSLIST in a rare race condition scenario.

  • Fixed a bug in CTE rewrites.

  • Fixed a leak in a rare scenario.

  • Fixed a bug in parser.

  • Fixed a crash in a shallow copy of a table with a pending ALTER operation.

  • Fixed an issue where IN-list factorization did not work with newline characters around the IN-list.

  • Fixed an issue where periodic autostats was disabled when it should not have been.

  • Fixed a crash in lockfree hashtable when the engine is under high memory pressure. Reports an "out of memory" error instead.

  • Fixed a bug in lateral join.

  • Updated third party libraries to fix security vulnerabilities.

  • Increased the _bt timeout from 60 seconds to 180 seconds.

  • Implemented shallow copy of a table with a dropped index, the shallow copy now includes the in-memory segment.

  • Fixed incorrect aggregation of leaf query stats in Query_completion tracing.

  • Fixed an issue where certain commands (e.g. DROP TABLE) could hang due to aborted queries caused by stuck collocated services triggered by external functions.

  • Fixed a bug in the detection of shard key matches in the window function partition by list.

  • Fixed an error in backup subprocess and enhanced subprocess tracing to use structured logging.

Last modified: October 6, 2025

Was this article helpful?

Verification instructions

Note: You must install cosign to verify the authenticity of the SingleStore file.

Use the following steps to verify the authenticity of singlestoredb-server, singlestoredb-toolbox, singlestoredb-studio, and singlestore-client SingleStore files that have been downloaded.

You may perform the following steps on any computer that can run cosign, such as the main deployment host of the cluster.

  1. (Optional) Run the following command to view the associated signature files.

    curl undefined
  2. Download the signature file from the SingleStore release server.

    • Option 1: Click the Download Signature button next to the SingleStore file.

    • Option 2: Copy and paste the following URL into the address bar of your browser and save the signature file.

    • Option 3: Run the following command to download the signature file.

      curl -O undefined
  3. After the signature file has been downloaded, run the following command to verify the authenticity of the SingleStore file.

    echo -n undefined |
    cosign verify-blob --certificate-oidc-issuer https://oidc.eks.us-east-1.amazonaws.com/id/CCDCDBA1379A5596AB5B2E46DCA385BC \
    --certificate-identity https://kubernetes.io/namespaces/freya-production/serviceaccounts/job-worker \
    --bundle undefined \
    --new-bundle-format -
    Verified OK