Changeset: 26a855a9c6f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/26a855a9c6f0
Modified Files:
        sql/server/rel_basetable.c
        sql/server/rel_dump.c
        sql/server/rel_prop.c
        sql/server/rel_prop.h
        sql/server/rel_unnest.c
Branch: Dec2025
Log Message:

keep a UKEY property on the base relation. This allows for easier detection of
distinct sets of free vars.


diffs (111 lines):

diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -533,6 +533,21 @@ rewrite_basetable(mvc *sql, sql_rel *rel
                        e->alias.label = e->nid;
                        append(rel->exps, e);
                }
+               if (t->pkey) {
+                       p = prop_create(sql->sa, PROP_UKEY, rel->p);
+                       list *exps = p->value.pval = sa_list(sql->sa);
+                       for(node *n = t->pkey->k.columns->h; n; n = n->next) {
+                               sql_kc *c = n->data;
+                               sql_exp *e = exps_bind_column2(rel->exps, 
atname, c->c->base.name, NULL);
+                               if (!e) {
+                                       p = NULL;
+                                       break;
+                               }
+                               append(exps, e);
+                       }
+                       if (p)
+                               rel->p = p;
+               }
        }
        return rel;
 }
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
@@ -744,7 +744,7 @@ rel_print_rel(mvc *sql, stream  *fout, s
        }
        if (sql->show_details && decorate && rel->p) {
                for (prop *p = rel->p; p; p = p->p) {
-                       if (p->kind != PROP_COUNT || (ATOMIC_GET(&GDKdebug) & 
TESTINGMASK) == 0) {
+                       if ((p->kind != PROP_COUNT && p->kind != PROP_UKEY) || 
(ATOMIC_GET(&GDKdebug) & TESTINGMASK) == 0) {
                                char *pv = propvalue2string(sql->ta, p);
                                mnstr_printf(fout, " %s %s", 
propkind2string(p), pv);
                        }
diff --git a/sql/server/rel_prop.c b/sql/server/rel_prop.c
--- a/sql/server/rel_prop.c
+++ b/sql/server/rel_prop.c
@@ -12,6 +12,7 @@
 
 #include "monetdb_config.h"
 #include "sql_catalog.h"
+#include "sql_relation.h"
 #include "rel_prop.h"
 #include "sql_string.h"
 
@@ -108,6 +109,7 @@ propkind2string( prop *p)
 #define PT(TYPE) case PROP_##TYPE : return #TYPE
                PT(COUNT);
                PT(NUNIQUES);
+               PT(UKEY);
                PT(JOINIDX);
                PT(HASHIDX);
                PT(HASHCOL);
@@ -134,6 +136,18 @@ propvalue2string(allocator *sa, prop *p)
                snprintf(buf, sizeof(buf), "%f", p->value.dval);
                return ma_strdup(sa, buf);
        }
+       case PROP_UKEY: {
+               list *exps = p->value.pval;
+               size_t offset = 0;
+
+               offset += snprintf(buf + offset, BUFSIZ, "[ ");
+               for(node *n = exps->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+                       offset += snprintf(buf + offset, BUFSIZ, "%s.%s ", 
e->alias.rname, e->alias.name);
+               }
+               offset += snprintf(buf + offset, BUFSIZ, "]");
+               return ma_strdup(sa, buf);
+       } break;
        case PROP_JOINIDX: {
                sql_idx *i = p->value.pval;
 
diff --git a/sql/server/rel_prop.h b/sql/server/rel_prop.h
--- a/sql/server/rel_prop.h
+++ b/sql/server/rel_prop.h
@@ -21,6 +21,7 @@ typedef enum rel_prop {
        PROP_JOINIDX,   /* could use join idx */
        PROP_HASHIDX,   /* is hash idx */
        PROP_HASHCOL,   /* could use hash idx */
+       PROP_UKEY,              /* p = list of exps */
        PROP_REMOTE,    /* uri for remote execution */
        PROP_USED,      /* number of times exp is used */
        PROP_GROUPINGS  /* used by ROLLUP/CUBE/GROUPING SETS, value contains 
the list of sets */
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
@@ -82,6 +82,11 @@ is_distinct_set(mvc *sql, sql_rel *rel, 
        distinct = need_distinct(rel);
        if (is_project(rel->op) && rel->l && !distinct)
                distinct = is_distinct_set(sql, rel->l, ad);
+       if (is_semi(rel->op))
+               distinct = is_distinct_set(sql, rel->l, ad);
+       prop *p = NULL;
+       if (is_base(rel->op) && (p = find_prop(rel->p, PROP_UKEY)) != NULL)
+               return exp_match_list(p->value.pval, ad);
        return distinct;
 }
 
@@ -1726,7 +1731,8 @@ push_up_munion(mvc *sql, sql_rel *rel, l
                        ns->exps = exps_copy(sql, s->exps);
                        set_processed(ns);
                        if (single || is_single(s))
-                               set_single(ns);
+                               if (!need_distinct(s))
+                                       set_single(ns);
                        if (need_distinct || need_distinct(s))
                                set_distinct(ns);
                        if (is_recursive(s))
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to