ARITHMETIC_OVERFLOW hibafeltétel

SQLSTATE: 22003

<message>. <alternative> Szükség esetén állítsa a <config> "false" értékre a hiba megkerüléséhez.

Paraméterek

  • üzenet: A túlcsordulást okozó kifejezés leírása.
  • alternatív: Tanácsok a hiba elkerüléséhez.
  • konfiguráció: Az ANSI-mód módosítására szolgáló beállítás.

Magyarázat

A számtani túlcsordulás akkor fordul elő, ha az Azure Databricks olyan matematikai műveletet hajt végre, amely meghaladja a művelet végrehajtásához szükséges 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 TINYINT típusú szám összeadása gyorsan meghaladhatja a típustartományt, amely -128 és +127között van. Más típusok, például a TIMESTAMP és a INTERVAL is nagy, de véges tartománysal rendelkeznek.

Egy típus tartományának definícióját lásd a definíciónál azadattípus esetén.

Mérséklés

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

  • Helytelen a matematikai vagy bármely bemeneti argumentum?

    Szükség szerint javítsa ki a használt függvényeket vagy a bemeneti adatokat.

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

  • Az adattípus nem a legszélesebb típus?

    Szélesítse a típust úgy, hogy az egyik argumentumot egy olyan típusra adhatja, amely elegendő a művelet végrehajtásához.

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

  • El tudja viselni a túlcsordulási feltételeket, és lecserélheti őket NULL?

    Módosítsa a kifejezést a alternativejavasolt függvény használatára. Használja például a try_sum formát a sumhelyett.

  • Nem módosíthatja a kifejezést, és inkább becsomagolt eredményeket kap, mint hibaüzenetet ad vissza?

    Végső megoldásként tiltsa le az ANSI módot a ansiConfigfalsebeá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;