Changeset: 8e8f3c759456 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8e8f3c759456
Modified Files:
        sql/server/rel_optimizer.c
Branch: Apr2012
Log Message:

fixed bug in optimizer (push join down) which lead semi infinite recursive
optimization.


diffs (81 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
@@ -198,30 +198,6 @@ list_find_exp( list *exps, sql_exp *e)
        return NULL;
 }
 
-/* find in the list of expression an expression which uses e */ 
-static sql_exp *
-exp_uses_exp( list *exps, sql_exp *e)
-{
-       node *n;
-       char *rname = exp_find_rel_name(e);
-       char *name = exp_name(e);
-
-       if (!exps)
-               return NULL;
-
-       for ( n = exps->h; n; n = n->next) {
-               sql_exp *u = n->data;
-
-               if (u->l && rname && strcmp(u->l, rname) == 0 &&
-                   u->r && name && strcmp(u->r, name) == 0) 
-                       return u;
-               if (!u->l && !rname &&
-                   u->r && name && strcmp(u->r, name) == 0) 
-                       return u;
-       }
-       return NULL;
-}
-
 static int
 kc_column_cmp(sql_kc *kc, sql_column *c)
 {
@@ -2892,19 +2868,44 @@ rel_remove_empty_select(int *changes, mv
  * ->
  * {semi}join( A, groupby( semijoin(B,A) [gbe == A.x] ) [gbe][aggrs] ) [ gbe 
== A.x ]
  */
+
+/* find in the list of expression an expression which uses e */ 
+static sql_exp *
+exp_uses_exp( list *exps, sql_exp *e)
+{
+       node *n;
+       char *rname = exp_find_rel_name(e);
+       char *name = exp_name(e);
+
+       if (!exps)
+               return NULL;
+
+       for ( n = exps->h; n; n = n->next) {
+               sql_exp *u = n->data;
+
+               if (u->l && rname && strcmp(u->l, rname) == 0 &&
+                   u->r && name && strcmp(u->r, name) == 0) 
+                       return u;
+               if (!u->l && !rname &&
+                   u->r && name && strcmp(u->r, name) == 0) 
+                       return u;
+       }
+       return NULL;
+}
+
 static sql_rel *
 rel_push_join_down(int *changes, mvc *sql, sql_rel *rel) 
 {
        list *exps = NULL;
 
        (void)*changes;
-       if (((is_join(rel->op) && rel->exps) || is_semi(rel->op)) && rel->l) {
+       if (!rel_is_ref(rel) && (((is_join(rel->op) && rel->exps) || 
is_semi(rel->op)) && rel->l)) {
                sql_rel *gb = rel->r, *ogb = gb, *l = NULL, *rell = rel->l;
 
                if (gb->op == op_project)
                        gb = gb->l;
 
-               if (is_basetable(rell->op))
+               if (is_basetable(rell->op) || rel_is_ref(rell))
                        return rel;
 
                exps = rel->exps;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to