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]