Amazon RDSデータベースプレビュー環境でMariaDB 12.3の新機能を試してみた

Amazon RDSデータベースプレビュー環境でMariaDB 12.3の新機能を試してみた

Amazon RDSデータベースプレビュー環境でMariaDB 12.3が利用可能になりました。今回は、IS JSON述語によるJSON妥当性検証、Oracle互換のTO_DATE()関数、CTEを参照するUPDATE/DELETEについて、RDSプレビュー環境で確認しました
2026.06.18

はじめに

2026年6月15日付けのAWSの告知で、Amazon RDSデータベースプレビュー環境でMariaDB 12.3が利用可能になったことが発表されました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/05/amazon-rds-maria-db-innovation-release-12-3-rds-database-preview-environment/

MariaDB 12.3はLong-Term Supportリリースで、2029年6月までメンテナンスされます(MariaDB公式リリースノートに明記)。AWSアナウンスのURL slugにはinnovation-releaseとありますが、本文ではLTSと明記されています。コミュニティ版のGA(Stable)は12.3.2で、RDSプレビュー環境では12.3.1が提供されています。

AWSは2026年5月にRDS for MariaDBのメジャーバージョン提供目標を「コミュニティGA後3か月以内」と公表しています。直近の11.8は19日でGA提供されており、12.3も比較的早期にGA提供される可能性があります。

MariaDB メジャー コミュニティGA RDS GA日 日数 コミュニティEOL
12.3 2026/5頃(12.3.2 GA) Preview 2029/6
11.8 2025/8/6 2025/8/25 19日 2030/6
11.4 2024/8/8 2024/10/15 68日 2029/5
10.11 2023/2/16 2023/8/21 186日 2028/2
10.6 2021/7/6 2022/2/3 213日 2026/7
10.5 2020/6/24 2021/1/21 211日 2025/6

今回はMariaDB 12.3の新機能のうち、SQLだけで即確認できる3機能をRDSプレビュー環境で動作確認しました。

機能 概要 本記事での検証
IS JSON 述語 SQL標準のJSON妥当性検証
TO_DATE() Oracle互換の日付変換関数
CTE UPDATE/DELETE CTEを参照するUPDATE/DELETE
基本XMLデータ型 XMLデータ型の基本サポート -
Prepared Statementカーソル Prepared Statementに関するカーソル機能 -
LEFT JOIN最適化 クエリオプティマイザ改善 -
RANGEパーティション順序スキャン最適化 クエリオプティマイザ改善 -

各機能の詳細はリリースノートを参照してください。

https://mariadb.com/docs/release-notes/community-server/12.3/12.3.1

検証環境

項目
環境 Amazon RDS データベースプレビュー環境
リージョン us-east-2
エンジンバージョン MariaDB 12.3.1
インスタンスクラス db.t3.micro
ストレージ gp3
クライアント EC2 (Amazon Linux 2023) から mysql 10.5.29 で接続
接続方式 SSL必須(--ssl-ca でRDS CA証明書を指定)
MariaDB [(none)]> SELECT VERSION();
+----------------+
| VERSION()      |
+----------------+
| 12.3.1-MariaDB |
+----------------+

MariaDB [(none)]> SELECT @@version_comment;
+----------------------------------------+
| @@version_comment                      |
+----------------------------------------+
| managed by https://aws.amazon.com/rds/ |
+----------------------------------------+

MariaDB [(none)]> SELECT @@sql_mode;
+-------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+

IS JSON 述語

MariaDB 12.3では、SQL標準のIS JSON述語が追加されました(MDEV-37072)。SELECT式やWHERE句で使用できます。

基本的な判定

MariaDB [(none)]> SELECT '{"key": "value"}' IS JSON AS is_json;
+---------+
| is_json |
+---------+
|       1 |
+---------+

MariaDB [(none)]> SELECT '[1, 2, 3]' IS JSON AS is_json;
+---------+
| is_json |
+---------+
|       1 |
+---------+

MariaDB [(none)]> SELECT '"hello"' IS JSON AS is_json;
+---------+
| is_json |
+---------+
|       1 |
+---------+

MariaDB [(none)]> SELECT '42' IS JSON AS is_json;
+---------+
| is_json |
+---------+
|       1 |
+---------+

MariaDB [(none)]> SELECT 'not json' IS JSON AS is_json;
+---------+
| is_json |
+---------+
|       0 |
+---------+

MariaDB [(none)]> SELECT NULL IS JSON AS is_json;
+---------+
| is_json |
+---------+
|    NULL |
+---------+

NULLに対してはUNKNOWN(NULL)を返します。SQL標準の述語としての挙動です。

テーブルでの活用

MariaDB [testdb]> CREATE TABLE json_test (id INT AUTO_INCREMENT PRIMARY KEY, data TEXT);
MariaDB [testdb]> INSERT INTO json_test (data) VALUES
    ->   ('{"name": "Alice"}'),
    ->   ('invalid json'),
    ->   ('[1, 2, 3]'),
    ->   (NULL);

MariaDB [testdb]> SELECT id, data, data IS JSON AS is_valid_json FROM json_test;
+----+-------------------+---------------+
| id | data              | is_valid_json |
+----+-------------------+---------------+
|  1 | {"name": "Alice"} |             1 |
|  2 | invalid json      |             0 |
|  3 | [1, 2, 3]         |             1 |
|  4 | NULL              |          NULL |
+----+-------------------+---------------+

MariaDB [testdb]> SELECT id, data FROM json_test WHERE data IS JSON;
+----+-------------------+
| id | data              |
+----+-------------------+
|  1 | {"name": "Alice"} |
|  3 | [1, 2, 3]         |
+----+-------------------+

WHERE句でdata IS JSONを指定すると、有効なJSONのみが抽出されました。NULL行は条件を満たさず除外されます。

TO_DATE()

MariaDB 12.3では、Oracle形式のフォーマット指定に対応したTO_DATE()関数が追加されました(MDEV-19683)。YYYY-MM-DDなどのフォーマット指定子で文字列を日付に変換できます。

基本的な変換

MariaDB [testdb]> SELECT TO_DATE('2026-06-16', 'YYYY-MM-DD') AS to_date_result;
+---------------------+
| to_date_result      |
+---------------------+
| 2026-06-16 00:00:00 |
+---------------------+

MariaDB [testdb]> SELECT TO_DATE('16/06/2026', 'DD/MM/YYYY') AS to_date_result;
+---------------------+
| to_date_result      |
+---------------------+
| 2026-06-16 00:00:00 |
+---------------------+

MariaDB [testdb]> SELECT TO_DATE('20260616', 'YYYYMMDD') AS to_date_result;
+---------------------+
| to_date_result      |
+---------------------+
| 2026-06-16 00:00:00 |
+---------------------+

sql_mode=ORACLEを設定しなくても、デフォルトのsql_modeで動作します。

STR_TO_DATE()との比較

MariaDB/MySQL系で従来使われてきたSTR_TO_DATE()と結果を比較しました。

MariaDB [testdb]> SELECT STR_TO_DATE('2026-06-16', '%Y-%m-%d') AS str_to_date_result;
+--------------------+
| str_to_date_result |
+--------------------+
| 2026-06-16         |
+--------------------+

MariaDB [testdb]> SELECT TO_DATE('2026-06-16', 'YYYY-MM-DD') AS to_date_result;
+---------------------+
| to_date_result      |
+---------------------+
| 2026-06-16 00:00:00 |
+---------------------+

同じ日付文字列をそれぞれのフォーマット指定で変換すると、同じ日付が得られました。ただしこの例では、STR_TO_DATE()の結果は2026-06-16と表示される一方、TO_DATE()の結果は2026-06-16 00:00:00と時刻部を含む形式で表示されました。

なお、フォーマット指定子の体系が異なり(STR_TO_DATE()%Y-%m-%d形式、TO_DATE()YYYY-MM-DD形式)、単純な置き換えではなくそれぞれ独立した関数です。

CTE UPDATE/DELETE

MariaDB 12.3では、WITH句(CTE)で定義した共通テーブル式をUPDATE文やDELETE文から参照できるようになりました(MDEV-37220)。

テストデータの準備

MariaDB [testdb]> CREATE TABLE orders (id INT PRIMARY KEY, customer_id INT, amount DECIMAL(10,2), status VARCHAR(20));
MariaDB [testdb]> INSERT INTO orders VALUES
    ->   (1, 1, 1000, 'completed'),
    ->   (2, 1, 500, 'completed'),
    ->   (3, 2, 2000, 'pending'),
    ->   (4, 3, 100, 'completed'),
    ->   (5, 3, 50, 'completed');

MariaDB [testdb]> SELECT * FROM orders ORDER BY id;
+----+-------------+---------+-----------+
| id | customer_id | amount  | status    |
+----+-------------+---------+-----------+
|  1 |           1 | 1000.00 | completed |
|  2 |           1 |  500.00 | completed |
|  3 |           2 | 2000.00 | pending   |
|  4 |           3 |  100.00 | completed |
|  5 |           3 |   50.00 | completed |
+----+-------------+---------+-----------+

CTE参照DELETE

合計金額が200未満の顧客の注文を削除します。CTEで対象顧客を特定し、DELETE文から参照します。

MariaDB [testdb]> WITH low_value_customers AS (
    ->   SELECT customer_id FROM orders GROUP BY customer_id HAVING SUM(amount) < 200
    -> )
    -> DELETE FROM orders WHERE customer_id IN (SELECT customer_id FROM low_value_customers);
Query OK, 2 rows affected (0.01 sec)

MariaDB [testdb]> SELECT * FROM orders ORDER BY id;
+----+-------------+---------+-----------+
| id | customer_id | amount  | status    |
+----+-------------+---------+-----------+
|  1 |           1 | 1000.00 | completed |
|  2 |           1 |  500.00 | completed |
|  3 |           2 | 2000.00 | pending   |
+----+-------------+---------+-----------+

customer_id=3(合計150で200未満)の注文2件(id=4, 5)が削除されました。CTE内でDELETE対象のordersテーブル自体を参照する「自己参照」パターンも正常に動作しています。この書き方はMDEV-37220で12.3に追加された機能のため、12.2以前では利用できません。

CTE参照UPDATE

amountが1000以上の注文のstatusをvipに更新します。

MariaDB [testdb]> WITH high_value AS (
    ->   SELECT id FROM orders WHERE amount >= 1000
    -> )
    -> UPDATE orders SET status = 'vip' WHERE id IN (SELECT id FROM high_value);
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

MariaDB [testdb]> SELECT * FROM orders ORDER BY id;
+----+-------------+---------+-----------+
| id | customer_id | amount  | status    |
+----+-------------+---------+-----------+
|  1 |           1 | 1000.00 | vip       |
|  2 |           1 |  500.00 | completed |
|  3 |           2 | 2000.00 | vip       |
+----+-------------+---------+-----------+

amountが1000以上のid=1, 3のstatusがvipに更新されました。CTE参照UPDATEも正常に動作しています。

まとめ

Amazon RDSデータベースプレビュー環境でMariaDB 12.3の新機能を確認しました。IS JSON述語、TO_DATE()関数、CTE参照UPDATE/DELETEのいずれもSQLだけで即確認でき、デフォルトの設定のまま動作しました。特にIS JSON述語はSELECTやWHERE句でのJSON妥当性判定に、TO_DATE()はOracle形式の日付フォーマットを扱う場面に活用できそうです。

なお、今回の確認はプレビュー環境での挙動であり、本番GA提供時に変更される可能性がある点はご留意ください。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事