Dela via


ARITHMETIC_OVERFLOW felkategori

SQLSTATE: 22003

<message>. <alternative> Om det behövs anger du <config> till "false" för att kringgå det här felet.

Parametrar

  • meddelande: En beskrivning av uttrycket som leder till överflöd.
  • alternativ: Råd om hur du undviker felet.
  • konfiguration: Konfigurationsinställningen för att ändra ANSI-läge.

Förklaring

Ett aritmetiskt spill inträffar när Azure Databricks utför en matematisk åtgärd som överskrider det maximala intervallet för den datatyp där åtgärden utförs.

I många fall utförs matematik i den minst vanliga typen av operander för en operator, eller den minst vanliga typen av argument för en funktion.

Att lägga till två tal av typen TINYINT kan snabbt överskrida den typens gränser, som är begränsade från -128 till +127. Andra typer som TIMESTAMP och INTERVAL har också ett stort men begränsat intervall.

En definition av domänen för en typ finns i definition för datatypen.

Förmildrande omständighet

Hur du åtgärdar det här felet beror på orsaken:

  • Är matematiken eller något av indataargumenten felaktiga?

    Korrigera de funktioner som används eller indata efter behov.

    Du kan också överväga att ordna om åtgärder för att behålla mellanliggande resultat i önskat intervall.

  • Är datatypen inte den bredaste typen?

    Bredda datatypen genom att konvertera ett av argumenten till en datatyp som är tillräcklig för att slutföra operationen.

    Att välja DOUBLE eller DECIMAL(38, s) med en lämplig s ger stor räckvidd på bekostnad av avrundning.

  • Kan du tolerera överflödesförhållanden och ersätta dem med NULL?

    Ändra uttrycket till att använda funktionen som föreslås i alternative. Använd till exempel try_sum i stället för summa.

  • Du kan inte ändra uttrycket och du får hellre omslutna resultat än returnerar ett fel?

    Som en sista utväg inaktiverar du ANSI-läget genom att ange ansiConfig till false.

Exempel

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