Changeset: 019c9ae2e4a3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/019c9ae2e4a3
Branch: default
Log Message:

merge


diffs (truncated from 2540 to 300 lines):

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -754,3 +754,4 @@ 97e76b882f9fb28327393d21708fb22f2f6c22f1
 f458e1c71c73d6bd9636369c1406eadb74f016bf Jan2022_9
 f458e1c71c73d6bd9636369c1406eadb74f016bf Jan2022_SP1_release
 00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_15
+00463fdd0d51d7ce058549a82bc74efaea6035a2 Jul2021_SP3_release
diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c
--- a/common/utils/msabaoth.c
+++ b/common/utils/msabaoth.c
@@ -612,14 +612,26 @@ msab_pickSecret(char **generated_secret)
                }
        }
 #else
-       (void)bin_secret;
-       if (generated_secret)
-               // do not return an error, just continue without a secret
-               *generated_secret = NULL;
-       free(secret);
-       return NULL;
+       int rfd = open("/dev/urandom", O_RDONLY);
+       if (rfd >= 0) {
+               ssize_t nr;
+               for (size_t n = 0; n < sizeof(bin_secret); n += nr) {
+                       nr = read(rfd, bin_secret + n, sizeof(bin_secret) - n);
+                       if (nr < 0) {
+                               free(secret);
+                               return strdup("reading /dev/urandom failed");
+                       }
+               }
+               close(rfd);
+       } else {
+               (void)bin_secret;
+               if (generated_secret)
+                       // do not return an error, just continue without a 
secret
+                       *generated_secret = NULL;
+               free(secret);
+               return NULL;
+       }
 #endif
-#if defined(HAVE_GETENTROPY) || defined(HAVE_RAND_S)
        int fd;
        FILE *f;
        for (size_t i = 0; i < sizeof(bin_secret); i++) {
@@ -659,7 +671,6 @@ msab_pickSecret(char **generated_secret)
        else
                free(secret);
        return NULL;
-#endif
 }
 
 /**
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -775,6 +775,8 @@ typedef struct BAT {
         batTransient:1;        /* should the BAT persist on disk? */
        uint8_t /* adjacent bit fields are packed together (if they fit) */
         batRestricted:2;       /* access privileges */
+       uint16_t /* adjacent bit fields are packed together (if they fit) */
+        selcnt:10;             /* how often used in equi select without hash */
        role_t batRole;         /* role of the bat */
        uint16_t unused;        /* value=0 for now (sneakily used by mat.c) */
        int batSharecnt;        /* incoming view count */
diff --git a/gdk/gdk_calc_convert.c b/gdk/gdk_calc_convert.c
--- a/gdk/gdk_calc_convert.c
+++ b/gdk/gdk_calc_convert.c
@@ -443,7 +443,7 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
                                dst[i] = TYPE2##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
-                               long double m = (long double) v * mul;  \
+                               ldouble m = (ldouble) v * mul;          \
                                dst[i] = (TYPE2) rounddbl(m);           \
                                if ((is_##TYPE2##_nil(dst[i]) ||        \
                                     (precision &&                      \
@@ -467,7 +467,7 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
                                dst[i] = TYPE2##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
-                               long double m = (long double) v * mul;  \
+                               ldouble m = (ldouble) v * mul;          \
                                dst[i] = (TYPE2) rounddbl(m);           \
                                if ((is_##TYPE2##_nil(dst[i]) ||        \
                                     (precision &&                      \
diff --git a/gdk/gdk_calc_muldiv.c b/gdk/gdk_calc_muldiv.c
--- a/gdk/gdk_calc_muldiv.c
+++ b/gdk/gdk_calc_muldiv.c
@@ -360,7 +360,7 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(                            
        \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
-                               long double m = lft[i] * (long double) rgt[j]; \
+                               ldouble m = lft[i] * (ldouble) rgt[j];  \
                                dst[k] = (TYPE3) rounddbl(m);           \
                        }                                               \
                }                                                       \
@@ -382,7 +382,7 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(                            
        \
                                dst[k] = TYPE3##_nil;                   \
                                nils++;                                 \
                        } else {                                        \
-                               long double m = lft[i] * (long double) rgt[j]; \
+                               ldouble m = lft[i] * (ldouble) rgt[j];  \
                                dst[k] = (TYPE3) rounddbl(m);           \
                        }                                               \
                }                                                       \
@@ -2674,7 +2674,7 @@ div_##TYPE1##_##TYPE2##_##TYPE3(                          
        \
                                        dst[k] = TYPE3##_nil;           \
                                        nils++;                         \
                                } else {                                \
-                                       dst[k] = (TYPE3) rounddbl(lft[i] / 
(long double) rgt[j]); \
+                                       dst[k] = (TYPE3) rounddbl(lft[i] / 
(ldouble) rgt[j]); \
                                }                                       \
                        }                                               \
                }                                                       \
@@ -2704,7 +2704,7 @@ div_##TYPE1##_##TYPE2##_##TYPE3(                          
        \
                                        dst[k] = TYPE3##_nil;           \
                                        nils++;                         \
                                } else {                                \
-                                       dst[k] = (TYPE3) rounddbl(lft[i] / 
(long double) rgt[j]); \
+                                       dst[k] = (TYPE3) rounddbl(lft[i] / 
(ldouble) rgt[j]); \
                                }                                       \
                        }                                               \
                }                                                       \
diff --git a/gdk/gdk_calc_private.h b/gdk/gdk_calc_private.h
--- a/gdk/gdk_calc_private.h
+++ b/gdk/gdk_calc_private.h
@@ -651,8 +651,28 @@ BUN dofsum(const void *restrict values, 
                }                                                       \
        } while (0)
 
+#if defined(_MSC_VER) && defined(__INTEL_COMPILER)
+/* with Intel compiler on Windows, avoid using roundl and llroundl: they
+ * cause a mysterious crash; long double is the same size as double
+ * anyway */
+typedef double ldouble;
 #ifdef TRUNCATE_NUMBERS
 #define rounddbl(x)    (x)
 #else
+#define rounddbl(x)    round(x)
+#endif
+#else
+typedef long double ldouble;
+#ifdef TRUNCATE_NUMBERS
+#define rounddbl(x)    (x)
+#else
+#ifdef HAVE_HGE
+/* can't round to hge via lng since we might loose significant bits, so
+ * just keep it long double */
 #define rounddbl(x)    roundl(x)
+#else
+/* round long double to long long int in one go */
+#define rounddbl(x)    llroundl(x)
 #endif
+#endif
+#endif
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1603,6 +1603,14 @@ BATselect(BAT *b, BAT *s, const void *tl
                        (!b->batTransient &&
                         ATOMsize(b->ttype) >= sizeof(BUN) / 4 &&
                         BATcount(b) * (ATOMsize(b->ttype) + 2 * sizeof(BUN)) < 
GDK_mem_maxsize / 2);
+               if (!wanthash) {
+                       MT_lock_set(&b->theaplock);
+                       if (++b->selcnt > 1000) {
+                               wanthash = true;
+                               b->selcnt = 1000; /* limit value */
+                       }
+                       MT_lock_unset(&b->theaplock);
+               }
                if (wanthash && !havehash) {
                        MT_lock_set(&b->theaplock);
                        if (b->tunique_est != 0 &&
@@ -1624,7 +1632,7 @@ BATselect(BAT *b, BAT *s, const void *tl
                 * to do a binary search on the candidate list (or 1
                 * if no need for search)) */
                tmp = BBP_cache(parent);
-               if (tmp && BATcheckhash(tmp)) {
+               if (BATcheckhash(tmp)) {
                        MT_rwlock_rdlock(&tmp->thashlock);
                        phash = tmp->thash != NULL &&
                                (BATcount(tmp) == BATcount(b) ||
@@ -1637,8 +1645,17 @@ BATselect(BAT *b, BAT *s, const void *tl
                }
                /* create a hash on the parent bat (and use it) if it is
                 * the same size as the view and it is persistent */
+               bool wantphash = false;
+               if (!phash) {
+                       MT_lock_set(&tmp->theaplock);
+                       if (++tmp->selcnt > 1000) {
+                               wantphash = true;
+                               tmp->selcnt = 1000;
+                       }
+                       MT_lock_unset(&tmp->theaplock);
+               }
                if (!phash &&
-                   !tmp->batTransient &&
+                   (!tmp->batTransient || wantphash) &&
                    BATcount(tmp) == BATcount(b) &&
                    BAThash(tmp) == GDK_SUCCEED) {
                        MT_rwlock_rdlock(&tmp->thashlock);
@@ -1885,7 +1902,17 @@ BATselect(BAT *b, BAT *s, const void *tl
        assert(oidxh == NULL);
        /* upper limit for result size */
        maximum = ci.ncand;
-       if (b->tkey) {
+       if (equi && havehash) {
+               /* we can look in the hash struct to see whether all
+                * values are distinct and set estimate accordingly */
+               if (phash) {
+                       BAT *tmp = BBP_cache(parent);
+                       if (tmp->thash->nunique == tmp->batCount)
+                               estimate = 1;
+               } else if (b->thash->nunique == b->batCount)
+                       estimate = 1;
+       }
+       if (estimate == BUN_NONE && (b->tkey || (parent != 0 && 
BBP_cache(parent)->tkey))) {
                /* exact result size in special cases */
                if (equi) {
                        estimate = 1;
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
@@ -1149,9 +1149,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                                list_append(l, const_column(be, 
(stmt*)n->data));
                                        r = stmt_list(be, l);
                                } else if (r->type == st_table && e->card == 
CARD_ATOM) { /* fetch value */
-                                       sql_rel *ll = (sql_rel*) l->l;
                                        r = lst->op4.lval->h->data;
-                                       if (!r->aggr && lastexp(ll)->card > 
CARD_ATOM) /* if the cardinality is atom, no fetch call needed */
+                                       if (!r->aggr) /* if the cardinality is 
atom, no fetch call needed */
                                                r = stmt_fetch(be, r);
                                }
                                if (r->type == st_list)
@@ -1204,6 +1203,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        stmt *cond = exp_bin(be, e->l, left, right, grp, ext, 
cnt, sel, 0, 0, push);
                        if (!cond)
                                return NULL;
+                       if (cond->nrcols)
+                               cond = stmt_fetch(be, cond);
                        return stmt_exception(be, cond, (const char *) e->r, 0);
                }
                break;
@@ -2175,7 +2176,6 @@ rel2bin_table(backend *be, sql_rel *rel,
        } else if (rel->l) { /* handle sub query via function */
                int i;
                char name[16], *nme;
-               sql_rel *fr;
 
                nme = number2name(name, sizeof(name), ++be->remote);
 
@@ -2185,7 +2185,7 @@ rel2bin_table(backend *be, sql_rel *rel,
                sub = stmt_list(be, l);
                if (!(sub = stmt_func(be, sub, sa_strdup(sql->sa, nme), rel->l, 
0)))
                        return NULL;
-               fr = rel->l = sub->op4.rel; /* rel->l may get rewritten */
+               rel->l = sub->op4.rel; /* rel->l may get rewritten */
                l = sa_list(sql->sa);
                for(i = 0, n = rel->exps->h; n; n = n->next, i++ ) {
                        sql_exp *c = n->data;
@@ -2194,8 +2194,6 @@ rel2bin_table(backend *be, sql_rel *rel,
                        const char *rnme = exp_relname(c);
 
                        s = stmt_alias(be, s, rnme, nme);
-                       if (fr->card <= CARD_ATOM) /* single value, get result 
from bat */
-                               s = stmt_fetch(be, s);
                        list_append(l, s);
                }
                sub = stmt_list(be, l);
diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c
--- a/sql/backends/monet5/sql_cast.c
+++ b/sql/backends/monet5/sql_cast.c
@@ -384,6 +384,23 @@ bailout:
 #define lng_is_numeric 1
 #define hge_is_numeric 1
 
+/* stringify token */
+#define _STRNG_(s) #s
+#define STRNG(t) _STRNG_(t)
+
+/* concatenate two, three or four tokens */
+#define CONCAT_2(a,b)          a##b
+#define CONCAT_3(a,b,c)                a##b##c
+#define CONCAT_4(a,b,c,d)      a##b##c##d
+
+#define NIL(t)                         CONCAT_2(t,_nil)
+#define ISNIL(t)                       CONCAT_3(is_,t,_nil)
+#define TPE(t)                         CONCAT_2(TYPE_,t)
+#define GDKmin(t)                      CONCAT_3(GDK_,t,_min)
+#define GDKmax(t)                      CONCAT_3(GDK_,t,_max)
+#define FUN(a,b,c,d)           CONCAT_4(a,b,c,d)
+#define IS_NUMERIC(t)          CONCAT_2(t,_is_numeric)
+
 /* up casting */
 
 #define TP1 bte
@@ -480,8 +497,6 @@ bailout:
 
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to