Changeset: fcf36ca9522e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fcf36ca9522e
Modified Files:
        sql/server/rel_statistics.c
Branch: properties
Log Message:

If the right side of an intersection is empty, the result is empty. Also 
attempt to propagate counts at joins if one of the sides is unknown


diffs (86 lines):

diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -709,8 +709,10 @@ rel_get_statistics_(visitor *v, sql_rel 
                                        set_count_prop(v->sql->sa, rel, 0);
                        } else if (can_be_pruned && lv == 0 && 
!rel_is_ref(rel)) { /* left side empty */
                                rel = set_setop_side(v, rel, r);
+                               empty_cross = false; /* don't rewrite again */
                        } else if (can_be_pruned && rv == 0 && 
!rel_is_ref(rel)) { /* right side empty */
                                rel = set_setop_side(v, rel, l);
+                               empty_cross = false; /* don't rewrite again */
                        } else if (lv != BUN_NONE && rv != BUN_NONE) {
                                set_count_prop(v->sql->sa, rel, (rv > (BUN_MAX 
- lv)) ? BUN_MAX : (lv + rv)); /* overflow check */
                        } 
@@ -723,8 +725,18 @@ rel_get_statistics_(visitor *v, sql_rel 
                                        empty_cross = true;
                                else
                                        set_count_prop(v->sql->sa, rel, 0);
-                       } else if (can_be_pruned && !empty_cross && rv == 0 && 
!rel_is_ref(rel)) { /* right side empty */
-                               rel = set_setop_side(v, rel, l);
+                       } else if (rv == 0) { /* right side empty */
+                               if (is_inter(rel->op)) {
+                                       if (can_be_pruned)
+                                               empty_cross = true;
+                                       else
+                                               set_count_prop(v->sql->sa, rel, 
0);
+                               } else if (can_be_pruned && !rel_is_ref(rel)) {
+                                       rel = set_setop_side(v, rel, l);
+                                       empty_cross = false; /* don't rewrite 
again */
+                               } else {
+                                       set_count_prop(v->sql->sa, rel, lv);
+                               }
                        } else {
                                set_count_prop(v->sql->sa, rel, lv);
                        }
@@ -741,7 +753,7 @@ rel_get_statistics_(visitor *v, sql_rel 
                        }
                        list_hash_clear(rel->exps);
                        sql_rel *l = rel_project(v->sql->sa, NULL, rel->exps);
-                       set_count_prop(v->sql->sa, l, 0);
+                       set_count_prop(v->sql->sa, l, 1);
                        l = rel_select(v->sql->sa, l, exp_atom_bool(v->sql->sa, 
0));
                        set_count_prop(v->sql->sa, l, 0);
                        rel->op = op_project;
@@ -809,25 +821,23 @@ rel_get_statistics_(visitor *v, sql_rel 
                                set_count_prop(v->sql->sa, rel, 
join_idx_estimate);
                        } else if (uniques_estimate != BUN_MAX) {
                                set_count_prop(v->sql->sa, rel, 
uniques_estimate);
+                       } else if (list_length(rel->exps) == 1 && 
(exp_is_false(rel->exps->h->data) || exp_is_null(rel->exps->h->data))) {
+                               /* corner cases for outer joins */
+                               if (is_left(rel->op)) {
+                                       set_count_prop(v->sql->sa, rel, lv);
+                               } else if (is_right(rel->op)) {
+                                       set_count_prop(v->sql->sa, rel, rv);
+                               } else if (is_full(rel->op) && lv != BUN_NONE 
&& rv != BUN_NONE) {
+                                       set_count_prop(v->sql->sa, rel, (rv > 
(BUN_MAX - lv)) ? BUN_MAX : (lv + rv)); /* overflow check */
+                               } else if (lv != BUN_NONE && rv != BUN_NONE) {
+                                       set_count_prop(v->sql->sa, rel, 0);
+                               }
+                       } else if (lv == 0) {
+                               set_count_prop(v->sql->sa, rel, 
(is_right(rel->op) || is_full(rel->op)) ? rv : 0);
+                       } else if (rv == 0) {
+                               set_count_prop(v->sql->sa, rel, 
(is_left(rel->op) || is_full(rel->op)) ? lv : 0);
                        } else if (lv != BUN_NONE && rv != BUN_NONE) {
-                               if (list_length(rel->exps) == 1 && 
(exp_is_false(rel->exps->h->data) || exp_is_null(rel->exps->h->data))) {
-                                       /* corner cases for outer joins */
-                                       if (is_left(rel->op)) {
-                                               set_count_prop(v->sql->sa, rel, 
lv);
-                                       } else if (is_right(rel->op)) {
-                                               set_count_prop(v->sql->sa, rel, 
rv);
-                                       } else if (is_full(rel->op)) {
-                                               set_count_prop(v->sql->sa, rel, 
(rv > (BUN_MAX - lv)) ? BUN_MAX : (lv + rv)); /* overflow check */
-                                       } else {
-                                               set_count_prop(v->sql->sa, rel, 
0);
-                                       }
-                               } else if (lv == 0) {
-                                       set_count_prop(v->sql->sa, rel, 
(is_right(rel->op) || is_full(rel->op)) ? rv : 0);
-                               } else if (rv == 0) {
-                                       set_count_prop(v->sql->sa, rel, 
(is_left(rel->op) || is_full(rel->op)) ? lv : 0);
-                               } else {
-                                       set_count_prop(v->sql->sa, rel, (rv > 
(BUN_MAX / lv)) ? BUN_MAX : (lv * rv)); /* overflow check */
-                               }
+                               set_count_prop(v->sql->sa, rel, (rv > (BUN_MAX 
/ lv)) ? BUN_MAX : (lv * rv)); /* overflow check */
                        }
                } break;
                case op_anti: {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to