Partilhar via


classe de erro ARITHMETIC_OVERFLOW

SQLSTATE: 22003

<message>.<alternative> Se necessário, defina <config> como "falso" para ignorar este erro.

Parâmetros

  • mensagem: uma descrição da expressão que causa a capacidade excedida.
  • alternativa: aconselhe sobre como evitar o erro.
  • configuração: a definição de configuração para alterar o modo ANSI.

Explicação

Um excesso 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 é realizada 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 que está limitado de -128 a +127. Outros tipos, como TIMESTAMP e INTERVAL também têm um intervalo grande, mas finito.

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

Mitigação

A mitigação deste erro depende da causa:

  • A matemática ou algum dos argumentos de entrada está incorreto?

    Corrija as funções utilizadas ou os dados de entrada conforme adequado.

    Também pode considerar reordenar operações para manter os resultados intermédios no intervalo pretendido.

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

    Alargue o tipo ao lançar um dos argumentos para um tipo suficiente para concluir a operação.

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

  • Pode tolerar condições de capacidade excedida e substituí-las NULLpor ?

    Altere a expressão para utilizar a função proposta em alternative. Por exemplo, utilize try_sum em vez de somar.

  • Não pode alterar a expressão e prefere obter resultados moldados do que devolver um erro?

    Como último recurso, desative o modo ANSI ao definir como ansiConfigfalse.

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;