Changeset: a369a007a73d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a369a007a73d
Modified Files:
        MonetDB5/src/mal/mal_interpreter.mx
        MonetDB5/src/optimizer/opt_mergetable.mx
        MonetDB5/src/optimizer/opt_mitosis.mx
        sql/src/backends/monet5/sql.mx
        sql/src/backends/monet5/sql_gencode.mx
        sql/src/common/Makefile.ag
        sql/src/common/sql_mem.c
        sql/src/common/sql_types.c
        sql/src/common/sql_types.h
        sql/src/include/Makefile.ag
        sql/src/include/sql_mem.h
        sql/src/server/bin_optimizer.c
        sql/src/server/rel_bin.c
        sql/src/server/rel_subquery.c
        sql/src/server/sql_psm.c
        sql/src/server/sql_rel2bin.c
        sql/src/server/sql_rel2bin.h
        sql/src/server/sql_semantic.c
        sql/src/server/sql_statement.c
        sql/src/server/sql_statement.h
        sql/src/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out
        
sql/src/test/BugTracker-2010/Tests/LIMIT_OFFSET_big-endian.Bug-2622.stable.out
        
sql/src/test/BugTracker-2010/Tests/group-by_ordered_column.Bug-2564.stable.out
        
sql/src/test/BugTracker-2010/Tests/incomplete-utf8-sequence.Bug-2575.stable.err
        sql/src/test/Dependencies/Tests/Dependencies.stable.out
        sql/src/test/Tests/crashme.timeout
        sql/src/test/Tests/trace.stable.out
        sql/src/test/leaks/Tests/check0.stable.out
        sql/src/test/leaks/Tests/check1.stable.out
        sql/src/test/leaks/Tests/check2.stable.out
        sql/src/test/leaks/Tests/check3.stable.out
        sql/src/test/leaks/Tests/check4.stable.out
        sql/src/test/leaks/Tests/check5.stable.out
Branch: default
Log Message:

major cleanup

        the stmt structure's op1,op2 and op3 are now stmt pointers
        only the op4 can have special types
                such as typeval, func/aggr
                        table/column
                        list and atom

        we now flatten the stmt tree before we issue the bin_optimizer
        and mal generation. This solves crashes with to deep recursion.


diffs (truncated from 6700 to 300 lines):

diff -r 4a6c284388e7 -r a369a007a73d MonetDB5/src/mal/mal_interpreter.mx
--- a/MonetDB5/src/mal/mal_interpreter.mx       Wed Dec 01 18:50:24 2010 +0100
+++ b/MonetDB5/src/mal/mal_interpreter.mx       Wed Dec 01 22:27:25 2010 +0100
@@ -871,7 +871,7 @@
                return NULL;
        q->size = ((sz<<1)>>1); /* we want a multiple of 2 */
        q->last = 0;
-       q->data = (void*)GDKmalloc(sizeof(void*)*sz);
+       q->data = (void*)GDKmalloc(sizeof(void*)*q->size);
        if ( q->data == NULL){
                GDKfree(q);
                return NULL;
@@ -899,7 +899,7 @@
        if (q->last == q->size) {
                /* enlarge buffer */
                q->size <<= 1;
-               q->data = GDKrealloc(q->data, q->size);
+               q->data = GDKrealloc(q->data, sizeof(void*)*q->size);
        }
        q->data[q->last++] = d;
        MT_unset_lock(q->l, "q_enqueue");
@@ -914,7 +914,7 @@
        if (q->last == q->size) {
                /* enlarge buffer */
                q->size <<= 1;
-               q->data = GDKrealloc(q->data, q->size);
+               q->data = GDKrealloc(q->data, sizeof(void*)*q->size);
        }
        for ( i=q->last; i > 0; i--)
                q->data[i]= q->data[i-1];
diff -r 4a6c284388e7 -r a369a007a73d MonetDB5/src/optimizer/opt_mergetable.mx
--- a/MonetDB5/src/optimizer/opt_mergetable.mx  Wed Dec 01 18:50:24 2010 +0100
+++ b/MonetDB5/src/optimizer/opt_mergetable.mx  Wed Dec 01 22:27:25 2010 +0100
@@ -1759,6 +1759,25 @@
                        r = pushArgument(mb, r, vm);
                }
        } else {
+               /* if right overlaps full range of left we first semijoin */
+               /* assume if first overlaps all do ? */
+               if (0 && m >= 0 && Hoverlap(mb, 
getArg(mat[m].mi,1),p->argv[2])) {
+                       /* push in between a b.semijoin(mat) */ 
+                       InstrPtr semi = copyInstruction(p), bc;
+
+                       semi->argv[0] = p->argv[2];
+                       semi->argv[1] = p->argv[2];
+                       semi->argv[2] = p->argv[1];
+                       getFunctionId(semi) = semijoinRef;
+                       m = isMATalias(getArg(semi,2), mat, mtop);
+                       if ((bc = mat_semijoin(mb, semi, mat, m)) != NULL)
+                               mtop = mat_add(mat, mtop, bc, NULL, mat_none );
+                       /* now use semijoin result as input to union */
+                       p->argv[2] = semi->argv[0];
+                       m = isMATalias(getArg(p,1), mat, mtop);
+                       n = isMATalias(getArg(p,2), mat, mtop);
+                       return mat_union(mb, p, mat, mtop, m, n);
+               }
                if (m >= 0) {
                        for(k=1; k<mat[m].mi->argc; k++) 
                                r = pushArgument(mb, r, getArg(mat[m].mi,k));
@@ -1929,7 +1948,7 @@
        n = isMATalias(getArg(p,2), mat, mtop);
 
        /* recognize kdiff(u).union(u) but also kdiff(u).union(select(u, ..)) */
-       if (getFunctionId(p) == kdifferenceRef &&
+       if (0 && getFunctionId(p) == kdifferenceRef &&
            cur + 2 < oldtop && 
            (getModuleId(u) == algebraRef || getModuleId(u) == pcreRef) && 
getFunctionId(u) == kunionRef &&
            isSelect(q) &&
@@ -1967,7 +1986,7 @@
                n = isMATalias(getArg(u,2), mat, mtop);
                *Mtop = mat_union(mb, u, mat, mtop, m, n);
                return 2;
-       } else if (getFunctionId(p) == kdifferenceRef &&
+       } else if (0 && getFunctionId(p) == kdifferenceRef &&
                cur + 1 < oldtop &&
                getModuleId(q) == algebraRef && getFunctionId(q) == kunionRef &&
                p->argv[0] == q->argv[1] && p->argv[2] == q->argv[2]) { 
diff -r 4a6c284388e7 -r a369a007a73d MonetDB5/src/optimizer/opt_mitosis.mx
--- a/MonetDB5/src/optimizer/opt_mitosis.mx     Wed Dec 01 18:50:24 2010 +0100
+++ b/MonetDB5/src/optimizer/opt_mitosis.mx     Wed Dec 01 22:27:25 2010 +0100
@@ -113,8 +113,8 @@
                q= getInstrPtr(mb,i);
                if (getModuleId(q)!= sqlRef || getFunctionId(q)!=bindRef )
                        continue;
-               /* don't split insert or update BATs */
-               if (getVarConstant(mb, getArg(q,5)).val.ival != 0 )
+               /* don't split insert BATs */
+               if (getVarConstant(mb, getArg(q,5)).val.ival == 1 )
                        continue;
                if( q->argc > 6 )
                        continue; /* already partitioned */
@@ -195,8 +195,8 @@
                        pushInstruction(mb,p);
                        continue;
                }
-               /* don't split insert or update BATs */
-               if (getVarConstant(mb, getArg(p,5)).val.ival != 0 ){
+               /* don't split insert BATs */
+               if (getVarConstant(mb, getArg(p,5)).val.ival == 1 ){
                        pushInstruction(mb,p);
                        continue;
                }
diff -r 4a6c284388e7 -r a369a007a73d sql/src/backends/monet5/sql.mx
--- a/sql/src/backends/monet5/sql.mx    Wed Dec 01 18:50:24 2010 +0100
+++ b/sql/src/backends/monet5/sql.mx    Wed Dec 01 22:27:25 2010 +0100
@@ -1436,29 +1436,17 @@
                }
                rel_destroy(r);
                if (s) {
-                       stmt *opt;
-
                        /* only needed for delta tables */
-                       opt = rel2bin(c, s);    
-                       s = bin_optimizer(c, opt);
+                       s = rel2bin(c, s);      
+                       s = bin_optimizer(c, s);
                        c->point_query = pq;
                        return s;
                }
        }
 
-       if (s){
-               stmt *opt;
-
-               if (mvc_debug_on(c,128)) 
-                       stmt2dot(c->sa, s, 1, "/tmp/g1.dot");
-               opt = rel2bin(c, s);
-               s = opt;
-               if (mvc_debug_on(c,128)) 
-                       stmt2dot(c->sa, s, 2, "/tmp/g2.dot");
-               opt = bin_optimizer(c, s);
-               s = opt;
-               if (mvc_debug_on(c,128)) 
-                       stmt2dot(c->sa, s, 3, "/tmp/g3.dot");
+       if (s) {
+               s = rel2bin(c, s);
+               s = bin_optimizer(c, s);
        }
        return s;
 }
diff -r 4a6c284388e7 -r a369a007a73d sql/src/backends/monet5/sql_gencode.mx
--- a/sql/src/backends/monet5/sql_gencode.mx    Wed Dec 01 18:50:24 2010 +0100
+++ b/sql/src/backends/monet5/sql_gencode.mx    Wed Dec 01 22:27:25 2010 +0100
@@ -267,35 +267,35 @@
 {
        int ls = 0, hs = 0;
        stmt *l = NULL, *h = NULL;
-       stmt *bl = s->op2.stval, *bh = s->op3.stval;
-       int tt = tail_type(s->op2.stval)->type->localtype;
+       stmt *bl = s->op2, *bh = s->op3;
+       int tt = tail_type(s->op2)->type->localtype;
 
        if (tt > TYPE_lng)
                return 0;  
-       if (s->op2.stval->type == st_binop) {
-               bl = s->op2.stval->op1.stval;
-               l  = s->op2.stval->op2.stval;
-       } else if (s->op2.stval->type == st_Nop && 
-           list_length(s->op2.stval->op1.stval->op1.lval) == 2) {
-               bl = s->op2.stval->op1.stval->op1.lval->h->data;
-               l  = s->op2.stval->op1.stval->op1.lval->h->next->data;
+       if (s->op2->type == st_binop) {
+               bl = s->op2->op1;
+               l  = s->op2->op2;
+       } else if (s->op2->type == st_Nop && 
+           list_length(s->op2->op1->op4.lval) == 2) {
+               bl = s->op2->op1->op4.lval->h->data;
+               l  = s->op2->op1->op4.lval->t->data;
        }
-       if (s->op3.stval->type == st_binop) {
-               bh = s->op3.stval->op1.stval;
-               h  = s->op3.stval->op2.stval;
+       if (s->op3->type == st_binop) {
+               bh = s->op3->op1;
+               h  = s->op3->op2;
        }
-       else if (s->op3.stval->type == st_Nop && 
-           list_length(s->op3.stval->op1.stval->op1.lval) == 2) {
-               bh = s->op3.stval->op1.stval->op1.lval->h->data;
-               h  = s->op3.stval->op1.stval->op1.lval->h->next->data;
+       else if (s->op3->type == st_Nop && 
+           list_length(s->op3->op1->op4.lval) == 2) {
+               bh = s->op3->op1->op4.lval->h->data;
+               h  = s->op3->op1->op4.lval->t->data;
        }
 
        if ((ls = (l &&
-           strcmp(s->op2.stval->op4.funcval->func->base.name, "sql_sub")==0 &&
+           strcmp(s->op2->op4.funcval->func->base.name, "sql_sub")==0 &&
            l->nrcols == 0) || 
 
            (hs = (h &&
-           strcmp(s->op3.stval->op4.funcval->func->base.name, "sql_add")==0 && 
+           strcmp(s->op3->op4.funcval->func->base.name, "sql_add")==0 && 
            h->nrcols == 0))) && (ls || hs) && bl == bh) {
                *base = bl;
                *L = l;
@@ -318,7 +318,7 @@
 static void
 dump_1(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
 {
-       int o1 = _dumpstmt(sql, mb, s->op1.stval);
+       int o1 = _dumpstmt(sql, mb, s->op1);
 
        s->nr = _dump_1(mb, mod, name, o1);
 }
@@ -337,8 +337,8 @@
 static void
 dump_2(backend *sql, MalBlkPtr mb, stmt *s, char *mod, char *name)
 {
-       int o1 = _dumpstmt(sql, mb, s->op1.stval);
-       int o2 = _dumpstmt(sql, mb, s->op2.stval);
+       int o1 = _dumpstmt(sql, mb, s->op1);
+       int o2 = _dumpstmt(sql, mb, s->op2);
 
        s->nr = _dump_2(mb, mod, name, o1, o2);
 }
@@ -409,12 +409,12 @@
        int need_not = (s->flag & ANTI);
 
        /* dump left and right operands */
-       (void)_dumpstmt(sql, mb, s->op1.stval);
-       (void)_dumpstmt(sql, mb, s->op2.stval);
+       (void)_dumpstmt(sql, mb, s->op1);
+       (void)_dumpstmt(sql, mb, s->op2);
 
        /* find left and right columns (need more work) */
-       l = ((stmt*)s->op1.stval->op1.lval->h->data)->nr;
-       r = ((stmt*)s->op2.stval->op1.lval->h->data)->nr;
+       l = ((stmt*)s->op1->op4.lval->h->data)->nr;
+       r = ((stmt*)s->op2->op4.lval->h->data)->nr;
 
        q = dump_crossproduct(mb, l, r);
        k = getDestVar(q);
@@ -433,14 +433,14 @@
        l = _dump_1(mb, batRef, reverseRef, l );
 
        /* join left columns */
-       for (n = s->op1.stval->op1.lval->h; n; n = n->next) {
+       for (n = s->op1->op4.lval->h; n; n = n->next) {
                stmt *op = n->data;
 
                if (op->nrcols)
                        op->nr = _dump_2(mb, algebraRef, joinRef, l, op->nr);
        }
        /* join right columns */
-       for (n = s->op2.stval->op1.lval->h; n; n = n->next) {
+       for (n = s->op2->op4.lval->h; n; n = n->next) {
                stmt *op = n->data;
 
                if (op->nrcols)
@@ -453,11 +453,11 @@
        setVarUDFtype(mb,getArg(q,0));
        q = pushStr(mb, q, mod);
        q = pushStr(mb, q, fimp);
-       for (n = s->op1.stval->op1.lval->h; n; n = n->next) {
+       for (n = s->op1->op4.lval->h; n; n = n->next) {
                stmt *op = n->data;
                q = pushArgument(mb, q, op->nr);
        }
-       for (n = s->op2.stval->op1.lval->h; n; n = n->next) {
+       for (n = s->op2->op4.lval->h; n; n = n->next) {
                stmt *op = n->data;
                q = pushArgument(mb, q, op->nr);
        }
@@ -568,23 +568,24 @@
                        q = pushInt(mb, q, 1);
                }       break;
                case st_connection: {
-                       if (list_length(s->op1.lval) < 3)
-                               disconnect(mb, s->op1.lval);
+                       if (list_length(s->op4.lval) < 3)
+                               disconnect(mb, s->op4.lval);
                        else 
-                               reconnect(mb, s->op1.lval);
+                               reconnect(mb, s->op4.lval);
+                       s->nr = 1;
                }       break;
                case st_var:{
-                       if (s->op1.sval) {
+                       if (s->op1) {
                                if (VAR_GLOBAL(s->flag)) { /* globals */
                                        int tt = tail_type(s)->type->localtype;
                                        q = newStmt1(mb, sqlRef, "getVariable");
-                                       q = pushStr(mb, q, s->op1.sval);
+                                       q = pushStr(mb, q, 
s->op1->op4.aval->data.val.sval);
                                        setVarType(mb, getArg(q, 0), tt);
                                        setVarUDFtype(mb,getArg(q,0));
                                } else if ((s->flag & VAR_DECLARE) == 0) {
                                        char *buf = GDKmalloc(MAXIDENTLEN);
 
-                                       (void) snprintf(buf, MAXIDENTLEN, 
"A%s", s->op1.sval);
+                                       (void) snprintf(buf, MAXIDENTLEN, 
"A%s", s->op1->op4.aval->data.val.sval);
                                        q = newAssignment(mb);
                                        q = pushArgumentId(mb, q, buf);
                                } else {
@@ -596,7 +597,7 @@
                                                s->nr = dump_table(mb, 
tail_type(s)->comp_type);
                                                break;
                                        }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to