Changeset: b6759d6882ca for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b6759d6882ca Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h Branch: pushcands Log Message:
Add sql relation to rel_bin_stmt struct. It makes easier to debug and switch on the possible extra statements on joins and groupings diffs (truncated from 510 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 @@ -386,7 +386,7 @@ subrel_project( backend *be, rel_bin_stm s->cand = NULL; list_append(l, s); } - s = create_rel_bin_stmt(be->mvc->sa, l, NULL); + s = create_rel_bin_stmt(be->mvc->sa, rel, l, NULL); stmt_set_nrcols(s); if (rel && rel_is_ref(rel)) refs_update_stmt(refs, rel, s); @@ -1219,7 +1219,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin r = stmt_fetch(be, r); } if (r->type == st_list) - r = stmt_table(be, create_rel_bin_stmt(sql->sa, r->op4.lval, NULL), 1); + r = stmt_table(be, create_rel_bin_stmt(sql->sa, e->l, r->op4.lval, NULL), 1); } s = stmt_return(be, r, GET_PSM_LEVEL(e->flag)); } else if (e->flag & PSM_WHILE) { @@ -1362,7 +1362,8 @@ exp_bin(backend *be, sql_exp *e, rel_bin } break; case e_aggr: { list *attr = e->l; - stmt *as = NULL, *input_group = right ? right->grp : NULL; + bool is_right_groupby = right && is_groupby(right->rel->op); + stmt *as = NULL, *input_group = is_right_groupby ? right->grp : NULL; sql_subfunc *a = e->f; if (attr && attr->h) { @@ -1379,7 +1380,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin if (as && as->nrcols <= 0 && left) as = stmt_const(be, bin_find_smallest_column(be, left), left->cand, as); if (en == attr->h && !en->next && exp_aggr_is_count(e)) - as = exp_count_no_nil_arg(e, right ? right->ext : NULL, at, as); + as = exp_count_no_nil_arg(e, is_right_groupby ? right->ext : NULL, at, as); /* insert single value into a column */ if (as && as->nrcols <= 0 && !left) as = const_column(be, as); @@ -1388,11 +1389,11 @@ exp_bin(backend *be, sql_exp *e, rel_bin return NULL; append(l, as); } - if (need_distinct(e) && ((right && right->grp) || list_length(l) > 1)){ + if (need_distinct(e) && ((is_right_groupby && right->grp) || list_length(l) > 1)){ list *nl = sa_list(sql->sa); - stmt *ngrp = right ? right->grp : NULL; - stmt *next = right ? right->ext : NULL; - stmt *ncnt = right ? right->cnt : NULL; + stmt *ngrp = is_right_groupby ? right->grp : NULL; + stmt *next = is_right_groupby ? right->ext : NULL; + stmt *ncnt = is_right_groupby ? right->cnt : NULL; for (en = l->h; en; en = en->next) { stmt *as = en->data; stmt *g = stmt_group(be, as, right->cand, ngrp, next, ncnt, 1); @@ -1404,7 +1405,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin stmt *as = en->data; append(nl, stmt_project(be, next, as)); } - if (right && right->grp) + if (is_right_groupby && right->grp) input_group = stmt_project(be, next, right->grp); l = nl; } else if (need_distinct(e)) { @@ -1417,13 +1418,13 @@ exp_bin(backend *be, sql_exp *e, rel_bin } else { /* count(*) may need the default group (relation) and and/or an attribute to count */ - if (right && right->grp) { + if (is_right_groupby && right->grp) { as = right->grp; right->cnt->cand = NULL; /* cand has been applied */ return right->cnt; } else if (right) { as = bin_find_smallest_column(be, left); - as = exp_count_no_nil_arg(e, right->ext, NULL, as); + as = exp_count_no_nil_arg(e, is_right_groupby ? right->ext : NULL, NULL, as); } else { /* create dummy single value in a column */ as = stmt_atom_lng(be, 0); @@ -1431,7 +1432,7 @@ exp_bin(backend *be, sql_exp *e, rel_bin } } if (right) - s = stmt_aggr(be, as, left->cand, input_group, right->ext, a, 1, need_no_nil(e) /* ignore nil*/, !zero_if_empty(e)); + s = stmt_aggr(be, as, left->cand, input_group, is_right_groupby ? right->ext : NULL, a, 1, need_no_nil(e) /* ignore nil*/, !zero_if_empty(e)); else s = stmt_aggr(be, as, left?left->cand:NULL, NULL, NULL, a, 1, need_no_nil(e) /* ignore nil*/, !zero_if_empty(e)); if (find_prop(e->p, PROP_COUNT)) /* propagate count == 0 ipv NULL in outer joins */ @@ -1440,18 +1441,10 @@ exp_bin(backend *be, sql_exp *e, rel_bin case e_column: { if (right) {/* check relation names */ s = bin_find_column(be, right, e->l, e->r); -#if 0 - if (s && s->nrcols > 0 && depth == 0 && right->cand) /* topmost column reference, needs to be projected on the cand */ - s = stmt_project_column_on_cand(be, right->cand, s); -#endif } if (!s && left) { s = bin_find_column(be, left, e->l, e->r); -#if 0 - if (s && s->nrcols > 0 && depth == 0 && left->cand) /* topmost column reference, needs to be projected on the cand */ - s = stmt_project_column_on_cand(be, left->cand, s); -#endif - if (s && right && right->grp) { + if (s && right && is_groupby(right->rel->op) && right->grp) { if (left->cand && !s->cand) s = stmt_project(be, left->cand, s); s = stmt_project(be, right->ext, s); @@ -1780,7 +1773,7 @@ stmt_rename(backend *be, sql_exp *exp, s } static rel_bin_stmt * -rel2bin_sql_table(backend *be, sql_table *t, list *aliases) +rel2bin_sql_table(backend *be, sql_rel *rel, sql_table *t, list *aliases) { mvc *sql = be->mvc; list *l = sa_list(sql->sa); @@ -1851,7 +1844,7 @@ rel2bin_sql_table(backend *be, sql_table } } } - return create_rel_bin_stmt(sql->sa, l, NULL); + return create_rel_bin_stmt(sql->sa, rel, l, NULL); } static rel_bin_stmt * @@ -1922,7 +1915,7 @@ rel2bin_basetable(backend *be, sql_rel * s->cname = exp_name(exp); list_append(l, s); } - return create_rel_bin_stmt(sql->sa, l, dels); + return create_rel_bin_stmt(sql->sa, rel, l, dels); } static int @@ -2106,7 +2099,7 @@ rel2bin_table(backend *be, sql_rel *rel, assert(ti->type != 1); } } - return create_rel_bin_stmt(sql->sa, l, NULL); + return create_rel_bin_stmt(sql->sa, rel, l, NULL); } else if (op) { int i; sql_subfunc *f = op->f; @@ -2120,7 +2113,7 @@ rel2bin_table(backend *be, sql_rel *rel, sql_table *t = rel_ddl_table_get(l); if (t) - sub = rel2bin_sql_table(be, t, NULL); + sub = rel2bin_sql_table(be, l, t, NULL); } else { sub = subrel_bin(be, rel->l, refs); } @@ -2239,7 +2232,7 @@ rel2bin_table(backend *be, sql_rel *rel, } } assert(rel->flag != TABLE_PROD_FUNC || !sub || !(sub->nrcols)); - sub = create_rel_bin_stmt(sql->sa, l, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, l, NULL); } else if (rel->l) { /* handle sub query via function */ int i; char name[16], *nme; @@ -2266,7 +2259,7 @@ rel2bin_table(backend *be, sql_rel *rel, s = stmt_fetch(be, s); list_append(l, s); } - sub = create_rel_bin_stmt(sql->sa, l, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, l, NULL); } if (!sub) { assert(sql->session->status == -10); /* Stack overflow errors shouldn't terminate the server */ @@ -2675,7 +2668,7 @@ rel2bin_join(backend *be, sql_rel *rel, s = stmt_alias(be, s, rnme, nme); list_append(nl, s); } - sub = create_rel_bin_stmt(sql->sa, nl, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, nl, NULL); /* continue with non equi-joins */ while(sexps) { @@ -2756,7 +2749,7 @@ rel2bin_join(backend *be, sql_rel *rel, s = stmt_alias(be, s, rnme, nme); list_append(l, s); } - return create_rel_bin_join_stmt(sql->sa, left, right, l, NULL, jl, jr, ld, rd); + return create_rel_bin_join_stmt(sql->sa, rel, l, NULL, left, right, jl, jr, ld, rd); } static int @@ -2838,7 +2831,7 @@ rel2bin_antijoin(backend *be, sql_rel *r s = stmt_alias(be, s, rnme, nme); list_append(l, s); } - return create_rel_bin_join_stmt(sql->sa, left, right, l, NULL, join, NULL, NULL, NULL); + return create_rel_bin_join_stmt(sql->sa, rel, l, NULL, left, right, join, NULL, NULL, NULL); } static rel_bin_stmt * @@ -3012,7 +3005,7 @@ rel2bin_semijoin(backend *be, sql_rel *r s = stmt_alias(be, s, rnme, nme); list_append(nl, s); } - sub = create_rel_bin_stmt(sql->sa, nl, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, nl, NULL); /* continue with non equi-joins */ while(sexps) { @@ -3069,7 +3062,7 @@ rel2bin_semijoin(backend *be, sql_rel *r s = stmt_alias(be, s, rnme, nme); list_append(l, s); } - return create_rel_bin_join_stmt(sql->sa, left, right, l, NULL, join, NULL, NULL, NULL); + return create_rel_bin_join_stmt(sql->sa, rel, l, NULL, left, right, join, NULL, NULL, NULL); } static rel_bin_stmt * @@ -3184,7 +3177,7 @@ rel2bin_union(backend *be, sql_rel *rel, s = stmt_alias(be, s, rnme, nme); list_append(l, s); } - sub = create_rel_bin_stmt(sql->sa, l, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, l, NULL); sub = rel_rename(be, rel, sub); if (need_distinct(rel)) @@ -3301,7 +3294,7 @@ rel2bin_except(backend *be, sql_rel *rel c1 = stmt_alias(be, c1, rnme, nme); list_append(stmts, c1); } - sub = create_rel_bin_stmt(sql->sa, stmts, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, stmts, NULL); return rel_rename(be, rel, sub); } @@ -3398,7 +3391,7 @@ rel2bin_inter(backend *be, sql_rel *rel, c1 = stmt_alias(be, c1, rnme, nme); list_append(stmts, c1); } - sub = create_rel_bin_stmt(sql->sa, stmts, NULL); + sub = create_rel_bin_stmt(sql->sa, rel, stmts, NULL); return rel_rename(be, rel, sub); } @@ -3479,7 +3472,7 @@ rel2bin_project(backend *be, sql_rel *re sql_table *t = rel_ddl_table_get(l); if (t) - sub = rel2bin_sql_table(be, t, rel->exps); + sub = rel2bin_sql_table(be, l, t, rel->exps); } else { sub = subrel_bin(be, rel->l, refs); if (sub && sub->pushed) /* no partial candidates yet */ @@ -3492,7 +3485,7 @@ rel2bin_project(backend *be, sql_rel *re pl = sa_list(sql->sa); if (sub) pl->expected_cnt = list_length(sub->cols); - psub = create_rel_bin_stmt(sql->sa, pl, NULL); + psub = create_rel_bin_stmt(sql->sa, rel, pl, NULL); int used = 0; for( en = rel->exps->h; en; en = en->next ) { sql_exp *exp = en->data; @@ -3659,7 +3652,7 @@ rel2bin_select(backend *be, sql_rel *rel } if (sub && !sel) sel = sub->cand; - sub = create_rel_bin_stmt(sql->sa, sub->cols, sel); + sub = create_rel_bin_stmt(sql->sa, rel, sub->cols, sel); for( en = rel->exps->h; en; en = en->next ) { sql_exp *e = en->data; stmt *s = exp_bin(be, e, sub, NULL, 0, 1, 0); @@ -3747,7 +3740,7 @@ rel2bin_groupby(backend *be, sql_rel *re } /* now aggregate */ l = sa_list(sql->sa); - cursub = create_rel_bin_group_stmt(sql->sa, l, NULL, grp, ext, cnt); + cursub = create_rel_bin_group_stmt(sql->sa, rel, l, NULL, grp, ext, cnt); for( n = rel->exps->h; n; n = n->next ) { sql_exp *aggrexp = n->data; stmt *aggrstmt = NULL; @@ -3877,7 +3870,7 @@ rel2bin_sample(backend *be, sql_rel *rel if (!(sample_size = exp_bin(be, rel->exps->h->data, NULL, NULL, 0, 0, 0))) return NULL; - if (rel->exps->cnt == 2) { + if (list_length(rel->exps) == 2) { seed = exp_bin(be, rel->exps->h->next->data, NULL, NULL, 0, 0, 0); if (!seed) return NULL; @@ -4337,7 +4330,7 @@ rel2bin_insert(backend *be, sql_rel *rel be->rowcount = be->rowcount ? add_to_rowcount_accumulator(be, ret->nr) : ret->nr; } - return create_rel_bin_stmt(sql->sa, sa_list(sql->sa), NULL); + return create_rel_bin_stmt(sql->sa, rel, sa_list(sql->sa), NULL); } static int @@ -5303,7 +5296,7 @@ rel2bin_update(backend *be, sql_rel *rel _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list