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

Don't push up selections on non-outer sides


diffs (64 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
@@ -4708,10 +4708,10 @@ point_select_on_unique_column(sql_rel *r
 static sql_rel *
 rel_push_select_up(visitor *v, sql_rel *rel)
 {
-       if ((is_join(rel->op) || is_semi(rel->op)) && !rel_is_ref(rel) && 
!is_single(rel)) {
+       if ((is_innerjoin(rel->op) || is_left(rel->op) || is_right(rel->op) || 
is_semi(rel->op)) && !is_single(rel)) {
                sql_rel *l = rel->l, *r = rel->r;
-               bool can_pushup_left = is_select(l->op) && !rel_is_ref(l) && 
!is_single(l),
-                        can_pushup_right = is_select(r->op) && !rel_is_ref(r) 
&& !is_single(r) && !is_semi(rel->op);
+               bool can_pushup_left = is_select(l->op) && !rel_is_ref(l) && 
!is_single(l) && (is_innerjoin(rel->op) || is_left(rel->op) || 
is_semi(rel->op)),
+                        can_pushup_right = is_select(r->op) && !rel_is_ref(r) 
&& !is_single(r) && (is_innerjoin(rel->op) || is_right(rel->op));
 
                if (can_pushup_left || can_pushup_right) {
                        if (can_pushup_left)
diff --git a/sql/test/SQLancer/Tests/sqlancer08.test 
b/sql/test/SQLancer/Tests/sqlancer08.test
--- a/sql/test/SQLancer/Tests/sqlancer08.test
+++ b/sql/test/SQLancer/Tests/sqlancer08.test
@@ -430,3 +430,43 @@ ROLLBACK
 statement error 22003!overflow in conversion of 789092170 to bte.
 SELECT round(- (((-443710828)||(1616633099))), 789092170)
 
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE "rt0" ("c0" BOOLEAN,"c1" BOOLEAN NOT NULL, CONSTRAINT 
"rt0_c1_pkey" PRIMARY KEY ("c1"))
+
+statement ok rowcount 2
+INSERT INTO "rt0" VALUES (NULL, false), (false, true)
+
+query I nosort
+SELECT rt0.c1 FROM rt0 FULL OUTER JOIN (VALUES (1)) x(x) ON TRUE AND 'a' = 'b' 
WHERE rt0.c1
+----
+1
+
+query I nosort
+SELECT rt0.c1 FROM rt0 RIGHT OUTER JOIN (VALUES (1)) x(x) ON TRUE AND 'a' = 
'b' WHERE rt0.c1
+----
+
+query I nosort
+SELECT rt0.c1 FROM rt0 LEFT OUTER JOIN (VALUES (1)) x(x) ON TRUE AND 'a' = 'b' 
WHERE rt0.c1
+----
+1
+
+query I nosort
+SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST(rt0.c1 AS INT) as count 
FROM rt0 FULL OUTER JOIN (VALUES (1)) AS nort0(norc0) ON TRUE AND 'a' = 'b') as 
res
+----
+1
+
+query I nosort
+SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST(rt0.c1 AS INT) as count 
FROM rt0 RIGHT OUTER JOIN (VALUES (1)) AS nort0(norc0) ON TRUE AND 'a' = 'b') 
as res
+----
+NULL
+
+query I nosort
+SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT CAST(rt0.c1 AS INT) as count 
FROM rt0 LEFT OUTER JOIN (VALUES (1)) AS nort0(norc0) ON TRUE AND 'a' = 'b') as 
res
+----
+1
+
+statement ok
+ROLLBACK
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to