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

Reply via email to