# MariaDB 12.3 Changes & Improvements

{% hint style="info" %}

<p align="center">The most recent release of MariaDB 12.3 is:</p>

<h4 align="center"><strong>MariaDB 12.3.1 RC</strong> <a href="https://downloads.mariadb.org/mariadb/12.3.1/" class="button primary">Download Now</a></h4>

<p align="center"><a href="https://downloads.mariadb.org/mariadb/12.3.1/"><sub><em>Alternate download from mariadb.org</em></sub></a></p>
{% endhint %}

MariaDB 12.3 is a [long term release](/docs/release-notes/community-server/about/release-model.md), maintained until June 2029.

## New Features

### Security <a href="#security" id="security"></a>

* Support for passphrase protected keys ([MDEV-14091](https://jira.mariadb.org/browse/MDEV-14091))
  * [ssl\_passphrase system](/docs/server/security/encryption/data-in-transit-encryption/ssltls-system-variables.md#ssl_passphrase) variable
* New statement [SET SESSION AUTHORIZATION](/docs/server/reference/sql-statements/account-management-sql-statements/set-session-authorization.md) for performing actions as another user ([MDEV-20299](https://jira.mariadb.org/browse/MDEV-20299))
* Implement SHA2 support for file\_key\_management.so plugin (TDE) ([MDEV-34712](https://jira.mariadb.org/browse/MDEV-34712))

### Compatibility Features

* Oracle `TO_DATE()` function ([MDEV-19683](https://jira.mariadb.com/browse/MDEV-19683))
* Support for cursors on prepared statements ([MDEV-33830](https://jira.mariadb.com/browse/MDEV-33830))
* SQL Standard `SET PATH` statement ([MDEV-34391](https://jira.mariadb.com/browse/MDEV-34391))
* SQL Standard `IS JSON` predicate ([MDEV-37072](https://jira.mariadb.com/browse/MDEV-37072))
* Allow `UPDATE`/`DELETE` to read from a CTE ([MDEV-37220](https://jira.mariadb.com/browse/MDEV-37220))
* Basic XML data type ([MDEV-37261](https://jira.mariadb.com/browse/MDEV-37261))
* Support for cursors on prepared statements ([MDEV-33830](https://jira.mariadb.org/browse/MDEV-33830))
* New authentication plugin [caching\_sha2\_password](/docs/server/reference/clientserver-protocol/1-connecting/caching_sha2_password-authentication-plugin.md) for MySQL compatibility ([MDEV-9804](https://jira.mariadb.org/browse/MDEV-9804))
* [( + ) for outer join syntax in Oracle mode](/docs/server/reference/sql-statements/data-manipulation/selecting-data/joins/join-syntax.md#oracle-mode) ([MDEV-13817](https://jira.mariadb.org/browse/MDEV-13817))
* Associative arrays: DECLARE TYPE .. TABLE OF .. INDEX BY ([MDEV-34319](https://jira.mariadb.org/browse/MDEV-34319)) ([blog post](https://mariadb.org/bringing-oracles-associative-arrays-to-mariadb/))
* [DROP USER](/docs/server/reference/sql-statements/account-management-sql-statements/drop-user.md) will now by default issue a warning if the user has active sessions, or fail in [Oracle mode](https://github.com/mariadb-corporation/mariadb-docs/blob/main/release-notes/about/compatibility-and-differences/sql_modeoracle.md) ([MDEV-35617](https://jira.mariadb.org/browse/MDEV-35617))
* Implement Oracle [TO\_NUMBER](/docs/server/reference/sql-functions/numeric-functions/to_number.md) function ([MDEV-20022](https://jira.mariadb.org/browse/MDEV-20022))
* Implement Oracle [TRUNC](/docs/server/reference/sql-functions/date-time-functions/trunc.md) function ([MDEV-20023](https://jira.mariadb.org/browse/MDEV-20023))

### Performance improvements <a href="#performance-improvements" id="performance-improvements"></a>

* Segmented key cache for [Aria storage engine](/docs/server/server-usage/storage-engines/aria.md) ([MDEV-24](https://jira.mariadb.org/browse/MDEV-24))
  * The new [aria\_pagecache\_segments](/docs/server/server-usage/storage-engines/aria/aria-system-variables.md#aria_pagecache_segments) system variable defines how many segments are used, default is `1`, maximum `128`
* MDL scalability improvements ([MDEV-19749](https://jira.mariadb.org/browse/MDEV-19749))
* Asynchronous replication between two [Galera Clusters](https://mariadb.com/docs/galera-cluster/) can now use parallel replication
  * This is managed by the [slave\_parallel\_threads](/docs/galera-cluster/high-availability/using-mariadb-replication-with-mariadb-galera-cluster/using-mariadb-replication-with-mariadb-galera-cluster-using-mariadb-replica.md#parallel-replication-support) system variable ([MDEV-20065](https://jira.mariadb.org/browse/MDEV-20065))
* The [audit plugin](/docs/server/reference/plugins/mariadb-audit-plugin.md) now supports buffered logging
  * The size of the buffer is defined using the new system variable [server\_audit\_file\_buffer\_size](/docs/server/reference/plugins/mariadb-audit-plugin/mariadb-audit-plugin-options-and-system-variables.md#server_audit_file_buffer_size) ([MDEV-34680](https://jira.mariadb.org/browse/MDEV-34680))
* Faster [vector](/docs/server/reference/sql-structure/vectors.md) distance calculations via extrapolation ([MDEV-36205](https://jira.mariadb.org/browse/MDEV-36205))

### Audit Plugin <a href="#audit-plugin" id="audit-plugin"></a>

* The [Audit Plugin](/docs/server/reference/plugins/mariadb-audit-plugin/mariadb-audit-plugin-overview.md) now logs HOST:PORT of incoming connections instead of just the host ([MDEV-1282](https://jira.mariadb.org/browse/MDEV-1282))
* Added tls\_version field for connection audit plugins ([MDEV-33834](https://jira.mariadb.org/browse/MDEV-33834))

### Configuration <a href="#configuration" id="configuration"></a>

* Get option group suffix from `$MARIADB_GROUP_SUFFIX` in addition to `$MYSQL_GROUP_SUFFIX` ([MDEV-21375](https://jira.mariadb.org/browse/MDEV-21375))

### Data types <a href="#data-types" id="data-types"></a>

* Comparison [ROW](/docs/server/reference/data-types/string-data-types/row.md)(stored\_func(),1)=ROW(1,1) erroneously called stored\_func() twice per row. It led to a performance degradation, as well as to a double execution of the possible stored function side effects. ([MDEV-36322](https://jira.mariadb.org/browse/MDEV-36322))

### Galera <a href="#galera" id="galera"></a>

* In [Galera](https://mariadb.com/docs/galera-cluster/), needless foreign key checks during Incremental State Transfers are now avoided ([MDEV-34822](https://jira.mariadb.org/browse/MDEV-34822))

### GIS <a href="#gis" id="gis"></a>

New [GIS](/docs/server/reference/sql-structure/geometry/gis-features-in-533.md) functions. These functions improve compatibility with MySQL 8.

* [ST\_Validate](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_validate.md) ([MDEV-34137](https://jira.mariadb.org/browse/MDEV-34137))
* [MBRCoveredBy](/docs/server/reference/sql-statements/geometry-constructors/mbr-minimum-bounding-rectangle/mbrcoveredby.md) ([MDEV-34138](https://jira.mariadb.org/browse/MDEV-34138))
* [ST\_Simplify](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_simplify.md) ([MDEV-34141](https://jira.mariadb.org/browse/MDEV-34141))
* [ST\_GeoHash](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_geohash.md) ([MDEV-34158](https://jira.mariadb.org/browse/MDEV-34158))
* [ST\_LatFromGeoHash](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_latfromgeohash.md) ([MDEV-34159](https://jira.mariadb.org/browse/MDEV-34159))
* [ST\_LongFromGeoHash](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_longfromgeohash.md) ([MDEV-34160](https://jira.mariadb.org/browse/MDEV-34160))
* [ST\_PointFromGeoHash](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_pointfromgeohash.md) ([MDEV-34277](https://jira.mariadb.org/browse/MDEV-34277))
* [ST\_IsValid](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_isvalid.md) ([MDEV-34276](https://jira.mariadb.org/browse/MDEV-34276))
* [ST\_Collect](/docs/server/reference/sql-statements/geometry-constructors/miscellaneous-gis-functions/st_collect.md) ([MDEV-34278](https://jira.mariadb.org/browse/MDEV-34278))

### mariadb Client

* Can set an alternative directory path for searching scripts invoked via the source command, with the [--script-dir](/docs/server/clients-and-utilities/mariadb-client/mariadb-command-line-client.md#script-dir) mariadb client option ([MDEV-23818](https://jira.mariadb.org/browse/MDEV-23818))

### Optimizer <a href="#optimizer" id="optimizer"></a>

* [Rowid Filtering](/docs/server/ha-and-performance/optimization-and-tuning/query-optimizations/rowid-filtering-optimization.md) optimization can now be applied for reverse-ordered scans ([MDEV-36094](https://jira.mariadb.org/browse/MDEV-36094))
* [Index Condition Pushdown](/docs/server/ha-and-performance/optimization-and-tuning/query-optimizations/index-condition-pushdown.md) optimization can now applied for reverse-ordered scans ([MDEV-34413](https://jira.mariadb.org/browse/MDEV-34413))
* Loose Index Scan ("Use index for group-by") optimization can now use indexes with DESC key parts ([MDEV-32732](https://jira.mariadb.org/browse/MDEV-32732))
* find\_order\_in\_list mismatch when order item needs fixing() ([MDEV-36607](https://jira.mariadb.org/browse/MDEV-36607))
* If the join\_condition is specified via USING (column\_list), the query plan depends on the sequence of tables in the query ([MDEV-36592](https://jira.mariadb.org/browse/MDEV-36592))
* Optimizations for GROUP/ORDER BY can make use of indexes on virtual columns ([MDEV-36132](https://jira.mariadb.org/browse/MDEV-36132))
* Include definitions of tables and views in the [optimizer trace](/docs/server/ha-and-performance/optimization-and-tuning/query-optimizer/optimizer-trace.md) ([MDEV-36483](https://jira.mariadb.org/browse/MDEV-36483))
  * [optimizer\_record\_context](/docs/server/server-management/variables-and-modes/server-system-variables.md#optimizer_record_context) system variable.
* Join optimizer is now able to infer that derived table with GROUP BY clause has distinct GROUP BY columns ([MDEV-36321](https://jira.mariadb.org/browse/MDEV-36321))

### Optimizer hints <a href="#optimizer-hints" id="optimizer-hints"></a>

* Add support for [optimizer hints](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md) ([MDEV-35504](https://jira.mariadb.org/browse/MDEV-35504))
  * [QB\_NAME](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#query-block-naming)
  * [NO\_RANGE\_OPTIMIZATION](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#no_range_optimization)
  * [NO\_ICP](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#no_icp)
  * [MRR, NO\_MRR](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#mrr-and-no_mrr)
  * [BKA, NO\_BKA](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#bka-and-no_bka)
  * [BNL, NO\_BNL](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#bnl-and-no_bnl)
* Add support for subquery optimizer hints ([MDEV-34888](https://jira.mariadb.org/browse/MDEV-34888))
  * [SEMIJOIN](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#semijoin-and-no_semijoin)
  * [SUBQUERY](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#subquery-hint)
* Add support for join order hints ([MDEV-34870](https://jira.mariadb.org/browse/MDEV-34870))
  * [JOIN\_FIXED\_ORDER](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints/expanded-optimizer-hints.md#join_fixed_order) similar to existing STRAIGHT\_JOIN hint
  * [JOIN\_ORDER](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints/expanded-optimizer-hints.md#join_order) to apply the specified table order
  * [JOIN\_PREFIX](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints/expanded-optimizer-hints.md#join_prefix) to hint what tables should be first in the join
  * [JOIN\_SUFFIX](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints/expanded-optimizer-hints.md#join_suffix) to hint what tables should be last in the join
* Add support for the [MAX\_EXECUTION\_TIME](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#max_execution_time) hint ([MDEV-34860](https://jira.mariadb.org/browse/MDEV-34860))
* [Optimizer hints](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md): [\[NO\_\]JOIN\_INDEX](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#join_index-and-no_join_index), [\[NO\_\]GROUP\_INDEX](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#group_index-and-no_group_index), [\[NO\_\]ORDER\_INDEX](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#order_index-and-no_order_index), [\[NO\_\]INDEX](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#index-and-no_index) ([MDEV-35856](https://jira.mariadb.org/browse/MDEV-35856))
* [Optimizer hints](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md): [\[NO\_\]SPLIT\_MATERIALIZED](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#split_materialized-x-and-no_split_materialized-x) ([MDEV-36092](https://jira.mariadb.org/browse/MDEV-36092))
* [Optimizer hints](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md): [\[NO\_\]DERIVED\_CONDITION\_PUSHDOWN](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#derived_condition_pushdown-and-no_derived_condition_pushdown), [\[NO\_\]MERGE ](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md#merge-and-no_merge)([MDEV-36106](https://jira.mariadb.org/browse/MDEV-36106))
* [Optimizer hint](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md): [\[NO\_\]ROWID\_FILTER](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints/index-level-hints.md#rowid_filter-no_rowid_filter) ([MDEV-36089](https://jira.mariadb.org/browse/MDEV-36089)),
* [Optimizer hint](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md): [\[NO\_\]INDEX\_MERGE](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints/index-level-hints.md#index_merge-no_index_merge) ([MDEV-36125](https://jira.mariadb.org/browse/MDEV-36125))
* [Optimizer hints](/docs/server/ha-and-performance/optimization-and-tuning/optimizer-hints.md): Implicit query block names ([MDEV-37511](https://jira.mariadb.org/browse/MDEV-37511))

### Replication

* Server displays if it was started with the [skip-slave-start](/docs/server/server-management/starting-and-stopping-mariadb/mariadbd-options.md#skip-slave-start) option ([MDEV-27669](https://jira.mariadb.org/browse/MDEV-27669))
* [show\_slave\_auth\_info](/docs/server/ha-and-performance/standard-replication/replication-and-binary-log-system-variables.md#show_slave_auth_info) has been added as a system variable (previously it was just an option). It determines whether to show the user and password in [SHOW REPLICA HOSTS](/docs/server/reference/sql-statements/administrative-sql-statements/show/show-replica-hosts.md) (SHOW SLAVE HOSTS) on the primary.
* [replicate\_same\_server\_id](/docs/server/ha-and-performance/standard-replication/replication-and-binary-log-system-variables.md#replicate_same_server_id) system variable added (previously it was just an option), which permits not skipping events having our server id.
* Ensure that creation and usage of temporary tables in replication is predictable ([MDEV-36099](https://jira.mariadb.org/browse/MDEV-36099))
  * [create\_tmp\_table\_binlog\_formats](/docs/server/ha-and-performance/standard-replication/replication-and-binary-log-system-variables.md#create_tmp_table_binlog_formats) system variable.
* Configurable defaults for `MASTER_SSL_*` settings for `CHANGE MASTER` ([MDEV-28302](https://jira.mariadb.com/browse/MDEV-28302))
* Fragment ROW replication events larger than `max_packet_size` ([MDEV-32570](https://jira.mariadb.com/browse/MDEV-32570))
* Improving performance of binary logging by removing the need of syncing it ([MDEV-34705](https://jira.mariadb.com/browse/MDEV-34705))

### Stored Routines <a href="#stored-routines" id="stored-routines"></a>

* Add support for the pre-defined weak SYS\_REFCURSOR ([MDEV-20034](https://jira.mariadb.org/browse/MDEV-20034))
  * [max\_open\_cursors](/docs/server/server-management/variables-and-modes/server-system-variables.md#max_open_cursors) system variable limits the number of [cursors](/docs/server/reference/sql-statements/programmatic-compound-statements/programmatic-compound-statements-cursors.md) opened at the same time

### Server <a href="#server" id="server"></a>

* Add the FM format to [TO\_CHAR](/docs/server/reference/sql-functions/string-functions/to_char.md), which suppresses following padding ([MDEV-36216](https://jira.mariadb.org/browse/MDEV-36216))
* [mariadb-check](/docs/server/clients-and-utilities/table-tools/mariadb-check.md) and [CHECK TABLE](/docs/server/reference/sql-statements/table-statements/check-table.md) now support [SEQUENCE tables](/docs/server/server-usage/storage-engines/sequence-storage-engine.md) ([MDEV-22491](https://jira.mariadb.org/browse/MDEV-22491))

### Trigger <a href="#trigger" id="trigger"></a>

* Add support for TRIGGERS that fire on multiple events ([MDEV-10164](https://jira.mariadb.org/browse/MDEV-10164))

### Miscellaneous

* Hashicorp Plugin: Implement cache flush for forced key rotation ([MDEV-30847](https://jira.mariadb.com/browse/MDEV-30847))
* New hash algorithms for `PARTITION BY KEY` ([MDEV-9826](https://jira.mariadb.com/browse/MDEV-9826))
* Optimise reorderable LEFT JOINs ([MDEV-36055](https://jira.mariadb.com/browse/MDEV-36055))
* Retry applying of write sets on [Galera](https://mariadb.com/docs/galera-cluster/) nodes ([MDEV-36077](https://jira.mariadb.org/browse/MDEV-36077))
  * Controlled through the [wsrep\_applier\_retry\_count](/docs/galera-cluster/reference/galera-cluster-system-variables.md#wsrep_applier_retry_count) system variable
* [mariadb-dump](/docs/server/clients-and-utilities/backup-restore-and-import-clients/mariadb-dump.md) now supports [wildcards](/docs/server/clients-and-utilities/backup-restore-and-import-clients/mariadb-dump.md#l-wildcards) with the `-L` or `--wildcards` option ([MDEV-21376](https://jira.mariadb.org/browse/MDEV-21376))
* [Foreign key](/docs/server/ha-and-performance/optimization-and-tuning/optimization-and-indexes/foreign-keys.md) constraint names no longer need to be unique per database, only per table ([MDEV-28933](https://jira.mariadb.org/browse/MDEV-28933)) ([blog post](https://mariadb.org/per-table-unique-foreign-key-constraint-names-new-feature-in-mariadb-12-1/))
* Remove depth limit of 32 from JSON functions ([MDEV-32854](https://jira.mariadb.org/browse/MDEV-32854))
* Add [INFORMATION\_SCHEMA.TRIGGERED\_UPDATE\_COLUMNS](/docs/server/reference/system-tables/information-schema/information-schema-tables/information-schema-triggered_update_columns.md) ([MDEV-36996](https://jira.mariadb.org/browse/MDEV-36996))
* Implement [INFORMATION\_SCHEMA.PARAMETERS](/docs/server/reference/system-tables/information-schema/information-schema-tables/information-schema-parameters-table.md).PARAMETER\_DEFAULT column ([MDEV-37054](https://jira.mariadb.org/browse/MDEV-37054))

## Notable Items

### Galera

* The Galera package dependency has been removed from server packages ([MDEV-38744](https://jira.mariadb.org/browse/MDEV-38744))

### InnoDB

**Behavioral change:** [innodb\_snapshot\_isolation](https://mariadb.com/docs/server/server-usage/storage-engines/innodb/innodb-system-variables#innodb_snapshot_isolation) system variable now defaults to `ON`, previously was `OFF` ([MDEV-35124](https://jira.mariadb.org/browse/MDEV-35124)). This changes the behavior of [repeatable reads](/docs/server/reference/sql-statements/administrative-sql-statements/set-commands/set-transaction.md#repeatable-read).

### Variables

For a list of all new variables added since MariaDB 11.8, see:

* [System Variables Added in MariaDB 12.0](/docs/server/ha-and-performance/optimization-and-tuning/system-variables/system-and-status-variables-added-by-major-release/system-variables-added-in-mariadb-12.0.md)
* [System Variables Added in MariaDB 12.1](/docs/server/ha-and-performance/optimization-and-tuning/system-variables/system-and-status-variables-added-by-major-release/system-variables-added-in-mariadb-12.1.md)

#### Removed Variables

* [big\_tables](/docs/server/server-management/variables-and-modes/server-system-variables.md#big_tables), deprecated in [MariaDB 10.5.0](/docs/release-notes/community-server/old-releases/10.5/10.5.0.md)
* [large\_page\_size](/docs/server/server-management/variables-and-modes/server-system-variables.md#large_page_size), deprecated in [MariaDB 10.5.3](/docs/release-notes/community-server/old-releases/10.5/10.5.3.md)
* [storage\_engine](/docs/server/server-management/variables-and-modes/server-system-variables.md#storage_engine), deprecated in [MariaDB 5.5](/docs/release-notes/community-server/old-releases/5.5/changes-improvements-in-mariadb-5-5.md).

## List of All MariaDB 12.3 Releases

| Date        | Release              | Status  | Release Notes                                                        | Changelog                                                                   |
| ----------- | -------------------- | ------- | -------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| 12 Feb 2026 | 12.3.1               | RC      | [Release Notes](/docs/release-notes/community-server/12.3/12.3.1.md) | [Changelog](/docs/release-notes/community-server/changelogs/12.3/12.3.1.md) |
| 22 Dec 2025 | MariaDB 12.3 Preview | Preview |                                                                      |                                                                             |

<sub>*This page is licensed: CC BY-SA / Gnu FDL*</sub>

{% @marketo/form formid="4316" formId="4316" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://mariadb.com/docs/release-notes/community-server/12.3/mariadb-12.3-changes-and-improvements.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
