Changeset: 8650dce52dd8 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8650dce52dd8
Modified Files:
        sql/server/rel_exp.c
        sql/server/rel_exp.h
Branch: Oct2012
Log Message:

fixed bug 3209, ie first crossproduct if the join expression consists
of functions (these should have been pushed down, whenever possible).


diffs (59 lines):

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
@@ -1032,6 +1032,44 @@ exp_is_atom( sql_exp *e )
 }
 
 static int
+exps_has_func( list *exps)
+{
+       node *n;
+       int has_func = 0;
+
+       for(n=exps->h; n && !has_func; n=n->next) 
+               has_func |= exp_has_func(n->data);
+       return has_func;
+}
+
+int
+exp_has_func( sql_exp *e )
+{
+       switch (e->type) {
+       case e_atom:
+               return 0;
+       case e_convert:
+               return exp_has_func(e->l);
+       case e_func:
+       case e_aggr:
+               return 1;
+       case e_cmp:
+               if (e->flag == cmp_or) {
+                       return (exps_has_func(e->l) || exps_has_func(e->r));
+               } else if (e->flag == cmp_in || e->flag == cmp_notin || e->flag 
== cmp_filter) {
+                       return (exp_has_func(e->l) || exps_has_func(e->r));
+               } else {
+                       return (exp_has_func(e->l) || exp_has_func(e->r) || 
+                                       (e->f && exp_has_func(e->f)));
+               }
+       case e_column:
+       case e_psm:
+               return 0;
+       }
+       return 0;
+}
+
+static int
 exp_key( sql_exp *e )
 {
        if (e->name)
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
@@ -105,6 +105,7 @@ extern int exp_is_eqjoin(sql_exp *e);
 extern int exp_is_correlation(sql_exp *e, sql_rel *r );
 extern int exp_is_join_exp(sql_exp *e);
 extern int exp_is_atom(sql_exp *e);
+extern int exp_has_func(sql_exp *e);
 
 extern sql_exp *exps_bind_column( list *exps, char *cname, int *ambiguous);
 extern sql_exp *exps_bind_column2( list *exps, char *rname, char *cname);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to