Compartir vía


Clase de error ARITHMETIC_OVERFLOW

SQLSTATE: 22003

<message>. <alternative>Si es necesario, establezca <config> en "false" para omitir este error.

Parámetros

  • message: la descripción de la expresión que provoca el desbordamiento.
  • alternative: consejos sobre cómo evitar el error.
  • config: el valor de configuración para modificar el modo ANSI.

Explicación

Un desbordamiento aritmético se produce cuando Azure Databricks realiza una operación matemática que supera el intervalo máximo del tipo de datos en el que se realiza la operación.

En muchos casos, los cálculos se realizan en el tipo menos común de los operandos de un operador o en el tipo menos común de los argumentos de una función.

Agregar dos números de tipo TINYINT puede superar rápidamente el intervalo de tipos, que está limitado de -128 a +127. Otros tipos, como TIMESTAMP y INTERVAL, también tienen un rango grande, pero finito.

Para obtener una definición del dominio de un tipo, vea la definición del tipo de datos.

Mitigación

La mitigación de este error depende de la causa:

  • ¿Son incorrectos los cálculos o alguno de los argumentos de entrada?

    Corrija las funciones usadas o los datos de entrada según corresponda.

    También puede considerar la posibilidad de reordenar las operaciones para mantener los resultados intermedios en el intervalo deseado.

  • ¿El tipo de datos no es el tipo más amplio?

    Amplíe el tipo convirtiendo uno de los argumentos en un tipo suficiente para completar la operación.

    Elegir DOUBLE o DECIMAL(38, s) con un s adecuado proporciona una gran cantidad de rango a costa del redondeo.

  • ¿Puede tolerar condiciones de desbordamiento y reemplazarlas por NULL?

    Cambie la expresión para usar la función propuesta en alternative. Por ejemplo, use try_sum en lugar de sum.

  • ¿No puede cambiar la expresión y prefiere obtener resultados ajustados que un error?

    Como último recurso, deshabilite el modo ANSI estableciendo ansiConfig en false.

Ejemplos

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