Поделиться через


класс ошибок ARITHMETIC_OVERFLOW

SQLSTATE: 22003

<message>. <alternative> При необходимости задайте значение <config> false, чтобы обойти эту ошибку.

Параметры

  • message: описание выражения, вызывающего переполнение.
  • альтернатива: советы о том, как избежать ошибки.
  • config: параметр конфигурации для изменения режима ANSI.

Объяснение

Арифметическое переполнение происходит, когда Azure Databricks выполняет математическую операцию, превышающую максимальный диапазон типа данных, в котором выполняется операция.

Во многих случаях математические вычисления выполняются в наименее распространенном типе операндов оператора или в наименее распространенном типе аргументов функции.

Добавление двух чисел типа TINYINT может быстро превысить диапазон типов, который ограничен от -128 до +127. Другие типы, такие как TIMESTAMP и INTERVAL , также имеют большой, но конечный диапазон.

Определение домена типа см. в определении для типа данных.

Смягчения

Устранение этой ошибки зависит от причины:

  • Являются ли математические или какие-либо из входных аргументов неверными?

    Исправьте используемые функции или входные данные соответствующим образом.

    Вы также можете рассмотреть возможность изменения порядка операций, чтобы сохранить промежуточные результаты в нужном диапазоне.

  • Является ли тип данных не самым широким типом?

    Расширение типа путем приведения одного из аргументов к типу, достаточному для завершения операции.

    DOUBLE Выбор или DECIMAL(38, s) с соответствующим s предоставляет большой диапазон за счет округления.

  • Можете ли вы терпеть условия переполнения и заменить их на NULL?

    Измените выражение, чтобы использовать функцию, предложенную в alternative. Например, используйте try_sum вместо sum.

  • Вы не можете изменить выражение и скорее получить результаты в оболочке, чем возвращать ошибку?

    В крайнем случае отключите режим ANSI, задав для ansiConfig параметра значение false.

Примеры

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