Changeset: f071fac0fdba for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f071fac0fdba Added Files: sql/test/BugTracker-2013/Tests/singleton-median.Bug-3389.sql sql/test/BugTracker-2013/Tests/singleton-median.Bug-3389.stable.err sql/test/BugTracker-2013/Tests/singleton-median.Bug-3389.stable.out Modified Files: clients/mapiclient/ReadlineTools.c gdk/gdk_aggr.c sql/test/BugTracker-2013/Tests/All Branch: default Log Message:
Merge with Feb2013 branch.
diffs (truncated from 472 to 300 lines):
diff --git a/clients/mapiclient/ReadlineTools.c
b/clients/mapiclient/ReadlineTools.c
--- a/clients/mapiclient/ReadlineTools.c
+++ b/clients/mapiclient/ReadlineTools.c
@@ -70,12 +70,14 @@ sql_tablename_generator(const char *text
static int seekpos, len, rowcount;
static MapiHdl table_hdl;
- char *name;
if (!state) {
+ char query[512];
+
seekpos = 0;
len = strlen(text);
- if ((table_hdl = mapi_query(_mid, "SELECT t.\"name\",
s.\"name\" FROM \"sys\".\"tables\" t, \"sys\".\"schemas\" s where t.schema_id =
s.id")) == NULL || mapi_error(_mid)) {
+ snprintf(query, sizeof(query), "SELECT t.\"name\", s.\"name\"
FROM \"sys\".\"tables\" t, \"sys\".\"schemas\" s where t.schema_id = s.id AND
t.\"name\" like '%s%%'", text);
+ if ((table_hdl = mapi_query(_mid, query)) == NULL ||
mapi_error(_mid)) {
if (table_hdl) {
mapi_explain_query(table_hdl, stderr);
mapi_close_handle(table_hdl);
@@ -88,18 +90,18 @@ sql_tablename_generator(const char *text
}
while (seekpos < rowcount) {
+ const char *name;
+
mapi_seek_row(table_hdl, seekpos++, MAPI_SEEK_SET);
mapi_fetch_row(table_hdl);
name = mapi_fetch_field(table_hdl, 0);
if (strncmp(name, text, len) == 0) {
- char *s, *schema = mapi_fetch_field(table_hdl, 1);
- int l1 = strlen(name), l2 = strlen(schema);
+ char *s;
+ const char *schema = mapi_fetch_field(table_hdl, 1);
+ size_t l1 = strlen(name), l2 = strlen(schema);
- s = malloc(l1 + l2 + 2);
- s[0] = 0;
- strcat(s, schema);
- strcat(s, ".");
- strcat(s, name);
+ s = malloc(l1 + l2 + 6);
+ snprintf(s, l1 + l2 + 6, "\"%s\".\"%s\"", schema, name);
return s;
}
}
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]; \
+ } \
} \
} \
} \
@@ -2205,6 +2225,8 @@ BATgroupmedian(BAT *b, BAT *g, BAT *e, B
}
if (s) {
+ /* there is a candidate list, replace b (and g, if
+ * given) with just the values we're interested in */
b = BATleftjoin(s, b, BATcount(s));
if (b->htype != TYPE_void) {
t1 = BATmirror(BATmark(BATmirror(b), 0));
@@ -2223,7 +2245,19 @@ BATgroupmedian(BAT *b, BAT *g, BAT *e, B
}
}
+ /* we want to sort b so that we can figure out the median, but
+ * if g is given, sort g and subsort b so that we can get the
+ * median for each group */
if (g) {
+ if (BATtdense(g)) {
+ /* singleton groups, so calculating medians is
+ * easy */
+ bn = BATcopy(b, TYPE_void, b->ttype, 0);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
