Changeset: 7d750d86d8d8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d750d86d8d8
Modified Files:
        gdk/gdk_analytic.c
Branch: analytics
Log Message:

Check for overflows while calculating window bounds.


diffs (110 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -102,20 +102,26 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
 
 #undef ANALYTICAL_DIFF_IMP
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FIRST_PRECEDING(TPE, LIMIT) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FIRST_PRECEDING(TPE, LIMIT) /* TPE 
is ignored in this case */ \
        do {                                            \
+               lng calc1, calc2;                           \
                j = k;                                      \
                for(; k<i; k++, rb++) {                     \
                        lng rlimit = (lng) LIMIT;               \
-                       *rb = MAX(k - rlimit + !first_half, j); \
+                       SUB_WITH_CHECK(lng, k, lng, rlimit, lng, calc1, 
GDK_lng_max, goto calc_overflow); \
+                       ADD_WITH_CHECK(lng, calc1, lng, !first_half, lng, 
calc2, GDK_lng_max, goto calc_overflow); \
+                       *rb = MAX(calc2, j);                    \
                }                                           \
        } while(0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FIRST_FOLLOWING(TPE, LIMIT) \
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FIRST_FOLLOWING(TPE, LIMIT) /* TPE 
is ignored in this case */ \
        do {                                            \
+               lng calc1, calc2;                           \
                for(; k<i; k++, rb++) {                     \
                        lng rlimit = (lng) LIMIT;               \
-                       *rb = MIN(k + rlimit + !first_half, i); \
+                       ADD_WITH_CHECK(lng, rlimit, lng, k, lng, calc1, 
GDK_lng_max, goto calc_overflow); \
+                       ADD_WITH_CHECK(lng, calc1, lng, !first_half, lng, 
calc2, GDK_lng_max, goto calc_overflow); \
+                       *rb = MIN(calc2, i);                    \
                }                                           \
        } while(0)
 
@@ -255,22 +261,8 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                           \
        } while(0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FIRST_PRECEDING(LIMIT) \
-       do {                                            \
-               j = k;                                      \
-               for(; k<i; k++, rb++) {                     \
-                       lng rlimit = (lng) LIMIT;               \
-                       *rb = MAX(k - rlimit + !first_half, j); \
-               }                                           \
-       } while(0)
-
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FIRST_FOLLOWING(LIMIT) \
-       do {                                            \
-               for(; k<i; k++, rb++) {                     \
-                       lng rlimit = (lng) LIMIT;               \
-                       *rb = MIN(k + rlimit + !first_half, i); \
-               }                                           \
-       } while(0)
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FIRST_PRECEDING(LIMIT) 
ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FIRST_PRECEDING(lng, LIMIT)
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FIRST_FOLLOWING(LIMIT) 
ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_FIRST_FOLLOWING(lng, LIMIT)
 
 #define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_SECOND_PRECEDING(LIMIT) 
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FIRST_PRECEDING(LIMIT)
 #define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_SECOND_FOLLOWING(LIMIT) 
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_FIRST_FOLLOWING(LIMIT)
@@ -1063,7 +1055,7 @@ allocation_error:
 
 #define ANALYTICAL_NTHVALUE_OTHERS                                      \
        do {                                                                \
-               if(nth > (i - j))                                               
\
+               if(nth > (i - j)) /*i should be always at least at value of j 
*/\
                        curval = nil;                                           
    \
                else                                                            
\
                        curval = BUNtail(bpi, nth);                             
    \
@@ -1648,7 +1640,7 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                                                j = start[i];
                                                l = end[i];
                                                for(; j<l; j++)
-                                                       curval += (*cmp)(nil, 
base + ((const var_t *) bp)[j]) != 0;
+                                                       curval += cmp(nil, base 
+ ((const var_t *) bp)[j]) != 0;
                                                *rb = curval;
                                                curval = 0;
                                        }
@@ -1657,7 +1649,7 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                                                j = start[i];
                                                l = end[i];
                                                for(; j<l; j++)
-                                                       curval += 
(*cmp)(Tloc(b, j), nil) != 0;
+                                                       curval += cmp(Tloc(b, 
j), nil) != 0;
                                                *rb = curval;
                                                curval = 0;
                                        }
@@ -1699,15 +1691,16 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
 
 #define ANALYTICAL_SUM_IMP_FP(TPE1, TPE2)       \
        do {                                        \
-               TPE1 *bs, *be;                          \
+               TPE1 *bs;                               \
                BUN parcel;                             \
                for(; i<cnt; i++, rb++) {               \
-                       bs = bp + start[i];                 \
-                       be = bp + end[i];                   \
-                       parcel = (be - bs);                 \
-                       if(dofsum(bs, 0, 0, parcel, &curval, 1, TYPE_##TPE1, 
TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, \
-                                         true, "GDKanalyticalsum") == 
BUN_NONE) { \
-                               goto bailout;                   \
+                       if(end[i] > start[i]) {             \
+                               bs = bp + start[i];             \
+                               parcel = (end[i] - start[i]);   \
+                               if(dofsum(bs, 0, 0, parcel, &curval, 1, 
TYPE_##TPE1, TYPE_##TPE2, NULL, NULL, NULL, 0, 0, true, false, \
+                                                 true, "GDKanalyticalsum") == 
BUN_NONE) { \
+                                       goto bailout;               \
+                               }                               \
                        }                                   \
                        *rb = curval;                       \
                        if(is_##TPE2##_nil(curval))         \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to