Changeset: 2e6c4d15fdf9 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/2e6c4d15fdf9 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_statement.h Branch: pushcands Log Message:
initial steps for handling more pushed combinations (ie partialy during project and (later) partialy during grouping/aggregation) diffs (truncated from 334 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 @@ -369,9 +369,9 @@ stmt_selectnonil( backend *be, stmt *col } static rel_bin_stmt * -subrel_project( backend *be, rel_bin_stmt *s, list *refs, sql_rel *rel) +subrel_project( backend *be, rel_bin_stmt *s, list *refs, sql_rel *rel, bool allow_single_cand) { - if (!s || !s->cand) + if (!s || !s->cand || (s->cand && allow_single_cand && !s->pushed)) return s; list *l = sa_list(be->mvc->sa); @@ -390,6 +390,20 @@ subrel_project( backend *be, rel_bin_stm return s; } +static rel_bin_stmt * +used_cands(rel_bin_stmt *s) +{ + if (!s) + return s; + s->pushed = 0; + s->cand = NULL; + for(node *n = s->cols->h; n; n = n->next) { + stmt *c = n->data; + c->cand = NULL; + } + return s; +} + static stmt * handle_in_exps(backend *be, sql_exp *ce, list *nl, rel_bin_stmt *left, rel_bin_stmt *right, bool in, int depth, int reduce, int push) { @@ -2101,7 +2115,7 @@ rel2bin_table(backend *be, sql_rel *rel, } else { sub = subrel_bin(be, rel->l, refs); } - sub = subrel_project(be, sub, refs, rel->l); + sub = subrel_project(be, sub, refs, rel->l, false); if (!sub) return NULL; } @@ -2551,8 +2565,8 @@ rel2bin_join(backend *be, sql_rel *rel, assert(rel->l && rel->r); left = subrel_bin(be, rel->l, refs); /* first construct the left sub relation */ right = subrel_bin(be, rel->r, refs); /* first construct the right sub relation */ - left = subrel_project(be, left, refs, rel->l); - right = subrel_project(be, right, refs, rel->r); + left = subrel_project(be, left, refs, rel->l, false); + right = subrel_project(be, right, refs, rel->r, false); if (!left || !right) return NULL; left = row2cols(be, left); @@ -2768,8 +2782,8 @@ rel2bin_antijoin(backend *be, sql_rel *r assert(rel->l && rel->r); left = subrel_bin(be, rel->l, refs); /* first construct the left sub relation */ right = subrel_bin(be, rel->r, refs); /* first construct the right sub relation */ - left = subrel_project(be, left, refs, rel->l); - right = subrel_project(be, right, refs, rel->r); + left = subrel_project(be, left, refs, rel->l, false); + right = subrel_project(be, right, refs, rel->r, false); if (!left || !right) return NULL; left = row2cols(be, left); @@ -2852,6 +2866,10 @@ rel2bin_semijoin(backend *be, sql_rel *r return NULL; left = row2cols(be, left); right = row2cols(be, right); + if (left && left->cand && left->pushed) + left = subrel_project(be, left, refs, rel->l, false); + if (right && right->cand && right->pushed) + right = subrel_project(be, right, refs, rel->r, false); /* * split in 2 steps, * first cheap join(s) (equality or idx) @@ -2863,7 +2881,7 @@ rel2bin_semijoin(backend *be, sql_rel *r split_join_exps(rel, jexps, sexps); if (list_empty(jexps)) { /* cross product and continue after project */ - right = subrel_project(be, right, refs, rel->r); + right = subrel_project(be, right, refs, rel->r, false); stmt *l = bin_find_smallest_column(be, left); stmt *r = bin_find_smallest_column(be, right); join = stmt_join(be, l, r, 0, cmp_all, 0, 0, false); @@ -2877,8 +2895,8 @@ rel2bin_semijoin(backend *be, sql_rel *r jexps = get_equi_joins_first(sql, jexps, &equality_only); if (!equality_only || list_length(jexps) > 1 || exp_has_func((sql_exp*)jexps->h->data)) - left = subrel_project(be, left, refs, rel->l); - right = subrel_project(be, right, refs, rel->r); + left = subrel_project(be, left, refs, rel->l, false); + right = subrel_project(be, right, refs, rel->r, false); for( en = jexps->h; en; en = en->next ) { int join_idx = be->join_idx; @@ -2964,7 +2982,7 @@ rel2bin_semijoin(backend *be, sql_rel *r } } } else { - right = subrel_project(be, right, refs, rel->r); + right = subrel_project(be, right, refs, rel->r, false); stmt *l = bin_find_smallest_column(be, left); stmt *r = bin_find_smallest_column(be, right); join = stmt_join(be, l, r, 0, cmp_all, 0, 0, false); @@ -3151,8 +3169,8 @@ rel2bin_union(backend *be, sql_rel *rel, assert(rel->l && rel->r); left = subrel_bin(be, rel->l, refs); /* first construct the left sub relation */ right = subrel_bin(be, rel->r, refs); /* first construct the right sub relation */ - left = subrel_project(be, left, refs, rel->l); - right = subrel_project(be, right, refs, rel->r); + left = subrel_project(be, left, refs, rel->l, false); + right = subrel_project(be, right, refs, rel->r, false); if (!left || !right) return NULL; @@ -3202,8 +3220,8 @@ rel2bin_except(backend *be, sql_rel *rel right = subrel_bin(be, rel->r, refs); /* first construct the right sub relation */ if (!left || !right) return NULL; - left = subrel_project(be, left, refs, rel->l); - right = subrel_project(be, right, refs, rel->r); + left = subrel_project(be, left, refs, rel->l, false); + right = subrel_project(be, right, refs, rel->r, false); left = row2cols(be, left); right = row2cols(be, right); @@ -3311,8 +3329,8 @@ rel2bin_inter(backend *be, sql_rel *rel, assert(rel->l && rel->r); left = subrel_bin(be, rel->l, refs); /* first construct the left sub relation */ right = subrel_bin(be, rel->r, refs); /* first construct the right sub relation */ - left = subrel_project(be, left, refs, rel->l); - right = subrel_project(be, right, refs, rel->r); + left = subrel_project(be, left, refs, rel->l, false); + right = subrel_project(be, right, refs, rel->r, false); if (!left || !right) return NULL; left = row2cols(be, left); @@ -3467,6 +3485,8 @@ rel2bin_project(backend *be, sql_rel *re sub = rel2bin_sql_table(be, t, rel->exps); } else { sub = subrel_bin(be, rel->l, refs); + if (sub && sub->pushed) /* no partial candidates yet */ + sub = subrel_project(be, sub, refs, rel, false); } if (!sub) return NULL; @@ -3500,13 +3520,17 @@ rel2bin_project(backend *be, sql_rel *re } if (sub && sub->cand && used < list_length(rel->exps)) { psub->cand = sub->cand; - if (used > 0) /* we don't want half projected candidates */ - psub = subrel_project(be, psub, refs, rel); + if (used > 0) { + psub = subrel_project(be, psub, refs, rel, true); + psub->pushed = true; + } + } else if (sub && sub->cand && used == list_length(rel->exps)) { + sub = used_cands(sub); } if (psub->cand && rel->r) { /* for now we first handle the candidates */ if (sub) - sub = subrel_project(be, sub, refs, rel); - psub = subrel_project(be, psub, refs, rel); + sub = subrel_project(be, sub, refs, rel, false); + psub = subrel_project(be, psub, refs, rel, false); } pl = psub->cols; stmt_set_nrcols(psub); @@ -3621,6 +3645,8 @@ rel2bin_select(backend *be, sql_rel *rel if (list_empty(rel->exps)) return sub; + if (sub && sub->cand && sub->pushed) /* for now no partial candidate pushing */ + sub = subrel_project(be, sub, refs, rel->l, false); /* handle possible index lookups */ /* expressions are in index order ! */ if (sub && (en = rel->exps->h) != NULL) { @@ -3679,7 +3705,7 @@ rel2bin_groupby(backend *be, sql_rel *re assert(rel->l); /* first construct the sub relation */ sub = subrel_bin(be, rel->l, refs); - sub = subrel_project(be, sub, refs, rel->l); + sub = subrel_project(be, sub, refs, rel->l, false); if (!sub) return NULL; @@ -3777,7 +3803,7 @@ rel2bin_topn(backend *be, sql_rel *rel, } else { sub = subrel_bin(be, rl, refs); } - sub = subrel_project(be, sub, refs, rl); + sub = subrel_project(be, sub, refs, rl, false); if (!sub) return NULL; @@ -3838,7 +3864,7 @@ rel2bin_sample(backend *be, sql_rel *rel assert(rel->l); /* first construct the sub relation */ sub = subrel_bin(be, rel->l, refs); - sub = subrel_project(be, sub, refs, rel->l); + sub = subrel_project(be, sub, refs, rel->l, false); if (!sub) return NULL; @@ -4221,7 +4247,7 @@ rel2bin_insert(backend *be, sql_rel *rel t = tr->l; } else { ddl = subrel_bin(be, tr, refs); - ddl = subrel_project(be, ddl, refs, NULL); + ddl = subrel_project(be, ddl, refs, NULL, false); if (!ddl) return NULL; t = rel_ddl_table_get(tr); @@ -4229,7 +4255,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, refs, rel->r); + inserts = subrel_project(be, inserts, refs, rel->r, false); if (!inserts) return NULL; @@ -5184,7 +5210,7 @@ rel2bin_update(backend *be, sql_rel *rel t = tr->l; } else { ddl = subrel_bin(be, tr, refs); - ddl = subrel_project(be, ddl, refs, NULL); + ddl = subrel_project(be, ddl, refs, NULL, false); if (!ddl) return NULL; t = rel_ddl_table_get(tr); @@ -5196,7 +5222,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, refs, rel->r); + update = subrel_project(be, update, refs, rel->r, false); if (!update) return NULL; @@ -5498,7 +5524,7 @@ rel2bin_delete(backend *be, sql_rel *rel if (rel->r) { /* first construct the deletes relation */ rel_bin_stmt *rows = subrel_bin(be, rel->r, refs); - rows = subrel_project(be, rows, refs, rel->r); + rows = subrel_project(be, rows, refs, rel->r, false); if (!rows) return NULL; tids = rows->cols->h->data; /* TODO this should be the candidate list instead */ @@ -5747,7 +5773,7 @@ rel2bin_output(backend *be, sql_rel *rel if (rel->l) /* first construct the sub relation */ s = subrel_bin(be, rel->l, refs); - s = subrel_project(be, s, refs, rel->l); + s = subrel_project(be, s, refs, rel->l, false); if (!s) return NULL; @@ -5784,8 +5810,8 @@ rel2bin_list(backend *be, sql_rel *rel, l = subrel_bin(be, rel->l, refs); if (rel->r) /* first construct the sub relation */ r = subrel_bin(be, rel->r, refs); - l = subrel_project(be, l, refs, rel->l); - r = subrel_project(be, r, refs, rel->r); + l = subrel_project(be, l, refs, rel->l, false); + r = subrel_project(be, r, refs, rel->r, false); if ((rel->l && !l) || (rel->r && !r)) return NULL; if (l) @@ -5827,8 +5853,8 @@ rel2bin_partition_limits(backend *be, sq l = subrel_bin(be, rel->l, refs); if (rel->r) /* first construct the sub relation */ r = subrel_bin(be, rel->r, refs); - l = subrel_project(be, l, refs, rel->l); - r = subrel_project(be, r, refs, rel->r); + l = subrel_project(be, l, refs, rel->l, false); + r = subrel_project(be, r, refs, rel->r, false); if ((rel->l && !l) || (rel->r && !r)) return NULL; @@ -5858,8 +5884,8 @@ rel2bin_exception(backend *be, sql_rel * l = subrel_bin(be, rel->l, refs); if (rel->r) /* first construct the sub relation */ r = subrel_bin(be, rel->r, refs); - l = subrel_project(be, l, refs, rel->l); - r = subrel_project(be, r, refs, rel->r); + l = subrel_project(be, l, refs, rel->l, false); + r = subrel_project(be, r, refs, rel->r, false); if ((rel->l && !l) || (rel->r && !r)) return NULL; @@ -5885,7 +5911,7 @@ rel2bin_seq(backend *be, sql_rel *rel, l if (rel->l) { /* first construct the sub relation */ sl = subrel_bin(be, rel->l, refs); - sl = subrel_project(be, sl, refs, rel->l); + sl = subrel_project(be, sl, refs, rel->l, false); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list