Changeset: a08db3c8c1ce for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a08db3c8c1ce
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql_statement.c
sql/backends/monet5/sql_statement.h
Branch: pushdown
Log Message:
push down candidates into the semijoin (other operations too follow later)
diffs (truncated from 400 to 300 lines):
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
@@ -299,6 +299,31 @@ stmt_selectnonil( backend *be, stmt *col
}
static stmt *
+subrel_project( backend *be, stmt *s)
+{
+ if (!s || s->type != st_list || !s->cand)
+ return s;
+
+ list *l = sa_list(be->mvc->sa);
+ stmt *cand = s->cand;
+ if (!l)
+ return NULL;
+ for(node *n = s->op4.lval->h; n; n = n->next) {
+ stmt *c = n->data;
+
+ assert(c->type == st_alias || (c->type == st_join && c->flag ==
cmp_project) || c->type == st_bat || c->type == st_idxbat);
+ //if (c->op1 != cand) { /* skip tid */
+ if (c->type == st_join || c->type == st_bat || c->type
== st_idxbat)
+ c = stmt_project(be, cand, c);
+ else
+ c->op1 = stmt_project(be, cand, c->op1);
+ //}
+ append(l, c);
+ }
+ return stmt_list(be, l);
+}
+
+static stmt *
handle_in_exps(backend *be, sql_exp *ce, list *nl, stmt *left, stmt *right,
stmt *grp, stmt *ext, stmt *cnt, stmt *sel, int in, int use_r)
{
mvc *sql = be->mvc;
@@ -1049,7 +1074,8 @@ stmt_col( backend *be, sql_column *c, st
stmt *i = stmt_bat(be, c, RD_INS, 0);
stmt *u = stmt_bat(be, c, RD_UPD_ID, del?del->partition:0);
sc = stmt_project_delta(be, sc, u, i);
- sc = stmt_project(be, del, sc);
+ if (del)
+ sc = stmt_project(be, del, sc);
} else if (del) { /* always handle the deletes */
sc = stmt_project(be, del, sc);
}
@@ -1067,7 +1093,8 @@ stmt_idx( backend *be, sql_idx *i, stmt
stmt *ic = stmt_idxbat(be, i, RD_INS, 0);
stmt *u = stmt_idxbat(be, i, RD_UPD_ID, del?del->partition:0);
sc = stmt_project_delta(be, sc, u, ic);
- sc = stmt_project(be, del, sc);
+ if (del)
+ sc = stmt_project(be, del, sc);
} else if (del) { /* always handle the deletes */
sc = stmt_project(be, del, sc);
}
@@ -1422,7 +1449,7 @@ rel2bin_basetable(backend *be, sql_rel *
sql_table *t = rel->l;
sql_column *c = rel->r;
list *l = sa_list(sql->sa);
- stmt *dels;
+ stmt *dels, *col = NULL;
node *en;
if (!t && c)
@@ -1432,6 +1459,25 @@ rel2bin_basetable(backend *be, sql_rel *
/* add aliases */
assert(rel->exps);
+ for( en = rel->exps->h; en && !col; en = en->next ) {
+ sql_exp *exp = en->data;
+ const char *oname = exp->r;
+
+ if (is_func(exp->type) || (oname[0] == '%' && strcmp(oname,
TID) == 0))
+ continue;
+ if (oname[0] == '%') {
+ sql_idx *i = find_sql_idx(t, oname+1);
+
+ /* do not include empty indices in the plan */
+ if ((hash_index(i->type) && list_length(i->columns) <=
1) || !idx_has_column(i->type))
+ continue;
+ col = stmt_idx(be, i, NULL/*dels*/);
+ } else {
+ sql_column *c = find_sql_column(t, oname);
+
+ col = stmt_col(be, c, NULL/*dels*/);
+ }
+ }
for( en = rel->exps->h; en; en = en->next ) {
sql_exp *exp = en->data;
const char *rname = exp_relname(exp)?exp_relname(exp):exp->l;
@@ -1439,13 +1485,14 @@ rel2bin_basetable(backend *be, sql_rel *
stmt *s = NULL;
if (is_func(exp->type)) {
+ assert(0);
list *exps = exp->l;
sql_exp *cexp = exps->h->data;
const char *cname = cexp->r;
list *l = sa_list(sql->sa);
c = find_sql_column(t, cname);
- s = stmt_col(be, c, dels);
+ s = stmt_col(be, c, NULL/*dels*/);
append(l, s);
if (exps->h->next) {
sql_exp *at = exps->h->next->data;
@@ -1460,7 +1507,10 @@ rel2bin_basetable(backend *be, sql_rel *
/* tid function sql.tid(t) */
const char *rnme = t->base.name;
- s = dels?dels:stmt_tid(be, t, 0);
+ if (col)
+ s = stmt_mirror(be, col);
+ else
+ s = dels?dels:stmt_tid(be, t, 0);
s = stmt_alias(be, s, rnme, TID);
} else if (oname[0] == '%') {
sql_idx *i = find_sql_idx(t, oname+1);
@@ -1468,17 +1518,24 @@ rel2bin_basetable(backend *be, sql_rel *
/* do not include empty indices in the plan */
if ((hash_index(i->type) && list_length(i->columns) <=
1) || !idx_has_column(i->type))
continue;
- s = stmt_idx(be, i, dels);
+ s = stmt_idx(be, i, NULL/*dels*/);
+ if (!col)
+ col = s;
} else {
sql_column *c = find_sql_column(t, oname);
- s = stmt_col(be, c, dels);
+ s = stmt_col(be, c, NULL/*dels*/);
+ if (!col)
+ col = s;
}
s->tname = rname;
s->cname = exp_name(exp);
list_append(l, s);
}
- return stmt_list(be, l);
+ stmt *res = stmt_list(be, l);
+ if (res && dels)
+ res->cand = dels;
+ return res;
}
static int
@@ -1676,6 +1733,7 @@ rel2bin_table(backend *be, sql_rel *rel,
} else {
sub = subrel_bin(be, rel->l, refs);
}
+ sub = subrel_project(be, sub);
if (!sub)
return NULL;
}
@@ -1957,6 +2015,8 @@ rel2bin_join(backend *be, sql_rel *rel,
left = subrel_bin(be, rel->l, refs);
if (rel->r) /* first construct the right sub relation */
right = subrel_bin(be, rel->r, refs);
+ left = subrel_project(be, left);
+ right = subrel_project(be, right);
if (!left || !right)
return NULL;
left = row2cols(be, left);
@@ -2216,6 +2276,8 @@ rel2bin_antijoin(backend *be, sql_rel *r
left = subrel_bin(be, rel->l, refs);
if (rel->r) /* first construct the right sub relation */
right = subrel_bin(be, rel->r, refs);
+ left = subrel_project(be, left);
+ right = subrel_project(be, right);
if (!left || !right)
return NULL;
left = row2cols(be, left);
@@ -2323,7 +2385,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
if (!l || !r)
return NULL;
- join = stmt_semijoin(be, column(be, l), column(be, r),
is_semantics(e));
+ join = stmt_semijoin(be, column(be, l), column(be, r),
left->cand, right->cand, is_semantics(e));
if (join)
join = stmt_result(be, join, 0);
if (!join)
@@ -2331,6 +2393,11 @@ rel2bin_semijoin(backend *be, sql_rel *r
semi_used = 1;
}
}
+
+ if (!semi_used) {
+ left = subrel_project(be, left);
+ right = subrel_project(be, right);
+ }
if (!semi_used && rel->exps) {
int idx = 0;
@@ -2574,6 +2641,8 @@ rel2bin_union(backend *be, sql_rel *rel,
left = subrel_bin(be, rel->l, refs);
if (rel->r) /* first construct the right sub relation */
right = subrel_bin(be, rel->r, refs);
+ left = subrel_project(be, left);
+ right = subrel_project(be, right);
if (!left || !right)
return NULL;
@@ -2623,6 +2692,8 @@ rel2bin_except(backend *be, sql_rel *rel
right = subrel_bin(be, rel->r, refs);
if (!left || !right)
return NULL;
+ left = subrel_project(be, left);
+ right = subrel_project(be, right);
left = row2cols(be, left);
right = row2cols(be, right);
@@ -2731,6 +2802,8 @@ rel2bin_inter(backend *be, sql_rel *rel,
left = subrel_bin(be, rel->l, refs);
if (rel->r) /* first construct the right sub relation */
right = subrel_bin(be, rel->r, refs);
+ left = subrel_project(be, left);
+ right = subrel_project(be, right);
if (!left || !right)
return NULL;
left = row2cols(be, left);
@@ -2889,6 +2962,7 @@ rel2bin_project(backend *be, sql_rel *re
} else {
sub = subrel_bin(be, rel->l, refs);
}
+ sub = subrel_project(be, sub);
if (!sub)
return NULL;
}
@@ -3026,6 +3100,7 @@ rel2bin_select(backend *be, sql_rel *rel
if (rel->l) { /* first construct the sub relation */
sub = subrel_bin(be, rel->l, refs);
+ sub = subrel_project(be, sub);
if (!sub)
return NULL;
sub = row2cols(be, sub);
@@ -3112,6 +3187,7 @@ rel2bin_groupby(backend *be, sql_rel *re
if (rel->l) { /* first construct the sub relation */
sub = subrel_bin(be, rel->l, refs);
+ sub = subrel_project(be, sub);
if (!sub)
return NULL;
}
@@ -3211,6 +3287,7 @@ rel2bin_topn(backend *be, sql_rel *rel,
} else {
sub = subrel_bin(be, rl, refs);
}
+ sub = subrel_project(be, sub);
}
if (!sub)
return NULL;
@@ -3264,6 +3341,7 @@ rel2bin_sample(backend *be, sql_rel *rel
if (rel->l) /* first construct the sub relation */
sub = subrel_bin(be, rel->l, refs);
+ sub = subrel_project(be, sub);
if (!sub)
return NULL;
@@ -3745,6 +3823,7 @@ rel2bin_insert(backend *be, sql_rel *rel
t = tr->l;
} else {
ddl = subrel_bin(be, tr, refs);
+ ddl = subrel_project(be, ddl);
if (!ddl)
return NULL;
t = rel_ddl_table_get(tr);
@@ -3752,6 +3831,7 @@ rel2bin_insert(backend *be, sql_rel *rel
if (rel->r) /* first construct the inserts relation */
inserts = subrel_bin(be, rel->r, refs);
+ inserts = subrel_project(be, inserts);
if (!inserts)
return NULL;
@@ -4741,6 +4821,7 @@ rel2bin_update(backend *be, sql_rel *rel
t = tr->l;
} else {
ddl = subrel_bin(be, tr, refs);
+ ddl = subrel_project(be, ddl);
if (!ddl)
return NULL;
t = rel_ddl_table_get(tr);
@@ -4752,6 +4833,7 @@ rel2bin_update(backend *be, sql_rel *rel
if (rel->r) /* first construct the update relation */
update = subrel_bin(be, rel->r, refs);
+ update = subrel_project(be, update);
if (!update)
return NULL;
@@ -5063,6 +5145,7 @@ rel2bin_delete(backend *be, sql_rel *rel
if (rel->r) { /* first construct the deletes relation */
rows = subrel_bin(be, rel->r, refs);
+ rows = subrel_project(be, rows);
if (!rows)
return NULL;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list