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