メインコンテンツまでスキップ

ARITHMETIC_OVERFLOW エラークラス

SQLSTATE: 22003

<message>.<alternative> 必要に応じて、 <config> を "false" に設定して、このエラーを回避します。

パラメーター

  • message : オーバーフローの原因となっている式の説明。
  • 代替案 : エラーを回避する方法についてアドバイスします。
  • config : ANSI モードを変更するための設定。

説明

算術オーバーフローは、Databricks が演算が実行されるデータ型の最大範囲を超える数学演算を実行すると発生します。

多くの場合、演算は、演算子のオペランドの最も一般的でない型、または関数の引数の最も一般的でない型で実行されます。

TINYINT つの数値を 2 つ追加すると、-128 から +127に制限されているタイプ範囲をすぐに超える可能性があります。TIMESTAMPINTERVALなどの他のタイプも、範囲は広く、有限です。

タイプのドメインの定義については、 データタイプの定義を参照してください。

緩和

このエラーの軽減策は、原因によって異なります。

  • 数学または入力引数のいずれかが正しくありませんか?

    必要に応じて、使用されている関数または入力データを修正します。

    また、中間結果を目的の範囲に保持するために、操作の順序を変更することも検討できます。

  • データ型が最も幅の広い型ではありませんか?

    引数の 1 つを操作を完了するのに十分な型にキャストして、型を広げます。

    適切なsを持つDOUBLEまたはDECIMAL(38, s)を選択すると、丸めを犠牲にして多くの範囲が提供されます。

  • オーバーフロー状態を許容し、それらを NULLに置き換えることはできますか?

    alternativeで提案されている関数を使用するように式を変更します。たとえば、sum の代わりにtry_sum を使用します。

  • 式を変更することはできず、エラーを返すよりもラップされた結果が得られますか?

    最後の手段として、 ansiConfigfalseに設定して ANSI モードを無効にします。

SQL
-- An overflow of a small numeric
> SELECT 100Y * 100Y;
[ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.

-- Use a wider numeric to perform the operation by casting one of the operands
> SELECT 100Y * cast(100Y AS INTEGER);
10000

-- An overflow of a complex expression which can be rewritten
> SELECT 100Y * 10Y / 5;
[ARITHMETIC_OVERFLOW] 100S * 10S caused overflow.
If necessary set spark.sql.ansi.enabled to "false" (except for ANSI interval type) to bypass this error.

-- Rewrite the expression
> SELECT 100Y / 5 * 10Y;
1.0

-- An occasional overfklow that should be tolerated
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
[ARITHMETIC_OVERFLOW] 100S * 100S caused overflow.
If necessary set ansi_mode to "false" (except for ANSI interval type) to bypass this error.

-- Allowing overflows to be treated as NULL
> SELECT try_multiply(arg1, arg2) FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
NULL
100

-- In Databricks SQL temporarily disable ANSI mode to tolerate incorrect overflow.
> SET ANSI_MODE = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
16
100
> SET ANSI_MODE = true;

-- In Databricks Runtime temporarily disable ANSI mode to tolerate incorrect overflow.
> SET spark.sql.ansi.enabled = false;
> SELECT arg1 * arg2 FROM VALUES(100Y, 100Y), (20Y, 5Y) AS t(arg1, arg2);
16
100
> SET spark.sql.ansi.enabled = true;

関連