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