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]

Reply via email to