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

Reply via email to