Changeset: 2f659fd4dff9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2f659fd4dff9
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
Branch: Feb2013
Log Message:

fix for bug 3209


diffs (77 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
@@ -1552,6 +1552,14 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
                        prop *p;
 
                        /* only handle simple joins here */             
+                       if (exp_has_func(e)) {
+                               if (!join && !list_length(lje)) {
+                                       stmt *l = bin_first_column(sql->sa, 
left);
+                                       stmt *r = bin_first_column(sql->sa, 
right);
+                                       join = stmt_join(sql->sa, l, r, 
cmp_all); 
+                               }
+                               break;
+                       }
                        if (list_length(lje) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
                                break;
 
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
@@ -1034,6 +1034,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 || 
get_cmp(e) == 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
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to