Changeset: 4e23fd3ed5c7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4e23fd3ed5c7
Modified Files:
gdk/gdk_batop.c
gdk/gdk_bbp.c
sql/test/BugTracker-2024/Tests/All
Branch: default
Log Message:
Merge with Dec2023 branch.
diffs (264 lines):
diff --git a/clients/mapiclient/mhelp.c b/clients/mapiclient/mhelp.c
--- a/clients/mapiclient/mhelp.c
+++ b/clients/mapiclient/mhelp.c
@@ -92,10 +92,10 @@ SQLhelp sqlhelp1[] = {
"ident",
"See also
https://www.monetdb.org/documentation/user-guide/sql-manual/data-definition/privileges/"},
{"ANALYZE",
- "Collect column/table/schema data statistics for analysis and
optimizer usage",
- "ANALYZE ident [ . ident [ column_list ] ] [SAMPLE size] [MINMAX]",
+ "Analyze and update column data statistics of column(s) of one or all
tables in a schema",
+ "ANALYZE ident [ . ident [ column_list ] ]",
"ident,column_list",
- "See also
https://www.monetdb.org/documentation/admin-guide/monitoring/table-statistics/"},
+ "See also
https://www.monetdb.org/documentation/user-guide/sql-manual/data-manipulation/analyze-statement/"},
{"CALL",
"Call a stored procedure",
"CALL qname '(' [ scalar_expression [',' ...] ] ')' | CALL ident '.'
ident",
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -1312,6 +1312,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
bool isnil = atomcmp(new, nil) == 0;
anynil |= isnil;
+ MT_lock_set(&b->theaplock);
if (old == NULL ||
(b->tnil &&
!anynil &&
@@ -1324,6 +1325,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
}
b->tnonil &= !isnil;
b->tnil |= isnil;
+ MT_lock_unset(&b->theaplock);
if (bi.maxpos != BUN_NONE) {
if (!isnil &&
atomcmp(BUNtvar(bi, bi.maxpos), new) < 0) {
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1763,8 +1763,13 @@ BBPtrim(bool aggressive, bat nbat)
MT_lock_set(&b->theaplock);
if (!BATshared(b) &&
!isVIEW(b) &&
- (!BATdirty(b) || (aggressive && b->theap->storage
== STORE_MMAP && (b->tvheap == NULL || b->tvheap->storage == STORE_MMAP))) &&
- (b->batRole == PERSISTENT && BBP_lrefs(bid) <= 2)) {
+ (!BATdirty(b) ||
+ (aggressive &&
+ b->theap->storage == STORE_MMAP &&
+ (b->tvheap == NULL ||
+ b->tvheap->storage == STORE_MMAP)) ||
+ (b->batRole == PERSISTENT &&
+ BBP_lrefs(bid) <= 2))) {
BBP_status_on(bid, BBPUNLOADING);
swap = true;
waitctr += BATdirty(b) ? 9 : 1;
@@ -4850,51 +4855,100 @@ BBPtmunlock(void)
void
BBPprintinfo(void)
{
- size_t tmem = 0, tvm = 0;
- size_t pmem = 0, pvm = 0;
- int tn = 0;
- int pn = 0;
- int nh = 0;
+ /* 32 categories for the bats, not all are expected to be filled */
+ struct counters {
+ size_t sz;
+ size_t vmsz;
+ int nr;
+ } bats[2][2][2][2][2] = {0};
+ int nbats = 0;
BBPtmlock();
bat sz = (bat) ATOMIC_GET(&BBPsize);
for (bat i = 1; i < sz; i++) {
MT_lock_set(&GDKswapLock(i));
- if (BBP_refs(i) > 0 || BBP_lrefs(i) > 0) {
+ int r;
+ if ((r = BBP_refs(i)) > 0 || BBP_lrefs(i) > 0) {
BAT *b = BBP_desc(i);
- ATOMIC_BASE_TYPE status = BBP_status(i);
- nh += (status & BBPHOT) != 0;
+ nbats++;
MT_lock_set(&b->theaplock);
- if (status & BBPPERSISTENT) {
- pn++;
- pmem += HEAPmemsize(b->theap);
- pvm += HEAPvmsize(b->theap);
- pmem += HEAPmemsize(b->tvheap);
- pvm += HEAPvmsize(b->tvheap);
- } else {
- tn++;
- if (b->theap &&
- b->theap->parentid == b->batCacheid) {
- tmem += HEAPmemsize(b->theap);
- tvm += HEAPvmsize(b->theap);
- }
- if (b->tvheap &&
- b->tvheap->parentid == b->batCacheid) {
- tmem += HEAPmemsize(b->tvheap);
- tvm += HEAPvmsize(b->tvheap);
- }
- }
+ ATOMIC_BASE_TYPE status = BBP_status(i);
+ struct counters *bt = &bats[r > 0][BATdirty(b)][(status
& BBPPERSISTENT) != 0][(status & BBPLOADED) != 0][(status & BBPHOT) != 0];
+ bt->nr++;
+ bt->sz += HEAPmemsize(b->theap) +
HEAPmemsize(b->tvheap);
+ bt->vmsz += HEAPvmsize(b->theap) +
HEAPvmsize(b->tvheap);
+ MT_lock_unset(&b->theaplock);
MT_lock_unset(&b->theaplock);
}
MT_lock_unset(&GDKswapLock(i));
}
uint32_t nfree = BBP_nfree;
BBPtmunlock();
- printf("%d persistent bats using %zu virtual memory (%zu malloced)\n",
- pn, pvm, pmem);
- printf("%d transient bats using %zu virtual memory (%zu malloced)\n",
- tn, tvm, tmem);
- printf("%d bats are \"hot\" (i.e. currently or recently used)\n", nh);
- printf("%d bats total, %"PRIu32" free bats in common shared list\n",
- sz - 1, nfree);
+ if (bats[1][1][1][1][1].nr > 0)
+ printf("fix, dirty, persistent, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][1][1][1].nr, bats[1][1][1][1][1].vmsz,
bats[1][1][1][1][1].sz);
+ if (bats[1][1][1][1][0].nr > 0)
+ printf("fix, dirty, persistent, not loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][1][1][0].nr, bats[1][1][1][1][0].vmsz,
bats[1][1][1][1][0].sz);
+ if (bats[1][1][1][0][1].nr > 0)
+ printf("fix, dirty, persistent, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][1][0][1].nr, bats[1][1][1][0][1].vmsz,
bats[1][1][1][0][1].sz);
+ if (bats[1][1][1][0][0].nr > 0)
+ printf("fix, dirty, persistent, not loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][1][0][0].nr, bats[1][1][1][0][0].vmsz,
bats[1][1][1][0][0].sz);
+ if (bats[1][1][0][1][1].nr > 0)
+ printf("fix, dirty, transient, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][0][1][1].nr, bats[1][1][0][1][1].vmsz,
bats[1][1][0][1][1].sz);
+ if (bats[1][1][0][1][0].nr > 0)
+ printf("fix, dirty, transient, not loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][0][1][0].nr, bats[1][1][0][1][0].vmsz,
bats[1][1][0][1][0].sz);
+ if (bats[1][1][0][0][1].nr > 0)
+ printf("fix, dirty, transient, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][0][0][1].nr, bats[1][1][0][0][1].vmsz,
bats[1][1][0][0][1].sz);
+ if (bats[1][1][0][0][0].nr > 0)
+ printf("fix, dirty, transient, not loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][1][0][0][0].nr, bats[1][1][0][0][0].vmsz,
bats[1][1][0][0][0].sz);
+ if (bats[1][0][1][1][1].nr > 0)
+ printf("fix, clean, persistent, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][1][1][1].nr, bats[1][0][1][1][1].vmsz,
bats[1][0][1][1][1].sz);
+ if (bats[1][0][1][1][0].nr > 0)
+ printf("fix, clean, persistent, not loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][1][1][0].nr, bats[1][0][1][1][0].vmsz,
bats[1][0][1][1][0].sz);
+ if (bats[1][0][1][0][1].nr > 0)
+ printf("fix, clean, persistent, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][1][0][1].nr, bats[1][0][1][0][1].vmsz,
bats[1][0][1][0][1].sz);
+ if (bats[1][0][1][0][0].nr > 0)
+ printf("fix, clean, persistent, not loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][1][0][0].nr, bats[1][0][1][0][0].vmsz,
bats[1][0][1][0][0].sz);
+ if (bats[1][0][0][1][1].nr > 0)
+ printf("fix, clean, transient, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][0][1][1].nr, bats[1][0][0][1][1].vmsz,
bats[1][0][0][1][1].sz);
+ if (bats[1][0][0][1][0].nr > 0)
+ printf("fix, clean, transient, not loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][0][1][0].nr, bats[1][0][0][1][0].vmsz,
bats[1][0][0][1][0].sz);
+ if (bats[1][0][0][0][1].nr > 0)
+ printf("fix, clean, transient, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][0][0][1].nr, bats[1][0][0][0][1].vmsz,
bats[1][0][0][0][1].sz);
+ if (bats[1][0][0][0][0].nr > 0)
+ printf("fix, clean, transient, not loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[1][0][0][0][0].nr, bats[1][0][0][0][0].vmsz,
bats[1][0][0][0][0].sz);
+ if (bats[0][1][1][1][1].nr > 0)
+ printf("no fix, dirty, persistent, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[0][1][1][1][1].nr, bats[0][1][1][1][1].vmsz,
bats[0][1][1][1][1].sz);
+ if (bats[0][1][1][1][0].nr > 0)
+ printf("no fix, dirty, persistent, not loaded, hot: %d bats,
%zu virtual, %zu malloc\n", bats[0][1][1][1][0].nr, bats[0][1][1][1][0].vmsz,
bats[0][1][1][1][0].sz);
+ if (bats[0][1][1][0][1].nr > 0)
+ printf("no fix, dirty, persistent, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[0][1][1][0][1].nr, bats[0][1][1][0][1].vmsz,
bats[0][1][1][0][1].sz);
+ if (bats[0][1][1][0][0].nr > 0)
+ printf("no fix, dirty, persistent, not loaded, cold: %d bats,
%zu virtual, %zu malloc\n", bats[0][1][1][0][0].nr, bats[0][1][1][0][0].vmsz,
bats[0][1][1][0][0].sz);
+ if (bats[0][1][0][1][1].nr > 0)
+ printf("no fix, dirty, transient, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[0][1][0][1][1].nr, bats[0][1][0][1][1].vmsz,
bats[0][1][0][1][1].sz);
+ if (bats[0][1][0][1][0].nr > 0)
+ printf("no fix, dirty, transient, not loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[0][1][0][1][0].nr, bats[0][1][0][1][0].vmsz,
bats[0][1][0][1][0].sz);
+ if (bats[0][1][0][0][1].nr > 0)
+ printf("no fix, dirty, transient, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[0][1][0][0][1].nr, bats[0][1][0][0][1].vmsz,
bats[0][1][0][0][1].sz);
+ if (bats[0][1][0][0][0].nr > 0)
+ printf("no fix, dirty, transient, not loaded, cold: %d bats,
%zu virtual, %zu malloc\n", bats[0][1][0][0][0].nr, bats[0][1][0][0][0].vmsz,
bats[0][1][0][0][0].sz);
+ if (bats[0][0][1][1][1].nr > 0)
+ printf("no fix, clean, persistent, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[0][0][1][1][1].nr, bats[0][0][1][1][1].vmsz,
bats[0][0][1][1][1].sz);
+ if (bats[0][0][1][1][0].nr > 0)
+ printf("no fix, clean, persistent, not loaded, hot: %d bats,
%zu virtual, %zu malloc\n", bats[0][0][1][1][0].nr, bats[0][0][1][1][0].vmsz,
bats[0][0][1][1][0].sz);
+ if (bats[0][0][1][0][1].nr > 0)
+ printf("no fix, clean, persistent, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[0][0][1][0][1].nr, bats[0][0][1][0][1].vmsz,
bats[0][0][1][0][1].sz);
+ if (bats[0][0][1][0][0].nr > 0)
+ printf("no fix, clean, persistent, not loaded, cold: %d bats,
%zu virtual, %zu malloc\n", bats[0][0][1][0][0].nr, bats[0][0][1][0][0].vmsz,
bats[0][0][1][0][0].sz);
+ if (bats[0][0][0][1][1].nr > 0)
+ printf("no fix, clean, transient, loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[0][0][0][1][1].nr, bats[0][0][0][1][1].vmsz,
bats[0][0][0][1][1].sz);
+ if (bats[0][0][0][1][0].nr > 0)
+ printf("no fix, clean, transient, not loaded, hot: %d bats, %zu
virtual, %zu malloc\n", bats[0][0][0][1][0].nr, bats[0][0][0][1][0].vmsz,
bats[0][0][0][1][0].sz);
+ if (bats[0][0][0][0][1].nr > 0)
+ printf("no fix, clean, transient, loaded, cold: %d bats, %zu
virtual, %zu malloc\n", bats[0][0][0][0][1].nr, bats[0][0][0][0][1].vmsz,
bats[0][0][0][0][1].sz);
+ if (bats[0][0][0][0][0].nr > 0)
+ printf("no fix, clean, transient, not loaded, cold: %d bats,
%zu virtual, %zu malloc\n", bats[0][0][0][0][0].nr, bats[0][0][0][0][0].vmsz,
bats[0][0][0][0][0].sz);
+
+ printf("%d bats total, %d in use, %"PRIu32" free bats in common shared
list\n",
+ sz - 1, nbats, nfree);
}
diff --git a/sql/test/BugTracker-2024/Tests/All
b/sql/test/BugTracker-2024/Tests/All
--- a/sql/test/BugTracker-2024/Tests/All
+++ b/sql/test/BugTracker-2024/Tests/All
@@ -52,3 +52,4 @@ CMDgen_group-Bug-7486
sql_init_subtype-Bug-7487
orderby-max-over-rows-Bug-7488
rel2bin_select-Bug-7496
+multicolumn_IN_value_list-Bug-7497
diff --git
a/sql/test/BugTracker-2024/Tests/multicolumn_IN_value_list-Bug-7497.test
b/sql/test/BugTracker-2024/Tests/multicolumn_IN_value_list-Bug-7497.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2024/Tests/multicolumn_IN_value_list-Bug-7497.test
@@ -0,0 +1,61 @@
+statement ok
+CREATE TABLE l (l1 INT, l2 INT, l3 INT);
+
+statement ok
+INSERT INTO l VALUES (42, 44, 11), (41, 45, 22), (43, 42, 33);
+
+statement ok
+CREATE TABLE s (s1 INT, s2 INT, s3 INT);
+
+statement ok
+INSERT INTO s VALUES (41, 44, 10), (42, 44, 20), (34, 44, 30), (41, 45, 40),
(34, 45, 50), (34, 44, 60), (42, 44, 70), (42, 44, 80);
+
+skipif knownfail
+query III nosort
+SELECT * FROM s WHERE (s1, s2) IN ((42,44), (41,45), (43,42)) ORDER BY s3;
+----
+42
+44
+20
+41
+45
+40
+42
+44
+70
+42
+44
+80
+
+query III nosort
+SELECT * FROM s WHERE (s1, s2) IN (VALUES (42,44), (41,45), (43,42)) ORDER BY
s3;
+----
+42
+44
+20
+41
+45
+40
+42
+44
+70
+42
+44
+80
+
+query III nosort
+SELECT * FROM s WHERE (s1, s2) IN (SELECT l1, l2 FROM l) ORDER BY s3;
+----
+42
+44
+20
+41
+45
+40
+42
+44
+70
+42
+44
+80
+
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]