Changeset: bede17aa3810 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/bede17aa3810 Modified Files: sql/server/rel_optimize_sel.c sql/server/rel_optimizer.c sql/server/rel_rewriter.c sql/server/rel_unnest.c Branch: sqloptimizer Log Message:
Merged with default diffs (truncated from 2057 to 300 lines): diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -755,3 +755,5 @@ f458e1c71c73d6bd9636369c1406eadb74f016bf f458e1c71c73d6bd9636369c1406eadb74f016bf Jan2022_SP1_release 00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_15 00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_SP3_release +db3cec8ea853884e857fcfb413428116cb95e786 Jul2021_17 +8c015afafb5903ea59b0e2cffac1138a0d82e007 Jul2021_19 diff --git a/clients/ChangeLog.Jan2022 b/clients/ChangeLog.Jan2022 --- a/clients/ChangeLog.Jan2022 +++ b/clients/ChangeLog.Jan2022 @@ -2,9 +2,9 @@ # This file is updated with Maddlog * Wed Feb 16 2022 Sjoerd Mullender <sjo...@acm.org> -- Improved the handling of the \r command in mclient. It now properly - counts the header of table, and when a (very) long table is being - printed and aborted part way in the built-in pager, not all data is - transferred to the client (and then discarded). Instead at most 1000 - rows are transferred. +- Improved the handling of the \r (internal pager) command in mclient. + It now properly counts the header of table, and when a (very) long + table is being printed and aborted part way in the built-in pager, not + all data is transferred to the client (and then discarded). Instead + at most 1000 rows are transferred. diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -3124,8 +3124,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); diff --git a/common/stream/xz_stream.c b/common/stream/xz_stream.c --- a/common/stream/xz_stream.c +++ b/common/stream/xz_stream.c @@ -161,9 +161,9 @@ xz_stream(stream *inner, int preset) ret = lzma_easy_encoder(&xz->strm, preset, LZMA_CHECK_CRC64); } - stream *s = pump_stream(inner, state); + stream *s; - if (ret != LZMA_OK || s == NULL) { + if (ret != LZMA_OK || (s = pump_stream(inner, state)) == NULL) { lzma_end(&xz->strm); free(xz); free(state); diff --git a/gdk/ChangeLog.Jan2022 b/gdk/ChangeLog.Jan2022 --- a/gdk/ChangeLog.Jan2022 +++ b/gdk/ChangeLog.Jan2022 @@ -1,3 +1,11 @@ # ChangeLog file for GDK # This file is updated with Maddlog +* Wed Mar 9 2022 Sjoerd Mullender <sjo...@acm.org> +- Fixed a bug in the append code for msk (bit mask) bats. +- Conversions from floating point types to integral types that involve + multiplication now use the "long double" as intermediate type, thereby + loosing as few significant bits as is feasible. +- Found and fixed another source for the now infamous BBPcheckbats error + that sometimes occurs at startup of the server. + diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1391,14 +1391,23 @@ BATappend_or_update(BAT *b, BAT *p, cons else if (pos <= bi.minpos && bi.minpos < pos + ni.count) bi.minpos = BUN_NONE; } + if (complex_cand(n)) { + for (BUN i = 0, j = ni.count; i < j; i++) + o[i] = *(oid *)Tpos(&ni, i); + /* last value */ + v = o[ni.count - 1]; + } else { + for (BUN i = 0, j = ni.count; i < j; i++) + o[i] = v++; + /* last value added (not one beyond) */ + v--; + } if (bi.maxpos != BUN_NONE) { - if (v + ni.count - 1 >= BUNtoid(b, bi.maxpos)) + if (v >= BUNtoid(b, bi.maxpos)) bi.maxpos = pos + ni.count - 1; else if (pos <= bi.maxpos && bi.maxpos < pos + ni.count) bi.maxpos = BUN_NONE; } - for (BUN i = 0, j = ni.count; i < j; i++) - o[i] = v++; } } else { /* if the extremes of n are at least as diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -1896,6 +1896,7 @@ new_bbpentry(FILE *fp, bat i, BUN size) } #endif + assert(size <= BBP_desc(i)->batCount || size == BUN_NONE); if (size > BBP_desc(i)->batCount) size = BBP_desc(i)->batCount; if (fprintf(fp, "%d %u %s %s %d " BUNFMT " " BUNFMT " " OIDFMT, @@ -3927,6 +3928,7 @@ BBPsync(int cnt, bat *restrict subcommit if (lock) MT_lock_unset(&GDKswapLock(i)); BATiter bi = bat_iterator(b); + assert(size <= bi.count || size == BUN_NONE); if (size > bi.count) size = bi.count; MT_rwlock_rdlock(&b->thashlock); diff --git a/gdk/gdk_calc_private.h b/gdk/gdk_calc_private.h --- a/gdk/gdk_calc_private.h +++ b/gdk/gdk_calc_private.h @@ -666,13 +666,6 @@ typedef long double ldouble; #ifdef TRUNCATE_NUMBERS #define rounddbl(x) (x) #else -#ifdef HAVE_HGE -/* can't round to hge via lng since we might loose significant bits, so - * just keep it long double */ #define rounddbl(x) roundl(x) -#else -/* round long double to long long int in one go */ -#define rounddbl(x) llroundl(x) #endif #endif -#endif diff --git a/gdk/gdk_delta.c b/gdk/gdk_delta.c --- a/gdk/gdk_delta.c +++ b/gdk/gdk_delta.c @@ -35,6 +35,7 @@ BATcommit(BAT *b, BUN size) { if (b == NULL) return; + assert(size <= BATcount(b) || size == BUN_NONE); TRC_DEBUG(DELTA, "BATcommit1 %s free %zu ins " BUNFMT " base %p\n", BATgetId(b), b->theap->free, b->batInserted, b->theap->base); if (!BATdirty(b)) { diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -14,7 +14,7 @@ #include "mutils.h" #include <string.h> -static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id); +static gdk_return logger_add_bat(logger *lg, BAT *b, log_id id, int tid); static gdk_return logger_del_bat(logger *lg, log_bid bid); /* * The logger uses a directory to store its log files. One master log @@ -157,18 +157,33 @@ log_find(BAT *b, BAT *d, int val) } static log_bid -internal_find_bat(logger *lg, log_id id) +internal_find_bat(logger *lg, log_id id, int tid) { BATiter cni = bat_iterator_nolock(lg->catalog_id); BUN p; if (BAThash(lg->catalog_id) == GDK_SUCCEED) { MT_rwlock_rdlock(&cni.b->thashlock); - HASHloop_int(cni, cni.b->thash, p, &id) { - oid pos = p; - if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) { + if (tid < 0) { + HASHloop_int(cni, cni.b->thash, p, &id) { + oid pos = p; + if (BUNfnd(lg->dcatalog, &pos) == BUN_NONE) { + MT_rwlock_rdunlock(&cni.b->thashlock); + return *(log_bid *) Tloc(lg->catalog_bid, p); + } + } + } else { + BUN cp = BUN_NONE; + HASHloop_int(cni, cni.b->thash, p, &id) { + lng lid = *(lng *) Tloc(lg->catalog_lid, p); + if (lid != lng_nil && lid <= tid) { + break; + } + cp = p; + } + if (cp != BUN_NONE) { MT_rwlock_rdunlock(&cni.b->thashlock); - return *(log_bid *) Tloc(lg->catalog_bid, p); + return *(log_bid *) Tloc(lg->catalog_bid, cp); } } MT_rwlock_rdunlock(&cni.b->thashlock); @@ -232,9 +247,9 @@ log_read_clear(logger *lg, trans *tr, lo } static gdk_return -la_bat_clear(logger *lg, logaction *la) +la_bat_clear(logger *lg, logaction *la, int tid) { - log_bid bid = internal_find_bat(lg, la->cid); + log_bid bid = internal_find_bat(lg, la->cid, tid); BAT *b; if (lg->debug & 1) @@ -572,7 +587,7 @@ log_read_updates(logger *lg, trans *tr, static gdk_return -la_bat_update_count(logger *lg, log_id id, lng cnt) +la_bat_update_count(logger *lg, log_id id, lng cnt, int tid) { BATiter cni = bat_iterator_nolock(lg->catalog_id); @@ -583,7 +598,7 @@ la_bat_update_count(logger *lg, log_id i HASHloop_int(cni, cni.b->thash, p, &id) { lng lid = *(lng *) Tloc(lg->catalog_lid, p); - if (lid != lng_nil && lid <= lg->tid) + if (lid != lng_nil && lid <= tid) break; cp = p; } @@ -601,9 +616,9 @@ la_bat_update_count(logger *lg, log_id i } static gdk_return -la_bat_updates(logger *lg, logaction *la) +la_bat_updates(logger *lg, logaction *la, int tid) { - log_bid bid = internal_find_bat(lg, la->cid); + log_bid bid = internal_find_bat(lg, la->cid, tid); BAT *b = NULL; if (bid == 0) @@ -665,7 +680,7 @@ la_bat_updates(logger *lg, logaction *la } } cnt = (BUN)(la->offset + la->nr); - if (la_bat_update_count(lg, la->cid, cnt) != GDK_SUCCEED) { + if (la_bat_update_count(lg, la->cid, cnt, tid) != GDK_SUCCEED) { if (b) logbat_destroy(b); return GDK_FAIL; @@ -705,9 +720,9 @@ log_read_destroy(logger *lg, trans *tr, } static gdk_return -la_bat_destroy(logger *lg, logaction *la) +la_bat_destroy(logger *lg, logaction *la, int tid) { - log_bid bid = internal_find_bat(lg, la->cid); + log_bid bid = internal_find_bat(lg, la->cid, tid); if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED) return GDK_FAIL; @@ -740,7 +755,7 @@ log_read_create(logger *lg, trans *tr, l } static gdk_return -la_bat_create(logger *lg, logaction *la) +la_bat_create(logger *lg, logaction *la, int tid) { BAT *b; @@ -752,7 +767,7 @@ la_bat_create(logger *lg, logaction *la) BATtseqbase(b, 0); if ((b = BATsetaccess(b, BAT_READ)) == NULL || - logger_add_bat(lg, b, la->cid) != GDK_SUCCEED) { + logger_add_bat(lg, b, la->cid, tid) != GDK_SUCCEED) { logbat_destroy(b); return GDK_FAIL; } @@ -816,26 +831,26 @@ tr_create(trans *tr, int tid) } static gdk_return -la_apply(logger *lg, logaction *c) +la_apply(logger *lg, logaction *c, int tid) { gdk_return ret = GDK_SUCCEED; switch (c->type) { case LOG_UPDATE_BULK: case LOG_UPDATE: - ret = la_bat_updates(lg, c); + ret = la_bat_updates(lg, c, tid); break; case LOG_CREATE: if (!lg->flushing) - ret = la_bat_create(lg, c); + ret = la_bat_create(lg, c, tid); break; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org