Changeset: dbf651dd9ddd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dbf651dd9ddd
Branch: Jul2021
Log Message:
merged
diffs (truncated from 595 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
@@ -1688,10 +1688,27 @@ dump_table_data(Mapi mid, const char *sc
goto bailout;
}
while ((mapi_fetch_row(hdl)) != 0) {
- if (strcmp(mapi_fetch_field(hdl, 2), "1") == 0) {
+ const char *ttype = mapi_fetch_field(hdl, 2);
+ if (strcmp(ttype, "1") == 0) {
/* the table is actually a view */
goto doreturn;
}
+ if (strcmp(ttype, "3") == 0) {
+ /* merge table */
+ goto doreturn;
+ }
+ if (strcmp(ttype, "4") == 0) {
+ /* stream table */
+ goto doreturn;
+ }
+ if (strcmp(ttype, "5") == 0) {
+ /* remote table */
+ goto doreturn;
+ }
+ if (strcmp(ttype, "6") == 0) {
+ /* replica table */
+ goto doreturn;
+ }
}
if (mapi_error(mid))
goto bailout;
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -255,7 +255,7 @@ BATmaterialize(BAT *b)
b->tbaseoff = 0;
b->theap->dirty = true;
BATsetprop_nolock(b, GDK_NUNIQUE, TYPE_oid, &(oid){is_oid_nil(t) ? 1 :
b->batCount});
- BATsetprop_nolock(b, GDK_UNIQUE_ESTIMATE, TYPE_dbl,
&(dbl){is_oid_nil(t) ? 1 : b->batCount});
+ BATsetprop_nolock(b, GDK_UNIQUE_ESTIMATE, TYPE_dbl,
&(dbl){is_oid_nil(t) ? 1.0 : (dbl)b->batCount});
MT_lock_unset(&b->theaplock);
b->ttype = TYPE_oid;
BATsetdims(b);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -674,7 +674,7 @@ BATfree(BAT *b)
MT_lock_set(&b->theaplock);
if (nunique != BUN_NONE) {
BATsetprop_nolock(b, GDK_NUNIQUE, TYPE_oid, &(oid){nunique});
- BATsetprop_nolock(b, GDK_UNIQUE_ESTIMATE, TYPE_dbl,
&(dbl){nunique});
+ BATsetprop_nolock(b, GDK_UNIQUE_ESTIMATE, TYPE_dbl,
&(dbl){(dbl)nunique});
BATsetprop_nolock(b, GDK_HASH_BUCKETS, TYPE_oid,
&(oid){nbucket});
}
if (b->theap) {
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -342,11 +342,13 @@ string_reader(logger *lg, BAT *b, lng nr
sz = (size_t)SZ;
char *buf = lg->buf;
if (lg->bufsize < sz) {
- lg->buf = buf = GDKrealloc(buf, sz);
+ if (!(buf = GDKrealloc(lg->buf, sz)))
+ return LOG_ERR;
+ lg->buf = buf;
lg->bufsize = sz;
}
- if (!buf || mnstr_read(lg->input_log, buf, sz, 1) != 1)
+ if (mnstr_read(lg->input_log, buf, sz, 1) != 1)
return LOG_EOF;
/* handle strings */
char *t = buf;
@@ -2363,7 +2365,7 @@ string_writer(logger *lg, BAT *b, lng of
size_t bufsz = lg->bufsize, resize = 0;
BUN end = (BUN)(offset + nr);
char *buf = lg->buf;
- gdk_return res = GDK_FAIL;
+ gdk_return res = GDK_SUCCEED;
if (!buf)
return GDK_FAIL;
@@ -2372,11 +2374,11 @@ string_writer(logger *lg, BAT *b, lng of
for ( ; p < end; ) {
size_t sz = 0;
if (resize) {
- lg->buf = buf = GDKrealloc(buf, resize);
- if (!buf) {
+ if (!(buf = GDKrealloc(lg->buf, resize))) {
res = GDK_FAIL;
break;
}
+ lg->buf = buf;
lg->bufsize = bufsz = resize;
resize = 0;
}
@@ -2394,8 +2396,10 @@ string_writer(logger *lg, BAT *b, lng of
sz += len;
}
}
- if (sz && buf && mnstr_writeLng(lg->output_log, (lng) sz) &&
mnstr_write(lg->output_log, buf, sz, 1) == 1)
- res = GDK_SUCCEED;
+ if (sz && (!mnstr_writeLng(lg->output_log, (lng) sz) ||
mnstr_write(lg->output_log, buf, sz, 1) != 1)) {
+ res = GDK_FAIL;
+ break;
+ }
}
bat_iterator_end(&bi);
return res;
diff --git a/monetdb5/optimizer/opt_pushselect.c
b/monetdb5/optimizer/opt_pushselect.c
--- a/monetdb5/optimizer/opt_pushselect.c
+++ b/monetdb5/optimizer/opt_pushselect.c
@@ -320,25 +320,29 @@ OPTpushselectImplementation(Client cntxt
/* rewrite batalgebra.like + [theta]select ->
likeselect */
if (getModuleId(p) == algebraRef && p->retc == 1 &&
- (getFunctionId(p) == selectRef ||
getFunctionId(p) == thetaselectRef)) {
+ (getFunctionId(p) == selectRef ||
getFunctionId(p) == thetaselectRef)) {
int var = getArg(p, 1);
InstrPtr q = mb->stmt[vars[var]]; /* BEWARE:
the optimizer may not add or remove statements ! */
if (isLikeOp(q) &&
- !isaBatType(getArgType(mb, q,
2)) && /* pattern is a value */
- !isaBatType(getArgType(mb, q,
3)) && /* escape is a value */
- !isaBatType(getArgType(mb, q,
4)) && /* isensitive flag is a value */
- strcmp(getVarName(mb,
getArg(q,0)), getVarName(mb, getArg(p,1))) == 0 /* the output variable from
batalgebra.like is the input one for [theta]select */) {
+ !isaBatType(getArgType(mb, q, 2)) &&
isVarConstant(mb, getArg(q, 2)) && /* pattern is a value */
+ isVarConstant(mb, getArg(q, 3)) && /*
escape is a value */
+ isVarConstant(mb, getArg(q, 4)) && /*
isensitive flag is a value */
+ strcmp(getVarName(mb, getArg(q,0)),
getVarName(mb, getArg(p,1))) == 0 /* the output variable from batalgebra.like
is the input one for [theta]select */) {
int has_cand = (getArgType(mb, p, 2) ==
newBatType(TYPE_oid)), offset = 0, anti = (getFunctionId(q)[0] == 'n');
bit ignore_case =
*(bit*)getVarValue(mb, getArg(q, 4)), selectok = TRUE;
/* TODO at the moment we cannot convert
if the select statement has NULL semantics
we can convert it into VAL is
NULL or PATTERN is NULL or ESCAPE is NULL
*/
- if (getFunctionId(p) == selectRef) {
+ if (getFunctionId(p) == selectRef &&
isVarConstant(mb, getArg(p, 2 + has_cand)) &&
+ isVarConstant(mb, getArg(p, 3 +
has_cand)) && isVarConstant(mb, getArg(p, 4 + has_cand)) &&
+ isVarConstant(mb, getArg(p, 5 +
has_cand)) && isVarConstant(mb, getArg(p, 6 + has_cand)) &&
+ (p->argc < (has_cand ? 9 : 8)
|| isVarConstant(mb, getArg(p, 7 + has_cand)))) {
bit low =
*(bit*)getVarValue(mb, getArg(p, 2 + has_cand)), high = *(bit*)getVarValue(mb,
getArg(p, 3 + has_cand));
bit li = *(bit*)getVarValue(mb,
getArg(p, 4 + has_cand)), hi = *(bit*)getVarValue(mb, getArg(p, 5 + has_cand));
- bit santi =
*(bit*)getVarValue(mb, getArg(p, 6 + has_cand)), sunknown = (p->argc ==
(has_cand ? 9 : 8)) ? 0 : *(bit*)getVarValue(mb, getArg(p, 7 + has_cand));
+ bit santi =
*(bit*)getVarValue(mb, getArg(p, 6 + has_cand));
+ bit sunknown = (p->argc ==
(has_cand ? 9 : 8)) ? 0 : *(bit*)getVarValue(mb, getArg(p, 7 + has_cand));
/* semantic or not symmetric
cases, it cannot be converted */
if (is_bit_nil(low) ||
is_bit_nil(li) || is_bit_nil(santi) || low != high || li != hi || sunknown)
@@ -351,7 +355,8 @@ OPTpushselectImplementation(Client cntxt
anti = !anti;
if (santi)
anti = !anti;
- } else if (getFunctionId(p) ==
thetaselectRef) {
+ } else if (getFunctionId(p) ==
thetaselectRef &&
+ isVarConstant(mb,
getArg(p, 3)) && isVarConstant(mb, getArg(p, 4))) {
bit truth_value =
*(bit*)getVarValue(mb, getArg(p, 3));
str comparison =
(str)getVarValue(mb, getArg(p, 4));
@@ -364,6 +369,8 @@ OPTpushselectImplementation(Client cntxt
anti = !anti;
else if (strcmp(comparison,
"==") != 0)
selectok = FALSE;
+ } else {
+ selectok = FALSE;
}
if (selectok) {
diff --git a/sql/ChangeLog.Jul2021 b/sql/ChangeLog.Jul2021
--- a/sql/ChangeLog.Jul2021
+++ b/sql/ChangeLog.Jul2021
@@ -1,3 +1,7 @@
# ChangeLog file for sql
# This file is updated with Maddlog
+* Wed Jul 28 2021 Sjoerd Mullender <[email protected]>
+- Since STREAM tables support is removed, left over STREAM tables are
+ dropped from the catalog.
+
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -2416,6 +2416,138 @@ bl_postversion(void *Store, old_logger *
bat_destroy(b1);
bat_destroy(b3);
}
+
+ {
+ /* drop STREAM TABLEs
+ * these tables don't actually have a disk presence,
only
+ * one in the catalog (so that's why we drop them and
don't
+ * convert them); we drop them by marking the relevant
rows
+ * in various catalog tables as deleted */
+ BAT *dt = temp_descriptor(logger_find_bat(lg, 2067));
/* sys._tables */
+ BAT *tt = temp_descriptor(logger_find_bat(lg, 2072));
/* sys._tables.type */
+ if (dt == NULL || tt == NULL) {
+ bat_destroy(dt);
+ bat_destroy(tt);
+ return GDK_FAIL;
+ }
+ BAT *cands = BATmaskedcands(0, BATcount(dt), dt, false);
+ if (cands == NULL) {
+ bat_destroy(dt);
+ bat_destroy(tt);
+ return GDK_FAIL;
+ }
+ BAT *strm = BATselect(tt, cands, &(sht){4}, NULL, true,
true, false);
+ bat_destroy(cands);
+ bat_destroy(tt);
+ if (strm == NULL) {
+ bat_destroy(dt);
+ return GDK_FAIL;
+ }
+ if (strm->batCount > 0) {
+ for (BUN p = 0; p < strm->batCount; p++)
+ mskSetVal(dt, BUNtoid(strm, p), true);
+ bat_destroy(dt);
+ BAT *ids = COLnew(0, TYPE_int, 0, TRANSIENT);
+ BAT *ti = temp_descriptor(logger_find_bat(lg,
2068)); /* sys._tables.id */
+ if (ids == NULL || ti == NULL) {
+ bat_destroy(ids);
+ bat_destroy(ti);
+ bat_destroy(strm);
+ return GDK_FAIL;
+ }
+ struct {
+ int id, tabid, dels; /* id, table_id
and deleted rows */
+ } foreign[10] = {
+ /* the first 7 entries are references
to the table id
+ * the first column non-zero means the
ids get collected */
+ { 0, 2049, 2047}, /*
sys.table_partitions.table_id */
+ { 0, 2054, 2053}, /*
sys.range_partitions.table_id */
+ { 0, 2060, 2059}, /*
sys.value_partitions.table_id */
+ {2077, 2082, 2076}, /*
sys._columns.table_id */
+ {2088, 2089, 2087}, /*
sys.keys.table_id */
+ {2095, 2096, 2094}, /*
sys.idxs.table_id */
+ {2100, 2102, 2099}, /*
sys.triggers.table_id */
+
+ /* the remaining 3 are references to
collected object ids */
+ { 0, 2111, 2110}, /* sys.objects.id */
+ { 0, 2064, 2063}, /*
sys.dependencies.id */
+ { 0, 2065, 2063}, /*
sys.dependencies.depend_id */
+ };
+
+ for (int i = 0; i < 10; i++) {
+ if (i == 7) {
+ /* change gear: we now need to
delete the
+ * collected ids from
sys.objects */
+ bat_destroy(ti);
+ ti = ids;
+ ids = NULL;
+ bat_destroy(strm);
+ strm = NULL;
+ }
+ BAT *ct =
temp_descriptor(logger_find_bat(lg, foreign[i].tabid));
+ BAT *dc =
temp_descriptor(logger_find_bat(lg, foreign[i].dels));
+ if (ct == NULL || dc == NULL) {
+ bat_destroy(ids);
+ bat_destroy(strm);
+ bat_destroy(ti);
+ bat_destroy(ct);
+ bat_destroy(dc);
+ return GDK_FAIL;
+ }
+ cands = BATmaskedcands(0, BATcount(dc),
dc, false);
+ if (cands == NULL) {
+ bat_destroy(ids);
+ bat_destroy(strm);
+ bat_destroy(ti);
+ bat_destroy(ct);
+ bat_destroy(dc);
+ return GDK_FAIL;
+ }
+ BAT *strc = BATintersect(ct, ti, cands,
strm, false, false, BUN_NONE);
+ bat_destroy(cands);
+ if (strc == NULL) {
+ bat_destroy(ids);
+ bat_destroy(strm);
+ bat_destroy(ti);
+ bat_destroy(ct);
+ bat_destroy(dc);
+ return GDK_FAIL;
+ }
+ for (BUN p = 0; p < strc->batCount; p++)
+ mskSetVal(dc, BUNtoid(strc, p),
true);
+ if (foreign[i].id != 0) {
+ BAT *ci =
temp_descriptor(logger_find_bat(lg, foreign[i].id));
+ if (ci == NULL) {
+ bat_destroy(ids);
+ bat_destroy(strc);
+ bat_destroy(ct);
+ bat_destroy(dc);
+ bat_destroy(strm);
+ bat_destroy(ti);
+ return GDK_FAIL;
+ }
+ if (BATappend(ids, ci, strc,
false) != GDK_SUCCEED) {
+ bat_destroy(ids);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list