Pular para o conteúdo principal

Classe de erro ARITHMETIC_OVERFLOW

SQLSTATE: 22003

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

Parâmetros

  • mensagem : uma descrição da expressão que está causando o estouro.
  • alternativa : aconselhar sobre como evitar o erro.
  • config : A definição de configuração para alterar o modo ANSI.

Explicação

Um estouro aritmético ocorre quando o site 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 do tipo TINYINT pode exceder rapidamente a faixa de tipos, que é limitada 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.

Mitigaçã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.

    O senhor também pode considerar a possibilidade de reordenar as operações para manter os resultados intermediários no intervalo desejado.

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

    Amplie o tipo convertendo um dos argumentos em um tipo suficiente para concluir as operações.

    Escolher DOUBLE ou DECIMAL(38, s) com um s apropriado oferece uma grande variedade ao custo do arredondamento.

  • Você pode tolerar condições de transbordamento 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 agrupados do que retornar um erro?

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

Exemplos

SQL
-- 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;
1.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;

Relacionado