ARITHMETIC_OVERFLOW فئة الخطأ

SQLSTATE: 22003

<message>.<alternative> إذا لزم الأمر، فقم بتعيين <config> إلى "خطأ" لتجاوز هذا الخطأ.

معلمات

  • الرسالة: وصف للتعبير الذي يسبب تجاوز السعة.
  • البديل: تقديم المشورة حول كيفية تجنب الخطأ.
  • التكوين: إعداد التكوين لتغيير وضع ANSI.

تفسير

يحدث تجاوز حسابي عندما يقوم Azure Databricks بإجراء عملية رياضية تتجاوز الحد الأقصى لنطاق نوع البيانات الذي يتم فيه تنفيذ العملية.

في كثير من الحالات يتم إجراء العمليات الحسابية في النوع الأقل شيوعا من معاملات عامل التشغيل، أو النوع الأقل شيوعا من وسيطات الدالة.

يمكن أن تتجاوز إضافة رقمين من النوع TINYINT نطاق الأنواع الذي يقتصر من -128 إلى +127. أنواع أخرى مثل TIMESTAMP وأيضا INTERVAL لها نطاق كبير، ولكن محدود.

للحصول على تعريف للمجال من نوع ما، راجع تعريف نوع البيانات.

التخفيف

يعتمد التخفيف من هذا الخطأ على السبب:

  • هل الرياضيات أو أي من وسيطات الإدخال غير صحيحة؟

    قم بتصحيح الدالات المستخدمة أو بيانات الإدخال حسب الاقتضاء.

    قد تفكر أيضا في إعادة ترتيب العمليات للحفاظ على النتائج الوسيطة في النطاق المطلوب.

  • هل نوع البيانات ليس أوسع نوع؟

    وسع النوع عن طريق تحويل إحدى الوسيطات إلى نوع كاف لإكمال العملية.

    DOUBLE اختيار أو DECIMAL(38, s) مع المناسب s يوفر الكثير من النطاق على حساب التقريب.

  • هل يمكنك تحمل شروط تجاوز السعة واستبدالها ب NULL؟

    قم بتغيير التعبير لاستخدام الدالة المقترحة في alternative. على سبيل المثال، استخدم try_sum بدلا من المجموع.

  • لا يمكنك تغيير التعبير وبدلا من الحصول على نتائج ملفوفة بدلا من إرجاع خطأ؟

    كحل أخير، قم بتعطيل وضع ANSI عن طريق تعيين ansiConfig إلى false.

امثله

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