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]

Reply via email to