Mysql 9.0 Relnotes en
Mysql 9.0 Relnotes en
0 Release Notes
Abstract
This document contains release notes for the changes in MySQL 9.0. For information about changes in a different
version of MySQL, see the release notes for that version.
For additional MySQL 9.0 documentation, see the MySQL 9.0 Reference Manual, which includes an overview of
features added in MySQL 9.0 (What Is New in MySQL 9.0), and discussion of upgrade issues that you may encounter
while upgrading.
Updates to these notes occur as new product features are added, so that everybody can follow the development
process. If a recent version is listed here that you cannot find on the download page (https://dev.mysql.com/
downloads/), the version has not yet been released.
The documentation included in source and binary distributions may not be fully up to date with respect to release note
entries because integration of the documentation occurs at release build time. For the most up-to-date release notes,
please refer to the online documentation instead.
For help with using MySQL, please visit the MySQL Forums, where you can discuss your issues with other MySQL
users.
Table of Contents
Preface and Legal Notices ................................................................................................................. 1
Changes in MySQL 9.0.0 (2024-07-01, Innovation Release) ................................................................. 3
Legal Notices
Copyright © 1997, 2024, Oracle and/or its affiliates.
License Restrictions
This software and related documentation are provided under a license agreement containing restrictions
on use and disclosure and are protected by intellectual property laws. Except as expressly permitted
in your license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast,
modify, license, transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any
means. Reverse engineering, disassembly, or decompilation of this software, unless required by law for
interoperability, is prohibited.
1
MySQL 9.0 Release Notes
Warranty Disclaimer
The information contained herein is subject to change without notice and is not warranted to be error-free.
If you find any errors, please report them to us in writing.
If this is software, software documentation, data (as defined in the Federal Acquisition Regulation), or
related documentation that is delivered to the U.S. Government or anyone licensing it on behalf of the U.S.
Government, then the following notice is applicable:
U.S. GOVERNMENT END USERS: Oracle programs (including any operating system, integrated
software, any programs embedded, installed, or activated on delivered hardware, and modifications
of such programs) and Oracle computer documentation or other Oracle data delivered to or accessed
by U.S. Government end users are "commercial computer software," "commercial computer software
documentation," or "limited rights data" pursuant to the applicable Federal Acquisition Regulation and
agency-specific supplemental regulations. As such, the use, reproduction, duplication, release, display,
disclosure, modification, preparation of derivative works, and/or adaptation of i) Oracle programs (including
any operating system, integrated software, any programs embedded, installed, or activated on delivered
hardware, and modifications of such programs), ii) Oracle computer documentation and/or iii) other Oracle
data, is subject to the rights and limitations specified in the license contained in the applicable contract.
The terms governing the U.S. Government's use of Oracle cloud services are defined by the applicable
contract for such services. No other rights are granted to the U.S. Government.
This software or hardware is developed for general use in a variety of information management
applications. It is not developed or intended for use in any inherently dangerous applications, including
applications that may create a risk of personal injury. If you use this software or hardware in dangerous
applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other
measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages
caused by use of this software or hardware in dangerous applications.
Trademark Notice
Oracle, Java, MySQL, and NetSuite are registered trademarks of Oracle and/or its affiliates. Other names
may be trademarks of their respective owners.
Intel and Intel Inside are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks
are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD,
Epyc, and the AMD logo are trademarks or registered trademarks of Advanced Micro Devices. UNIX is a
registered trademark of The Open Group.
This software or hardware and documentation may provide access to or information about content,
products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and
expressly disclaim all warranties of any kind with respect to third-party content, products, and services
unless otherwise set forth in an applicable agreement between you and Oracle. Oracle Corporation and its
affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of
third-party content, products, or services, except as set forth in an applicable agreement between you and
Oracle.
2
MySQL 9.0 Release Notes
This documentation is NOT distributed under a GPL license. Use of this documentation is subject to the
following terms:
You may create a printed copy of this documentation solely for your own personal use. Conversion to other
formats is allowed as long as the actual content is not altered or edited in any way. You shall not publish
or distribute this documentation in any form or on any media, except if you distribute the documentation in
a manner similar to how Oracle disseminates it (that is, electronically for download on a Web site with the
software) or on a CD-ROM or similar medium, provided however that the documentation is disseminated
together with the software on the same medium. Any other use, such as any dissemination of printed
copies or use of this documentation, in whole or in part, in another publication, requires the prior written
consent from an authorized representative of Oracle. Oracle and/or its affiliates reserve any and all rights
to this documentation not expressly granted above.
Documentation Accessibility
For information about Oracle's commitment to accessibility, visit the Oracle Accessibility Program website
at
http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
• C API Notes
• Compilation Notes
• Component Notes
• Configuration Notes
• JavaScript Programs
• Optimizer Notes
3
MySQL 9.0 Release Notes
• X Plugin Notes
• Bugs Fixed
C API Notes
• C API applications stalled while receiving results for server side prepared statements.
This fix ensures that the third argument is also converted to the first argument's character set and
collation. (Bug #114769, Bug #36562972)
• The internal function my_instr_mb() assumed incorrectly assumption in several places that byte
lengths for input strings could be used to short-cut certain decisions. In the case of multibyte character
sets and collations, this cannot be done since, under some collation rules, characters with differing byte
lengths can be considered equal. In addition, Item_func_locate() used an incorrect byte length.
Our thanks to Dirkjan Bussink for the contribution. (Bug #113933, Bug #36277823)
• The internal function Item_func::eq() erroneously treated the two expressions CONVERT(a USING
latin1) and CONVERT(a USING utf8mb4) as being equal.
Compilation Notes
• macOS: CMake no longer tries to use the native ctags on MacOS, and now requires the Homebrew
version of it to be installed on the system when building MySQL. (Bug #36590594)
• macOS: Enabled use of gRPC when building MySQL on MacOS. (Bug #36537726)
• Upgraded the bundled googletest and googlemock sources to version 1.14.0. (Bug #36562482)
• The version of Boost used for compiling MySQL was upgraded from 1.84.0 to 1.85.0. For more
information see the Boost 1.85.0 Release Notes. (Bug #36495694)
• Binaries for Enterprise Linux 8 and 9 are now built using GCC 13. (Bug #36331855)
• Removed linker warnings raised when compiling code that used RapidJSON. (Bug #36322583)
• It is now possible on Linux systems to build MySQL using a bundled tcmalloc library that is provided
with the source by specifying -DWITH_TCMALLOC=BUNDLED. This is supported on Linux only. (Bug
#36313839)
4
MySQL 9.0 Release Notes
• Linux aarch64 platform binaries are now built using patchelf --page-size=65536 for compatibility
with systems using either 4k or 64k for the page size. (Bug #114233, Bug #36393794)
Component Notes
• The values for component options set using the --loose prefix were not read when the component was
installed. (Bug #28341329)
Configuration Notes
• Microsoft Windows: On Windows, MySQL Configurator was updated to support in-place upgrades as
per Upgrade Paths. (Bug #36685422)
• Microsoft Windows: On Windows, clicking the [X] close button on a MySQL Configurator wizard's page
now yields a confirmation popup if the wizard is busy executing an operation. (Bug #36671317)
• Microsoft Windows: On Windows, the Removing Windows Firewall step in MySQL Configurator
would fail if the my.ini file was missing a mysqlx_port definition. (Bug #36666260)
• Microsoft Windows: On Windows, if MySQL Configurator failed to find a valid my.ini or my.cnf file
from the MySQL Server Installations page, then clicking the Browse button disabled the Next button
even when the selected file was valid. (Bug #36395569)
• Microsoft Windows: On Windows, MySQL Configurator now only shows the removal steps if the
associated MySQL Server was previously configured. (Bug #36395417)
• Microsoft Windows: On Windows, MySQL Configurator now detects if the existing root user is using
the mysql_native_password authentication plugin (the plugin was removed in MySQL 9.0.0) and
prompts to convert root to use the caching_sha2_password authentication plugin before performing a
MySQL Server upgrade. (WL #16139)
• Microsoft Windows: For MSI installations on Windows, MySQL Configurator now automatically
upgrades MySQL 8.4 LTS installations without user intervention. (WL #16274)
• In some cases, casting a double to an integer value used rounding, and in others, with truncation, which
led to inconsistent results. Now rounding up is used in all such cases. (Bug #114549, Bug #36481397)
5
MySQL 9.0 Release Notes
• In some cases, DECIMAL 0 was treated as less than a FLOAT value between 0 and -1. (Bug #114196,
Bug #36361165)
Note
These changes also entail the removal of the following server options and variables:
• The MIN_VALUE and MAX_VALUE columns of the Performance Schema variables_info table are
now deprecated, and subject to removal in a future version of MySQL. Instead, you should use the
MIN_VALUE and MAX_VALUE columns of the variables_metadata table, which provide the same
information. (WL #15585)
• CREATE EVENT
• ALTER EVENT
• DROP EVENT
Positional parameters (? placeholders) are not supported for these statements; you must assemble the
text of the statement to be prepared from some combination of string literals, system variables, and user
variables. See PREPARE, EXECUTE, and DEALLOCATE PREPARE Statements, and SQL Syntax
Permitted in Prepared Statements, for more information. CREATE EVENT Statement, provides a basic
example. (Bug #109309, Bug #34875573, WL #16298)
JavaScript Programs
• MySQL 9.0 Enterprise Edition now includes support for stored programs written in JavaScript, such as
this simple example created using the CREATE FUNCTION statement and JavaScript code shown here:
CREATE FUNCTION gcd(a INT, b INT)
RETURNS INT
NO SQL
LANGUAGE JAVASCRIPT AS
$mle$
6
MySQL 9.0 Release Notes
let x = Math.abs(a)
let y = Math.abs(b)
while(y) {
var t = y
y = x % y
x = t
}
return x
$mle$
;
JavaScript Stored Program Creation and Management, describes creation and execution of JavaScript
stored programs.
JavaScript language support includes both stored procedures and stored functions, and is provided
by the Multilingual Engine Component (MLE). For more information about determining whether your
distribution includes this component, and enabling it, see Multilingual Engine Component (MLE).
JavaScript language support in MySQL conforms to the ECMAScript 2023 Specification, and uses
strict mode by default. Strict mode cannot be disabled. This implementation includes all of the standard
ECMAScript library objects such as Object, Function, Math, Date, and String. console.log()
and console.error() are also supported.
Most MySQL data types are supported for JavaScript stored program input and output arguments, as
well as for return data types. Strings must use the utf8mb4 character set. MySQL BLOB and TEXT
types are supported, as are many MySQL temporal types. JSON is also supported. The VECTOR type
is not supported by the MLE component or by JavaScript stored programs. For more information,
see JavaScript Stored Program Data Types and Argument Handling, and JavaScript Stored Program
Limitations and Restrictions.
Stored programs written in JavaScript support an SQL and result set API provided by the MLE
component. See JavaScript SQL API, and Using the JavaScript SQL API, for more information.
The MLE component provides a number of session information and management functions including
mle_session_state() and mle_session_reset(). You can also view a number of MLE status
variables in the output of a statement similar to SHOW STATUS LIKE 'mle%'. See also JavaScript
Stored Programs—Obtaining Session Information.
For general information about JavaScript stored programs, see JavaScript Stored Programs. (WL
#15605, WL #16129, WL #16172, WL #16226, WL #16272, WL #16276)
Optimizer Notes
• Important Change: ER_SUBQUERY_NO_1_ROW has been removed from the list of errors which are
ignored by statements which include the IGNORE keyword. This has been done for the following reasons:
• Ignoring such errors sometimes led to insertion of NULL into non-nullable columns (for untransformed
subqueries), or of no row at all (subqueries using subquery_to_derived).
• When subqueries were transformed to join with derived tables, the behavior differed from that of
untransformed queries.
Following an upgrade to this release, this change can make an UPDATE, DELETE, or INSERT statement
which includes the IGNORE keyword raise errors if it contains a SELECT statement with a scalar
subquery that produces more than one row.
For more information, see The Effect of IGNORE on Statement Execution. (Bug #110961, Bug
#35373406)
7
MySQL 9.0 Release Notes
• The variables_metadata table provides general information about system variables. This
information includes the name, scope, type, range (where applicable), and description of each system
variable recognized by the MySQL server.
The MIN_VALUE and MAX_VALUE columns of this table are intended to replace the deprecated
MIN_VALUE and MAX_VALUE columns of the variables_info table.
For more information, see Performance Schema System Variable Tables. (WL #15855)
The variable can be used subsequently as a JSON argument to any of MySQL's JSON functions (see
JSON Functions). The INTO clause is supported only with FORMAT=JSON, which must be included
explicitly. This form of EXPLAIN ANALYZE also supports an optional FOR SCHEMA or FOR DATABASE
clause preceding the SELECT statement being analyzed. Statements other than SELECT are not
supported.
Note
For more information and examples, see Obtaining Execution Plan Information. (WL #16216)
You can create InnoDB tables with VECTOR columns using CREATE TABLE as shown here:
Vector columns in this release are subject to restrictions, some of which are listed here:
8
MySQL 9.0 Release Notes
• A VECTOR column cannot be used as any type of key. This includes primary keys, foreign keys, unique
keys, and partitioning keys.
• Some types of MySQL functions and operators do not accept vectors as arguments. These include but
are not limited to numeric functions and operators, temporal functions, full-text search functions, XML
functions, bit functions, and JSON functions.
Some (but not all) string and encryption functions support VECTOR values. For more complete
information, see VECTOR Supported and Unsupported Functions.
• A VECTOR cannot be compared with any other type, and can be compared with another VECTOR only
for equality.
Use the VECTOR_DIM() function (also added in MySQL 9.0) to obtain the length of a vector. Functions
to convert between representations are available. STRING_TO_VECTOR() (alias: TO_VECTOR())
takes a list-formatted representation of a vector and returns the binary string representation;
VECTOR_TO_STRING() (alias: FROM_VECTOR()) performs the inverse, as shown here:
For more information and examples, see The VECTOR Type, and Vector Functions. (WL #16081)
X Plugin Notes
• The system variable caching_sha2_password_digest_rounds could not be set to a non-default
value using X Protocol. (Bug #36402455)
• An outdated link to the MySQL documentation in the mysql_function_names unit test source file has
been updated.
Our thanks to Minha Jeong for the contribution. (Bug #113500, Bug #36137217)
Bugs Fixed
• InnoDB: MySQL unexpectedly halted on an UPDATE after an ALTER TABLE operation. (Bug
#36571091)
• InnoDB: Improved the InnoDB recovery logic to reduce pauses between recovery actions. (Bug
#36332645)
9
MySQL 9.0 Release Notes
• InnoDB: File system operations performed by InnoDB now consistently fsync the parent directory
when performing directory altering tasks. (Bug #36174938)
• InnoDB: In debug builds, setting the innodb_interpreter_output debug variable would cause the
server to unexpectedly halt. This is now a read-only variable. (Bug #36041032)
• InnoDB: Removed functionality specific to the Fusion IO atomic write feature, a product that was last
available in 2014. (Bug #35072139)
• InnoDB: An InnoDB assertion error referencing an invalid column index was triggered when the column
index was valid. (Bug #34800754)
• InnoDB: With an empty XA transaction, shutting the server down after an XA START would cause the
server to halt unexpectedly. (Bug #32416819)
• InnoDB: Shutting down the replication applier or binlog applier while processing an empty XA
transaction caused the system to unexpectedly halt. (Bug #32416819)
Our thanks to Huaxiong Song for the contribution. (Bug #115041, Bug #36626203)
Our thanks to Zongzhi Chen for the contribution. (Bug #114660, Bug #36528707)
Our thanks to Alex Xing for the contribution. (Bug #113640, Bug #36185805)
• InnoDB: The result from a spatial index containing a column with a spatial reference identifier (SRID)
attribute was empty. In addition, using FORCE INDEX to force a covering index scan on a spatial index
led to an assertion. (Bug #112676, Bug #114200, Bug #35894664, Bug #36361834)
• InnoDB: SELECT ... GROUP BY queries were at least twice as slow with the TempTable engine than
the Memory engine. (Bug #107700, Bug #34338001)
• Replication: If a source contained a stored, generated column populated by a JSON function and
binlog_row_image was set to MINIMAL, any subsequent update or deletion on the underlying column
failed with the following error:
Invalid JSON text in argument 1 to function json_extract: 'The document is empty.'
The replica attempted to re-evaluate the generated column and failed with that error because the
underlying column was unavailable. As of this release, stored, generated columns are not re-evaluated
when the underlying columns are unavailable. (Bug #36515172)
10
MySQL 9.0 Release Notes
• Group Replication: Under certain circumstances, after successfully setting a new primary,
group_replication_set_as_primary() waited indefinitely for the operation to complete.
As of this release, a periodic check is performed to ensure the function does not wait unnecessarily.
(Bug #36348650)
• Group Replication: The following tables did not contain data on replication channels which did not have
a configured hostname, such as Group Replication recovery channels:
• REPLICATION_CONNECTION_STATUS
• REPLICATION_CONNECTION_CONFIGURATION
• REPLICATION_APPLIER_CONFIGURATION
• REPLICATION_APPLIER_STATUS
• REPLICATION_APPLIER_STATUS_BY_COORDINATOR
• REPLICATION_APPLIER_STATUS_BY_WORKER
As of this release, these tables contain data for partially configured Group Replication channels. (Bug
#36018242)
• JSON: Added missing checks for error handling to NULLIF(), COALESCE(), and the shift (>>) operator.
(Bug #113668, Bug #35513196, Bug #36198403)
• MySQL NDB ClusterJ: Running the ClusterJ test suite resulted in an error message saying a number
of threads did not exist. That was due to some wrong handling of threads and connections, which was
corrected by this patch. (Bug #36086735)
• Added a missing error check needed when evaluating the <=> operator. (Bug #36570474)
• Added a missing error check needed for evaluating CASE operators. (Bug #36570439)
• Averages of certain numbers were not always computed correctly. (Bug #36563773)
• mb_wc.h
• ctype-uca.cc
11
MySQL 9.0 Release Notes
• ctype-ucs2.cc
• ctype-utf8.cc
• dtoa.cc
• strxmov.cc
• strxnmov.cc
(Bug #36506181)
• In certain unusual cases, the UpdateXML() function did not process all of its arguments correctly. (Bug
#36479091)
• With subquery_to_derived=ON, an outer reference was not replaced in some cases following
transformation to a derived table. (Bug #36475633)
• A missing check for errors relating to TIME values sometimes led to an assert in sql/item.cc. (Bug
#36421511)
• Explaining a query which used FORCE INDEX on a spatial index containing a column with SRID
attributes led to an unplanned exit. (Bug #36418426)
• Events created within stored programs were not always handled correctly. (Bug #36402968, Bug
#35395333)
• The InnoDB OpenTelemetry metrics (mysql.inno) were not automatically updated. (Bug #36399090)
• An item that was not yet fixed when searching for an item placed in the GROUP BY list led to an assert
in include/sql_string.h.
• The TIME_FORMAT() function did not handle NULL arguments correctly in all cases.
• Updated BuildRequire rules to align with versions now required for CMake and Bison. (Bug
#36343254)
• An IN predicate containing EXCEPT ALL set operations yielded the wrong result. (Bug #36332697)
• When incrementing the reference count for an expression, underlying expressions within this expression
are not looked at. While removing an expression, after decrementing the reference count, even
the underlying expressions were examined, which led to unintentional deletion of the underlying
12
MySQL 9.0 Release Notes
• Under certain conditions, EXPLAIN FORMAT=JSON FOR CONNECTION sometimes led to an unplanned
exit. (Bug #36189820)
• Under certain conditions, a race condition could result in the amount of RAM used by TABLE_HANDLES
increasing to a maximum of 9GB. (Bug #36170903)
• Some CREATE USER statements were not handled correctly. (Bug #36022885)
• For a SELECT with ORDER BY and LIMIT, the optimizer first chose a full table scan with a very
expensive cost, then performed another check and used the perform_order_index type of path, but
this was not reflected by the cost in the optimizer plan. (Bug #35930969)
• Executing mysqldump on a replica would insert the FLUSH TABLES operation, an operation that writes
to the binary log. Now FLUSH LOCAL TABLES is inserted instead to prevent GTID related issues during
replication due to these binary log changes.
• All internal ACL bitmask variables are now explicitly 32 bits (uint32_t). (Bug #35507223)
• In some cases, a SELECT constant from an empty table with ORDER BY COUNT(*), when used in a
view, did not return any rows. (Bug #115035, Bug #36625752)
• In some circumstances, such when DDL operations were performed on a very large number of tables,
the error log was flooded with warnings from background histogram updates; the offending warning was
concerning a failure to acquire metadata locks on a table.
To remedy this problem we now throttle messages written to the error log from background histogram
update operations, the rate being capped at one message per minute, which should suffice for the user
to identify potential problems with background histogram updates. In addition, we downgrade all error
events that occur during background histogram updates from errors to warnings. (Bug #114845, Bug
#36574298)
• The range of error numbers for new errors in MySQL 9 has been designated to begin with 6400. (Bug
#114414, Bug #36421351)
• When the character set for arguments to a UDF was specified using component services and the
argument values passed did not convert cleanly to the desired character set, the UDF ceased executing
and returned SQL NULL. (Bug #114409, Bug #36420251)
• It was possible for a deterministic stored function to return an incorrect result when the function used
JOIN ON inside the return statement. If the query needed to be reprepared due to a table metadata
caused by, for example, FLUSH TABLES between two executions, the ON clause was sometimes lost.
(Bug #114235, Bug #36379879)
• The server rejected a query containing a subquery which referred to a column of the parent table. (Bug
#113887, Bug #36262779)
13
MySQL 9.0 Release Notes
• Added the missing mysql-community-libs-compat package for the EL8 and EL9 platforms. (Bug
#112949, Bug #35975348)
Note
• The PROCESSLIST_INFO column of THREADS was not updated when executing a prepared statement.
(Bug #104121, Bug #33057164)
14