MySQL HeatWave で動作の制限・制約がある SQL 文 (5) その他

こちらの記事の続きです。

- **[MySQL HeatWave で動作の制限・制約がある SQL 文 (4) インデックスヒント・オプティマイザヒント・結合（JOIN）](https://qiita.com/hmatsu47/items/b7d43ff93567f4487ca3)**

https://qiita.com/hmatsu47/items/b7d43ff93567f4487ca3

以下のページに記載の分です。

- **[2.16.7 Other Limitations](https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-other.html)（MySQL HeatWave User Guide）**

https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-other.html

これらについても MySQL HeatWave User Guide に記載された内容を翻訳してそのまま列挙します。

:::note warn
2023/9/9 時点（MySQL バージョン 8.1.0-u2-cloud）の情報です。
今後、制限が変わる可能性があります。
:::

## その他の制限

以下のものが使用不可です（HeatWave にオフロードされず MySQL DB で実行されます）。

- デフォルト以外の SQL モードのほとんど
  - 使用できるのは MySQL HeatWave User Guide の **[2.11 Supported SQL Modes](https://dev.mysql.com/doc/heatwave/en/mys-hw-sql-modes.html)** に列挙された以下のもののみ
    - デフォルト
      - `ONLY_FULL_GROUP_BY`・`STRICT_TRANS_TABLES`・`NO_ZERO_IN_DATE`・`NO_ZERO_DATE`・`ERROR_FOR_DIVISION_BY_ZERO`・`NO_ENGINE_SUBSTITUTION`
    - それ以外
      - `ANSI_QUOTES`・`HIGH_NOT_PRECEDENCE`・`IGNORE_SPACE`・`NO_BACKSLASH_ESCAPES`・`REAL_AS_FLOAT`・`TIME_TRUNCATE_FRACTIONAL`
- `gb18030_chinese_ci`文字セットと照合順序
- `GROUP BY`節の`WITH ROLLUP`修飾子
  - `DISTINCT`の集約を含むクエリ
  - `GROUP BY`キーが重複しているクエリ
- `COUNT(NULL)`が非集約演算子の入力引数として使用されるケース
- `ORDER BY`句または`LIMIT`句を持つ、異なるデータ型を持つ列（カラム）間、辞書エンコード列（カラム）間、または`ENUM`列（カラム）間の`UNION ALL`
- `ORDER BY`・`LIMIT`の有無にかかわらず、異なるデータ型を持つ列（カラム）間、辞書エンコード列間、または`ENUM`列間の`UNION`
- `ORDER BY`・`LIMIT`の有無にかかわらず、異なるデータ型を持つ列（カラム）間、辞書エンコード列間、`ENUM`列間の`UNION`および`UNION ALL`が`IN`句または`EXISTS`句で指定されたサブクエリ内で使用されるケース
- 比較述語、`GROUP BY`、`JOIN`などで、キー列が`DOUBLE PRECISION`のケース
- リレーショナルデータの型変換
  - 例：`SELECT CONCAT(2, L_COMMENT) from LINEITEM;`
- 式やその他の関数を使用した`YEAR`型データのクエリ
  - 例：`SELECT YEAR(d) + 1 FROM t1;`
- 異なる照合順序を持つ列を含む文字列操作
- 明示的なパーティション選択
  - **[24.5 Partition Selection](https://dev.mysql.com/doc/refman/8.0/en/partitioning-selection.html)（MySQL 8.0 Reference Manual）** を参照
- カラム接頭辞を持つ主キー
- 仮想生成列（Virtual generated columns）
- トリガの一部として実行されるクエリ
- ストアド・プログラムを呼び出すクエリ
- ストアド・プログラムの一部として実行されるクエリ
- マルチ・ステートメント・トランザクションの一部であるクエリ
- マテリアライズド・ビュー
  - 通常ビューの使用については **[2.3.9 Using Views](https://dev.mysql.com/doc/heatwave/en/mys-hw-using-views.html)(MySQL HeatWave User Guide )** を参照
- 通常の`SELECT`クエリの部分的なクエリ・オフロード
  - クエリのすべての要素がサポートされている場合にクエリ全体がオフロードされ、そうでない場合、クエリはデフォルトで MySQL DB システムで実行される
  - HeatWave は`CREATE TABLE ... SELECT`および`INSERT ... SELECT`ステートメントをサポートしており、操作の`SELECT`部分のみが HeatWave にオフロードされる
  - **[2.3 Running Queries](https://dev.mysql.com/doc/heatwave/en/mys-hw-running-queries.html)（MySQL HeatWave User Guide）** を参照
- `[H]H:MM`の形式で UTC からのオフセットとして指定され、先頭に`+`または`-`が付く形式の`timezone`を指定する`SET timezone = timezone`
  - `UNIX_TIMESTAMP()`関数と`FROM_UNIXTIME()`関数のみこの形式のタイムゾーン指定をサポート
- 名前付きタイムゾーン
  - タイムゾーンについては **[5.1.15 MySQL Server でのタイムゾーンのサポート](https://dev.mysql.com/doc/refman/8.0/ja/time-zone-support.html)（MySQL 8.0 リファレンスマニュアル）** を参照
- 中間および最終クエリ結果の行サイズが 4MB を超えるケース
- 派生（derived）テーブルに対する連続フィルタ操作
  - 例：テーブル`t1`のテーブルスキャンでテーブル`tt1`のフィルタ`（x < 7）`を使用し、`WHERE`句でテーブル`tt1`の連続フィルタ`（tt1.x > 5）`を使用

```sql
SELECT * FROM (SELECT * FROM t1 WHERE x < 7) tt1,
          (SELECT * FROM t1 WHERE x < y) tt2
          WHERE  tt1.x > 5 AND tt1.x = tt2.x;
```

- 再帰 CTE（共通テーブル式）
- MySQL DB が`SUPER_READ_ONLY`モードで実行されているケースでのデータのロード・アンロード・リカバリなど、`ALTER TABLE`を含む操作
  - MySQL DB のディスク容量が特定の期間、設定した容量以下になると、MySQL DB は`SUPER_READ_ONLY`モードになる
    - **[ヘルス・モニター](https://docs.oracle.com/ja-jp/iaas/mysql-database/doc/health-monitor.html#GUID-03D2825F-D8D1-4305-82B4-6251E0D51CBC)（Oracle Cloud Infrastructure ドキュメント）** を参照