Changeset: 4d8985781870 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4d8985781870
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_distribute.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_psm.c
        sql/server/rel_rel.c
        sql/server/rel_schema.c
        sql/server/rel_unnest.c
        sql/server/rel_updates.c
Branch: sq2
Log Message:

now also handle lists of subqueries
some more cleanup.


diffs (truncated from 703 to 300 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -732,10 +732,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        if (!s) {
                                fprintf(stderr, "query: '%s'\n", sql->query);
                        }
-                       //assert(s);
+                       assert(s);
                        return NULL;
                }
-        }      break;
+       }       break;
        case e_cmp: {
                stmt *l = NULL, *r = NULL, *r2 = NULL;
                int swapped = 0, is_select = 0;
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
@@ -80,7 +80,7 @@ rewrite_replica( mvc *sql, sql_rel *rel,
                sql_exp *e = n->data;
                sql_exp *ne = m->data;
 
-               exp_prop_alias(ne, e);
+               exp_prop_alias(sql->sa, ne, e);
        }
        rel_destroy(rel);
 
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
@@ -10,6 +10,7 @@
 #include "sql_relation.h"
 #include "sql_semantic.h"
 #include "rel_exp.h"
+#include "rel_rel.h"
 #include "rel_prop.h" /* for prop_copy() */
 #include "rel_unnest.h"
 #include "rel_optimizer.h"
@@ -778,10 +779,12 @@ exp_setalias(sql_exp *e, const char *rna
 }
 
 void 
-exp_prop_alias(sql_exp *e, sql_exp *oe )
+exp_prop_alias(sql_allocator *sa, sql_exp *e, sql_exp *oe )
 {
        if (oe->alias.name == NULL && exp_has_rel(oe)) {
-               sql_rel *r = exp_rel_get_rel(oe);
+               sql_rel *r = exp_rel_get_rel(sa, oe);
+               if (!is_project(r->op))
+                       return ;
                oe = r->exps->t->data;
        }
        e->alias = oe->alias;
@@ -1685,23 +1688,32 @@ exps_have_rel_exp( list *exps)
        return 0;
 }
 
-/* For now only handle single relation, later combine multiple relations into 
one (using crossproduct */
 static sql_rel *
-exps_rel_get_rel( list *exps )
+exps_rel_get_rel(sql_allocator *sa, list *exps )
 {
+       sql_rel *xp = NULL;
+
        if (list_empty(exps))
                return NULL;
        for (node *n = exps->h; n; n=n->next){
                sql_exp *e = n->data;
 
-               if (exp_has_rel(e))
-                       return exp_rel_get_rel(e);
+               if (exp_has_rel(e)) {
+                       sql_rel *r = exp_rel_get_rel(sa, e);
+
+                       if (!r)
+                               return NULL;
+                       if (xp)
+                               xp = rel_crossproduct(sa, xp, r, op_join);
+                       else
+                               xp = r;
+               }
        }
-       return NULL;
+       return xp;
 }
 
 sql_rel *
-exp_rel_get_rel( sql_exp *e)
+exp_rel_get_rel(sql_allocator *sa, sql_exp *e)
 {
        if (!e)
                return NULL;
@@ -1709,36 +1721,36 @@ exp_rel_get_rel( sql_exp *e)
        switch(e->type){
        case e_func:
        case e_aggr: 
-               return exps_rel_get_rel(e->l);
+               return exps_rel_get_rel(sa, e->l);
        case e_cmp:
                if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
                        if (exps_have_rel_exp(e->l))
-                               return exps_rel_get_rel(e->l);
+                               return exps_rel_get_rel(sa, e->l);
                        if (exps_have_rel_exp(e->r))
-                               return exps_rel_get_rel(e->r);
+                               return exps_rel_get_rel(sa, e->r);
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
                        if (exp_has_rel(e->l))
-                               return exp_rel_get_rel(e->l);
+                               return exp_rel_get_rel(sa, e->l);
                        if (exps_have_rel_exp(e->r))
-                               return exps_rel_get_rel(e->r);
+                               return exps_rel_get_rel(sa, e->r);
                } else {
                        if (exp_has_rel(e->l))
-                               return exp_rel_get_rel(e->l);
+                               return exp_rel_get_rel(sa, e->l);
                        if (exp_has_rel(e->r))
-                               return exp_rel_get_rel(e->r);
+                               return exp_rel_get_rel(sa, e->r);
                        if (e->f && exp_has_rel(e->f))
-                               return exp_rel_get_rel(e->f);
+                               return exp_rel_get_rel(sa, e->f);
                }
                return NULL;
        case e_convert:
-               return exp_rel_get_rel(e->l);
+               return exp_rel_get_rel(sa, e->l);
        case e_psm:
                if (exp_is_rel(e))
                        return e->l;
                return NULL;
        case e_atom:
                if (e->f && exps_have_rel_exp(e->f))
-                       return exps_rel_get_rel(e->f);
+                       return exps_rel_get_rel(sa, e->f);
                return NULL;
        case e_column:
                return NULL;
@@ -1757,6 +1769,7 @@ exp_rel_update_exps(sql_allocator *sa, l
                if (exp_has_rel(e))
                        n->data = exp_rel_update_exp(sa, e);
        }
+       list_hash_clear(exps);
        return exps;
 }
 
@@ -1796,7 +1809,7 @@ exp_rel_update_exp(sql_allocator *sa, sq
                return e;
        case e_psm:
                if (exp_is_rel(e)) {
-                       sql_rel *r = exp_rel_get_rel(e);
+                       sql_rel *r = exp_rel_get_rel(sa, e);
                        e = r->exps->t->data;
                        return exp_ref(sa, e);
                }
@@ -2301,7 +2314,7 @@ exp_copy( mvc *sql, sql_exp * e)
        if (!ne)
                return ne;
        if (e->alias.name)
-               exp_prop_alias(ne, e);
+               exp_prop_alias(sql->sa, ne, e);
        ne = exp_propagate(sql->sa, ne, e);
        if (is_freevar(e))
                set_freevar(ne, is_freevar(e)-1);
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
@@ -90,7 +90,7 @@ extern sql_exp * exp_rel(mvc *sql, sql_r
 extern void exp_setname(sql_allocator *sa, sql_exp *e, const char *rname, 
const char *name );
 extern void exp_setrelname(sql_allocator *sa, sql_exp *e, int nr );
 extern void exp_setalias(sql_exp *e, const char *rname, const char *name);
-extern void exp_prop_alias(sql_exp *e, sql_exp *oe);
+extern void exp_prop_alias(sql_allocator *sa, sql_exp *e, sql_exp *oe);
 
 extern void noninternexp_setname(sql_allocator *sa, sql_exp *e, const char 
*rname, const char *name );
 extern char* make_label(sql_allocator *sa, int nr);
@@ -137,7 +137,7 @@ extern int exp_is_null(mvc *sql, sql_exp
 extern int exp_is_rel(sql_exp *e);
 extern int exp_has_rel(sql_exp *e);
 extern int exps_have_rel_exp(list *exps);
-extern sql_rel *exp_rel_get_rel( sql_exp *e);
+extern sql_rel *exp_rel_get_rel(sql_allocator *sa, sql_exp *e);
 extern sql_exp *exp_rel_update_exp(sql_allocator *sa, sql_exp *e);
 extern int exps_are_atoms(list *exps);
 extern int exp_has_func(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
@@ -2901,7 +2901,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel, 
                                list_append(l, a);
                        }
                        ne = exp_op(sql->sa, l, f);
-                       exp_prop_alias(ne, e);
+                       exp_prop_alias(sql->sa, ne, e);
                        if (cc && math_unsafe(f)) {
                                /* only add one condition */
                                assert(f->func->varres || f->func->vararg || 
list_length(ne->l) == list_length(f->func->ops)); 
@@ -2945,7 +2945,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel, 
                        }
                        assert(cond && a1 && a2);
                        nne = exp_op3(sql->sa, cond, a1, a2, ne->f);
-                       exp_prop_alias(nne, ne);
+                       exp_prop_alias(sql->sa, nne, ne);
                        ne = nne;
                }
                return ne;
@@ -2954,7 +2954,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel, 
                sql_exp *e1 = exp_case_fixup(sql, rel, e->l, cc);
                sql_exp *ne = exp_convert(sql->sa, e1, exp_fromtype(e), 
exp_totype(e));
 
-               exp_prop_alias(ne, e);
+               exp_prop_alias(sql->sa, ne, e);
                return ne;
        } 
        if (e->type == e_aggr) {
@@ -2972,7 +2972,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel, 
                        }
                }
                ne = exp_aggr(sql->sa, l, f, need_distinct(e), need_no_nil(e), 
e->card, has_nil(e));
-               exp_prop_alias(ne, e);
+               exp_prop_alias(sql->sa, ne, e);
                return ne;
        }
        return e;
@@ -5603,7 +5603,7 @@ rel_reduce_groupby_exps(int *changes, mv
                                                        ne = 
exps_bind_column(dgbe, e->r, NULL);
                                                if (ne) {
                                                        ne = exp_copy(sql, ne);
-                                                       exp_prop_alias(ne, e);
+                                                       exp_prop_alias(sql->sa, 
ne, e);
                                                        e = ne;
                                                }
                                        }
@@ -6255,6 +6255,20 @@ rel_push_project_up(int *changes, mvc *s
        return rel;
 }
 
+static int exp_mark_used(sql_rel *subrel, sql_exp *e);
+
+static int 
+exps_mark_used(sql_rel *subrel, list *l) 
+{
+       int nr = 0;
+       if (list_empty(l))
+               return nr;
+
+       for (node *n = l->h; n != NULL; n = n->next) 
+               nr += exp_mark_used(subrel, n->data);
+       return nr;
+}
+
 static int
 exp_mark_used(sql_rel *subrel, sql_exp *e)
 {
@@ -6269,32 +6283,17 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                return exp_mark_used(subrel, e->l);
        case e_aggr:
        case e_func: {
-               if (e->l) {
-                       list *l = e->l;
-                       node *n = l->h;
-       
-                       for (;n != NULL; n = n->next) 
-                               nr += exp_mark_used(subrel, n->data);
-               }
+               if (e->l)
+                       nr += exps_mark_used(subrel, e->l);
                break;
        }
        case e_cmp:
                if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
-                       list *l = e->l;
-                       node *n;
-       
-                       for (n = l->h; n != NULL; n = n->next) 
-                               nr += exp_mark_used(subrel, n->data);
-                       l = e->r;
-                       for (n = l->h; n != NULL; n = n->next) 
-                               nr += exp_mark_used(subrel, n->data);
+                       nr += exps_mark_used(subrel, e->l);
+                       nr += exps_mark_used(subrel, e->r);
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
-                       list *r = e->r;
-                       node *n;
-
                        nr += exp_mark_used(subrel, e->l);
-                       for (n = r->h; n != NULL; n = n->next)
-                               nr += exp_mark_used(subrel, n->data);
+                       nr += exps_mark_used(subrel, e->r);
                } else {
                        nr += exp_mark_used(subrel, e->l);
                        nr += exp_mark_used(subrel, e->r);
@@ -6306,7 +6305,9 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                /* atoms are used in e_cmp */
                e->used = 1;
                /* return 0 as constants may require a full column ! */
-               return 0;
+               if (e->f)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to