Udostępnij za pośrednictwem


ARITHMETIC_OVERFLOW, klasa błędów

SQLSTATE: 22003

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

Parametry

  • message: opis wyrażenia powodującego przepełnienie.
  • alternatywa: Doradź, jak uniknąć błędu.
  • config: 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 jest wykonywana 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 ograniczony zakres.

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

Łagodzenia

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

  • Czy matematyka lub którykolwiek z argumentów wejściowych są niepoprawne?

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

    Możesz również rozważyć zmiana kolejności operacji w celu zachowania wyników pośrednich w żądanym zakresie.

  • Czy typ danych nie jest najszerszym typem?

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

    Wybór DOUBLE lub DECIMAL(38, s) odpowiedni s zapewnia wiele zakresów kosztem zaokrąglania.

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

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

  • Nie można zmienić wyrażenia i raczej uzyskać opakowane wyniki niż zwracać błąd?

    W ostateczności wyłącz tryb ANSI, ustawiając wartość na ansiConfigfalse.

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;