Changeset: f8a38c9ea0a6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f8a38c9ea0a6
Modified Files:
sql/server/rel_optimize_proj.c
Branch: default
Log Message:
improved the rel_reduce_groupby_exps optimizer, it now handles simple foreign
key groupby's and removes any other columns from the p/ukey side.
diffs (42 lines):
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -2324,8 +2324,8 @@ rel_reduce_groupby_exps(visitor *v, sql_
node *n, *m;
int k, j, i, ngbe = list_length(gbe);
sql_column *c;
- sql_table **tbls = SA_NEW_ARRAY(ta, sql_table*, ngbe);
- sql_rel **bts = SA_NEW_ARRAY(ta, sql_rel*, ngbe), *bt = NULL;
+ sql_table **tbls = SA_ZNEW_ARRAY(ta, sql_table*, ngbe);
+ sql_rel **bts = SA_ZNEW_ARRAY(ta, sql_rel*, ngbe), *bt = NULL;
gbe = rel->r;
for (k = 0, i = 0, n = gbe->h; n; n = n->next, k++) {
@@ -2355,11 +2355,26 @@ rel_reduce_groupby_exps(visitor *v, sql_
memset(scores, 0, list_length(gbe));
if (tbls[j]->pkey) {
for (l = 0, n = gbe->h; l < k && n;
l++, n = n->next) {
+ sql_fkey *fk = NULL;
+ if (tbls[j] != tbls[l] &&
tbls[l]){
+ for(node *n =
ol_first_node(tbls[l]->keys); n && !fk; n = n->next) {
+ sql_key *k =
n->data;
+ if (k->type ==
fkey) {
+
sql_fkey *f = (sql_fkey*)k;
+ if
(f->rkey == tbls[j]->pkey->k.base.id)
+
fk = f;
+ }
+ }
+ }
fcmp cmp = (fcmp)&kc_column_cmp;
sql_exp *e = n->data;
c = exp_find_column_(rel, e,
-2, &bt);
- if (c && c->t == tbls[j] &&
bts[j] == bt &&
+ if (c && fk &&
+ list_find(fk->k.columns, c,
cmp) != NULL) {
+ scores[l] = 1;
+ nr ++;
+ } else if (c && c->t == tbls[j]
&& bts[j] == bt &&
list_find(tbls[j]->pkey->k.columns, c, cmp) != NULL) {
scores[l] = 1;
nr ++;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]