Changeset: e581dd6398ed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e581dd6398ed
Added Files:
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.sql
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.stable.err
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in-cast.Bug-6561.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.stable.err
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-in.Bug-6560.stable.out
        
sql/test/BugTracker-2018/Tests/sqlitelogictest-groupby-having-not-null-not-in.Bug-6562.sql
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_join.c
        sql/backends/monet5/UDF/capi/capi.c
        sql/backends/monet5/sql_statistics.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_privileges.c
        
sql/test/BugTracker-2017/Tests/statistics_nils_not_eq_zero.Bug-6331.stable.err
        sql/test/BugTracker-2018/Tests/All
        sql/test/BugTracker-2018/Tests/truncate_tmp_tables.Bug-6543.stable.err
        testing/Mtest.py.in
        tools/merovingian/daemon/forkmserver.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/utils/properties.c
Branch: default
Log Message:

Merge with Mar2018 branch.


diffs (truncated from 752 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2048,6 +2048,7 @@ BATassertProps(BAT *b)
                        /* tseqbase must correspond to actual value */
                        assert(* (oid *) BUNtail(bi, 0) == b->tseqbase);
                }
+               assert(b->tseqbase + b->batCount <= GDK_oid_max);
        }
        /* a column cannot both have and not have NILs */
        assert(!b->tnil || !b->tnonil);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -877,10 +877,8 @@ headheapinit(oid *hseq, const char *buf,
 
        if (strcmp(type, "void") != 0)
                GDKfatal("BBPinit: head column must be VOID (ID = %d).", (int) 
bid);
-#if SIZEOF_OID < SIZEOF_LNG
        if (base > (uint64_t) GDK_oid_max)
                GDKfatal("BBPinit: head seqbase out of range (ID = %d, seq = %" 
PRIu64 ").", (int) bid, base);
-#endif
        *hseq = (oid) base;
        return n;
 }
@@ -1088,7 +1086,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver
 #endif
 
                if (first != 0)
-                       GDKfatal("BBPinit: first != 0 (ID = %" PRIu64 ").", 
batid);
+                       GDKfatal("BBPinit: first != 0 (ID = %" PRIu64 ").",
+                                batid);
 
                bid = (bat) batid;
                if (batid >= (uint64_t) ATOMIC_GET(BBPsize, BBPsizeLock)) {
@@ -1097,7 +1096,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver
                                BBPextend(0, false);
                }
                if (BBP_desc(bid) != NULL)
-                       GDKfatal("BBPinit: duplicate entry in BBP.dir (ID = %" 
PRIu64 ").", batid);
+                       GDKfatal("BBPinit: duplicate entry in BBP.dir (ID = "
+                                "%" PRIu64 ").", batid);
                bn = GDKzalloc(sizeof(BAT));
                if (bn == NULL)
                        GDKfatal("BBPinit: cannot allocate memory for BAT.");
@@ -1114,10 +1114,8 @@ BBPreadEntries(FILE *fp, unsigned bbpver
                if (bbpversion <= GDKLIBRARY_HEADED) {
                        nread += headheapinit(&bn->hseqbase, buf + nread, bid);
                } else {
-#if SIZEOF_OID < SIZEOF_LNG
                        if (base > (uint64_t) GDK_oid_max)
                                GDKfatal("BBPinit: head seqbase out of range 
(ID = %" PRIu64 ", seq = %" PRIu64 ").", batid, base);
-#endif
                        bn->hseqbase = (oid) base;
                }
                nread += heapinit(bn, buf + nread, &Thashash, "T", bbpversion, 
bid, filename);
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -461,13 +461,36 @@ selectjoin(BAT *r1, BAT *r2, BAT *l, BAT
 
 static gdk_return
 mergejoin_void(BAT *r1, BAT *r2, BAT *l, BAT *r, BAT *sl, BAT *sr,
-              bool nil_on_miss, bool only_misses, lng t0)
+              bool nil_on_miss, bool only_misses, lng t0, bool swapped)
 {
        oid lo, hi;
        BUN cnt, i;
        const oid *lvals;
        oid o, seq;
 
+       ALGODEBUG fprintf(stderr, "#mergejoin_void(l=%s#" BUNFMT "[%s]%s%s%s,"
+                         "r=%s#" BUNFMT "[%s]%s%s%s,sl=%s#" BUNFMT "%s%s%s,"
+                         "sr=%s#" BUNFMT "%s%s%s,"
+                         "nil_on_miss=%d,only_misses=%d)%s\n",
+                         BATgetId(l), BATcount(l), ATOMname(l->ttype),
+                         l->tsorted ? "-sorted" : "",
+                         l->trevsorted ? "-revsorted" : "",
+                         l->tkey ? "-key" : "",
+                         BATgetId(r), BATcount(r), ATOMname(r->ttype),
+                         r->tsorted ? "-sorted" : "",
+                         r->trevsorted ? "-revsorted" : "",
+                         r->tkey ? "-key" : "",
+                         sl ? BATgetId(sl) : "NULL", sl ? BATcount(sl) : 0,
+                         sl && sl->tsorted ? "-sorted" : "",
+                         sl && sl->trevsorted ? "-revsorted" : "",
+                         sl && sl->tkey ? "-key" : "",
+                         sr ? BATgetId(sr) : "NULL", sr ? BATcount(sr) : 0,
+                         sr && sr->tsorted ? "-sorted" : "",
+                         sr && sr->trevsorted ? "-revsorted" : "",
+                         sr && sr->tkey ? "-key" : "",
+                         nil_on_miss, only_misses,
+                         swapped ? " swapped" : "");
+
        /* r is dense, and if there is a candidate list, it too is
         * dense.  This means we don't have to do any searches, we
         * only need to compare ranges to know whether a value from l
@@ -2281,13 +2304,13 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                                 * value */
                                nr = 1;
                        }
-                       if (lcand &&
-                           nl > 1 &&
-                           lcand[-1] != lcand[-1 - (ssize_t) nl] + nl) {
-                               /* not all values in the range are
-                                * candidates */
-                               lskipped = true;
-                       }
+               }
+               if (lcand &&
+                   nl > 1 &&
+                   lcand[-1] != lcand[-1 - (ssize_t) nl] + nl) {
+                       /* not all values in the range are
+                        * candidates */
+                       lskipped = true;
                }
                /* make space: nl values in l match nr values in r, so
                 * we need to add nl * nr values in the results */
@@ -2401,7 +2424,11 @@ mergejoin(BAT *r1, BAT *r2, BAT *l, BAT 
                                        r2->tseqbase = oid_nil;
                                }
                        }
-                       if (lskipped)
+                       /* if there is a left candidate list, it may
+                        * be that the next value added isn't
+                        * consecutive with the last one */
+                       if (lskipped ||
+                           (lcand && ((oid *) r1->T.heap.base)[r1->batCount - 
1] + 1 != lcand[-(ssize_t)nl]))
                                r1->tseqbase = oid_nil;
                }
 
@@ -3799,7 +3826,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT *l, B
                   lcount > 0 && rcount > 0) {
                /* use special implementation for dense right-hand side */
                return mergejoin_void(r1, r2, l, r, sl, sr,
-                                     nil_on_miss, only_misses, t0);
+                                     nil_on_miss, only_misses, t0, false);
        } else if ((BATordered(r) || BATordered_rev(r)) &&
                   (BATtdense(r) ||
                    lcount < 1024 ||
@@ -3994,10 +4021,10 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
                return selectjoin(r2, r1, r, l, sr, sl, nil_matches, t0, true);
        } else if (BATtdense(r) && (sr == NULL || BATtdense(sr))) {
                /* use special implementation for dense right-hand side */
-               return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0);
+               return mergejoin_void(r1, r2, l, r, sl, sr, false, false, t0, 
false);
        } else if (BATtdense(l) && (sl == NULL || BATtdense(sl))) {
                /* use special implementation for dense right-hand side */
-               return mergejoin_void(r2, r1, r, l, sr, sl, false, false, t0);
+               return mergejoin_void(r2, r1, r, l, sr, sl, false, false, t0, 
true);
        } else if ((BATordered(l) || BATordered_rev(l)) &&
                   (BATordered(r) || BATordered_rev(r))) {
                /* both sorted */
diff --git a/sql/backends/monet5/UDF/capi/capi.c 
b/sql/backends/monet5/UDF/capi/capi.c
--- a/sql/backends/monet5/UDF/capi/capi.c
+++ b/sql/backends/monet5/UDF/capi/capi.c
@@ -448,6 +448,10 @@ static str CUDFeval(Client cntxt, MalBlk
 
        allocated_regions[tid] = NULL;
 
+       if (!GDKgetenv_istrue("embedded_c") && !GDKgetenv_isyes("embedded_c"))
+               throw(MAL, "cudf.eval", "Embedded C has not been enabled. "
+                     "Start server with --set embedded_c=true");
+
        // we need to be able to catch segfaults and bus errors
        // so we can work with mprotect to prevent UDFs from changing
        // the input data
diff --git a/sql/backends/monet5/sql_statistics.c 
b/sql/backends/monet5/sql_statistics.c
--- a/sql/backends/monet5/sql_statistics.c
+++ b/sql/backends/monet5/sql_statistics.c
@@ -112,6 +112,8 @@ sql_analyze(Client cntxt, MalBlkPtr mb, 
 
                                if (tbl && strcmp(bt->name, tbl))
                                        continue;
+                               if (t->persistence != SQL_PERSIST)
+                                       throw(SQL, "analyze", SQLSTATE(42S02) 
"Table '%s' is not persistent", bt->name);
                                tfnd = 1;
                                if (isTable(t) && t->columns.set)
                                        for (ncol = (t)->columns.set->h; ncol; 
ncol = ncol->next) {
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -506,7 +506,7 @@ rel_label( mvc *sql, sql_rel *r, int all
        return r;
 }
 
-void
+sql_exp *
 rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e)
 {
        assert(is_project(rel->op));
@@ -523,8 +523,9 @@ rel_project_add_exp( mvc *sql, sql_rel *
                if (e->card > rel->card)
                        rel->card = e->card;
        } else if (rel->op == op_groupby) {
-               (void) rel_groupby_add_aggr(sql, rel, e);
+               return rel_groupby_add_aggr(sql, rel, e);
        }
+       return e;
 }
 
 void
@@ -1282,7 +1283,7 @@ static sql_rel *
        set_intern(e);
        e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
        *exp = exp_label(sql->sa, e, ++sql->label);
-       rel_project_add_exp(sql, rel, e);
+       (void) rel_project_add_exp(sql, rel, e);
        return rel;
 }
 
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -52,7 +52,7 @@ extern sql_rel *rel_topn(sql_allocator *
 extern sql_rel *rel_sample(sql_allocator *sa, sql_rel *l, list *exps );
 
 extern sql_rel *rel_label( mvc *sql, sql_rel *r, int all);
-extern void rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e);
+extern sql_exp *rel_project_add_exp( mvc *sql, sql_rel *rel, sql_exp *e);
 extern void rel_select_add_exp(sql_allocator *sa, sql_rel *l, sql_exp *e);
 extern void rel_join_add_exp(sql_allocator *sa, sql_rel *rel, sql_exp *e);
 extern sql_exp *rel_groupby_add_aggr(mvc *sql, sql_rel *rel, sql_exp *e);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -2076,14 +2076,14 @@ rel_logical_value_exp(mvc *sql, sql_rel 
 
                                if (!l) {
                                        l = *rel = rel_project(sql->sa, NULL, 
new_exp_list(sql->sa));
-                                       rel_project_add_exp(sql, l, ls);
+                                       ls = rel_project_add_exp(sql, l, ls);
                                } else if (f == sql_sel) { /* allways add left 
side in case of selections phase */
                                        if (!l->processed) { /* add all 
expressions to the project */
                                                l->exps = list_merge(l->exps, 
rel_projections(sql, l->l, NULL, 1, 1), (fdup)NULL);
                                                l->exps = 
list_distinct(l->exps, (fcmp)exp_equal, (fdup)NULL);
                                        }
                                        if (!(rls = rel_find_exp(l, ls)) || rls 
== ls /* constant atom */)
-                                               rel_project_add_exp(sql, l, ls);
+                                               ls = rel_project_add_exp(sql, 
l, ls);
                                }
                                rs = rel_lastexp(sql, r);
                                if (r->card > CARD_ATOM) {
@@ -2128,7 +2128,7 @@ rel_logical_value_exp(mvc *sql, sql_rel 
                if (!left) {
                        left = *rel;
                        if (outer && !outer->l && !list_empty(outer->exps) && 
needproj) {
-                               rel_project_add_exp(sql, left, l);
+                               l = rel_project_add_exp(sql, left, l);
                                l = exp_column(sql->sa, exp_relname(l), 
exp_name(l), exp_subtype(l), l->card, has_nil(l), is_intern(l));
                        }
                }
@@ -2174,7 +2174,7 @@ rel_logical_value_exp(mvc *sql, sql_rel 
                                        }
                                        if (r && z && is_project(z->op) && 
z->l) {
                                                sql_rel *gp = z->l;
-                                               rel_project_add_exp(sql, z, r);
+                                               r = rel_project_add_exp(sql, z, 
r);
                                                reset_processed(gp);
                                                r = exp_column(sql->sa, 
exp_relname(r), exp_name(r), exp_subtype(r), r->card, has_nil(r), is_intern(r));
                                                left = z;
@@ -2673,7 +2673,7 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                                                sql_rel *in = 
rel_crossproduct(sql->sa, rel_dup(left), right, op_join);
 
                                                                right = 
rel_project(sql->sa, in, rel_projections(sql, right, NULL, 1, 1));
-                                                               
rel_project_add_exp(sql, right, roident);
+                                                               roident = 
rel_project_add_exp(sql, right, roident);
                                                                rident = 
exp_column(sql->sa, exp_relname(rident), exp_name(rident), exp_subtype(rident), 
rident->card, has_nil(rident), is_intern(rident));
                                                                roident = 
exp_column(sql->sa, exp_relname(roident), exp_name(roident), 
exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident));
                                                        }
@@ -2685,14 +2685,14 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
 
                                                                if (!r)
                                                                        return 
NULL;
-                                                               
rel_project_add_exp(sql, rel, r);
+                                                               r = 
rel_project_add_exp(sql, rel, r);
                                                                rident = r;
                                                                rident = 
exp_column(sql->sa, exp_relname(lident), exp_name(lident), exp_subtype(lident), 
lident->card, has_nil(lident), is_intern(lident));
                                                        }
                                                        rel = 
rel_project(sql->sa, rel, NULL);
-                                                       
rel_project_add_exp(sql, rel, r);
+                                                       r = 
rel_project_add_exp(sql, rel, r);
                                                        if (rident) {
-                                                               
rel_project_add_exp(sql, rel, rident);
+                                                               rident = 
rel_project_add_exp(sql, rel, rident);
                                                                if (rident == 
roident)
                                                                        roident 
= exp_column(sql->sa, exp_relname(roident), exp_name(roident), 
exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident));
                                                                rident = 
exp_column(sql->sa, exp_relname(rident), exp_name(rident), exp_subtype(rident), 
rident->card, has_nil(rident), is_intern(rident));
@@ -2723,9 +2723,9 @@ rel_logical_exp(mvc *sql, sql_rel *rel, 
                                                if (correlated) {
                                                        rl = rel_dup(left);
                                                        rl = 
rel_project(sql->sa, rl, NULL);
-                                                       
rel_project_add_exp(sql, rl, r);
+                                                       r = 
rel_project_add_exp(sql, rl, r);
                                                        if (roident) {
-                                                               
rel_project_add_exp(sql, rl, roident);
+                                                               roident = 
rel_project_add_exp(sql, rl, roident);
                                                                roident = 
exp_column(sql->sa, exp_relname(roident), exp_name(roident), 
exp_subtype(roident), roident->card, has_nil(roident), is_intern(roident));
                                                        }
                                                } else {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to