Changeset: 9e00075ee9af for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9e00075ee9af
Modified Files:
gdk/gdk.h
gdk/gdk_bat.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/scripts/26_sysmon.sql
Branch: strheapvacuum
Log Message:
merge default
diffs (truncated from 25491 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9208,7 +9208,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str, X_4:str):void ", "sql_analyze;", "" ]
[ "sql", "any", "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",
"SQLany_cmp;", "" ]
-[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:lng, X_5:any):int ", "mvc_append_wrap;", "" ]
+[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:bat[:oid], X_5:any):int ", "mvc_append_wrap;", "" ]
[ "sql", "argRecord", "pattern sql.argRecord():str ",
"SQLargRecord;", "" ]
[ "sql", "argRecord", "pattern sql.argRecord(X_0:any...):str ",
"SQLargRecord;", "" ]
[ "sql", "assert", "pattern sql.assert(X_0:bit, X_1:str):void ",
"SQLassert;", "" ]
@@ -9232,7 +9232,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int):bat[:any_1] ", "mvc_bind_idxbat_wrap;", ""
]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1])
", "mvc_bind_idxbat_wrap;", "" ]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",
"mvc_bind_idxbat_wrap;", "" ]
-[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng):lng ", "mvc_claim_wrap;", "" ]
+[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng):bat[:oid] ", "mvc_claim_wrap;", "" ]
[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str,
X_1:str):lng ", "mvc_clear_table_wrap;", "" ]
[ "sql", "commit", "unsafe pattern sql.commit():void ",
"SQLcommit;", "" ]
[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_0:ptr, X_1:str,
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str,
X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;", ""
]
@@ -9244,6 +9244,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "corr", "pattern sql.corr(X_0:int, X_1:int, X_2:bit, X_3:bit,
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", "" ]
[ "sql", "corr", "pattern sql.corr(X_0:lng, X_1:lng, X_2:bit, X_3:bit,
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", "" ]
[ "sql", "corr", "pattern sql.corr(X_0:sht, X_1:sht, X_2:bit, X_3:bit,
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", "" ]
+[ "sql", "count", "pattern sql.count(X_0:str, X_1:str):lng ",
"SQLbasecount;", "" ]
[ "sql", "count", "pattern sql.count(X_0:any_1, X_1:bit, X_2:bit,
X_3:bit, X_4:int, X_5:oid, X_6:oid):lng ", "SQLcount;", "" ]
[ "sql", "covariance", "pattern sql.covariance(X_0:bte, X_1:bte,
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcovar_samp;",
"" ]
[ "sql", "covariance", "pattern sql.covariance(X_0:dbl, X_1:dbl,
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcovar_samp;",
"" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12509,7 +12509,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str):void ", "sql_analyze;", "" ]
[ "sql", "analyze", "unsafe pattern sql.analyze(X_0:int, X_1:lng,
X_2:str, X_3:str, X_4:str):void ", "sql_analyze;", "" ]
[ "sql", "any", "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",
"SQLany_cmp;", "" ]
-[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:lng, X_5:any):int ", "mvc_append_wrap;", "" ]
+[ "sql", "append", "pattern sql.append(X_0:int, X_1:str, X_2:str,
X_3:str, X_4:bat[:oid], X_5:any):int ", "mvc_append_wrap;", "" ]
[ "sql", "argRecord", "pattern sql.argRecord():str ",
"SQLargRecord;", "" ]
[ "sql", "argRecord", "pattern sql.argRecord(X_0:any...):str ",
"SQLargRecord;", "" ]
[ "sql", "assert", "pattern sql.assert(X_0:bit, X_1:str):void ",
"SQLassert;", "" ]
@@ -12535,7 +12535,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int):bat[:any_1] ", "mvc_bind_idxbat_wrap;", ""
]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1])
", "mvc_bind_idxbat_wrap;", "" ]
[ "sql", "bind_idxbat", "pattern sql.bind_idxbat(X_0:int, X_1:str,
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",
"mvc_bind_idxbat_wrap;", "" ]
-[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng):lng ", "mvc_claim_wrap;", "" ]
+[ "sql", "claim", "unsafe pattern sql.claim(X_0:int, X_1:str,
X_2:str, X_3:lng):bat[:oid] ", "mvc_claim_wrap;", "" ]
[ "sql", "clear_table", "unsafe pattern sql.clear_table(X_0:str,
X_1:str):lng ", "mvc_clear_table_wrap;", "" ]
[ "sql", "commit", "unsafe pattern sql.commit():void ",
"SQLcommit;", "" ]
[ "sql", "copy_from", "unsafe pattern sql.copy_from(X_0:ptr, X_1:str,
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str,
X_10:int, X_11:int):bat[:any]... ", "mvc_import_table_wrap;", ""
]
@@ -12548,6 +12548,7 @@ stdout of test 'MAL-signatures` in direc
[ "sql", "corr", "pattern sql.corr(X_0:int, X_1:int, X_2:bit, X_3:bit,
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", "" ]
[ "sql", "corr", "pattern sql.corr(X_0:lng, X_1:lng, X_2:bit, X_3:bit,
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", "" ]
[ "sql", "corr", "pattern sql.corr(X_0:sht, X_1:sht, X_2:bit, X_3:bit,
X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcorr;", "" ]
+[ "sql", "count", "pattern sql.count(X_0:str, X_1:str):lng ",
"SQLbasecount;", "" ]
[ "sql", "count", "pattern sql.count(X_0:any_1, X_1:bit, X_2:bit,
X_3:bit, X_4:int, X_5:oid, X_6:oid):lng ", "SQLcount;", "" ]
[ "sql", "covariance", "pattern sql.covariance(X_0:bte, X_1:bte,
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcovar_samp;",
"" ]
[ "sql", "covariance", "pattern sql.covariance(X_0:dbl, X_1:dbl,
X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):dbl ", "SQLcovar_samp;",
"" ]
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
@@ -203,6 +203,7 @@ void BATtseqbase(BAT *b, oid o);
void BATundo(BAT *b);
BAT *BATunique(BAT *b, BAT *s);
BAT *BATunmask(BAT *b);
+gdk_return BATupdate(BAT *b, BAT *p, BAT *n, bool force)
__attribute__((__warn_unused_result__));
BBPrec *BBP[N_BBPINIT];
gdk_return BBPaddfarm(const char *dirname, uint32_t rolemask, bool logerror);
void BBPclear(bat bid);
@@ -541,8 +542,8 @@ gdk_return log_bat_transient(logger *lg,
gdk_return log_constant(logger *lg, int type, ptr val, log_id id, lng offset,
lng cnt);
gdk_return log_delta(logger *lg, BAT *uid, BAT *uval, log_id id);
gdk_return log_sequence(logger *lg, int seq, lng id);
-gdk_return log_tend(logger *lg);
-gdk_return log_tstart(logger *lg, ulng commit_ts, bool flush);
+gdk_return log_tend(logger *lg, ulng commit_ts);
+gdk_return log_tstart(logger *lg, bool flush);
gdk_return logger_activate(logger *lg);
lng logger_changes(logger *lg);
logger *logger_create(int debug, const char *fn, const char *logdir, int
version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void
*funcdata);
@@ -761,6 +762,7 @@ void MCcloseClient(Client c);
Client MCforkClient(Client father);
Client MCgetClient(int id);
Client MCinitClient(oid user, bstream *fin, stream *fout);
+size_t MCmemoryClaim(void);
int MCpushClientInput(Client c, bstream *new_input, int listing, char *prompt);
void MCstopClients(Client c);
str MCsuspendClient(int id);
diff --git a/cmake/monetdb-functions.cmake b/cmake/monetdb-functions.cmake
--- a/cmake/monetdb-functions.cmake
+++ b/cmake/monetdb-functions.cmake
@@ -8,7 +8,15 @@
function(monetdb_hg_revision)
# Get the current version control revision
- if(EXISTS "${CMAKE_SOURCE_DIR}/.hg")
+ if(EXISTS "${CMAKE_SOURCE_DIR}/.hg_archival.txt")
+ execute_process(COMMAND "sed" "-n" "s/^node:
\\([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\\).*/\\1/p"
".hg_archival.txt" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE
HG_RETURN_CODE
+ OUTPUT_VARIABLE HG_OUPUT_RES OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if(HG_RETURN_CODE EQUAL 0 AND HG_OUPUT_RES)
+ set(MERCURIAL_ID "${HG_OUPUT_RES}" PARENT_SCOPE)
+ else()
+ message(FATAL_ERROR "Failed to find mercurial ID")
+ endif()
+ elseif(EXISTS "${CMAKE_SOURCE_DIR}/.hg")
find_package(Hg)
if(HG_FOUND)
message("hg found: ${HG_EXECUTABLE}")
diff --git a/common/utils/mstring.h b/common/utils/mstring.h
--- a/common/utils/mstring.h
+++ b/common/utils/mstring.h
@@ -29,7 +29,10 @@ strcpy_len(char *restrict dst, const cha
if ((dst[i] = src[i]) == 0)
return i;
}
- dst[n - 1] = 0;
+ /* for correctness, the decrement isn't needed (just assigning 0
+ * to dst[n-1] would be sufficient), but to work around a too
+ * strict GNU C compiler, we do need it */
+ dst[--n] = 0;
/* in some versions of GCC (at least gcc (Ubuntu 7.5.0-3ubuntu1~18.04)
* 7.5.0), the error just can't be turned off when using
* --enable-strict, so we just use the (more) expensive way of getting the
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -557,8 +557,7 @@ typedef struct {
ATOMIC_TYPE refs; /* reference count for this heap */
bte farmid; /* id of farm where heap is located */
- bool hashash:1, /* the string heap contains hash values */
- cleanhash:1, /* string heaps must clean hash */
+ bool cleanhash:1, /* string heaps must clean hash */
dirty:1, /* specific heap dirty marker */
remove:1; /* remove storage file when freeing */
storage_t storage; /* storage mode (mmap/malloc). */
@@ -742,9 +741,10 @@ typedef struct {
#define assert_shift_width(shift,width) assert(((shift) == 0 && (width) == 0)
|| ((unsigned)1<<(shift)) == (unsigned)(width))
#define GDKLIBRARY_MINMAX_POS 061042U /* first in Nov2019: no min/max
position; no BBPinfo value */
-#define GDKLIBRARY_TAILN 061043U /* first after Oct2020: str offset
heaps names don't take width into account */
+#define GDKLIBRARY_TAILN 061043U /* first in Jul2021: str offset heaps
names don't take width into account */
+#define GDKLIBRARY_HASHASH 061044U /* first in Jul2021: hashash bit in
string heaps */
/* if the version number is updated, also fix snapshot_bats() in bat_logger.c
*/
-#define GDKLIBRARY 061044U /* first after Oct2020 */
+#define GDKLIBRARY 061045U /* first after Jul2021 */
typedef struct BAT {
/* static bat properties */
@@ -972,6 +972,8 @@ gdk_export gdk_return BATdel(BAT *b, BAT
gdk_export gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bool force)
__attribute__((__warn_unused_result__));
+gdk_export gdk_return BATupdate(BAT *b, BAT *p, BAT *n, bool force)
+ __attribute__((__warn_unused_result__));
/* Functions to perform a binary search on a sorted BAT.
* See gdk_search.c for details. */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -748,7 +748,6 @@ heapmove(Heap *dst, Heap *src)
dst->size = src->size;
dst->base = src->base;
dst->farmid = src->farmid;
- dst->hashash = src->hashash;
dst->cleanhash = src->cleanhash;
dst->storage = src->storage;
dst->newstorage = src->newstorage;
@@ -809,12 +808,12 @@ COLcopy(BAT *b, int tt, bool writable, r
/* first try case (1); create a view, possibly with different
* atom-types */
- if (role == b->batRole &&
+ if (!writable &&
+ role == b->batRole &&
b->batRestricted == BAT_READ &&
ATOMstorage(b->ttype) != TYPE_msk && /* no view on TYPE_msk */
(!VIEWtparent(b) ||
- BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ) &&
- !writable) {
+ BBP_cache(VIEWtparent(b))->batRestricted == BAT_READ)) {
bn = VIEWcreate(b->hseqbase, b);
if (bn == NULL)
return NULL;
@@ -875,8 +874,8 @@ COLcopy(BAT *b, int tt, bool writable, r
strconcat_len(thp.filename, sizeof(thp.filename),
BBP_physical(bn->batCacheid),
".theap", NULL);
- if ((b->ttype && HEAPcopy(&bthp, b->theap) !=
GDK_SUCCEED) ||
- (bn->tvheap && HEAPcopy(&thp, b->tvheap) !=
GDK_SUCCEED)) {
+ if ((b->ttype && HEAPcopy(&bthp, b->theap, b->tbaseoff
<< b->tshift) != GDK_SUCCEED) ||
+ (bn->tvheap && HEAPcopy(&thp, b->tvheap, 0) !=
GDK_SUCCEED)) {
HEAPfree(&thp, true);
HEAPfree(&bthp, true);
BBPreclaim(bn);
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -32,7 +32,7 @@ unshare_varsized_heap(BAT *b)
h->farmid = BBPselectfarm(b->batRole, TYPE_str, varheap);
strconcat_len(h->filename, sizeof(h->filename),
BBP_physical(b->batCacheid), ".theap", NULL);
- if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+ if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
@@ -82,8 +82,7 @@ insert_string_bat(BAT *b, BAT *n, struct
ni = bat_iterator(n);
tp = NULL;
if (oldcnt == 0 || (!GDK_ELIMDOUBLES(b->tvheap) &&
- !GDK_ELIMDOUBLES(n->tvheap) &&
- b->tvheap->hashash == n->tvheap->hashash)) {
+ !GDK_ELIMDOUBLES(n->tvheap))) {
if (b->batRole == TRANSIENT || b->tvheap == n->tvheap) {
/* If b is in the transient farm (i.e. b will
* never become persistent), we try some
@@ -185,15 +184,13 @@ insert_string_bat(BAT *b, BAT *n, struct
* individually, but reusing the string in b's
* string heap. */
int match = 0, i;
- size_t len = b->tvheap->hashash ? 1024 * EXTRALEN : 0;
+ size_t len = 0;
for (i = 0; i < 1024; i++) {
p = (BUN) (((double) rand() / RAND_MAX) * (cnt
- 1));
p = canditer_idx(ci, p) - n->hseqbase;
off = BUNtvaroff(ni, p);
if (off < b->tvheap->free &&
- strcmp(b->tvheap->base + off,
n->tvheap->base + off) == 0 &&
- (!b->tvheap->hashash ||
- ((BUN *) (b->tvheap->base + off))[-1] ==
(n->tvheap->hashash ? ((BUN *) (n->tvheap->base + off))[-1] :
strHash(n->tvheap->base + off))))
+ strcmp(b->tvheap->base + off,
n->tvheap->base + off) == 0)
match++;
len += (strlen(n->tvheap->base + off) + 8) & ~7;
}
@@ -358,9 +355,7 @@ insert_string_bat(BAT *b, BAT *n, struct
off = BUNtvaroff(ni, p); /* the offset */
tp = n->tvheap->base + off; /* the string */
if (off < b->tvheap->free &&
- strcmp(b->tvheap->base + off, tp) == 0 &&
- (!b->tvheap->hashash ||
- ((BUN *) (b->tvheap->base + off))[-1] ==
(n->tvheap->hashash ? ((BUN *) tp)[-1] : strHash(tp)))) {
+ strcmp(b->tvheap->base + off, tp) == 0) {
/* we found the string at the same
* offset in b's string heap as it was
* in n's string heap, so we don't
@@ -496,7 +491,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
h->farmid = BBPselectfarm(b->batRole, b->ttype, varheap);
strconcat_len(h->filename, sizeof(h->filename),
BBP_physical(b->batCacheid), ".theap", NULL);
- if (HEAPcopy(h, b->tvheap) != GDK_SUCCEED) {
+ if (HEAPcopy(h, b->tvheap, 0) != GDK_SUCCEED) {
HEAPfree(h, true);
GDKfree(h);
return GDK_FAIL;
@@ -1090,8 +1085,8 @@ BATdel(BAT *b, BAT *d)
* The last in this series is a BATreplace, which replaces all the
* buns mentioned.
*/
-gdk_return
-BATreplace(BAT *b, BAT *p, BAT *n, bool force)
+static gdk_return
+BATappend_or_update(BAT *b, BAT *p, BAT *n, bool mayappend, bool force)
{
lng t0 = GDKusec();
@@ -1116,12 +1111,14 @@ BATreplace(BAT *b, BAT *p, BAT *n, bool
BATiter bi = bat_iterator(b);
BATiter ni = bat_iterator(n);
+#if 0 /* questionable: what if p point outside b, even if !mayappend? */
if (BATcount(b) == 0 ||
(b->tsorted && b->trevsorted &&
n->tsorted && n->trevsorted &&
ATOMcmp(b->ttype, BUNtail(bi, 0), BUNtail(ni, 0)) == 0)) {
return GDK_SUCCEED;
}
+#endif
OIDXdestroy(b);
IMPSdestroy(b);
@@ -1146,7 +1143,8 @@ BATreplace(BAT *b, BAT *p, BAT *n, bool
for (BUN i = 0, j = BATcount(p); i < j; i++) {
oid updid = BUNtoid(p, i);
- if (updid < b->hseqbase || updid >= hseqend) {
+ if (updid < b->hseqbase ||
+ (!mayappend && updid >= hseqend)) {
GDKerror("id out of range\n");
return GDK_FAIL;
}
@@ -1156,8 +1154,20 @@ BATreplace(BAT *b, BAT *p, BAT *n, bool
return GDK_FAIL;
}
+ const void *new = BUNtvar(ni, i);
+
+ if (updid >= BATcount(b)) {
+ assert(mayappend);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list