Changeset: 012a3cbe73b0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=012a3cbe73b0
Modified Files:
        monetdb5/modules/mal/const.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.mx
        sql/include/sql_catalog.h
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_catalog.c
        sql/storage/store.c
        
sql/test/BugTracker-2009/Tests/use_order_column_first.SF-2686008.stable.out
        
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/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/Tests/order_by_complex_exp.stable.out
Branch: default
Log Message:

more dead code elimination (make sure we properly mark the indices as used)


diffs (truncated from 937 to 300 lines):

diff --git a/monetdb5/modules/mal/const.c b/monetdb5/modules/mal/const.c
--- a/monetdb5/modules/mal/const.c
+++ b/monetdb5/modules/mal/const.c
@@ -72,7 +72,7 @@ CSTprelude(Client cntxt, MalBlkPtr mb, M
        if (box == 0)
                throw(MAL, "const.prelude", BOX_CLOSED);
        /* if the box was already filled we can skip initialization */
-       if (box->sym->vtop == 0) {
+       if (box->sym && box->sym->vtop == 0) {
                insertToBox(box, "dbpath", GDKgetenv("gdk_dbpath"));
                insertToBox(box, "version", VERSION);
                snprintf(u, 24, "%s", GDKversion());
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -30,8 +30,6 @@
 
 static stmt * subrel_bin(mvc *sql, sql_rel *rel, list *refs);
 
-static char *TID = "%TID%";
-
 static stmt *
 refs_find_rel(list *refs, sql_rel *rel)
 {
@@ -594,38 +592,11 @@ exp_bin(mvc *sql, sql_exp *e, stmt *left
                }
                if (e->flag == cmp_or && right)  /* join */
                        assert(0);
-               /* here we handle join indices */
-               if (right && (p=find_prop(e->p, PROP_JOINIDX)) != NULL) {
-                       sql_idx *i = p->value;
-                       sql_exp *el = e->l;
-                       sql_exp *er = e->r;
-                       char *iname = sa_strconcat(sql->sa, "%", i->base.name);
-
-                       /* find out left and right */
-                       l = bin_find_column(sql->sa, left, el->l, iname);
-                       if (!l) {
-                               swapped = 1;
-                               l = bin_find_column(sql->sa, right, el->l, 
iname);
-                               r = bin_find_column(sql->sa, left, er->l, TID);
-                       } else {
-                               r = bin_find_column(sql->sa, right, er->l, TID);
-                       }
-                       if (!l || !r)
-                               return NULL;
-                       /* small performance improvement, ie use idx directly */
-                       if (l->type == st_alias && 
-                           l->op1->type == st_idxbat &&
-                           r->type == st_alias && 
-                           r->op1->type == st_mirror) {
-                               s = l;
-                       } else if (swapped)
-                               s = stmt_join(sql->sa, r, l, cmp_equal);
-                       else
-                               s = stmt_join(sql->sa, l, r, cmp_equal);
+
+               /* mark use of join indices */
+               if (right && (p=find_prop(e->p, PROP_JOINIDX)) != NULL) 
                        sql->opt_stats[0]++; 
-                       assert(sel==NULL);
-                       break;
-               }
+
                if (!l) {
                        l = exp_bin(sql, e->l, left, NULL, grp, ext, cnt, sel);
                        swapped = 0;
@@ -1315,18 +1286,18 @@ rel2bin_hash_lookup( mvc *sql, sql_rel *
        stmt *idx = bin_find_column(sql->sa, left, l->l, sa_strconcat(sql->sa, 
"%", i->base.name));
        int swap_exp = 0, swap_rel = 0;
 
-       if (!idx) {
+       if (!idx && left) {
                swap_exp = 1;
                l = e->r;
                idx = bin_find_column(sql->sa, left, l->l, 
sa_strconcat(sql->sa, "%", i->base.name));
        }
-       if (!idx) {
+       if (!idx && right) {
                swap_exp = 0;
                swap_rel = 1;
                l = e->l;
                idx = bin_find_column(sql->sa, right, l->l, 
sa_strconcat(sql->sa, "%", i->base.name));
        }
-       if (!idx) {
+       if (!idx && right) {
                swap_exp = 1;
                swap_rel = 1;
                l = e->r;
@@ -1367,7 +1338,6 @@ rel2bin_hash_lookup( mvc *sql, sql_rel *
                        return stmt_join(sql->sa, h, idx, cmp_equal);
                }
        } else {
-               assert(0);
                return stmt_uselect(sql->sa, idx, h, cmp_equal, NULL);
        }
 }
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
@@ -283,11 +283,11 @@ address mvc_clear_table_wrap
 comment "Clear table";
 
 pattern tid( mvc:int, sname:str, tname:str):bat[:oid,:any_3] 
-address TID
+address SQLtid
 comment "Return the tables tid column.";
 
 pattern tid( mvc:int, sname:str, tname:str, part_nr:int, nr_parts:int 
):bat[:oid,:any_3] 
-address TID
+address SQLtid
 comment "Return the tables tid column.";
 
 pattern delete{unsafe}(mvc:int, sname:str, tname:str, b:any):int
@@ -1327,7 +1327,7 @@ sql5_export str mvc_bind_dbat_wrap(Clien
 sql5_export str mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_clear_table_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr 
stk, InstrPtr pci);
 sql5_export str mvc_delete_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci);
-sql5_export str TID(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci);
+sql5_export str SQLtid(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 sql5_export str DELTAbat(bat *result, bat *col, bat *uid, bat *uval, bat *ins);
 sql5_export str DELTAsub(bat *result, bat *col, bat *uid, bat *uval, bat *ins);
 sql5_export str DELTAproject(bat *result, bat *subselect, bat *col, bat *uid, 
bat *uval, bat *ins);
@@ -3649,9 +3649,9 @@ DELTAproject(bat *result, bat *sub, bat 
        return MAL_SUCCEED;
 }
 
-/* str TID(bat *result, mvc *m, str *sname, str *tname) */
+/* str SQLtid(bat *result, mvc *m, str *sname, str *tname) */
 str
-TID(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+SQLtid(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        int *res = (int*)getArgReference(stk, pci, 0);
        mvc *m = NULL;
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -111,6 +111,9 @@
 #define dt_schema      "%dt%"
 #define isDeclaredSchema(s)    (strcmp(s->base.name, dt_schema) == 0)
 
+
+extern char *TID;
+
 typedef enum temp_t { 
        SQL_PERSIST,
        SQL_LOCAL_TEMP,
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -639,8 +639,36 @@ order_join_expressions(sql_allocator *sa
        return res;
 }
 
+static sql_exp *
+rel_find_column( sql_allocator *sa, sql_rel *rel, char *tname, char *cname )
+{
+       if (!rel)
+               return NULL;
+
+       if (rel->exps && (is_project(rel->op) || is_base(rel->op))) {
+               sql_exp *e = exps_bind_column2(rel->exps, tname, cname);
+               if (e)
+                       return exp_alias(sa, e->rname, exp_name(e), tname, 
cname, exp_subtype(e), e->card, has_nil(e), is_intern(e));
+       }
+       if (is_project(rel->op) && rel->l) {
+               return rel_find_column(sa, rel->l, tname, cname);
+       } else if (is_join(rel->op)) {
+               sql_exp *e = rel_find_column(sa, rel->l, tname, cname);
+               if (!e)
+                       e = rel_find_column(sa, rel->r, tname, cname);
+               return e;
+       } else if (is_set(rel->op) ||
+                  is_sort(rel) ||
+                  is_semi(rel->op) ||
+                  is_select(rel->op)) {
+               if (rel->l)
+                       return rel_find_column(sa, rel->l, tname, cname);
+       }
+       return NULL;
+}
+
 static list *
-find_fk(sql_allocator *sa, list *rels, list *exps) 
+find_fk( sql_allocator *sa, list *rels, list *exps) 
 {
        node *djn;
        list *sdje, *aje, *dje;
@@ -697,18 +725,29 @@ find_fk(sql_allocator *sa, list *rels, l
                        if (idx) { 
                                prop *p;
                                node *n;
+                               sql_exp *t = NULL, *i = NULL;
        
-                               /* Remove all other join expressions */
-                               for (n = eje->h; n; n = n->next) {
-                                       if (je != n->data)
-                                               list_remove_data(exps, n->data);
+                               /* Add join between idx and TID */
+                               if (swapped) {
+                                       sql_exp *s = je->l, *l = je->r;
+
+                                       t = rel_find_column(sa, lr, s->l, TID);
+                                       i = rel_find_column(sa, rr, l->l, 
iname);
+                                       assert(t && i);
+                                       je = exp_compare(sa, i, t, cmp_equal);
+                               } else {
+                                       sql_exp *s = je->r, *l = je->l;
+
+                                       t = rel_find_column(sa, rr, s->l, TID);
+                                       i = rel_find_column(sa, lr, l->l, 
iname);
+                                       assert(t && i);
+                                       je = exp_compare(sa, i, t, cmp_equal);
                                }
-                               /* Add the join index using PROP_JOINIDX  */
-                               if (swapped) {
-                                       sql_exp *s = je->l;
-                                       je->l = je->r;
-                                       je->r = s;
-                               }
+                               /* Remove all join expressions */
+                               for (n = eje->h; n; n = n->next) 
+                                       list_remove_data(exps, n->data);
+                               append(exps, je);
+                               djn->data = je;
                                je->p = p = prop_create(sa, PROP_JOINIDX, 
je->p);
                                p->value = idx;
                        }
@@ -4234,6 +4273,7 @@ rel_push_project_up(int *changes, mvc *s
 static int
 exp_mark_used(sql_rel *subrel, sql_exp *e)
 {
+       int nr = 0;
        sql_exp *ne = NULL;
 
        switch(e->type) {
@@ -4249,7 +4289,7 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                        node *n = l->h;
        
                        for (;n != NULL; n = n->next) 
-                               exp_mark_used(subrel, n->data);
+                               nr += exp_mark_used(subrel, n->data);
                }
                /* rank operators have a second list of arguments */
                if (e->r) {
@@ -4257,7 +4297,7 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                        node *n = l->h;
        
                        for (;n != NULL; n = n->next) 
-                               exp_mark_used(subrel, n->data);
+                               nr += exp_mark_used(subrel, n->data);
                }
                break;
        }
@@ -4267,22 +4307,22 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                        node *n;
        
                        for (n = l->h; n != NULL; n = n->next) 
-                               exp_mark_used(subrel, n->data);
+                               nr += exp_mark_used(subrel, n->data);
                        l = e->r;
                        for (n = l->h; n != NULL; n = n->next) 
-                               exp_mark_used(subrel, n->data);
+                               nr += exp_mark_used(subrel, n->data);
                } else if (e->flag == cmp_in || e->flag == cmp_notin || 
get_cmp(e) == cmp_filter) {
                        list *r = e->r;
                        node *n;
 
-                       exp_mark_used(subrel, e->l);
+                       nr += exp_mark_used(subrel, e->l);
                        for (n = r->h; n != NULL; n = n->next)
-                               exp_mark_used(subrel, n->data);
+                               nr += exp_mark_used(subrel, n->data);
                } else {
-                       exp_mark_used(subrel, e->l);
-                       exp_mark_used(subrel, e->r);
+                       nr += exp_mark_used(subrel, e->l);
+                       nr += exp_mark_used(subrel, e->r);
                        if (e->f)
-                               exp_mark_used(subrel, e->f);
+                               nr += exp_mark_used(subrel, e->f);
                }
                break;
        case e_atom:
@@ -4298,7 +4338,7 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                ne->used = 1;
                return ne->used;
        }
-       return 0;
+       return nr;
 }
 
 static void
@@ -4507,7 +4547,7 @@ rel_remove_unused(mvc *sql, sql_rel *rel
                        for(n=rel->exps->h; n && !needed; n = n->next) {
                                sql_exp *e = n->data;
 
-                               if (!e->used && !is_intern(e))
+                               if (!e->used)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to