Changeset: f9327ac7fa80 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f9327ac7fa80
Modified Files:
        sql/backends/monet5/mal_backend.h
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_scenario.c
Branch: default
Log Message:

Reset variable ids


diffs (truncated from 331 to 300 lines):

diff --git a/sql/backends/monet5/mal_backend.h 
b/sql/backends/monet5/mal_backend.h
--- a/sql/backends/monet5/mal_backend.h
+++ b/sql/backends/monet5/mal_backend.h
@@ -48,6 +48,7 @@ typedef struct backend {
        int     cur_append; /* The cur_append variable on an 
insert/update/delete on a partitioned table, tracks the current MAL variable 
holding
                                         * the total number of rows affected. */
        int             vtop;                   /* top of the variable stack 
before the current function */
+       int             vid;                    /* old variable id top before 
the current function */
        int     join_idx;       /* number of index joins (used in rel_bin) */
        lng     reloptimizer;   /* timer for optimizer phase */
 
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -32,10 +32,10 @@ static stmt * subrel_bin(backend *be, sq
 static stmt *check_types(backend *be, sql_subtype *ct, stmt *s, check_type 
tpe);
 
 static void
-clean_mal_statements(backend *be, int oldstop, int oldvtop)
+clean_mal_statements(backend *be, int oldstop, int oldvtop, int oldvid)
 {
        MSresetInstructions(be->mb, oldstop);
-       freeVariables(be->client, be->mb, NULL, oldvtop);
+       freeVariables(be->client, be->mb, NULL, oldvtop, oldvid);
 }
 
 static stmt *
@@ -1326,7 +1326,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
        }       break;
        case e_cmp: {
                stmt *l = NULL, *r = NULL, *r2 = NULL;
-               int swapped = 0, is_select = 0, oldvtop, oldstop;
+               int swapped = 0, is_select = 0, oldvtop, oldstop, oldvid;
                sql_exp *re = e->r, *re2 = e->f;
 
                /* general predicate, select and join */
@@ -1341,11 +1341,12 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        for( n = args->h; n; n = n->next ) {
                                oldvtop = be->mb->vtop;
                                oldstop = be->mb->stop;
+                               oldvid = be->mb->vid;
                                s = NULL;
                                if (!swapped)
                                        s = exp_bin(be, n->data, left, NULL, 
grp, ext, cnt, NULL, depth+1, 0, push);
                                if (!s && (first || swapped)) {
-                                       clean_mal_statements(be, oldstop, 
oldvtop);
+                                       clean_mal_statements(be, oldstop, 
oldvtop, oldvid);
                                        s = exp_bin(be, n->data, right, NULL, 
grp, ext, cnt, NULL, depth+1, 0, push);
                                        swapped = 1;
                                }
@@ -1394,29 +1395,31 @@ exp_bin(backend *be, sql_exp *e, stmt *l
 
                oldvtop = be->mb->vtop;
                oldstop = be->mb->stop;
+               oldvid = be->mb->vid;
                if (!l) {
                        l = exp_bin(be, e->l, left, (!reduce)?right:NULL, grp, 
ext, cnt, sel, depth+1, 0, push);
                        swapped = 0;
                }
                if (!l && right) {
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        l = exp_bin(be, e->l, right, NULL, grp, ext, cnt, sel, 
depth+1, 0, push);
                        swapped = 1;
                }
 
                oldvtop = be->mb->vtop;
                oldstop = be->mb->stop;
+               oldvid = be->mb->vid;
                if (swapped || !right || !reduce)
                        r = exp_bin(be, re, left, (!reduce)?right:NULL, grp, 
ext, cnt, sel, depth+1, 0, push);
                else
                        r = exp_bin(be, re, right, NULL, grp, ext, cnt, sel, 
depth+1, 0, push);
                if (!r && !swapped) {
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        r = exp_bin(be, re, left, NULL, grp, ext, cnt, sel, 
depth+1, 0, push);
                        is_select = 1;
                }
                if (!r && swapped) {
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        r = exp_bin(be, re, right, NULL, grp, ext, cnt, sel, 
depth+1, 0, push);
                        is_select = 1;
                }
@@ -2764,12 +2767,12 @@ rel2bin_semijoin(backend *be, sql_rel *r
                                        break;
 
                                if (equality_only) {
-                                       int oldvtop = be->mb->vtop, oldstop = 
be->mb->stop, swap = 0;
+                                       int oldvtop = be->mb->vtop, oldstop = 
be->mb->stop, oldvid = be->mb->vid, swap = 0;
                                        stmt *r, *l = exp_bin(be, e->l, left, 
NULL, NULL, NULL, NULL, NULL, 0, 0, 0);
 
                                        if (!l) {
                                                swap = 1;
-                                               clean_mal_statements(be, 
oldstop, oldvtop);
+                                               clean_mal_statements(be, 
oldstop, oldvtop, oldvid);
                                                l = exp_bin(be, e->l, right, 
NULL, NULL, NULL, NULL, NULL, 0, 0, 0);
                                        }
                                        r = exp_bin(be, e->r, left, right, 
NULL, NULL, NULL, NULL, 0, 0, 0);
@@ -3341,11 +3344,11 @@ rel2bin_project(backend *be, sql_rel *re
        psub = stmt_list(be, pl);
        for( en = rel->exps->h; en; en = en->next ) {
                sql_exp *exp = en->data;
-               int oldvtop = be->mb->vtop, oldstop = be->mb->stop;
+               int oldvtop = be->mb->vtop, oldstop = be->mb->stop, oldvid = 
be->mb->vid;
                stmt *s = exp_bin(be, exp, sub, NULL /*psub*/, NULL, NULL, 
NULL, NULL, 0, 0, 0);
 
                if (!s) { /* try with own projection as well, but first clean 
leftover statements */
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        s = exp_bin(be, exp, sub, psub, NULL, NULL, NULL, NULL, 
0, 0, 0);
                }
                if (!s) /* error */
@@ -3598,7 +3601,7 @@ rel2bin_groupby(backend *be, sql_rel *re
        for( n = aggrs->h; n; n = n->next ) {
                sql_exp *aggrexp = n->data;
                stmt *aggrstmt = NULL;
-               int oldvtop, oldstop;
+               int oldvtop, oldstop, oldvid;
 
                /* first look in the current aggr list (l) and group by column 
list */
                if (l && !aggrstmt && aggrexp->type == e_column)
@@ -3614,13 +3617,14 @@ rel2bin_groupby(backend *be, sql_rel *re
 
                oldvtop = be->mb->vtop;
                oldstop = be->mb->stop;
+               oldvid = be->mb->vid;
                if (!aggrstmt)
                        aggrstmt = exp_bin(be, aggrexp, sub, NULL, grp, ext, 
cnt, NULL, 0, 0, 0);
                /* maybe the aggr uses intermediate results of this group by,
                   therefore we pass the group by columns too
                 */
                if (!aggrstmt) {
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        aggrstmt = exp_bin(be, aggrexp, sub, cursub, grp, ext, 
cnt, NULL, 0, 0, 0);
                }
                if (!aggrstmt) {
@@ -3668,21 +3672,22 @@ rel2bin_topn(backend *be, sql_rel *rel, 
                const char *cname = column_name(sql->sa, sc);
                const char *tname = table_name(sql->sa, sc);
                list *newl = sa_list(sql->sa);
-               int oldvtop = be->mb->vtop, oldstop = be->mb->stop;
+               int oldvtop = be->mb->vtop, oldstop = be->mb->stop, oldvid = 
be->mb->vid;
 
                if (le)
                        l = exp_bin(be, le, NULL, NULL, NULL, NULL, NULL, NULL, 
0, 0, 0);
                if (!l) {
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        l = stmt_atom_lng_nil(be);
                }
 
                oldvtop = be->mb->vtop;
                oldstop = be->mb->stop;
+               oldvid = be->mb->vid;
                if (oe)
                        o = exp_bin(be, oe, NULL, NULL, NULL, NULL, NULL, NULL, 
0, 0, 0);
                if (!o) {
-                       clean_mal_statements(be, oldstop, oldvtop);
+                       clean_mal_statements(be, oldstop, oldvtop, oldvid);
                        o = stmt_atom_lng(be, 0);
                }
                if (!l || !o)
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -4280,11 +4280,9 @@ sql_storage(Client cntxt, MalBlkPtr mb, 
 }
 
 void
-freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int start)
+freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int oldvtop, int oldvid)
 {
-       int i;
-
-       for (i = start; i < mb->vtop;) {
+       for (int i = oldvtop; i < mb->vtop;) {
                if (glb) {
                        if (isVarCleanup(mb, i))
                                garbageElement(c, &glb->stk[i]);
@@ -4296,7 +4294,8 @@ freeVariables(Client c, MalBlkPtr mb, Ma
                clearVariable(mb, i);
                i++;
        }
-       mb->vtop = start;
+       mb->vtop = oldvtop;
+       mb->vid = oldvid;
 }
 
 /* if at least (2*SIZEOF_BUN), also store length (heaps are then
diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h
--- a/sql/backends/monet5/sql.h
+++ b/sql/backends/monet5/sql.h
@@ -283,7 +283,7 @@ sql5_export str second_interval_daytime(
 sql5_export str checkSQLContext(Client cntxt);
 sql5_export str getSQLContext(Client cntxt, MalBlkPtr mb, mvc **c, backend 
**b);
 
-sql5_export void freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int 
start);
+sql5_export void freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int 
oldvtop, int oldvid);
 sql5_export str second_interval_2_daytime(Client cntxt, MalBlkPtr mb, 
MalStkPtr stk, InstrPtr pci);
 sql5_export str timestamp_2_daytime(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
 sql5_export str date_2_timestamp(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -314,7 +314,7 @@ SQLescapeString(str s)
 str
 SQLstatementIntern(Client c, const char *expr, const char *nme, bit execute, 
bit output, res_table **result)
 {
-       int status = 0, err = 0, oldvtop, oldstop = 1, inited = 0, ac, 
sizeframes, topframes;
+       int status = 0, err = 0, oldvtop, oldstop = 1, oldvid, inited = 0, ac, 
sizeframes, topframes;
        unsigned int label;
        mvc *o = NULL, *m = NULL;
        sql_frame **frames;
@@ -464,6 +464,7 @@ SQLstatementIntern(Client c, const char 
                }
                oldvtop = c->curprg->def->vtop;
                oldstop = c->curprg->def->stop;
+               oldvid = c->curprg->def->vid;
                r = sql_symbol2relation(sql, m->sym);
 #ifdef _SQL_COMPILE
                mnstr_printf(c->fdout, "#SQLstatement:\n");
@@ -481,7 +482,7 @@ SQLstatementIntern(Client c, const char 
                                sqlcleanup(sql, err);
                                /* restore the state */
                                MSresetInstructions(c->curprg->def, oldstop);
-                               freeVariables(c, c->curprg->def, c->glb, 
oldvtop);
+                               freeVariables(c, c->curprg->def, c->glb, 
oldvtop, oldvid);
                                c->curprg->def->errors = 0;
                                goto endofcompile;
                        }
@@ -559,7 +560,7 @@ SQLstatementIntern(Client c, const char 
                        sqlcleanup(sql, err);
                        /* restore the state */
                        MSresetInstructions(c->curprg->def, oldstop);
-                       freeVariables(c, c->curprg->def, c->glb, oldvtop);
+                       freeVariables(c, c->curprg->def, c->glb, oldvtop, 
oldvid);
                        c->curprg->def->errors = 0;
                        goto endofcompile;
                }
@@ -574,7 +575,7 @@ SQLstatementIntern(Client c, const char 
                                // restore the state
                                char *error = NULL;
                                MSresetInstructions(c->curprg->def, oldstop);
-                               freeVariables(c, c->curprg->def, c->glb, 
oldvtop);
+                               freeVariables(c, c->curprg->def, c->glb, 
oldvtop, oldvid);
                                c->curprg->def->errors = 0;
                                if (strlen(m->errstr) > 6 && m->errstr[5] == 
'!')
                                        error = createException(PARSE, 
"SQLparser", "%s", m->errstr);
@@ -600,7 +601,7 @@ SQLstatementIntern(Client c, const char 
                        msg = SQLrun(c,m);
                        be->depth--;
                        MSresetInstructions(c->curprg->def, oldstop);
-                       freeVariables(c, c->curprg->def, NULL, oldvtop);
+                       freeVariables(c, c->curprg->def, NULL, oldvtop, oldvid);
                        sqlcleanup(sql, 0);
                        if (!execute)
                                goto endofcompile;
@@ -727,7 +728,7 @@ cleanup_engine:
        be->q = NULL;
        sqlcleanup(be, (!msg) ? 0 : -1);
        MSresetInstructions(c->curprg->def, 1);
-       freeVariables(c, c->curprg->def, NULL, be->vtop);
+       freeVariables(c, c->curprg->def, NULL, be->vtop, be->vid);
        be->language = oldlang;
        /*
         * Any error encountered during execution should block further 
processing
@@ -768,8 +769,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
        refs = sa_list(m->sa);
        rel = rel_read(m, *expr, &pos, refs);
        if (rel) {
-               int oldvtop = c->curprg->def->vtop;
-               int oldstop = c->curprg->def->stop;
+               int oldvtop = c->curprg->def->vtop, oldstop = 
c->curprg->def->stop, oldvid = c->curprg->def->vid;
 
                if (*opt && rel)
                        rel = sql_processrelation(m, rel, 1, 1);
@@ -792,7 +792,7 @@ RAstatement(Client c, MalBlkPtr mb, MalS
                        msg = SQLrun(c,m);
                if (!msg) {
                        resetMalBlk(c->curprg->def, oldstop);
-                       freeVariables(c, c->curprg->def, NULL, oldvtop);
+                       freeVariables(c, c->curprg->def, NULL, oldvtop, oldvid);
                }
                if (!msg)
                        msg = mvc_commit(m, 0, NULL, false);
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -922,7 +922,7 @@ SQLparser(Client c)
        str msg = NULL;
        backend *be;
        mvc *m;
-       int oldvtop, oldstop;
+       int oldvtop, oldstop, oldvid;
        int pstatus = 0;
        int err = 0, opt, preparedid = -1;
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to