Changeset: b232610d9c87 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b232610d9c87
Modified Files:
        sql/backends/monet5/rel_bin.c
Branch: Dec2016
Log Message:

fixed crash in full outer joins with only range expressions (or-ed together). 
see bug 6256


diffs (43 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
@@ -1707,7 +1707,11 @@ rel2bin_join( mvc *sql, sql_rel *rel, li
                        prop *p;
 
                        /* only handle simple joins here */             
-                       if (exp_has_func(e) && e->flag != cmp_filter) {
+                       if ((exp_has_func(e) && e->flag != cmp_filter) ||
+                           (e->flag == cmp_or && 
+                            exps_card(e->l) == CARD_MULTI &&
+                            exps_card(e->r) == CARD_MULTI) 
+                                       ) {
                                if (!join && !list_length(lje)) {
                                        stmt *l = bin_first_column(sql->sa, 
left);
                                        stmt *r = bin_first_column(sql->sa, 
right);
@@ -1911,6 +1915,12 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
                        /* only handle simple joins here */             
                        if (list_length(lje) && (idx || e->type != e_cmp || 
e->flag != cmp_equal))
                                break;
+                       if ((exp_has_func(e) && e->flag != cmp_filter) ||
+                           (e->flag == cmp_or && 
+                            exps_card(e->l) == CARD_MULTI &&
+                            exps_card(e->r) == CARD_MULTI) ) { 
+                               break;
+                       }
 
                        s = exp_bin(sql, en->data, left, right, NULL, NULL, 
NULL, NULL);
                        if (!s) {
@@ -1934,8 +1944,12 @@ rel2bin_semijoin( mvc *sql, sql_rel *rel
                }
                if (list_length(lje) > 1) {
                        join = releqjoin(sql, lje, rje, 0 /* no hash used */, 
cmp_equal, 0);
+               } else if (!join && list_length(lje) == list_length(rje) && 
list_length(lje)) {
+                       join = stmt_join(sql->sa, lje->h->data, rje->h->data, 
cmp_equal);
                } else if (!join) {
-                       join = stmt_join(sql->sa, lje->h->data, rje->h->data, 
cmp_equal);
+                       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); 
                }
        } else {
                stmt *l = bin_first_column(sql->sa, left);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to