Changeset: 8e79dbe301e4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8e79dbe301e4
Modified Files:
sql/server/rel_distribute.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_propagate.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_select.c
sql/server/rel_select.h
sql/server/rel_unnest.c
sql/server/rel_updates.c
sql/server/rel_xml.c
Branch: sq2
Log Message:
moved exists to unnest
diffs (truncated from 1643 to 300 lines):
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -146,7 +146,7 @@ replica(mvc *sql, sql_rel *rel, char *ur
if (rel_is_ref(rel)) {
if (has_remote_or_replica(rel)) {
- sql_rel *nrel = rel_copy(sql->sa, rel, 0);
+ sql_rel *nrel = rel_copy(sql, rel, 0);
if (nrel && rel->p)
nrel->p = prop_copy(sql->sa, rel->p);
@@ -288,7 +288,7 @@ distribute(mvc *sql, sql_rel *rel)
if (rel_is_ref(rel)) {
if (has_remote_or_replica(rel)) {
- sql_rel *nrel = rel_copy(sql->sa, rel, 0);
+ sql_rel *nrel = rel_copy(sql, rel, 0);
if (nrel && rel->p)
nrel->p = prop_copy(sql->sa, rel->p);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -646,6 +646,7 @@ exp_rel(mvc *sql, sql_rel *rel)
*/
e->l = rel;
e->flag = PSM_REL;
+ e->card = rel->card;
assert(rel);
if (is_project(rel->op)) {
sql_exp *last = rel->exps->t->data;
@@ -1545,7 +1546,7 @@ exp_is_atom( sql_exp *e )
int
exp_is_rel( sql_exp *e )
{
- return (e->type == e_psm && e->flag == PSM_REL && e->l);
+ return (e && e->type == e_psm && e->flag == PSM_REL && e->l);
}
int
@@ -1934,7 +1935,7 @@ exps_alias( sql_allocator *sa, list *exp
}
list *
-exps_copy( sql_allocator *sa, list *exps)
+exps_copy( mvc *sql, list *exps)
{
node *n;
list *nl;
@@ -1942,11 +1943,11 @@ exps_copy( sql_allocator *sa, list *exps
if (!exps)
return exps;
- nl = new_exp_list(sa);
+ nl = new_exp_list(sql->sa);
for(n = exps->h; n; n = n->next) {
sql_exp *arg = n->data;
- arg = exp_copy(sa, arg);
+ arg = exp_copy(sql, arg);
if (!arg)
return NULL;
append(nl, arg);
@@ -1955,48 +1956,48 @@ exps_copy( sql_allocator *sa, list *exps
}
sql_exp *
-exp_copy( sql_allocator *sa, sql_exp * e)
+exp_copy( mvc *sql, sql_exp * e)
{
sql_exp *l, *r, *r2, *ne = NULL;
switch(e->type){
case e_column:
- ne = exp_column(sa, e->l, e->r, exp_subtype(e), e->card,
has_nil(e), is_intern(e));
+ ne = exp_column(sql->sa, e->l, e->r, exp_subtype(e), e->card,
has_nil(e), is_intern(e));
ne->flag = e->flag;
break;
case e_cmp:
if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
- list *l = exps_copy(sa, e->l);
- list *r = exps_copy(sa, e->r);
+ list *l = exps_copy(sql, e->l);
+ list *r = exps_copy(sql, e->r);
if (l && r) {
if (get_cmp(e) == cmp_filter)
- ne = exp_filter(sa, l, r, e->f,
is_anti(e));
+ ne = exp_filter(sql->sa, l, r, e->f,
is_anti(e));
else
- ne = exp_or(sa, l, r, is_anti(e));
+ ne = exp_or(sql->sa, l, r, is_anti(e));
}
} else if (e->flag == cmp_in || e->flag == cmp_notin) {
- sql_exp *l = exp_copy(sa, e->l);
- list *r = exps_copy(sa, e->r);
+ sql_exp *l = exp_copy(sql, e->l);
+ list *r = exps_copy(sql, e->r);
if (l && r)
- ne = exp_in(sa, l, r, e->flag);
+ ne = exp_in(sql->sa, l, r, e->flag);
} else {
- l = exp_copy(sa, e->l);
- r = exp_copy(sa, e->r);
+ l = exp_copy(sql, e->l);
+ r = exp_copy(sql, e->r);
if (e->f) {
- r2 = exp_copy(sa, e->f);
+ r2 = exp_copy(sql, e->f);
if (l && r && r2)
- ne = exp_compare2(sa, l, r, r2,
e->flag);
+ ne = exp_compare2(sql->sa, l, r, r2,
e->flag);
} else if (l && r) {
- ne = exp_compare(sa, l, r, e->flag);
+ ne = exp_compare(sql->sa, l, r, e->flag);
}
}
break;
case e_convert:
- l = exp_copy(sa, e->l);
+ l = exp_copy(sql, e->l);
if (l)
- ne = exp_convert(sa, l, exp_fromtype(e), exp_totype(e));
+ ne = exp_convert(sql->sa, l, exp_fromtype(e),
exp_totype(e));
break;
case e_aggr:
case e_func: {
@@ -2005,34 +2006,39 @@ exp_copy( sql_allocator *sa, sql_exp * e
if (!l) {
return e;
} else {
- nl = exps_copy(sa, l);
+ nl = exps_copy(sql, l);
if (!nl)
return NULL;
}
if (e->type == e_func)
- ne = exp_op(sa, nl, e->f);
+ ne = exp_op(sql->sa, nl, e->f);
else
- ne = exp_aggr(sa, nl, e->f, need_distinct(e),
need_no_nil(e), e->card, has_nil(e));
+ ne = exp_aggr(sql->sa, nl, e->f, need_distinct(e),
need_no_nil(e), e->card, has_nil(e));
break;
}
case e_atom:
if (e->l)
- ne = exp_atom(sa, e->l);
+ ne = exp_atom(sql->sa, e->l);
else if (!e->r)
- ne = exp_atom_ref(sa, e->flag, &e->tpe);
+ ne = exp_atom_ref(sql->sa, e->flag, &e->tpe);
else
- ne = exp_param(sa, e->r, &e->tpe, e->flag);
+ ne = exp_param(sql->sa, e->r, &e->tpe, e->flag);
break;
case e_psm:
if (e->flag == PSM_SET)
- ne = exp_set(sa, e->alias.name, exp_copy(sa, e->l),
GET_PSM_LEVEL(e->flag));
+ ne = exp_set(sql->sa, e->alias.name, exp_copy(sql,
e->l), GET_PSM_LEVEL(e->flag));
+ if (e->flag == PSM_REL) {
+ if (!exp_name(e))
+ exp_label(sql->sa, e, ++sql->label);
+ return exp_ref(sql->sa, e);
+ }
break;
}
if (!ne)
return ne;
if (e->alias.name)
exp_prop_alias(ne, e);
- ne = exp_propagate(sa, ne, e);
+ ne = exp_propagate(sql->sa, ne, e);
if (is_freevar(e))
set_freevar(ne, is_freevar(e)-1);
return ne;
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -94,8 +94,8 @@ extern sql_exp* exp_label(sql_allocator
extern sql_exp* exp_label_table(sql_allocator *sa, sql_exp *e, int nr);
extern list* exps_label(sql_allocator *sa, list *exps, int nr);
-extern sql_exp * exp_copy( sql_allocator *sa, sql_exp *e);
-extern list * exps_copy( sql_allocator *sa, list *exps);
+extern sql_exp * exp_copy( mvc *sql, sql_exp *e);
+extern list * exps_copy( mvc *sql, list *exps);
extern list * exps_alias( sql_allocator *sa, list *exps);
extern void exp_swap( sql_exp *e );
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
@@ -2155,25 +2155,25 @@ rel_push_topn_down(int *changes, mvc *sq
/* introduce projects under the set */
ul = rel_project(sql->sa, ul, NULL);
- ul->exps = exps_copy(sql->sa, r->exps);
+ ul->exps = exps_copy(sql, r->exps);
/* possibly add order by column */
if (add_r)
- ul->exps = list_merge(ul->exps,
exps_copy(sql->sa, r->r), NULL);
- ul->r = exps_copy(sql->sa, r->r);
+ ul->exps = list_merge(ul->exps, exps_copy(sql,
r->r), NULL);
+ ul->r = exps_copy(sql, r->r);
ul = rel_topn(sql->sa, ul, sum_limit_offset(sql,
rel->exps));
ur = rel_project(sql->sa, ur, NULL);
- ur->exps = exps_copy(sql->sa, r->exps);
+ ur->exps = exps_copy(sql, r->exps);
/* possibly add order by column */
if (add_r)
- ur->exps = list_merge(ur->exps,
exps_copy(sql->sa, r->r), NULL);
- ur->r = exps_copy(sql->sa, r->r);
+ ur->exps = list_merge(ur->exps, exps_copy(sql,
r->r), NULL);
+ ur->r = exps_copy(sql, r->r);
ur = rel_topn(sql->sa, ur, sum_limit_offset(sql,
rel->exps));
u = rel_setop(sql->sa, ul, ur, op_union);
u->exps = exps_alias(sql->sa, r->exps);
set_processed(u);
/* possibly add order by column */
if (add_r)
- u->exps = list_merge(u->exps,
exps_copy(sql->sa, r->r), NULL);
+ u->exps = list_merge(u->exps, exps_copy(sql,
r->r), NULL);
if (need_distinct(r)) {
set_distinct(ul);
set_distinct(ur);
@@ -2311,7 +2311,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
return NULL;
}
if (ne->type == e_atom)
- e = exp_copy(sql->sa, ne);
+ e = exp_copy(sql, ne);
else
e = exp_alias(sql->sa, exp_relname(e), exp_name(e),
ne->l, ne->r, exp_subtype(e), e->card, has_nil(e), is_intern(e));
return exp_propagate(sql->sa, e, ne);
@@ -4041,30 +4041,30 @@ rel_push_aggr_down(int *changes, mvc *sq
rel_rename_exps(sql, u->exps, ur->exps);
if (u != ou) {
ul = rel_project(sql->sa, ul, NULL);
- ul->exps = exps_copy(sql->sa, ou->exps);
+ ul->exps = exps_copy(sql, ou->exps);
rel_rename_exps(sql, ou->exps, ul->exps);
ur = rel_project(sql->sa, ur, NULL);
- ur->exps = exps_copy(sql->sa, ou->exps);
+ ur->exps = exps_copy(sql, ou->exps);
rel_rename_exps(sql, ou->exps, ur->exps);
}
if (g->r && list_length(g->r) > 0) {
list *gbe = g->r;
- lgbe = exps_copy(sql->sa, gbe);
- rgbe = exps_copy(sql->sa, gbe);
+ lgbe = exps_copy(sql, gbe);
+ rgbe = exps_copy(sql, gbe);
}
ul = rel_groupby(sql, ul, NULL);
ul->r = lgbe;
ul->nrcols = g->nrcols;
ul->card = g->card;
- ul->exps = list_merge(exps_copy(sql->sa, g->exps),
exps_copy(sql->sa, ul->r), (fdup)NULL);
+ ul->exps = list_merge(exps_copy(sql, g->exps), exps_copy(sql,
ul->r), (fdup)NULL);
ur = rel_groupby(sql, ur, NULL);
ur->r = rgbe;
ur->nrcols = g->nrcols;
ur->card = g->card;
- ur->exps = list_merge(exps_copy(sql->sa, g->exps),
exps_copy(sql->sa, ur->r), (fdup)NULL);
+ ur->exps = list_merge(exps_copy(sql, g->exps), exps_copy(sql,
ur->r), (fdup)NULL);
/* group by on primary keys which define the partioning scheme
* don't need a finalizing group by */
@@ -4129,7 +4129,7 @@ rel_push_aggr_down(int *changes, mvc *sq
if (/* DISABLES CODE */ (0) && cnt)
ne->p = prop_create(sql->sa,
PROP_COUNT, ne->p);
} else {
- ne = exp_copy(sql->sa, oa);
+ ne = exp_copy(sql, oa);
}
exp_setname(sql->sa, ne, exp_find_rel_name(oa),
exp_name(oa));
append(exps, ne);
@@ -4802,8 +4802,8 @@ rel_push_semijoin_down(int *changes, mvc
if (!right && !left)
return rel;
}
- nsexps = exps_copy(sql->sa, rel->exps);
- njexps = exps_copy(sql->sa, l->exps);
+ nsexps = exps_copy(sql, rel->exps);
+ njexps = exps_copy(sql, l->exps);
if (right)
l = rel_crossproduct(sql->sa, rel_dup(ll), rel_dup(r),
op);
else
@@ -4980,9 +4980,9 @@ rel_push_join_down_union(int *changes, m
rel_rename_exps(sql, l->exps, lr->exps);
if (l != ol) {
ll = rel_project(sql->sa, ll, NULL);
- ll->exps = exps_copy(sql->sa, ol->exps);
+ ll->exps = exps_copy(sql, ol->exps);
lr = rel_project(sql->sa, lr, NULL);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list