Teilen über


ARITHMETIC_OVERFLOW-Fehlerklasse

SQLSTATE: 22003

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

Parameter

  • Nachricht: Eine Beschreibung des Ausdrucks, der den Überlauf verursacht.
  • alternative: Empfehlen Sie, wie Sie den Fehler vermeiden können.
  • config: Konfigurationseinstellung zum Ändern des ANSI-Modus

Erklärung

Ein arithmetischer Überlauf tritt auf, wenn Azure Databricks einen mathematischen Vorgang ausführt, der den maximalen Bereich des Datentyps überschreitet, in dem der Vorgang ausgeführt wird.

In vielen Fällen wird Mathematik im am wenigsten gebräuchlichen Typ der Operanden eines Operators oder der am wenigsten häufig verwendete 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 auch einen großen, aber begrenzten Bereich.

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

Milderung

Die Entschärfung für diesen Fehler hängt von der Ursache ab:

  • Sind die Mathematik oder eines der Eingabeargumente falsch?

    Korrigieren Sie die verwendeten Funktionen oder die Eingabedaten entsprechend.

    Sie können auch die Neuanordnung von Vorgängen in Betracht ziehen, um zwischengeschaltete Ergebnisse im gewünschten Bereich beizubehalten.

  • Ist der Datentyp nicht der breiteste Typ?

    Erweitern Sie den Typ, indem Sie eines der Argumente auf einen Typ umwandeln, der zum Abschließen des Vorgangs ausreicht.

    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 NULLersetzen?

    Ändern Sie den Ausdruck, um die in alternativevorgeschlagene Funktion zu verwenden. Verwenden Sie beispielsweise try_sum anstelle von sum.

  • Sie können den Ausdruck nicht ändern und bevorzugen es, stattdessen eingepackte Ergebnisse zu erhalten, anstatt einen Fehler zurückzugeben?

    Deaktivieren Sie als letztes Mittel den ANSI-Modus, indem Sie die ansiConfig auf falsefestlegen.

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;