Changeset: ebaa59bd1637 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ebaa59bd1637
Modified Files:
        sql/storage/bat/bat_logger.c
Branch: default
Log Message:

Now also convert the deleted rows bat to new format (msk bat).


diffs (209 lines):

diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -1380,17 +1380,19 @@ upgrade(old_logger *lg)
                if (delidx >= 0) {
                        BAT *d = temp_descriptor(old_logger_find_bat(lg, 
delname, 0, 0));
                        BAT *m = BATconstant(0, TYPE_msk, &(msk){0}, 
BATcount(b), PERSISTENT);
-                       if (d == NULL || m == NULL) {
+                       if (m == NULL) {
                                bat_destroy(d);
                                bat_destroy(m);
                                goto bailout;
                        }
-                       const oid *dels = (const oid *) Tloc(d, 0);
-                       for (BUN q = BUNlast(d), p = 0; p < q; p++)
-                               mskSetVal(m, (BUN) dels[p], true);
+                       if (d != NULL) {
+                               const oid *dels = (const oid *) Tloc(d, 0);
+                               for (BUN q = BUNlast(d), p = 0; p < q; p++)
+                                       mskSetVal(m, (BUN) dels[p], true);
+                       }
                        if (BUNappend(lg->lg->catalog_bid, &m->batCacheid, 
false) != GDK_SUCCEED ||
                                BUNappend(lg->lg->catalog_id, 
&tables[delidx].newid, false) != GDK_SUCCEED ||
-                               BUNappend(lg->del, &d->batCacheid, false) != 
GDK_SUCCEED) {
+                               (d != NULL && BUNappend(lg->del, 
&d->batCacheid, false) != GDK_SUCCEED)) {
                                bat_destroy(d);
                                bat_destroy(m);
                                goto bailout;
@@ -1505,6 +1507,83 @@ upgrade(old_logger *lg)
        bat_destroy(cands);
        bat_destroy(b);
 
+       BAT *tabs;
+       tabs = BATselect(lg->lg->catalog_id, NULL, &(int){2165}, &int_nil, 
true, true, false);
+       if (tabs == NULL)
+               goto bailout;
+       BAT *b1;
+       b1 = BATintersect(lg->lg->catalog_id, bats[1].idbat, tabs, 
bats[1].cands, false, false, BUN_NONE);
+       bat_destroy(tabs);
+       if (b1 == NULL)
+               goto bailout;
+       BAT *b3, *b4;
+       if (BATsemijoin(&b3, &b4, lg->lg->catalog_id, bats[2].parbat, b1, 
bats[2].cands, false, false, BUN_NONE) != GDK_SUCCEED) {
+               bat_destroy(b1);
+               goto bailout;
+       }
+       bat_destroy(b3);
+       b3 = BATproject(b4, bats[2].idbat);
+       bat_destroy(b4);
+       if (b3 == NULL) {
+               bat_destroy(b1);
+               goto bailout;
+       }
+       b4 = BATintersect(lg->lg->catalog_id, b3, NULL, NULL, false, false, 
BUN_NONE);
+       bat_destroy(b3);
+       if (b4 == NULL) {
+               bat_destroy(b1);
+               goto bailout;
+       }
+       struct canditer ci;
+       canditer_init(&ci, lg->lg->catalog_bid, b1);
+       const int *bids;
+       const oid *cbids;
+       bids = Tloc(lg->lg->catalog_bid, 0);
+       cbids = Tloc(b4, 0);
+       for (BUN i = 0; i < ci.ncand; i++) {
+               bat cbid = bids[cbids[i]];
+               b = temp_descriptor(cbid);
+               if (b == NULL) {
+                       bat_destroy(b1);
+                       bat_destroy(b3);
+                       goto bailout;
+               }
+               BUN len;
+               len = BATcount(b);
+               bat_destroy(b);
+               oid o;
+               o = canditer_next(&ci);
+               bat tbid;
+               tbid = bids[o - lg->lg->catalog_bid->hseqbase];
+               b = temp_descriptor(tbid);
+               BAT *bn;
+               bn = BATconstant(0, TYPE_msk, &(msk){0}, len, PERSISTENT);
+               if (b == NULL || bn == NULL) {
+                       bat_destroy(b);
+                       bat_destroy(bn);
+                       bat_destroy(b1);
+                       bat_destroy(b3);
+                       goto bailout;
+               }
+               const oid *dels;
+               dels = Tloc(b, 0);
+               for (BUN q = BUNlast(b), p = 0; p < q; p++) {
+                       mskSetVal(bn, (BUN) dels[p], true);
+               }
+               bat_destroy(b);
+               if (BUNappend(lg->del, &tbid, false) != GDK_SUCCEED ||
+                   BUNreplace(lg->lg->catalog_bid, o, &bn->batCacheid, false) 
!= GDK_SUCCEED) {
+                       bat_destroy(bn);
+                       bat_destroy(b1);
+                       bat_destroy(b3);
+                       goto bailout;
+               }
+               BBPretain(bn->batCacheid);
+               bat_destroy(bn);
+       }
+       bat_destroy(b1);
+       bat_destroy(b4);
+
        rc = GDK_SUCCEED;
 
   bailout:
@@ -1724,22 +1803,90 @@ bl_postversion(void *Store, old_logger *
 
                /* alter table sys.objects add column sub integer; */
                BAT *objs_id = temp_descriptor(logger_find_bat(lg, 2111));
-               if (objs_id == NULL)
+               BAT *objs_nr = temp_descriptor(logger_find_bat(lg, 2113));
+               BAT *objs_sub = BATconstant(objs_id->hseqbase, TYPE_int, 
&int_nil, BATcount(objs_id), PERSISTENT);
+               BAT *b = temp_descriptor(logger_find_bat(lg, 2110));
+               if (objs_id == NULL || objs_nr == NULL || objs_sub == NULL || b 
== NULL || BUNappend(old_lg->del, &objs_nr->batCacheid, false) != GDK_SUCCEED) {
+                       bat_destroy(objs_id);
+                       bat_destroy(objs_nr);
+                       bat_destroy(b);
+                       bat_destroy(objs_sub);
+                       return GDK_FAIL;
+               }
+               BAT *cands = BATmaskedcands(0, BATcount(b), b, false);
+               bat_destroy(b);
+               if (cands == NULL) {
+                       bat_destroy(objs_id);
+                       bat_destroy(objs_nr);
+                       bat_destroy(objs_sub);
                        return GDK_FAIL;
-
-               BAT *objs_sub = BATconstant(objs_id->hseqbase, TYPE_int, 
&int_nil, BATcount(objs_id), PERSISTENT);
-               bat_destroy(objs_id);
-               if (objs_sub == NULL) {
+               }
+               b = BATselect(objs_nr, cands, &(int) {2000}, &int_nil, false, 
false, false);
+               bat_destroy(cands);
+               if (b == NULL) {
+                       bat_destroy(objs_id);
+                       bat_destroy(objs_nr);
+                       bat_destroy(objs_sub);
+                       return GDK_FAIL;
+               }
+               cands = b;
+               b = BATproject2(cands, objs_nr, NULL);
+               if (b == NULL) {
+                       bat_destroy(objs_id);
+                       bat_destroy(objs_nr);
+                       bat_destroy(objs_sub);
+                       bat_destroy(cands);
                        return GDK_FAIL;
                }
-               if (BATsetaccess(objs_sub, BAT_READ) != GDK_SUCCEED ||
+               gdk_return rc = BATreplace(objs_sub, cands, b, false);
+               bat_destroy(b);
+               if (rc != GDK_SUCCEED) {
+                       bat_destroy(objs_id);
+                       bat_destroy(objs_nr);
+                       bat_destroy(objs_sub);
+                       bat_destroy(cands);
+                       return GDK_FAIL;
+               }
+               b = COLcopy(objs_nr, objs_nr->ttype, true, PERSISTENT);
+               bat_destroy(objs_nr);
+               if (b == NULL) {
+                       bat_destroy(objs_id);
+                       bat_destroy(objs_sub);
+                       bat_destroy(cands);
+                       return GDK_FAIL;
+               }
+               objs_nr = b;
+               b = BATproject2(cands, objs_id, NULL);
+               bat_destroy(objs_id);
+               if (b == NULL) {
+                       bat_destroy(objs_nr);
+                       bat_destroy(objs_sub);
+                       bat_destroy(cands);
+                       return GDK_FAIL;
+               }
+               rc = BATreplace(objs_nr, cands, b, false);
+               bat_destroy(b);
+               bat_destroy(cands);
+               if (rc != GDK_SUCCEED) {
+                       bat_destroy(objs_nr);
+                       bat_destroy(objs_sub);
+                       return GDK_FAIL;
+               }
+
+               /* now do something with objs_nr and objs_sub */
+
+               if (BUNreplace(lg->catalog_bid, BUNfnd(lg->catalog_id, 
&(int){2113}), &objs_nr->batCacheid, false) != GDK_SUCCEED ||
+                       BATsetaccess(objs_sub, BAT_READ) != GDK_SUCCEED ||
+                       BATsetaccess(objs_nr, BAT_READ) != GDK_SUCCEED ||
                        BUNappend(lg->catalog_id, &(int) {2163}, false) != 
GDK_SUCCEED ||
                        BUNappend(lg->catalog_bid, &objs_sub->batCacheid, 
false) != GDK_SUCCEED) {
                        bat_destroy(objs_sub);
                        return GDK_FAIL;
                }
                BBPretain(objs_sub->batCacheid);
+               BBPretain(objs_nr->batCacheid);
                bat_destroy(objs_sub);
+               bat_destroy(objs_nr);
                /* update sys.objects o set sub = (select t.id from 
sys.dependencies d, sys._tables t where o.nr = d.depend_id and d.id = t.id and 
o.name = t.name); */
 
                /* alter table tmp.objects add column sub integer; */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to