Amazon RDSデータベースプレビュー環境でMariaDB 12.3の新機能を試してみた
はじめに
2026年6月15日付けのAWSの告知で、Amazon RDSデータベースプレビュー環境でMariaDB 12.3が利用可能になったことが発表されました。
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パーティション順序スキャン最適化 | クエリオプティマイザ改善 | - |
各機能の詳細はリリースノートを参照してください。
検証環境
| 項目 | 値 |
|---|---|
| 環境 | 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提供時に変更される可能性がある点はご留意ください。






