Changeset: 135c12a86a89 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=135c12a86a89
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_imprints.c
        gdk/gdk_private.h
        gdk/gdk_search.c
        monetdb5/mal/mal_client.c
        sql/server/sql_atom.c
        sql/server/sql_parser.y
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_table.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check0.stable.out.int128
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check1.stable.out.int128
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check2.stable.out.int128
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check3.stable.out.int128
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check4.stable.out.int128
        sql/test/leaks/Tests/check5.stable.out
        sql/test/leaks/Tests/check5.stable.out.int128
        sql/test/leaks/Tests/drop3.stable.out
        sql/test/leaks/Tests/drop3.stable.out.int128
        sql/test/leaks/Tests/select1.stable.out
        sql/test/leaks/Tests/select1.stable.out.int128
        sql/test/leaks/Tests/select2.stable.out
        sql/test/leaks/Tests/select2.stable.out.int128
        sql/test/leaks/Tests/temp1.stable.out
        sql/test/leaks/Tests/temp1.stable.out.int128
        sql/test/leaks/Tests/temp2.stable.out
        sql/test/leaks/Tests/temp2.stable.out.int128
        sql/test/leaks/Tests/temp3.stable.out
        sql/test/leaks/Tests/temp3.stable.out.int128
        testing/Mtest.py.in
Branch: default
Log Message:

Merge with Jul2015 branch.


diffs (truncated from 3720 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
@@ -590,8 +590,8 @@ BATfree(BAT *b)
        if (b->T->props)
                PROPdestroy(b->T->props);
        b->T->props = NULL;
-       HASHdestroy(b);
-       IMPSdestroy(b);
+       HASHfree(b);
+       IMPSfree(b);
        if (b->htype)
                HEAPfree(&b->H->heap, 0);
        else
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2318,8 +2318,11 @@ decref(bat i, int logical, int releaseSh
        }
 
        /* we destroy transients asap and unload persistent bats only
-        * if they have been made cold */
-       if (BBP_refs(i) > 0 || (BBP_lrefs(i) > 0 && BBP_lastused(i) != 0)) {
+        * if they have been made cold or are not dirty */
+       if (BBP_refs(i) > 0 ||
+           (BBP_lrefs(i) > 0 &&
+            BBP_lastused(i) != 0 &&
+            (b == NULL || BATdirty(b) || !(BBP_status(i) & BBPPERSISTENT)))) {
                /* bat cannot be swapped out. renew its last usage
                 * stamp for the BBP LRU policy */
                int sec = BBPLASTUSED(BBPstamp());
@@ -3876,19 +3879,22 @@ BBPdiskscan(const char *parent)
                } else if (strncmp(p + 1, "theap", 5) == 0) {
                        BAT *b = getdesc(bid);
                        delete = (b == NULL || !b->T->vheap || 
b->batCopiedtodisk == 0);
-               } else if (strncmp(p + 1, "hhash", 5) == 0) {
+               } else if (strncmp(p + 1, "hhash", 5) == 0 ||
+                          strncmp(p + 1, "thash", 5) == 0) {
+#ifdef PERSISTENTHASH
                        BAT *b = getdesc(bid);
                        delete = b == NULL;
-               } else if (strncmp(p + 1, "thash", 5) == 0) {
+#else
+                       delete = TRUE;
+#endif
+               } else if (strncmp(p + 1, "himprints", 9) == 0 ||
+                          strncmp(p + 1, "timprints", 9) == 0) {
                        BAT *b = getdesc(bid);
                        delete = b == NULL;
-               } else if (strncmp(p + 1, "himprints", 9) == 0) {
-                       BAT *b = getdesc(bid);
-                       delete = b == NULL;
-               } else if (strncmp(p + 1, "timprints", 9) == 0) {
-                       BAT *b = getdesc(bid);
-                       delete = b == NULL;
-               } else if (strncmp(p + 1, "priv", 4) != 0 && strncmp(p + 1, 
"new", 3) != 0 && strncmp(p + 1, "head", 4) != 0 && strncmp(p + 1, "tail", 4) 
!= 0) {
+               } else if (strncmp(p + 1, "priv", 4) != 0 &&
+                          strncmp(p + 1, "new", 3) != 0 &&
+                          strncmp(p + 1, "head", 4) != 0 &&
+                          strncmp(p + 1, "tail", 4) != 0) {
                        ok = FALSE;
                }
                if (!ok) {
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -951,8 +951,9 @@ IMPSremove(BAT *b)
        if ((imprints = b->T->imprints) != NULL) {
                b->T->imprints = NULL;
 
-               if (* (size_t *) imprints->imprints->base & (1 << 16))
-                       ALGODEBUG fprintf(stderr, "#IMPSremove: removing 
persisted imprints\n");
+               if ((GDKdebug & ALGOMASK) &&
+                   * (size_t *) imprints->imprints->base & (1 << 16))
+                       fprintf(stderr, "#IMPSremove: removing persisted 
imprints\n");
                if (HEAPdelete(imprints->imprints, BBP_physical(b->batCacheid),
                               b->batCacheid > 0 ? "timprints" : "himprints"))
                        IODEBUG fprintf(stderr, "#IMPSremove(%s): imprints 
heap\n", BATgetId(b));
@@ -968,13 +969,42 @@ void
 IMPSdestroy(BAT *b)
 {
        if (b) {
-               if (b->T->imprints != NULL && !VIEWtparent(b)) {
+               if (b->T->imprints != NULL && !VIEWtparent(b))
                        IMPSremove(b);
+               else
+                       GDKunlink(BBPselectfarm(b->batRole, b->ttype, 
imprintsheap),
+                                 BATDIR,
+                                 BBP_physical(b->batCacheid),
+                                 "timprints");
+
+               if (b->H->imprints != NULL && !VIEWhparent(b))
+                       IMPSremove(BATmirror(b));
+               else
+                       GDKunlink(BBPselectfarm(b->batRole, b->htype, 
imprintsheap),
+                                 BATDIR,
+                                 BBP_physical(b->batCacheid),
+                                 "himprints");
+       }
+}
+
+/* free the memory associated with the imprints, do not remove the
+ * heap files */
+void
+IMPSfree(BAT *b)
+{
+       Imprints *imprints;
+
+       if (b) {
+               MT_lock_set(&GDKimprintsLock(abs(b->batCacheid)));
+               if ((imprints = b->T->imprints) != NULL) {
+                       b->T->imprints = NULL;
+                       if (!VIEWtparent(b)) {
+                               HEAPfree(imprints->imprints, 0);
+                               GDKfree(imprints->imprints);
+                               GDKfree(imprints);
+                       }
                }
-
-               if (b->H->imprints != NULL && !VIEWhparent(b)) {
-                       IMPSremove(BATmirror(b));
-               }
+               MT_lock_unset(&GDKimprintsLock(abs(b->batCacheid)));
        }
 }
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -139,6 +139,8 @@ void BBPdump(void);         /* never called: fo
        __attribute__((__visibility__("hidden")));
 __hidden gdk_return GDKunlink(int farmid, const char *dir, const char *nme, 
const char *extension)
        __attribute__((__visibility__("hidden")));
+__hidden void HASHfree(BAT *b)
+       __attribute__((__visibility__("hidden")));
 __hidden int HASHgonebad(BAT *b, const void *v)
        __attribute__((__visibility__("hidden")));
 __hidden BUN HASHmask(BUN cnt)
@@ -165,6 +167,8 @@ void BBPdump(void);         /* never called: fo
        __attribute__((__visibility__("hidden")));
 __hidden void IMPSdestroy(BAT *b)
        __attribute__((__visibility__("hidden")));
+__hidden void IMPSfree(BAT *b)
+       __attribute__((__visibility__("hidden")));
 __hidden int IMPSgetbin(int tpe, bte bits, const char *restrict bins, const 
void *restrict v)
        __attribute__((__visibility__("hidden")));
 #ifndef NDEBUG
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -237,8 +237,6 @@ BATcheckhash(BAT *b)
        t = GDKusec();
        MT_lock_set(&GDKhashLock(abs(b->batCacheid)));
        t = GDKusec() - t;
-// use or ignore a persistent hash
-#ifdef PERSISTENTHASH
        if (b->T->hash == NULL) {
                Hash *h;
                Heap *hp;
@@ -258,7 +256,11 @@ BATcheckhash(BAT *b)
 
                                if ((h = GDKmalloc(sizeof(*h))) != NULL &&
                                    read(fd, hdata, sizeof(hdata)) == 
sizeof(hdata) &&
-                                   hdata[0] == (((size_t) 1 << 24) | 
HASH_VERSION) &&
+                                   hdata[0] == (
+#ifdef PERSISTENTHASH
+                                           ((size_t) 1 << 24) |
+#endif
+                                           HASH_VERSION) &&
                                    hdata[4] == (size_t) BATcount(b) &&
                                    fstat(fd, &st) == 0 &&
                                    st.st_size >= (off_t) (hp->size = hp->free 
= (hdata[1] + hdata[2]) * hdata[3] + HASH_HEADER_SIZE * SIZEOF_SIZE_T) &&
@@ -301,7 +303,6 @@ BATcheckhash(BAT *b)
                GDKfree(hp);
                GDKclrerr();    /* we're not currently interested in errors */
        }
-#endif
        ret = b->T->hash != NULL;
        MT_lock_unset(&GDKhashLock(abs(b->batCacheid)));
        ALGODEBUG if (ret) fprintf(stderr, "#BATcheckhash: already has hash %d, 
waited " LLFMT " usec\n", b->batCacheid, t);
@@ -592,21 +593,28 @@ HASHlist(Hash *h, BUN i)
 void
 HASHremove(BAT *b)
 {
-       if (b && b->T->hash) {
-               bat p = -VIEWtparent(b);
-               BAT *hp = NULL;
+       if (b) {
+               if (b->T->hash) {
+                       bat p = -VIEWtparent(b);
+                       BAT *hp = NULL;
 
-               if (p)
-                       hp = BBP_cache(p);
+                       if (p)
+                               hp = BBP_cache(p);
 
-               if ((!hp || b->T->hash != hp->T->hash) && b->T->hash != (Hash 
*) -1) {
-                       ALGODEBUG if (*(size_t *) b->T->hash->heap->base & (1 
<< 24))
-                               fprintf(stderr, "#HASHremove: removing 
persisted hash %d\n", b->batCacheid);
-                       HEAPfree(b->T->hash->heap, 1);
-                       GDKfree(b->T->hash->heap);
-                       GDKfree(b->T->hash);
+                       if ((!hp || b->T->hash != hp->T->hash) && b->T->hash != 
(Hash *) -1) {
+                               ALGODEBUG if (*(size_t *) 
b->T->hash->heap->base & (1 << 24))
+                                       fprintf(stderr, "#HASHremove: removing 
persisted hash %d\n", b->batCacheid);
+                               HEAPfree(b->T->hash->heap, 1);
+                               GDKfree(b->T->hash->heap);
+                               GDKfree(b->T->hash);
+                       }
+                       b->T->hash = NULL;
+               } else {
+                       GDKunlink(BBPselectfarm(b->batRole, b->ttype, hashheap),
+                                 BATDIR,
+                                 BBP_physical(b->batCacheid),
+                                 b->batCacheid > 0 ? "thash" : "hhash");
                }
-               b->T->hash = NULL;
        }
 }
 
@@ -621,6 +629,21 @@ HASHdestroy(BAT *b)
        }
 }
 
+void
+HASHfree(BAT *b)
+{
+       if (b) {
+               MT_lock_set(&GDKhashLock(abs(b->batCacheid)));
+               if (b->T->hash && b->T->hash != (Hash *) -1) {
+                       HEAPfree(b->T->hash->heap, 0);
+                       GDKfree(b->T->hash->heap);
+                       GDKfree(b->T->hash);
+               }
+               b->T->hash = NULL;
+               MT_lock_unset(&GDKhashLock(abs(b->batCacheid)));
+       }
+}
+
 int
 HASHgonebad(BAT *b, const void *v)
 {
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -381,7 +381,6 @@ freeClient(Client c)
                c->username = 0;
        }
        c->mythread = 0;
-       c->mode = MCshutdowninprogress()? BLOCKCLIENT: FREECLIENT;
        GDKfree(c->glb);
        c->glb = NULL;
        if( c->error_row){
@@ -394,6 +393,7 @@ freeClient(Client c)
        if (t)
                THRdel(t);  /* you may perform suicide */
        MT_sema_destroy(&c->s);
+       c->mode = MCshutdowninprogress()? BLOCKCLIENT: FREECLIENT;
 }
 
 /*
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -1158,11 +1158,13 @@ atom_neg( atom *a )
                break;
        case TYPE_dbl:
                a->data.val.dval = -a->data.val.dval;
+               if (a->data.val.dval == dbl_nil)
+                       return -1;
                break;
        default:
                return -1;
        }
-       if (a->d != dbl_nil)
+       if (a->d != dbl_nil && a->tpe.type->localtype != TYPE_dbl)
                a->d = -a->d;
        return 0;
 }
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -3464,8 +3464,16 @@ simple_scalar_exp:
                          assert($2->token != SQL_COLUMN || 
$2->data.lval->h->type != type_lng);
                          if ($2->token == SQL_COLUMN && $2->data.lval->h->type 
== type_int) {
                                atom *a = sql_bind_arg(m, 
$2->data.lval->h->data.i_val);
-                               if (!atom_neg(a))
+                               if (!atom_neg(a)) {
                                        $$ = $2;
+                               } else {
+                                       char *msg = sql_message("\b22003!value 
too large or not a number");
+
+                                       yyerror(m, msg);
+                                       _DELETE(msg);
+                                       $$ = NULL;
+                                       YYABORT;
+                               }
                          } 
                          if (!$$) {
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to