Changeset: faa99f033099 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=faa99f033099
Modified Files:
        gdk/ChangeLog.Jun2020
        gdk/gdk.h
        gdk/gdk_atoms.c
        gdk/gdk_atoms.h
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_delta.c
        gdk/gdk_project.c
        monetdb5/mal/mal_atom.c
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_stack.c
        sql/backends/monet5/rel_bin.c
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        sql/test/BugTracker-2008/Tests/is_distinct_broken.SF-2430201.sql
        sql/test/BugTracker-2008/Tests/is_distinct_broken.SF-2430201.stable.err
        sql/test/BugTracker-2008/Tests/is_distinct_broken.SF-2430201.stable.out
        sql/test/miscellaneous/Tests/groupby_error.sql
        sql/test/miscellaneous/Tests/groupby_error.stable.out
        sql/test/subquery/Tests/subquery4.sql
        sql/test/subquery/Tests/subquery4.stable.err
        sql/test/subquery/Tests/subquery4.stable.out
Branch: default
Log Message:

Merged with Jun2020


diffs (truncated from 777 to 300 lines):

diff --git a/gdk/ChangeLog.Jun2020 b/gdk/ChangeLog.Jun2020
--- a/gdk/ChangeLog.Jun2020
+++ b/gdk/ChangeLog.Jun2020
@@ -1,6 +1,10 @@
 # ChangeLog file for GDK
 # This file is updated with Maddlog
 
+* Fri Mar 20 2020 Sjoerd Mullender <sjo...@acm.org>
+- Changed the interface of the atom "fix" and "unfix" functions.
+  They now return a value of type gdk_return to indicater success/failure.
+
 * Tue Dec  3 2019 Sjoerd Mullender <sjo...@acm.org>
 - Removed the tunique property.  The tunique property indicated that
   all values in the column had to be distinct.  It was removed because
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1512,7 +1512,7 @@ Tputvalue(BAT *b, BUN p, const void *v, 
 #endif
                }
        } else {
-               ATOMputFIX(b->ttype, Tloc(b, p), v);
+               return ATOMputFIX(b->ttype, Tloc(b, p), v);
        }
        return GDK_SUCCEED;
 }
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -118,16 +118,24 @@ hgeHash(const hge *v)
 /*
  * @+ Standard Atoms
  */
-static int
+static gdk_return
 batFix(const bat *b)
 {
-       return BBPretain(*b);
+       if (!is_bat_nil(*b) && BBPretain(*b) == 0) {
+               GDKerror("batFix failed\n");
+               return GDK_FAIL;
+       }
+       return GDK_SUCCEED;
 }
 
-static int
+static gdk_return
 batUnfix(const bat *b)
 {
-       return BBPrelease(*b);
+       if (!is_bat_nil(*b) && BBPrelease(*b) < 0) {
+               GDKerror("batUnfix failed\n");
+               return GDK_FAIL;
+       }
+       return GDK_SUCCEED;
 }
 
 /*
@@ -1232,8 +1240,8 @@ atomDesc BATatoms[MAXATOMS] = {
                .atomWrite = (gdk_return (*)(const void *, stream *, size_t)) 
batWrite,
                .atomCmp = (int (*)(const void *, const void *)) intCmp,
                .atomHash = (BUN (*)(const void *)) intHash,
-               .atomFix = (int (*)(const void *)) batFix,
-               .atomUnfix = (int (*)(const void *)) batUnfix,
+               .atomFix = (gdk_return (*)(const void *)) batFix,
+               .atomUnfix = (gdk_return (*)(const void *)) batUnfix,
        },
        [TYPE_int] = {
                .name = "int",
diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h
--- a/gdk/gdk_atoms.h
+++ b/gdk/gdk_atoms.h
@@ -50,8 +50,8 @@ typedef struct {
        int (*atomCmp) (const void *v1, const void *v2);
        BUN (*atomHash) (const void *v);
        /* optional functions */
-       int (*atomFix) (const void *atom);
-       int (*atomUnfix) (const void *atom);
+       gdk_return (*atomFix) (const void *atom);
+       gdk_return (*atomUnfix) (const void *atom);
 
        /* varsized atom-only ADT functions */
        var_t (*atomPut) (Heap *, var_t *off, const void *src);
@@ -266,8 +266,8 @@ gdk_export const ptr ptr_nil;
 #define ATOMvarsized(t)                (BATatoms[t].atomPut != NULL)
 #define ATOMlinear(t)          BATatoms[t].linear
 #define ATOMtype(t)            ((t) == TYPE_void ? TYPE_oid : (t))
-#define ATOMfix(t,v)           do if (BATatoms[t].atomFix) 
BATatoms[t].atomFix(v); while (0)
-#define ATOMunfix(t,v)         do if (BATatoms[t].atomUnfix) 
BATatoms[t].atomUnfix(v); while (0)
+#define ATOMfix(t,v)           (BATatoms[t].atomFix ? BATatoms[t].atomFix(v) : 
GDK_SUCCEED)
+#define ATOMunfix(t,v)         (BATatoms[t].atomUnfix ? 
BATatoms[t].atomUnfix(v) : GDK_SUCCEED)
 
 /* The base type is the storage type if the comparison function, the
  * hash function, and the nil value are the same as those of the
@@ -296,11 +296,15 @@ ATOMputVAR(int type, Heap *heap, var_t *
 }
 
 
-static inline void
+static inline gdk_return __attribute__((__warn_unused_result__))
 ATOMputFIX(int type, void *dst, const void *src)
 {
+       gdk_return rc;
+
        assert(BATatoms[type].atomPut == NULL);
-       ATOMfix(type, src);
+       rc = ATOMfix(type, src);
+       if (rc != GDK_SUCCEED)
+               return rc;
        switch (ATOMsize(type)) {
        case 0:         /* void */
                break;
@@ -325,6 +329,7 @@ ATOMputFIX(int type, void *dst, const vo
                memcpy(dst, src, ATOMsize(type));
                break;
        }
+       return GDK_SUCCEED;
 }
 
 static inline gdk_return __attribute__((__warn_unused_result__))
@@ -335,11 +340,11 @@ ATOMreplaceVAR(int type, Heap *heap, var
        assert(BATatoms[type].atomPut != NULL);
        if ((*BATatoms[type].atomPut)(heap, &loc, src) == 0)
                return GDK_FAIL;
-       ATOMunfix(type, dst);
+       if (ATOMunfix(type, dst) != GDK_SUCCEED)
+               return GDK_FAIL;
        ATOMdel(type, heap, dst);
        *dst = loc;
-       ATOMfix(type, src);
-       return GDK_SUCCEED;
+       return ATOMfix(type, src);
 }
 
 /* string heaps:
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1129,7 +1129,8 @@ BUNdelete(BAT *b, oid o)
                    && ATOMcmp(b->ttype, VALptr(&prop->v), val) <= 0)
                        BATrmprop(b, GDK_MIN_VALUE);
        }
-       ATOMunfix(b->ttype, val);
+       if (ATOMunfix(b->ttype, val) != GDK_SUCCEED)
+               return GDK_FAIL;
        ATOMdel(b->ttype, b->tvheap, (var_t *) BUNtloc(bi, p));
        if (p != BUNlast(b) - 1 &&
            (b->ttype != TYPE_void || BATtdense(b))) {
@@ -1314,8 +1315,10 @@ BUNinplace(BAT *b, BUN p, const void *t,
                }
        } else {
                assert(BATatoms[b->ttype].atomPut == NULL);
-               ATOMfix(b->ttype, t);
-               ATOMunfix(b->ttype, BUNtloc(bi, p));
+               if (ATOMfix(b->ttype, t) != GDK_SUCCEED)
+                       return GDK_FAIL;
+               if (ATOMunfix(b->ttype, BUNtloc(bi, p)) != GDK_SUCCEED)
+                       return GDK_FAIL;
                switch (ATOMsize(b->ttype)) {
                case 0:      /* void */
                        break;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -721,7 +721,7 @@ BATappend(BAT *b, BAT *n, BAT *s, bool f
 gdk_return
 BATdel(BAT *b, BAT *d)
 {
-       int (*unfix) (const void *) = BATatoms[b->ttype].atomUnfix;
+       gdk_return (*unfix) (const void *) = BATatoms[b->ttype].atomUnfix;
        void (*atmdel) (Heap *, var_t *) = BATatoms[b->ttype].atomDel;
        BATiter bi = bat_iterator(b);
 
@@ -752,8 +752,8 @@ BATdel(BAT *b, BAT *d)
                        BUN p = o - b->hseqbase;
                        BUN q = p + c;
                        while (p < q) {
-                               if (unfix)
-                                       (*unfix)(BUNtail(bi, p));
+                               if (unfix && (*unfix)(BUNtail(bi, p)) != 
GDK_SUCCEED)
+                                       return GDK_FAIL;
                                if (atmdel)
                                        (*atmdel)(b->tvheap, (var_t *) 
BUNtloc(bi, p));
                                p++;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2679,14 +2679,15 @@ BBPdestroy(BAT *b)
                VIEWdestroy(b);
        } else {
                /* bats that get destroyed must unfix their atoms */
-               int (*tunfix) (const void *) = BATatoms[b->ttype].atomUnfix;
+               gdk_return (*tunfix) (const void *) = 
BATatoms[b->ttype].atomUnfix;
                BUN p, q;
                BATiter bi = bat_iterator(b);
 
                assert(b->batSharecnt == 0);
                if (tunfix) {
                        BATloop(b, p, q) {
-                               (*tunfix) (BUNtail(bi, p));
+                               /* ignore errors */
+                               (void) (*tunfix)(BUNtail(bi, p));
                        }
                }
                BATdelete(b);   /* handles persistent case also (file deletes) 
*/
diff --git a/gdk/gdk_delta.c b/gdk/gdk_delta.c
--- a/gdk/gdk_delta.c
+++ b/gdk/gdk_delta.c
@@ -89,7 +89,7 @@ BATundo(BAT *b)
        bunlast = BUNlast(b) - 1;
        if (bunlast >= b->batInserted) {
                BUN i = bunfirst;
-               int (*tunfix) (const void *) = BATatoms[b->ttype].atomUnfix;
+               gdk_return (*tunfix) (const void *) = 
BATatoms[b->ttype].atomUnfix;
                void (*tatmdel) (Heap *, var_t *) = BATatoms[b->ttype].atomDel;
 
                if (b->thash)
@@ -97,7 +97,7 @@ BATundo(BAT *b)
                if (tunfix || tatmdel) {
                        for (p = bunfirst; p <= bunlast; p++, i++) {
                                if (tunfix)
-                                       (*tunfix) (BUNtail(bi, p));
+                                       (void) (*tunfix) (BUNtail(bi, p));
                                if (tatmdel)
                                        (*tatmdel) (b->tvheap, (var_t *) 
BUNtloc(bi, p));
                        }
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -648,7 +648,8 @@ BATprojectchain(BAT **bats)
                        }
                        if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED)
                                goto bunins_failed;
-                       ATOMputFIX(bn->ttype, d, &o);
+                       if (ATOMputFIX(bn->ttype, d, &o) != GDK_SUCCEED)
+                               goto bunins_failed;
                        d++;
                }
        } else if (!ATOMvarsized(tpe)) {
@@ -685,7 +686,8 @@ BATprojectchain(BAT **bats)
                                o -= ba[n].hlo;
                                v = Tloc(b, o);
                        }
-                       ATOMputFIX(tpe, d, v);
+                       if (ATOMputFIX(tpe, d, v) != GDK_SUCCEED)
+                               goto bunins_failed;
                        d += b->twidth;
                }
                if (stringtrick) {
diff --git a/monetdb5/mal/mal_atom.c b/monetdb5/mal/mal_atom.c
--- a/monetdb5/mal/mal_atom.c
+++ b/monetdb5/mal/mal_atom.c
@@ -67,7 +67,7 @@ malAtomProperty(MalBlkPtr mb, InstrPtr p
                        return MAL_SUCCEED;
                }
                if (idcmp("fix", name) == 0 && pci->argc == 1) {
-                       BATatoms[tpe].atomFix = (int (*)(const void *))pci->fcn;
+                       BATatoms[tpe].atomFix = (gdk_return (*)(const void 
*))pci->fcn;
                        setAtomName(pci);
                        return MAL_SUCCEED;
                }
@@ -131,7 +131,7 @@ malAtomProperty(MalBlkPtr mb, InstrPtr p
                break;
        case 'u':
                if (idcmp("unfix", name) == 0 && pci->argc == 1) {
-                       BATatoms[tpe].atomUnfix = (int (*)(const void 
*))pci->fcn;
+                       BATatoms[tpe].atomUnfix = (gdk_return (*)(const void 
*))pci->fcn;
                        setAtomName(pci);
                        return MAL_SUCCEED;
                }
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -823,8 +823,10 @@ str runMALsequence(Client cntxt, MalBlkP
                if ( pci->token != FACcall && ret== MAL_SUCCEED) {
                        for (i = 0; i < pci->retc; i++) {
                                lhs = &backup[i];
-                               if (BATatoms[lhs->vtype].atomUnfix)
-                                       
(*BATatoms[lhs->vtype].atomUnfix)(VALget(lhs));
+                               if (BATatoms[lhs->vtype].atomUnfix &&
+                                       
(*BATatoms[lhs->vtype].atomUnfix)(VALget(lhs)) != GDK_SUCCEED) {
+                                       ret = createException(MAL, 
"mal.propertyCheck", GDK_EXCEPTION);
+                               }
                                if (ATOMextern(lhs->vtype) &&
                                        lhs->val.pval &&
                                        lhs->val.pval != ATOMnilptr(lhs->vtype) 
&&
diff --git a/monetdb5/mal/mal_stack.c b/monetdb5/mal/mal_stack.c
--- a/monetdb5/mal/mal_stack.c
+++ b/monetdb5/mal/mal_stack.c
@@ -99,7 +99,7 @@ clearStack(MalStkPtr s)
                        v->vtype = 0;
                        v->val.pval = NULL;
                } else if (BATatoms[v->vtype].atomUnfix) {
-                       BATatoms[v->vtype].atomUnfix(VALget(v));
+                       (void) BATatoms[v->vtype].atomUnfix(VALget(v));
                        v->vtype = 0;
                        v->val.pval = NULL;
                }
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to