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