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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list