TiFlash 互換性に関する注意事項

次の状況では、TiFlash は TiDB と互換性がありません。

  • TiFlash 計算レイヤーでは:

    • オーバーフローした数値のチェックはサポートされていません。たとえば、 BIGINTタイプ9223372036854775807 + 9223372036854775807の 2 つの最大値を加算します。 TiDB でのこの計算の予想される動作は、 ERROR 1690 (22003): BIGINT value is out of rangeエラーを返すことです。ただし、この計算を TiFlash で実行すると、オーバーフロー値-2がエラーなしで返されます。

    • ウィンドウ関数はサポートされていません。

    • TiKV からのデータの読み取りはサポートされていません。

    • 現在、TiFlash のsum関数は文字列型の引数をサポートしていません。しかし、TiDB は、コンパイル中に文字列型の引数がsum関数に渡されたかどうかを識別できません。したがって、 select sum(string_col) from tのようなステートメントを実行すると、TiFlash は[FLASH:Coprocessor:Unimplemented] CastStringAsReal is not supported.エラーを返します。このようなエラーを回避するには、この SQL ステートメントをselect sum(cast(string_col as double)) from tに変更する必要があります。

    • 現在、TiFlash の 10 進数除算の計算は TiDB のそれと互換性がありません。たとえば、10 進数を除算する場合、TiFlash は常にコンパイルから推測された型を使用して計算を実行します。ただし、TiDB は、コンパイルから推測される型よりも正確な型を使用して、この計算を実行します。そのため、10 進数除算を含む一部の SQL 文は、TiDB + TiKV と TiDB + TiFlash で実行した場合に異なる実行結果を返します。例えば:

      mysql> create table t (a decimal(3,0), b decimal(10, 0)); Query OK, 0 rows affected (0.07 sec) mysql> insert into t values (43, 1044774912); Query OK, 1 row affected (0.03 sec) mysql> alter table t set tiflash replica 1; Query OK, 0 rows affected (0.07 sec) mysql> set session tidb_isolation_read_engines='tikv'; Query OK, 0 rows affected (0.00 sec) mysql> select a/b, a/b + 0.0000000000001 from t where a/b; +--------+-----------------------+ | a/b | a/b + 0.0000000000001 | +--------+-----------------------+ | 0.0000 | 0.0000000410001 | +--------+-----------------------+ 1 row in set (0.00 sec) mysql> set session tidb_isolation_read_engines='tiflash'; Query OK, 0 rows affected (0.00 sec) mysql> select a/b, a/b + 0.0000000000001 from t where a/b; Empty set (0.01 sec)

      上記の例では、コンパイルから推測されるa/bの型は、TiDB と TiFlash の両方でDecimal(7,4)です。 Decimal(7,4)によって制約され、 a/bの返される型は0.0000である必要があります。 TiDB では、 a/bの実行時の精度がDecimal(7,4)よりも高いため、元のテーブル データはwhere a/bの条件によってフィルター処理されません。ただし、TiFlash では、 a/bの計算は結果の型としてDecimal(7,4)を使用するため、元のテーブル データはwhere a/bの条件でフィルター処理されます。