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 -- [email protected]
To unsubscribe send an email to [email protected]