Changeset: 2f8a0dbdab75 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2f8a0dbdab75
Modified Files:
sql/server/rel_optimizer.c
sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
Branch: Jul2021
Log Message:
Don't pushdown selections on single relations
diffs (110 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
@@ -4634,13 +4634,13 @@ rel_push_select_down(visitor *v, sql_rel
exps = rel->exps;
/* push select through join */
- if (is_select(rel->op) && r && is_join(r->op) && !(rel_is_ref(r))) {
+ if (is_select(rel->op) && r && is_join(r->op) && !rel_is_ref(r) &&
!is_single(r)){
sql_rel *jl = r->l;
sql_rel *jr = r->r;
int left = r->op == op_join || r->op == op_left;
int right = r->op == op_join || r->op == op_right;
- if (r->op == op_full || is_single(r))
+ if (r->op == op_full)
return rel;
/* introduce selects under the join (if needed) */
@@ -4668,7 +4668,7 @@ rel_push_select_down(visitor *v, sql_rel
}
/* merge select and cross product ? */
- if (is_select(rel->op) && r && r->op == op_join && !(rel_is_ref(r))) {
+ if (is_select(rel->op) && r && r->op == op_join && !rel_is_ref(r) &&
!is_single(r)){
for (n = exps->h; n;) {
node *next = n->next;
sql_exp *e = n->data;
@@ -4684,7 +4684,7 @@ rel_push_select_down(visitor *v, sql_rel
}
}
- if (is_select(rel->op) && r && r->op == op_project && !(rel_is_ref(r))){
+ if (is_select(rel->op) && r && r->op == op_project && !rel_is_ref(r) &&
!is_single(r)){
sql_rel *pl = r->l;
/* we cannot push through rank (row_number etc) functions or
projects with distinct */
if (pl && !project_unsafe(r, 1, 1)) {
@@ -4712,12 +4712,12 @@ rel_push_select_down(visitor *v, sql_rel
}
/* try push select under set relation */
- if (is_select(rel->op) && r && !(rel_is_ref(r)) && !list_empty(exps)) {
+ if (is_select(rel->op) && r && !rel_is_ref(r) && !is_single(r) &&
!list_empty(exps)) {
sql_rel *u = r, *ou = u;
sql_rel *ul = u->l;
sql_rel *ur = u->r;
- if (!rel_is_ref(u) && u->op == op_project)
+ if (!rel_is_ref(u) && !is_single(u) && u->op == op_project)
u = u->l;
if (u && is_set(u->op) && !is_single(u) && !list_empty(u->exps)
&& !rel_is_ref(u)) {
diff --git a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
--- a/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
+++ b/sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
@@ -140,29 +140,31 @@ single left outer join (
| ) [ "b3"."id" NOT NULL HASHCOL , "b3"."increase" NOT NULL, "b3"."%TID%" NOT
NULL, "%1"."%1", "%2"."%2" NOT NULL, "o"."open_auction_id" NOT NULL as
"%5"."%5" ]
) [ "o"."open_auction_id" NOT NULL * = "%5"."%5" NOT NULL ]
project (
-| single select (
-| | single join (
-| | | & REF 2 ,
-| | | project (
-| | | | select (
-| | | | | project (
-| | | | | | crossproduct (
-| | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b2"."id", "bidder"."increase" NOT NULL as "b2"."increase" ] COUNT ,
-| | | | | | | group by (
-| | | | | | | | join (
-| | | | | | | | | single group by (
-| | | | | | | | | | single project (
-| | | | | | | | | | | & REF 2
-| | | | | | | | | | ) [ "o"."open_auction_id" NOT NULL ]
-| | | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "o"."open_auction_id"
NOT NULL ],
-| | | | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b2a"."id", "bidder"."open_auction_id" NOT NULL as "b2a"."open_auction_id" ]
COUNT
-| | | | | | | | ) [ "b2a"."open_auction_id" NOT NULL = "o"."open_auction_id"
NOT NULL ]
-| | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "sys"."max" no nil
("b2a"."id" NOT NULL HASHCOL ) as "%3"."%3", "o"."open_auction_id" NOT NULL ]
-| | | | | | ) [ ]
-| | | | | ) [ "o"."open_auction_id" NOT NULL, "b2"."id" NOT NULL HASHCOL ,
"%3"."%3", "b2"."increase" NOT NULL as "%4"."%4" ]
-| | | | ) [ "b2"."id" NOT NULL HASHCOL = "%3"."%3" ]
-| | | ) [ "%4"."%4" NOT NULL, "o"."open_auction_id" NOT NULL as "%6"."%6" ]
-| | ) [ "o"."open_auction_id" NOT NULL * = "%6"."%6" NOT NULL ]
+| select (
+| | single project (
+| | | single left outer join (
+| | | | & REF 2 ,
+| | | | project (
+| | | | | select (
+| | | | | | project (
+| | | | | | | crossproduct (
+| | | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b2"."id", "bidder"."increase" NOT NULL as "b2"."increase" ] COUNT ,
+| | | | | | | | group by (
+| | | | | | | | | join (
+| | | | | | | | | | single group by (
+| | | | | | | | | | | single project (
+| | | | | | | | | | | | & REF 2
+| | | | | | | | | | | ) [ "o"."open_auction_id" NOT NULL ]
+| | | | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [
"o"."open_auction_id" NOT NULL ],
+| | | | | | | | | | table("sys"."bidder") [ "bidder"."id" NOT NULL HASHCOL as
"b2a"."id", "bidder"."open_auction_id" NOT NULL as "b2a"."open_auction_id" ]
COUNT
+| | | | | | | | | ) [ "b2a"."open_auction_id" NOT NULL = "o"."open_auction_id"
NOT NULL ]
+| | | | | | | | ) [ "o"."open_auction_id" NOT NULL ] [ "sys"."max" no nil
("b2a"."id" NOT NULL HASHCOL ) as "%3"."%3", "o"."open_auction_id" NOT NULL ]
+| | | | | | | ) [ ]
+| | | | | | ) [ "o"."open_auction_id" NOT NULL, "b2"."id" NOT NULL HASHCOL ,
"%3"."%3", "b2"."increase" NOT NULL as "%4"."%4" ]
+| | | | | ) [ "b2"."id" NOT NULL HASHCOL = "%3"."%3" ]
+| | | | ) [ "%4"."%4" NOT NULL, "o"."open_auction_id" NOT NULL as "%6"."%6" ]
+| | | ) [ "o"."open_auction_id" NOT NULL * = "%6"."%6" NOT NULL ]
+| | ) [ "b"."id" NOT NULL HASHCOL , "b"."open_auction_id" NOT NULL, "b"."date"
NOT NULL, "b"."time" NOT NULL, "b"."personref" NOT NULL, "b"."increase" NOT
NULL, "%2"."%2", "%4"."%4" ]
| ) [ "sys"."<="("sys"."sql_mul"("%2"."%2", double "2"), "%4"."%4") = boolean
"true" ]
) [ "b"."id" NOT NULL HASHCOL , "b"."open_auction_id" NOT NULL, "b"."date" NOT
NULL, "b"."time" NOT NULL, "b"."personref" NOT NULL, "b"."increase" NOT NULL ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list