Changeset: 3ea05a8c3c04 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3ea05a8c3c04
Modified Files:
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2015/Tests/crash.Bug-3736.stable.out
        
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out
        sql/test/Tests/keys.stable.out
Branch: default
Log Message:

more stricked checking for alias names


diffs (truncated from 402 to 300 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
@@ -2908,7 +2908,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel, 
                        if (rel) {
                                exp_label(sql->sa, cond, ++sql->label);
                                append(rel->exps, cond);
-                               cond = exp_column(sql->sa, 
exp_find_rel_name(cond), exp_name(cond), exp_subtype(cond), cond->card, 
has_nil(cond), is_intern(cond));
+                               cond = exp_ref(sql->sa, cond);
                        }
                        /* rewrite right hands of div */
                        ncond = cond;
@@ -4143,12 +4143,11 @@ rel_push_aggr_down(int *changes, mvc *sq
                                sql_exp *e = n->data, *ne;
 
                                ne = exp_uses_exp( rel->exps, e);
-                               //assert(ne);
                                if (!ne)
                                        ne = e;
                                ne = list_find_exp( u->exps, ne);
                                assert(ne);
-                               ne = exp_column(sql->sa, exp_find_rel_name(ne), 
exp_name(ne), exp_subtype(ne), ne->card, has_nil(ne), is_intern(ne));
+                               ne = exp_ref(sql->sa, ne);
                                append(gbe, ne);
                        }
                }
@@ -4165,7 +4164,7 @@ rel_push_aggr_down(int *changes, mvc *sq
                                /* union of aggr result may have nils 
                                 * because sum/count of empty set */
                                set_has_nil(e);
-                               e = exp_column(sql->sa, exp_find_rel_name(e), 
exp_name(e), exp_subtype(e), e->card, has_nil(e), is_intern(e));
+                               e = exp_ref(sql->sa, e);
                                ne = exp_aggr1(sql->sa, e, a, need_distinct(e), 
1, e->card, 1);
                                if (/* DISABLES CODE */ (0) && cnt)
                                        ne->p = prop_create(sql->sa, 
PROP_COUNT, ne->p);
@@ -4210,7 +4209,7 @@ gen_push_groupby_down(int *changes, mvc 
        list *gbe = rel->r;
 
        (void)changes;
-       if (rel->op == op_groupby && list_length(gbe) == 1 && j->op == 
op_join){ //&& is_join(j->op)) {
+       if (rel->op == op_groupby && list_length(gbe) == 1 && j->op == op_join){
                sql_rel *jl = j->l, *jr = j->r, *cr, *cl;
                sql_exp *gb = gbe->h->data, *e;
                node *n;
@@ -4537,7 +4536,6 @@ rel_push_select_down(int *changes, mvc *
                for (n = exps->h; n; n = n->next) { 
                        sql_exp *e = n->data;
 
-                       //if (exp_is_join_exp(e) == 0) {
                        if (exp_is_join(e, NULL) == 0) {
                                append(r->exps, e);
                                (*changes)++;
@@ -5943,7 +5941,7 @@ split_aggr_and_project(mvc *sql, list *a
                if (!exp_name(e))
                        exp_label(sql->sa, e, ++sql->label);
                list_append(aexps, e);
-               return exp_column(sql->sa, exp_find_rel_name(e), exp_name(e), 
exp_subtype(e), e->card, has_nil(e), is_intern(e));
+               return exp_ref(sql->sa, e);
        case e_cmp:
                /* e_cmp's shouldn't exist in an aggr expression list */
                assert(0);
@@ -6378,22 +6376,23 @@ rel_push_project_up(int *changes, mvc *s
        return rel;
 }
 
-static int exp_mark_used(sql_rel *subrel, sql_exp *e);
+/* if local_proj is set: the current expression is from the same projection */
+static int exp_mark_used(sql_rel *subrel, sql_exp *e, int local_proj);
 
 static int 
-exps_mark_used(sql_rel *subrel, list *l) 
+exps_mark_used(sql_rel *subrel, list *l, int local_proj) 
 {
        int nr = 0;
        if (list_empty(l))
                return nr;
 
        for (node *n = l->h; n != NULL; n = n->next) 
-               nr += exp_mark_used(subrel, n->data);
+               nr += exp_mark_used(subrel, n->data, local_proj);
        return nr;
 }
 
 static int
-exp_mark_used(sql_rel *subrel, sql_exp *e)
+exp_mark_used(sql_rel *subrel, sql_exp *e, int local_proj)
 {
        int nr = 0;
        sql_exp *ne = NULL;
@@ -6403,25 +6402,25 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                ne = rel_find_exp(subrel, e);
                break;
        case e_convert:
-               return exp_mark_used(subrel, e->l);
+               return exp_mark_used(subrel, e->l, local_proj);
        case e_aggr:
        case e_func: {
                if (e->l)
-                       nr += exps_mark_used(subrel, e->l);
+                       nr += exps_mark_used(subrel, e->l, local_proj);
                break;
        }
        case e_cmp:
                if (e->flag == cmp_or || e->flag == cmp_filter) {
-                       nr += exps_mark_used(subrel, e->l);
-                       nr += exps_mark_used(subrel, e->r);
+                       nr += exps_mark_used(subrel, e->l, local_proj);
+                       nr += exps_mark_used(subrel, e->r, local_proj);
                } else if (e->flag == cmp_in || e->flag == cmp_notin) {
-                       nr += exp_mark_used(subrel, e->l);
-                       nr += exps_mark_used(subrel, e->r);
+                       nr += exp_mark_used(subrel, e->l, local_proj);
+                       nr += exps_mark_used(subrel, e->r, local_proj);
                } else {
-                       nr += exp_mark_used(subrel, e->l);
-                       nr += exp_mark_used(subrel, e->r);
+                       nr += exp_mark_used(subrel, e->l, local_proj);
+                       nr += exp_mark_used(subrel, e->r, local_proj);
                        if (e->f)
-                               nr += exp_mark_used(subrel, e->f);
+                               nr += exp_mark_used(subrel, e->f, local_proj);
                }
                break;
        case e_atom:
@@ -6429,14 +6428,15 @@ exp_mark_used(sql_rel *subrel, sql_exp *
                e->used = 1;
                /* return 0 as constants may require a full column ! */
                if (e->f)
-                       nr += exps_mark_used(subrel, e->f);
+                       nr += exps_mark_used(subrel, e->f, local_proj);
                return nr;
        case e_psm:
                e->used = 1;
                break;
        }
        if (ne && e != ne) {
-               ne->used = 1;
+               if (!local_proj || (has_label(ne) || (ne->alias.rname && 
ne->alias.rname[0] == '%')))
+                       ne->used = 1;
                return ne->used;
        }
        return nr;
@@ -6472,7 +6472,8 @@ rel_exps_mark_used(sql_allocator *sa, sq
                for (n=l->h; n; n = n->next) {
                        sql_exp *e = n->data;
 
-                       exp_mark_used(rel, e);
+                       e->used = 1;
+                       exp_mark_used(rel, e, 1);
                }
        }
 
@@ -6495,8 +6496,8 @@ rel_exps_mark_used(sql_allocator *sa, sq
 
                        if (!is_project(rel->op) || e->used) {
                                if (is_project(rel->op))
-                                       nr += exp_mark_used(rel, e);
-                               nr += exp_mark_used(subrel, e);
+                                       nr += exp_mark_used(rel, e, 1);
+                               nr += exp_mark_used(subrel, e, 0);
                        }
                }
        }
@@ -6512,9 +6513,9 @@ rel_exps_mark_used(sql_allocator *sa, sq
                for (n=l->h; n; n = n->next) {
                        sql_exp *e = n->data;
 
-               //      exp_mark_used(rel, e);
+                       e->used = 1;
                        /* possibly project/groupby uses columns from the inner 
*/ 
-                       exp_mark_used(subrel, e);
+                       exp_mark_used(subrel, e, 0);
                }
        }
 }
@@ -6580,7 +6581,7 @@ rel_mark_used(mvc *sql, sql_rel *rel, in
                if (rel->op == op_table && rel->l && rel->flag != 2) {
                        rel_used(rel);
                        if (rel->r)
-                               exp_mark_used(rel->l, rel->r);
+                               exp_mark_used(rel->l, rel->r, 0);
                        rel_mark_used(sql, rel->l, proj);
                }
                break;
@@ -6782,148 +6783,6 @@ rel_remove_unused(mvc *sql, sql_rel *rel
 }
 
 static void
-rel_dep_graph( char *deps, list *refs, sql_rel *parent, sql_rel *rel) 
-{
-       if (!parent)
-               return ;
-
-       if (rel_is_ref(rel) && parent != rel) {
-               int n = list_length(refs);
-               int pnr = list_position(refs, parent);
-               int cnr = list_position(refs, rel);
-
-               deps[pnr*n + cnr] = 1;
-               parent = rel;
-       }
-
-       switch(rel->op) {
-       case op_table:
-       case op_topn: 
-       case op_sample: 
-       case op_project:
-       case op_groupby: 
-       case op_select: 
-
-               if (rel->l && (rel->op != op_table || rel->flag != 2))
-                       rel_dep_graph(deps, refs, parent, rel->l);
-
-       case op_basetable:
-       case op_insert:
-       case op_ddl:
-               break;
-
-       case op_update:
-       case op_delete:
-       case op_truncate:
-
-               if (rel->r)
-                       rel_dep_graph(deps, refs, parent, rel->r);
-               break;
-
-
-       case op_union: 
-       case op_inter: 
-       case op_except: 
-       case op_join: 
-       case op_left: 
-       case op_right: 
-       case op_full: 
-       case op_semi: 
-       case op_anti: 
-
-               if (rel->l)
-                       rel_dep_graph(deps, refs, parent, rel->l);
-               if (rel->r)
-                       rel_dep_graph(deps, refs, parent, rel->r);
-               break;
-       }
-}
-
-/*
-extern void _rel_print(mvc *sql, sql_rel *rel);
-
-static void 
-print_deps(mvc *sql, char *deps, list *refs) 
-{
-       int i, j;
-       int n = list_length(refs);
-
-       for (i=0; i<n; i++) {
-               sql_rel *r = list_fetch(refs, i);
-               printf("dep %d\n", i);
-               _rel_print(sql,r);
-       }
-       for (i=0; i<n; i++) {
-               for (j=0; j<n; j++) {
-                       printf("%c ", i==j?'x' : deps[i*n + j]?'1':'0');
-               }
-               printf("\n");
-       }
-
-}      
-*/
-
-static int 
-depends_on(int nr, char *deps, int n, int dnr) 
-{
-       for(;dnr < n; dnr++) {
-               if (dnr == nr)
-                       dnr++;
-               if (deps[nr*n + dnr])
-                       return dnr;
-       }
-       return -1;
-}
-
-static void
-flatten_dep(list *nrefs, list *refs, int nr, char *deps, int n) 
-{
-       int dnr = 0;
-
-       if (deps[nr*n + nr])
-               return;
-       for (;(dnr = depends_on(nr, deps, n, dnr)) >= 0 && dnr < n; dnr++) 
-               flatten_dep(nrefs, refs, dnr, deps, n);
-       if (!deps[nr*n + nr]) {
-               list_prepend(nrefs, list_fetch(refs,nr));
-               deps[nr*n+nr] = 1; /* mark done */
-       }
-}
-
-static list *
-flatten_dep_graph(mvc *sql, char *deps, list *refs)
-{
-       list *nrefs = sa_list(sql->sa);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to