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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list