Changeset: a870466b5aa0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a870466b5aa0
Modified Files:
        sql/server/rel_optimizer.c
Branch: Jul2021
Log Message:

Look for outer joins, mark joins and global aggregates while finding empty 
relations


diffs (36 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
@@ -5272,11 +5272,12 @@ rel_push_join_down_outer(visitor *v, sql
 static int
 rel_is_empty( sql_rel *rel )
 {
-       if ((is_join(rel->op) || is_semi(rel->op)) && !list_empty(rel->exps)) {
+       if ((is_innerjoin(rel->op) || is_left(rel->op) || is_right(rel->op) || 
is_semi(rel->op)) && !list_empty(rel->exps)) {
                sql_rel *l = rel->l, *r = rel->r;
                sql_exp *je;
 
-               if (rel_is_empty(l) || rel_is_empty(r))
+               if (((is_innerjoin(rel->op) || is_left(rel->op) || 
is_semi(rel->op)) && rel_is_empty(l)) ||
+                       ((is_innerjoin(rel->op) || is_right(rel->op)) && 
rel_is_empty(r)))
                        return 1;
                /* check */
                if ((je = rel_is_join_on_pkey(rel, true))) {
@@ -5287,12 +5288,13 @@ rel_is_empty( sql_rel *rel )
                }
                return 0;
        }
-       if (is_simple_project(rel->op) || is_groupby(rel->op) || 
is_select(rel->op) ||
-               is_topn(rel->op) || is_sample(rel->op)) {
+       /* global aggregates always return 1 row */
+       if (is_simple_project(rel->op) || (is_groupby(rel->op) && 
!list_empty(rel->r)) || is_select(rel->op) ||
+               is_topn(rel->op) || is_sample(rel->op) || is_inter(rel->op) || 
is_except(rel->op)) {
                if (rel->l)
                        return rel_is_empty(rel->l);
-       } else if (is_join(rel->op) || is_semi(rel->op) || is_inter(rel->op) || 
is_except(rel->op)) {
-               return rel_is_empty(rel->l) && rel_is_empty(rel->r);
+       } else if (is_innerjoin(rel->op) && list_empty(rel->exps)) { /* 
cartesian product */
+               return rel_is_empty(rel->l) || rel_is_empty(rel->r);
        }
        return 0;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to