Changeset: 1133a2d35f9e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1133a2d35f9e
Modified Files:
        clients/Tests/exports.stable.out
        clients/mapiclient/mclient.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_join.c
        gdk/gdk_project.c
        gdk/gdk_storage.c
        monetdb5/mal/Tests/tst180.stable.err
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_session.c
        monetdb5/mal/mal_stack.c
        monetdb5/mal/mal_stack.h
        monetdb5/optimizer/opt_evaluate.c
        tools/merovingian/utils/control.c
Branch: default
Log Message:

merged with linear-hashing


diffs (truncated from 369 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -2054,7 +2054,6 @@ int chkInstruction(Module s, MalBlkPtr m
 str chkProgram(Module s, MalBlkPtr mb);
 str chkTypes(Module s, MalBlkPtr mb, int silent);
 str cleanupTraces(Client cntxt);
-void clearStack(MalStkPtr s);
 void clearTrace(Client cntxt);
 void clearVariable(MalBlkPtr mb, int varid);
 str clear_tableRef;
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -124,6 +124,8 @@ static timertype t0, t1;    /* used for tim
 
 #ifdef HAVE_POPEN
 static char *pager = 0;                /* use external pager */
+#endif
+#ifdef HAVE_SIGACTION
 #include <signal.h>            /* to block SIGPIPE */
 #endif
 static int rowsperpage = 0;    /* for SQL pagination */
@@ -1808,36 +1810,27 @@ start_pager(stream **saveFD)
 
        if (pager) {
                FILE *p;
-               struct sigaction act;
 
-               /* ignore SIGPIPE so that we get an error instead of signal */
-               act.sa_handler = SIG_IGN;
-               (void) sigemptyset(&act.sa_mask);
-               act.sa_flags = 0;
-               if(sigaction(SIGPIPE, &act, NULL) == -1) {
+               p = popen(pager, "w");
+               if (p == NULL)
                        fprintf(stderr, "Starting '%s' failed\n", pager);
-               } else {
-                       p = popen(pager, "w");
-                       if (p == NULL)
+               else {
+                       *saveFD = toConsole;
+                       /* put | in name to indicate that file should be closed 
with pclose */
+                       if ((toConsole = file_wastream(p, "|pager")) == NULL) {
+                               toConsole = *saveFD;
+                               *saveFD = NULL;
                                fprintf(stderr, "Starting '%s' failed\n", 
pager);
-                       else {
-                               *saveFD = toConsole;
-                               /* put | in name to indicate that file should 
be closed with pclose */
-                               if ((toConsole = file_wastream(p, "|pager")) == 
NULL) {
+                       }
+#ifdef HAVE_ICONV
+                       if (encoding != NULL) {
+                               if ((toConsole = iconv_wstream(toConsole, 
encoding, "pager")) == NULL) {
                                        toConsole = *saveFD;
                                        *saveFD = NULL;
                                        fprintf(stderr, "Starting '%s' 
failed\n", pager);
                                }
-#ifdef HAVE_ICONV
-                               if (encoding != NULL) {
-                                       if ((toConsole = 
iconv_wstream(toConsole, encoding, "pager")) == NULL) {
-                                               toConsole = *saveFD;
-                                               *saveFD = NULL;
-                                               fprintf(stderr, "Starting '%s' 
failed\n", pager);
-                                       }
-                               }
+                       }
 #endif
-                       }
                }
        }
 }
@@ -3336,6 +3329,16 @@ main(int argc, char **argv)
                exit(2);
        }
 #endif
+#ifdef HAVE_SIGACTION
+       struct sigaction act;
+       /* ignore SIGPIPE so that we get an error instead of signal */
+       act.sa_handler = SIG_IGN;
+       (void) sigemptyset(&act.sa_mask);
+       act.sa_flags = 0;
+       if (sigaction(SIGPIPE, &act, NULL) == -1)
+               perror("sigaction");
+#endif
+
        toConsole = stdout_stream = file_wastream(stdout, "stdout");
        stderr_stream = file_wastream(stderr, "stderr");
        if(!stdout_stream || !stderr_stream) {
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1271,7 +1271,7 @@ BUNinplace(BAT *b, BUN p, const void *t,
                ptr _ptr;
                _ptr = BUNtloc(bi, p);
                switch (b->twidth) {
-               case 1:
+               default:        /* only three or four cases possible */
                        _d = (var_t) * (uint8_t *) _ptr + GDK_VAROFFSET;
                        break;
                case 2:
@@ -1296,7 +1296,7 @@ BUNinplace(BAT *b, BUN p, const void *t,
                }
                _ptr = BUNtloc(bi, p);
                switch (b->twidth) {
-               case 1:
+               default:        /* only three or four cases possible */
                        * (uint8_t *) _ptr = (uint8_t) (_d - GDK_VAROFFSET);
                        break;
                case 2:
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -961,7 +961,7 @@ BATreplace(BAT *b, BAT *p, BAT *n, bool 
 
                        var_t d;
                        switch (b->twidth) {
-                       case 1:
+                       default: /* only three of four cases possible */
                                d = (var_t) ((uint8_t *) b->theap.base)[updid] 
+ GDK_VAROFFSET;
                                break;
                        case 2:
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1456,8 +1456,11 @@ BBPinit(void)
                /* try to obtain a BBP.dir from bakdir */
                if (stat(backupbbpdirstr, &st) == 0) {
                        /* backup exists; *must* use it */
-                       if (recover_dir(0, stat(bbpdirstr, &st) == 0) != 
GDK_SUCCEED)
+                       if (recover_dir(0, stat(bbpdirstr, &st) == 0) != 
GDK_SUCCEED) {
+                               GDKfree(bbpdirstr);
+                               GDKfree(backupbbpdirstr);
                                goto bailout;
+                       }
                        if ((fp = GDKfilelocate(0, "BBP", "r", "dir")) == NULL) 
{
                                GDKfree(bbpdirstr);
                                GDKfree(backupbbpdirstr);
@@ -1471,8 +1474,11 @@ BBPinit(void)
                                /* no BBP.bak (nor BBP.dir or BACKUP/BBP.dir):
                                 * create a new one */
                                IODEBUG fprintf(stderr, "#BBPdir: initializing 
BBP.\n");        /* BBPdir instead of BBPinit for backward compatibility of 
error messages */
-                               if (BBPdir(0, NULL) != GDK_SUCCEED)
+                               if (BBPdir(0, NULL) != GDK_SUCCEED) {
+                                       GDKfree(bbpdirstr);
+                                       GDKfree(backupbbpdirstr);
                                        goto bailout;
+                               }
                        } else if (GDKmove(0, BATDIR, "BBP", "bak", BATDIR, 
"BBP", "dir") == GDK_SUCCEED)
                                IODEBUG fprintf(stderr, "#BBPinit: reverting to 
dir saved in BBP.bak.\n");
 
@@ -1753,14 +1759,14 @@ BBPdir_subcommit(int cnt, bat *subcommit
        if ((obbpf = GDKfileopen(0, SUBDIR, "BBP", "dir", "r")) == NULL &&
            (obbpf = GDKfileopen(0, BAKDIR, "BBP", "dir", "r")) == NULL) {
                GDKerror("BBPdir: subcommit attempted without backup BBP.dir.");
-               return GDK_FAIL;
+               goto bailout;
        }
        /* read first three lines */
        if (fgets(buf, sizeof(buf), obbpf) == NULL || /* BBP.dir, GDKversion %d 
*/
            fgets(buf, sizeof(buf), obbpf) == NULL || /* SIZEOF_SIZE_T 
SIZEOF_OID SIZEOF_MAX_INT */
            fgets(buf, sizeof(buf), obbpf) == NULL) { /* BBPsize=%d */
                GDKerror("BBPdir: subcommit attempted with invalid backup 
BBP.dir.");
-               return GDK_FAIL;
+               goto bailout;
        }
        /* third line contains BBPsize */
        sscanf(buf, "BBPsize=%d", &n);
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3455,7 +3455,7 @@ leftjoin(BAT **r1p, BAT **r2p, BAT *l, B
        }
        phash = sr == NULL &&
                VIEWtparent(r) != 0 &&
-               BATcount(BBPquickdesc(VIEWtparent(r), false)) == BATcount(r);
+               BATcount(BBP_cache(VIEWtparent(r))) == BATcount(r);
        return hashjoin(r1p, r2p, l, r, sl, sr, &lci, &rci,
                        nil_matches, nil_on_miss, semi, only_misses,
                        not_in, estimate, t0, false, phash, func);
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -389,6 +389,7 @@ BATproject(BAT *l, BAT *r)
 
        /* handle string trick */
        if (stringtrick) {
+               assert(r->tvheap);
                if (r->batRestricted == BAT_READ) {
                        /* really share string heap */
                        assert(r->tvheap->parentid > 0);
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -165,7 +165,8 @@ GDKremovedir(int farmid, const char *dir
                }
                path = GDKfilepath(farmid, dirname, dent->d_name, NULL);
                if (path == NULL) {
-                       ret = -1;
+                       /* most likely the rmdir will now fail causing
+                        * an error return */
                        goto bailout;
                }
                ret = remove(path);
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -891,7 +891,7 @@ trimMalVariables_(MalBlkPtr mb, MalStkPt
                fprintf(stderr,"used %s %d\n", getVarName(mb,i), 
isVarUsed(mb,i));
 #endif
                if ( isVarUsed(mb,i) == 0) {
-                       if (glb && isVarConstant(mb, i))
+                       if (glb && i < glb->stktop && isVarConstant(mb, i))
                                VALclear(&glb->stk[i]);
                        freeVariable(mb, i);
                        continue;
@@ -906,7 +906,7 @@ trimMalVariables_(MalBlkPtr mb, MalStkPt
                /* valgrind finds a leak when we move these variable record
                 * pointers around. */
                alias[i] = cnt;
-               if (glb && i != cnt) {
+               if (glb && i < glb->stktop && i != cnt) {
                        glb->stk[cnt] = glb->stk[i];
                        VALempty(&glb->stk[i]);
                }
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
@@ -1421,8 +1421,10 @@ void garbageCollector(Client cntxt, MalB
        }
 #endif
        assert(mb->vtop <= mb->vsize);
+       assert(stk->stktop <= stk->stksize);
        (void) flag;
-       for (k = 0; k < mb->vtop; k++) {
+       (void)mb;
+       for (k = 0; k < stk->stktop; k++) {
        //      if (isVarCleanup(mb, k) ){
                        garbageElement(cntxt, v = &stk->stk[k]);
                        v->vtype = TYPE_int;
diff --git a/monetdb5/mal/mal_session.c b/monetdb5/mal/mal_session.c
--- a/monetdb5/mal/mal_session.c
+++ b/monetdb5/mal/mal_session.c
@@ -442,7 +442,7 @@ MSresetVariables(Client cntxt, MalBlkPtr
                                assert(!mb->var[i].value.vtype || 
isVarConstant(mb, i));
                                setVarUsed(mb,i);
                        }
-                       if (glb && !isVarUsed(mb,i)) {
+                       if (i < glb->stktop && glb && !isVarUsed(mb,i)) {
                                if (isVarConstant(mb, i))
                                        garbageElement(cntxt, &glb->stk[i]);
                                /* clean stack entry */
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
@@ -41,13 +41,6 @@
  * Once it exceeds a threshold, we call upon the kernel to
  * ensure we are still within safe bounds.
  */
-/*
- * The clearStack operation throws away any space occupied by variables
- * Freeing the stack itself is automatic upon return from the interpreter
- * context. Since the stack is allocated and zeroed on the calling stack,
- * it may happen that entries are never set to a real value.
- * This can be recognized by the vtype component
- */
 #include "monetdb_config.h"
 #include "mal_stack.h"
 #include "mal_exception.h"
@@ -84,23 +77,14 @@ reallocGlobalStack(MalStkPtr old, int cn
        GDKfree(old);
        return s;
 }
-
 /*
- * When you add a value to the stack, you should ensure that
- * there is space left. It should only be used for global
- * stack frames, because the others are allocated in the
- * runtime stack.
+ * The clearStack operation throws away any space occupied by variables
+ * Freeing the stack itself is automatic upon return from the interpreter
+ * context. Since the stack is allocated and zeroed on the calling stack,
+ * it may happen that entries are never set to a real value.
+ * This can be recognized by the vtype component
  */
-void
-freeStack(MalStkPtr stk)
-{
-       if (stk != NULL) {
-               clearStack(stk);
-               GDKfree(stk);
-       }
-}
-
-void
+static void
 clearStack(MalStkPtr s)
 {
        ValPtr v;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to