Changeset: 1f349dbdd4b0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1f349dbdd4b0
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/rel_physical.c
sql/backends/monet5/rel_util.c
sql/backends/monet5/sql_pp_statement.c
Branch: manti
Log Message:
merged from default
diffs (truncated from 821 to 300 lines):
diff --git a/ctest/cmake/set-dir-vars.cmake b/ctest/cmake/set-dir-vars.cmake
--- a/ctest/cmake/set-dir-vars.cmake
+++ b/ctest/cmake/set-dir-vars.cmake
@@ -11,12 +11,9 @@
# Test for the existence of these cmake variables, the source code assumes
# that they are set by the buildsystem.
-assert_variable_exists(DIR_SEP)
assert_variable_exists(PKGCONFIGDIR)
assert_variable_exists(BINDIR)
assert_variable_exists(LOCALSTATEDIR)
-assert_variable_exists(DIR_SEP_STR)
-assert_variable_exists(PATH_SEP)
assert_variable_exists(SO_PREFIX)
assert_variable_exists(SO_EXT)
assert_variable_exists(LIBDIR)
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -164,7 +164,11 @@ HEAPalloc(Heap *h, size_t nitems, size_t
size_t allocated;
if (GDKinmemory(h->farmid) ||
((allocated = GDKmem_cursize()) + h->size < GDK_mem_maxsize &&
- h->size < (h->role == PERSISTENT ? GDK_mmap_minsize_persistent :
GDK_mmap_minsize_transient) &&
+ h->size < (h->role == PERSISTENT
+ ? GDK_mmap_minsize_persistent
+ : (h->role == TEMPFARM
+ ? GDK_mmap_minsize_temporary
+ : GDK_mmap_minsize_transient)) &&
h->size < ((GDK_mem_maxsize - allocated) >> 6))) {
h->storage = STORE_MEM;
size = h->size;
@@ -307,7 +311,11 @@ HEAPextend(Heap *h, size_t size)
size_t allocated;
bool must_mmap = (!GDKinmemory(h->farmid) &&
((allocated = GDKmem_cursize()) + size >=
GDK_mem_maxsize ||
- size >= (h->role == PERSISTENT ?
GDK_mmap_minsize_persistent : GDK_mmap_minsize_transient) ||
+ size >= (h->role == PERSISTENT
+ ? GDK_mmap_minsize_persistent
+ : (h->role == TEMPFARM
+ ? GDK_mmap_minsize_temporary
+ : GDK_mmap_minsize_transient))
||
size >= ((GDK_mem_maxsize - allocated) >>
6)));
h->size = size;
@@ -706,7 +714,9 @@ HEAPload(Heap *h, const char *nme, const
size_t allocated;
h->storage = h->size < (h->role == PERSISTENT
? GDK_mmap_minsize_persistent
- : GDK_mmap_minsize_transient) &&
+ : (h->role == TEMPFARM
+ ? GDK_mmap_minsize_temporary
+ : GDK_mmap_minsize_transient)) &&
(allocated = GDKmem_cursize()) < GDK_mem_maxsize &&
h->size < ((GDK_mem_maxsize - allocated) >> 6) ?
STORE_MEM : STORE_MMAP;
}
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -439,6 +439,7 @@ extern struct BBPfarm_t {
extern batlock_t GDKbatLock[BBP_BATMASK + 1] ATTR_VISIBILITY_HIDDEN;
extern size_t GDK_mmap_minsize_persistent ATTR_VISIBILITY_HIDDEN; /* size
after which we use memory mapped files for persistent heaps */
extern size_t GDK_mmap_minsize_transient ATTR_VISIBILITY_HIDDEN; /* size after
which we use memory mapped files for transient heaps */
+extern size_t GDK_mmap_minsize_temporary ATTR_VISIBILITY_HIDDEN; /* size after
which we use memory mapped files for temporary heaps */
extern size_t GDK_mmap_pagesize ATTR_VISIBILITY_HIDDEN; /* mmap granularity */
#define BATcheck(tst, err) \
diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c
--- a/gdk/gdk_utils.c
+++ b/gdk/gdk_utils.c
@@ -430,6 +430,7 @@ BATSIGinit(void)
#define MMAP_PAGESIZE ((size_t) 1 << 16)
size_t GDK_mmap_minsize_persistent = MMAP_MINSIZE_PERSISTENT;
size_t GDK_mmap_minsize_transient = MMAP_MINSIZE_TRANSIENT;
+size_t GDK_mmap_minsize_temporary = MMAP_MINSIZE_TRANSIENT;
size_t GDK_mmap_pagesize = MMAP_PAGESIZE; /* mmap granularity */
size_t GDK_mem_maxsize = GDK_VM_MAXSIZE;
size_t GDK_vm_maxsize = GDK_VM_MAXSIZE;
@@ -1142,6 +1143,16 @@ GDKinit(opt *set, int setlen, bool embed
return GDK_FAIL;
}
}
+ GDK_mmap_minsize_temporary = GDK_mmap_minsize_transient;
+ p = mo_find_option(set, setlen, "gdk_mmap_minsize_temporary");
+ if (p) {
+ char *e;
+ GDK_mmap_minsize_temporary = (size_t) strtoll(p, &e, 10);
+ if (e && *e) {
+ TRC_CRITICAL(GDK, "gdk_mmap_minsize_temporary must be
an integer");
+ return GDK_FAIL;
+ }
+ }
p = mo_find_option(set, setlen, "gdk_mmap_pagesize");
if (p) {
char *e;
@@ -1278,6 +1289,13 @@ GDKinit(opt *set, int setlen, bool embed
return GDK_FAIL;
}
}
+ if (GDKgetenv("gdk_mmap_minsize_temporary") == NULL) {
+ snprintf(buf, sizeof(buf), "%zu", GDK_mmap_minsize_temporary);
+ if (GDKsetenv("gdk_mmap_minsize_temporary", buf) !=
GDK_SUCCEED) {
+ TRC_CRITICAL(GDK, "GDKsetenv gdk_mmap_minsize_temporary
failed");
+ return GDK_FAIL;
+ }
+ }
if (GDKgetenv("gdk_mmap_pagesize") == NULL) {
snprintf(buf, sizeof(buf), "%zu", GDK_mmap_pagesize);
if (GDKsetenv("gdk_mmap_pagesize", buf) != GDK_SUCCEED) {
@@ -1411,6 +1429,7 @@ GDKreset(int status)
if (GDK_mmap_minsize_persistent >
GDK_mmap_minsize_transient)
GDK_mmap_minsize_persistent =
GDK_mmap_minsize_transient;
}
+ GDK_mmap_minsize_temporary = GDK_mmap_minsize_transient;
GDKnr_threads = 0;
GDKL3_size = 0;
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -8279,7 +8279,7 @@ exp_remap(sql_exp *le, sql_exp *re, list
case e_column:
if (exp_pair_match(remapped, le->nid, re->nid))
return 0;
- break;
+ return -1;
case e_convert:
ll = le->r;
rl = re->r;
@@ -8385,8 +8385,7 @@ deduplicate_refs(mvc *sql, allocator *ta
for(node *n = refs->h; n; n = n->next) {
sql_rel *or = n->data, *nr = or;
prop *op = find_prop(or->p, PROP_HASH);
- if (or->op == op_buildhash &&
- op && op->value.lval) {
+ if (or->op == op_buildhash && op && op->value.lval) {
BUN h = op->value.lval;
for(node *m = prefs->h; m; m = m->next->next) {
sql_rel *ir = m->data;
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
@@ -504,8 +504,10 @@ find_cmp_exps(list **exps_hsh, list **ex
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);
+ */
if (any)
set_any(er);
if (semantic)
@@ -516,8 +518,10 @@ find_cmp_exps(list **exps_hsh, list **ex
ne = rel_find_exp(rel_hsh, e->l);
assert(ne);
sql_exp *el = e->l;
+ /*
if (is_unique(ne))
set_unique(el);
+ */
if (any)
set_any(el);
if (semantic)
diff --git a/sql/backends/monet5/rel_util.c b/sql/backends/monet5/rel_util.c
--- a/sql/backends/monet5/rel_util.c
+++ b/sql/backends/monet5/rel_util.c
@@ -90,6 +90,7 @@ split_join_exps(sql_rel *rel, list *join
{
bool found = 0;
if (!list_empty(rel->exps)) {
+ bool done = false;
for (node *n = rel->exps->h; n; n = n->next) {
sql_exp *e = n->data;
@@ -100,9 +101,12 @@ split_join_exps(sql_rel *rel, list *join
* TRUE: add only the first joinable `e` to
`joinable` (used by marked-manti-join)
* FALSE: add all joinable `e` to `joinable`
*/
- if (!found && can_join_exp(rel, e, anti) && (!eqonly ||
(is_equi_exp_(e) && !exp_is_atom(e->r) && !exp_is_atom(e->l)))) {
+ if (!found && !done && (can_join_exp(rel, e, anti) &&
(!eqonly || (is_equi_exp_(e) && !exp_is_atom(e->r) && !exp_is_atom(e->l))))) {
append(joinable, e);
found = firstonly;
+ sql_exp *el = e->l, *er = e->r;
+ if (eqonly && is_innerjoin(rel->op) &&
(is_unique(el) || is_unique(er)))
+ done = true;
} else {
append(not_joinable, e);
}
diff --git a/sql/backends/monet5/sql_pp_statement.c
b/sql/backends/monet5/sql_pp_statement.c
--- a/sql/backends/monet5/sql_pp_statement.c
+++ b/sql/backends/monet5/sql_pp_statement.c
@@ -567,6 +567,11 @@ stmt_oahash_probe(backend *be, stmt *key
q = pushArgument(be->mb, q, getArg(prev->q, 0));
q = pushArgument(be->mb, q, getArg(prev->q, 1));
}
+ /*
+ sql_subtype *htype = tail_type(rhs_ht);
+ sql_subtype *ptype = tail_type(key);
+ assert(subtype_cmp(htype, ptype) == 0);
+ */
q = pushArgument(be->mb, q, rhs_ht->nr);
if (single) {
assert(freq);
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -351,11 +351,12 @@ typedef struct relation {
*/
int nrcols; /* nr of cols */
unsigned int
- flag:16,
card:2, /* 0, 1 (row), 2 aggr, 3 */
dependent:1, /* dependent join */
distinct:1,
fv_distinct:1, /* set during general unnest */
+ lunique:1, /* left side of join unique */
+ runique:1, /* right side of join unique */
processed:1, /* fully processed or still in the process of building
*/
outer:1, /* used as outer (ungrouped) */
grouped:1, /* groupby processed all the group by exps */
@@ -374,6 +375,7 @@ typedef struct relation {
* Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so
a relation is not modified twice
* The list is kept at rel_optimizer_private.h Please update it
accordingly
*/
+ uint16_t flag;
uint16_t used;
uint16_t nr_outers;
int opt;
diff --git a/sql/rel.txt b/sql/rel.txt
--- a/sql/rel.txt
+++ b/sql/rel.txt
@@ -171,7 +171,7 @@ e_cmp
cmp_left = 15, /* special case equi
join, keep left order */
cmp_left_project = 16 /* last step of outer join */
)
- -> bool semantics (is null handling), any (in handling)
+ -> bool semantics (is null handling, indicated with a '*'), any (in
handling, indicated with a '+')
e_func
e_aggr
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
@@ -381,7 +381,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
mnstr_printf(fout, " NULLS LAST");
if (e->type != e_atom && e->type != e_cmp && !has_nil(e))
mnstr_printf(fout, " NOT NULL");
- if (e->type != e_atom && e->type != e_cmp && is_unique(e))
+ if (e->type != e_atom && (sql->show_all_details || e->type !=
e_cmp) && is_unique(e))
mnstr_printf(fout, " UNIQUE");
/* don't show properties on value lists */
if (decorate && e->p && e->type != e_atom && !exp_is_atom(e)) {
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
@@ -176,7 +176,7 @@ exp_compare(allocator *sa, sql_exp *l, s
e->l = l;
e->r = r;
e->flag = cmptype;
- if (cmptype == cmp_equal) {
+ if (cmptype == cmp_equal && r->card <= CARD_AGGR) {
prop *p = e->p = prop_create(sa, PROP_NUNIQUES, (prop *) e->p);
p->value.dval = 1;
}
@@ -197,7 +197,7 @@ exp_compare2(allocator *sa, sql_exp *l,
e->r = r;
e->f = f;
e->flag = cmptype;
- if (cmptype == cmp_equal) {
+ if (cmptype == cmp_equal && r->card <= CARD_AGGR) {
prop *p = e->p = prop_create(sa, PROP_NUNIQUES, (prop *) e->p);
p->value.dval = 1;
}
@@ -4419,6 +4419,10 @@ exp_estimate_selectivity(mvc *sql, sql_e
case cmp_lt:
case cmp_lte:
sel = 0.50;
+ /*
+ if (e->f)
+ sel = 0.10;
+ */
break;
case cmp_in:
case cmp_notin: {
diff --git a/sql/server/rel_optimize_join.c b/sql/server/rel_optimize_join.c
--- a/sql/server/rel_optimize_join.c
+++ b/sql/server/rel_optimize_join.c
@@ -115,12 +115,14 @@ rel_estimate(visitor *v, sql_rel *rel)
/* Don't prune updates as pruning will possibly result in removing the
joins which therefore cannot be used for constraint checking */
sql_rel *l = rel->l, *r = rel->r;
+ /*
if (is_join(rel->op) || is_semi(rel->op)) {
rel->l = rel_estimate(v, rel->l);
rel->r = rel_estimate(v, rel->r);
}
if (is_join(rel->op))
rel->exps = exps_exp_visitor_bottomup(v, rel, rel->exps, 0,
&rel_propagate_statistics, false);
+ */
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]