Changeset: 2f701323a105 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2f701323a105
Modified Files:
sql/backends/monet5/rel_physical.c
sql/server/rel_exp.c
sql/server/rel_rel.c
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/test/2024/Tests/returning.test
Branch: default
Log Message:
keep uniqueness info better, resulting in less hash tables build
diffs (213 lines):
diff --git a/sql/backends/monet5/rel_physical.c
b/sql/backends/monet5/rel_physical.c
--- a/sql/backends/monet5/rel_physical.c
+++ b/sql/backends/monet5/rel_physical.c
@@ -520,12 +520,20 @@ find_cmp_exps(list **exps_hsh, list **ex
if (exp_is_atom(e->l) || e->flag != cmp_equal ||
exp_is_atom(e->r)) {
assert(0);
} else {
- if (rel_find_exp(rel_hsh, e->r)) {
- append(*exps_hsh, e->r);
+ sql_exp *ne = NULL;
+ if ((ne = rel_find_exp(rel_hsh, e->r)) != NULL) {
+ sql_exp *er = e->r;
+ if (is_unique(ne))
+ set_unique(er);
+ append(*exps_hsh, er);
append(*exps_prb, e->l);
} else {
- assert(rel_find_exp(rel_prb, e->r));
- append(*exps_hsh, e->l);
+ ne = rel_find_exp(rel_hsh, e->l);
+ assert(ne);
+ sql_exp *el = e->l;
+ if (is_unique(ne))
+ set_unique(el);
+ append(*exps_hsh, el);
append(*exps_prb, e->r);
}
}
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -832,10 +832,8 @@ exp_ref_by_label(allocator *sa, sql_exp
set_has_no_nil(e);
if (has_nil(o))
set_has_nil(e);
- /*
if (is_unique(o))
set_unique(e);
- */
if (is_intern(o))
set_intern(e);
if (is_freevar(o) && o->alias.label == o->nid /* only original IU */)
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1469,6 +1469,7 @@ _rel_projections(mvc *sql, sql_rel *rel,
e->card = rel->card;
if (!settname) /* noname use alias */
exp_setname(sql, e,
exp_relname(e), exp_name(e));
+ set_not_unique(e);
}
if (!settname)
list_hash_clear(rel->l);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5769,6 +5769,7 @@ rel_where_groupby_nodes(sql_query *query
for(node *n = gbe->h; n; n = n->next) {
sql_exp *e = n->data;
set_has_nil(e);
+ set_not_unique(e);
}
}
rel = rel_groupby(sql, rel, gbe);
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
@@ -3677,13 +3677,15 @@ rewrite_columns_for_join(visitor *v, lis
}
static list *
-add_outers(visitor *v, list *exps, struct unnesting *info, bool partition)
+add_outers(visitor *v, list *exps, struct unnesting *info, bool partition,
bool reset_unique)
{
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);
+ if (reset_unique)
+ set_not_unique(exp);
append(outers, exp);
}
return list_join(outers, exps);
@@ -3698,7 +3700,7 @@ 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;
- list *outers = add_outers(v, sa_list(v->sql->sa), info,
false);
+ list *outers = add_outers(v, sa_list(v->sql->sa), info,
false, true);
l = list_prepend(l, outers);
for (node *m = l->h->next; m; m = m ->next) {
m->data = rewrite_columns(v, m->data, info);
@@ -3837,7 +3839,7 @@ unnest(visitor *v, sql_rel *parent, sql_
}
sql_rel *d = rel->l = rel_project(v->sql->sa,
rel_dup(info->info->d), rel_projections(v->sql, info->info->d, NULL, 1, 1));
add_outers_repr(v, d, info, true);
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, false);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
return;
@@ -3856,11 +3858,11 @@ unnest(visitor *v, sql_rel *parent, sql_
sql_exp *aexp = n->data;
n->data = aexp = exp_rewrite(v->sql, rel, aexp,
info->info->outer_refs);
}
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, false);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
if (rel->r) {
- rel->r = add_outers(v, rel->r, info, true);
+ rel->r = add_outers(v, rel->r, info, true, false);
rel->r = rewrite_columns(v, rel->r, info);
}
} else if (is_topn(rel->op) || is_sample(rel->op)) {
@@ -3869,7 +3871,7 @@ unnest(visitor *v, sql_rel *parent, sql_
sql_rel *or = rel->l;
assert(is_simple_project(or->op));
if (!or->r)
- or->r = add_outers(v, or->r, info, true);
+ or->r = add_outers(v, or->r, info, true, false);
}
rel->grouped = 1;
} else if (is_munion(rel->op) && is_recursive(rel)) {
@@ -3886,7 +3888,7 @@ unnest(visitor *v, sql_rel *parent, sql_
if (add_base) /* make sure we unnest up till the base */
append(iter_acc, base);
unnest(v, rel, iter, info, iter_acc);
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, true);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
} else if (is_munion(rel->op)) {
@@ -3902,7 +3904,7 @@ unnest(visitor *v, sql_rel *parent, sql_
rel_update_subrel(rel, inner, ninner);
}
}
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, true);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
} else if (is_set(rel->op)) {
@@ -3911,15 +3913,15 @@ unnest(visitor *v, sql_rel *parent, sql_
info->repr = NULL;
list *racc = accessing(v, rel->r, acc);
unnest(v, rel, rel->r, info, racc);
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, true);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
} else if (is_groupby(rel->op)) {
bool no_groups = !rel->r; /* or for cubes if groupingsets has
empty case */
unnest(v, rel, rel->l, info, acc);
- list *gexps = rel->r = add_outers(v, rel->r, info, false);
+ list *gexps = rel->r = add_outers(v, rel->r, info, false,
false);
gexps = rel->r = rewrite_columns(v, rel->r, info);
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, false);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
if (rel->p)
@@ -3978,9 +3980,9 @@ unnest(visitor *v, sql_rel *parent, sql_
unnest(v, rel, rel->l, info, acc);
sql_exp *tfe = rel->r;
list *ops = tfe->l;
- ops = add_outers(v, ops, info, false);
+ ops = add_outers(v, ops, info, false, false);
tfe->l = ops = rewrite_columns(v, ops, info);
- rel->exps = add_outers(v, rel->exps, info, false);
+ rel->exps = add_outers(v, rel->exps, info, false, false);
rel->nr_outers = list_length(info->info->outer_refs);
rel->exps = rewrite_columns(v, rel->exps, info);
}
@@ -4091,7 +4093,7 @@ rel_djoin_elim(visitor *v, sql_rel *prel
if (changed_maps && parent) {
sql_rel *p = changed_maps;
while(p && p->op == op_project) {
- p->exps = add_outers(v, p->exps, parent, false);
+ p->exps = add_outers(v, p->exps, parent, false, false);
p->nr_outers = list_length(parent->info->outer_refs);
p->exps = rewrite_columns(v, p->exps, parent);
assert(!p->r);
diff --git a/sql/test/2024/Tests/returning.test
b/sql/test/2024/Tests/returning.test
--- a/sql/test/2024/Tests/returning.test
+++ b/sql/test/2024/Tests/returning.test
@@ -195,7 +195,7 @@ select (
) [ ] [ "sys"."sum" no nil ("foo"."i" NOT NULL UNIQUE MIN "1" MAX "3"
NUNIQUES 3.000000) UNIQUE NUNIQUES 1.000000 as "%1"."%1" ] COUNT 1
) [ "%1"."%1" UNIQUE NUNIQUES 1.000000 ] COUNT 1')
----
-@ REF 1 (2)@table("sys"."foo") [ "foo"."i" NOT NULL UNIQUE, "foo"."j" NOT NULL
UNIQUE, "foo"."%TID%" NOT NULL UNIQUE ]@project (@group by (@update(@& REF 1
@project (@select (@& REF 1 @) [ ("foo"."j" NOT NULL UNIQUE) > (int(5) "10")
]@) [ "foo"."%TID%" NOT NULL UNIQUE, "sys"."sql_neg"("foo"."j" NOT NULL UNIQUE)
NOT NULL as "foo"."j" ]@) [ "foo"."%TID%" NOT NULL UNIQUE, "foo"."j" NOT NULL
]@) [ ] [ "sys"."sum" no nil ("foo"."i" NOT NULL UNIQUE) UNIQUE as "%1"."%1"
]@) [ "%1"."%1" UNIQUE ]
+@ REF 1 (2)@table("sys"."foo") [ "foo"."i" NOT NULL UNIQUE, "foo"."j" NOT NULL
UNIQUE, "foo"."%TID%" NOT NULL UNIQUE ]@project (@group by (@update(@& REF 1
@project (@select (@& REF 1 @) [ ("foo"."j" NOT NULL UNIQUE) > (int(5) "10")
]@) [ "foo"."%TID%" NOT NULL UNIQUE, "sys"."sql_neg"("foo"."j" NOT NULL UNIQUE)
NOT NULL as "foo"."j" ]@) [ "foo"."%TID%" NOT NULL UNIQUE, "foo"."j" NOT NULL
UNIQUE ]@) [ ] [ "sys"."sum" no nil ("foo"."i" NOT NULL UNIQUE) UNIQUE as
"%1"."%1" ]@) [ "%1"."%1" UNIQUE ]
# delete from foo where j > 10 returning sum(i)
query T nosort
@@ -227,7 +227,7 @@ table("sys"."foo") [ "foo"."i" NOT NULL
)
) [ "foo"."i" NOT NULL NUNIQUES 3.000000 MAX "3" MIN "1" ]')
----
-@project (@insert(@table("sys"."foo") [ "foo"."i" NOT NULL, "foo"."j" NOT
NULL, "foo"."%TID%" NOT NULL UNIQUE ]@ [ [ int(31) NULL, int(31) NULL ] as
"%4"."%4", [ int(31) "40", int(31) "50" ] as "%1"."%1" ]@) [ "%4"."%4" as
"foo"."i", "%1"."%1" as "foo"."j" ]@) [ "foo"."i" NOT NULL ]
+@project (@insert(@table("sys"."foo") [ "foo"."i" NOT NULL UNIQUE, "foo"."j"
NOT NULL, "foo"."%TID%" NOT NULL UNIQUE ]@ [ [ int(31) NULL, int(31) NULL ] as
"%4"."%4", [ int(31) "40", int(31) "50" ] as "%1"."%1" ]@) [ "%4"."%4" as
"foo"."i", "%1"."%1" as "foo"."j" ]@) [ "foo"."i" NOT NULL UNIQUE ]
# update foo set j = -j where j > 10 returning i
query T nosort
@@ -245,7 +245,7 @@ select (
) [ "foo"."%TID%" NOT NULL UNIQUE, "foo"."j" NOT NULL ]
) [ "foo"."i" NOT NULL UNIQUE MIN "1" MAX "3" NUNIQUES 3.000000 ]')
----
-@ REF 1 (2)@table("sys"."foo") [ "foo"."i" NOT NULL UNIQUE, "foo"."j" NOT NULL
UNIQUE, "foo"."%TID%" NOT NULL UNIQUE ]@project (@update(@& REF 1 @project
(@select (@& REF 1 @) [ ("foo"."j" NOT NULL UNIQUE) > (int(5) "10") ]@) [
"foo"."%TID%" NOT NULL UNIQUE, "sys"."sql_neg"("foo"."j" NOT NULL UNIQUE) NOT
NULL as "foo"."j" ]@) [ "foo"."%TID%" NOT NULL UNIQUE, "foo"."j" NOT NULL ]@) [
"foo"."i" NOT NULL UNIQUE ]
+@ REF 1 (2)@table("sys"."foo") [ "foo"."i" NOT NULL UNIQUE, "foo"."j" NOT NULL
UNIQUE, "foo"."%TID%" NOT NULL UNIQUE ]@project (@update(@& REF 1 @project
(@select (@& REF 1 @) [ ("foo"."j" NOT NULL UNIQUE) > (int(5) "10") ]@) [
"foo"."%TID%" NOT NULL UNIQUE, "sys"."sql_neg"("foo"."j" NOT NULL UNIQUE) NOT
NULL as "foo"."j" ]@) [ "foo"."%TID%" NOT NULL UNIQUE, "foo"."j" NOT NULL
UNIQUE ]@) [ "foo"."i" NOT NULL UNIQUE ]
# delete from foo where j > 10 returning i
query T nosort
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]