Changeset: 16436e3143de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/16436e3143de
Modified Files:
        sql/include/sql_relation.h
        sql/server/rel_statistics.c
Branch: properties
Log Message:

Don't gather statistics for a relation multiple times if it has more than 1 
reference


diffs (48 lines):

diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -299,7 +299,7 @@ typedef struct relation {
        /*
         * Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so 
a relation is not modified twice
         * All bits are used by rel_unnest modifiers and always reset after.
-        * The first bit is also used by rel_dce and rel_merge_select_rse 
optimizers.
+        * The first bit is also used by rel_dce and rel_merge_select_rse 
optimizers and rel_get_statistics
         * The third bit is used by rel_remote_func only and it's not reset.
         */
         used:3;
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
@@ -11,6 +11,9 @@
 #include "rel_statistics.h"
 #include "rel_rewriter.h"
 
+#define statistics_gathered       (1 << 0)
+#define are_statistics_gathered(X) ((X & statistics_gathered) == 
statistics_gathered)
+
 static sql_exp *
 comparison_find_column(sql_exp *input, sql_exp *e)
 {
@@ -535,6 +538,11 @@ rel_prune_predicates(visitor *v, sql_rel
 static sql_rel *
 rel_get_statistics_(visitor *v, sql_rel *rel)
 {
+       /* Don't look at the same relation twice */
+       if (are_statistics_gathered(rel->used))
+               return rel;
+       rel->used |= statistics_gathered;
+
        switch(rel->op){
        case op_basetable:
                rel->exps = exps_exp_visitor_bottomup(v, rel, rel->exps, 0, 
&rel_basetable_get_statistics, false);
@@ -624,7 +632,9 @@ static sql_rel *
 rel_get_statistics(visitor *v, global_props *gp, sql_rel *rel)
 {
        (void) gp;
-       return rel_visitor_bottomup(v, rel, &rel_get_statistics_);
+       rel = rel_visitor_bottomup(v, rel, &rel_get_statistics_);
+       /*reset used flag */
+       return rel_visitor_bottomup(v, rel, &rewrite_reset_used);
 }
 
 run_optimizer
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to