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