Condividi tramite


classe di errore ARITHMETIC_OVERFLOW

SQLSTATE: 22003

<message>. <alternative> Se necessario, impostare <config> su "false" per ignorare questo errore.

Parametri

  • message: una descrizione dell'espressione che causa il overflow.
  • alternativa: consigliare come evitare l'errore.
  • config: impostazione di configurazione per modificare la modalità ANSI.

Spiegazione

Si verifica un overflow aritmetico quando Azure Databricks esegue un'operazione matematica che supera l'intervallo massimo del tipo di dati in cui viene eseguita l'operazione.

In molti casi la matematica viene eseguita nel tipo meno comune degli operandi di un operatore o nel tipo meno comune degli argomenti di una funzione.

L'aggiunta di due numeri di tipo TINYINT può superare rapidamente l'intervallo di tipi limitato da -128 a +127. Altri tipi come TIMESTAMP e INTERVAL hanno anche un intervallo di dimensioni grandi, ma finite.

Per una definizione del dominio di un tipo, vedere la definizione per il tipo di dati.

Mitigazione

La mitigazione per questo errore dipende dalla causa:

  • La matematica o uno degli argomenti di input non è corretto?

    Correggere le funzioni usate o i dati di input in base alle esigenze.

    È anche possibile considerare la riordinazione delle operazioni per mantenere i risultati intermedi nell'intervallo desiderato.

  • Il tipo di dati non è il tipo più ampio?

    Estendere il tipo eseguendo il cast di uno degli argomenti a un tipo sufficiente per completare l'operazione.

    La scelta DOUBLE o DECIMAL(38, s) l'uso di un'ampia s gamma offre un sacco di gamma a costo di arrotondamento.

  • È possibile tollerare le condizioni di overflow e sostituirle con NULL?

    Modificare l'espressione per usare la funzione proposta in alternative. Ad esempio, usare try_sum anziché somma.

  • Non è possibile modificare l'espressione e si ottengono risultati con wrapping anziché restituire un errore?

    Come ultima opzione, disabilitare la modalità ANSI impostando su ansiConfigfalse.

Esempi

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