Changeset: 0ef3d9bdad0c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0ef3d9bdad0c
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2015/Tests/large_join.Bug-3809.sql
Branch: Jul2015
Log Message:

fix bug 3819, ie properly reorder joins (first cleanup the introduced
empty selects)


diffs (181 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
@@ -993,7 +993,7 @@ reorder_join(mvc *sql, sql_rel *rel)
 }
 
 static list *
-push_up_join_exps( sql_rel *rel) 
+push_up_join_exps( mvc *sql, sql_rel *rel) 
 {
        if (rel_is_ref(rel))
                return NULL;
@@ -1005,12 +1005,13 @@ push_up_join_exps( sql_rel *rel)
                list *l, *r;
 
                if (rel_is_ref(rl) && rel_is_ref(rr)) {
+                       assert(0);
                        l = rel->exps;
                        rel->exps = NULL;
                        return l;
                }
-               l = push_up_join_exps(rl);
-               r = push_up_join_exps(rr);
+               l = push_up_join_exps(sql, rl);
+               r = push_up_join_exps(sql, rr);
                if (l && r) {
                        l = list_merge(l, r, (fdup)NULL);
                        r = NULL;
@@ -1036,11 +1037,11 @@ rel_join_order(int *changes, mvc *sql, s
        int e_changes = 0;
 
        if (is_join(rel->op) && rel->exps && !rel_is_ref(rel)) {
+               rel = rewrite(sql, rel, &rel_remove_empty_select, &e_changes); 
                if (rel->op == op_join)
-                       rel->exps = push_up_join_exps(rel);
+                       rel->exps = push_up_join_exps(sql, rel);
                rel = reorder_join(sql, rel);
        }
-       rel = rewrite(sql, rel, &rel_remove_empty_select, &e_changes); 
        (void)*changes;
        (void)e_changes;
        return rel;
diff --git a/sql/test/BugTracker-2015/Tests/large_join.Bug-3809.sql 
b/sql/test/BugTracker-2015/Tests/large_join.Bug-3809.sql
--- a/sql/test/BugTracker-2015/Tests/large_join.Bug-3809.sql
+++ b/sql/test/BugTracker-2015/Tests/large_join.Bug-3809.sql
@@ -787,6 +787,33 @@ SELECT x20,x47,x38,x18,x10,x22,x37,x3,x6
    AND a8=b20
    AND a47=b37;
 
+SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
+  FROM 
t2,t9,t20,t63,t54,t32,t22,t52,t25,t47,t29,t12,t18,t10,t21,t43,t37,t61,t55,t3,t38,t50,t30,t8
+ WHERE b3=a18
+   AND a25=b38
+   AND a54=b8
+   AND a61=b47
+   AND a43=b29
+   AND b18=a12
+   AND b32=a30
+   AND a22=b43
+   AND a29=b21
+   AND a10=b25
+   AND a12=4
+   AND b22=a32
+   AND a20=b55
+   AND b30=a9
+   AND a2=b61
+   AND a38=b52
+   AND a55=b9
+   AND a21=b50
+   AND a37=b54
+   AND b10=a3
+   AND a52=b2
+   AND a50=b63
+   AND a8=b20
+   AND a47=b37;
+
 -- variant of first query but moving t61 as the first table in the FROM clause
 plan
 SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
@@ -816,6 +843,33 @@ SELECT x20,x47,x38,x18,x10,x22,x37,x3,x6
    AND a8=b20
    AND a47=b37;
 
+SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
+  FROM 
t61,t9,t20,t63,t54,t32,t22,t52,t25,t47,t29,t12,t18,t10,t21,t43,t37,t2,t55,t3,t38,t50,t30,t8
+ WHERE b3=a18
+   AND a25=b38
+   AND a54=b8
+   AND a61=b47
+   AND a43=b29
+   AND b18=a12
+   AND b32=a30
+   AND a22=b43
+   AND a29=b21
+   AND a10=b25
+   AND a12=4
+   AND b22=a32
+   AND a20=b55
+   AND b30=a9
+   AND a2=b61
+   AND a38=b52
+   AND a55=b9
+   AND a21=b50
+   AND a37=b54
+   AND b10=a3
+   AND a52=b2
+   AND a50=b63
+   AND a8=b20
+   AND a47=b37;
+
 -- variant of first query but with sorted (ascending) list of table names in 
the FROM clause
 plan
 SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
@@ -845,6 +899,33 @@ SELECT x20,x47,x38,x18,x10,x22,x37,x3,x6
    AND a8=b20
    AND a47=b37;
 
+SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
+  FROM 
t2,t3,t8,t9,t10,t12,t18,t20,t21,t22,t25,t29,t30,t32,t37,t38,t43,t47,t50,t52,t54,t55,t61,t63
+ WHERE b3=a18
+   AND a25=b38
+   AND a54=b8
+   AND a61=b47
+   AND a43=b29
+   AND b18=a12
+   AND b32=a30
+   AND a22=b43
+   AND a29=b21
+   AND a10=b25
+   AND a12=4
+   AND b22=a32
+   AND a20=b55
+   AND b30=a9
+   AND a2=b61
+   AND a38=b52
+   AND a55=b9
+   AND a21=b50
+   AND a37=b54
+   AND b10=a3
+   AND a52=b2
+   AND a50=b63
+   AND a8=b20
+   AND a47=b37;
+
 -- variant of first query but with sorted (decending) list of table names in 
the FROM clause
 plan
 SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
@@ -874,6 +955,33 @@ SELECT x20,x47,x38,x18,x10,x22,x37,x3,x6
    AND a8=b20
    AND a47=b37;
 
+SELECT 
x20,x47,x38,x18,x10,x22,x37,x3,x63,x8,x30,x43,x54,x9,x21,x25,x2,x61,x55,x32,x52,x29,x50,x12
+  FROM 
t63,t61,t55,t54,t52,t50,t47,t43,t38,t37,t32,t30,t29,t25,t22,t21,t20,t18,t12,t10,t9,t8,t3,t2
+ WHERE b3=a18
+   AND a25=b38
+   AND a54=b8
+   AND a61=b47
+   AND a43=b29
+   AND b18=a12
+   AND b32=a30
+   AND a22=b43
+   AND a29=b21
+   AND a10=b25
+   AND a12=4
+   AND b22=a32
+   AND a20=b55
+   AND b30=a9
+   AND a2=b61
+   AND a38=b52
+   AND a55=b9
+   AND a21=b50
+   AND a37=b54
+   AND b10=a3
+   AND a52=b2
+   AND a50=b63
+   AND a8=b20
+   AND a47=b37;
+
 
 -- cleanup created tables
 DROP TABLE t1;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to