Delen via


foutklasse ARITHMETIC_OVERFLOW

SQLSTATE: 22003

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

Parameters

  • bericht: een beschrijving van de expressie die de overloop veroorzaakt.
  • alternatieve: adviseren over het voorkomen van de fout.
  • configuratie: de instelling voor het wijzigen van de ANSI-modus.

Uitleg

Een rekenkundige overloop treedt op wanneer Azure Databricks een wiskundige bewerking uitvoert die groter is dan het maximumbereik van het gegevenstype waarin de bewerking wordt uitgevoerd.

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

Als u twee getallen van het type TINYINT optelt, kan het bereik van typen snel worden overschreden. Dit is beperkt van -128 tot +127. Andere typen, zoals TIMESTAMP en INTERVAL hebben ook een groot, maar eindig bereik.

Zie de definitie voor het gegevenstypevoor 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 functies die worden gebruikt of de invoergegevens, indien van toepassing.

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

  • Is het gegevenstype niet het breedste type?

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

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

  • Kunt u omgaan met overloopomstandigheden en ze vervangen door NULL?

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

  • Kunt u de uitdrukking niet wijzigen en heeft u liever verpakte resultaten dan een foutmelding?

    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;