Changeset: 3324d622dca9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3324d622dca9
Modified Files:
        sql/server/rel_statistics.c
Branch: properties
Log Message:

Ignore non comparison expressions on joins and selects and limit the types to 
propagate statistics


diffs (242 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
@@ -17,8 +17,7 @@ exps_have_or(list *exps)
 {
        for (node *n = exps->h ; n ; n = n->next) {
                sql_exp *e = n->data;
-               assert(e->type == e_cmp);
-               if (e->flag == cmp_or)
+               if (e->type == e_cmp && e->flag == cmp_or)
                        return true;
        }
        return false;
@@ -57,113 +56,115 @@ rel_propagate_column_ref_statistics(mvc 
                                for (node *n = rel->exps->h ; n && !ne; n = 
n->next) {
                                        sql_exp *comp = n->data;
 
-                                       switch (comp->flag) {
-                                       case cmp_equal: {
-                                               sql_exp *le = comp->l, *re = 
comp->r, *rne = NULL;
+                                       if (comp->type == e_cmp) {
+                                               switch (comp->flag) {
+                                               case cmp_equal: {
+                                                       sql_exp *le = comp->l, 
*re = comp->r, *rne = NULL;
 
-                                               if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e))) {
-                                                       if 
(is_outerjoin(rel->op)) {
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re->p, PROP_MIN)))
-                                                                       
set_property(sql, e, PROP_MIN, lval);
-                                                       } else {
-                                                               if ((lval = 
find_prop_and_get(le->p, PROP_MAX)) && (rval = find_prop_and_get(re->p, 
PROP_MAX)))
-                                                                       
set_min_of_values(sql, e, PROP_MAX, lval, rval); /* for equality reduce */
-                                                               if ((lval = 
find_prop_and_get(le->p, PROP_MIN)) && (rval = find_prop_and_get(re->p, 
PROP_MIN)))
-                                                                       
set_max_of_values(sql, e, PROP_MIN, lval, rval);
-                                                       }
-                                               }
-                                               ne = ne ? ne : rne;
-                                       } break;
-                                       case cmp_notequal: {
-                                               sql_exp *le = comp->l, *re = 
comp->r, *rne = NULL;
-
-                                               if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e))) {
-                                                       if 
(is_outerjoin(rel->op)) {
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re->p, PROP_MIN)))
-                                                                       
set_property(sql, e, PROP_MIN, lval);
-                                                       } else {
-                                                               if ((lval = 
find_prop_and_get(le->p, PROP_MAX)) && (rval = find_prop_and_get(re->p, 
PROP_MAX)))
-                                                                       
set_max_of_values(sql, e, PROP_MAX, lval, rval); /* for inequality expand */
-                                                               if ((lval = 
find_prop_and_get(le->p, PROP_MIN)) && (rval = find_prop_and_get(re->p, 
PROP_MIN)))
-                                                                       
set_min_of_values(sql, e, PROP_MIN, lval, rval);
+                                                       if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e))) {
+                                                               if 
(is_outerjoin(rel->op)) {
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re->p, PROP_MAX)))
+                                                                               
set_property(sql, e, PROP_MAX, lval);
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re->p, PROP_MIN)))
+                                                                               
set_property(sql, e, PROP_MIN, lval);
+                                                               } else {
+                                                                       if 
((lval = find_prop_and_get(le->p, PROP_MAX)) && (rval = 
find_prop_and_get(re->p, PROP_MAX)))
+                                                                               
set_min_of_values(sql, e, PROP_MAX, lval, rval); /* for equality reduce */
+                                                                       if 
((lval = find_prop_and_get(le->p, PROP_MIN)) && (rval = 
find_prop_and_get(re->p, PROP_MIN)))
+                                                                               
set_max_of_values(sql, e, PROP_MIN, lval, rval);
+                                                               }
                                                        }
-                                               }
-                                               ne = ne ? ne : rne;
-                                       } break;
-                                       case cmp_gt:
-                                       case cmp_gte: {
-                                               sql_exp *le = comp->l, *re = 
comp->r, *rne = NULL;
+                                                       ne = ne ? ne : rne;
+                                               } break;
+                                               case cmp_notequal: {
+                                                       sql_exp *le = comp->l, 
*re = comp->r, *rne = NULL;
 
-                                               assert(!comp->f);
-                                               if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e))) {
-                                                       if 
(is_outerjoin(rel->op)) {
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re->p, PROP_MIN)))
-                                                                       
set_property(sql, e, PROP_MIN, lval);
-                                                       } else if (ne) {
-                                                               if ((lval = 
find_prop_and_get(le->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((rval = 
find_prop_and_get(re->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MIN, rval);
-                                                       } else {
-                                                               if ((lval = 
find_prop_and_get(le->p, PROP_MIN)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((rval = 
find_prop_and_get(re->p, PROP_MIN)))
-                                                                       
set_property(sql, e, PROP_MIN, rval);
+                                                       if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e))) {
+                                                               if 
(is_outerjoin(rel->op)) {
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re->p, PROP_MAX)))
+                                                                               
set_property(sql, e, PROP_MAX, lval);
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re->p, PROP_MIN)))
+                                                                               
set_property(sql, e, PROP_MIN, lval);
+                                                               } else {
+                                                                       if 
((lval = find_prop_and_get(le->p, PROP_MAX)) && (rval = 
find_prop_and_get(re->p, PROP_MAX)))
+                                                                               
set_max_of_values(sql, e, PROP_MAX, lval, rval); /* for inequality expand */
+                                                                       if 
((lval = find_prop_and_get(le->p, PROP_MIN)) && (rval = 
find_prop_and_get(re->p, PROP_MIN)))
+                                                                               
set_min_of_values(sql, e, PROP_MIN, lval, rval);
+                                                               }
                                                        }
-                                               }
-                                               ne = ne ? ne : rne;
-                                       } break;
-                                       case cmp_lt:
-                                       case cmp_lte: {
-                                               sql_exp *le = comp->l, *re = 
comp->r, *fe = comp->f, *rne = NULL, *fne = NULL;
+                                                       ne = ne ? ne : rne;
+                                               } break;
+                                               case cmp_gt:
+                                               case cmp_gte: {
+                                                       sql_exp *le = comp->l, 
*re = comp->r, *rne = NULL;
 
-                                               if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e)) || (fe 
&& (fne = comparison_find_column(fe, e)))) {
-                                                       if 
(is_outerjoin(rel->op)) {
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re ? re->p : fe->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((lval = 
find_prop_and_get(le ? le->p : re ? re->p : fe->p, PROP_MIN)))
-                                                                       
set_property(sql, e, PROP_MIN, lval);
-                                                       } else if (ne) {
-                                                               if (fe) { /* 
range case */
-                                                                       if 
((lval = find_prop_and_get(fe->p, PROP_MIN)))
+                                                       assert(!comp->f);
+                                                       if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e))) {
+                                                               if 
(is_outerjoin(rel->op)) {
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re->p, PROP_MAX)))
+                                                                               
set_property(sql, e, PROP_MAX, lval);
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re->p, PROP_MIN)))
+                                                                               
set_property(sql, e, PROP_MIN, lval);
+                                                               } else if (ne) {
+                                                                       if 
((lval = find_prop_and_get(le->p, PROP_MAX)))
                                                                                
set_property(sql, e, PROP_MAX, lval);
                                                                        if 
((rval = find_prop_and_get(re->p, PROP_MAX)))
                                                                                
set_property(sql, e, PROP_MIN, rval);
                                                                } else {
-                                                                       if 
((lval = find_prop_and_get(re->p, PROP_MIN)))
+                                                                       if 
((lval = find_prop_and_get(le->p, PROP_MIN)))
                                                                                
set_property(sql, e, PROP_MAX, lval);
-                                                                       if 
((rval = find_prop_and_get(le->p, PROP_MIN)))
+                                                                       if 
((rval = find_prop_and_get(re->p, PROP_MIN)))
                                                                                
set_property(sql, e, PROP_MIN, rval);
                                                                }
-                                                       } else if (rne) {
-                                                               if (fe) { /* 
range case */
-                                                                       if 
((lval = find_prop_and_get(re->p, PROP_MIN)))
+                                                       }
+                                                       ne = ne ? ne : rne;
+                                               } break;
+                                               case cmp_lt:
+                                               case cmp_lte: {
+                                                       sql_exp *le = comp->l, 
*re = comp->r, *fe = comp->f, *rne = NULL, *fne = NULL;
+
+                                                       if ((ne = 
comparison_find_column(le, e)) || (rne = comparison_find_column(re, e)) || (fe 
&& (fne = comparison_find_column(fe, e)))) {
+                                                               if 
(is_outerjoin(rel->op)) {
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re ? re->p : fe->p, PROP_MAX)))
                                                                                
set_property(sql, e, PROP_MAX, lval);
-                                                                       if 
((rval = find_prop_and_get(le->p, PROP_MIN)))
-                                                                               
set_property(sql, e, PROP_MIN, rval);
-                                                               } else {
-                                                                       if 
((lval = find_prop_and_get(re->p, PROP_MAX)))
+                                                                       if 
((lval = find_prop_and_get(le ? le->p : re ? re->p : fe->p, PROP_MIN)))
+                                                                               
set_property(sql, e, PROP_MIN, lval);
+                                                               } else if (ne) {
+                                                                       if (fe) 
{ /* range case */
+                                                                               
if ((lval = find_prop_and_get(fe->p, PROP_MIN)))
+                                                                               
        set_property(sql, e, PROP_MAX, lval);
+                                                                               
if ((rval = find_prop_and_get(re->p, PROP_MAX)))
+                                                                               
        set_property(sql, e, PROP_MIN, rval);
+                                                                       } else {
+                                                                               
if ((lval = find_prop_and_get(re->p, PROP_MIN)))
+                                                                               
        set_property(sql, e, PROP_MAX, lval);
+                                                                               
if ((rval = find_prop_and_get(le->p, PROP_MIN)))
+                                                                               
        set_property(sql, e, PROP_MIN, rval);
+                                                                       }
+                                                               } else if (rne) 
{
+                                                                       if (fe) 
{ /* range case */
+                                                                               
if ((lval = find_prop_and_get(re->p, PROP_MIN)))
+                                                                               
        set_property(sql, e, PROP_MAX, lval);
+                                                                               
if ((rval = find_prop_and_get(le->p, PROP_MIN)))
+                                                                               
        set_property(sql, e, PROP_MIN, rval);
+                                                                       } else {
+                                                                               
if ((lval = find_prop_and_get(re->p, PROP_MAX)))
+                                                                               
        set_property(sql, e, PROP_MAX, lval);
+                                                                               
if ((rval = find_prop_and_get(le->p, PROP_MAX)))
+                                                                               
        set_property(sql, e, PROP_MIN, rval);
+                                                                       }
+                                                               } else { /* 
range case */
+                                                                       if 
((lval = find_prop_and_get(fe->p, PROP_MAX)))
                                                                                
set_property(sql, e, PROP_MAX, lval);
                                                                        if 
((rval = find_prop_and_get(le->p, PROP_MAX)))
                                                                                
set_property(sql, e, PROP_MIN, rval);
                                                                }
-                                                       } else { /* range case 
*/
-                                                               if ((lval = 
find_prop_and_get(fe->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MAX, lval);
-                                                               if ((rval = 
find_prop_and_get(le->p, PROP_MAX)))
-                                                                       
set_property(sql, e, PROP_MIN, rval);
                                                        }
+                                                       ne = ne ? ne : rne ? 
rne : fne;
+                                               } break;
+                                               default: /* Maybe later I can 
do cmp_in and cmp_notin */
+                                                       break;
                                                }
-                                               ne = ne ? ne : rne ? rne : fne;
-                                       } break;
-                                       default: /* Maybe later I can do cmp_in 
and cmp_notin */
-                                               break;
                                        }
                                }
                        }
@@ -216,14 +217,17 @@ rel_basetable_get_statistics(visitor *v,
                if (has_nil(e) && mvc_has_no_nil(sql, c))
                        set_has_no_nil(e);
  
-               if ((max = mvc_has_max_value(sql, c))) {
-                       prop *p = e->p = prop_create(sql->sa, PROP_MAX, e->p);
-                       p->value = atom_general_ptr(sql->sa, &c->type, max);
+               if (EC_NUMBER(c->type.type->localtype) || 
EC_VARCHAR(c->type.type->localtype) || EC_TEMP_NOFRAC(c->type.type->localtype) 
|| c->type.type->localtype == EC_DATE) {
+                       if ((max = mvc_has_max_value(sql, c))) {
+                               prop *p = e->p = prop_create(sql->sa, PROP_MAX, 
e->p);
+                               p->value = atom_general_ptr(sql->sa, &c->type, 
max);
+                       }
+                       if ((min = mvc_has_min_value(sql, c))) {
+                               prop *p = e->p = prop_create(sql->sa, PROP_MIN, 
e->p);
+                               p->value = atom_general_ptr(sql->sa, &c->type, 
min);
+                       }
                }
-               if ((min = mvc_has_min_value(sql, c))) {
-                       prop *p = e->p = prop_create(sql->sa, PROP_MIN, e->p);
-                       p->value = atom_general_ptr(sql->sa, &c->type, min);
-               }
+
        }
        return e;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to