Changeset: 913055453096 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=913055453096
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_optimizer.c
        sql/server/rel_unnest.c
        sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.out
Branch: default
Log Message:

Merge with Nov2019 branch.


diffs (136 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
@@ -2231,7 +2231,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
         *      first cheap join(s) (equality or idx) 
         *      second selects/filters 
         */
-       
+
 #if 0
        if (rel->exps && rel->op == op_anti && need_no_nil(rel)) {
                sql_subtype *lng = sql_bind_localtype("lng");
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -5268,7 +5268,7 @@ rel_find_joins(mvc *sql, sql_rel *parent
                case op_full:
                case op_semi:
                case op_anti: {
-                       found_join *fl = MNEW(found_join);
+                       found_join *fl = SA_NEW(sql->sa, found_join);
                        fl->p = parent;
                        fl->j = rel;
                        list_append(l, fl);
@@ -5308,43 +5308,41 @@ rel_find_joins(mvc *sql, sql_rel *parent
 static sql_rel *
 rel_merge_identical_joins(int *changes, mvc *sql, sql_rel *rel) 
 {
-       if (is_joinop(rel->op)) {
+       if (is_joinop(rel->op) && rel->l && rel->r) {
                list *l1 = sa_list(sql->sa), *l2 = sa_list(sql->sa);
 
-               if (rel->l && rel->r) {
-                       rel_find_joins(sql, rel, rel->l, l1);
-                       rel_find_joins(sql, rel, rel->r, l2);
-
-                       if (list_length(l1) && list_length(l2)) { /* found 
joins on both */
-                               for (node *n1 = l1->h ; n1; n1 = n1->next) {
-                                       found_join *f1 = (found_join*) n1->data;
-                                       for (node *n2 = l2->h ; n2; n2 = 
n2->next) {
-                                               found_join *f2 = (found_join*) 
n2->data;
-                                               sql_rel *j1 = f1->j, *j2 = 
f2->j, *j1_l = j1->l, *j1_r = j1->r, *j2_l = j2->l, *j2_r = j2->r;
-                                               bool sides_equal = false;
-
-                                               if (j1 != j2) {
-                                                       const char *j1_ln = 
rel_name(j1_l), *j1_rn = rel_name(j1_r), *j2_ln = rel_name(j2_l), *j2_rn = 
rel_name(j2_r);
-
-                                                       /* So far it looks on 
identical relations and common basetable relations */
-                                                       if ((j1_l == j2_l || 
(is_basetable(j1_l->op) && is_basetable(j2_l->op) && strcmp(j1_ln, j2_ln) == 0 
&& j1_l->l == j2_l->l)) && 
-                                                               (j1_r == j2_r 
|| (is_basetable(j1_r->op) && is_basetable(j2_r->op) && strcmp(j1_rn, j2_rn) == 
0 && j1_r->l == j2_r->l)))
-                                                               sides_equal = 
true;
-                                                       else if ((j1_l == j2_r 
|| (is_basetable(j1_l->op) && is_basetable(j2_r->op) && strcmp(j1_ln, j2_rn) == 
0 && j1_l->l == j2_r->l)) && 
-                                                               (j1_r == j2_l 
|| (is_basetable(j1_r->op) && is_basetable(j2_l->op) && strcmp(j1_rn, j2_ln) == 
0 && j1_r->l == j2_l->l)))
-                                                               sides_equal = 
true;
-
-                                                       /* the left and right 
sides are equal */
-                                                       if (sides_equal && 
exp_match_list(j1->exps, j2->exps)) {
-                                                               sql_rel *p2 = 
f2->p;
-
-                                                               if (p2->l == 
j2) /* replace j2's parent join with j1 */
-                                                                       p2->l = 
rel_dup(j1);
-                                                               else
-                                                                       p2->r = 
rel_dup(j1);
-                                                               (*changes)++;
-                                                               return rel;
-                                                       }
+               rel_find_joins(sql, rel, rel->l, l1);
+               rel_find_joins(sql, rel, rel->r, l2);
+
+               if (list_length(l1) && list_length(l2)) { /* found joins on 
both */
+                       for (node *n1 = l1->h ; n1; n1 = n1->next) {
+                               found_join *f1 = (found_join*) n1->data;
+                               for (node *n2 = l2->h ; n2; n2 = n2->next) {
+                                       found_join *f2 = (found_join*) n2->data;
+                                       sql_rel *j1 = f1->j, *j2 = f2->j, *j1_l 
= j1->l, *j1_r = j1->r, *j2_l = j2->l, *j2_r = j2->r;
+                                       bool sides_equal = false;
+
+                                       if (j1 != j2) {
+                                               const char *j1_ln = 
rel_name(j1_l), *j1_rn = rel_name(j1_r), *j2_ln = rel_name(j2_l), *j2_rn = 
rel_name(j2_r);
+
+                                               /* So far it looks on identical 
relations and common basetable relations */
+                                               if ((j1_l == j2_l || 
(is_basetable(j1_l->op) && is_basetable(j2_l->op) && strcmp(j1_ln, j2_ln) == 0 
&& j1_l->l == j2_l->l)) && 
+                                                       (j1_r == j2_r || 
(is_basetable(j1_r->op) && is_basetable(j2_r->op) && strcmp(j1_rn, j2_rn) == 0 
&& j1_r->l == j2_r->l)))
+                                                       sides_equal = true;
+                                               else if ((j1_l == j2_r || 
(is_basetable(j1_l->op) && is_basetable(j2_r->op) && strcmp(j1_ln, j2_rn) == 0 
&& j1_l->l == j2_r->l)) && 
+                                                       (j1_r == j2_l || 
(is_basetable(j1_r->op) && is_basetable(j2_l->op) && strcmp(j1_rn, j2_ln) == 0 
&& j1_r->l == j2_l->l)))
+                                                       sides_equal = true;
+
+                                               /* the left and right sides are 
equal */
+                                               if (sides_equal && 
exp_match_list(j1->exps, j2->exps)) {
+                                                       sql_rel *p2 = f2->p;
+
+                                                       if (p2->l == j2) /* 
replace j2's parent join with j1 */
+                                                               p2->l = 
rel_dup(j1);
+                                                       else
+                                                               p2->r = 
rel_dup(j1);
+                                                       (*changes)++;
+                                                       return rel;
                                                }
                                        }
                                }
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -926,7 +926,7 @@ rel_general_unnest(mvc *sql, sql_rel *re
 
                r = rel_crossproduct(sql->sa, D, r, rel->op);
                if (is_semi(rel->op)) /* keep semi/anti only on the outer side 
*/
-                       r->op = op_join;
+                       r->op = op_join;
                move_join_exps(sql, rel, r);
                set_dependent(r);
                r = rel_project(sql->sa, r, 
(is_semi(r->op))?sa_list(sql->sa):rel_projections(sql, r->r, NULL, 1, 1));
@@ -947,7 +947,7 @@ rel_general_unnest(mvc *sql, sql_rel *re
                list_merge(r->exps, fd, (fdup)NULL);
                rel->r = r;
                if (rel->op == op_left) /* only needed once (inner side) */
-                               rel->op = op_join;
+                       rel->op = op_join;
                reset_dependent(rel);
                return rel;
        }
diff --git 
a/sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.out 
b/sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.out
--- a/sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.out
+++ b/sql/test/BugTracker-2017/Tests/complicated_logic.Bug-105.stable.out
@@ -27,8 +27,8 @@ stdout of test 'complicated_logic.Bug-10
 #INSERT INTO test VALUES (0, 1, 2);
 [ 1    ]
 #SELECT COUNT(*) FROM test WHERE (b = 1 OR b = 2) AND (a NOT IN (3, 4) OR b <> 
1) AND a = 1;
-% .L3 # table_name
-% L3 # name
+% sys.L2 # table_name
+% L2 # name
 % bigint # type
 % 1 # length
 [ 1    ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to