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