Share via


Classe d’erreur ARITHMETIC_OVERFLOW

SQLSTATE : 22003

<message>.<alternative>Si nécessaire, définissez <config> sur « false » pour contourner cette erreur.

Paramètres

  • message : description de l’expression provoquant le dépassement de capacité.
  • alternative : conseil sur la façon d’éviter l’erreur.
  • config : paramètre de configuration pour modifier le mode ANSI.

Explication

Un dépassement arithmétique se produit quand Azure Databricks effectue une opération mathématique qui dépasse la plage maximale du type de données dans lequel l’opération est effectuée.

Dans de nombreux cas, les mathématiques sont effectuées dans le type le moins commun des opérandes d’un opérateur, ou le type le moins commun des arguments d’une fonction.

L’ajout de deux nombres de type TINYINT peut rapidement dépasser la plage de types limitée de -128 à +127. D’autres types tels que TIMESTAMP et INTERVAL ont également une grande plage, mais finie.

Pour obtenir une définition du domaine d’un type, consultez la définition du type de données.

Limitation des risques

La manière d’atténuer l’erreur dépendra de sa cause :

  • Les arguments d’entrée sont-ils incorrects ?

    Corrigez les fonctions utilisées ou les données d’entrée selon les besoins.

    Vous pouvez également envisager de réorganiser les opérations pour conserver les résultats intermédiaires dans la plage souhaitée.

  • Le type de données n’est-il pas le type le plus large ?

    Étendez le type en faisant passer l’un des arguments à un type suffisant pour terminer l’opération.

    Le choix de DOUBLE ou DECIMAL(38, s) avec un s approprié offre un grand nombre de plages au coût de l’arrondi.

  • Pouvez-vous tolérer les conditions de dépassement de capacité et les remplacer par NULL?

    Modifiez l’expression pour utiliser la fonction proposée dans alternative. Par exemple, utilisez try_sum au lieu de sum.

  • Vous ne pouvez pas modifier l’expression et vous obtenez plutôt des résultats encapsulés au lieu d’un renvoi d’erreur ?

    En dernier recours, désactivez le mode ANSI en définissant ansiConfig sur false.

Exemples

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