Compartilhar via


Classe de erro ARITHMETIC_OVERFLOW

SQLSTATE: 22003

<message>.<alternative>Se necessário, defina <config> como “false” para ignorar esse erro.

Parâmetros

  • message: uma descrição da expressão que causa o estouro.
  • alternative: informe como evitar o erro.
  • config: A configuração para alterar o modo ANSI.

Explicação

Um estouro aritmético ocorre quando o Azure Databricks executa uma operação matemática que excede o intervalo máximo do tipo de dados em que a operação é executada.

Em muitos casos, a matemática é executada com o tipo menos comum dos operandos de um operador ou com o tipo menos comum dos argumentos de uma função.

Adicionar dois números do tipo TINYINT pode exceder rapidamente o intervalo de tipos que é limitado de -128 a +127. Outros tipos, como TIMESTAMP e INTERVAL, também têm um intervalo grande, mas finito.

Para obter uma definição do domínio de um tipo, consulte a definição do tipo de dados.

Atenuação

A mitigação desse erro depende da causa:

  • A matemática ou algum dos argumentos de entrada estão incorretos?

    Corrija as funções usadas ou os dados de entrada conforme apropriado.

    Você também pode considerar reordenar as operações para manter resultados intermediários no intervalo desejado.

  • O tipo de dados não é o tipo mais amplo?

    Amplie o tipo convertendo um dos argumentos em um tipo suficiente para concluir a operação.

    Escolher DOUBLE ou DECIMAL(38, s) com um s apropriado fornece um grande intervalo com o custo do arredondamento.

  • Você pode tolerar condições de estouro e substituí-las por NULL?

    Altere a expressão para usar a função proposta em alternative. Por exemplo, use try_sum em vez de sum.

  • Você não pode alterar a expressão e prefere obter resultados encapsulados a retornar um erro?

    Como último recurso, desabilite o modo ANSI definindo ansiConfig como false.

Exemplos

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