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