Changeset: ee06bbe09cb2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/ee06bbe09cb2 Modified Files: sql/server/rel_basetable.c sql/server/rel_basetable.h sql/server/rel_optimizer.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_unnest.c Branch: default Log Message:
Fixing relation inplacements refcounts diffs (128 lines): diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c --- a/sql/server/rel_basetable.c +++ b/sql/server/rel_basetable.c @@ -554,24 +554,3 @@ rel_base_get_mergetable(sql_rel *rel) return ba ? ba->mt : NULL; } - -sql_rel * -rel_inplace_basetable(sql_rel *rel, sql_rel *bt) -{ - /* in order to not expose 'rel_destroy_', add a reference increment, - so 'rel' references stay the same */ - rel_dup(rel); - rel_destroy(rel); - assert(is_basetable(bt->op)); - - set_processed(rel); - rel->l = bt->l; - rel->r = bt->r; - rel->attr = NULL; - rel->op = op_basetable; - rel->exps = bt->exps; - rel->card = CARD_MULTI; - rel->flag = 0; - rel->nrcols = bt->nrcols; - return rel; -} diff --git a/sql/server/rel_basetable.h b/sql/server/rel_basetable.h --- a/sql/server/rel_basetable.h +++ b/sql/server/rel_basetable.h @@ -47,6 +47,5 @@ extern int rel_base_has_column_privilege extern void rel_base_set_mergetable( sql_rel *rel, sql_table *mt); /* keep parent merge table */ extern sql_table *rel_base_get_mergetable( sql_rel *rel); -extern sql_rel *rel_inplace_basetable(sql_rel *rel, sql_rel *bt); #endif /* _REL_BASETABLE_H_ */ 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 @@ -9074,6 +9074,10 @@ rel_merge_table_rewrite(visitor *v, sql_ if (!(nrel = merge_table_prune_and_unionize(v, bt, info))) return NULL; /* Always do relation inplace. If the mt relation has more than 1 reference, this is required */ + if (is_select(rel->op)) { /* for the selection case, increment the reference count of the table */ + assert(rel->l == bt && sel->l == bt); + rel_dup(bt); + } if (is_union(nrel->op)) { rel = rel_inplace_setop(v->sql, rel, nrel->l, nrel->r, op_union, nrel->exps); } else if (is_select(nrel->op)) { 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 @@ -457,6 +457,24 @@ rel_first_column(mvc *sql, sql_rel *r) } sql_rel * +rel_inplace_basetable(sql_rel *rel, sql_rel *bt) +{ + assert(is_basetable(bt->op)); + + rel_destroy_(rel); + set_processed(rel); + rel->l = bt->l; + rel->r = bt->r; + rel->attr = NULL; + rel->op = op_basetable; + rel->exps = bt->exps; + rel->card = CARD_MULTI; + rel->flag = 0; + rel->nrcols = bt->nrcols; + return rel; +} + +sql_rel * rel_inplace_setop(mvc *sql, sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps) { rel_destroy_(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 @@ -69,6 +69,7 @@ extern sql_exp *rel_bind_column( mvc *sq extern sql_exp *rel_bind_column2( mvc *sql, sql_rel *rel, const char *tname, const char *cname, int f ); extern sql_exp *rel_first_column(mvc *sql, sql_rel *rel); +extern sql_rel *rel_inplace_basetable(sql_rel *rel, sql_rel *bt); extern sql_rel *rel_inplace_setop(mvc *sql, sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps); extern sql_rel *rel_inplace_project(sql_allocator *sa, sql_rel *rel, sql_rel *l, list *e); extern sql_rel *rel_inplace_select(sql_rel *rel, sql_rel *l, list *exps); 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 @@ -3538,7 +3538,7 @@ rewrite_groupings(visitor *v, sql_rel *r list *l = (list*) n->data, *exps = sa_list(v->sql->sa), *pexps = sa_list(v->sql->sa); l = list_flaten(l); - nrel = rel_groupby(v->sql, unions ? rel_dup(rel->l) : rel->l, l); + nrel = rel_groupby(v->sql, rel_dup(rel->l), l); for (node *m = rel->exps->h ; m ; m = m->next) { sql_exp *e = (sql_exp*) m->data, *ne = NULL; @@ -3637,7 +3637,6 @@ rewrite_groupings(visitor *v, sql_rel *r return unions; } /* always do relation inplace, so it will be fine when the input group has more than 1 reference */ - rel_dup(rel->l); if (is_union(unions->op)) { rel = rel_inplace_setop(v->sql, rel, unions->l, unions->r, op_union, unions->exps); } else { @@ -3662,7 +3661,7 @@ rewrite_groupings(visitor *v, sql_rel *r } if (found_grouping) { /* replace grouping calls with constants of value 0 */ - sql_rel *nrel = rel_groupby(v->sql, rel->l, rel->r); + sql_rel *nrel = rel_groupby(v->sql, rel_dup(rel->l), rel->r); list *exps = sa_list(v->sql->sa), *pexps = sa_list(v->sql->sa); sql_subtype *bt = sql_bind_localtype("bte"); @@ -3693,7 +3692,6 @@ rewrite_groupings(visitor *v, sql_rel *r list_append(pexps, e); } /* always do relation inplace, so it will be fine when the input group has more than 1 reference */ - rel_dup(rel->l); rel = rel_inplace_project(v->sql->sa, rel, nrel, pexps); rel->card = exps_card(pexps); v->changes++; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org