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