다음을 통해 공유


ARITHMETIC_OVERFLOW 오류 클래스

SQLSTATE: 22003

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

매개 변수

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

설명

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

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

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

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

완화

이 오류의 완화 방법은 원인에 따라 달라집니다.

  • 수학 또는 입력 인수가 잘못되었나요?

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

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

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

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

    적절한 DOUBLE와 함께 DECIMAL(38, s) 또는 s을 선택하면 더 많은 범위를 제공하지만, 반올림이 필요하게 됩니다.

  • 오버플로 조건을 감당하고 NULL로 대체할 수 있나요?

    제안된 함수 alternative를 사용하여 식을 변경합니다. 예를 들어 합계대신 try_sum을 사용해 보세요.

  • 식을 변경할 수 없으며, 오류를 반환하기보다는 래핑된 결과를 얻기를 원하십니까?

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

예제

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