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

Reply via email to