Changeset: e44ee2f00d1c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e44ee2f00d1c
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/SQLancer/Tests/sqlancer14.test
Branch: default
Log Message:

Making find_candidate_join2semi more restrictive. If all join expressions can 
be pushed down, then it cannot be rewritten into a semijoin


diffs (112 lines):

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
@@ -5428,24 +5428,36 @@ find_projection_for_join2semi(sql_rel *r
        return false;
 }
 
-
 static sql_rel *
 find_candidate_join2semi(sql_rel *rel, bool *swap)
 {
        /* generalize possibility : we need the visitor 'step' here */
        if (rel_is_ref(rel)) /* if the join has multiple references, it's 
dangerous to convert it into a semijoin */
                return NULL;
-       if (rel->op == op_join && rel->exps) {
+       if (rel->op == op_join && !list_empty(rel->exps)) {
                sql_rel *l = rel->l, *r = rel->r;
+               bool ok = false;
 
                if (find_projection_for_join2semi(r)) {
                        *swap = false;
+                       ok = true;
+               } else if (find_projection_for_join2semi(l)) {
+                       *swap = true;
+                       ok = true;
+               }
+
+               if (ok) {
+                       ok = false;
+                       /* if all join expressions can be pushed down, then it 
cannot be rewritten into a semijoin */
+                       for (node *n=rel->exps->h; n && !ok; n = n->next) {
+                               sql_exp *e = n->data;
+
+                               ok |= !rel_has_cmp_exp(l, e) && 
!rel_has_cmp_exp(r, e);
+                       }
+               }
+
+               if (ok)
                        return rel;
-               }
-               if (find_projection_for_join2semi(l)) {
-                       *swap = true;
-                       return rel;
-               }
        }
        if (is_join(rel->op) || is_semi(rel->op)) {
                sql_rel *c;
diff --git a/sql/test/SQLancer/Tests/sqlancer14.test 
b/sql/test/SQLancer/Tests/sqlancer14.test
--- a/sql/test/SQLancer/Tests/sqlancer14.test
+++ b/sql/test/SQLancer/Tests/sqlancer14.test
@@ -136,6 +136,30 @@ COPY 6 RECORDS INTO "sys"."t2" FROM stdi
 query T rowsort
 SELECT t1.c5 FROM t2, t1 CROSS JOIN (SELECT DISTINCT t0.c0 FROM t0) AS sub0 
WHERE CASE 2 WHEN 3 THEN t2.c3 > t1.c2 ELSE TRUE END
 ----
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
+*zd @+~U[
 2b1fb0c3-bfa0-863f-9afc-5adfbe2c007e
 2b1fb0c3-bfa0-863f-9afc-5adfbe2c007e
 2b1fb0c3-bfa0-863f-9afc-5adfbe2c007e
@@ -184,30 +208,6 @@ 3dcfce29-ebb2-de1f-c3b9-c2830bdffaa6
 3dcfce29-ebb2-de1f-c3b9-c2830bdffaa6
 3dcfce29-ebb2-de1f-c3b9-c2830bdffaa6
 3dcfce29-ebb2-de1f-c3b9-c2830bdffaa6
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
-*zd \n+~U[
 
 query T rowsort
 SELECT CASE 2 WHEN 3 THEN t2.c3 > t1.c2 ELSE TRUE END FROM t2, t1 CROSS JOIN 
(SELECT DISTINCT t0.c0 FROM t0) AS sub0
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to