Changeset: e00733277455 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e00733277455
Modified Files:
sql/backends/monet5/sql.mx
sql/backends/monet5/sql_gencode.mx
sql/backends/monet5/sql_scenario.mx
sql/server/rel_dump.c
sql/server/rel_prop.c
sql/server/rel_prop.h
sql/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
sql/test/Tests/order_by_complex_exp.stable.out
sql/test/leaks/Tests/check0.stable.out
sql/test/leaks/Tests/check1.stable.out
sql/test/leaks/Tests/check2.stable.out
sql/test/leaks/Tests/check3.stable.out
sql/test/leaks/Tests/check4.stable.out
sql/test/leaks/Tests/check5.stable.out
Branch: default
Log Message:
fixes for the Direct Relation Algebra execution
diffs (truncated from 1182 to 300 lines):
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -1377,6 +1377,8 @@
sql5_export str getContext(Client cntxt, MalBlkPtr mb, mvc **c, backend **b );
+sql5_export void freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int
start);
+
#endif /* _SQL_H */
@-
@@ -6346,19 +6348,20 @@
str msg = getContext(cntxt, mb, &m, &b);
sql_rel *rel;
- printf("execute relational algebra %s\n", *expr);
m->sa = sa_create();
- //SQLtrans(m);
rel = rel_read(m, *expr, &pos);
if (rel) {
+ int oldvtop = cntxt->curprg->def->vtop;
int oldstop = cntxt->curprg->def->stop;
stmt *s;
char *msg;
rel_print(m, rel, 0);
- if (*opt)
- printf(" optimize it \n");
s = output_rel_bin(m, rel);
+ if (*opt) {
+ rel = rel_optimizer(m, rel);
+ rel_print(m, rel, 0);
+ }
rel_destroy(rel);
s = rel2bin(m, s);
s = bin_optimizer(m, s);
@@ -6370,8 +6373,39 @@
addQueryToCache(cntxt);
msg = (str) runMAL(cntxt, cntxt->curprg->def, 1, 0, 0, 0);
- if (!msg)
+ if (!msg) {
resetMalBlk(cntxt->curprg->def, oldstop);
+ freeVariables(cntxt,cntxt->curprg->def, cntxt->glb,
oldvtop);
+ }
}
return msg;
}
+
+void
+freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int start)
+{
+ int i, j;
+
+ for (i = start; i < mb->vtop;) {
+ if (glb) {
+ if (isVarCleanup(mb,i))
+ garbageElement(c,&glb->stk[i]);
+ /* clean stack entry */
+ glb->stk[i].vtype = TYPE_int;
+ glb->stk[i].val.ival = 0;
+ glb->stk[i].len = 0;
+ }
+ clearVariable(mb, i);
+ i++;
+ }
+ mb->vtop = start;
+ for (i = j = 0; i < mb->ptop; i++) {
+ if (mb->prps[i].var < start) {
+ if (i > j)
+ mb->prps[j] = mb->prps[i];
+ j++;
+ }
+ }
+ mb->ptop = j;
+}
+
diff --git a/sql/backends/monet5/sql_gencode.mx
b/sql/backends/monet5/sql_gencode.mx
--- a/sql/backends/monet5/sql_gencode.mx
+++ b/sql/backends/monet5/sql_gencode.mx
@@ -2073,7 +2073,7 @@
backend_callinline(backend *be, Client c, stmt *s )
{
mvc *m = be->mvc;
- InstrPtr curInstr = 0, p;
+ InstrPtr curInstr = 0;
MalBlkPtr curBlk = c->curprg->def;
curInstr = getInstrPtr(curBlk, 0);
@@ -2104,12 +2104,6 @@
}
}
backend_dumpstmt(be, curBlk, s);
-
- p = newFcnCall(curBlk, "optimizer", "remap");
- typeChecker(c->nspace, curBlk, p, FALSE);
- p = newFcnCall(curBlk, "optimizer", "multiplex");
- typeChecker(c->nspace, curBlk, p, FALSE);
- optimizeMALBlock(c, curBlk);
c->curprg->def = curBlk;
}
@@ -2123,7 +2117,7 @@
int argc = 0;
char arg[SMALLBUFSIZ];
node *n;
- lng Toptimize = 0;
+ lng Toptimize = 0, Tparse = 0;
backup = c->curprg;
@@ -2182,7 +2176,7 @@
backend_dumpstmt(be, mb, s);
Toptimize = GDKusec();
- m->Tparse = Toptimize - m->Tparse;
+ Tparse = Toptimize - m->Tparse;
if (m->history) {
char *t;
@@ -2200,7 +2194,7 @@
q->token = REMsymbol;
q = pushWrd(mb, q, queryid);
q = pushStr(mb, q, t);
- q = pushLng(mb, q, m->Tparse );
+ q = pushLng(mb, q, Tparse );
(void) pushLng(mb, q, Toptimize);
m->Tparse = 0;
}
diff --git a/sql/backends/monet5/sql_scenario.mx
b/sql/backends/monet5/sql_scenario.mx
--- a/sql/backends/monet5/sql_scenario.mx
+++ b/sql/backends/monet5/sql_scenario.mx
@@ -580,34 +580,6 @@
caching.
@c
-static void
-freeVariables(Client c, MalBlkPtr mb, MalStkPtr glb, int start)
-{
- int i, j;
-
- for (i = start; i < mb->vtop;) {
- if (glb) {
- if (isVarCleanup(mb,i))
- garbageElement(c,&glb->stk[i]);
- /* clean stack entry */
- glb->stk[i].vtype = TYPE_int;
- glb->stk[i].val.ival = 0;
- glb->stk[i].len = 0;
- }
- clearVariable(mb, i);
- i++;
- }
- mb->vtop = start;
- for (i = j = 0; i < mb->ptop; i++) {
- if (mb->prps[i].var < start) {
- if (i > j)
- mb->prps[j] = mb->prps[i];
- j++;
- }
- }
- mb->ptop = j;
-}
-
/* #define _SQL_COMPILE */
/*
@@ -1331,8 +1303,20 @@
if (m->emod & mod_debug)
SQLsetDebugger(c, m, TRUE);
if ((m->emode != m_inplace && m->emode != m_prepare &&
!m->caching && m->emode != m_explain) || s->type == st_none || m->type ==
Q_TRANS) {
+ InstrPtr p;
+ MalBlkPtr curBlk;
+
scanner_query_processed(&(m->scanner));
backend_callinline(be, c, s );
+
+ curBlk = c->curprg->def;
+ p = newFcnCall(curBlk, "optimizer", "remap");
+ typeChecker(c->nspace, curBlk, p, FALSE);
+ p = newFcnCall(curBlk, "optimizer", "multiplex");
+ typeChecker(c->nspace, curBlk, p, FALSE);
+ optimizeMALBlock(c, curBlk);
+ c->curprg->def = curBlk;
+
if( m->emode == m_inplace)
m->emode = m_normal;
} else {
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -25,6 +25,7 @@
#include "rel_exp.h"
#include "rel_prop.h"
#include "rel_select.h"
+#include "rel_semantic.h"
static void
print_indent(mvc *sql, stream *fout, int depth)
@@ -199,8 +200,8 @@
if (e->p) {
prop *p = e->p;
- for (; p; p = p->p)
- mnstr_printf(fout, " %s", propkind2string(p));
+ for (; p; p = p->p)
+ mnstr_printf(fout, " %s %s", propkind2string(p),
propvalue2string(p));
}
if (comma)
mnstr_printf(fout, ", ");
@@ -400,14 +401,11 @@
print_indent(sql, fout, depth);
mnstr_printf(fout, ")");
}
- if (rel->r &&
- (rel->op == op_groupby || rel->op == op_project)) {
- /* group by and order by columns */
- if (rel->op == op_project)
- r = " order by ";
+ if (rel->r && rel->op == op_groupby) /* group by columns */
exps_print(sql, fout, rel->r, depth, 1, 0);
- }
exps_print(sql, fout, rel->exps, depth, 1, 0);
+ if (rel->r && rel->op == op_project) /* order by columns */
+ exps_print(sql, fout, rel->r, depth, 1, 0);
break;
case op_insert:
case op_update:
@@ -607,6 +605,46 @@
static sql_exp* exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int
*pos, int grp) ;
+
+static void *
+read_prop( mvc *sql, sql_exp *exp, char *r, int *pos)
+{
+ /* PROPs */
+ if (strncmp(r+*pos, "JOINIDX", strlen("JOINIDX")) == 0) {
+ int old;
+ char *sname,*tname,*iname;
+ sql_schema *s = NULL;
+ prop *p;
+
+ (*pos)+= strlen("JOINIDX");
+ skipWS(r, pos);
+ /* schema.table.index */
+ sname = r+*pos;
+ skipIdent(r,pos);
+ if (r[*pos] != '.')
+ return sql_error(sql, -1, "JOINIDX: missing '.'\n");
+ r[*pos] = 0;
+ (*pos)++;
+ tname = r+*pos;
+ skipIdent(r,pos);
+ if (r[*pos] != '.')
+ return sql_error(sql, -1, "JOINIDX: missing '.'\n");
+ r[*pos] = 0;
+ (*pos)++;
+ iname = r+*pos;
+ skipIdent(r,pos);
+ old = r[*pos];
+ r[*pos] = 0;
+
+ s = mvc_bind_schema(sql, sname);
+ p = exp->p = prop_create(sql->sa, PROP_JOINIDX, exp->p);
+ p->value = mvc_bind_idx(sql, s, iname);
+ r[*pos] = old;
+ skipWS(r,pos);
+ }
+ return exp->p;
+}
+
static list*
read_exps(mvc *sql, sql_rel *lrel, sql_rel *rrel, char *r, int *pos, char
bracket, int grp)
{
@@ -629,6 +667,7 @@
}
append(exps, e);
skipWS( r, pos);
+ read_prop( sql, e, r, pos);
while (r[*pos] == ',') {
(*pos)++;
skipWS( r, pos);
@@ -637,6 +676,7 @@
return NULL;
append(exps, e);
skipWS( r, pos);
+ read_prop( sql, e, r, pos);
}
if (r[*pos] != ebracket)
return sql_error(sql, -1, "missing closing %c\n",
ebracket);
@@ -714,6 +754,7 @@
} else {
st = readString(r,pos);
exp = exp_atom(sql->sa, atom_general(sql->sa, tpe, st));
+ skipWS(r, pos);
}
break;
case '\"':
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list