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
