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

make sure we propagate the savepoints properly


diffs (89 lines):

diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -576,8 +576,8 @@ dup_delta(sql_trans *tr, sql_delta *obat
                        }
                } else {
                        bat->uibid = e_bat(TYPE_oid);
-                       obat->uvbid = e_bat(type);
-                       if (bat->uibid == BID_NIL || obat->uvbid == BID_NIL)
+                       bat->uvbid = e_bat(type);
+                       if (bat->uibid == BID_NIL || bat->uvbid == BID_NIL)
                                return LOG_ERR;
                }
        }
@@ -2380,10 +2380,10 @@ tr_update_delta( sql_trans *tr, sql_delt
 {
        int ok = LOG_OK;
        BAT *ins, *cur = NULL;
+       int savepoint = tr->parent != gtrans;
 
        (void)tr;
-       assert(ATOMIC_GET(&store_nr_active)==1);
-       assert (obat->bid != 0 || tr != gtrans);
+       assert(ATOMIC_GET(&store_nr_active)==1 || savepoint);
 
        /* for cleared tables the bid is reset */
        if (cbat->bid == 0) {
@@ -2405,7 +2405,7 @@ tr_update_delta( sql_trans *tr, sql_delt
                if(!cur)
                        return LOG_ERR;
        }
-       if (!obat->bid && tr != gtrans) {
+       if (!savepoint && !obat->bid && tr != gtrans) {
                if (obat->next)
                        destroy_bat(obat->next);
                destroy_delta(obat);
@@ -2425,7 +2425,21 @@ tr_update_delta( sql_trans *tr, sql_delt
                return LOG_ERR;
        }
        /* any inserts */
-       if (BUNlast(ins) > 0 || cbat->cleared) {
+       if (savepoint && !cur) {
+               /* new table, ie keep in ibid */
+               cur = temp_descriptor(cbat->bid);
+               if (cbat->bid && ins && BATcount(ins)) {
+                       if (BATappend(cur, ins, NULL, true) != GDK_SUCCEED) {
+                               bat_destroy(cur);
+                               bat_destroy(ins);
+                               return LOG_ERR;
+                       }
+               }
+               temp_destroy(cbat->ibid);
+               temp_destroy(obat->ibid);
+               obat->ibid = cbat->bid;
+               obat->cnt = cbat->cnt;
+       } else  if (BUNlast(ins) > 0 || cbat->cleared) {
                if ((!cbat->ibase && BATcount(ins) > SNAPSHOT_MINSIZE)){
                        /* swap cur and ins */
                        BAT *newcur = ins;
@@ -2691,9 +2705,10 @@ update_table(sql_trans *tr, sql_table *f
        sql_table *ot = NULL;
        int ok = LOG_OK;
        node *n, *m, *o = NULL;
+       int savepoint = tr->parent != gtrans;
 
        if (ATOMIC_GET(&store_nr_active) == 1 || ft->base.allocated) {
-               if (ATOMIC_GET(&store_nr_active) > 1 && ft->data) { /* move 
delta */
+               if (!savepoint && ATOMIC_GET(&store_nr_active) > 1 && ft->data) 
{ /* move delta */
                        sql_dbat *b = ft->data;
 
                        if (!tt->data)
@@ -2746,7 +2761,7 @@ update_table(sql_trans *tr, sql_table *f
 
                if (ATOMIC_GET(&store_nr_active) == 1 || (cc->base.wtime && 
cc->base.allocated)) {
                        assert(!cc->base.wtime || oc->base.wtime < 
cc->base.wtime || (oc->base.wtime == cc->base.wtime && oc->base.allocated /* 
alter */));
-                       if (ATOMIC_GET(&store_nr_active) > 1 && cc->data) { /* 
move delta */
+                       if (!savepoint && ATOMIC_GET(&store_nr_active) > 1 && 
cc->data) { /* move delta */
                                sql_delta *b = cc->data;
                                sql_column *oldc = NULL;
 
@@ -2838,7 +2853,7 @@ update_table(sql_trans *tr, sql_table *f
                                continue;
                        }
                        if (ATOMIC_GET(&store_nr_active) == 1 || 
(ci->base.wtime && ci->base.allocated)) {
-                               if (ATOMIC_GET(&store_nr_active) > 1 && 
ci->data) { /* move delta */
+                               if (!savepoint && ATOMIC_GET(&store_nr_active) 
> 1 && ci->data) { /* move delta */
                                        sql_delta *b = ci->data;
                                        sql_idx *oldi = NULL;
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to