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