Changeset: ec4be35b3d32 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ec4be35b3d32
Modified Files:
monetdb5/mal/mal_prelude.c
monetdb5/optimizer/opt_bincopyfrom.c
Branch: default
Log Message:
Merge with Jan2022 branch.
diffs (truncated from 832 to 300 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -2623,7 +2623,6 @@ dump_database(Mapi mid, stream *toConsol
"ORDER BY sch.name, seq.name";
const char *sequences2 =
"SELECT * FROM sys.describe_sequences ORDER BY sch, seq";
- /* we must dump tables, views, functions/procedures and triggers in
order of creation since they can refer to each other */
const char *tables =
"SELECT t.id AS id, "
"s.name AS sname, "
@@ -2682,6 +2681,8 @@ dump_database(Mapi mid, stream *toConsol
"AND d.id = t2.id "
"AND t2.schema_id = s2.id "
"ORDER BY t1.id, t2.id";
+ /* we must dump views, functions/procedures and triggers in order
+ * of creation since they can refer to each other */
const char *views_functions_triggers =
"with vft (sname, name, id, query, remark) AS ("
"SELECT s.name AS sname, " /* views */
@@ -2896,11 +2897,11 @@ dump_database(Mapi mid, stream *toConsol
!mnstr_errnr(toConsole) &&
mapi_fetch_row(hdl) != 0) {
char *id = strdup(mapi_fetch_field(hdl, 0));
- char *nschema = mapi_fetch_field(hdl, 1), *schema = nschema ?
strdup(nschema) : NULL; /* the fetched value might be null, so do this */
+ char *schema = strdup(mapi_fetch_field(hdl, 1));
char *name = strdup(mapi_fetch_field(hdl, 2));
const char *type = mapi_fetch_field(hdl, 3);
- if (mapi_error(mid) || !id || (nschema && !schema) || !name) {
+ if (mapi_error(mid) || id == NULL || schema == NULL || name ==
NULL) {
free(id);
free(schema);
free(name);
@@ -2916,8 +2917,8 @@ dump_database(Mapi mid, stream *toConsol
if (curschema == NULL || strcmp(schema, curschema) !=
0) {
if (curschema)
free(curschema);
- curschema = schema ? strdup(schema) : NULL;
- if (schema && !curschema) {
+ curschema = strdup(schema);
+ if (curschema == NULL) {
free(id);
free(schema);
free(name);
@@ -3076,12 +3077,12 @@ dump_database(Mapi mid, stream *toConsol
!mnstr_errnr(toConsole) &&
mapi_fetch_row(hdl) != 0) {
char *id = strdup(mapi_fetch_field(hdl, 0));
- char *nschema = mapi_fetch_field(hdl, 1), *schema = nschema ?
strdup(nschema) : NULL; /* the fetched value might be null, so do this */
+ char *schema = strdup(mapi_fetch_field(hdl, 1));
char *name = strdup(mapi_fetch_field(hdl, 2));
const char *query = mapi_fetch_field(hdl, 3);
const char *remark = mapi_fetch_field(hdl, 4);
- if (mapi_error(mid) || !id || (nschema && !schema) || !name) {
+ if (mapi_error(mid) || id == NULL || schema == NULL || name ==
NULL) {
free(id);
free(schema);
free(name);
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -1742,12 +1742,18 @@ BATprod(void *res, int tp, BAT *b, BAT *
/* ---------------------------------------------------------------------- */
/* average */
+#define GOTO_BAILOUT() \
+ do { \
+ GDKfree(avgs); \
+ GOTO_LABEL_TIMEOUT_HANDLER(bailout); \
+ } while (0)
+
#define AGGR_AVG(TYPE) \
do { \
const TYPE *restrict vals = (const TYPE *) bi.base; \
TYPE *restrict avgs = GDKzalloc(ngrp * sizeof(TYPE)); \
- if (avgs == NULL) \
- goto bailout; \
+ if (avgs == NULL) \
+ goto bailout; \
TIMEOUT_LOOP(ncand, timeoffset) { \
i = canditer_next(&ci) - b->hseqbase; \
if (gids == NULL || \
@@ -1767,8 +1773,7 @@ BATprod(void *res, int tp, BAT *b, BAT *
} \
} \
} \
- TIMEOUT_CHECK(timeoffset, \
- GOTO_LABEL_TIMEOUT_HANDLER(bailout)); \
+ TIMEOUT_CHECK(timeoffset, GOTO_BAILOUT()); \
for (i = 0; i < ngrp; i++) { \
if (cnts[i] == 0 || is_lng_nil(cnts[i])) { \
dbls[i] = dbl_nil; \
@@ -4023,8 +4028,8 @@ BATmax(BAT *b, void *aggr)
#define DO_QUANTILE_AVG(TPE) \
do { \
- TPE low = *(TPE*) BUNtail(bi, r + (BUN) hi); \
- TPE high = *(TPE*) BUNtail(bi, r + (BUN) lo); \
+ TPE low = *(TPE*) BUNtloc(bi, r + (BUN) hi); \
+ TPE high = *(TPE*) BUNtloc(bi, r + (BUN) lo); \
if (is_##TPE##_nil(low) || is_##TPE##_nil(high)) { \
val = dbl_nil; \
nils++; \
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -615,7 +615,7 @@ BBPreadEntries(FILE *fp, unsigned bbpver
/* convert \r\n into just \n */
if (s[1] != '\n') {
TRC_CRITICAL(GDK, "invalid format for BBP.dir
on line %d", lineno);
- return GDK_FAIL;
+ goto bailout;
}
*s++ = '\n';
*s = 0;
@@ -630,12 +630,12 @@ BBPreadEntries(FILE *fp, unsigned bbpver
&count, &capacity, &base,
&nread) < 8) {
TRC_CRITICAL(GDK, "invalid format for BBP.dir on line
%d", lineno);
- return GDK_FAIL;
+ goto bailout;
}
if (batid >= N_BBPINIT * BBPINIT) {
TRC_CRITICAL(GDK, "bat ID (%" PRIu64 ") too large to
accomodate (max %d), on line %d.", batid, N_BBPINIT * BBPINIT - 1, lineno);
- return GDK_FAIL;
+ goto bailout;
}
/* convert both / and \ path separators to our own DIR_SEP */
@@ -654,26 +654,26 @@ BBPreadEntries(FILE *fp, unsigned bbpver
if (batid >= (uint64_t) ATOMIC_GET(&BBPsize)) {
if ((bat) ATOMIC_GET(&BBPsize) + 1 >= BBPlimit &&
BBPextend(0, false, bid + 1) != GDK_SUCCEED)
- return GDK_FAIL;
+ goto bailout;
ATOMIC_SET(&BBPsize, bid + 1);
}
if (BBP_desc(bid) != NULL) {
TRC_CRITICAL(GDK, "duplicate entry in BBP.dir (ID = "
"%" PRIu64 ") on line %d.", batid, lineno);
- return GDK_FAIL;
+ goto bailout;
}
if ((bn = GDKzalloc(sizeof(BAT))) == NULL ||
(bn->theap = GDKzalloc(sizeof(Heap))) == NULL) {
GDKfree(bn);
TRC_CRITICAL(GDK, "cannot allocate memory for BAT.");
- return GDK_FAIL;
+ goto bailout;
}
bn->batCacheid = bid;
if (BATroles(bn, NULL) != GDK_SUCCEED) {
GDKfree(bn->theap);
GDKfree(bn);
TRC_CRITICAL(GDK, "BATroles failed.");
- return GDK_FAIL;
+ goto bailout;
}
bn->batTransient = false;
bn->batCopiedtodisk = true;
@@ -693,7 +693,7 @@ BBPreadEntries(FILE *fp, unsigned bbpver
if (base > (uint64_t) GDK_oid_max) {
BATdestroy(bn);
TRC_CRITICAL(GDK, "head seqbase out of range (ID = %"
PRIu64 ", seq = %" PRIu64 ") on line %d.", batid, base, lineno);
- return GDK_FAIL;
+ goto bailout;
}
bn->hseqbase = (oid) base;
n = heapinit(bn, buf + nread,
@@ -703,13 +703,13 @@ BBPreadEntries(FILE *fp, unsigned bbpver
bbpversion, bid, filename, lineno);
if (n < 0) {
BATdestroy(bn);
- return GDK_FAIL;
+ goto bailout;
}
nread += n;
n = vheapinit(bn, buf + nread, bid, filename, lineno);
if (n < 0) {
BATdestroy(bn);
- return GDK_FAIL;
+ goto bailout;
}
nread += n;
#ifdef GDKLIBRARY_HASHASH
@@ -717,9 +717,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver
assert(bbpversion <= GDKLIBRARY_HASHASH);
bat *sb = GDKrealloc(hbats, ++nhbats * sizeof(bat));
if (sb == NULL) {
- GDKfree(hbats);
BATdestroy(bn);
- return GDK_FAIL;
+ goto bailout;
}
hbats = sb;
hbats[nhbats - 1] = bn->batCacheid;
@@ -728,22 +727,16 @@ BBPreadEntries(FILE *fp, unsigned bbpver
if (buf[nread] != '\n' && buf[nread] != ' ') {
BATdestroy(bn);
-#ifdef GDKLIBRARY_HASHASH
- GDKfree(hbats);
-#endif
TRC_CRITICAL(GDK, "invalid format for BBP.dir on line
%d", lineno);
- return GDK_FAIL;
+ goto bailout;
}
if (buf[nread] == ' ')
options = buf + nread + 1;
if (snprintf(BBP_bak(bid), sizeof(BBP_bak(bid)), "tmp_%o",
(unsigned) bid) >= (int) sizeof(BBP_bak(bid))) {
BATdestroy(bn);
-#ifdef GDKLIBRARY_HASHASH
- GDKfree(hbats);
-#endif
TRC_CRITICAL(GDK, "BBP logical filename directory is
too large, on line %d\n", lineno);
- return GDK_FAIL;
+ goto bailout;
}
if ((s = strchr(headname, '~')) != NULL && s == headname) {
/* sizeof(logical) > sizeof(BBP_bak(bid)), so
@@ -760,11 +753,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver
BBP_logical(bid) = GDKstrdup(logical);
if (BBP_logical(bid) == NULL) {
BATdestroy(bn);
-#ifdef GDKLIBRARY_HASHASH
- GDKfree(hbats);
-#endif
TRC_CRITICAL(GDK, "GDKstrdup failed\n");
- return GDK_FAIL;
+ goto bailout;
}
}
/* tailname is ignored */
@@ -778,11 +768,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver
BBP_options(bid) = GDKstrdup(options);
if (BBP_options(bid) == NULL) {
BATdestroy(bn);
-#ifdef GDKLIBRARY_HASHASH
- GDKfree(hbats);
-#endif
TRC_CRITICAL(GDK, "GDKstrdup failed\n");
- return GDK_FAIL;
+ goto bailout;
}
}
BBP_refs(bid) = 0;
@@ -796,6 +783,12 @@ BBPreadEntries(FILE *fp, unsigned bbpver
*nhashbats = nhbats;
#endif
return GDK_SUCCEED;
+
+ bailout:
+#ifdef GDKLIBRARY_HASHASH
+ GDKfree(hbats);
+#endif
+ return GDK_FAIL;
}
/* check that the necessary files for all BATs exist and are large
@@ -2137,7 +2130,7 @@ BBPdir_step(bat bid, BUN size, int n, ch
}
*obbpfp = NULL;
} else {
- if (sscanf(buf, "%d", &n) != 1 || n <= 0) {
+ if (sscanf(buf, "%d", &n) != 1 || n <= 0 || n >=
N_BBPINIT * BBPINIT) {
GDKerror("subcommit attempted with invalid
backup BBP.dir.");
goto bailout;
}
@@ -3070,7 +3063,7 @@ decref(bat i, bool logical, bool release
* conditions are met */
if (BBP_refs(i) == 0 &&
(BBP_lrefs(i) == 0 ||
- (b != NULL
+ (b != NULL && b->theap != NULL
? (!BATdirty(b) &&
!(BBP_status(i) & chkflag) &&
(BBP_status(i) & BBPPERSISTENT) &&
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -1885,7 +1885,8 @@ mergejoin(BAT **r1p, BAT **r2p, BAT *l,
!BATtvoid(l) && !BATtvoid(r));
lordering = l->tsorted && (r->tsorted || !equal_order) ? 1 : -1;
rordering = equal_order ? lordering : -lordering;
- if (!l->tnonil && !nil_matches && !nil_on_miss) {
+ if (!l->tnonil && !nil_matches && !nil_on_miss && lvals !=
NULL) {
+ /* find first non-nil */
nl = binsearch(NULL, 0, l->ttype, lvals, lvars,
li.width, 0, BATcount(l), nil, l->tsorted ? 1 : -1, l->tsorted ? 1 : 0);
nl = canditer_search(lci, nl + l->hseqbase, true);
if (l->tsorted) {
diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -267,11 +267,11 @@ BATunique(BAT *b, BAT *s)
HASHput(hs, prb, p);
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list