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