MySQL HeatWave で動作の制限・制約がある SQL 文 (2) データ型 (1)

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

- **[MySQL HeatWave で動作の制限・制約がある SQL 文 (1) 変更の伝搬に関するもの](https://qiita.com/hmatsu47/items/5bf7b37f694e56f3dc82)**

https://qiita.com/hmatsu47/items/5bf7b37f694e56f3dc82

今回はデータ型の制限です。

## 3. `BLOB`・`BINARY`およびその関連データ型

前回は、

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

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

の中を見るだけで済んだのですが、今回はちょっとややこしいです。

- **[2.16.2 Data Type Limitations](https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-data-types.html)（MySQL HeatWave User Guide）**

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

の前に、

- **[2.10 Supported Data Types](https://dev.mysql.com/doc/heatwave/en/mys-hw-supported-data-types.html)（MySQL HeatWave User Guide）**

https://dev.mysql.com/doc/heatwave/en/mys-hw-supported-data-types.html

を見る必要があります（ここに書かれていないもの＝サポート外）。

ページを見てみると、

- `BLOB`（`LONGBLOB`などを含む）
- `BINARY`・`VARBINARY`

が存在しないのに気付くと思います。

実は、

- **[2.2.2.1 Excluding Table Columns](https://dev.mysql.com/doc/heatwave/en/mys-hw-exclude-table-columns.html)（MySQL HeatWave User Guide）**

https://dev.mysql.com/doc/heatwave/en/mys-hw-exclude-table-columns.html

というページがあり、**サポート外の列は`NOT SECONDARY`で HeatWave へのロード対象から除外** する必要があります。

:::note warn
2023/8/6 時点（MySQL バージョン 8.1.0-u1-cloud）の情報です。
今後、結果などが変わる可能性があります。
:::

### `BLOB`列を除外せずに HeatWave にロードしてみる

まずは、`BLOB`列を持つテーブルを作って、いつものようにセカンダリエンジン（HeatWave）へのロードを試してみます。

```sql
mysql> CREATE DATABASE type_test;
Query OK, 1 row affected (0.01 sec)

mysql> USE type_test;
Database changed
mysql> CREATE TABLE blob_test (id INT NOT NULL AUTO_INCREMENT, val INT NOT NULL, bindata BLOB, PRIMARY KEY(id));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO blob_test SET val = 100, bindata = 'aaaaa';
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO blob_test SET val = 200, bindata = 'bbbbb';
Query OK, 1 row affected (0.00 sec)

mysql> ALTER TABLE blob_test SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
```
ここまでは普通に行けましたが、

```sql
mysql> ALTER TABLE blob_test SECONDARY_LOAD;
ERROR 3877 (HY000): Data type blob not supported by RAPID
```

やはりロードでエラー（`ERROR 3877 (HY000): Data type blob not supported by RAPID`）が出ました。

### `BLOB`列を除外して HeatWave にロードしてみる

`BLOB`列をセカンダリエンジンへのロード対象から除外してロードします。

```sql
mysql> ALTER TABLE blob_test MODIFY bindata BLOB NOT SECONDARY;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE blob_test SECONDARY_LOAD;
Query OK, 0 rows affected (0.28 sec)
```

今度はうまく行きました。

## 4. 長い（65532 バイトを超える）`TEXT`およびその関連データ型

なぜか[前掲ページ（2.10）](https://dev.mysql.com/doc/heatwave/en/mys-hw-supported-data-types.html)に補足事項として記されていないのに、こちらに記載があります。

 - **[2.14 Troubleshooting](https://dev.mysql.com/doc/heatwave/en/mys-hw-troubleshooting.html)（MySQL HeatWave User Guide）**

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

> *Problem:* A table load operation fails with “ERROR HY000: Error while running parallel scan.”
>
> *Solution:* A TEXT-type column value larger than 65532 bytes is rejected during SECONDARY_LOAD operations. Reduce the size of the TEXT-type column value to less than 65532 bytes or exclude the column before loading the table. See Section 2.2.2.1, “Excluding Table Columns”.

> *Problem:* Change propagation fails with the following error: “Blob/text value of n bytes was encountered during change propagation but RAPID supports text values only up to 65532 bytes.”
>
> *Solution:* TEXT-type values larger than 65532 bytes are rejected during change propagation. Reduce the size of TEXT-type values to less than 65532 bytes. Should you encounter this error, check the change propagation status for the affected table. If change propagation is disabled, reload the table. See Section 2.2.7, “Change Propagation”.

### 65532 バイトの`TEXT`列を持つ行を HeatWave にロードしてみる

まずは 65532 バイトで試します。

```sql
mysql> CREATE TABLE text_test (id INT NOT NULL AUTO_INCREMENT, val INT NOT NULL, textdata TEXT, PRIMARY KEY(id));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO text_test SET val = 110, textdata = REPEAT('a', 65532);
Query OK, 1 row affected (0.02 sec)

mysql> ALTER TABLE text_test SECONDARY_ENGINE=RAPID;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE text_test SECONDARY_LOAD;
Query OK, 0 rows affected (0.22 sec)
```

行けましたね。

### 65533 バイトの`TEXT`列を持つ行を追加してみる

この状態で 65533 バイトの`TEXT`列を持つ行を追加（挿入）します。

```sql
mysql> INSERT INTO text_test SET val = 210, textdata = REPEAT('b', 65533);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT id, LENGTH(textdata) FROM text_test;
+----+------------------+
| id | LENGTH(textdata) |
+----+------------------+
|  1 |            65532 |
|  2 |            65533 |
+----+------------------+
2 rows in set (0.00 sec)
```

特にエラーは出ませんね。

しかし、

```sql
mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ id, LENGTH(textdata) FROM text_test;
ERROR 3889 (HY000): Secondary engine operation failed. Reason: "Table `type_test`.`text_test` is not loaded in HeatWave".
```

HeatWave で`SELECT`してみると、エラー（`ERROR 3889 (HY000): Secondary engine operation failed.`）が出ました。

```sql
mysql> DELETE FROM text_test WHERE id = 2;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ id, LENGTH(textdata) FROM text_test;
ERROR 3889 (HY000): Secondary engine operation failed. Reason: "Table `type_test`.`text_test` is not loaded in HeatWave".
```

対象行を`DELETE`しただけではダメで、

```sql
mysql> ALTER TABLE text_test SECONDARY_UNLOAD;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE text_test SECONDARY_LOAD;
Query OK, 0 rows affected (0.25 sec)

mysql> SELECT /*+ SET_VAR(use_secondary_engine=FORCED) */ id, LENGTH(textdata) FROM text_test;
+----+------------------+
| id | LENGTH(textdata) |
+----+------------------+
|  1 |            65532 |
+----+------------------+
1 row in set (0.09 sec)
```

アンロード→再ロードしてエラーが解消されました。

[2.14 Troubleshooting](https://dev.mysql.com/doc/heatwave/en/mys-hw-troubleshooting.html) に記されているとおり、（`BLOB`同様）列をセカンダリエンジンへのロード対象から除外する必要があるようですね。

## 今回はここでおしまい

結局、

- **[2.16.2 Data Type Limitations](https://dev.mysql.com/doc/heatwave/en/mys-hw-limitations-data-types.html)（MySQL HeatWave User Guide）**

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

記載事項の検証には入れませんでした（また次回以降で）。

---

**2023/8/14 追記：**
続きの記事を書きました。

- **[MySQL HeatWave で動作の制限・制約がある SQL 文 (2) データ型 (2)](https://qiita.com/hmatsu47/items/bae9e9c406416069c65b)**

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