Changeset: 6efe8d002e59 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/6efe8d002e59
Modified Files:
sql/server/rel_optimizer.c
sql/test/miscellaneous/Tests/simple_plans.test
Branch: Jul2021
Log Message:
Attempt to pushdown complex joinable expression in the join order optimizer
diffs (90 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
@@ -1013,9 +1013,8 @@ order_joins(visitor *v, list *rels, list
}
}
if (list_length(exps)) { /* more expressions (add selects) */
- node *n;
top = rel_select(v->sql->sa, top, NULL);
- for(n=exps->h; n; n = n->next) {
+ for(node *n=exps->h; n; n = n->next) {
sql_exp *e = n->data;
/* find the involved relations */
@@ -1030,8 +1029,32 @@ order_joins(visitor *v, list *rels, list
*/
if (exp_is_join_exp(e) == 0) {
sql_rel *nr = NULL;
- if (e->flag == cmp_equal)
- nr = rel_push_join(v->sql, top->l,
e->l, e->r, NULL, e, 0);
+ if (is_theta_exp(e->flag)) {
+ nr = rel_push_join(v->sql, top->l,
e->l, e->r, e->f, e, 0);
+ } else if (e->flag == cmp_filter || e->flag ==
cmp_or) {
+ sql_exp *l = NULL, *r = NULL;
+ int skip = 0;
+
+ /* Attempt to push down a filter
expression if possible */
+ for (node *m = ((list*)e->l)->h ; m &&
!skip ; m = m->next) {
+ sql_exp *nl = m->data;
+
+ if (nl->card > CARD_ATOM) {
+ skip |= l != NULL;
+ l = nl;
+ }
+ }
+ for (node *m = ((list*)e->r)->h ; m &&
!skip ; m = m->next) {
+ sql_exp *nr = m->data;
+
+ if (nr->card > CARD_ATOM) {
+ skip |= r != NULL;
+ r = nr;
+ }
+ }
+ if (l && r && !skip)
+ nr = rel_push_join(v->sql,
top->l, l, r, NULL, e, 0);
+ }
if (!nr)
rel_join_add_exp(v->sql->sa, top->l, e);
} else
diff --git a/sql/test/miscellaneous/Tests/simple_plans.test
b/sql/test/miscellaneous/Tests/simple_plans.test
--- a/sql/test/miscellaneous/Tests/simple_plans.test
+++ b/sql/test/miscellaneous/Tests/simple_plans.test
@@ -481,6 +481,37 @@ project (
) [ "%1"."%1" NOT NULL ]
statement ok
+create table t1 (a int, b string)
+
+statement ok rowcount 4
+insert into t1 values (1,'a'), (2, 'b'), (3, 'c'), (4, 'd')
+
+statement ok
+create table t2 (a int)
+
+statement ok rowcount 4
+insert into t2 values (1),(2),(3),(4)
+
+statement ok
+create table t3 (b string)
+
+statement ok rowcount 4
+insert into t3 values ('a'),('b'),('c'),('d')
+
+query T nosort
+plan select t1.a, t1.b from t1 inner join t2 on t1.a = t2.a inner join t3 on
t1.b like t3.b
+----
+project (
+| join (
+| | join (
+| | | table("sys"."t1") [ "t1"."a", "t1"."b" ] COUNT ,
+| | | table("sys"."t2") [ "t2"."a" ] COUNT
+| | ) [ "t1"."a" = "t2"."a" ],
+| | table("sys"."t3") [ "t3"."b" ] COUNT
+| ) [ ("t1"."b") FILTER "like" ("t3"."b", clob "", boolean "false") ]
+) [ "t1"."a", "t1"."b" ]
+
+statement ok
rollback
statement ok
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list