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

Optimize count(no nil) -> count(*) when possible after gathering statistics. We 
have yet to propagate the nonil property trough joins and selects


diffs (truncated from 443 to 300 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
@@ -18,10 +18,6 @@
 #include "sql_mvc.h"
 #include "gdk_time.h"
 
-typedef struct global_props {
-       int cnt[ddl_maxops];
-} global_props;
-
 static sql_subfunc *find_func(mvc *sql, char *name, list *exps);
 
 /* The important task of the relational optimizer is to optimize the
@@ -207,158 +203,6 @@ kc_column_cmp(sql_kc *kc, sql_column *c)
        return !(c == kc->c);
 }
 
-static void psm_exps_properties(mvc *sql, global_props *gp, list *exps);
-static void rel_properties(mvc *sql, global_props *gp, sql_rel *rel);
-
-static void
-psm_exp_properties(mvc *sql, global_props *gp, sql_exp *e)
-{
-       /* only functions need fix up */
-       switch(e->type) {
-       case e_atom:
-       case e_column:
-               break;
-       case e_convert:
-               psm_exp_properties(sql, gp, e->l);
-               break;
-       case e_aggr:
-       case e_func:
-               psm_exps_properties(sql, gp, e->l);
-               assert(!e->r);
-               break;
-       case e_cmp:
-               if (e->flag == cmp_or || e->flag == cmp_filter) {
-                       psm_exps_properties(sql, gp, e->l);
-                       psm_exps_properties(sql, gp, e->r);
-               } else if (e->flag == cmp_in || e->flag == cmp_notin) {
-                       psm_exp_properties(sql, gp, e->l);
-                       psm_exps_properties(sql, gp, e->r);
-               } else {
-                       psm_exp_properties(sql, gp, e->l);
-                       psm_exp_properties(sql, gp, e->r);
-                       if (e->f)
-                               psm_exp_properties(sql, gp, e->f);
-               }
-               break;
-       case e_psm:
-               if (e->flag & PSM_SET || e->flag & PSM_RETURN || e->flag & 
PSM_EXCEPTION) {
-                       psm_exp_properties(sql, gp, e->l);
-               } else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
-                       psm_exp_properties(sql, gp, e->l);
-                       psm_exps_properties(sql, gp, e->r);
-                       if (e->flag == PSM_IF && e->f)
-                               psm_exps_properties(sql, gp, e->f);
-               } else if (e->flag & PSM_REL && e->l) {
-                       rel_properties(sql, gp, e->l);
-               }
-               break;
-       }
-}
-
-static void
-psm_exps_properties(mvc *sql, global_props *gp, list *exps)
-{
-       node *n;
-
-       if (!exps)
-               return;
-       for (n = exps->h; n; n = n->next)
-               psm_exp_properties(sql, gp, n->data);
-}
-
-static void
-rel_properties(mvc *sql, global_props *gp, sql_rel *rel)
-{
-       if (!rel)
-               return;
-
-       gp->cnt[(int)rel->op]++;
-       switch (rel->op) {
-       case op_basetable:
-               break;
-       case op_table:
-               if (rel->l && rel->flag != TRIGGER_WRAPPER)
-                       rel_properties(sql, gp, rel->l);
-               break;
-       case op_join:
-       case op_left:
-       case op_right:
-       case op_full:
-
-       case op_semi:
-       case op_anti:
-
-       case op_union:
-       case op_inter:
-       case op_except:
-
-       case op_insert:
-       case op_update:
-       case op_delete:
-               if (rel->l)
-                       rel_properties(sql, gp, rel->l);
-               if (rel->r)
-                       rel_properties(sql, gp, rel->r);
-               break;
-       case op_project:
-       case op_select:
-       case op_groupby:
-       case op_topn:
-       case op_sample:
-       case op_truncate:
-               if (rel->l)
-                       rel_properties(sql, gp, rel->l);
-               break;
-       case op_ddl:
-               if (rel->flag == ddl_psm && rel->exps)
-                       psm_exps_properties(sql, gp, rel->exps);
-               if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view) {
-                       if (rel->l)
-                               rel_properties(sql, gp, rel->l);
-               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
-                       if (rel->l)
-                               rel_properties(sql, gp, rel->l);
-                       if (rel->r)
-                               rel_properties(sql, gp, rel->r);
-               }
-               break;
-       }
-
-       switch (rel->op) {
-       case op_basetable:
-       case op_table:
-               if (!find_prop(rel->p, PROP_COUNT))
-                       rel->p = prop_create(sql->sa, PROP_COUNT, rel->p);
-               break;
-       case op_join:
-       case op_left:
-       case op_right:
-       case op_full:
-
-       case op_semi:
-       case op_anti:
-
-       case op_union:
-       case op_inter:
-       case op_except:
-               break;
-
-       case op_project:
-       case op_groupby:
-       case op_topn:
-       case op_sample:
-       case op_select:
-               break;
-
-       case op_insert:
-       case op_update:
-       case op_delete:
-       case op_truncate:
-       case op_ddl:
-               break;
-       }
-}
-
 static sql_rel * rel_join_order(visitor *v, sql_rel *rel) ;
 
 static void
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -345,3 +345,152 @@ rewrite_reset_used(visitor *v, sql_rel *
        rel->used = 0;
        return rel;
 }
+
+static void psm_exps_properties(mvc *sql, global_props *gp, list *exps);
+
+static void
+psm_exp_properties(mvc *sql, global_props *gp, sql_exp *e)
+{
+       /* only functions need fix up */
+       switch(e->type) {
+       case e_atom:
+       case e_column:
+               break;
+       case e_convert:
+               psm_exp_properties(sql, gp, e->l);
+               break;
+       case e_aggr:
+       case e_func:
+               psm_exps_properties(sql, gp, e->l);
+               assert(!e->r);
+               break;
+       case e_cmp:
+               if (e->flag == cmp_or || e->flag == cmp_filter) {
+                       psm_exps_properties(sql, gp, e->l);
+                       psm_exps_properties(sql, gp, e->r);
+               } else if (e->flag == cmp_in || e->flag == cmp_notin) {
+                       psm_exp_properties(sql, gp, e->l);
+                       psm_exps_properties(sql, gp, e->r);
+               } else {
+                       psm_exp_properties(sql, gp, e->l);
+                       psm_exp_properties(sql, gp, e->r);
+                       if (e->f)
+                               psm_exp_properties(sql, gp, e->f);
+               }
+               break;
+       case e_psm:
+               if (e->flag & PSM_SET || e->flag & PSM_RETURN || e->flag & 
PSM_EXCEPTION) {
+                       psm_exp_properties(sql, gp, e->l);
+               } else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
+                       psm_exp_properties(sql, gp, e->l);
+                       psm_exps_properties(sql, gp, e->r);
+                       if (e->flag == PSM_IF && e->f)
+                               psm_exps_properties(sql, gp, e->f);
+               } else if (e->flag & PSM_REL && e->l) {
+                       rel_properties(sql, gp, e->l);
+               }
+               break;
+       }
+}
+
+static void
+psm_exps_properties(mvc *sql, global_props *gp, list *exps)
+{
+       if (!exps)
+               return;
+       for (node *n = exps->h; n; n = n->next)
+               psm_exp_properties(sql, gp, n->data);
+}
+
+void
+rel_properties(mvc *sql, global_props *gp, sql_rel *rel)
+{
+       if (!rel)
+               return;
+
+       gp->cnt[(int)rel->op]++;
+       switch (rel->op) {
+       case op_basetable:
+               break;
+       case op_table:
+               if (rel->l && rel->flag != TRIGGER_WRAPPER)
+                       rel_properties(sql, gp, rel->l);
+               break;
+       case op_join:
+       case op_left:
+       case op_right:
+       case op_full:
+
+       case op_semi:
+       case op_anti:
+
+       case op_union:
+       case op_inter:
+       case op_except:
+
+       case op_insert:
+       case op_update:
+       case op_delete:
+               if (rel->l)
+                       rel_properties(sql, gp, rel->l);
+               if (rel->r)
+                       rel_properties(sql, gp, rel->r);
+               break;
+       case op_project:
+       case op_select:
+       case op_groupby:
+       case op_topn:
+       case op_sample:
+       case op_truncate:
+               if (rel->l)
+                       rel_properties(sql, gp, rel->l);
+               break;
+       case op_ddl:
+               if (rel->flag == ddl_psm && rel->exps)
+                       psm_exps_properties(sql, gp, rel->exps);
+               if (rel->flag == ddl_output || rel->flag == ddl_create_seq || 
rel->flag == ddl_alter_seq || rel->flag == ddl_alter_table || rel->flag == 
ddl_create_table || rel->flag == ddl_create_view) {
+                       if (rel->l)
+                               rel_properties(sql, gp, rel->l);
+               } else if (rel->flag == ddl_list || rel->flag == ddl_exception) 
{
+                       if (rel->l)
+                               rel_properties(sql, gp, rel->l);
+                       if (rel->r)
+                               rel_properties(sql, gp, rel->r);
+               }
+               break;
+       }
+
+       switch (rel->op) {
+       case op_basetable:
+       case op_table:
+               if (!find_prop(rel->p, PROP_COUNT))
+                       rel->p = prop_create(sql->sa, PROP_COUNT, rel->p);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to