Changeset: 471d097c13bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=471d097c13bd
Modified Files:
monetdb5/optimizer/opt_pushselect.c
sql/backends/monet5/sql_gencode.c
sql/server/rel_bin.c
sql/server/sql_rel2bin.c
sql/server/sql_statement.c
sql/server/sql_statement.h
Branch: default
Log Message:
push limit's down again (sofar only without mitosis/mergetable)
cleanup of dead code
diffs (truncated from 310 to 300 lines):
diff --git a/monetdb5/optimizer/opt_pushselect.c
b/monetdb5/optimizer/opt_pushselect.c
--- a/monetdb5/optimizer/opt_pushselect.c
+++ b/monetdb5/optimizer/opt_pushselect.c
@@ -102,7 +102,7 @@ subselect_find_subselect( subselect_t *s
int
OPTpushselectImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci)
{
- int i, j, limit, slimit, actions=0, *vars, push_down_delta = 0;
+ int i, j, limit, slimit, actions=0, *vars, push_down_delta = 0, nr_topn
= 0;
InstrPtr p, *old;
subselect_t subselects;
@@ -132,6 +132,9 @@ OPTpushselectImplementation(Client cntxt
(getFunctionId(p) == tintersectRef || getFunctionId(p)
== tdifferenceRef))
return 0;
+ if (getModuleId(p) == algebraRef && getFunctionId(p) ==
sliceRef)
+ nr_topn++;
+
if (getModuleId(p) == sqlRef && getFunctionId(p) == deltaRef)
push_down_delta++;
@@ -185,7 +188,7 @@ OPTpushselectImplementation(Client cntxt
}
}
- if (!subselects.nr || newMalBlkStmt(mb, mb->ssize+20) <0 ) {
+ if ((!subselects.nr && !nr_topn) || newMalBlkStmt(mb, mb->ssize+20) <0
) {
GDKfree(vars);
return 0;
}
@@ -247,7 +250,7 @@ OPTpushselectImplementation(Client cntxt
/* c = sql.delta(b,uid,uval,ins);
* l = leftfetchjoin(x, c);
* into
- * l = sql.projectdelta(b,x,ins,upd);
+ * l = sql.projectdelta(x,b,uid,uval,ins);
*/
else if (getModuleId(q) == sqlRef &&
getFunctionId(q) == deltaRef && q->argc == 5) {
q = copyInstruction(q);
diff --git a/sql/backends/monet5/sql_gencode.c
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1994,12 +1994,6 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
q = (void*)s->op1->rewritten;
s->nr = getArg(q,s->flag);
} break;
- case st_ordered:{
- int l = _dumpstmt(sql, mb, s->op1);
-
- _dumpstmt(sql, mb, s->op2);
- s->nr = l;
- } break;
case st_affected_rows:{
InstrPtr q;
int o1 = _dumpstmt(sql, mb, s->op1);
@@ -2013,28 +2007,21 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
} break;
case st_output:
case st_export:{
- stmt *order = NULL;
stmt *lst = s->op1;
_dumpstmt(sql, mb, lst);
- if (lst->type == st_ordered) {
- order = lst->op1;
- lst = lst->op2;
- }
if (lst->type == st_list) {
list *l = lst->op4.lval;
int file, cnt = list_length(l);
- stmt *f;
+ stmt *first;
InstrPtr k;
n = l->h;
- f = n->data;
+ first = n->data;
/* single value result, has a fast exit */
- if (cnt == 1 && !order && f->nrcols <= 0 &&
- s->type != st_export)
- {
+ if (cnt == 1 && first->nrcols <= 0 && s->type
!= st_export) {
stmt *c = n->data;
sql_subtype *t = tail_type(c);
char *tname = table_name(sql->mvc->sa,
c);
@@ -2066,11 +2053,6 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
_DELETE(fqtn);
break;
}
- if (n) {
- if (!order) {
- order = n->data;
- }
- }
k = newStmt2(mb, sqlRef, resultSetRef);
s->nr = getDestVar(k);
k = pushInt(mb, k, cnt);
@@ -2088,7 +2070,7 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
} else {
k = pushInt(mb, k, sql->mvc->type);
}
- (void) pushArgument(mb, k, order->nr);
+ (void) pushArgument(mb, k, first->nr);
dump_header(sql->mvc, mb, s, l);
if (s->type == st_export && s->op2) {
@@ -2111,22 +2093,6 @@ _dumpstmt(backend *sql, MalBlkPtr mb, st
q = newStmt(mb, "io", "stdout");
file = getDestVar(q);
}
-/*
-
- q = newStmt2(mb, sqlRef,
putName("exportHead",10));
- q = pushArgument(mb, q, file);
- q = pushArgument(mb, q, s->nr);
- q = newStmt2(mb, sqlRef,
putName("exportChunk",11));
- q = pushArgument(mb, q, file);
- q = pushArgument(mb, q, s->nr);
- q = pushInt(mb,q,0);
- q = pushInt(mb,q,10);
- q = newStmt2(mb, sqlRef,
putName("exportChunk",11));
- q = pushArgument(mb, q, file);
- q = pushArgument(mb, q, s->nr);
- q = pushInt(mb,q,10);
- q = pushInt(mb,q,0);
-*/
q = newStmt2(mb, sqlRef, exportResultRef);
q = pushArgument(mb, q, file);
(void) pushArgument(mb, q, s->nr);
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -2162,8 +2162,7 @@ rel2bin_project( mvc *sql, sql_rel *rel,
sql_exp *le = topn_limit(topn);
sql_exp *oe = topn_offset(topn);
- if (!le) { /* for now only handle topn
- including limit, ie not just offset */
+ if (!le) { /* Don't push only offset */
topn = NULL;
} else {
l = exp_bin(sql, le, NULL, NULL, NULL, NULL, NULL,
NULL);
@@ -2190,11 +2189,7 @@ rel2bin_project( mvc *sql, sql_rel *rel,
sub = subrel_bin(sql, rel->l, refs);
}
if (!sub)
- return NULL;
- if (sub->type == st_ordered) {
- stmt *n = sql_reorder(sql, sub->op1, sub->op2);
- sub = n;
- }
+ return NULL;
}
pl = sa_list(sql->sa);
@@ -2495,9 +2490,8 @@ rel2bin_groupby( mvc *sql, sql_rel *rel,
static stmt *
rel2bin_topn( mvc *sql, sql_rel *rel, list *refs)
{
- list *newl;
sql_exp *oe = NULL, *le = NULL;
- stmt *sub = NULL, *order = NULL, *l = NULL, *o = NULL;
+ stmt *sub = NULL, *l = NULL, *o = NULL;
node *n;
if (rel->l) { /* first construct the sub relation */
@@ -2515,20 +2509,12 @@ rel2bin_topn( mvc *sql, sql_rel *rel, li
le = topn_limit(rel);
oe = topn_offset(rel);
- if (sub->type == st_ordered) {
- stmt *s = sub->op2;
- order = column(sql->sa, sub->op1);
- sub = s;
- }
n = sub->op4.lval->h;
- newl = sa_list(sql->sa);
-
if (n) {
- stmt *limit = NULL;
- /*
- sql_rel *rl = rel->l;
- int including = (rl && need_distinct(rl)) ||
need_including(rel);
- */
+ stmt *limit = NULL, *sc = n->data;
+ char *cname = column_name(sql->sa, sc);
+ char *tname = table_name(sql->sa, sc);
+ list *newl = sa_list(sql->sa);
int including = need_including(rel);
if (le)
@@ -2541,16 +2527,8 @@ rel2bin_topn( mvc *sql, sql_rel *rel, li
if (!o)
o = stmt_atom_wrd(sql->sa, 0);
- if (order) {
- limit = stmt_limit(sql->sa, order, o, l,
LIMIT_DIRECTION(0,0,including));
- } else {
- stmt *sc = n->data;
- char *cname = column_name(sql->sa, sc);
- char *tname = table_name(sql->sa, sc);
-
- sc = column(sql->sa, sc);
- limit = stmt_limit(sql->sa, stmt_alias(sql->sa, sc,
tname, cname), o, l, LIMIT_DIRECTION(0,0,including));
- }
+ sc = column(sql->sa, sc);
+ limit = stmt_limit(sql->sa, stmt_alias(sql->sa, sc, tname,
cname), o, l, LIMIT_DIRECTION(0,0,including));
limit = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, limit,
0));
for ( ; n; n = n->next) {
@@ -2562,13 +2540,7 @@ rel2bin_topn( mvc *sql, sql_rel *rel, li
sc = stmt_project(sql->sa, limit, sc);
list_append(newl, stmt_alias(sql->sa, sc, tname,
cname));
}
- if (order)
- order = stmt_project(sql->sa, limit, order);
- }
- sub = stmt_list(sql->sa, newl);
- if (order) {
- assert(0);
- return stmt_ordered(sql->sa, order, sub);
+ sub = stmt_list(sql->sa, newl);
}
return sub;
}
@@ -3041,11 +3013,6 @@ rel2bin_insert( mvc *sql, sql_rel *rel,
if (!inserts)
return NULL;
- if (inserts->type == st_ordered) {
- stmt *n = sql_reorder(sql, inserts->op1, inserts->op1);
- inserts = n;
- }
-
if (idx_ins)
pin = refs_find_rel(refs, prel);
diff --git a/sql/server/sql_rel2bin.c b/sql/server/sql_rel2bin.c
--- a/sql/server/sql_rel2bin.c
+++ b/sql/server/sql_rel2bin.c
@@ -170,7 +170,6 @@ rel2bin(mvc *c, stmt *s)
case st_unique:
case st_order:
case st_reorder:
- case st_ordered:
case st_alias:
case st_exception:
diff --git a/sql/server/sql_statement.c b/sql/server/sql_statement.c
--- a/sql/server/sql_statement.c
+++ b/sql/server/sql_statement.c
@@ -91,7 +91,6 @@ st_type2string(st_type type)
ST(order);
ST(reorder);
- ST(ordered);
ST(output);
ST(affected_rows);
@@ -373,7 +372,6 @@ stmt_deps(list *dep_list, stmt *s, int d
case st_sample:
case st_order:
case st_reorder:
- case st_ordered:
case st_output:
case st_affected_rows:
@@ -1216,20 +1214,6 @@ stmt_list(sql_allocator *sa, list *l)
}
stmt *
-stmt_ordered(sql_allocator *sa, stmt *order, stmt *res)
-{
- stmt *ns = stmt_create(sa, st_ordered);
-
- ns->type = st_ordered;
- ns->op1 = order;
- ns->op2 = res;
- ns->nrcols = res->nrcols;
- ns->key = res->key;
- ns->aggr = res->aggr;
- return ns;
-}
-
-stmt *
stmt_output(sql_allocator *sa, stmt *l)
{
stmt *s = stmt_create(sa, st_output);
diff --git a/sql/server/sql_statement.h b/sql/server/sql_statement.h
--- a/sql/server/sql_statement.h
+++ b/sql/server/sql_statement.h
@@ -66,7 +66,6 @@ typedef enum stmt_type {
st_order,
st_reorder,
- st_ordered,
st_output,
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list