Changeset: 92f9d7980dd3 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=92f9d7980dd3
Modified Files:
        gdk/gdk_aggr.c
Branch: Feb2013
Log Message:

Complete changeset 798d9ad8af9a: handle all cases.
Also, do it with fewer times calculating the same expression.
See bug 3388.


diffs (233 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -158,6 +158,7 @@ BATgroupaggrinit(const BAT *b, const BAT
                TYPE1 x;                                                \
                const TYPE1 *vals = (const TYPE1 *) values;             \
                if (ngrp == 1 && cand == NULL) {                        \
+                       /* single group, no candidate list */           \
                        TYPE2 sum;                                      \
                        ALGODEBUG fprintf(stderr,                       \
                                          "#%s: no candidates, no groups; " \
@@ -196,6 +197,7 @@ BATgroupaggrinit(const BAT *b, const BAT
                        if (*seen)                                      \
                                *sums = sum;                            \
                } else if (ngrp == 1) {                                 \
+                       /* single group, with candidate list */         \
                        TYPE2 sum;                                      \
                        int seenval = 0;                                \
                        ALGODEBUG fprintf(stderr,                       \
@@ -204,7 +206,7 @@ BATgroupaggrinit(const BAT *b, const BAT
                                          "\n",                         \
                                          func, start, end);            \
                        sum = 0;                                        \
-                       while (cand < candend) {                        \
+                       while (cand < candend && nils == 0) {           \
                                i = *cand++ - seqb;                     \
                                if (i >= end)                           \
                                        break;                          \
@@ -225,6 +227,7 @@ BATgroupaggrinit(const BAT *b, const BAT
                        if (seenval)                                    \
                                *sums = sum;                            \
                } else if (cand == NULL) {                              \
+                       /* multiple groups, no candidate list */        \
                        ALGODEBUG fprintf(stderr,                       \
                                          "#%s: no candidates, with groups; " \
                                          "start " BUNFMT ", end " BUNFMT \
@@ -235,27 +238,32 @@ BATgroupaggrinit(const BAT *b, const BAT
                                    (gids[i] >= min && gids[i] <= max)) { \
                                        gid = gids ? gids[i] - min : (oid) i; \
                                        x = vals[i];                    \
-                                       if (nil_if_empty && x != TYPE1##_nil && 
\
-                                           !(seen[gid >> 5] & (1 << (gid & 
0x1F)))) { \
-                                               seen[gid >> 5] |= 1 << (gid & 
0x1F); \
-                                               sums[gid] = 0;          \
-                                       }                               \
                                        if (x == TYPE1##_nil) {         \
                                                if (!skip_nils) {       \
                                                        sums[gid] = 
TYPE2##_nil; \
-                                                       nils++;         \
+                                                       nils++; \
                                                }                       \
-                                       } else if (sums[gid] != TYPE2##_nil) { \
-                                               ADD_WITH_CHECK(TYPE1, x, \
-                                                              TYPE2,   \
-                                                              sums[gid], \
-                                                              TYPE2,   \
-                                                              sums[gid], \
-                                                              goto overflow); \
+                                       } else {                        \
+                                               if (nil_if_empty &&     \
+                                                   !(seen[gid >> 5] & (1 << 
(gid & 0x1F)))) { \
+                                                       seen[gid >> 5] |= 1 << 
(gid & 0x1F); \
+                                                       sums[gid] = 0;  \
+                                               }                       \
+                                               if (sums[gid] != TYPE2##_nil) { 
\
+                                                       ADD_WITH_CHECK( \
+                                                               TYPE1,  \
+                                                               x,      \
+                                                               TYPE2,  \
+                                                               sums[gid], \
+                                                               TYPE2,  \
+                                                               sums[gid], \
+                                                               goto overflow); 
\
+                                               }                       \
                                        }                               \
                                }                                       \
                        }                                               \
                } else {                                                \
+                       /* multiple groups, with candidate list */      \
                        ALGODEBUG fprintf(stderr,                       \
                                          "#%s: with candidates, with " \
                                          "groups; start " BUNFMT ", "  \
@@ -268,24 +276,28 @@ BATgroupaggrinit(const BAT *b, const BAT
                                if (gids == NULL ||                     \
                                    (gids[i] >= min && gids[i] <= max)) {       
\
                                        gid = gids ? gids[i] - min : (oid) i; \
-                                       if (nil_if_empty &&             \
-                                           !(seen[gid >> 5] & (1 << (gid & 
0x1F)))) { \
-                                               seen[gid >> 5] |= 1 << (gid & 
0x1F); \
-                                               sums[gid] = 0;          \
-                                       }                               \
                                        x = vals[i];                    \
                                        if (x == TYPE1##_nil) {         \
                                                if (!skip_nils) {       \
                                                        sums[gid] = 
TYPE2##_nil; \
                                                        nils++;         \
                                                }                       \
-                                       } else if (sums[gid] != TYPE2##_nil) { \
-                                               ADD_WITH_CHECK(TYPE1, x, \
-                                                              TYPE2,   \
-                                                              sums[gid], \
-                                                              TYPE2,   \
-                                                              sums[gid], \
-                                                              goto overflow); \
+                                       } else {                        \
+                                               if (nil_if_empty &&     \
+                                                   !(seen[gid >> 5] & (1 << 
(gid & 0x1F)))) { \
+                                                       seen[gid >> 5] |= 1 << 
(gid & 0x1F); \
+                                                       sums[gid] = 0;  \
+                                               }                       \
+                                               if (sums[gid] != TYPE2##_nil) { 
\
+                                                       ADD_WITH_CHECK( \
+                                                               TYPE1,  \
+                                                               x,      \
+                                                               TYPE2,  \
+                                                               sums[gid], \
+                                                               TYPE2,  \
+                                                               sums[gid], \
+                                                               goto overflow); 
\
+                                               }                       \
                                        }                               \
                                }                                       \
                        }                                               \
@@ -638,22 +650,25 @@ BATsum(void *res, int tp, BAT *b, BAT *s
                                        else                            \
                                                gid = (oid) i;          \
                                }                                       \
-                               if (nil_if_empty &&                     \
-                                   !(seen[gid >> 5] & (1 << (gid & 0x1F)))) { \
-                                       seen[gid >> 5] |= 1 << (gid & 0x1F); \
-                                       prods[gid] = 1;                 \
-                               }                                       \
                                if (vals[i] == TYPE1##_nil) {           \
                                        if (!skip_nils) {               \
                                                prods[gid] = TYPE2##_nil; \
                                                nils++;                 \
                                        }                               \
-                               } else if (prods[gid] != TYPE2##_nil) { \
-                                       MUL4_WITH_CHECK(TYPE1, vals[i], \
+                               } else {                                \
+                                       if (nil_if_empty &&             \
+                                           !(seen[gid >> 5] & (1 << (gid & 
0x1F)))) { \
+                                               seen[gid >> 5] |= 1 << (gid & 
0x1F); \
+                                               prods[gid] = 1;         \
+                                       }                               \
+                                       if (prods[gid] != TYPE2##_nil) { \
+                                               MUL4_WITH_CHECK(        \
+                                                       TYPE1, vals[i], \
                                                        TYPE2, prods[gid], \
                                                        TYPE2, prods[gid], \
                                                        TYPE3,          \
                                                        goto overflow); \
+                                       }                               \
                                }                                       \
                        }                                               \
                }                                                       \
@@ -684,21 +699,24 @@ BATsum(void *res, int tp, BAT *b, BAT *s
                                        else                            \
                                                gid = (oid) i;          \
                                }                                       \
-                               if (nil_if_empty &&                     \
-                                   !(seen[gid >> 5] & (1 << (gid & 0x1F)))) { \
-                                       seen[gid >> 5] |= 1 << (gid & 0x1F); \
-                                       prods[gid] = 1;                 \
-                               }                                       \
                                if (vals[i] == TYPE##_nil) {            \
                                        if (!skip_nils) {               \
                                                prods[gid] = lng_nil;   \
                                                nils++;                 \
                                        }                               \
-                               } else if (prods[gid] != lng_nil) {     \
-                                       LNGMUL_CHECK(TYPE, vals[i],     \
-                                                    lng, prods[gid],   \
-                                                    prods[gid],        \
-                                                    goto overflow);    \
+                               } else {                                \
+                                       if (nil_if_empty &&             \
+                                           !(seen[gid >> 5] & (1 << (gid & 
0x1F)))) { \
+                                               seen[gid >> 5] |= 1 << (gid & 
0x1F); \
+                                               prods[gid] = 1;         \
+                                       }                               \
+                                       if (prods[gid] != lng_nil) {    \
+                                               LNGMUL_CHECK(           \
+                                                       TYPE, vals[i],  \
+                                                       lng, prods[gid], \
+                                                       prods[gid],     \
+                                                       goto overflow); \
+                                       }                               \
                                }                                       \
                        }                                               \
                }                                                       \
@@ -729,25 +747,27 @@ BATsum(void *res, int tp, BAT *b, BAT *s
                                        else                            \
                                                gid = (oid) i;          \
                                }                                       \
-                               if (nil_if_empty && vals[i] != TYPE1##_nil &&  \
-                                   !(seen[gid >> 5] & (1 << (gid & 0x1F)))) { \
-                                       seen[gid >> 5] |= 1 << (gid & 0x1F); \
-                                       prods[gid] = 1;                 \
-                               }                                       \
                                if (vals[i] == TYPE1##_nil) {           \
                                        if (!skip_nils) {               \
                                                prods[gid] = TYPE2##_nil; \
                                                nils++;                 \
                                        }                               \
-                               } else if (prods[gid] != TYPE2##_nil) { \
-                                       if (ABSOLUTE(vals[i]) > 1 &&    \
-                                           GDK_##TYPE2##_max / 
ABSOLUTE(vals[i]) < ABSOLUTE(prods[gid])) { \
-                                               if (abort_on_error)     \
-                                                       goto overflow;  \
-                                               prods[gid] = TYPE2##_nil; \
-                                               nils++;                 \
-                                       } else {                        \
-                                               prods[gid] *= vals[i];  \
+                               } else {                                \
+                                       if (nil_if_empty && \
+                                           !(seen[gid >> 5] & (1 << (gid & 
0x1F)))) { \
+                                               seen[gid >> 5] |= 1 << (gid & 
0x1F); \
+                                               prods[gid] = 1;         \
+                                       }                               \
+                                       if (prods[gid] != TYPE2##_nil) { \
+                                               if (ABSOLUTE(vals[i]) > 1 && \
+                                                   GDK_##TYPE2##_max / 
ABSOLUTE(vals[i]) < ABSOLUTE(prods[gid])) { \
+                                                       if (abort_on_error) \
+                                                               goto overflow; \
+                                                       prods[gid] = 
TYPE2##_nil; \
+                                                               nils++; \
+                                               } else {                \
+                                                       prods[gid] *= vals[i]; \
+                                               }                       \
                                        }                               \
                                }                                       \
                        }                                               \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to