Changeset: dca9b1769320 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dca9b1769320
Modified Files:
sql/server/rel_dump.c
sql/server/rel_optimize_proj.c
sql/server/rel_optimize_sel.c
sql/server/rel_optimizer_private.h
sql/server/rel_rewriter.c
sql/server/rel_rewriter.h
sql/server/rel_statistics.c
sql/server/rel_unnest.c
sql/test/BugTracker-2015/Tests/crash.Bug-3736.test
sql/test/BugTracker-2021/Tests/batappend-undefined.Bug-7130.test
Branch: unnest2
Log Message:
use normal aliases (shows plan correctly again without debug=4)
diffs (truncated from 450 to 300 lines):
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -155,7 +155,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
allocator *ta = MT_thread_getallocator();
allocator_state ta_state = ma_open(ta);
/*mnstr_printf(fout, "%p ", e);*/
- if (mvc_debug_on(sql, 4) && e->alias.label < 0)
+ if (mvc_debug_on(sql, 4) && e->alias.label != 0)
//if (sql->show_details && e->alias.label < 0)
mnstr_printf(fout, "%d: ", e->alias.label);
switch(e->type) {
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
@@ -1681,10 +1681,8 @@ rel_groupby_cse(visitor *v, sql_rel *rel
return rel;
}
-sql_exp *list_exps_uses_exp(list *exps, const char *rname, const char *name);
-
static sql_exp*
-exp_uses_exp(sql_exp *e, const char *rname, const char *name)
+exp_uses_exp(sql_exp *e, sql_exp *used_exp)
{
sql_exp *res = NULL;
@@ -1693,41 +1691,37 @@ exp_uses_exp(sql_exp *e, const char *rna
break;
case e_atom: {
if (e->f)
- return list_exps_uses_exp(e->f, rname, name);
+ return list_exps_uses_exp(e->f, used_exp);
} break;
case e_convert:
- return exp_uses_exp(e->l, rname, name);
+ return exp_uses_exp(e->l, used_exp);
case e_column: {
- if (e->l && rname && strcmp(e->l, rname) == 0 &&
- e->r && name && strcmp(e->r, name) == 0)
- return e;
- if (!e->l && !rname &&
- e->r && name && strcmp(e->r, name) == 0)
+ if (e->nid == used_exp->alias.label)
return e;
} break;
case e_func:
case e_aggr: {
if (e->l)
- return list_exps_uses_exp(e->l, rname, name);
+ return list_exps_uses_exp(e->l, used_exp);
} break;
case e_cmp: {
if (e->flag == cmp_con || e->flag == cmp_dis) {
- return list_exps_uses_exp(e->l, rname, name);
+ return list_exps_uses_exp(e->l, used_exp);
} else if (e->flag == cmp_in || e->flag == cmp_notin) {
- if ((res = exp_uses_exp(e->l, rname, name)))
+ if ((res = exp_uses_exp(e->l, used_exp)))
return res;
- return list_exps_uses_exp(e->r, rname, name);
+ return list_exps_uses_exp(e->r, used_exp);
} else if (e->flag == cmp_filter) {
- if ((res = list_exps_uses_exp(e->l, rname,
name)))
+ if ((res = list_exps_uses_exp(e->l, used_exp)))
return res;
- return list_exps_uses_exp(e->r, rname, name);
+ return list_exps_uses_exp(e->r, used_exp);
} else {
- if ((res = exp_uses_exp(e->l, rname, name)))
+ if ((res = exp_uses_exp(e->l, used_exp)))
return res;
- if ((res = exp_uses_exp(e->r, rname, name)))
+ if ((res = exp_uses_exp(e->r, used_exp)))
return res;
if (e->f)
- return exp_uses_exp(e->f, rname, name);
+ return exp_uses_exp(e->f, used_exp);
}
} break;
}
@@ -1735,7 +1729,7 @@ exp_uses_exp(sql_exp *e, const char *rna
}
sql_exp *
-list_exps_uses_exp(list *exps, const char *rname, const char *name)
+list_exps_uses_exp(list *exps, sql_exp *used_exp)
{
sql_exp *res = NULL;
@@ -1743,7 +1737,7 @@ list_exps_uses_exp(list *exps, const cha
return NULL;
for (node *n = exps->h; n && !res; n = n->next) {
sql_exp *e = n->data;
- res = exp_uses_exp(e, rname, name);
+ res = exp_uses_exp(e, used_exp);
}
return res;
}
@@ -1752,7 +1746,7 @@ list_exps_uses_exp(list *exps, const cha
sql_exp *
exps_uses_exp(list *exps, sql_exp *e)
{
- return list_exps_uses_exp(exps, exp_relname(e), exp_name(e));
+ return list_exps_uses_exp(exps, e);
}
/*
* Rewrite aggregations over munion all.
@@ -2529,7 +2523,7 @@ rel_distinct_aggregate_on_unique_values(
all_unique &= arg->type == e_column &&
is_unique(arg) && (!is_semantics(exp) || !has_nil(arg));
}
if (!all_unique && exps_card(l) > CARD_ATOM)
- all_unique = exps_unique(v->sql, rel,
l) && (!is_semantics(exp) || !have_nil(l));
+ all_unique = exps_unique(v->sql, rel,
l, true) && (!is_semantics(exp) || !have_nil(l));
if (all_unique) {
set_nodistinct(exp);
v->changes++;
@@ -3257,7 +3251,7 @@ static inline sql_rel *
rel_push_project_down_union(visitor *v, sql_rel *rel)
{
/* first remove distinct if already unique */
- if (rel->op == op_project && need_distinct(rel) && rel->exps &&
exps_unique(v->sql, rel, rel->exps) && !have_nil(rel->exps)) {
+ if (rel->op == op_project && need_distinct(rel) && rel->exps &&
exps_unique(v->sql, rel, rel->exps, true) && !have_nil(rel->exps)) {
set_nodistinct(rel);
if (exps_card(rel->exps) <= CARD_ATOM && rel->card > CARD_ATOM)
{ /* if the projection just contains constants, then no topN is needed */
sql_rel *nl = rel->l = rel_topn(v->sql->sa, rel->l,
append(sa_list(v->sql->sa), exp_atom_lng(v->sql->sa, 1)));
@@ -3296,7 +3290,7 @@ rel_push_project_down_union(visitor *v,
rel_projections(v->sql, r,
NULL, 1, 1));
/* check if we need distinct */
need_distinct &=
- (!exps_unique(v->sql, r, r->exps) ||
have_nil(r->exps));
+ (!exps_unique(v->sql, r, r->exps, true) ||
have_nil(r->exps));
rel_rename_exps(v->sql, u->exps, r->exps);
rel_destroy(v->sql, n->data);
@@ -3665,7 +3659,7 @@ rel_distinct_project2groupby_(visitor *v
/* rewrite distinct project [ pk ] ( select ( table ) [ e op val ])
* into project [ pk ] ( select/semijoin ( table ) */
if (rel->op == op_project && rel->l && !rel->r /* no order by */ &&
need_distinct(rel) &&
- (l->op == op_select || l->op == op_semi) && exps_unique(v->sql,
rel, rel->exps) &&
+ (l->op == op_select || l->op == op_semi) && exps_unique(v->sql,
rel, rel->exps, true) &&
(!have_semantics(l->exps) || !have_nil(rel->exps))) {
set_nodistinct(rel);
v->changes++;
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -1379,9 +1379,8 @@ exps_uses_any(list *exps, list *l)
return false;
for (node *n = l->h; n && !uses_any; n = n->next) {
sql_exp *e = n->data;
- uses_any |= list_exps_uses_exp(exps, exp_relname(e),
exp_name(e)) != NULL;
+ uses_any |= list_exps_uses_exp(exps, e) != NULL;
}
-
return uses_any;
}
diff --git a/sql/server/rel_optimizer_private.h
b/sql/server/rel_optimizer_private.h
--- a/sql/server/rel_optimizer_private.h
+++ b/sql/server/rel_optimizer_private.h
@@ -122,6 +122,6 @@ extern atom *exp_flatten(mvc *sql, bool
extern atom *reduce_scale(mvc *sql, atom *a)
__attribute__((__visibility__("hidden")));
extern int exp_range_overlap(atom *min, atom *max, atom *emin, atom *emax,
bool min_exclusive, bool max_exclusive)
__attribute__((__visibility__("hidden")));
extern int is_numeric_upcast(sql_exp *e)
__attribute__((__visibility__("hidden")));
-extern sql_exp *list_exps_uses_exp(list *exps, const char *rname, const char
*name) __attribute__((__visibility__("hidden")));
+extern sql_exp *list_exps_uses_exp(list *exps, sql_exp *e)
__attribute__((__visibility__("hidden")));
extern sql_exp *exps_uses_exp(list *exps, sql_exp *e)
__attribute__((__visibility__("hidden")));
extern int exp_keyvalue(sql_exp *e) __attribute__((__visibility__("hidden")));
diff --git a/sql/server/rel_rewriter.c b/sql/server/rel_rewriter.c
--- a/sql/server/rel_rewriter.c
+++ b/sql/server/rel_rewriter.c
@@ -504,7 +504,7 @@ kc_column_cmp(sql_kc *kc, sql_column *c)
/* WARNING exps_unique doesn't check for duplicate NULL values */
int
-exps_unique(mvc *sql, sql_rel *rel, list *exps)
+exps_unique(mvc *sql, sql_rel *rel, list *exps, bool unique_nulls)
{
int nr = 0, need_check = 0;
sql_ukey *k = NULL;
@@ -520,6 +520,8 @@ exps_unique(mvc *sql, sql_rel *rel, list
if (!k && (p = find_prop(e->p, PROP_HASHCOL))) /* at
the moment, use only one k */
k = p->value.pval;
}
+ if (unique_nulls && has_nil(e))
+ return 0;
}
if (!need_check) /* all have unique property return */
return 1;
diff --git a/sql/server/rel_rewriter.h b/sql/server/rel_rewriter.h
--- a/sql/server/rel_rewriter.h
+++ b/sql/server/rel_rewriter.h
@@ -48,7 +48,7 @@ extern sql_column *name_find_column(sql_
extern int exp_joins_rels(sql_exp *e, list *rels);
/* WARNING exps_unique doesn't check for duplicate NULL values */
extern int kc_column_cmp(sql_kc *kc, sql_column *c);
-extern int exps_unique(mvc *sql, sql_rel *rel, list *exps);
+extern int exps_unique(mvc *sql, sql_rel *rel, list *exps, bool unique_nulls);
extern sql_column *exp_find_column(sql_rel *rel, sql_exp *exp, int pnr);
diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -1417,7 +1417,7 @@ rel_groupby_order(visitor *v, sql_rel *r
sql_exp **exps = NULL;
if (v->parent && !is_topn(v->parent->op) && !is_sample(v->parent->op) &&
- is_groupby(rel->op) && exps_unique(v->sql, rel,
rel->r)) {
+ is_groupby(rel->op) && exps_unique(v->sql, rel, rel->r,
false)) {
bool found = false;
for(node *n = rel->exps->h; n && !found; n = n->next) {
sql_exp *e = n->data;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -704,13 +704,9 @@ rel_accessing_ad(mvc *sql, sql_rel *rel,
case op_groupby:
case op_project:
lrels = rel_accessing_ad(sql, rel->l, ref, ad);
- if (rel->r) {
- //if (is_groupby(rel->op) ||
is_simple_project(rel->op)) {
- if (exps_accessing_ad(sql, rel->r, ad, &lrels))
{
- lrels = access_append_accessed(sql,
lrels, rel);
- return lrels;
- }
- //}
+ if (rel->r && exps_accessing_ad(sql, rel->r, ad, &lrels)) {
+ lrels = access_append_accessed(sql, lrels, rel);
+ return lrels;
}
if (exps_accessing_ad(sql, rel->exps, ad, &lrels))
lrels = access_append_accessed(sql, lrels, rel);
@@ -2866,7 +2862,6 @@ rewrite_fix_count(visitor *v, sql_rel *r
if (!rel_changes)
return rel;
- //if (r->exps == rexps)
exps = rel_projections(v->sql, r, NULL, 1, 1);
for(node *n = rexps->h, *m = exps->h; n && m;
n=n->next, m=m->next) {
sql_exp *e = n->data, *ne = m->data;
@@ -3426,7 +3421,6 @@ djoin_push_up_project(visitor *v, sql_re
sql_subtype *tp = exp_subtype(e);
if (!tp)
continue;
- //return sql_error(v->sql, 10,
SQLSTATE(42000) "Query projection must have at least one parameter with known
SQL type");
if (!id) {
if (is_select(accessor->op) ||
is_join(accessor->op) ||
is_topn(accessor->op) || is_sample(accessor->op)) {
@@ -3578,7 +3572,6 @@ unnesting_merge(struct unnesting *res, s
res->repr = lun->repr;
if (!res->repr)
res->repr = run->repr;
- //res->repr = list_join(lun->repr, run->repr);
}
}
@@ -3615,12 +3608,11 @@ rewrite_column(visitor *v, sql_exp *e, s
case e_column:
{
sql_exp *ne = repr_find(v, info->repr, e);
- if (ne && ne != e && ne->alias.label < 0) {
+ if (ne && ne != e && ne->alias.label > 0) {
if (e->freevar && e->alias.label == e->nid)
- e->alias.label = ne->alias.label;
+ e->alias = ne->alias;
e->nid = ne->alias.label;
- if (e->freevar)
- e->freevar = 0;
+ e->freevar = 0;
}
}
break;
@@ -3660,6 +3652,19 @@ rewrite_columns_for_join(visitor *v, lis
return rewrite_columns(v, exps, rinfo);
}
+static list *
+add_outers(visitor *v, list *exps, struct unnesting *info, bool partition)
+{
+ list *outers = sa_list(v->sql->sa);
+ for (node *n = info->info->outer_refs->h; n; n = n->next) {
+ sql_exp *exp = repr_find(v, info->repr, n->data);
+ if (partition)
+ set_partitioning(exp);
+ append(outers, exp);
+ }
+ return list_join(outers, exps);
+}
+
static void
rewrite_columns_groupings(visitor *v, sql_rel *rel, struct unnesting *info)
{
@@ -3669,7 +3674,9 @@ rewrite_columns_groupings(visitor *v, sq
list *sets = (list*) found->value.pval;
for(node *n = sets->h; n; n = n->next) {
list *l = n->data;
- for (node *m = l->h; m; m = m ->next) {
+ list *outers = add_outers(v, sa_list(v->sql->sa), info,
false);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]