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
