Changeset: 805277932678 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/805277932678
Modified Files:
        sql/storage/bat/bat_logger.c
Branch: mangled
Log Message:

Reuse code, fixing crashes after upgrade.


diffs (181 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
@@ -83,11 +83,53 @@ bl_preversion(sqlstore *store, int oldve
        return GDK_FAIL;
 }
 
-#define N(schema, table, column)       schema "_" table "_" column
+#if defined CATALOG_JUN2020 || defined CATALOG_OCT2020 || defined 
CATALOG_JUL2021 || defined CATALOG_JAN2022
+/* replace a column in a system table with a new column
+ * colid is the SQL id for the column, oldcolid is the BAT id of the
+ * to-be-replaced BAT */
+static gdk_return
+replace_bat(old_logger *old_lg, logger *lg, int colid, bat oldcolid, BAT 
*newcol)
+{
+       gdk_return rc;
+       newcol = BATsetaccess(newcol, BAT_READ);
+       if (old_lg != NULL) {
+               if ((rc = BUNappend(old_lg->del, &oldcolid, false)) == 
GDK_SUCCEED &&
+                       (rc = BUNappend(old_lg->add, &newcol->batCacheid, 
false)) == GDK_SUCCEED &&
+                       (rc = BUNreplace(lg->catalog_bid, 
BUNfnd(lg->catalog_id, &colid), &newcol->batCacheid, false)) == GDK_SUCCEED) {
+                       BBPretain(newcol->batCacheid);
+                       BBPretain(newcol->batCacheid);
+               }
+       } else {
+               if ((rc = BAThash(lg->catalog_id)) == GDK_SUCCEED) {
+                       BATiter cii = bat_iterator_nolock(lg->catalog_id);
+                       BUN p;
+                       MT_rwlock_rdlock(&cii.b->thashlock);
+                       HASHloop_int(cii, cii.b->thash, p, &colid) {
+                               if (BUNfnd(lg->dcatalog, &(oid){(oid)p}) == 
BUN_NONE) {
+                                       if (BUNappend(lg->dcatalog, 
&(oid){(oid)p}, false) != GDK_SUCCEED ||
+                                               BUNreplace(lg->catalog_lid, 
(oid) p, &(lng){0}, false) != GDK_SUCCEED) {
+                                               
MT_rwlock_rdunlock(&cii.b->thashlock);
+                                               return GDK_FAIL;
+                                       }
+                                       lg->deleted++;
+                                       break;
+                               }
+                       }
+                       MT_rwlock_rdunlock(&cii.b->thashlock);
+                       if ((rc = BUNappend(lg->catalog_id, &colid, false)) == 
GDK_SUCCEED &&
+                               (rc = BUNappend(lg->catalog_bid, 
&newcol->batCacheid, false)) == GDK_SUCCEED &&
+                               (rc = BUNappend(lg->catalog_lid, &lng_nil, 
false)) == GDK_SUCCEED &&
+                               (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(newcol)}, false)) == GDK_SUCCEED) {
+                               BBPretain(newcol->batCacheid);
+                       }
+                       lg->cnt++;
+               }
+       }
+       return GDK_SUCCEED;
+}
+#endif
 
-#define D(schema, table)       "D_" schema "_" table
-
-#if defined CATALOG_JUN2020 || defined CATALOG_OCT2020
+#if defined CATALOG_JUN2020 || defined CATALOG_OCT2020 || defined 
CATALOG_JAN2022
 static gdk_return
 tabins(logger *lg, old_logger *old_lg, bool first, int tt, int nid, ...)
 {
@@ -104,54 +146,23 @@ tabins(logger *lg, old_logger *old_lg, b
                        va_end(va);
                        return GDK_FAIL;
                }
-               if (first) {
-                       if (old_lg) {
-                               if (BUNfnd(old_lg->add, &b->batCacheid) == 
BUN_NONE) {
-                                       BAT *bn = COLcopy(b, b->ttype, true, 
PERSISTENT);
-                                       if (bn == NULL ||
-                                               BUNappend(old_lg->add, 
&bn->batCacheid, false) != GDK_SUCCEED ||
-                                               BUNappend(old_lg->del, 
&b->batCacheid, false) != GDK_SUCCEED) {
-                                               va_end(va);
-                                               bat_destroy(b);
-                                               bat_destroy(bn);
-                                               return GDK_FAIL;
-                                       }
-                                       BBPretain(bn->batCacheid);
-                                       /* logical refs of b stay the same: it 
is moved from catalog_bid to del */
-                                       bat_destroy(b);
-                                       BUN p = BUNfnd(lg->catalog_id, &cid);
-                                       assert(p != BUN_NONE);
-                                       if (BUNreplace(lg->catalog_bid, p, 
&bn->batCacheid, false) != GDK_SUCCEED) {
-                                               va_end(va);
-                                               bat_destroy(bn);
-                                               return GDK_FAIL;
-                                       }
-                                       BBPretain(bn->batCacheid);
-                                       b = bn;
-                               }
-                               rc = BUNappend(b, cval, true);
-                               if (rc != GDK_SUCCEED) {
-                                       va_end(va);
-                                       bat_destroy(b);
-                                       return rc;
-                               }
+               if (first &&
+                       (old_lg == NULL || BUNfnd(old_lg->add, &b->batCacheid) 
== BUN_NONE)) {
+                       BAT *bn = COLcopy(b, b->ttype, true, PERSISTENT);
+                       if (bn == NULL) {
+                               va_end(va);
+                               bat_destroy(b);
+                               return GDK_FAIL;
                        }
-                       else {
-                               BAT *bn = COLcopy(b, b->ttype, true, 
PERSISTENT);
-                               bn = BATsetaccess(bn, BAT_READ);
-                               BBPretain(bn->batCacheid);
+                       if (replace_bat(old_lg, lg, cid, b->batCacheid, bn) != 
GDK_SUCCEED) {
+                               va_end(va);
                                bat_destroy(b);
-                               if ((rc = BUNappend(lg->catalog_id, &cid, 
false)) == GDK_SUCCEED &&
-                               (rc = BUNappend(lg->catalog_bid, 
&bn->batCacheid, false)) == GDK_SUCCEED &&
-                               (rc = BUNappend(lg->catalog_lid, &lng_nil, 
false)) == GDK_SUCCEED &&
-                               (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(bn)}, false)) == GDK_SUCCEED) {
-                                       BBPretain(bn->batCacheid);
-                               }
-                               else {
-                                       // TODO ERROR?
-                               }
-                               b = bn;
+                               bat_destroy(bn);
+                               return GDK_FAIL;
                        }
+                       /* logical refs of b stay the same: it is moved from 
catalog_bid to del */
+                       bat_destroy(b);
+                       b = bn;
                }
                rc = BUNappend(b, cval, true);
                bat_destroy(b);
@@ -1869,50 +1880,6 @@ upgrade(old_logger *lg)
        return rc;
 }
 
-/* replace a column in a system table with a new column
- * colid is the SQL id for the column, oldcolid is the BAT id of the
- * to-be-replaced BAT */
-static gdk_return
-replace_bat(old_logger *old_lg, logger *lg, int colid, bat oldcolid, BAT 
*newcol)
-{
-       gdk_return rc;
-       newcol = BATsetaccess(newcol, BAT_READ);
-       if (old_lg != NULL) {
-               if ((rc = BUNappend(old_lg->del, &oldcolid, false)) == 
GDK_SUCCEED &&
-                       (rc = BUNappend(old_lg->add, &newcol->batCacheid, 
false)) == GDK_SUCCEED &&
-                       (rc = BUNreplace(lg->catalog_bid, 
BUNfnd(lg->catalog_id, &colid), &newcol->batCacheid, false)) == GDK_SUCCEED) {
-                       BBPretain(newcol->batCacheid);
-                       BBPretain(newcol->batCacheid);
-               }
-       } else {
-               if ((rc = BAThash(lg->catalog_id)) == GDK_SUCCEED) {
-                       BATiter cii = bat_iterator_nolock(lg->catalog_id);
-                       BUN p;
-                       MT_rwlock_rdlock(&cii.b->thashlock);
-                       HASHloop_int(cii, cii.b->thash, p, &colid) {
-                               if (BUNfnd(lg->dcatalog, &(oid){(oid)p}) == 
BUN_NONE) {
-                                       if (BUNappend(lg->dcatalog, 
&(oid){(oid)p}, false) != GDK_SUCCEED ||
-                                               BUNreplace(lg->catalog_lid, 
(oid) p, &(lng){0}, false) != GDK_SUCCEED) {
-                                               
MT_rwlock_rdunlock(&cii.b->thashlock);
-                                               return GDK_FAIL;
-                                       }
-                                       lg->deleted++;
-                                       break;
-                               }
-                       }
-                       MT_rwlock_rdunlock(&cii.b->thashlock);
-                       if ((rc = BUNappend(lg->catalog_id, &colid, false)) == 
GDK_SUCCEED &&
-                               (rc = BUNappend(lg->catalog_bid, 
&newcol->batCacheid, false)) == GDK_SUCCEED &&
-                               (rc = BUNappend(lg->catalog_lid, &lng_nil, 
false)) == GDK_SUCCEED &&
-                               (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(newcol)}, false)) == GDK_SUCCEED) {
-                               BBPretain(newcol->batCacheid);
-                       }
-                       lg->cnt++;
-               }
-       }
-       return GDK_SUCCEED;
-}
-
 static gdk_return
 bl_postversion(void *Store, void *Lg)
 {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to