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