Sdílet prostřednictvím


ARITHMETIC_OVERFLOW třída chyb

SQLSTATE: 22003

<message>. <alternative> Pokud je to nutné, nastavte <config> na false, aby se tato chyba vynechala.

Parametry

  • zpráva: Popis výrazu způsobujícího přetečení.
  • alternativní: Poraďte, jak se vyhnout chybě.
  • konfigurace: Nastavení pro změnu ANSI režimu.

Vysvětlení

K aritmetickému přetečení dochází, když Azure Databricks provádí matematickou operaci, která překračuje maximální rozsah datového typu, ve kterém se operace provádí.

V mnoha případech se matematika provádí v nejméně společném typu operandů operátoru nebo nejméně společném typu argumentů funkce.

Přidání dvou čísel typu TINYINT může rychle překročit rozsah typů, který je omezený z -128 na +127. Jiné typy, jako jsou TIMESTAMP a INTERVAL mají také velký, ale konečný rozsah.

Definice domény typu naleznete v definici pro datový typ.

Zmírnění

Zmírnění této chyby závisí na příčině:

  • Jsou matematické nebo některé ze vstupních argumentů nesprávné?

    Opravte použité funkce nebo vstupní data podle potřeby.

    Můžete také zvážit změna pořadí operací, aby se zachovaly přechodné výsledky v požadovaném rozsahu.

  • Není typ dat ze všech nejširší?

    Rozšiřte typ přetypováním jednoho z argumentů na typ dostatečný k dokončení operace.

    Volba DOUBLE nebo DECIMAL(38, s) s odpovídajícími s poskytuje spoustu rozsahu na úkor zaokrouhlování.

  • Můžete tolerovat podmínky přetečení a nahradit je pomocí NULL?

    Změňte výraz tak, aby používal funkci navrženou v alternative. Například místo sumpoužijte try_sum.

  • Nemůžete změnit výraz a chcete raději získat zabalené výsledky než vrátit chybu?

    Jako poslední možnost zakažte režim ANSI nastavením ansiConfig na false.

Příklady

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