Changeset: 12c725a03550 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=12c725a03550
Modified Files:
        gdk/gdk_analytic.c
        sql/test/analytics/Tests/analytics02.sql
Branch: analytics
Log Message:

Overlapping rows for product aggregate on a window.


diffs (truncated from 1080 to 300 lines):

diff --git a/gdk/gdk_analytic.c b/gdk/gdk_analytic.c
--- a/gdk/gdk_analytic.c
+++ b/gdk/gdk_analytic.c
@@ -1430,8 +1430,9 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                        rp += ncnt;                            \
                        IMP(TPE1, TPE2)                        \
                } else if (o || force_order) {             \
-                       bp += cnt;                             \
-                       rp += cnt;                             \
+                       ncnt = cnt;                            \
+                       bp += ncnt;                            \
+                       rp += ncnt;                            \
                        IMP(TPE1, TPE2)                        \
                } else {                                   \
                        for(; rb<rend; rb++, bp++) {           \
@@ -1453,7 +1454,7 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                                  "GDKanalyticalsum") == BUN_NONE) { \
                        goto bailout;                            \
                }                                            \
-               TPE2 curval = *rb;                           \
+               curval = *rb;                                \
                for (;rb < rp; rb++)                         \
                        *rb = curval;                            \
                if(is_##TPE2##_nil(curval))                  \
@@ -1464,6 +1465,7 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
        do {                                                 \
                TPE1 *bs, *bl, *be;                              \
                bl = pbp;                                        \
+               (void) curval;                                   \
                for(; pbp<bp; pbp++) {                           \
                        bs = (pbp-start > bl) ? pbp - start : bl;    \
                        be = (pbp+end < bp) ? pbp + end + 1 : bp;    \
@@ -1477,48 +1479,6 @@ GDKanalyticalcount(BAT *r, BAT *b, BAT *
                }                                                \
        } while(0);
 
-#define ANALYTICAL_SUM_FP_IMP(TPE1, TPE2, IMP) \
-       do {                                       \
-               TPE1 *bp, *pbp;                        \
-               TPE2 *rp, *rb, *rend;                  \
-               bp = pbp = (TPE1*)Tloc(b, 0);          \
-               rb = rp = (TPE2*)Tloc(r, 0);           \
-               rend = rp + cnt;                       \
-               if (p) {                               \
-                       pnp = np = (bit*)Tloc(p, 0);       \
-                       nend = np + cnt;                   \
-                       for(; np<nend; np++) {             \
-                               if (*np) {                     \
-                                       ncnt = np - pnp;           \
-                                       bp += ncnt;                \
-                                       rp += ncnt;                \
-                                       IMP(TPE1, TPE2)            \
-                                       pnp = np;                  \
-                                       pbp = bp;                  \
-                               }                              \
-                       }                                  \
-                       ncnt = (np - pnp);                 \
-                       bp += ncnt;                        \
-                       rp += ncnt;                        \
-                       IMP(TPE1, TPE2)                    \
-               } else if (o || force_order) {         \
-                       ncnt = cnt;                        \
-                       bp += ncnt;                        \
-                       rp += ncnt;                        \
-                       IMP(TPE1, TPE2)                    \
-               } else {                               \
-                       for(; rb<rend; rb++, bp++) {       \
-                               if(is_##TPE1##_nil(*bp)) {     \
-                                       *rb = TPE2##_nil;          \
-                                       has_nils = true;           \
-                               } else {                       \
-                                       *rb = (TPE2) *bp;          \
-                               }                              \
-                       }                                  \
-               }                                      \
-               goto finish;                           \
-       } while(0);
-
 gdk_return
 GDKanalyticalsum(BAT *r, BAT *b, BAT *p, BAT *o, bit force_order, int tp1, int 
tp2, BUN start, BUN end)
 {
@@ -1614,7 +1574,7 @@ GDKanalyticalsum(BAT *r, BAT *b, BAT *p,
                        case TYPE_flt: {
                                switch (tp1) {
                                        case TYPE_flt:
-                                               ANALYTICAL_SUM_FP_IMP(flt, flt, 
ANALYTICAL_SUM_FP_NO_OVERLAP);
+                                               ANALYTICAL_SUM_IMP(flt, flt, 
ANALYTICAL_SUM_FP_NO_OVERLAP);
                                                break;
                                        default:
                                                goto nosupport;
@@ -1624,10 +1584,10 @@ GDKanalyticalsum(BAT *r, BAT *b, BAT *p,
                        case TYPE_dbl: {
                                switch (tp1) {
                                        case TYPE_flt:
-                                               ANALYTICAL_SUM_FP_IMP(flt, dbl, 
ANALYTICAL_SUM_FP_NO_OVERLAP);
+                                               ANALYTICAL_SUM_IMP(flt, dbl, 
ANALYTICAL_SUM_FP_NO_OVERLAP);
                                                break;
                                        case TYPE_dbl:
-                                               ANALYTICAL_SUM_FP_IMP(dbl, dbl, 
ANALYTICAL_SUM_FP_NO_OVERLAP);
+                                               ANALYTICAL_SUM_IMP(dbl, dbl, 
ANALYTICAL_SUM_FP_NO_OVERLAP);
                                                break;
                                        default:
                                                goto nosupport;
@@ -1724,7 +1684,7 @@ GDKanalyticalsum(BAT *r, BAT *b, BAT *p,
                        case TYPE_flt: {
                                switch (tp1) {
                                        case TYPE_flt:
-                                               ANALYTICAL_SUM_FP_IMP(flt, flt, 
ANALYTICAL_SUM_FP_OVERLAP);
+                                               ANALYTICAL_SUM_IMP(flt, flt, 
ANALYTICAL_SUM_FP_OVERLAP);
                                                break;
                                        default:
                                                goto nosupport;
@@ -1734,10 +1694,10 @@ GDKanalyticalsum(BAT *r, BAT *b, BAT *p,
                        case TYPE_dbl: {
                                switch (tp1) {
                                        case TYPE_flt:
-                                               ANALYTICAL_SUM_FP_IMP(flt, dbl, 
ANALYTICAL_SUM_FP_OVERLAP);
+                                               ANALYTICAL_SUM_IMP(flt, dbl, 
ANALYTICAL_SUM_FP_OVERLAP);
                                                break;
                                        case TYPE_dbl:
-                                               ANALYTICAL_SUM_FP_IMP(dbl, dbl, 
ANALYTICAL_SUM_FP_OVERLAP);
+                                               ANALYTICAL_SUM_IMP(dbl, dbl, 
ANALYTICAL_SUM_FP_OVERLAP);
                                                break;
                                        default:
                                                goto nosupport;
@@ -1767,183 +1727,182 @@ finish:
 #undef ANALYTICAL_SUM_IMP
 #undef ANALYTICAL_SUM_NO_OVERLAP
 #undef ANALYTICAL_SUM_OVERLAP
-
-#undef ANALYTICAL_SUM_FP_IMP
 #undef ANALYTICAL_SUM_FP_NO_OVERLAP
 #undef ANALYTICAL_SUM_FP_OVERLAP
 
-#define ANALYTICAL_PROD_IMP_NORMAL(TPE1, TPE2, TPE3)             \
-       do {                                                         \
-               TPE1 *pbp, *bp, v;                                       \
-               TPE2 *rp, *rb, curval = TPE2##_nil;                      \
-               pbp = bp = (TPE1*)Tloc(b, 0);                            \
-               rb = rp = (TPE2*)Tloc(r, 0);                             \
-               if (p) {                                                 \
-                       pnp = np = (bit*)Tloc(p, 0);                         \
-                       nend = np + cnt;                                     \
-                       for(; np<nend; np++) {                               \
-                               if (*np) {                                      
 \
-                                       ncnt = np - pnp;                        
     \
-                                       bp += ncnt;                             
     \
-                                       rp += ncnt;                             
     \
-                                       for(; pbp<bp; pbp++) {                  
     \
-                                               v = *pbp;                       
         \
-                                               if (!is_##TPE1##_nil(v)) {      
         \
-                                                       
if(is_##TPE2##_nil(curval))          \
-                                                               curval = (TPE2) 
v;               \
-                                                       else                    
             \
-                                                               
MUL4_WITH_CHECK(TPE1, v, TPE2,   \
-                                                                       curval, 
TPE2, curval,        \
-                                                                       
GDK_##TPE2##_max, TPE3,      \
-                                                                       goto 
calc_overflow);         \
-                                               }                               
         \
-                                       }                                       
     \
-                                       for (;rb < rp; rb++)                    
     \
-                                               *rb = curval;                   
         \
-                                       if(is_##TPE2##_nil(curval))             
     \
-                                               has_nils = true;                
         \
-                                       else                                    
     \
-                                               curval = TPE2##_nil;            
         \
-                                       pnp = np;                               
     \
-                                       pbp = bp;                               
     \
-                               }                                               
 \
-                       }                                                    \
-                       ncnt = np - pnp;                                     \
-                       bp += ncnt;                                          \
-                       rp += ncnt;                                          \
-                       for(; pbp<bp; pbp++) {                               \
-                               v = *pbp;                                       
 \
-                               if (!is_##TPE1##_nil(v)) {                      
 \
-                                       if(is_##TPE2##_nil(curval))             
     \
-                                               curval = (TPE2) v;              
         \
-                                       else                                    
     \
-                                               MUL4_WITH_CHECK(TPE1, v, TPE2, 
curval,   \
-                                                       TPE2, curval, 
GDK_##TPE2##_max, TPE3,\
-                                                       goto calc_overflow);    
             \
-                               }                                               
 \
-                       }                                                    \
-                       if(is_##TPE2##_nil(curval))                          \
-                               has_nils = true;                                
 \
-                       for (;rb < rp; rb++)                                 \
-                               *rb = curval;                                   
 \
-               } else if (o || force_order) {                           \
-                       TPE1 *bend = bp + cnt;                               \
-                       for(; bp<bend; bp++) {                               \
-                               v = *bp;                                        
 \
-                               if(!is_##TPE1##_nil(v)) {                       
 \
-                                       if(is_##TPE2##_nil(curval))             
     \
-                                               curval = (TPE2) v;              
         \
-                                       else                                    
     \
-                                               MUL4_WITH_CHECK(TPE1, v, TPE2, 
curval,   \
-                                                       TPE2, curval, 
GDK_##TPE2##_max,      \
-                                                       TPE3, goto 
calc_overflow);           \
-                               }                                               
 \
-                       }                                                    \
-                       rp += cnt;                                           \
-                       for(;rb < rp; rb++)                                  \
-                               *rb = curval;                                   
 \
-                       if(is_##TPE2##_nil(curval))                          \
-                               has_nils = true;                                
 \
-               } else { /* single value, ie no ordering */              \
-                       TPE2 *rend = rb + cnt;                               \
-                       for(; rb<rend; rb++, bp++)  {                        \
-                               v = *bp;                                        
 \
-                               if(is_##TPE1##_nil(v)) {                        
 \
-                                       *rb = TPE2##_nil;                       
     \
-                                       has_nils = true;                        
     \
-                               } else {                                        
 \
-                                       *rb = (TPE2) v;                         
     \
-                               }                                               
 \
-                       }                                                    \
-               }                                                        \
-               goto finish;                                             \
+#define ANALYTICAL_PROD_IMP_NO_OVERLAP(TPE1, TPE2, TPE3) \
+       do {                                                 \
+               for(; pbp<bp; pbp++) {                           \
+                       v = *pbp;                                    \
+                       if (!is_##TPE1##_nil(v)) {                   \
+                               if(is_##TPE2##_nil(curval))              \
+                                       curval = (TPE2) v;                   \
+                               else                                     \
+                                       MUL4_WITH_CHECK(TPE1, v, TPE2, curval, 
TPE2, curval, GDK_##TPE2##_max, TPE3, goto calc_overflow); \
+                       }                                            \
+               }                                                \
+               for (;rb < rp; rb++)                             \
+                       *rb = curval;                                \
+               if(is_##TPE2##_nil(curval))                      \
+                       has_nils = true;                             \
+               else                                             \
+                       curval = TPE2##_nil;                         \
+       } while (0);
+
+#define ANALYTICAL_PROD_IMP_OVERLAP(TPE1, TPE2, TPE3) \
+       do {                                              \
+               TPE1 *bs, *bl, *be;                           \
+               bl = pbp;                                     \
+               for(; pbp<bp;pbp++) {                         \
+                       bs = (pbp-start > bl) ? pbp - start : bl; \
+                       be = (pbp+end < bp) ? pbp + end + 1 : bp; \
+                       for(; bs<be; bs++) {                      \
+                               v = *bs;                              \
+                               if (!is_##TPE1##_nil(v)) {            \
+                                       if(is_##TPE2##_nil(curval))       \
+                                               curval = (TPE2) v;            \
+                                       else                              \
+                                               MUL4_WITH_CHECK(TPE1, v, TPE2, 
curval, TPE2, curval, GDK_##TPE2##_max, TPE3, \
+                                                                               
goto calc_overflow); \
+                               }                                     \
+                       }                                         \
+                       *rb = curval;                             \
+                       rb++;                                     \
+                       if(is_##TPE2##_nil(curval))               \
+                               has_nils = true;                      \
+                       else                                      \
+                               curval = TPE2##_nil;                  \
+               }                                             \
        } while(0);
 
-#define ANALYTICAL_PROD_IMP_LIMIT(TPE1, TPE2, REAL_IMP)    \
-       do {                                                   \
-               TPE1 *pbp, *bp, v;                                 \
-               TPE2 *rp, *rb, curval = TPE2##_nil;                \
-               pbp = bp = (TPE1*)Tloc(b, 0);                      \
-               rb = rp = (TPE2*)Tloc(r, 0);                       \
-               if (p) {                                           \
-                       pnp = np = (bit*)Tloc(p, 0);                   \
-                       nend = np + cnt;                               \
-                       for(; np<nend; np++) {                         \
-                               if (*np) {                                 \
-                                       ncnt = np - pnp;                       \
-                                       bp += ncnt;                            \
-                                       rp += ncnt;                            \
-                                       for(; pbp<bp; pbp++) {                 \
-                                               v = *pbp;                       
   \
-                                               if (!is_##TPE1##_nil(v)) {      
   \
-                                                       
if(is_##TPE2##_nil(curval))    \
-                                                               curval = (TPE2) 
v;         \
-                                                       else                    
       \
-                                                               REAL_IMP(TPE1, 
v, TPE2,    \
-                                                                       curval, 
curval,        \
-                                                                       
GDK_##TPE2##_max,      \
-                                                                       goto 
calc_overflow);   \
-                                               }                               
   \
-                                       }                                      \
-                                       for (;rb < rp; rb++)                   \
-                                               *rb = curval;                   
   \
-                                       if(is_##TPE2##_nil(curval))            \
-                                               has_nils = true;                
   \
-                                       else                                   \
-                                               curval = TPE2##_nil;            
   \
-                                       pbp = bp;                              \
-                                       pnp = np;                              \
-                               }                                          \
-                       }                                              \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to