次の方法で共有


ARITHMETIC_OVERFLOW エラークラス

SQLSTATE: 22003

<message><alternative> 必要に応じて、このエラーをバイパスするために "false" に set<config> します。

Parameters

  • メッセージ: オーバーフローの原因となった式の説明。
  • 別の: エラーを回避する方法についてアドバイスします。
  • 構成: ANSI モードを変更するための構成設定。

説明

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

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

2 つの型 TINYINT を追加すると、-128 から +127に制限されている型の範囲をすぐに超える可能性があります。 TIMESTAMPINTERVAL などの他の型にも、大きな有限範囲があります。

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

緩和

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

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

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

    中間結果を目的の範囲に保つために、操作の並べ替えを検討することもできます。

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

    いずれかの引数を演算を完了するのに十分な型にキャストして、型を拡大します。

    DOUBLE または DECIMAL(38, s) と適切な s を選択すると、丸めが必要になりますが、範囲は広くなります。

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

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

  • 式を変更できませんか。エラーが返されず、ラップされた結果をgetしますか?

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

例示

-- 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;
 200.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;