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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list