Changeset: 3278baa0904b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/3278baa0904b Modified Files: sql/server/rel_dump.c sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_unnest.c sql/server/rel_updates.c Branch: Jul2021 Log Message:
Keep mergetable properties when rewritting into unions diffs (264 lines): diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c --- a/sql/server/rel_dump.c +++ b/sql/server/rel_dump.c @@ -2062,7 +2062,7 @@ rel_read(mvc *sql, char *r, int *pos, li if (!(exps = read_exps(sql, NULL, NULL, NULL, r, pos, '[', 0, 1))) return NULL; rel = rel_setop(sql->sa, lrel, rrel, j); - rel_setop_set_exps(sql, rel, exps); + rel_setop_set_exps(sql, rel, exps, false); if (rel_set_types(sql, rel) < 0) return sql_error(sql, -1, SQLSTATE(42000) "Setop: number of expressions don't match\n"); set_processed(rel); 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 @@ -4296,7 +4296,7 @@ rel_push_aggr_down(visitor *v, sql_rel * } u = rel_setop(v->sql->sa, ul, ur, op_union); - rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 1, 1)); + rel_setop_set_exps(v->sql, u, rel_projections(v->sql, ul, NULL, 1, 1), false); set_processed(u); exps = new_exp_list(v->sql->sa); @@ -8714,7 +8714,7 @@ rel_split_outerjoin(visitor *v, sql_rel add_nulls( v->sql, nr, r); exps = rel_projections(v->sql, nl, NULL, 1, 1); nl = rel_setop(v->sql->sa, nl, nr, op_union); - rel_setop_set_exps(v->sql, nl, exps); + rel_setop_set_exps(v->sql, nl, exps, false); set_processed(nl); } if (rel->op == op_right || rel->op == op_full) { @@ -8733,7 +8733,7 @@ rel_split_outerjoin(visitor *v, sql_rel (fdup)NULL); exps = rel_projections(v->sql, nl, NULL, 1, 1); nl = rel_setop(v->sql->sa, nl, nr, op_union); - rel_setop_set_exps(v->sql, nl, exps); + rel_setop_set_exps(v->sql, nl, exps, false); set_processed(nl); } @@ -9151,7 +9151,7 @@ merge_table_prune_and_unionize(visitor * if (nrel) { nrel = rel_setop(v->sql->sa, nrel, next, op_union); - rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, mt_rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, mt_rel, NULL, 1, 1), true); set_processed(nrel); } else { nrel = next; @@ -9428,7 +9428,7 @@ static sql_rel* exp_skip_output_parts(sql_rel *rel) { while ((is_topn(rel->op) || is_project(rel->op) || is_sample(rel->op)) && rel->l) { - if (is_groupby(rel->op) && list_empty(rel->r)) + if (is_union(rel->op) || (is_groupby(rel->op) && list_empty(rel->r))) return rel; /* a group-by with no columns is a plain aggregate and hence always returns one row */ rel = rel->l; } diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -421,7 +421,7 @@ rel_inplace_setop(mvc *sql, sql_rel *rel rel->op = setop; rel->card = CARD_MULTI; rel->flag = 0; - rel_setop_set_exps(sql, rel, exps); + rel_setop_set_exps(sql, rel, exps, false); set_processed(rel); return rel; } @@ -514,7 +514,7 @@ rel_setop_check_types(mvc *sql, sql_rel } void -rel_setop_set_exps(mvc *sql, sql_rel *rel, list *exps) +rel_setop_set_exps(mvc *sql, sql_rel *rel, list *exps, bool keep_props) { sql_rel *l = rel->l, *r = rel->r; list *lexps = l->exps, *rexps = r->exps; @@ -534,7 +534,8 @@ rel_setop_set_exps(mvc *sql, sql_rel *re set_has_nil(e); else set_has_no_nil(e); - e->p = NULL; /* remove all the properties on unions */ + if (!keep_props) + e->p = NULL; /* remove all the properties on unions on the general case */ } e->card = CARD_MULTI; /* multi cardinality */ } @@ -1344,7 +1345,7 @@ rel_or(mvc *sql, sql_rel *rel, sql_rel * rel = rel_setop_check_types(sql, l, r, ls, rs, op_union); if (!rel) return NULL; - rel_setop_set_exps(sql, rel, rel_projections(sql, rel, NULL, 1, 1)); + rel_setop_set_exps(sql, rel, rel_projections(sql, rel, NULL, 1, 1), false); set_processed(rel); rel->nrcols = list_length(rel->exps); rel = rel_distinct(rel); diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -73,7 +73,7 @@ extern sql_rel *rel_inplace_groupby(sql_ extern int rel_convert_types(mvc *sql, sql_rel *ll, sql_rel *rr, sql_exp **L, sql_exp **R, int scale_fixing, check_type tpe); extern sql_rel *rel_setop(sql_allocator *sa, sql_rel *l, sql_rel *r, operator_type setop); extern sql_rel *rel_setop_check_types(mvc *sql, sql_rel *l, sql_rel *r, list *ls, list *rs, operator_type op); -extern void rel_setop_set_exps(mvc *sql, sql_rel *rel, list *exps); +extern void rel_setop_set_exps(mvc *sql, sql_rel *rel, list *exps, bool keep_props); extern sql_rel *rel_crossproduct(sql_allocator *sa, sql_rel *l, sql_rel *r, operator_type join); /* in case e is an constant and rel is a simple project of only e, free rel */ diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -5815,7 +5815,7 @@ rel_setquery_(sql_query *query, sql_rel rel = rel_setop(sql->sa, l, r, (operator_type)op); } if (rel) { - rel_setop_set_exps(sql, rel, rel_projections(sql, rel, NULL, 0, 1)); + rel_setop_set_exps(sql, rel, rel_projections(sql, rel, NULL, 0, 1), false); set_processed(rel); } return rel; diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -2151,7 +2151,7 @@ rewrite_or_exp(visitor *v, sql_rel *rel) return NULL; if (!(rel = rel_setop_check_types(v->sql, l, r, exps_copy(v->sql, exps), exps_copy(v->sql, exps), op_union))) return NULL; - rel_setop_set_exps(v->sql, rel, exps); + rel_setop_set_exps(v->sql, rel, exps, false); set_processed(rel); rel = rel_distinct(rel); if (tids) /* restore TIDs with identity function references */ @@ -2497,7 +2497,7 @@ rel_union_exps(mvc *sql, sql_exp **l, li u = sq; } else { u = rel_setop(sql->sa, u, sq, op_union); - rel_setop_set_exps(sql, u, exps); + rel_setop_set_exps(sql, u, exps, false); set_processed(u); } exps = rel_projections(sql, sq, NULL, 1/*keep names */, 1); @@ -3243,7 +3243,7 @@ rewrite_ifthenelse(visitor *v, sql_rel * set_processed(rsq); rsq = rel_select(v->sql->sa, rsq, exp_or(v->sql->sa, list_append(new_exp_list(v->sql->sa), not_cond), list_append(new_exp_list(v->sql->sa), cond_is_null), 0)); usq = rel_setop(v->sql->sa, lsq, rsq, op_union); - rel_setop_set_exps(v->sql, usq, append(sa_list(v->sql->sa), exp_ref(v->sql, e))); + rel_setop_set_exps(v->sql, usq, append(sa_list(v->sql->sa), exp_ref(v->sql, e)), false); if (single) set_single(usq); set_processed(usq); @@ -3472,7 +3472,7 @@ rewrite_groupings(visitor *v, sql_rel *r unions = nrel; else { unions = rel_setop(v->sql->sa, unions, nrel, op_union); - rel_setop_set_exps(v->sql, unions, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, unions, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(unions); } if (!unions) @@ -3551,7 +3551,7 @@ rewrite_outer2inner_union(visitor *v, sq sql_rel *except = rel_setop(v->sql->sa, rel_project(v->sql->sa, rel_dup(rel->l), rel_projections(v->sql, rel->l, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->l, NULL, 1, 1)), op_except); - rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->l, NULL, 1, 1)); + rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->l, NULL, 1, 1), false); set_processed(except); sql_rel *nrel = rel_crossproduct(v->sql->sa, except, rel_dup(rel->r), op_left); rel_join_add_exp(v->sql->sa, nrel, f); @@ -3560,7 +3560,7 @@ rewrite_outer2inner_union(visitor *v, sq prel, rel_project(v->sql->sa, nrel, rel_projections(v->sql, nrel, NULL, 1, 1)), op_union); - rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(nrel); v->changes++; return nrel; @@ -3569,7 +3569,7 @@ rewrite_outer2inner_union(visitor *v, sq sql_rel *except = rel_setop(v->sql->sa, rel_project(v->sql->sa, rel_dup(rel->r), rel_projections(v->sql, rel->r, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->r, NULL, 1, 1)), op_except); - rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->r, NULL, 1, 1)); + rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->r, NULL, 1, 1), false); set_processed(except); sql_rel *nrel = rel_crossproduct(v->sql->sa, rel_dup(rel->l), except, op_right); rel_join_add_exp(v->sql->sa, nrel, f); @@ -3578,7 +3578,7 @@ rewrite_outer2inner_union(visitor *v, sq prel, rel_project(v->sql->sa, nrel, rel_projections(v->sql, nrel, NULL, 1, 1)), op_union); - rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, nrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(nrel); v->changes++; return nrel; @@ -3587,7 +3587,7 @@ rewrite_outer2inner_union(visitor *v, sq sql_rel *except = rel_setop(v->sql->sa, rel_project(v->sql->sa, rel_dup(rel->l), rel_projections(v->sql, rel->l, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->l, NULL, 1, 1)), op_except); - rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->l, NULL, 1, 1)); + rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->l, NULL, 1, 1), false); set_processed(except); sql_rel *lrel = rel_crossproduct(v->sql->sa, except, rel_dup(rel->r), op_left); rel_join_add_exp(v->sql->sa, lrel, f); @@ -3595,7 +3595,7 @@ rewrite_outer2inner_union(visitor *v, sq except = rel_setop(v->sql->sa, rel_project(v->sql->sa, rel_dup(rel->r), rel_projections(v->sql, rel->r, NULL, 1, 1)), rel_project(v->sql->sa, rel_dup(prel), rel_projections(v->sql, rel->r, NULL, 1, 1)), op_except); - rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->r, NULL, 1, 1)); + rel_setop_set_exps(v->sql, except, rel_projections(v->sql, rel->r, NULL, 1, 1), false); set_processed(except); sql_rel *rrel = rel_crossproduct(v->sql->sa, rel_dup(rel->l), except, op_right); rel_join_add_exp(v->sql->sa, rrel, f); @@ -3603,14 +3603,14 @@ rewrite_outer2inner_union(visitor *v, sq rel_project(v->sql->sa, lrel, rel_projections(v->sql, lrel, NULL, 1, 1)), rel_project(v->sql->sa, rrel, rel_projections(v->sql, rrel, NULL, 1, 1)), op_union); - rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(lrel); rel->op = op_join; lrel = rel_setop(v->sql->sa, rel_project(v->sql->sa, prel, rel_projections(v->sql, rel, NULL, 1, 1)), rel_project(v->sql->sa, lrel, rel_projections(v->sql, lrel, NULL, 1, 1)), op_union); - rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1)); + rel_setop_set_exps(v->sql, lrel, rel_projections(v->sql, rel, NULL, 1, 1), false); set_processed(lrel); v->changes++; return lrel; @@ -3682,7 +3682,7 @@ rewrite_values(visitor *v, sql_rel *rel) } if (cur) { nrel = rel_setop(v->sql->sa, cur, nrel, op_union); - rel_setop_set_exps(v->sql, nrel, exps); + rel_setop_set_exps(v->sql, nrel, exps, false); set_processed(nrel); } cur = nrel; diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -224,7 +224,7 @@ rel_insert_join_idx(mvc *sql, const char if (need_nulls) { rel_destroy(ins); rt = inserts->r = rel_setop(sql->sa, _nlls, nnlls, op_union ); - rel_setop_set_exps(sql, rt, rel_projections(sql, nnlls, NULL, 1, 1)); + rel_setop_set_exps(sql, rt, rel_projections(sql, nnlls, NULL, 1, 1), false); set_processed(rt); } else { inserts->r = nnlls; @@ -853,7 +853,7 @@ rel_update_join_idx(mvc *sql, const char if (need_nulls) { rel_destroy(ups); rt = updates->r = rel_setop(sql->sa, _nlls, nnlls, op_union ); - rel_setop_set_exps(sql, rt, rel_projections(sql, nnlls, NULL, 1, 1)); + rel_setop_set_exps(sql, rt, rel_projections(sql, nnlls, NULL, 1, 1), false); set_processed(rt); } else { updates->r = nnlls; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list