Changeset: 59f7eaf1fc20 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=59f7eaf1fc20
Modified Files:
        sql/server/rel_distribute.c
        sql/server/rel_exp.c
        sql/server/rel_optimizer.c
        sql/server/rel_propagate.c
        sql/server/rel_rel.c
        sql/server/rel_unnest.c
        sql/server/sql_partition.c
Branch: default
Log Message:

More define lines for ->f atoms, ie lists of atoms


diffs (truncated from 303 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
@@ -132,7 +132,10 @@ exp_replica(mvc *sql, sql_exp *e, char *
 {
        switch(e->type) {
        case e_column:
+               break;
        case e_atom:
+               if (e->f)
+                       e->f = exps_replica(sql, e->f, uri);
                break;
        case e_convert:
                e->l = exp_replica(sql, e->l, uri);
@@ -298,7 +301,10 @@ exp_distribute(mvc *sql, sql_exp *e)
 {
        switch(e->type) {
        case e_column:
+               break;
        case e_atom:
+               if (e->f)
+                       e->f = exps_distribute(sql, e->f);
                break;
        case e_convert:
                e->l = exp_distribute(sql, e->l);
@@ -525,7 +531,10 @@ exp_remote_func(mvc *sql, sql_exp *e)
 {
        switch(e->type) {
        case e_column:
+               break;
        case e_atom:
+               if (e->f)
+                       e->f = exps_remote_func(sql, e->f);
                break;
        case e_convert:
                e->l = exp_remote_func(sql, e->l);
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
@@ -1350,6 +1350,8 @@ exp_match_exp( sql_exp *e1, sql_exp *e2)
                case e_atom:
                        if (e1->l && e2->l && !atom_cmp(e1->l, e2->l))
                                return 1;
+                       if (e1->f && e2->f && exps_equal(e1->f, e2->f))
+                               return 1;
                        break;
                default:
                        break;
@@ -1420,28 +1422,37 @@ static int
 exp_is_complex_select( sql_exp *e )
 {
        switch (e->type) {
-       case e_atom:
+       case e_atom: {
+               if (e->f) {
+                       int r = (e->card == CARD_ATOM);
+                       list *l = e->f;
+
+                       if (r)
+                               for (node *n = l->h; n && !r; n = n->next)
+                                       r |= exp_is_complex_select(n->data);
+                       return r;
+               }
                return 0;
+       }
        case e_convert:
                return exp_is_complex_select(e->l);
        case e_func:
        case e_aggr:
        {
                int r = (e->card == CARD_ATOM);
-               node *n;
                list *l = e->l;
 
                if (r && l)
-                       for (n = l->h; n && !r; n = n->next)
+                       for (node *n = l->h; n && !r; n = n->next)
                                r |= exp_is_complex_select(n->data);
                return r;
        }
+       case e_psm:
+               return 1;
        case e_column:
        case e_cmp:
        default:
                return 0;
-       case e_psm:
-               return 1;
        }
 }
 
@@ -2263,6 +2274,8 @@ exp_has_func(sql_exp *e)
                return 0;
        switch (e->type) {
        case e_atom:
+               if (e->f)
+                       return exps_have_func(e->f);
                return 0;
        case e_convert:
                return exp_has_func(e->l);
@@ -2316,6 +2329,9 @@ exp_has_sideeffect( sql_exp *e )
                        return 0;
                }
        case e_atom:
+               if (e->f)
+                       return exps_has_sideeffect(e->f);
+               return 0;
        case e_aggr:
        case e_cmp:
        case e_column:
@@ -2360,8 +2376,12 @@ exp_unsafe(sql_exp *e, int allow_identit
                        return exp_unsafe(e->l, allow_identity) || 
exp_unsafe(e->r, allow_identity) || (e->f && exp_unsafe(e->f, allow_identity));
                }
        } break;
+       case e_atom: {
+               if (e->f)
+                       return exps_have_unsafe(e->f, allow_identity);
+               return 0;
+       } break;
        case e_column:
-       case e_atom:
        case e_psm:
                return 0;
        }
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
@@ -233,8 +233,11 @@ psm_exp_properties(mvc *sql, global_prop
 {
        /* only functions need fix up */
        switch(e->type) {
+       case e_column:
+               break;
        case e_atom:
-       case e_column:
+               if (e->f)
+                       psm_exps_properties(sql, gp, e->f);
                break;
        case e_convert:
                psm_exp_properties(sql, gp, e->l);
@@ -1429,13 +1432,15 @@ exp_needs_push_down(sql_exp *e)
        case e_convert:
                return exp_needs_push_down(e->l);
        case e_aggr:
-       case e_func: {
+       case e_func:
                if (!e->l || exps_are_atoms(e->l))
                        return 0;
                return 1;
-       } break;
+       case e_atom:
+               if (!e->f || exps_are_atoms(e->f))
+                       return 0;
+               return 1;
        case e_column:
-       case e_atom:
        default:
                return 0;
        }
@@ -1514,7 +1519,10 @@ exp_push_single_func_down(visitor *v, sq
                        v->changes++;
                }
        } break;
-       case e_atom:
+       case e_atom: {
+               if (e->f && (e->f = exps_push_single_func_down(v, rel, l, r, 
e->f, depth + 1)) == NULL)
+                       return NULL;
+       } break;
        case e_column:
        case e_psm:
                break;
@@ -2778,6 +2786,8 @@ exp_shares_exps(sql_exp *e, list *shared
                else
                        return exp_shares_exps(e->l, shared, uses) || 
exp_shares_exps(e->r, shared, uses) || (e->f && exp_shares_exps(e->f, shared, 
uses));
        case e_atom:
+               if (e->f)
+                       return exps_shares_exps(e->f, shared, uses);
                return false;
        case e_column:
                {
@@ -4030,8 +4040,11 @@ exp_uses_exp(sql_exp *e, const char *rna
 
        switch (e->type) {
                case e_psm:
-               case e_atom:
                        break;
+               case e_atom: {
+                       if (e->f)
+                               return list_exps_uses_exp(e->f, rname, name);
+               } break;
                case e_convert:
                        return exp_uses_exp(e->l, rname, name);
                case e_column: {
@@ -6219,8 +6232,11 @@ split_aggr_and_project(mvc *sql, list *a
        case e_func:
                list_split_aggr_and_project(sql, aexps, e->l);
                return e;
+       case e_atom:
+               if (e->f)
+                       list_split_aggr_and_project(sql, aexps, e->f);
+               return e;
        case e_column: /* constants and columns shouldn't be rewriten */
-       case e_atom:
        case e_psm:
                return e;
        }
@@ -7949,8 +7965,11 @@ split_exp(mvc *sql, sql_exp *e, sql_rel 
                                e->f = split_exp(sql, e->f, rel);
                }
                return e;
+       case e_atom:
+               if (e->f)
+                       split_exps(sql, e->f, rel);
+               return e;
        case e_psm:
-       case e_atom:
                return e;
        }
        return e;
@@ -8067,8 +8086,11 @@ select_split_exp(mvc *sql, sql_exp *e, s
                                e->f = select_split_exp(sql, e->f, rel);
                }
                return e;
+       case e_atom:
+               if (e->f)
+                       select_split_exp(sql, e->f, rel);
+               return e;
        case e_psm:
-       case e_atom:
                return e;
        }
        return e;
diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -476,8 +476,11 @@ exp_change_column_table(mvc *sql, sql_ex
                case e_convert: {
                        e->l = exp_change_column_table(sql, e->l, oldt, newt);
                } break;
-               case e_atom:
-                       break;
+               case e_atom: {
+                       if (e->f)
+                               for (node *n = ((list*)e->f)->h ; n ; n = 
n->next)
+                                       n->data = exp_change_column_table(sql, 
(sql_exp*) n->data, oldt, newt);
+               } break;
                case e_aggr:
                case e_func: {
                        if (e->l)
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
@@ -1663,7 +1663,11 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
                        sql_rel *rel = e->l;
                        return rel_deps(sql, rel, refs, l);
                }
+               break;
        case e_atom:
+               if (e->f && exp_deps(sql, e->f, refs, l) != 0)
+                       return -1;
+               break;
        case e_column:
                break;
        case e_convert:
@@ -2296,6 +2300,9 @@ rel_rebind_exp(mvc *sql, sql_rel *rel, s
        case e_column:
                return rel_find_exp(rel, e) != NULL;
        case e_atom:
+               if (e->f)
+                       return exps_rebind_exp(sql, rel, e->f);
+               return true;
        case e_psm:
                return true;
        }
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
@@ -237,6 +237,8 @@ exp_only_freevar(sql_query *query, sql_e
                        rel_only_freevar(query, e->l, arguments_correlated, 
found_one_freevar, ungrouped_cols);
                break;
        case e_atom:
+               if (e->f)
+                       exps_only_freevar(query, e->f, arguments_correlated, 
found_one_freevar, ungrouped_cols);
                break;
        case e_column:
                *arguments_correlated = 0;
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -188,8 +188,11 @@ exp_find_table_columns(mvc *sql, sql_exp
                case e_convert: {
                        exp_find_table_columns(sql, e->l, t, cols);
                } break;
-               case e_atom:
-                       break;
+               case e_atom: {
+                       if (e->f)
+                               for (node *n = ((list*)e->f)->h ; n ; n = 
n->next)
+                                       exp_find_table_columns(sql, (sql_exp*) 
n->data, t, cols);
+               } break;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to