Udostępnij za pośrednictwem


ARITHMETIC_OVERFLOW: klasa błędów

SQLSTATE: 22003

<message>. <alternative> W razie potrzeby ustaw <config> na "false", aby ominąć ten błąd.

Parametry

  • komunikatu: opis wyrażenia powodującego przepełnienie.
  • alternatywne: Podaj wskazówki, jak uniknąć błędu.
  • konfiguracji: ustawienie konfiguracji umożliwiające zmianę trybu ANSI.

Wyjaśnienie

Przepełnienie arytmetyczne występuje, gdy usługa Azure Databricks wykonuje operację matematyczną, która przekracza maksymalny zakres typu danych, w którym wykonywana jest operacja.

W wielu przypadkach matematyka jest wykonywana w najmniej typowym typie operandów operatora lub najmniej typowym typem argumentów funkcji.

Dodanie dwóch liczb typu TINYINT może szybko przekroczyć zakres typów, który jest ograniczony z -128 do +127. Inne typy, takie jak TIMESTAMP i INTERVAL również mają duży, ale skończony zakres.

Aby uzyskać definicję domeny typu, zobacz definicję dla typu danych.

Łagodzenia

Ograniczenie ryzyka tego błędu zależy od przyczyny:

  • Czy matematyka czy którykolwiek z argumentów wejściowych jest niepoprawny?

    Popraw używane funkcje lub dane wejściowe odpowiednio.

    Możesz również rozważyć zmianę kolejności operacji, aby zachować wyniki pośrednie w żądanym zakresie.

  • Czy typ danych nie jest najszerszym typem?

    Poszerz typ przez rzutowanie jednego z argumentów do typu wystarczającego do ukończenia operacji.

    Wybór DOUBLE lub DECIMAL(38, s) z odpowiednim s zapewnia dużo zakresu kosztem zaokrąglania.

  • Czy można tolerować warunki przepełnienia i zastąpić je NULL?

    Zmień wyrażenie, aby użyć funkcji proponowanej w alternative. Na przykład użyj try_sum zamiast sum.

  • Nie można zmienić wyrażenia i wolisz otrzymać wynik w postaci opakowanej, zamiast błędu?

    W ostateczności wyłącz tryb ANSI, ustawiając ansiConfig na false.

Przykłady

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