Changeset: 1986b1b65816 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1986b1b65816 Modified Files: monetdb5/modules/mal/querylog.c monetdb5/modules/mal/wlc.h monetdb5/optimizer/opt_evaluate.c monetdb5/optimizer/opt_pipes.c sql/server/rel_unnest.c sql/test/mergetables/Tests/sqlsmith-exists.stable.out Branch: default Log Message:
protect agains referenced relations cleanup some code for windows compilation diffs (truncated from 463 to 300 lines): diff --git a/monetdb5/modules/mal/querylog.c b/monetdb5/modules/mal/querylog.c --- a/monetdb5/modules/mal/querylog.c +++ b/monetdb5/modules/mal/querylog.c @@ -79,6 +79,8 @@ static BAT *QLOG_calls_result = 0; static BAT *QLOG_calls_cpuload = 0; static BAT *QLOG_calls_iowait = 0; +static MT_Lock QLOGlock = MT_LOCK_INITIALIZER("QLOGlock"); + str QLOGcatalog(BAT **r) { @@ -90,7 +92,7 @@ QLOGcatalog(BAT **r) msg = initQlog(); if( msg) return msg; - MT_lock_set(&mal_profileLock); + MT_lock_set(&QLOGlock); r[0] = COLcopy(QLOG_cat_id, QLOG_cat_id->ttype, false, TRANSIENT); r[1] = COLcopy(QLOG_cat_user, QLOG_cat_user->ttype,false, TRANSIENT); r[2] = COLcopy(QLOG_cat_defined, QLOG_cat_defined->ttype,false, TRANSIENT); @@ -99,7 +101,7 @@ QLOGcatalog(BAT **r) r[5] = COLcopy(QLOG_cat_plan, QLOG_cat_plan->ttype,false, TRANSIENT); r[6] = COLcopy(QLOG_cat_mal, QLOG_cat_mal->ttype,false, TRANSIENT); r[7] = COLcopy(QLOG_cat_optimize, QLOG_cat_optimize->ttype,false, TRANSIENT); - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); for ( i = 0; i< 8; i++) cnt += r[i] != 0; if( cnt != 8){ @@ -125,7 +127,7 @@ QLOGcalls(BAT **r) msg = initQlog(); if( msg) return msg; - MT_lock_set(&mal_profileLock); + MT_lock_set(&QLOGlock); r[0] = COLcopy(QLOG_calls_id, QLOG_calls_id->ttype, false, TRANSIENT); r[1] = COLcopy(QLOG_calls_start, QLOG_calls_start->ttype,false, TRANSIENT); r[2] = COLcopy(QLOG_calls_stop, QLOG_calls_stop->ttype,false, TRANSIENT); @@ -135,7 +137,7 @@ QLOGcalls(BAT **r) r[6] = COLcopy(QLOG_calls_result, QLOG_calls_result->ttype,false, TRANSIENT); r[7] = COLcopy(QLOG_calls_cpuload, QLOG_calls_cpuload->ttype,false, TRANSIENT); r[8] = COLcopy(QLOG_calls_iowait, QLOG_calls_iowait->ttype,false, TRANSIENT); - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); for ( i = 0; i< 9; i++) cnt += r[i] != 0; if( cnt != 9){ @@ -248,9 +250,9 @@ initQlog(void) if (QLOG_init) return MAL_SUCCEED; /* already initialized */ - MT_lock_set(&mal_profileLock); + MT_lock_set(&QLOGlock); msg = _initQlog(); - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); return msg; } @@ -300,7 +302,7 @@ QLOGempty(void *ret) msg = initQlog(); if( msg) return msg; - MT_lock_set(&mal_profileLock); + MT_lock_set(&QLOGlock); /* drop all querylog tables */ BATclear(QLOG_cat_id,true); @@ -323,7 +325,7 @@ QLOGempty(void *ret) BATclear(QLOG_calls_iowait,true); TMsubcommit_list(commitlist, committop); - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); return MAL_SUCCEED; } @@ -345,7 +347,7 @@ QLOGappend(Client cntxt, MalBlkPtr mb, M if( msg) return msg; snprintf(buf,128,"%s.%s", getModuleId(sig), getFunctionId(sig)); - MT_lock_set(&mal_profileLock); + MT_lock_set(&QLOGlock); o = BUNfnd(QLOG_cat_id, &mb->tag); if ( o == BUN_NONE){ *ret = mb->tag; @@ -357,11 +359,11 @@ QLOGappend(Client cntxt, MalBlkPtr mb, M BUNappend(QLOG_cat_optimize,&mb->optimize,false) != GDK_SUCCEED || BUNappend(QLOG_cat_user,*usr,false) != GDK_SUCCEED || BUNappend(QLOG_cat_defined,tick,false) != GDK_SUCCEED) { - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); throw(MAL, "querylog.append", SQLSTATE(HY001) MAL_MALLOC_FAIL); } } - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); TMsubcommit_list(commitlist, committop); return MAL_SUCCEED; } @@ -409,7 +411,7 @@ QLOGcall(Client cntxt, MalBlkPtr mb, Mal return msg; if ( *xtime + *rtime < QLOGthreshold) return MAL_SUCCEED; - MT_lock_set(&mal_profileLock); + MT_lock_set(&QLOGlock); if (BUNappend(QLOG_calls_id,&mb->tag,false) != GDK_SUCCEED || BUNappend(QLOG_calls_start,tick1,false) != GDK_SUCCEED || BUNappend(QLOG_calls_stop,tick2,false) != GDK_SUCCEED || @@ -419,10 +421,10 @@ QLOGcall(Client cntxt, MalBlkPtr mb, Mal BUNappend(QLOG_calls_result,rtime,false) != GDK_SUCCEED || BUNappend(QLOG_calls_cpuload,cpu,false) != GDK_SUCCEED || BUNappend(QLOG_calls_iowait,iowait,false) != GDK_SUCCEED) { - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); throw(MAL, "querylog.call", SQLSTATE(HY001) MAL_MALLOC_FAIL); } - MT_lock_unset(&mal_profileLock); + MT_lock_unset(&QLOGlock); TMsubcommit_list(commitlist, committop); return MAL_SUCCEED; } diff --git a/monetdb5/modules/mal/wlc.h b/monetdb5/modules/mal/wlc.h --- a/monetdb5/modules/mal/wlc.h +++ b/monetdb5/modules/mal/wlc.h @@ -11,6 +11,7 @@ #include "gdk.h" #include <time.h> +#include "mal.h" #include "mal_exception.h" #include "mal_interpreter.h" @@ -18,7 +19,7 @@ #define WLC_QUERY 1 #define WLC_UPDATE 2 -#define WLC_CATALOG 3 +#define WLC_CATALOG 3 #define WLC_IGNORE 4 /* WLC modes */ diff --git a/monetdb5/optimizer/opt_evaluate.c b/monetdb5/optimizer/opt_evaluate.c --- a/monetdb5/optimizer/opt_evaluate.c +++ b/monetdb5/optimizer/opt_evaluate.c @@ -120,7 +120,6 @@ OPTevaluateImplementation(Client cntxt, InstrPtr p; int i, k, limit, *alias = 0, barrier; MalStkPtr env = NULL; - int profiler, sqlprofiler; int debugstate = cntxt->itrace, actions = 0, constantblock = 0; int *assigned = 0, use; char buf[256]; @@ -178,9 +177,6 @@ OPTevaluateImplementation(Client cntxt, if (use && p->retc == 1 && OPTallConstant(cntxt, mb, p) && !isUnsafeFunction(p)) { barrier = p->barrier; p->barrier = 0; - profiler = malProfileMode; /* we don't trace it */ - sqlprofiler = cntxt->sqlprofiler; - malProfileMode = 0; if ( env == NULL) { env = prepareMALstack(mb, 2 * mb->vsize); if (!env) { @@ -190,8 +186,6 @@ OPTevaluateImplementation(Client cntxt, env->keepAlive = TRUE; } msg = reenterMAL(cntxt, mb, i, i + 1, env); - malProfileMode= profiler; - cntxt->sqlprofiler = sqlprofiler; p->barrier = barrier; if( OPTdebug & OPTevaluate){ fprintf(stderr, "#retc var %s\n", getVarName(mb, getArg(p, 0))); diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c --- a/monetdb5/optimizer/opt_pipes.c +++ b/monetdb5/optimizer/opt_pipes.c @@ -451,14 +451,12 @@ validateOptimizerPipes(void) int i; str msg = MAL_SUCCEED; - MT_lock_set(&mal_contextLock); for (i = 0; i < MAXOPTPIPES && pipes[i].def; i++) if (pipes[i].mb) { msg = validatePipe(pipes[i].mb); if (msg != MAL_SUCCEED) break; } - MT_lock_unset(&mal_contextLock); return msg; } diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -604,6 +604,7 @@ rel_general_unnest(mvc *sql, sql_rel *re sql_rel *D = rel_project(sql->sa, rel_dup(l), exps_copy(sql, ad)); set_distinct(D); + assert(!rel_is_ref(r)); r = rel_crossproduct(sql->sa, D, r, rel->op); r->op = /*is_semi(rel->op)?op_left:*/op_join; move_join_exps(sql, rel, r); @@ -653,11 +654,18 @@ rel_general_unnest(mvc *sql, sql_rel *re static sql_rel * push_up_project(mvc *sql, sql_rel *rel, list *ad) { + sql_rel *r = rel->r; + + if (rel_is_ref(r)) { + sql_rel *nr = rel_project(sql->sa, rel_dup(r->l), exps_copy(sql, r->exps)); + rel_destroy(r); + rel->r = r = nr; + } + /* input rel is dependent outerjoin with on the right a project, we first try to push inner side expressions down (because these cannot be pushed up) */ if (rel && is_outerjoin(rel->op) && is_dependent(rel)) { sql_rel *r = rel->r; - assert(!rel_is_ref(r)); /* find constant expressions and move these down */ if (r && r->op == op_project) { node *n; @@ -665,7 +673,7 @@ push_up_project(mvc *sql, sql_rel *rel, list *cexps = NULL; sql_rel *l = r->l; - if (l && is_select(l->op)) { + if (l && is_select(l->op) && !rel_is_ref(l)) { for(n=r->exps->h; n; n=n->next) { sql_exp *e = n->data; @@ -700,8 +708,7 @@ push_up_project(mvc *sql, sql_rel *rel, if (rel && is_join(rel->op) && is_dependent(rel)) { sql_rel *r = rel->r; - assert(!rel_is_ref(r)); - if (r && r->op == op_project /*&& r->l*/) { + if (r && r->op == op_project) { sql_exp *id = NULL; node *m; /* move project up, ie all attributes of left + the old expression list */ @@ -750,31 +757,20 @@ push_up_project(mvc *sql, sql_rel *rel, /* remove old project */ rel->r = r->l; r->l = NULL; - rel_destroy(r); - r = rel->r; + rel_destroy(r); return n; - /* - } else if (r && r->op == op_project && !r->l) { - sql_rel *l = rel->l; - - rel->l = NULL; - rel_destroy(rel); - return l; - */ } } /* a dependent semi/anti join with a project on the right side, could be removed */ if (rel && is_semi(rel->op) && is_dependent(rel)) { sql_rel *r = rel->r; - assert(!rel_is_ref(r)); /* merge project expressions into the join expressions */ rel->exps = push_up_project_exps(sql, r, rel->exps); if (r && r->op == op_project && r->l) { /* remove old project */ - rel->r = r->l; - r->l = NULL; + rel->r = rel_dup(r->l); rel_destroy(r); return rel; } else if (r && r->op == op_project) { @@ -789,9 +785,9 @@ push_up_project(mvc *sql, sql_rel *rel, append(nexps, e); } if (list_empty(nexps)) { + assert(!r->l); /* remove old project and change outer into select */ - rel->r = r->l; - r->l = NULL; + rel->r = NULL; rel_destroy(r); rel->op = op_select; return rel; @@ -811,9 +807,8 @@ push_up_topn(mvc *sql, sql_rel *rel) if (r && r->op == op_topn) { /* remove old topn */ - rel->r = r->l; + rel->r = rel_dup(r->l); rel = rel_topn(sql->sa, rel, r->exps); - r->l = NULL; rel_destroy(r); return rel; } @@ -861,14 +856,15 @@ push_up_select(mvc *sql, sql_rel *rel, l reset_dependent(rel); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list