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.
  • alternativo: aconselhe 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 no qual a operação é executada.

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

Adicionar dois números de tipo TINYINT pode exceder rapidamente o intervalo de tipos 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 de para o tipo de dados.

Mitigação

A mitigação desse erro depende da causa:

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

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

    Você também pode considerar a reordenação de 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.

  • Não é possível alterar a expressão e você prefere obter resultados encapsulados do que retornar um erro?

    Como último recurso, desabilite o modo ANSI definindo o 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;