Changeset: 807f421f99b9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=807f421f99b9
Modified Files:
        gdk/ChangeLog.Jul2017
        gdk/gdk_batop.c
        gdk/gdk_logger.c
Branch: Jul2017
Log Message:

Fixed bug in BATappend of string BAT with candidate list.


diffs (104 lines):

diff --git a/gdk/ChangeLog.Jul2017 b/gdk/ChangeLog.Jul2017
--- a/gdk/ChangeLog.Jul2017
+++ b/gdk/ChangeLog.Jul2017
@@ -1,3 +1,7 @@
 # ChangeLog file for MonetDB
 # This file is updated with Maddlog
 
+* Mon Oct 23 2017 Sjoerd Mullender <sjo...@acm.org>
+- A serious bug, possibly resulting in database corruption, having to
+  do with appending data to a string BAT was fixed.
+
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -226,7 +226,7 @@ insert_string_bat(BAT *b, BAT *n, BAT *s
                }
        } else if (unshare_string_heap(b) != GDK_SUCCEED)
                return GDK_FAIL;
-       if (toff == 0 && n->twidth == b->twidth) {
+       if (toff == 0 && n->twidth == b->twidth && cand == NULL) {
                /* we don't need to do any translation of offset
                 * values, so we can use fast memcpy */
                memcpy(Tloc(b, BUNlast(b)), Tloc(n, start),
@@ -531,24 +531,27 @@ BATappend(BAT *b, BAT *n, BAT *s, bit fo
 
        r = BUNlast(b);
 
-       if (BATcount(b) == 0 && cand == NULL) {
+       if (BATcount(b) == 0) {
                BATiter ni = bat_iterator(n);
 
                b->tsorted = n->tsorted;
-               b->tnosorted = start <= n->tnosorted && n->tnosorted < end ? 
n->tnosorted - start : 0;
                b->trevsorted = n->trevsorted;
-               b->tnorevsorted = start <= n->tnorevsorted && n->tnorevsorted < 
end ? n->tnorevsorted - start : 0;
                b->tdense = n->tdense && cand == NULL;
-               b->tnodense = start <= n->tnodense && n->tnodense < end ? 
n->tnodense - start : 0;
                b->tnonil = n->tnonil;
                b->tnil = n->tnil && cnt == BATcount(n);
                b->tseqbase = oid_nil;
                if (cand == NULL) {
+                       b->tnosorted = start <= n->tnosorted && n->tnosorted < 
end ? n->tnosorted - start : 0;
+                       b->tnorevsorted = start <= n->tnorevsorted && 
n->tnorevsorted < end ? n->tnorevsorted - start : 0;
+                       b->tnodense = start <= n->tnodense && n->tnodense < end 
? n->tnodense - start : 0;
                        if (n->tdense && n->ttype == TYPE_oid)
                                b->tseqbase = *(oid *) BUNtail(ni, start);
                        else if (n->ttype == TYPE_void &&
                                 n->tseqbase != oid_nil)
                                b->tseqbase = n->tseqbase + start;
+               } else {
+                       b->tnosorted = 0;
+                       b->tnorevsorted = 0;
                }
                /* if tunique, uniqueness is guaranteed above */
                b->tkey = n->tkey | b->tunique;
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1319,7 +1319,7 @@ bm_subcommit(logger *lg, BAT *list_bid, 
            catalog_bid == list_bid &&
            catalog_nme == list_nme &&
            lg->catalog_bid == catalog_bid) {
-               BAT *bids, *nmes, *tids, *b;
+               BAT *bids, *nmes, *tids;
 
                tids = bm_tids(catalog_bid, dcatalog);
                if (tids == NULL) {
@@ -1337,28 +1337,6 @@ bm_subcommit(logger *lg, BAT *list_bid, 
                        return GDK_FAIL;
                }
 
-               b = BATproject(tids, catalog_bid);
-               if (BATappend(bids, b, NULL, TRUE) != GDK_SUCCEED) {  
-                       logbat_destroy(b);
-                       logbat_destroy(tids);
-                       logbat_destroy(bids);
-                       logbat_destroy(nmes);
-                       GDKfree(n);
-                       return GDK_FAIL;
-               }
-               logbat_destroy(b);
-               b = BATproject(tids, catalog_nme);
-               if (BATappend(nmes, b, NULL, TRUE) != GDK_SUCCEED) {  
-                       logbat_destroy(b);
-                       logbat_destroy(tids);
-                       logbat_destroy(bids);
-                       logbat_destroy(nmes);
-                       GDKfree(n);
-                       return GDK_FAIL;
-               }
-               logbat_destroy(b);
-
-               /*
                if (BATappend(bids, catalog_bid, tids, TRUE) != GDK_SUCCEED ||
                    BATappend(nmes, catalog_nme, tids, TRUE) != GDK_SUCCEED) {
                        logbat_destroy(tids);
@@ -1367,7 +1345,6 @@ bm_subcommit(logger *lg, BAT *list_bid, 
                        GDKfree(n);
                        return GDK_FAIL;
                }
-               */
                logbat_destroy(tids);
                BATclear(dcatalog, TRUE);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to