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

Reply via email to