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

Reply via email to