Changeset: 04369d14a3b0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=04369d14a3b0
Modified Files:
        gdk/gdk_calc.c
        
sql/test/BugDay_2005-11-09_2.9.3/Tests/integer_overflow.SF-1048671.stable.err
        sql/test/BugTracker-2009/Tests/overflow.SF-2853458.stable.err
        sql/test/BugTracker-2012/Tests/predicate_select.Bug-3090.stable.err
Branch: default
Log Message:

Moved the generation of overflow messages down.
This way the message can (and now does) contain the values that caused
the problem.
This fixes part of the problem in bug 3189.


diffs (truncated from 735 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -30,6 +30,22 @@
  * (if available) for +, -, *.  For division the output type can be
  * either input type of flt or dbl. */
 
+/* format strings for the six basic types we deal with */
+#define FMTbte "%d"
+#define FMTsht "%d"
+#define FMTint "%d"
+#define FMTlng LLFMT
+#define FMTflt "%.9g"
+#define FMTdbl "%.17g"
+#define FMToid OIDFMT
+
+/* Most of the internal routines return a count of the number of NIL
+ * values the produced.  They indicate an error by returning a value
+ * >= BUN_NONE.  BUN_NONE means that the error was dealt with by
+ * calling GDKerror (generally for overflow or conversion errors).
+ * BUN_NONE+1 is returned by the DIV and MOD functions to indicate
+ * division by zero.  */
+
 static int
 checkbats(BAT *b1, BAT *b2, const char *func)
 {
@@ -128,8 +144,14 @@ checkbats(BAT *b1, BAT *b2, const char *
                                ((TYPE3 *) dst)[k] = TYPE3##_nil;       \
                        } else if (CHECK(((const TYPE1 *) lft)[i],      \
                                         ((const TYPE2 *) rgt)[j])) {   \
-                               if (abort_on_error)                     \
+                               if (abort_on_error) {                   \
+                                       GDKerror("%s: shift operand too large 
in " \
+                                                
#FUNC"("FMT##TYPE1","FMT##TYPE2").\n", \
+                                                func,                  \
+                                                ((const TYPE1 *) lft)[i], \
+                                                ((const TYPE2 *) rgt)[j]); \
                                        goto checkfail;                 \
+                               }                                       \
                                ((TYPE3 *)dst)[k] = TYPE3##_nil;        \
                                nils++;                                 \
                        } else {                                        \
@@ -858,6 +880,14 @@ VARcalcisnotnil(ValPtr ret, const ValRec
 /* ---------------------------------------------------------------------- */
 /* addition (any numeric type) */
 
+#define ON_OVERFLOW(TYPE1, TYPE2, OP)                          \
+       do {                                                    \
+               GDKerror("22003!overflow in calculation "       \
+                        FMT##TYPE1 OP FMT##TYPE2 ".\n",        \
+                        lft[i], rgt[j]);                       \
+               return BUN_NONE;                                \
+       } while (0)
+
 #define ADD_3TYPE(TYPE1, TYPE2, TYPE3)                                 \
 static BUN                                                             \
 add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, int incr1,           \
@@ -881,7 +911,7 @@ add_##TYPE1##_##TYPE2##_##TYPE3(const TY
                        ADD_WITH_CHECK(TYPE1, lft[i],                   \
                                       TYPE2, rgt[j],                   \
                                       TYPE3, dst[k],                   \
-                                      return BUN_NONE);                \
+                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
                }                                                       \
        }                                                               \
        CANDLOOP(dst, k, TYPE3##_nil, end, cnt);                        \
@@ -1828,9 +1858,6 @@ add_typeswitchloop(const void *lft, int 
                goto unsupported;
        }
 
-       if (nils == BUN_NONE)
-               GDKerror("22003!overflow in calculation.\n");
-
        return nils;
 
   unsupported:
@@ -2093,7 +2120,7 @@ sub_##TYPE1##_##TYPE2##_##TYPE3(const TY
                } else if (rgt[j] < 1) {                                \
                        if (GDK_##TYPE3##_max + rgt[j] < lft[i]) {      \
                                if (abort_on_error)                     \
-                                       return BUN_NONE;                \
+                                       ON_OVERFLOW(TYPE1, TYPE2, "-"); \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
@@ -2102,7 +2129,7 @@ sub_##TYPE1##_##TYPE2##_##TYPE3(const TY
                } else {                                                \
                        if (GDK_##TYPE3##_min + rgt[j] >= lft[i]) {     \
                                if (abort_on_error)                     \
-                                       return BUN_NONE;                \
+                                       ON_OVERFLOW(TYPE1, TYPE2, "-"); \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
@@ -3054,9 +3081,6 @@ sub_typeswitchloop(const void *lft, int 
                goto unsupported;
        }
 
-       if (nils == BUN_NONE)
-               GDKerror("22003!overflow in calculation.\n");
-
        return nils;
 
   unsupported:
@@ -3316,10 +3340,10 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(const TY
                        nils++;                                         \
                } else {                                                \
                        MUL4_WITH_CHECK(TYPE1, lft[i],                  \
-                                      TYPE2, rgt[j],                   \
-                                      TYPE3, dst[k],                   \
-                                      TYPE4,                           \
-                                      return BUN_NONE);                \
+                                       TYPE2, rgt[j],                  \
+                                       TYPE3, dst[k],                  \
+                                       TYPE4,                          \
+                                       ON_OVERFLOW(TYPE1, TYPE2, "*")); \
                }                                                       \
        }                                                               \
        CANDLOOP(dst, k, TYPE3##_nil, end, cnt);                        \
@@ -3374,7 +3398,8 @@ mul_##TYPE1##_##TYPE2##_lng(const TYPE1 
                } else {                                                \
                        LNGMUL_CHECK(TYPE1, lft[i],                     \
                                     TYPE2, rgt[j],                     \
-                                    dst[k], return BUN_NONE);          \
+                                    dst[k],                            \
+                                    ON_OVERFLOW(TYPE1, TYPE2, "*"));   \
                }                                                       \
        }                                                               \
        CANDLOOP(dst, k, lng_nil, end, cnt);                            \
@@ -3405,7 +3430,7 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(const TY
                        if (ABSOLUTE(lft[i]) > 1 &&                     \
                            GDK_##TYPE3##_max / ABSOLUTE(lft[i]) < 
ABSOLUTE(rgt[j])) { \
                                if (abort_on_error)                     \
-                                       return BUN_NONE;                \
+                                       ON_OVERFLOW(TYPE1, TYPE2, "*"); \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
@@ -4331,9 +4356,6 @@ mul_typeswitchloop(const void *lft, int 
                goto unsupported;
        }
 
-       if (nils == BUN_NONE)
-               GDKerror("22003!overflow in calculation.\n");
-
        return nils;
 
   unsupported:
@@ -4539,7 +4561,7 @@ div_##TYPE1##_##TYPE2##_##TYPE3(const TY
                        nils++;                                         \
                } else if (rgt[j] == 0) {                               \
                        if (abort_on_error)                             \
-                               return BUN_NONE;                        \
+                               return BUN_NONE + 1;                    \
                        dst[k] = TYPE3##_nil;                           \
                        nils++;                                         \
                } else {                                                \
@@ -4573,8 +4595,11 @@ div_##TYPE1##_##TYPE2##_##TYPE3(const TY
                           (ABSOLUTE(rgt[j]) < 1 &&                     \
                            GDK_##TYPE3##_max * ABSOLUTE(rgt[j]) < lft[i])) { \
                        /* only check for overflow, not for underflow */ \
-                       if (abort_on_error)                             \
-                               return BUN_NONE + (rgt[j] != 0);        \
+                       if (abort_on_error) {                           \
+                               if (rgt[j] == 0)                        \
+                                       return BUN_NONE + 1;            \
+                               ON_OVERFLOW(TYPE1, TYPE2, "/");         \
+                       }                                               \
                        dst[k] = TYPE3##_nil;                           \
                        nils++;                                         \
                } else {                                                \
@@ -5608,10 +5633,8 @@ div_typeswitchloop(const void *lft, int 
                goto unsupported;
        }
 
-       if (nils == BUN_NONE)
+       if (nils == BUN_NONE + 1)
                GDKerror("22012!division by zero.\n");
-       else if (nils == BUN_NONE + 1)
-               GDKerror("22003!overflow in calculation.\n");
 
        return nils;
 
@@ -5648,7 +5671,7 @@ BATcalcdiv(BAT *b1, BAT *b2, BAT *s, int
                                  cand, candend, b1->H->seq,
                                  abort_on_error, "BATcalcdiv");
 
-       if (nils == BUN_NONE) {
+       if (nils >= BUN_NONE) {
                BBPunfix(bn->batCacheid);
                return NULL;
        }
@@ -5691,7 +5714,7 @@ BATcalcdivcst(BAT *b, const ValRecord *v
                                  cand, candend, b->H->seq,
                                  abort_on_error, "BATcalcdivcst");
 
-       if (nils == BUN_NONE) {
+       if (nils >= BUN_NONE) {
                BBPunfix(bn->batCacheid);
                return NULL;
        }
@@ -5752,7 +5775,7 @@ BATcalccstdiv(const ValRecord *v, BAT *b
                                  cand, candend, b->H->seq,
                                  abort_on_error, "BATcalccstdiv");
 
-       if (nils == BUN_NONE) {
+       if (nils >= BUN_NONE) {
                BBPunfix(bn->batCacheid);
                return NULL;
        }
@@ -5777,7 +5800,7 @@ VARcalcdiv(ValPtr ret, const ValRecord *
                               VALptr(rgt), rgt->vtype, 0,
                               VALget(ret), ret->vtype, 1,
                               0, 1, NULL, NULL, 0,
-                              abort_on_error, "VARcalcdiv") == BUN_NONE)
+                              abort_on_error, "VARcalcdiv") >= BUN_NONE)
                return GDK_FAIL;
        return GDK_SUCCEED;
 }
@@ -5806,7 +5829,7 @@ mod_##TYPE1##_##TYPE2##_##TYPE3(const TY
                        nils++;                                         \
                } else if (rgt[j] == 0) {                               \
                        if (abort_on_error)                             \
-                               return BUN_NONE;                        \
+                               return BUN_NONE + 1;                    \
                        dst[k] = TYPE3##_nil;                           \
                        nils++;                                         \
                } else {                                                \
@@ -5838,7 +5861,7 @@ mod_##TYPE1##_##TYPE2##_##TYPE3(const TY
                        nils++;                                         \
                } else if (rgt[j] == 0) {                               \
                        if (abort_on_error)                             \
-                               return BUN_NONE;                        \
+                               return BUN_NONE + 1;                    \
                        dst[k] = TYPE3##_nil;                           \
                        nils++;                                         \
                } else {                                                \
@@ -6669,7 +6692,7 @@ mod_typeswitchloop(const void *lft, int 
                goto unsupported;
        }
 
-       if (nils == BUN_NONE)
+       if (nils == BUN_NONE + 1)
                GDKerror("22012!division by zero.\n");
 
        return nils;
@@ -6707,7 +6730,7 @@ BATcalcmod(BAT *b1, BAT *b2, BAT *s, int
                                  cand, candend, b1->H->seq,
                                  abort_on_error, "BATcalcmod");
 
-       if (nils == BUN_NONE) {
+       if (nils >= BUN_NONE) {
                BBPunfix(bn->batCacheid);
                return NULL;
        }
@@ -6750,7 +6773,7 @@ BATcalcmodcst(BAT *b, const ValRecord *v
                                  cand, candend, b->H->seq,
                                  abort_on_error, "BATcalcmodcst");
 
-       if (nils == BUN_NONE) {
+       if (nils >= BUN_NONE) {
                BBPunfix(bn->batCacheid);
                return NULL;
        }
@@ -6793,7 +6816,7 @@ BATcalccstmod(const ValRecord *v, BAT *b
                                  cand, candend, b->H->seq,
                                  abort_on_error, "BATcalccstmod");
 
-       if (nils == BUN_NONE) {
+       if (nils >= BUN_NONE) {
                BBPunfix(bn->batCacheid);
                return NULL;
        }
@@ -6818,7 +6841,7 @@ VARcalcmod(ValPtr ret, const ValRecord *
                               VALptr(rgt), rgt->vtype, 0,
                               VALget(ret), ret->vtype, 1,
                               0, 1, NULL, NULL, 0,
-                              abort_on_error, "VARcalcmod") == BUN_NONE)
+                              abort_on_error, "VARcalcmod") >= BUN_NONE)
                return GDK_FAIL;
        return GDK_SUCCEED;
 }
@@ -7631,12 +7654,10 @@ lsh_typeswitchloop(const void *lft, int 
 
        return nils;
 
-  checkfail:
-       GDKerror("%s: shift operand too large.\n", func);
-       return BUN_NONE;
   unsupported:
        GDKerror("%s: bad input types %s,%s.\n", func,
                 ATOMname(tp1), ATOMname(tp2));
+  checkfail:
        return BUN_NONE;
 }
 
@@ -7891,12 +7912,10 @@ rsh_typeswitchloop(const void *lft, int 
 
        return nils;
 
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to