Changeset: 4c818e5217c5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4c818e5217c5
Modified Files:
        gdk/gdk_analytic_bounds.c
        sql/server/rel_select.c
        sql/test/analytics/Tests/analytics02.sql
        sql/test/analytics/Tests/analytics02.stable.err
        sql/test/analytics/Tests/analytics06.stable.err
        sql/test/analytics/Tests/analytics06.stable.out
Branch: window-tunning
Log Message:

For a more strict SQL compliance, the range frame will be available to numeric 
types only. Added shortcut in the range bounds for 'current row' case, ie peer 
rows


diffs (truncated from 784 to 300 lines):

diff --git a/gdk/gdk_analytic_bounds.c b/gdk/gdk_analytic_bounds.c
--- a/gdk/gdk_analytic_bounds.c
+++ b/gdk/gdk_analytic_bounds.c
@@ -230,7 +230,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                ANALYTICAL_WINDOW_BOUNDS_GROUPS##IMP(TPE, LIMIT, UPCAST);       
\
        } while (0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_PRECEDING(TPE1, LIMIT, TPE2) \
+#define ANALYTICAL_WINDOW_BOUNDS_RANGE_PRECEDING(TPE1, LIMIT, TPE2) \
        do {                                                            \
                lng m = k - 1;                                          \
                TPE1 v, calc;                                           \
@@ -281,7 +281,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_FOLLOWING(TPE1, LIMIT, TPE2) \
+#define ANALYTICAL_WINDOW_BOUNDS_RANGE_FOLLOWING(TPE1, LIMIT, TPE2) \
        do {                                                            \
                TPE1 v, calc;                                           \
                TPE2 rlimit;                                            \
@@ -325,7 +325,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                }                                                       \
        } while (0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(TPE1, IMP, LIMIT, TPE2)    \
+#define ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(TPE1, IMP, LIMIT, TPE2)      \
        do {                                                            \
                TPE1 *restrict bp = (TPE1*)Tloc(b, 0);                  \
                if (np) {                                               \
@@ -338,122 +338,23 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                IMP(TPE1, LIMIT, TPE2);                         \
        } while (0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_PRECEDING(LIMIT, TPE)  \
-       do {                                                            \
-               lng m = k - 1;                                          \
-               TPE rlimit = 0;         \
-               if (b->tnonil) {                                        \
-                       for (; k < i; k++) {                    \
-                               TPE olimit = LIMIT;     \
-                               if (is_##TPE##_nil(olimit) || olimit < 0)       
\
-                                       goto invalid_bound;     \
-                               rlimit = (TPE) olimit;                  \
-                               void *v = BUNtail(bpi, (BUN) k);        \
-                               for (j = k; ; j--) {                    \
-                                       void *next;                     \
-                                       if (j == m)                     \
-                                               break;                  \
-                                       next = BUNtail(bpi, (BUN) j);   \
-                                       if (ABSOLUTE((TPE) atomcmp(v, next)) > 
olimit) \
-                                               break;                  \
-                               }                                       \
-                               rb[k] = ++j;                                    
\
-                       }                                               \
-               } else {                                                \
-                       for (; k < i; k++) {                    \
-                               TPE olimit = LIMIT;     \
-                               if (is_##TPE##_nil(olimit) || olimit < 0)       
\
-                                       goto invalid_bound;     \
-                               rlimit = (TPE) olimit;                  \
-                               void *v = BUNtail(bpi, (BUN) k);        \
-                               if (atomcmp(v, nil) == 0) {             \
-                                       for (j = k; ; j--) {            \
-                                               if (j == m)             \
-                                                       break;          \
-                                               if (atomcmp(BUNtail(bpi, (BUN) 
j), nil) != 0) \
-                                                       break;          \
-                                       }                               \
-                               } else {                                \
-                                       for (j = k; ; j--) {            \
-                                               void *next;             \
-                                               if (j == m)             \
-                                                       break;          \
-                                               next = BUNtail(bpi, (BUN) j); \
-                                               if (atomcmp(next, nil) == 0) \
-                                                       break;          \
-                                               if (ABSOLUTE((TPE) atomcmp(v, 
next)) > rlimit) \
-                                                       break;          \
-                                       }                               \
-                               }                                       \
-                               rb[k] = ++j;                                    
\
-                       }                                               \
-               }                                                       \
-       } while (0)
-
-#define ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE_FOLLOWING(LIMIT, TPE)  \
-       do {                                                            \
-               if (b->tnonil) {                                        \
-                       for (; k < i; k++) {                    \
-                               void *v = BUNtail(bpi, (BUN) k);        \
-                               for (j = k + 1; j < i; j++) {           \
-                                       void *next = BUNtail(bpi, (BUN) j); \
-                                       if (ABSOLUTE((TPE) atomcmp(v, next)) > 
(TPE) LIMIT) \
-                                               break;                  \
-                               }                                       \
-                               rb[k] = j;                              \
-                       }                                               \
-               } else {                                                \
-                       for (; k < i; k++) {                    \
-                               void *v = BUNtail(bpi, (BUN) k);        \
-                               if (atomcmp(v, nil) == 0) {             \
-                                       for (j = k + 1; j < i; j++) {   \
-                                               if (atomcmp(BUNtail(bpi, (BUN) 
j), nil) != 0) \
-                                                       break;          \
-                                       }                               \
-                               } else {                                \
-                                       for (j = k + 1; j < i; j++) {   \
-                                               void *next = BUNtail(bpi, (BUN) 
j); \
-                                               if (atomcmp(next, nil) == 0) \
-                                                       break;          \
-                                               if (ABSOLUTE((TPE) atomcmp(v, 
next)) > (TPE) LIMIT) \
-                                                       break;          \
-                                       }                               \
-                               }                                       \
-                               rb[k] = j;                              \
-                       }                                               \
-               }                                                       \
-       } while (0)
-
 #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_NUM(IMP, LIMIT, CAST)  \
        do {                                                            \
                switch (tp1) {                                          \
-               case TYPE_bit:                                          \
-               case TYPE_flt:                                          \
-               case TYPE_dbl:                                          \
-                       goto type_not_supported;                        \
                case TYPE_bte:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bte, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \
                        break;                                          \
                case TYPE_sht:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(sht, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \
                        break;                                          \
                case TYPE_int:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(int, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \
                        break;                                          \
                case TYPE_lng:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(lng, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, lng); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, lng); \
                        break;                                          \
-               default: {                                              \
-                       if (p) {                                        \
-                               np = (bit*)Tloc(p, 0);                  \
-                               for (; i < cnt; i++) {                  \
-                                       if (np[i])                      \
-                                               
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, CAST); \
-                               }                                       \
-                       }                                       \
-                       i = cnt;                                \
-                       ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, 
CAST); \
-               }                                                       \
+               default:                                                \
+                       goto type_not_supported;        \
                }                                                       \
        } while (0)
 
@@ -461,7 +362,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
        do {                                                            \
                switch (tp1) {                                          \
                        case TYPE_flt:                                  \
-                               ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(flt, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, flt); \
+                               ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(flt, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, flt); \
                                break;                                  \
                        default:                                        \
                                goto type_not_supported;                \
@@ -472,7 +373,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
        do {                                                            \
                switch (tp1) {                                          \
                        case TYPE_dbl:                                  \
-                               ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(dbl, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, dbl); \
+                               ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(dbl, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, dbl); \
                                break;                                  \
                        default:                                        \
                                goto type_not_supported;                \
@@ -483,36 +384,23 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
 #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_HGE(IMP, LIMIT)                
\
        do {                                                            \
                switch (tp1) {                                          \
-               case TYPE_bit:                                          \
-               case TYPE_flt:                                          \
-               case TYPE_dbl:                                          \
-                       goto type_not_supported;                        \
                case TYPE_bte:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(bte, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(bte, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \
                        break;                                          \
                case TYPE_sht:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(sht, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(sht, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \
                        break;                                          \
                case TYPE_int:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(int, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(int, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \
                        break;                                          \
                case TYPE_lng:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(lng, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(lng, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \
                        break;                                          \
                case TYPE_hge:                                          \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED(hge, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE##IMP, LIMIT, hge); \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_NUM(hge, 
ANALYTICAL_WINDOW_BOUNDS_RANGE##IMP, LIMIT, hge); \
                        break;                                          \
-               default: {                                              \
-                       if (p) {                                        \
-                               np = (bit*)Tloc(p, 0);          \
-                               for (; i < cnt; i++) {          \
-                                       if (np[i])                      \
-                                               
ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, hge); \
-                               }                                       \
-                       }                                       \
-                       i = cnt;                                \
-                       ANALYTICAL_WINDOW_BOUNDS_VARSIZED_RANGE##IMP(LIMIT, 
hge); \
-               }                                                       \
+               default:                                                \
+                       goto type_not_supported;        \
                }                                                       \
        } while (0)
 #endif
@@ -527,7 +415,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
 #define timestamp_add_msec(T,M)                timestamp_add_usec(T, (M)*1000)
 #define timestamp_sub_msec(T,M)                timestamp_add_usec(T, -(M)*1000)
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME_PRECEDING(TPE1, LIMIT, 
TPE2, SUB, ADD) \
+#define ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME_PRECEDING(TPE1, LIMIT, TPE2, SUB, 
ADD) \
        do {                                                                    
                                                        \
                lng m = k - 1;                                                  
                                                \
                TPE1 v, vmin, vmax;                                             
                                                \
@@ -579,7 +467,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                } \
        } while(0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME_FOLLOWING(TPE1, LIMIT, 
TPE2, SUB, ADD) \
+#define ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME_FOLLOWING(TPE1, LIMIT, TPE2, SUB, 
ADD) \
        do {                                                                    
                                                        \
                TPE1 v, vmin, vmax;                                             
                                                \
                if (b->tnonil) {                                                
                                                \
@@ -624,7 +512,7 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
                } \
        } while(0)
 
-#define ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(TPE1, IMP, LIMIT, TPE2, SUB, 
ADD) \
+#define ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(TPE1, IMP, LIMIT, TPE2, SUB, ADD) \
        do { \
                TPE1 *restrict bp = (TPE1*)Tloc(b, 0); \
                if (p) {                                                \
@@ -639,26 +527,33 @@ GDKanalyticaldiff(BAT *r, BAT *b, BAT *p
 
 #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_MONTH_INTERVAL(IMP, 
LIMIT) \
        do { \
-               if (tp1 == TYPE_date) { \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(date, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, int, date_sub_month, 
date_add_month); \
-               } else if (tp1 == TYPE_timestamp) { \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(timestamp, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, int, 
timestamp_sub_month, timestamp_add_month); \
-               } else { \
-                       goto type_not_supported; \
-               } \
+               switch (tp1) {  \
+               case TYPE_date:         \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, 
ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, int, date_sub_month, 
date_add_month); \
+                       break;          \
+               case TYPE_timestamp:    \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, 
ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, int, timestamp_sub_month, 
timestamp_add_month); \
+                       break;  \
+               default:        \
+                       goto type_not_supported;        \
+               }               \
        } while(0)
 
 #define ANALYTICAL_WINDOW_BOUNDS_BRANCHES_RANGE_MTIME_SEC_INTERVAL(IMP, LIMIT) 
\
        do { \
-               if (tp1 == TYPE_daytime) { \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(daytime, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, lng, daytime_sub_msec, 
daytime_add_msec); \
-               } else if (tp1 == TYPE_date) { \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(date, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, lng, date_sub_msec, 
date_add_msec); \
-               } else if (tp1 == TYPE_timestamp) { \
-                       ANALYTICAL_WINDOW_BOUNDS_CALC_FIXED_MTIME(timestamp, 
ANALYTICAL_WINDOW_BOUNDS_FIXED_RANGE_MTIME##IMP, LIMIT, lng, 
timestamp_sub_msec, timestamp_add_msec); \
-               } else { \
-                       goto type_not_supported; \
-               } \
+               switch (tp1) {  \
+               case TYPE_date:         \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(date, 
ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, date_sub_msec, 
date_add_msec); \
+                       break;          \
+               case TYPE_daytime:              \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(daytime, 
ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, daytime_sub_msec, 
daytime_add_msec); \
+                       break;          \
+               case TYPE_timestamp:            \
+                       ANALYTICAL_WINDOW_BOUNDS_CALC_MTIME(timestamp, 
ANALYTICAL_WINDOW_BOUNDS_RANGE_MTIME##IMP, LIMIT, lng, timestamp_sub_msec, 
timestamp_add_msec); \
+                       break;  \
+               default:                \
+                       goto type_not_supported;        \
+               }       \
        } while(0)
 
 static gdk_return
@@ -701,6 +596,197 @@ GDKanalyticalallbounds(BAT *r, BAT *b, B
        return GDK_SUCCEED;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to