Delen via


ARITHMETIC_OVERFLOW foutklasse

SQLSTATE: 22003

<message>. <alternative> Stel indien nodig in <config> op 'false' om deze fout te omzeilen.

Parameters

  • message: Een beschrijving van de expressie die de overloop veroorzaakt.
  • alternatief: Advies over het voorkomen van de fout.
  • config: de configuratie-instelling voor het wijzigen van de ANSI-modus.

Uitleg

Een rekenkundige overloop treedt op wanneer Azure Databricks een wiskundige bewerking uitvoert die het maximale bereik overschrijdt van het gegevenstype waarin de bewerking wordt uitgevoerd.

In veel gevallen wordt wiskunde uitgevoerd in het minst voorkomende type operanden van een operator, of het minst voorkomende type van de argumenten van een functie.

Het toevoegen van twee getallen van het type TINYINT kan snel het bereik van typen overschrijden dat is beperkt van -128 tot +127. Andere typen zoals TIMESTAMP en INTERVAL hebben ook een groot, maar eindig bereik.

Zie de definitie voor het gegevenstype voor een definitie van het domein van een type.

Mitigatie

De oplossing voor deze fout is afhankelijk van de oorzaak:

  • Zijn de wiskundige argumenten of een van de invoerargumenten onjuist?

    Corrigeer de gebruikte functies of de invoergegevens waar nodig.

    U kunt ook de volgorde van bewerkingen wijzigen om tussenliggende resultaten in het gewenste bereik te houden.

  • Is het gegevenstype niet het breedste type?

    Verbreed het type door een van de argumenten te gieten naar een type dat voldoende is om de bewerking te voltooien.

    DOUBLE Het kiezen of DECIMAL(38, s) met een geschikte s biedt veel bereik ten koste van afronding.

  • Kunt u overloopvoorwaarden tolereren en vervangen NULLdoor ?

    Wijzig de expressie om de functie te gebruiken die wordt voorgesteld in alternative. Gebruik bijvoorbeeld try_sum in plaats van som.

  • U kunt de expressie niet wijzigen en u krijgt liever verpakte resultaten dan een fout retourneert?

    Als laatste redmiddel schakelt u de ANSI-modus uit door de ansiConfig in te stellen op false.

Voorbeelden

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