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