暗黙のコンバージョン

DuneSQLは、数値および文字列の値を可能であれば適切な型に暗黙的に変換します。 DuneSQLは、文字型と数値型の間で暗黙的に変換することはありません。 例えば、VARCHARを期待するクエリは、BIGINT値を自動的に同等のVARCHARに変換しません。

必要に応じて、cast関数を使用して値を特定の型に明示的にキャストできます。

数値型での暗黙的キャスト

DuneSQLは、INT256およびUINT256と他の数値型(INTEGERBIGINTEGERDECIMALDOUBLE)との操作で暗黙的キャストをサポートしています。これにより、INT256およびUINT256を使用する際に明示的にキャストを追加する必要がなくなります。

DuneSQLがINT256またはUINT256と他の数値型の共通の型を見つける必要がある場合、一般的に大きい方の型を選択します。 INT256UINT256よりも大きいと見なされます。このため、INT256UINT256の値を同じ式に含めようとすると、オーバーフローエラーが発生する可能性があります。

TINYINTSMALLINTINTEGERBIGINT、および小数点以下の桁数が0のDECIMAL型(例:DECIMAL(2,0))は、INT256またはUINT256に変換されます。UINT256への変換の一部は、この型が負の値を保持できないため失敗します。

INT256またはUINT256と小数点以下の桁数が0でないDECIMAL型(例:DECIMAL(2,1))との操作の場合、結果の型はDOUBLEになります。また、INT256またはUINT256REALまたはDOUBLE型との操作の場合も、結果の型はDOUBLEになります。DOUBLEは近似数値型であるため、変換により精度が失われることがあります。DuneSQLの変換規則を上書きするには、明示的なキャストを使用できます。

暗黙的変換では、この算術式:

SELECT 2 * UINT256 '1';

は次の式と同等になります:

SELECT CAST(2 AS UINT256) * UINT256 '1';

同様に、この比較式:

SELECT INT256 '1' > 0;

は次の式と同等になります:

SELECT INT256 '1' > CAST(0 AS INT256);

DuneSQLは他の多くのコンテキストでも暗黙的コンバージョンを使用します。

以下はその例です:

SELECT COALESCE(1, INT256 '2');
-- INT256に解決されます
SELECT CASE
    WHEN false THEN BIGINT '0'
    WHEN false THEN INT256 '1'
    WHEN true THEN UINT256 '2'
END;
-- INT256に解決されます