다음을 통해 공유


ARITHMETIC_OVERFLOW 오류 클래스

SQLSTATE: 22003

<message>. <alternative> 필요한 경우 이 오류를 무시하려면 "false"로 설정합니다 <config> .

매개 변수

  • message: 오버플로를 유발하는 식에 대한 설명입니다.
  • 대안: 오류를 방지하는 방법에 대해 조언합니다.
  • config: ANSI 모드를 변경하는 구성 설정입니다.

설명

산술 오버플로는 Azure Databricks가 연산이 수행되는 데이터 형식의 최대 범위를 초과하는 수학 연산을 수행할 때 발생합니다.

대부분의 경우 연산자의 피연산자의 최소 공통 형식 또는 함수 인수의 최소 공통 형식에서 수학이 수행됩니다.

두 개의 형식 TINYINT 수를 추가하면 에서 로 제한 -128 되는 형식 범위를 빠르게 초과할 +127수 있습니다. 및 INTERVAL 와 같은 TIMESTAMP 다른 형식에도 크지만 유한한 범위가 있습니다.

형식의 도메인에 대한 정의는 데이터 형식에 대한 정의를 참조하세요.

완화 방법

이 오류에 대한 완화는 원인에 따라 달라집니다.

  • 수학 또는 입력 인수가 올바르지 않은가요?

    사용된 함수 또는 입력 데이터를 적절하게 수정합니다.

    중간 결과를 원하는 범위로 유지하기 위해 작업의 순서를 다시 지정하는 것도 고려할 수 있습니다.

  • 데이터 형식이 가장 넓은 형식이 아닌가요?

    인수 중 하나를 작업을 완료하기에 충분한 형식으로 캐스팅하여 형식을 확장합니다.

    DOUBLE 또는 DECIMAL(38, s) 를 적절하게 s 선택하면 반올림 시 많은 범위가 제공됩니다.

  • 오버플로 조건을 허용하고 ?(?)로 NULL바꿀 수 있나요?

    에 제안된 함수를 사용하도록 식을 변경합니다 alternative. 예를 들어 합계 대신 try_sum 사용합니다.

  • 식을 변경할 수 없으며 오류를 반환하는 것보다 래핑된 결과를 얻을 수 있나요?

    최후의 수단으로 를 로 설정하여 ANSI 모드를 ansiConfigfalse사용하지 않도록 설정합니다.

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