Share via


ARITHMETIC_OVERFLOW-Fehlerklasse

SQLSTATE: 22003

<message>.<alternative> Legen Sie bei Bedarf <config> auf „false“ fest, um diesen Fehler zu umgehen.

Parameter

  • message: Eine Beschreibung des Ausdrucks, der den Überlauf verursacht.
  • alternative: Hinweise zur Vermeidung des Fehlers.
  • config: Die Konfigurationseinstellung zur Änderung des ANSI-Modus.

Erklärung

Ein arithmetischer Überlauf tritt auf, wenn Azure Databricks eine mathematische Operation durchführt, die den maximalen Bereich des Datentyps, in dem die Operation durchgeführt wird, überschreitet.

In vielen Fällen wird die Berechnung in dem am wenigsten verbreiteten Typ der Operanden eines Operators oder dem am wenigsten verbreiteten Typ der Argumente einer Funktion ausgeführt.

Die Addition von zwei Zahlen des Typs TINYINT kann schnell den Bereich des Typs überschreiten, der von -128 bis +127 begrenzt ist. Andere Typen wie TIMESTAMP und INTERVAL haben ebenfalls einen großen, aber endlichen Bereich.

Eine Definition der Domäne eines Typs finden Sie in der Definition für den Datentyp.

Lösung

Die Entschärfung dieses Fehlers hängt von der Ursache ab:

  • Sind die Berechnungen oder eines der eingegebenen Argumente falsch?

    Korrigieren Sie ggf. die verwendeten Funktionen oder die Eingabedaten.

    Sie können auch eine Neuordnung der Operationen in Betracht ziehen, damit die Zwischenergebnisse im gewünschten Bereich bleiben.

  • Ist der Datentyp nicht der umfassendste Typ?

    Erweitern Sie den Typ, indem Sie eines der Argumente in einen Typ umwandeln, der ausreicht, um die Operation durchzuführen.

    Die Auswahl von DOUBLE oder DECIMAL(38, s) mit einem geeigneten s bietet einen großen Bereich auf Kosten der Rundung.

  • Können Sie Überlaufbedingungen tolerieren und sie durch NULL ersetzen?

    Ändern Sie den Ausdruck, um die in alternative vorgeschlagene Funktion zu verwenden. Verwenden Sie z. B. try_sum anstelle von sum.

  • Sie können den Ausdruck nicht ändern und erhalten lieber umgebrochene Ergebnisse als eine Fehlermeldung?

    Als letzten Ausweg können Sie den ANSI-Modus deaktivieren, indem Sie ansiConfig auf false festlegen.

Beispiele

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