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

If the grouping relation has more than one reference, then the semijoin cannot 
be pushed down. This fixes sqlancer infinite optimization loop


diffs (66 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
@@ -4723,26 +4723,21 @@ rel_push_select_down_join(visitor *v, sq
  * ->
  * {semi}join( A, groupby( semijoin(B,A) [gbe == A.x] ) [gbe][aggrs] ) [ gbe 
== A.x ]
  */
-
 static inline sql_rel *
 rel_push_join_down(visitor *v, sql_rel *rel)
 {
-       list *exps = NULL;
-
        if (!rel_is_ref(rel) && ((is_left(rel->op) || rel->op == op_join || 
is_semi(rel->op)) && rel->l && rel->exps)) {
                sql_rel *gb = rel->r, *ogb = gb, *l = NULL, *rell = rel->l;
 
-               if (gb->op == op_project)
+               if (is_simple_project(gb->op) && !rel_is_ref(gb))
                        gb = gb->l;
 
-               if (rel_is_ref(rell))
+               if (rel_is_ref(rell) || !gb || rel_is_ref(gb))
                        return rel;
 
-               exps = rel->exps;
-               if (gb && gb->op == op_groupby && gb->r && list_length(gb->r)) {
-                       list *jes = new_exp_list(v->sql->sa);
+               if (is_groupby(gb->op) && gb->r && list_length(gb->r)) {
+                       list *exps = rel->exps, *jes = 
new_exp_list(v->sql->sa), *gbes = gb->r;
                        node *n, *m;
-                       list *gbes = gb->r;
                        /* find out if all group by expressions are used in the 
join */
                        for(n = gbes->h; n; n = n->next) {
                                sql_exp *gbe = n->data;
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
@@ -327,7 +327,7 @@ statement ok
 INSERT INTO t0(c3) VALUES ((VALUES (3)) = ANY(SELECT 2 FROM t0 WHERE t0.c3))
 
 statement ok
-INSERT INTO t0(c3) VALUES(TRUE), ((VALUES (-409412573)) = ANY(SELECT ALL 
(VALUES (0.87714195), (NULL)) FROM t0 AS l1t0 WHERE l1t0.c3));
+INSERT INTO t0(c3) VALUES(TRUE), ((VALUES (-409412573)) = ANY(SELECT ALL 
(VALUES (0.87714195), (NULL)) FROM t0 AS l1t0 WHERE l1t0.c3))
 
 statement ok
 ROLLBACK
@@ -419,6 +419,19 @@ statement ok
 START TRANSACTION
 
 statement ok
+CREATE TABLE "t1" ("c2" DECIMAL(18,3) NOT NULL)
+
+query T rowsort
+SELECT t1.c2 FROM t1 LEFT OUTER JOIN (SELECT 3 = ANY((SELECT 1) INTERSECT 
(SELECT 2))) AS sub0 ON (VALUES (FALSE))
+----
+
+statement ok
+ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
 CREATE TABLE "t0" ("c0" VARCHAR(32))
 
 statement ok
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to