2022.05.17

MySQL

MySQL Community Server 8.0.29 GA版(リリース日:2022年4月26日)

主な変更点

■ 認証関連

● FIDOオーセンティケータデータの最大サイズが増やされました。(バグ #33655192)

■ 文字セットのサポート

● 重要な注意:次の場合、サーバーはutf8ではなくutf8mb3を使用するようになりました。
  ・SHOW SQLステートメント(SHOW CREATE TABLE、SHOW CREATE VIEW、SHOW CREATE DATABASE)の出力
  ・無効な文字列を報告する時。

 (バグ #33385252、バグ #33395007)

● サーバーは、組み込みの文字セットからデータディクショナリテーブルにデータを入力する時に、文字セット名にエイリアスutf8の代わりにutf8mb3を使用するようになりました。これは、以下のリストにあるMySQL Information Schemaテーブルの文字セットと関連情報の表示に影響します。
  ・CHARACTER_SETS
  ・COLLATIONS
  ・COLUMNS
  ・COLLATION_CHARACTER_SET_APPLICABILITY
  ・PARAMETERS
  ・ROUTINES
  ・SCHEMATA

 この変更は、SQL SHOW CHARACTER SET、SHOW COLLATION、SHOW CREATE DATABASE、およびSHOW CREATE TABLEステートメントの出力にも影響します。(バグ #30624990)

■ コンパイル関連

● InnoDB:関連する問題に対処した後、C4100、C4127、C4245、およびC4389 MSVC++ レベル4 コンパイラの警告が再度有効になりました。(バグ #33437498、バグ #33571677)

● GCC 11は、EL7またはEL8でMySQLをビルドするためのサポートされたコンパイラになりました。このコンパイラは、devtoolset-11 (EL7)またはgcc-toolset-11 (EL8)パッケージで利用できます。libmysqlclient C APIライブラリに基づくサードパーティアプリケーションを構築する場合は、GCC 11を使用することもお勧めします。(バグ #33730302)

● サーバーをBison 3.8.1以降でコンパイルできませんでした。(バグ #33488047)

■ 非推奨と削除関連

● 重要な変更:以前は、MySQLは、TIME、DATE、DATETIME、およびTIMESTAMPリテラルで任意の区切り文字とそれらの任意の数を許可し、DATETIMEおよびTIMESTAMPリテラルの日付と時刻の値の前後および間に任意の数の空白を許可していました。この動作は現在非推奨となり、MySQLの将来のバージョンで削除される予定です。このリリースでは、非標準または過剰な区切り文字または空白文字を使用すると、「Delimiter 'char' in position pos in datetime value 'value' at row rownum is superfluous and is deprecated」という形式の警告がトリガーされ、その後に「Please remove」または 適切な置換を提案できる場合は「Prefer the standard 'replacementchar'」が続きます。

 非推奨の警告は、リテラル値で最初に検出された非標準の区切り文字または空白文字に対してのみ返されます。例を次に示します。

   mysql> SELECT DATE"2020/02/20";
   +------------------+
   | DATE"2020/02/20" |
   +------------------+
   | 2020-02-20       |
   +------------------+
   1 row in set, 1 warning (0.00 sec)

   mysql> SHOW WARNINGS\G
   *************************** 1. row ***************************
    Level: Warning
     Code: 4095
   Message: Delimiter '/' in position 4 in datetime value '2020/02/20' at row 1 is
   deprecated. Prefer the standard '-'. 
   1 row in set (0.00 sec)

 このような警告は、strictモードではエラーになりません。

● レプリケーション:replica_parallel_typeシステム変数は非推奨になりました。この変数が読み取られるか設定されるか、または同等のオプションがmy.cnfに設定される度に、サーバーは次のように非推奨の警告を発行するようになりました。

   mysql> SELECT @@replica_parallel_type; SHOW WARNINGS\G
   +-------------------------+
   | @@replica_parallel_type |
   +-------------------------+
   | LOGICAL_CLOCK           |
   +-------------------------+
   1 row in set, 1 warning (0.00 sec)

   *************************** 1. row ***************************
    Level: Warning
     Code: 1287
   Message: '@@replica_parallel_type' is deprecated and will be removed in a future
   release. 
   1 row in set (0.00 sec)

 この変数および同等のサーバーオプション --replica-parallel-typeは、将来のMySQLリリースで削除される予定です。

● サーバーシステム変数 query_prealloc_size および transaction_prealloc_size は非推奨になり、これらのいずれかまたは両方を設定しても、MySQLサーバーでは効果がなくなりました。それらは将来のMySQLリリースで削除されることを予定されています。

 参照:バグ #26940369。

● mysqldの --abort-slave-event-count および --disconnect-slave-event-count オプションは、以前はテストで使用されており、通常は実稼働設定では必要ありませんでしたが、非推奨になりました。MySQLの将来のバージョンでそれらが削除されることを予定されています。

■ SQL関数と演算子関連

● NULLと値を比較する式に基づく集約関数は、NULLを正しく無視していませんでした。(バグ #33624777、バグ #105762)

● 最適化中に集約関数が評価される場合、WHERE条件は既に評価されていると見なされます。したがって、削除される可能性があります。削除する前に、オプティマイザはmake_cond_for_table()を呼び出すことにより、WHERE条件にテーブルに依存しない条件があるかどうかを確認します。条件が高コストであると見なされた場合(例えば、ストアドプロシージャを使用した場合)、テーブルに依存しない条件があると誤って想定されました。make_cond_for_table()の呼び出しで高コストな条件を除外することで、これを修正します。

 さらに、関数f()がテーブルを使用しないf()= 1など、評価にコストがかかる定数条件は、多くの場合、誤った結果につながりました。ほとんどの場合、条件が実行に対して一定である場合、WHERE条件を最適化する時に評価され、コストが高すぎると見なされる場合はスキップされます。現在の問題は、暗黙的にグループ化されたクエリを最適化する時に条件をスキップしたために発生しました。これを回避するために、集約前にこのような条件を評価するようになりました。(バグ #33305617)

● DEFAULT()関数によって使用される列は、その引数を修正する時に内部的にREADとしてマークされませんでした。(バグ #33142135)

■ オプティマイザ関連

● LOAD DATAを使用してロードされているテーブルの列が、SETステートメント内で使用されるサブクエリのWHERE句で使用された場合、その列は不明として報告されました。(バグ #33714885)

● インデックスルックアップ(eq_ref)を実行した集約クエリは、場合によっては間違った結果を返す可能性がありました。これは、実行プランが一時テーブルでの集計ではなくストリーミング集計を使用した場合に見られました。

 集約ノードの下のeq_refキャッシュを無効にすることで、これを修正します。(バグ #33491183)

 参照:この問題は、バグ #100614、バグ #31790217のリグレッションです。

● 派生したマテリアライズドテーブル条件プッシュダウン最適化は、ほとんどのUNIONで使用できるようになりました。これは、外部のWHERE条件を、マテリアライズされた派生テーブルまたはビューのクエリ式の全てのクエリブロックにプッシュダウンできることを意味します。

 次に示すSQLステートメントを使用して、テーブル t1 と t2 を作成し、次にこれら2つのテーブルに基づいてビュー v を作成するとします。

   CREATE TABLE t1 (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    c1 INT, 
    KEY i1 (c1)
   );

   CREATE TABLE t2 (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    c1 INT, 
    KEY i1 (c1)
   );

   CREATE OR REPLACE VIEW v AS
      SELECT id, c1 FROM t1
      UNION ALL
      SELECT id, c1 FROM t2;

 ここで、クエリ SELECT * FROM v WHERE c1 = 12が実行されると、下記のEXPLAINの出力に示されるように、条件 c1 = 12がビュー v の両方のクエリブロックにプッシュダウンされます。

   mysql> EXPLAIN FORMAT=TREE SELECT * FROM v WHERE c1 = 12\G
   *************************** 1. row ***************************
   EXPLAIN: -> Table scan on v  (cost=1.26..2.52 rows=2)
     -> Union materialize  (cost=2.16..3.42 rows=2)
      -> Covering index lookup on t1 using i1 (c1=12)  (cost=0.35 rows=1)
      -> Covering index lookup on t2 using i1 (c1=12)  (cost=0.35 rows=1)

   1 row in set (0.00 sec)

 現在は、ほとんどのUNIONクエリで実行できるようになりました。(バグ #24012、バグ #36802、バグ #106006、バグ #11746156、バグ #11748590、バグ #13650627、バグ #30587347、バグ #33318096、バグ #33738597)

■ パフォーマンススキーマ関連

● 新しいパフォーマンススキーマインストゥルメンテーションは、クエリがPRIMARYエンジンとSECONDARYエンジンのどちらで処理されたかに関する情報を収集します。ここで、PRIMARYエンジンはInnoDBであり、SECONDARYエンジンはHeatWaveです。このインストゥルメンテーションは、HeatWaveを使用したMySQLデータベースサービスでの使用を目的としています。

 2つの新しいパフォーマンススキーマテーブル列が追加されました。
  ・クエリがPRIMARYエンジンとSECONDARYエンジンのどちらで処理されたかを示す
   EXECUTION_ENGINE列が、パフォーマンススキーマステートメントイベントテーブルと、
   performance_scema.threadsテーブルとperformance_scema.processlistテーブルに
   追加されました。
  ・SECONDARYエンジンでクエリが処理された回数を示すCOUNT_SECONDARY列が、
   パフォーマンススキーマステートメントサマリーテーブルに追加されました。

 また、execution_engine列もMySQL sys Schemaのsys.processlistビューとsys.x$processlistビューに追加されました。

■ セキュリティ関連

● OpenSSLライブラリがバンドルされているプラットフォームの場合、MySQLサーバー用のリンクされたOpenSSLライブラリが1.1.1lからバージョン1.1.1nに更新されました。OpenSSLで修正された問題については、https://www.openssl.org/news/cl111.txtおよびhttp://www.openssl.org/news/vulnerabilities.htmlで説明されています。(バグ #33840722、バグ #33970835)

■ SQL構文関連

● IF NOT EXISTSオプションが、CREATE FUNCTION、CREATE PROCEDURE、およびCREATE TRIGGERステートメントでサポートされるようになりました。

 CREATE FUNCTIONについては、ストアド関数の作成に使用される時に、CREATE PROCEDUREについては、同じ名前を持つルーチンが既に存在する場合に、このオプションはエラーが発生するのを防ぎます。CREATE FUNCTIONについては、ロード可能な関数の作成に使用される時に、このオプションはその名前を持つロード可能な関数が既に存在する場合のエラーを防ぎます。CREATE TRIGGERについては、このオプションは、同じテーブル、同じスキーマに同じ名前のトリガーが既に存在する場合にエラーが発生するのを防ぎます。これは、スクリプト、迅速な(再)デプロイ、レプリケーション、およびその他の潜在的な繰り返し使用のインスタンスでのこれらのステートメントの使いやすさを向上させることを目的としています。

 この機能拡張により、これらのステートメントの構文は、CREATE DATABASE、CREATE TABLE、CREATE USER、およびCREATE EVENTの構文とより一貫性があり、これらは全てIF NOT EXISTSを既にサポートしています。また、これは、DROP PROCEDURE、DROP FUNCTION、およびDROP TRIGGERで既にサポートされているIF EXISTSオプションを補完するものでもあります。

 (バグ #15287、バグ #11745440)

 参照:バグ #33301931。

■ テストスイート関連

● --async-clientオプションを使用して、Valgrindでのheap-use-after-freeエラーを減らすために、nullポインターがチェックされるようになりました。(バグ #33702755)

■ XAトランザクション関連

● 一部のシナリオでは、別の接続で準備されたXAトランザクションをコミットできなかったため、グループレプリケーションで問題が発生しました。このような問題に対処するために、MySQLはデタッチされたXAトランザクションをサポートするようになりました。準備が整うと、XAトランザクションは現在のセッションに接続されなくなります。これは、XA PREPAREの実行の一部として発生します。準備されたXAトランザクションは、別の接続によってコミットまたはロールバックされることが可能で、現在のセッションは、準備されたXAトランザクションが完了するのを待たずに、別のXAまたはローカルトランザクションを開始できます。

 このリリースで導入されたxa_detach_on_prepareシステム変数をOFFに設定することにより、この機能のサポートを無効にし、従来の動作を復元することができます。デフォルトはオンです。これは、特にレプリケーション設定で推奨されます。

 デタッチされたXAトランザクションのサポートが有効になっている場合(xa_detach_on_prepare = ON)、XAトランザクション内で一時テーブルを使用できないことに注意してください。

 (バグ #100163、バグ #31599926)

■ Xプラグイン関連

● 従来のMySQLプロトコルとXプロトコルとのUnixソケットロックファイルの形式の違いは、他のプロトコルのファイルが存在する場合、サーバーを起動できないことを意味していました。MySQLデータベースサービスインスタンスなど、ファイルを手動で削除できないインスタンスのメリットのために、プロトコルはファイルに同じ形式を使用するようになりました。(バグ #31468581)

■ 追加・変更された機能

● InnoDB:コードの品質を向上させ、デバッグを容易にするために、InnoDBソースの#defineのインスタンスは、constexpr指定子またはインライン関数に置き換えられました。

● InnoDB:InnoDBは、ALGORITHM=INSTANTを使用したALTER TABLE ... DROP COLUMN操作をサポートするようになりました。

 ALGORITHM=INSTANTをサポートする操作は、データディクショナリのメタデータのみを変更します。操作の準備段階と実行段階では、テーブルに対して排他的なメタデータロックは取得されず、テーブルデータは影響を受けないため、操作は瞬時に行われます。明示的に指定されていない場合、ALGORITHM=INSTANTは、それをサポートするDDL操作によってデフォルトで使用されます。

 MySQL 8.0.29より前では、即座に追加される列は、テーブルの最後の列としてのみ追加できました。MySQL 8.0.29からは、即座に追加される列をテーブルの任意の位置に追加できます。

 即座に追加または削除される列は、新しい行バージョンを作成します。最大64行のバージョンが許可されます。行バージョンの数を追跡するために、新しいTOTAL_ROW_VERSIONS列がINFORMATION_SCHEMA.INNODB_TABLESテーブルに追加されました。

● レプリケーション:バイナリログファイルの自動パージは、このリリースで導入されたbinlog_expire_logs_auto_purgeシステム変数を使用して制御されるようになりました。デフォルトでは、自動パージは有効になっています(binlog_expire_logs_auto_purgeがONに設定されています)。無効にするためには、この変数の値をOFFに設定します。

 この変数の効果は、binlog_expire_logs_secondsの設定、およびバイナリログのパージに関連する他のサーバーオプションまたは変数の設定を上書きします。

● Microsoft Windows:Windowsにjemallocサポートを追加し、公式のMySQLバイナリでそれを有効にしました。新しいWITH_WIN_JEMALLOC CMakeオプションは、mysqld.exeやmysqld-debug.exeと同じディレクトリにコピーされたjemalloc.dllを含むディレクトリを受け入れ、それをメモリ管理操作に利用します。jemalloc.dllが見つからない場合、または必要な関数をエクスポートしない場合は、標準のメモリ関数が使用されます。INFORMATIONレベルのログメッセージは、jemallocが検出されて使用されたかどうかを記録します。

 group_replication_set_as_primary関数は、指定されたグループメンバーを新しいプライマリとして指定し、選択プロセスをオーバーライドします。以前は、関数は、現在のプライマリを読み取り専用にして新しいプライマリに変更する前に、関数の使用後の着信トランザクションを含む、既存のプライマリ上の全てのアクティブなトランザクションが終了するのを待機しました。待ち時間に上限はありませんでした。

 オプションのタイムアウトパラメータを使用して、実行中のトランザクションのタイムアウトを設定できるようになりました。この関数を使用する時に実行されているトランザクションのタイムアウトは、0秒(即時)から3600秒(60分)まで設定できます。タイムアウトのデフォルト設定はないため、設定しない場合、関数の以前の動作が適用され、待機時間に上限はありません。タイムアウトが期限切れになると、まだコミットフェーズに達していないトランザクションの場合、トランザクションが続行されないようにクライアントセッションが切断されます。

 コミットフェーズに達したトランザクションは完了できます。タイムアウトを設定すると、その時点からプライマリで開始される新しいトランザクションも防止されます。明示的に定義されたトランザクション(START TRANSACTIONまたはBEGINステートメントを使用)は、データを変更しなくても、タイムアウト、切断、および着信トランザクションのブロックの対象になります。関数の動作中にプライマリの検査を許可するために、Permitted Queries Under Consistency Rulesにリストされているように、データを変更しない単一のステートメントを続行することが許可されます。

● MySQL Serverには、秘密鍵やパスワードなどの機密データを含む永続化されたシステム変数値を安全に保存し、値の表示を制限する機能が追加されました。現在、センシティブとしてマークされているMySQL Serverシステム変数はありませんが、新しい機能により、機密データを含むシステム変数を将来的に安全に保持できます。キーリングプラグインではなく、関数をサポートしない永続化されたシステム変数値の安全なストレージをサポートするためには、MySQL Serverインスタンスでキーリングコンポーネントを有効にする必要があります。

 永続化されたシステム変数が格納されているオペレーティングシステムファイルでは、センシティブなシステム変数の名前と値が、それらを復号化するために生成されたファイルキーとともに暗号化された形式で格納されます。生成されたファイルキーは、キーリングに保存されているマスターキーを使用して暗号化されます。MySQL 8.0.29にアップグレードした後、mysqld-auto.cnfオプションファイルの形式は、SET PERSISTまたはSET PERSIST ONLYステートメントが最初に発行されるまで同じままであり、関連するシステム変数がセンシティブでない場合でも、その時点で新しい形式に変更されます。新しい形式では、MySQL Serverの古いリリースではオプションファイルを読み取ることができません。

 新しいシステム変数persist_sensitive_variables_in_plaintextは、SET PERSISTを使用して値を設定する時にキーリングコンポーネントのサポートが利用できない場合に、サーバーがセンシティブなシステム変数の値を暗号化されていない形式で保存できるかどうかを制御します。デフォルト設定のONは、キーリングコンポーネントのサポートが利用可能な場合は値を暗号化し、利用できない場合は暗号化せずに(警告付きで)保持します。この設定により、暗号化されたシステム変数値を復号化できない場合、サーバーを起動することもできます。この場合、デフォルトが使用されます。最も安全な設定であるpersist_sensitive_variables_in_plaintextがOFFに設定されている時、キーリングコンポーネントのサポートが利用できない場合は、センシティブなシステム変数値を永続化できず、暗号化されたシステム変数値を復号化できない場合は、サーバーは起動しません。

 センシティブなシステム変数の値も、処理時に保護されます。センシティブなシステム変数に対してSETステートメントが発行された場合、クエリは、一般ログおよび監査ログに記録される前に、値を“redacted”に置き換えるように書き直されます。新しい権限SENSITIVE_VARIABLES_OBSERVERを使用すると、所有者はパフォーマンススキーマテーブルglobal_variables、session_variables、variables_by_thread、persisted_variablesのセンシティブなシステム変数の値を表示し、SELECTステートメントを発行して値を返し、接続のセッショントラッカーでそれらの変更を追跡できます。この権限を持たないユーザーは、これらのシステム変数値を表示できません。

● 新しいclone_delay_after_data_drop変数を使用すると、リモートクローン作成操作の開始時に受信者のMySQL Serverインスタンス上の既存のデータを削除した直後に遅延期間を指定できます。遅延は、データがドナーMySQL Serverインスタンスからクローン作成される前に、受信者ホスト上のファイルシステムがスペースを解放するのに十分な時間を提供することを目的としています。特定のファイルシステムは、バックグラウンドプロセスで非同期的にスペースを解放します。これらのファイルシステムでは、既存データを削除した直後にデータのクローンを作成すると、スペースが不足しているためにクローン作成操作が失敗する可能性があります。最大遅延時間は3600秒(1時間)です。デフォルト設定は0(遅延なし)です。

● キー管理相互運用プロトコル(KMIP)を使用して安全に通信するkeyring_okvキーリングプラグインは、MySQLのキーリングサービスとともに使用され、Oracle Key Vault、Gemalto SafeNet KeySecure Appliance、Townsend Alliance Key Manager、およびEntrust KeyControlなどのKMIP互換のバックエンドキーリングストレージ製品にキーリングデータを保存します。。プラグインにより、プライマリサーバーが利用できない場合に、バックエンドキーリングストレージ製品へのバックアップ接続を提供するために複数のスタンバイサーバーを指定できるようになりました。okvclient.oraファイルを編集して、サーバーのIPアドレスとポート番号をSTANDBY_SERVER変数の値にコンマ区切りのリストとして指定することにより、最大64台のスタンバイサーバーを追加できます。プラグインは、接続が試行される度に20秒待機して、接続を確立できるようになるまでスタンバイサーバーを反復処理します。したがって、スタンバイサーバーのリストを短く、正確に、最新の状態に保ち、有効でなくなったサーバーを削除する必要があります。これらのサーバーは、keyring_okvプラグインの接続時間、したがってサーバーの起動時間に大きな影響を与える可能性があるためです。

● myisam_repair_threadsシステム変数とmyisamchk --parallel-recoverオプションは非推奨になりました。MySQLの将来のリリースでは、両方のサポートが削除される予定です。

 myisam_repair_threadsの1(デフォルト)以外の値は警告を生成します。

● システム変数へのアクセスの分離は、そのような変数にアクセスまたは更新するSQLステートメントを解析、解決、および実行するサーバーコードでより適切に実施されるようになりました。

● MySQL Serverは、デフォルトでSSLセッションの再利用をサポートするようになり、タイムアウト設定を使用して、クライアントが新しい接続のセッションの再利用を要求できる期間を確立するセッションキャッシュをサーバーが維持する期間を制御します。全てのMySQLクライアントプログラムはセッションの再利用をサポートしています。

 さらに、CアプリケーションはC API機能を使用して、暗号化された接続のセッション再利用を有効にできるようになりました。

■ 主なバグ修正

● InnoDB:列が即座に追加されたテーブルのUNDOレコードをパージしようとした時にエラーが発生しました。(バグ #33924532)

● InnoDB:優先度の高いトランザクションは、中断された時に待機を停止したり、ロックの待機中にタイムアウトしたりすることを許可されなかったため、デッドロックが解決されませんでした。ブロッキングトランザクションも高優先度である場合、高優先度トランザクションは、中断された時に待機を停止したり、ロック待機タイムアウト期間を超えた時にタイムアウトしたりできるようになりました。ブロッキングトランザクションが高優先度でない場合、高優先度トランザクションはブロッキングトランザクションがそのロックを解放するのを待ちます。(バグ #33856332)

● InnoDB:Windowsで使用されていたAIO同期キューが削除されました。同期ファイルI/O読み取り/書き込み機能(SyncFileIO::execute)は、Linuxの場合と同様に、通常のI/OとオーバーラップしたI/Oの両方で開かれたファイルを処理するように改訂されました。(バグ #33840645)

● InnoDB:テーブルの全てのパーティションを即座に追加された列で切り捨てた後、テーブルバージョンのメタデータがリセットされませんでした。(バグ #33822729)

● InnoDB:セマフォ待機に関する警告を出力するsrv_error_monitor_thread()関数は、長いセマフォ待機を期待どおりに処理できませんでした。この問題に対処するために、ブロッキング呼び出しがより適切な場所に移動されました。関連するモニタースレッドコードが簡素化および改善され、欠落しているシャットダウン信号がいくつかのサーバースレッドに追加されました。

 InnoDBによる標準モニターの有効化と無効化は、ユーザーが設定可能なinnodb_status_output変数とは独立して実行されるようになりました。この変更は、モニターが特定のシナリオでInnoDBによって有効にされたが、以前の値に戻されなかった問題に対処します。(バグ #33789526、バグ #93878)

● InnoDB:Valgrindテストにより、InnoDBソースのrec_convert_dtuple_to_rec_old()でoff-by-oneエラーが特定されました。(バグ #33784672)

● InnoDB:InnoDBソースのmem_heap_alloc()関数のUNIV_DEBUGバリアントが変更され、Valgrindエラー検出が改善されました。(バグ #33783709)

● InnoDB:高速シャットダウンは、全てのファイルを閉じる前に、全てのアクティブなI/O操作が終了するのを待機しませんでした。(バグ #33768584)

● InnoDB:Clang警告により、@returnコマンドが正しく配置されていないことが報告されました。(バグ #33734011)

● InnoDB:パーティションを切り替える時に新しいレコードロック配列(m_prebuilt->new_rec_locks[])の値が適切に同期されなかったため、ロックが解放されたり、期待どおりに解放されなかったりすることが原因でアサーションエラーが発生しました。(バグ #33724166)

● InnoDB:書き込み要求が完了した時に二重書き込みバッファを更新する関数の競合状態により、長いセマフォ待機エラーが発生しました。(バグ #33712370)

● InnoDB:関数は、インデックス付き列のレコードを変更するには常にセカンダリインデックスに新しいレコードを作成する必要があると誤って想定し、ロック関連のアサーションエラーが発生しました。これと他の同様のケースに対処するために、暗黙のレコードロックを明示的なレコードロックに変換するlock_rec_convert_impl_to_expl()関数は、暗黙のレコードロックが実際に保持されている場合にのみ使用されるようになりました。(バグ #33657235)

● InnoDB:InnoDBソースの多くのDoxygenの問題が解決されました。(バグ #33603036)

● InnoDB:インデックスインスタンスのnullポインタチェックが欠落しているため、エラーが発生しました。(バグ #33600109)

● InnoDB:増分バックアップが失敗し、ページトラッキングが使用できないことを示すエラーが発生した後、サーバーを起動します。(バグ #33521528)

● InnoDB:InnoDBのリカバリ中にアサーションエラーが発生しました。このエラーは、ローカルミニトランザクションでページが解放された後、解放リストとインデックスリストがリセットされる前にサーバーが終了したことが原因でした。解放されたページにまたがる解放リストとインデックスリストは、リカバリー中にトラバースされました。(バグ #33454557)

● InnoDB:btr_insert_into_right_sibling()Bツリー関数は、カーソルがページの最後にある時にタプルを右側のシブリングページに挿入しますが、誤ったロック関数呼び出しが原因でACID違反が発生しました。(バグ #33405696)

● InnoDB:COMPACTまたはREDUNDANT行形式を使用すると、最大行サイズを超えるテーブルが作成される可能性があり、データの挿入時に'Row size too large'(行サイズが大き過ぎる)というエラーが発生する可能性がありました。BLOBプレフィックスは、CREATE TABLE操作中に実行されたレコードサイズチェックに含まれていませんでした。(バグ #33399379)

● InnoDB:マスター暗号化キー(get_master_key())を取得する関数が、まだ初期化されていないマスターキーID mutex(master_key_id_mutex)を取得しようとしました。(バグ #33067891)

● InnoDB:冗長でコストのかかるチェックがlock_sec_rec_read_check_and_lockロックシステム関数から削除されました。これは、セカンダリインデックスレコードにロックを設定するために使用されます。(バグ #33059387)

● InnoDB:TempTableストレージエンジンがファイルフルエラーを適切に処理しませんでした。(バグ #32929392)

● InnoDB:ALTER TABLE ... ALGORITHM=COPY操作中に発生したDDLログエラーが処理されなかったため、後続のALTER TABLE ... ALGORITHM=INPLACE操作中にエラーが発生しました。(バグ #32716838)

● InnoDB:パージスレッドは、テーブルスペースがロードされなかった暗号化されたテーブルのUNDOレコードを処理し、エラーを引き起こしました。(バグ #32586721)

● InnoDB:スレッドが非同期I/O操作をポストし、それ自体を閉じたため、オペレーティングシステムファイル操作エラーが発生しました。(バグ #30567295)

● InnoDB:最大整数列値を超えた時に誤ったAUTO_INCREMENT値が生成されました。エラーは、最大列値が考慮されていないことが原因でした。この場合、以前の有効なAUTO_INCREMENT値が返されているはずであり、重複キーエラーが発生します。(バグ #87926、バグ #26906787)

● InnoDB:トランザクションロックの優先度が変更され、共有ロックを保持して排他ロックへのアップグレードを待機しているトランザクションが、同じ行で排他ロックを待機している別のトランザクションよりも優先されるようになりました。つまり、共有ロックを既に保持しているトランザクションには、最初に排他ロックが付与されます。同じ行に共有ロックを保持している他のトランザクションは、このシナリオで排他ロックが付与されるのを防ぐことができます。

 トランザクションロックシステムソースのlock_rec_find_set_bitおよびlock_rec_has_expl関数が最適化されました。(バグ #21356、バグ #11745929)

● パーティショニング:場合によっては、パーティションの.ibdファイルが欠落していると、MySQLサーバーへの接続の確立が失敗する可能性がありました。(バグ #33459653)

● パーティショニング:全てのNOT INおよびNOT EXISTSサブクエリをアンチジョインに変換するためにMySQL8.0.17で行われた作業に続いて、この変換によって生成されたネストされた外部結合の内部部分は、テーブルパーティションのプルーニング中に考慮されませんでした。(バグ #33060953)

● レプリケーション:group_replication_consistency=AFTERが設定されたレプリケーショングループで、新しいプライマリが選出されてから前のプライマリが再起動された場合、新しいプライマリはエラーメッセージとともにグループを離れました。この状況を防ぐために、遅延ビューの変更とトランザクションの準備の処理が調整されました。(バグ #33755920)

● レプリケーション:グループレプリケーションは、自動再結合プロセスで、エラー状態の時にグループに入ることができる唯一のタイプのインスタンスが再結合メンバーであることを確認するのが遅すぎました。この問題は修正されました。(バグ #33615493)

● レプリケーション:グループレプリケーションは、参加メンバーがいない状況で、ビューの変更だけで、グループ構成操作の実行中のメンバー参加に関する警告メッセージをログに記録する可能性がありました。メッセージは、必要な場合のみログに記録されるようになりました。(バグ #33378364)

● レプリケーション:グループレプリケーションは、ローカルXComインスタンスへの接続に問題が発生した時に返されるオペレーティングシステムエラーをログに記録するようになりました。これにより、ファイアウォールが接続をブロックするなどの問題を簡単に解決できます。(バグ #33189767、バグ #104523)

● レプリケーション:プライマリの選択が止まってしまうのを防ぐために、グループレプリケーションは、その選択中にグループを離れるメンバーからの確認を待つのをやめます。確認が保留されていた全てのメンバーが離れた場合、グループレプリケーションはプライマリの選択が正常に完了したことを宣言します。以前は、プライマリメンバーが離れたメンバーの1人であった場合、プライマリの変更は、それが行われなかった時に発生したと誤って記述されていました。現在、プライマリメンバーが選択中に離れた場合、グループレプリケーションは、プライマリの選択を、プライマリ変更のない不成功の選択として宣言します。(バグ #33059773)

● レプリケーション:ネットワークプロバイダの停止時にデッドロックが発生すると、一部のグループメンバーでSTOP GROUP_REPLICATIONが無期限に待機する可能性がありました。(バグ #33044886)

● Microsoft Windows:Windowsで、WinFlexBisonサポートが追加されました。(バグ #33788290)

● EL6/EL7で、mysql-community-server-debugのインストールは、商用パッケージのインストールによって廃止されませんでした。(バグ #33956760)

● 非システムOpenSSLなど、cmakeビルドシステムによってコピーされた共有ライブラリに対してビルドする場合、MySQL ServerはARM上にEL7をビルドしませんでした。現在は、getconfによって報告されるように--page-sizeが設定されます。(バグ #33904267)

● PROCESS権限を持つ匿名ユーザーは、プロセスリストテーブルから行を選択できませんでした。(バグ #33869388)

● 範囲オプティマイザは、セッションメモリ制限を考慮しませんでした。(バグ #33869004)

● サブクエリを並べ替える場合、同じファイル並べ替え操作が異なる入力で何度も実行される可能性があり、そのため、最長のアドオンフィールドが実行ごとに変わる可能性がありますが、このフィールドのバッファは必要な時に再割り当てされませんでした。現在、以前に割り当てられたバッファが十分に大きい場合は、それを再利用し、そうでない場合は、新しいバッファを割り当てます。(バグ #33865094)

● 無効な結果が、複数のクエリブロックでマテリアライズ化されて使用された共通テーブル式から取得されました。ここで、CTEを使用した1番目のクエリブロックには、複数の可能なキー定義があり、これにより、内部関数JOIN::finalize_derived_keys()は、使用されるキーの定義をゼロの位置に移動しました。そして、CTEを使用する2番目のクエリブロックは、1番目のクエリブロックのために選択されたキーの元の位置と同じ位置を占めるインデックスを操作しました。これは、DMLステートメントを1回だけ準備するためにMySQL 8.0.22で行われた作業の意図しない副作用として発生しました。

 (バグ #33856374)

● ストアドプロシージャおよびストアド関数を実行する時のエラー処理が改善されました。(バグ #33851256)

● ビューから選択したトリガーは、必ずしも期待した結果をもたらすとは限りませんでした。(バグ #33847722)

● タイムゾーン情報の読み込み中に実行される計算には、my_time_tの負の値が必要です。通常、そのタイプの最小値はゼロであり、UNIXエポックの開始(1970-01-01 00:00:00、タイムゾーンオフセットなし)に対応し、定数MYTIME_MIN_VALUEに反映されます。一部のタイムゾーンオフセットが負であるため、この最小値は、全ての場合にTIME_ZONE_INFOデータ構造を設定するために正しく機能しませんでした。この修正により、タイムゾーン情報データベースキャッシュにデータを入力する時にmy_time_tに負の値を設定できるようになりました。(バグ #33837691)

● MySQLインスタンスが予期せず停止した場合、または、SET PERSISTステートメントを使用してシステム変数設定を記録した直後にMySQLインスタンスが再起動された場合、設定ファイルmysqld-auto.cnfが空のままになる可能性があり、その場合、サーバーの再起動を続行できませんでした。永続化されたシステム変数がバックアップファイルに書き込まれるようになりました。バックアップファイルは、書き込みの成功が確認された後にのみmysqld-auto.cnfに名前が変更され、元のmysqld-auto.cnfファイルは引き続き使用できます。再起動時に、有効な内容のバックアップファイルが見つかった場合、サーバーはそのファイルから読み取ります。そうではない場合は、mysqld-auto.cnfファイルが使用され、バックアップファイルは削除されます。(バグ #33830493)

● filesortは、ソートキーを計算する時に、文字列値の長さを常に正しくチェックするとは限りませんでした。(バグ #33830073)

 参照:この問題は、バグ #29739778のリグレッションです。

● GROUP_ID列とMEMBER_ID列で構成されるプライマリキーがmysql.firewall_membershipテーブルに追加されました。(バグ #33824544)

● WITH CHECK OPTIONを使用して更新可能なビューを更新する際の行一致値の不整合について、MySQL 8.0.20で行われた修正により、単一テーブルの更新についてのみこの問題が処理されました。このリリースでは、マルチテーブルUPDATEステートメントの問題も修正されています。(バグ #33815426)

 参照:バグ #30158954。

● 新しいProtobufバージョンで修正された問題については、https://github.com/protocolbuffers/protobuf/releasesで説明されています。(バグ #33813846)

● utf32列に無効な文字を挿入する可能性がありました。(バグ #33810558)

● MySQL Enterprise Firewallプラグインを再インストールすると失敗しました。この失敗は、プラグインが完全に初期化される前に、以前に永続化されたファイアウォールシステム変数を更新するための呼び出しが原因でした。(バグ #33809478)

● VARCHAR結合列またはDECIMAL結合列を使用したハッシュ結合は、過剰な数の行を返しました。VARCHARを使用した例を次に示します。

   # Create and populate table
   CREATE TABLE t(a VARCHAR(10), b VARCHAR(10));
   INSERT INTO t VALUES ('x', 'xx'), ('xx', 'x');
   
   # No indexes, so uses a hash join
   SELECT * FROM t AS t1, t AS t2 WHERE t1.a = t2.a AND t1.b = t2.b;

 修正前は、表示されたクエリは4行を返しました。現在は、期待どおりに2行が返されます。(バグ #33794977)

● INFORMATION_SCHEMA.KEY_COLUMN_USAGEテーブルは、非表示のキー列を一覧表示しませんでした。(バグ #33781534)

● ビューから作成されたビューにアクセスした後、サーバーは適切なクリーンアップを実行しませんでした。(バグ #33777821)

● WITH ROLLUPと、SELECTリストに既に存在する集計を順序付けされたウィンドウ関数を使用したグループ化されたクエリでは、ウィンドウの順序付け句を解決する時に、余分な(不要な)集計が非表示の列として追加されました。(バグ #33769911)

● データマスキングmask_ssn()関数は、有効な非定数値(ハードコードされた値ではなくデータベース行から読み取られたデータ)に対して'String argument width too large'(文字列引数の幅が大きすぎます)というエラーを返しました。さらに、長さがゼロの定数値と非定数値(空の文字列)のために、または小さすぎる定数値のために、検証は実行されませんでした。これらの問題は、長さの境界で入力を文字列化する全てのデータマスキング関数で対処されました。(バグ #33759276)

● ORDER BYとウィンドウ関数を使用すると、ROLLUPが正しく処理されない場合がありました。(バグ #33753245)

● Doxygenコメントの多くの問題を修正しました。(バグ #33734001、バグ #33734035、バグ #33734062、バグ #33734075、バグ #33734104、バグ #33734117、バグ #33734129、バグ #33734143、バグ #33734155、バグ #33734181、バグ #33734188、バグ #33734206)

● 解析できないステートメント(例えば構文エラーが原因)は、スロークエリログに書き込まれなくなりました。(バグ #33732907)

● MySQL Enterprise Thread Poolの初期設定を説明するメッセージは、情報ではなくSYSTEMメッセージとして発行されるようになったため、デフォルトのログレベルで表示されます。(バグ #33729821)

● 一部のシナリオでは、セッショントラッキングに関連する事前ロックの最適化により、再帰的なロックが発生しました。(バグ #33728209)

● INサブクエリを含むUNIONは、ORDER BY句も使用した場合、常に適切に処理されるとは限りませんでした。(バグ #33725507)

● コマンドラインオプションを使用してパスワードプロンプトが要求された場合、mysqlpumpクライアントユーティリティが予期せず停止する可能性がありました。このプロセス中にエラーが発生した場合、クライアントが終了する前に適切なエラーメッセージが返されるようになりました。(バグ #33688141)

● 次のプラットフォーム用に個別のdebuginfo RPMを出荷するための標準パッケージポリシーを実装しました:SLES/openSUSE、community EL6とEL7。EL6およびEL7の商用バージョンは、DebugではなくRelWithDebInfoビルドタイプでビルドされるようになりました。これにより、サイズが大幅に減少します。(バグ #33663811、バグ #33684418、バグ #33664929)

● トレースログを有効にしてmysqldを実行することはできませんでした。(バグ #33653824)

● 起動時にFIDOデバイス登録のために--fido-register-factorオプションを使用すると、mysqlクライアントがALTER USERステートメントで誤った構文を使用し、失敗する可能性がありました。この問題は修正されました。(バグ #33650498)

● SET列の値を検索する時に、FIND_IN_SET()に最初の引数として渡されたユーザー変数は、同じ方法で使用される定数値と同じ結果を生成しませんでした。

 例:次のように作成および入力されたテーブル t1について考えてみます。
    CREATE TABLE t1 (c1 SET('a', 'b', 'c', 'd'));
    INSERT INTO t1 (c1) VALUES ('a, c, d'), ('c');

   varとstrに表示される値は、次のクエリからの出力の両方の行で同じである
   必要がありますが、そうではありませんでした。
    SET @a = 'c';
    SELECT FIND_IN_SET(@a, c1) AS var, FIND_IN_SET('c', c1) AS str FROM t1;

 このような場合、求められる値が定数であるか列値であるかにかかわらず、列定義に使用されるセット内の一致の位置を返すようにします。(バグ #33635637)

● それをサポートする認証方法を使用したSET PASSWORD操作は、予期されたエラーではなく警告を生成しました。(バグ #33635445)

● MySQLサーバーの起動時にプラグインディレクトリが指定されておらず、ユーザーがFIDOデバイスの登録を試みた場合、mysqlクライアントが予期せず停止しました。現在は、この状況は処理され、適切なエラーが報告されます。(バグ #33631144)

● MySQL 8.0.27で行われた変更により、フィルターとソートを含む複合アクセスパスのEXPLAIN出力がテーブルパス内からMATERIALIZEアクセスパスに移動されましたが、複合アクセスパスにINDEX_RANGE_SCANが含まれていませんでした。これにより、場合によっては未定義の動作が発生する可能性がありました。(バグ #33611545)

 参照:この問題は、バグ #32788576のリグレッションです。

● パフォーマンススキーマのDROP権限を取り消すことはできませんでした。(バグ #33578113)

● 内部のCreateIteratorFromAccessPath()関数は、再帰を使用しないように書き直されました。これにより、クエリを実行する際のスタック使用量が大幅に削減されることが期待されます。(バグ #33569770)

● チャレンジレスポンスエラーでFIDOデバイスの登録を試みると、mysqlクライアントが予期せず停止する可能性があります。この問題は修正されました。(バグ #33568944)

● プリペアドステートメントまたはストアド関数によって実行されたINFORMATION_SCHEMA.FILESまたはINFORMATION_SCHEMA.TABLESクエリは、古いデータを返しました。キャッシュされたデータは、データが変更された後に報告されました。(バグ #33538106、バグ #105450)

● クエリは、次の全ての条件を満たした時に誤った結果を返しました。
  ・結果セットに、非決定論的要素を持つ列が含まれていた。
  ・列がテーブルを参照していなかった。
  ・暗黙のグループ化があった。
  ・クエリプランが一時テーブルからの集約を使用した。この一時テーブルは空だった。

 列 c1を持つ空のテーブル tが与えられた場合、ステートメント INSERT INTO t SELECT MAX(t.c1), RAND(0) AS x FROM tはそのようなクエリの例を提供します。同じテーブルに挿入することで、クエリプランが一時テーブルから集約するようにします。一時テーブルにはc1の列があり、(単一の)結果行は一時テーブルの最初の行からc1を選択します。一時テーブルが空の場合、最初の行はなく、c1は0になります。これにより、例えば(NULL, 0.155)ではなく(NULL, 0)がtに挿入されました。

 このような列を一時テーブルに保存しないことで、これを修正します。(バグ #33535379)

 参照:バグ #32384355。

● MySQL 8.0.27でのパスワード処理の変更に続いて、mysqlクライアントがCtrl + Cで中断された場合、中断を実行するためにユーザーのパスワードを要求するパスワードプロンプトが発行される可能性がありました。パスワードは、(起動時にコマンドラインで提供された時と同様に)プロンプトに応答して提供された時に記録されるようになりました。そのため、中断のために確立された新しい接続によって自動的に使用されることが可能です。(バグ #33514253)

● 内部keyreadフラグは、完全な行ではなく、インデックスエントリのみを読み取ることを示します。初期化中にこのフラグがインデックスマージスキャンのために設定された場合、その後インデックスマージスキャンの一部として選択された個々の範囲スキャンを初期化する時にリセットされ、インデックスエントリではなく行の読み取りを示しました。これを修正するために、インデックスエントリの読み取り中に、カバーするインデックスとして選択されるインデックスを設定します。(バグ #33499071)

● ドナーホストの圧縮データサイズが受信者ホストの使用可能なディスク容量と同等であるページ圧縮されたテーブルのクローンを作成すると、データのコピーが停止しました。受信者ホストに開けられたホールがページサイズよりも小さかったため、ディスクが断片化され、クローン化されたデータに使用できるスペースの量が制限されました。受信者ホストでページ圧縮されたテーブルを処理するプロセスが変更され、断片化を減らし、データのコピー速度を向上させました。

 フラッシュの速度を向上させるために、クローンプラグインは、ホールパンチングをサポートするファイルシステムでページ圧縮されたテーブルをフラッシュする時にfsyncフラッシュメソッドを使用するようになりました。(バグ #33482747)

● ビューを作成する時に、サブクエリが一定であると見なされた場合解決中に評価される可能性がありました。(バグ #33438883)

● 名目上、EXPLAIN FORMAT=TREE出力では、私たちは整数としてのみいくつかの行を書き込みます。結果がゼロの場合、これが0.49であるか0.00001であるかを判断するのは困難でした。そのため、このような場合に先頭の1桁を取得するのに十分な精度を追加します。(バグ #33426283)

● VALUESは、場合によっては、指定どおりに機能しませんでした。(バグ #33414289)

● デバッグビルドでは、タイプ MYSQL_TYPE_DOUBLEのユーザー変数の特定の組み合わせが、CAST()またはCONVERT()のコンテキストで使用された時にアサートにヒットします。(バグ #33406728)

● 複数の等式を設定する場合、オプティマイザは外部参照を不要な時に追加しました。(バグ #33394701)

● MySQLビルドでサポートされるBoostライブラリの最小バージョンが1.77.0に引き上げられました。(バグ #33353637)

 参照:バグ #33052171。

● 冗長なinitおよびcheckout_access_maps関数コードがSecurity_contextクラスから削除されました。(バグ #33339129、バグ #104915)

● sysスキーマビュー schema_unused_indexesが正しく更新されませんでした。

 schema_unused_indexesは、table_io_waits_summary_by_index_usageから未使用のインデックス情報を取得し、インデックスがテーブルに存在しない行にクエリするために使用された場合はデータを返しません。

 このリリースの時点で、行が見つからない場合でも、schema_unused_indexesが更新されます。(バグ #33302400)

● 一般的なテーブル式を使用する一部のクエリは、EXPLAINによって正しく処理されませんでした。(バグ #33300271)

● サーバーは、特定の複雑なクエリのインデックス統計を正しく取得しませんでした。(バグ #33270516)

● 特定の状況下で、TRUNCATE TABLE performance_schema.status_by_threadを実行する場合、競合状態が発生する可能性がありました。

 (バグ #33165726)

● ページクリーナースレッドは、大きなテーブルでのフルテキストインデックス作成操作によって保持されるインデックスページの排他ロックを待機しているため、タイムアウトしました。(バグ #33101844)

● InnoDBテーブルの場合、セカンダリインデックスは、テーブルのプライマリキーを含むように拡張されます。つまり、プライマリキーの一部である全ての列は、全てのセカンダリインデックスの一部としてマークされます。これの例外は、セカンダリインデックスが一意として定義されている場合にサーバーがプライマリキー拡張を使用しないことです。これにより、ダイナミックレンジスキャンの読み取りセットを設定する際に問題が発生する可能性がありました。一意のセカンダリインデックスの場合に、すべてのプライマリキー部分が読み取りセットに含まれるようにして、この問題を修正します。(バグ #33101025)

 参照:この問題は、バグ #30417361のリグレッションです。

● 存在しないテーブルを参照する既存の外部キー制約により、テーブルの作成または名前変更後に接続エラーが発生する可能性がありました。(バグ #33054071)

● INSERTステートメントの実行中に空のVALUESの値リストを作成している時、非表示の要素が追加されました。これにより、デバッグビルドでアサーションが発生しました。この問題を修正するために、VALUESリストの作成時に非表示の要素をスキップするようになりました。

 (バグ #32774799)

● 式の一部であるORDER BYのSELECTリストアイテムへのエイリアスは、スタンドアロンエイリアスと同じ方法で解決されなかったため、ORDER BYエイリアスは正しく解決されましたが、ORDER BY関数(エイリアス)は解決されませんでした。(バグ #32695670)

● 空または存在しないキーリングソース(keyring_file_dataで指定)からのオフラインキーリング移行は、警告無しで正常に完了したように見えました。キーリング移行プロセスで、キーをフェッチする時にエラーがチェックされるようになりました。指定されたキーリングソースでキーが見つからない場合、キーリングにキーがないことを示す警告メッセージがエラーログに書き込まれます。(バグ #32327411)

● 常に真である条件を削除すると、サブクエリ自体がクエリの他の場所で参照されていても、ビューを参照するサブクエリが削除されました。(バグ #31946448)

 参照:バグ #31216115。

● EXPLAINステートメントは、派生テーブルを含む複数テーブルのUPDATEステートメントと一緒に使用されると、サーバーを終了させる可能性がありました。(バグ #31884434)

● --order-by-primaryオプションを指定してmysqldumpが複数のテーブルで使用された場合、メモリリークが発生しました。各テーブルの行を並べ替えるために割り当てられたメモリは、1回だけではなく、どのテーブルの後にも解放されるようになりました。(バグ #30042589、バグ #96178)

● mysqld_safeログメッセージのテキストエラーが修正されました。(バグ #106590、バグ #33903639)

● 実行パスがわずかに異なるため、同等のクエリが異なる結果を返す可能性がありました。例えば、Item::val_int_from_string()とItem_string::val_int()は、文字列から整数への変換に同じアルゴリズムを使用する必要があります。(バグ #106517、バグ #33881339)

● 非推奨のPermissionsStartOnly systemdオプションを処理するようにCMakeルールが更新されました。代替の実行可能プレフィックスはsystemd 231(2016年7月)で追加されましたが、PermissionsStartOnlyはsystemd 240(2018年12月)で非推奨になりました。使用可能な場合は、優先実行可能プレフィックスが使用されるようになりました。(バグ #106468、バグ #33862323)

● マテリアライズされた派生テーブルの条件プッシュダウンを実装するためにMySQL 8.0.22で行われた作業に続いて、集約関数を使用して暗黙的にグループ化されたクエリが、NULLではなく空のセットを返す場合がありました。(バグ #106414、バグ #33838439)

● バインドされた引数としてDATE、TIME、DATETIME、またはTIMESTAMPを使用した、'SELECT ?'のような準備され実行されたクエリは、間違った列タイプを返す可能性がありました。この問題は、そのようなクエリを再準備して各動的パラメータにそのリテラル値を与える以前のロジックを復元することで修正されます。(バグ #106352、バグ #33813951)

 参照:この問題は、バグ #32915973のリグレッションです。

● NULLセーフ比較(≪=>)は、トリガーのTIMESTAMP列に関して正しく評価されませんでした。(バグ #106286、バグ #33790919)

 参照:この問題は、バグ #32942327のリグレッションです。

● ハッシュ結合バッファにDECIMAL値を書き込む時、その値は最初に正規化されました。この正規化により、場合によっては意図せずに値が変更され、値が誤ったハッシュバケットに分類され、結合から誤った結果が返される可能性がありました。

 問題は、正規化が、一部の値で最下位桁の一部が失われるような方法で先行ゼロを削除したことです。元の値を変更する代わりに、必要な精度を計算してその計算値を渡すことで、これを修正します。(バグ #106272、バグ #33787914)

● c NOT BETWEEN NULL AND COALESCE(a, b)形式のWHERE条件を持ち、DATETIME列 a、b、およびcを持ち、列 aおよびcがNOT NULLとして作成されたクエリは、正しい結果を返しませんでした。さらに調査したところ、このような場合、BETWEENの2番目または3番目の引数がNULLの場合、比較結果が反転し、FALSEの場合はNULL、NULLの場合はFALSEと評価されることがわかりました。(バグ #106267、バグ #33788832)

● 0 (FALSE)とNULLの間のNULLセーフ比較は、このタイプのオブジェクトの評価を担当する実装がNULLになることはなく、常にFALSEを返す必要がある場合でも、TRUEを返す可能性がありました。(バグ #105773、バグ #33630225)

● QUICK_RANGEコンストラクターは、QUICK_RANGEオブジェクト自体の割り当てに使用されるのと同じメモリルートではなく、キーの割り当てにメインスレッドのメモリルートを使用しました。これにより、クエリプランの範囲チェックを使用して複数のクエリを実行すると、メモリ使用量が予想外に高くなりました。(バグ #105331、バグ #33516707)

 参照:バグ #28805105、バグ #28857990。

● VARCHAR列のSELECT DISTINCTは、TempTableストレージエンジンが使用された時(internal_tmp_mem_storage_engine = TempTable)に列に空の文字列と単一の空白文字で構成される文字列が含まれている場合に2つの異なる値を返しました。utf8_bin照合とPADSPACEを使用した場合、この動作は正しくありませんでした。異なる値を選択する時は、末尾のスペースを無視する必要があります。

 TempTableストレージエンジンを使用して作成された一時テーブルの場合、TempTableハッシュ関数は常に長さゼロのデータを0にハッシュするため、2つの文字列は異なる値にハッシュされました。(上記の場合、空の文字列は0にハッシュされ、他の文字列のスペース文字は、ゼロ以外のハッシュ値を生成するために使用されました。)

 これは、TempTableストレージエンジンのハッシュ関数で長さがゼロのデータの特別な処理を削除することで修正されました。

 (バグ #105316、バグ #33506241)

● 複数値インデックスを使用するSELECT COUNT(*)は、誤った行数を報告しました。(バグ #104898、バグ #33334928)

● テストプログラム main.ssl-bigは、接続数が多すぎて失敗しました。

 (バグ #104377、バグ #33139204、バグ #33165693)

● MySQLでサポートされている2種類のヒストグラムであるsingletonとequi-heightは、以前はバケットのコレクションをそれぞれマップとセットに格納していました。このリリースでは、両方のヒストグラムタイプが変更され、それらは代わりに動的配列にバケットを格納するようになりました。これにより、バケットでバイナリ検索を実行する際の間接参照が減少するため、スペースオーバーヘッドが削減され、選択性の見積もりが高速化されます。

 どちらのタイプのヒストグラムも、バケットを並べ替えられた順序で挿入することによって作成され、バケットは並べ替えられた順序でJSONにシリアル化されるため、動的配列への切り替えに伴う追加の作業はありません。(バグ #104109、バグ #33045204)

● 符号付き変数と符号なし変数の間の無効な変換により、SELECT ALL t1.c1,t2.c1 FROM t1,t2 WHERE t1.c1 > t2.c1の形式のクエリから誤った結果が発生しました。(バグ #102025、バグ #32302724)

● このリリースの時点で、パフォーマンススキーマは照合対応です(バグ #98545、バグ #30881109)

● setup_actorsのROLE列に32バイトを超えるデータを挿入すると、アサートエラーが発生する可能性がありました。このリリースの時点で、ROLE列はCHAR(32)からCHAR(96)に増加しています。(バグ #74678、バグ #19947842)

全ての変更点やバグ修正については、以下のページをご覧ください。
MySQL Community Server 8.0.29 リリースノート(MySQLウェブサイト):
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-29.html


MySQL Editions

MySQL Editions
MySQLのサブスクリプションは、24時間365日体制でお客様をサポートいたします。さらに MySQL Enterprise Edition では、データベース管理者支援ツール MySQL Enterprise Monitor やバックアップツール MySQL Enterprise Backup をご利用いただけます。