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

Distinguish unbounded limit from others, due to possible overflow in 
calculation on range frames.


diffs (94 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -123,6 +123,19 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                        *rb = --curval;                          \
        } while(0);
 
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_START(TPE) \
+       do {                                                    \
+               TPE *bl = pbp;                                      \
+               for(; pbp<bp; pbp++, rb++)                          \
+                       *rb = (int)(pbp - bl);                          \
+       } while(0);
+
+#define ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_END(TPE) \
+       do {                                                  \
+               for(; pbp<bp; pbp++, rb++)                        \
+                       *rb = (int)(bp - pbp);                        \
+       } while(0);
+
 #define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_START(TPE) \
        do {                                                \
                TPE *bl = pbp-1, *bs, v, blimit = (TPE) limit;  \
@@ -275,6 +288,19 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                        *rb = --curval;                        \
        } while(0);
 
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_START \
+       do {                                                  \
+               BUN j = k;                                        \
+               for(; k<i; k++, rb++)                             \
+                       *rb = (k - j);                                \
+       } while(0);
+
+#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_END \
+       do {                                                \
+               for(; k<i; k++, rb++)                           \
+                       *rb = (i - k);                              \
+       } while(0);
+
 #define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_START \
        do {                                              \
                void *v;                                      \
@@ -459,14 +485,16 @@ GDKanalyticalwindowbounds(BAT *r, BAT *b
        BATiter bpi = bat_iterator(b);
        int (*atomcmp)(const void *, const void *) = ATOMcompare(tpe);
 
-       if(unit == 0) {
+       if(unit == 3) {
+               ANALYTICAL_WINDOW_BOUNDS_BRANCHES(_ALL)
+       } else if(limit == GDK_int_max) {
+               ANALYTICAL_WINDOW_BOUNDS_BRANCHES(_UNBOUNDED)
+       } else if(unit == 0) {
                ANALYTICAL_WINDOW_BOUNDS_BRANCHES(_ROWS)
        } else if(unit == 1) {
                ANALYTICAL_WINDOW_BOUNDS_BRANCHES(_RANGE)
        } else if(unit == 2) {
                ANALYTICAL_WINDOW_BOUNDS_BRANCHES(_GROUPS)
-       } else if(unit == 3) {
-               ANALYTICAL_WINDOW_BOUNDS_BRANCHES(_ALL)
        } else {
                assert(0);
        }
@@ -476,22 +504,26 @@ GDKanalyticalwindowbounds(BAT *r, BAT *b
        return GDK_SUCCEED;
 }
 
+#undef ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_START
+#undef ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_END
+#undef ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_START
+#undef ANALYTICAL_WINDOW_BOUNDS_FIXED_UNBOUNDED_END
 #undef ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_START
 #undef ANALYTICAL_WINDOW_BOUNDS_FIXED_ROWS_END
 #undef ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_START
 #undef ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_END
 #undef ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_START
 #undef ANALYTICAL_WINDOW_BOUNDS_FIXED_GROUPS_END
-#undef ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_START
-#undef ANALYTICAL_WINDOW_BOUNDS_FIXED_ALL_END
+#undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_START
+#undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_END
+#undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_START
+#undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_UNBOUNDED_END
 #undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_START
 #undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ROWS_END
 #undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_START
 #undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_END
 #undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_START
 #undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_GROUPS_END
-#undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_START
-#undef ANALYTICAL_WINDOW_BOUNDS_VARSIZED_ALL_END
 #undef ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED
 #undef ANALYTICAL_WINDOW_BOUNDS_BRANCHES
 #undef ANALYTICAL_WINDOW_BOUNDS_LIMIT
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to