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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to