Changeset: d33e5da4f07c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d33e5da4f07c
Modified Files:
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 473 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -331,6 +331,7 @@ gdk_return GDKtracer_set_adapter(const c
 gdk_return GDKtracer_set_component_level(const char *comp, const char *lvl);
 gdk_return GDKtracer_set_flush_level(const char *lvl);
 gdk_return GDKtracer_set_layer_level(const char *layer, const char *lvl);
+gdk_return GDKtracer_set_tracefile(const char *tracefile);
 gdk_return GDKtracer_stop(void);
 size_t GDKuniqueid(size_t offset);
 gdk_return GDKupgradevarheap(BAT *b, var_t v, BUN cap, bool copyall) 
__attribute__((__warn_unused_result__));
diff --git a/ctest/monetdb5/mal/test_malEmbeddedBoot.c 
b/ctest/monetdb5/mal/test_malEmbeddedBoot.c
--- a/ctest/monetdb5/mal/test_malEmbeddedBoot.c
+++ b/ctest/monetdb5/mal/test_malEmbeddedBoot.c
@@ -17,8 +17,8 @@ main(void)
     gdk_return gdk_res;
 
     gdk_res = GDKinit(NULL, 0, true);
-    if (gdk_res == GDK_FAIL) {
-       msg = createException(MAL, "embedded.monetdb_startup", "GDKinit() 
failed");
+    if (gdk_res != GDK_SUCCEED) {
+               msg = createException(MAL, "embedded.monetdb_startup", 
"GDKinit() failed");
         return 1;
     }
     if ((msg = malEmbeddedBoot(0, 0, 0, 0, 0)) != MAL_SUCCEED)
diff --git a/ctest/monetdb5/mal/test_malInclude.c 
b/ctest/monetdb5/mal/test_malInclude.c
--- a/ctest/monetdb5/mal/test_malInclude.c
+++ b/ctest/monetdb5/mal/test_malInclude.c
@@ -18,8 +18,8 @@ main(void)
     gdk_return gdk_res;
 
     gdk_res = GDKinit(NULL, 0, true);
-    if (gdk_res == GDK_FAIL) {
-       createException(MAL, "embedded.monetdb_startup", "GDKinit() failed");
+    if (gdk_res != GDK_SUCCEED) {
+               createException(MAL, "embedded.monetdb_startup", "GDKinit() 
failed");
        return 1;
     }
     char *modules[2];
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -908,7 +908,7 @@ logger_create_types_file(logger *lg, con
                return GDK_FAIL;
        }
 
-       if (logger_write_new_types(lg, fp) == GDK_FAIL) {
+       if (logger_write_new_types(lg, fp) != GDK_SUCCEED) {
                fclose(fp);
                MT_remove(filename);
                GDKerror("writing log file %s failed", filename);
@@ -1866,7 +1866,7 @@ logger_load(int debug, const char *fn, c
        if (BBPrename(lg->catalog_lid->batCacheid, bak) < 0) {
                goto error;
        }
-       if (bm_get_counts(lg) == GDK_FAIL)
+       if (bm_get_counts(lg) != GDK_SUCCEED)
                goto error;
 
        strconcat_len(bak, sizeof(bak), fn, "_seqs_id", NULL);
@@ -2158,7 +2158,7 @@ logger_flush(logger *lg, ulng ts)
                        }
 
                        bool filemissing = false;
-                       if (logger_open_input(lg, filename, &filemissing) == 
GDK_FAIL) {
+                       if (logger_open_input(lg, filename, &filemissing) != 
GDK_SUCCEED) {
                                GDKfree(filename);
                                return GDK_FAIL;
                        }
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -162,7 +162,7 @@ gdk_return GDKssort_rev(void *restrict h
 gdk_return GDKssort(void *restrict h, void *restrict t, const void *restrict 
base, size_t n, int hs, int ts, int tpe)
        __attribute__((__warn_unused_result__))
        __attribute__((__visibility__("hidden")));
-void GDKtracer_init(const char *dbname, const char *dbtrace)
+gdk_return GDKtracer_init(const char *dbname, const char *dbtrace)
        __attribute__((__visibility__("hidden")));
 gdk_return GDKunlink(int farmid, const char *dir, const char *nme, const char 
*extension)
        __attribute__((__visibility__("hidden")));
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -428,15 +428,24 @@ GDKtracer_reset_adapter(void)
 
 static bool add_ts;            /* add timestamp to error message to stderr */
 
-void
+gdk_return
 GDKtracer_init(const char *dbpath, const char *dbtrace)
 {
+       MT_lock_set(&GDKtracer_lock);
 #ifdef _MSC_VER
        add_ts = GetFileType(GetStdHandle(STD_ERROR_HANDLE)) != FILE_TYPE_PIPE;
 #else
        add_ts = isatty(2) || lseek(2, 0, SEEK_CUR) != (off_t) -1 || errno != 
ESPIPE;
 #endif
-       (void) GDKtracer_init_trace_file(dbpath, dbtrace);
+       gdk_return rc = GDKtracer_init_trace_file(dbpath, dbtrace);
+       MT_lock_unset(&GDKtracer_lock);
+       return rc;
+}
+
+gdk_return
+GDKtracer_set_tracefile(const char *tracefile)
+{
+       return GDKtracer_init(NULL, tracefile);
 }
 
 void
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk_tracer.h
@@ -39,11 +39,11 @@
 
 
 // ADAPTERS
-#define FOREACH_ADPTR(ADPTR)   \
+#define FOREACH_ADPTR(ADPTR)                   \
        ADPTR( BASIC )                          \
        ADPTR( PROFILER )                       \
        ADPTR( MBEDDED )                        \
-                                                               \
+                                               \
        ADPTR( ADAPTERS_COUNT )
 
 typedef enum {
@@ -233,6 +233,8 @@ gdk_export log_level_t lvl_per_component
 // Used for logrotate
 gdk_export void GDKtracer_reinit_basic(int sig);
 
+gdk_export gdk_return GDKtracer_set_tracefile(const char *tracefile);
+
 gdk_export gdk_return GDKtracer_stop(void);
 
 gdk_export gdk_return GDKtracer_set_component_level(const char *comp, const 
char *lvl);
diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c
--- a/monetdb5/mal/mal_runtime.c
+++ b/monetdb5/mal/mal_runtime.c
@@ -207,7 +207,6 @@ runtimeProfileInit(Client cntxt, MalBlkP
 {
        size_t i, paused = 0;
        str q;
-       QueryQueue tmp = NULL;
 
        MT_lock_set(&mal_delayLock);
 
@@ -221,7 +220,6 @@ runtimeProfileInit(Client cntxt, MalBlkP
                }
        }
 
-       tmp = QRYqueue;
        if ( QRYqueue == NULL) {
                QRYqueue = (QueryQueue) GDKzalloc( sizeof (struct QRYQUEUE) * 
(qsize= MAL_MAXCLIENTS));
 
@@ -231,32 +229,40 @@ runtimeProfileInit(Client cntxt, MalBlkP
                        return;
                }
        }
+       assert(qhead < qsize);
        // check for recursive call, which does not change the number of workers
+       if (stk->up) {
+               i = qtail;
+               while (i != qhead) {
+                       if (QRYqueue[i].mb && QRYqueue[i].stk == stk->up) {
+                               QRYqueue[i].stk = stk;
+                               mb->tag = stk->tag = qtag++;
+                               MT_lock_unset(&mal_delayLock);
+                               return;
+                       }
+                       if (++i >= qsize)
+                               i = 0;
+               }
+               assert(0);
+       }
        i=qtail;
        while (i != qhead){
-               if (QRYqueue[i].mb && QRYqueue[i].mb == mb &&  stk->up == 
QRYqueue[i].stk){
-                       QRYqueue[i].stk = stk;
-                       mb->tag = stk->tag = qtag++;
-                       MT_lock_unset(&mal_delayLock);
-                       return;
-               }
-               if ( QRYqueue[i].status)
-                       paused += (QRYqueue[i].status[0] == 'p' || 
QRYqueue[i].status[0] == 'r'); /* running, prepared or paused */
-               i++;
-               if ( i >= qsize)
+               paused += QRYqueue[i].status && (QRYqueue[i].status[0] == 'p' 
|| QRYqueue[i].status[0] == 'r'); /* running, prepared or paused */
+               if (++i >= qsize)
                        i = 0;
        }
-       assert(qhead < qsize);
        if( qsize - paused < (size_t) MAL_MAXCLIENTS){
                qsize += MAL_MAXCLIENTS;
+               QueryQueue tmp;
                tmp = (QueryQueue) GDKrealloc( QRYqueue, sizeof (struct 
QRYQUEUE) * qsize);
                if ( tmp == NULL){
                        addMalException(mb,"runtimeProfileInit" 
MAL_MALLOC_FAIL);
+                       qsize -= MAL_MAXCLIENTS; /* undo increment */
                        MT_lock_unset(&mal_delayLock);
                        return;
                }
                QRYqueue = tmp;
-               for(i = qsize - MAL_MAXCLIENTS; i < qsize; i++)
+               for (i = qsize - MAL_MAXCLIENTS; i < qsize; i++)
                        clearQRYqueue(i);
        }
 
diff --git a/monetdb5/modules/mal/tracer.c b/monetdb5/modules/mal/tracer.c
--- a/monetdb5/modules/mal/tracer.c
+++ b/monetdb5/modules/mal/tracer.c
@@ -139,7 +139,7 @@ TRACERcomp_info(Client cntxt, MalBlkPtr 
 
     // Fill the BATs
     MT_lock_set(&mal_delayLock);
-       if(GDKtracer_fill_comp_info(id, component, log_level) == GDK_FAIL) {
+       if(GDKtracer_fill_comp_info(id, component, log_level) != GDK_SUCCEED) {
                MT_lock_unset(&mal_delayLock);
                BBPunfix(id->batCacheid);
                BBPunfix(component->batCacheid);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -1305,7 +1305,7 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                return 1;
        if (is_ascending(e1) != is_ascending(e2) || nulls_last(e1) != 
nulls_last(e2) || zero_if_empty(e1) != zero_if_empty(e2) ||
                need_no_nil(e1) != need_no_nil(e2) || is_anti(e1) != 
is_anti(e2) || is_semantics(e1) != is_semantics(e2) ||
-               need_distinct(e1) != need_distinct(e2))
+               is_symmetric(e1) != is_symmetric(e2) || need_distinct(e1) != 
need_distinct(e2))
                return 0;
        if (e1->type == e2->type) {
                switch(e1->type) {
@@ -1313,7 +1313,7 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                        if (e1->flag == e2->flag && !is_complex_exp(e1->flag) &&
                            exp_match_exp(e1->l, e2->l) &&
                            exp_match_exp(e1->r, e2->r) &&
-                           ((!e1->f && !e2->f) || exp_match_exp(e1->f, e2->f)))
+                           ((!e1->f && !e2->f) || (e1->f && e2->f && 
exp_match_exp(e1->f, e2->f))))
                                return 1;
                        else if (e1->flag == e2->flag && e1->flag == cmp_or &&
                            exp_match_list(e1->l, e2->l) &&
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2513,6 +2513,14 @@ rel_remove_redundant_join(visitor *v, sq
                        int left = 0;
                        if (is_basetable(jl->op) && jl->l == b->l)
                                left = 1;
+                       if (!list_empty(p->exps)) {
+                               for (node *n=p->exps->h; n; n = n->next) { /* 
all exps of 'p' must be bound to the opposite side */
+                                       sql_exp *e = n->data;
+
+                                       if (!rel_rebind_exp(v->sql, left ? jr : 
jl, e))
+                                               return rel;
+                               }
+                       }
                        if (exp_match_list(j->exps, rel->exps)) {
                                p->l = (left)?rel_dup(jr):rel_dup(jl);
                                rel_destroy(j);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -981,13 +981,13 @@ cs_update_bat( sql_trans *tr, column_sto
                                                                msk = 
(int*)Tloc(ins, 0);
                                                        }
                                                }
-                                               for (oid rid = start; rid < 
lend && res == LOG_OK; rid++) {
+                                               for (oid i = 0, rid = start; 
rid < lend && res == LOG_OK; rid++, i++) {
                                                        ptr upd = BUNtail(upi, 
rid-offset);
                                                        if (void_inplace(b, 
rid, upd, true) != GDK_SUCCEED)
                                                                res = LOG_ERR;
 
-                                                       oid word = rid/32;
-                                                       int pos = rid%32;
+                                                       oid word = i/32;
+                                                       int pos = i%32;
                                                        msk[word] |= 1U<<pos;
                                                        cnt++;
                                                }
@@ -1026,8 +1026,8 @@ cs_update_bat( sql_trans *tr, column_sto
                                                if (void_inplace(b, rid[i], 
upd, true) != GDK_SUCCEED)
                                                        res = LOG_ERR;
 
-                                               oid word = rid[i]/32;
-                                               int pos = rid[i]%32;
+                                               oid word = i/32;
+                                               int pos = i%32;
                                                msk[word] |= 1U<<pos;
                                                cnt++;
                                        }
@@ -1039,8 +1039,12 @@ cs_update_bat( sql_trans *tr, column_sto
                if (cnt < ucnt) {       /* now handle real updates */
                        if (cs->ucnt == 0) {
                                if (cnt) {
-                                       ui = BATproject(ins, otids);
-                                       uv = BATproject(ins, oupdates);
+                                       BAT *nins = BATmaskedcands(0, ucnt, 
ins, false);
+                                       if (nins) {
+                                               ui = BATproject(nins, otids);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to