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