Update of /cvsroot/monetdb/sql/src/server
In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv5199/src/server

Modified Files:
      Tag: Feb2010
        rel_optimizer.mx 
Log Message:
backport (no need to propagate) of rewriter reduce_group_by_exps


Index: rel_optimizer.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_optimizer.mx,v
retrieving revision 1.81.2.2
retrieving revision 1.81.2.3
diff -u -d -r1.81.2.2 -r1.81.2.3
--- rel_optimizer.mx    30 Jan 2010 08:12:51 -0000      1.81.2.2
+++ rel_optimizer.mx    30 Jan 2010 12:29:40 -0000      1.81.2.3
@@ -449,6 +449,14 @@
        return (c->colnr - kc->c->colnr);
 }
 
+static int
+kc_column_cmp(sql_kc *kc, sql_column *c)
+{
+       /* return on equality */
+       return !(c == kc->c);
+}
+
+
 static sql_idx *
 find_fk_index(sql_table *l, list *lcols, sql_table *r, list *rcols)
 {
@@ -2374,6 +2382,80 @@
        return rel;
 }
 
+/* reduce group by expressions based on pkey info */
+static sql_rel *
+rel_reduce_groupby_exps(int *changes, mvc *sql, sql_rel *rel) 
+{
+       list *gbe = rel->r;
+
+       *changes = 0;
+       (void)sql;
+       if (is_groupby(rel->op) && list_length(gbe) > 1 && list_length(gbe)<9) {
+               node *n;
+               char *scores = alloca(list_length(gbe));
+               int k, j, i;
+               sql_column *c;
+               sql_table **tbls;
+
+               gbe = rel->r;
+               tbls = (sql_table**)alloca(sizeof(sql_table*)*list_length(gbe));
+               for (k = 0, i = 0, n = gbe->h; n; n = n->next, k++) {
+                       sql_exp *e = n->data;
+
+                       c = exp_find_column(rel, e);
+                       if (c) {
+                               for(j = 0; j < i; j++)
+                                       if (c->t == tbls[j])
+                                               break;
+                               tbls[j] = c->t;
+                               i += (j == i);
+                       }
+               }
+               if (i) { /* forall tables find pkey and 
+                               remove useless other columns */
+                       for(j = 0; j < i; j++) {
+                               int l, nr = 0;
+
+                               k = list_length(gbe);
+                               memset(scores, 0, list_length(gbe));
+                               if (tbls[j]->pkey) {
+                                       for (l = 0, n = gbe->h; l < k && n; 
l++, n = n->next) {
+                                               fcmp cmp = (fcmp)&kc_column_cmp;
+                                               sql_exp *e = n->data;
+
+                                               c = exp_find_column(rel, e);
+                                               if (c && 
list_find(tbls[j]->pkey->k.columns, c, cmp) != NULL) {
+                                                       scores[l] = 1;
+                                                       nr ++;
+                                               }
+                                       }
+                               }
+                               if (nr && list_length(tbls[j]->pkey->k.columns) 
== nr) {
+                                       list *ngbe = new_exp_list();
+                                       for (l = 0, n = gbe->h; l < k && n; 
l++, n = n->next) {
+                                               sql_exp *e = n->data;
+
+                                               if (scores[l])
+                                                       append(ngbe, 
exp_dup(e)); 
+                                       }
+                                       for (l = 0, n = gbe->h; l < k && n; 
l++, n = n->next) {
+                                               sql_exp *e = n->data;
+
+                                               c = exp_find_column(rel, e);
+                                               if (!c || c->t != tbls[j]) 
+                                                       append(ngbe, 
exp_dup(e)); 
+                                       }
+
+                                       list_destroy(rel->r);
+                                       rel->r = ngbe;
+                               } 
+                               gbe = rel->r;
+                       }
+               }
+       }
+       return rel;
+}
+
 /* Pushing projects up the tree. Done very early in the optimizer.
  * Makes later steps easier. 
  */
@@ -3400,8 +3482,6 @@
           the 'unique/primary (right hand side)' done before the (fake)-join 
and the selections on the foreign 
           part done after. */
        
-
-
        if (gp.cnt[op_join] && gp.cnt[op_groupby]) {
                rel = rewrite(sql, rel, &rel_push_count_down);
                rel = rewrite(sql, rel, &rel_push_join_down); 
@@ -3410,6 +3490,7 @@
        if (gp.cnt[op_groupby]) {
                rel = rewrite(sql, rel, &rel_avg2sum_count); 
                rel = rewrite(sql, rel, &rel_groupby_order); 
+               rel = rewrite(sql, rel, &rel_reduce_groupby_exps); 
        }
 
        if (gp.cnt[op_join] || gp.cnt[op_left])


------------------------------------------------------------------------------
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
http://p.sf.net/sfu/theplanet-com
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to