Share via


ARITHMETIC_OVERFLOW hibaosztály

SQLSTATE: 22003

<message>.<alternative> Ha szükséges, állítsa "false" értékre <config> a hiba megkerüléséhez.

Paraméterek

  • message: A túlcsordulást okozó kifejezés leírása.
  • alternatíva: Tanácsot ad a hiba elkerüléséhez.
  • config: Az ANSI mód módosítására vonatkozó konfigurációs beállítás.

Magyarázat

Aritmetikai túlcsordulás akkor fordul elő, ha az Azure Databricks olyan matematikai műveletet hajt végre, amely meghaladja a műveletet végrehajtó adattípus maximális tartományát.

A matematikát sok esetben egy operátor operandusainak legkevésbé gyakori típusában, vagy a függvény argumentumainak legkevésbé gyakori típusában hajtják végre.

Két típusszám TINYINT hozzáadása gyorsan meghaladhatja a típustartományt, amely a típusra +127-128 korlátozódik. Más típusok, például TIMESTAMP a és INTERVAL a is nagy, de véges tartománnyal rendelkeznek.

A típus tartományának definícióját az adattípus definíciójában találja.

Kezelés

A hiba elhárítása az októl függ:

  • Helytelenek a matematikai vagy a bemeneti argumentumok?

    Javítsa ki a használt függvényeket vagy a bemeneti adatokat a megfelelő módon.

    Megfontolhatja a műveletek átrendezését is, hogy a köztes eredményeket a kívánt tartományban tartsa.

  • Nem az adattípus a legszélesebb típus?

    Bővítse a típust úgy, hogy az argumentumok egyikét egy olyan típusra írja, amely elegendő a művelet végrehajtásához.

    A vagy DECIMAL(38, s) a megfelelővel s való választás DOUBLE sok tartományt biztosít a kerekítés költségén.

  • El tudja tűrni a túlcsordulási feltételeket, és lecserélni őket a-ra NULL?

    Módosítsa a kifejezést a következőben alternativejavasolt függvény használatára: . Például try_sum használjon összeg helyett.

  • Nem módosíthatja a kifejezést, és inkább burkolt eredményeket kap, mint hibát?

    Végső megoldásként tiltsa le az ANSI-módot a ansiConfig értékre falseállításával.

Példák

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