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 -- [email protected]
To unsubscribe send an email to [email protected]