Changeset: fcda84a42c58 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fcda84a42c58
Modified Files:
        gdk/gdk_aggr.c
        gdk/gdk_batop.c
Branch: analyze-fix
Log Message:

Merged with Jan2022


diffs (193 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -1942,6 +1942,7 @@ dump_table_alters(Mapi mid, const char *
        }
        rc = 0;                                         /* success */
   bailout:
+       free(query);
        free(s);
        free(t);
        mapi_close_handle(hdl);         /* may be NULL */
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3823,18 +3823,22 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
                }
                if (is_oid_nil(pos)) {
                        res = ATOMnilptr(b->ttype);
-                       b->tminpos = BUN_NONE;
                } else {
-                       BUN minpos = pos - b->hseqbase;
-                       res = BUNtail(bi, minpos);
-                       b->tminpos = minpos;
-               }
-               if (VIEWtparent(b)) {
-                       BAT *pb = BBP_cache(VIEWtparent(b));
-                       MT_lock_set(&pb->theaplock);
-                       if (bi.count == BATcount(pb))
-                               pb->tminpos = b->tminpos;
-                       MT_lock_unset(&pb->theaplock);
+                       bi.minpos = pos - b->hseqbase;
+                       res = BUNtail(bi, bi.minpos);
+                       MT_lock_set(&b->theaplock);
+                       if (bi.count == BATcount(b) && bi.h == b->theap)
+                               b->tminpos = bi.minpos;
+                       MT_lock_unset(&b->theaplock);
+                       bat pbid = VIEWtparent(b);
+                       if (pbid) {
+                               BAT *pb = BBP_cache(pbid);
+                               MT_lock_set(&pb->theaplock);
+                               if (bi.count == BATcount(pb) &&
+                                   bi.h == pb->theap)
+                                       pb->tminpos = bi.minpos;
+                               MT_lock_unset(&pb->theaplock);
+                       }
                }
        }
        if (aggr == NULL) {
@@ -3973,18 +3977,22 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
                }
                if (is_oid_nil(pos)) {
                        res = ATOMnilptr(b->ttype);
-                       b->tmaxpos = BUN_NONE;
                } else {
-                       BUN maxpos = pos - b->hseqbase;
-                       res = BUNtail(bi, maxpos);
-                       b->tmaxpos = maxpos;
-               }
-               if (VIEWtparent(b)) {
-                       BAT *pb = BBP_cache(VIEWtparent(b));
-                       MT_lock_set(&pb->theaplock);
-                       if (bi.count == BATcount(pb))
-                               pb->tmaxpos = b->tmaxpos;
-                       MT_lock_unset(&pb->theaplock);
+                       bi.maxpos = pos - b->hseqbase;
+                       res = BUNtail(bi, bi.maxpos);
+                       MT_lock_set(&b->theaplock);
+                       if (bi.count == BATcount(b) && bi.h == b->theap)
+                               b->tmaxpos = bi.maxpos;
+                       MT_lock_unset(&b->theaplock);
+                       bat pbid = VIEWtparent(b);
+                       if (pbid) {
+                               BAT *pb = BBP_cache(pbid);
+                               MT_lock_set(&pb->theaplock);
+                               if (bi.count == BATcount(pb) &&
+                                   bi.h == pb->theap)
+                                       pb->tmaxpos = bi.maxpos;
+                               MT_lock_unset(&pb->theaplock);
+                       }
                }
        }
        if (aggr == NULL) {
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2960,11 +2960,30 @@ BATcount_no_nil(BAT *b, BAT *s)
                }
                break;
        }
-       if (cnt == BATcount(b)) {
-               /* we learned something */
-               b->tnonil = true;
-               assert(!b->tnil);
-               b->tnil = false;
+       if (cnt == bi.count) {
+               MT_lock_set(&b->theaplock);
+               if (cnt == BATcount(b) && bi.h == b->theap) {
+                       /* we learned something */
+                       b->batDirtydesc = true;
+                       b->tnonil = true;
+                       assert(!b->tnil);
+                       b->tnil = false;
+               }
+               MT_lock_unset(&b->theaplock);
+               bat pbid = VIEWtparent(b);
+               if (pbid) {
+                       BAT *pb = BBP_cache(pbid);
+                       MT_lock_set(&pb->theaplock);
+                       if (cnt == BATcount(pb) &&
+                           bi.h == pb->theap &&
+                           !pb->tnonil) {
+                               pb->batDirtydesc = true;
+                               pb->tnonil = true;
+                               assert(!pb->tnil);
+                               pb->tnil = false;
+                       }
+                       MT_lock_unset(&pb->theaplock);
+               }
        }
        bat_iterator_end(&bi);
        return cnt;
diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -273,6 +273,21 @@ BATunique(BAT *b, BAT *s)
                TIMEOUT_CHECK(timeoffset,
                              GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
        }
+       if (BATcount(bn) == bi.count) {
+               /* it turns out all values are distinct */
+               MT_lock_set(&b->theaplock);
+               if (BATcount(b) == bi.count) {
+                       /* and the input hasn't changed in the mean
+                        * time--the only allowed change being appends;
+                        * updates not allowed since the candidate list
+                        * covers the complete bat */
+                       assert(b->tnokey[0] == 0);
+                       assert(b->tnokey[1] == 0);
+                       b->tkey = true;
+                       b->batDirtydesc = true;
+               }
+               MT_lock_unset(&b->theaplock);
+       }
        bat_iterator_end(&bi);
 
        bn->theap->dirty = true;
@@ -281,13 +296,6 @@ BATunique(BAT *b, BAT *s)
        bn->tkey = true;
        bn->tnil = false;
        bn->tnonil = true;
-       if (BATcount(bn) == bi.count) {
-               /* it turns out all values are distinct */
-               assert(b->tnokey[0] == 0);
-               assert(b->tnokey[1] == 0);
-               b->tkey = true;
-               b->batDirtydesc = true;
-       }
        bn = virtualize(bn);
        MT_thread_setalgorithm(algomsg);
        TRC_DEBUG(ALGO, "b=" ALGOBATFMT
diff --git a/sql/test/emptydb/Tests/check.stable.out 
b/sql/test/emptydb/Tests/check.stable.out
--- a/sql/test/emptydb/Tests/check.stable.out
+++ b/sql/test/emptydb/Tests/check.stable.out
@@ -975,6 +975,7 @@ CREATE TABLE "sys"."dependency_types" ("
 ALTER TABLE "sys"."dependency_types" SET READ ONLY;
 CREATE TABLE "sys"."dump_statements" ("o" INTEGER, "s" CHARACTER LARGE OBJECT);
 CREATE TABLE "sys"."fkey_actions" ("action_id" SMALLINT NOT NULL, 
"action_name" VARCHAR(15) NOT NULL, CONSTRAINT "fkey_actions_action_id_pkey" 
PRIMARY KEY ("action_id"));
+ALTER TABLE "sys"."fkey_actions" SET READ ONLY;
 CREATE TABLE "sys"."function_languages" ("language_id" SMALLINT NOT NULL, 
"language_name" VARCHAR(20) NOT NULL, "language_keyword" VARCHAR(20), 
CONSTRAINT "function_languages_language_id_pkey" PRIMARY KEY ("language_id"), 
CONSTRAINT "function_languages_language_name_unique" UNIQUE ("language_name"));
 ALTER TABLE "sys"."function_languages" SET READ ONLY;
 CREATE TABLE "sys"."function_types" ("function_type_id" SMALLINT NOT NULL, 
"function_type_name" VARCHAR(30) NOT NULL, "function_type_keyword" VARCHAR(30) 
NOT NULL, CONSTRAINT "function_types_function_type_id_pkey" PRIMARY KEY 
("function_type_id"), CONSTRAINT "function_types_function_type_name_unique" 
UNIQUE ("function_type_name"));
diff --git a/sql/test/emptydb/Tests/check.stable.out.32bit 
b/sql/test/emptydb/Tests/check.stable.out.32bit
--- a/sql/test/emptydb/Tests/check.stable.out.32bit
+++ b/sql/test/emptydb/Tests/check.stable.out.32bit
@@ -975,6 +975,7 @@ CREATE TABLE "sys"."dependency_types" ("
 ALTER TABLE "sys"."dependency_types" SET READ ONLY;
 CREATE TABLE "sys"."dump_statements" ("o" INTEGER, "s" CHARACTER LARGE OBJECT);
 CREATE TABLE "sys"."fkey_actions" ("action_id" SMALLINT NOT NULL, 
"action_name" VARCHAR(15) NOT NULL, CONSTRAINT "fkey_actions_action_id_pkey" 
PRIMARY KEY ("action_id"));
+ALTER TABLE "sys"."fkey_actions" SET READ ONLY;
 CREATE TABLE "sys"."function_languages" ("language_id" SMALLINT NOT NULL, 
"language_name" VARCHAR(20) NOT NULL, "language_keyword" VARCHAR(20), 
CONSTRAINT "function_languages_language_id_pkey" PRIMARY KEY ("language_id"), 
CONSTRAINT "function_languages_language_name_unique" UNIQUE ("language_name"));
 ALTER TABLE "sys"."function_languages" SET READ ONLY;
 CREATE TABLE "sys"."function_types" ("function_type_id" SMALLINT NOT NULL, 
"function_type_name" VARCHAR(30) NOT NULL, "function_type_keyword" VARCHAR(30) 
NOT NULL, CONSTRAINT "function_types_function_type_id_pkey" PRIMARY KEY 
("function_type_id"), CONSTRAINT "function_types_function_type_name_unique" 
UNIQUE ("function_type_name"));
diff --git a/sql/test/emptydb/Tests/check.stable.out.int128 
b/sql/test/emptydb/Tests/check.stable.out.int128
--- a/sql/test/emptydb/Tests/check.stable.out.int128
+++ b/sql/test/emptydb/Tests/check.stable.out.int128
@@ -975,6 +975,7 @@ CREATE TABLE "sys"."dependency_types" ("
 ALTER TABLE "sys"."dependency_types" SET READ ONLY;
 CREATE TABLE "sys"."dump_statements" ("o" INTEGER, "s" CHARACTER LARGE OBJECT);
 CREATE TABLE "sys"."fkey_actions" ("action_id" SMALLINT NOT NULL, 
"action_name" VARCHAR(15) NOT NULL, CONSTRAINT "fkey_actions_action_id_pkey" 
PRIMARY KEY ("action_id"));
+ALTER TABLE "sys"."fkey_actions" SET READ ONLY;
 CREATE TABLE "sys"."function_languages" ("language_id" SMALLINT NOT NULL, 
"language_name" VARCHAR(20) NOT NULL, "language_keyword" VARCHAR(20), 
CONSTRAINT "function_languages_language_id_pkey" PRIMARY KEY ("language_id"), 
CONSTRAINT "function_languages_language_name_unique" UNIQUE ("language_name"));
 ALTER TABLE "sys"."function_languages" SET READ ONLY;
 CREATE TABLE "sys"."function_types" ("function_type_id" SMALLINT NOT NULL, 
"function_type_name" VARCHAR(30) NOT NULL, "function_type_keyword" VARCHAR(30) 
NOT NULL, CONSTRAINT "function_types_function_type_id_pkey" PRIMARY KEY 
("function_type_id"), CONSTRAINT "function_types_function_type_name_unique" 
UNIQUE ("function_type_name"));
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to