Changeset: 1da2eaba67ce for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1da2eaba67ce
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:

make sure we don't update outside the for this transaction valid range of rows


diffs (111 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
@@ -670,17 +670,30 @@ count_idx(sql_trans *tr, sql_idx *i, int
 }
 
 static BAT *
-cs_bind_ubat( column_storage *cs, int access, int type)
+cs_bind_ubat( column_storage *cs, int access, int type, size_t cnt /* ie max 
position < cnt */)
 {
        BAT *b;
 
        assert(access == RD_UPD_ID || access == RD_UPD_VAL);
        /* returns the updates for cs */
        if (cs->uibid && cs->uvbid) {
-               if (access == RD_UPD_ID)
+               if (access == RD_UPD_ID) {
                        b = temp_descriptor(cs->uibid);
-               else
+                       assert(b->tsorted);
+                       if ((BATtdense(b) && (b->tseqbase + BATcount(b)) >= 
cnt) ||
+                          (!BATtdense(b) && BATcount(b) && 
((oid*)b->theap->base)[BATcount(b)-1] >= cnt)) {
+                                       oid nil = oid_nil;
+                                       /* less then cnt */
+                                       BAT *s = BATselect(b, NULL, &nil, &cnt, 
false, false, false);
+
+                                       BAT *nb = BATproject(s, b);
+                                       bat_destroy(s);
+                                       bat_destroy(b);
+                                       b = nb;
+                       }
+               } else {
                        b = temp_descriptor(cs->uvbid);
+               }
        } else {
                b = e_BAT(access == RD_UPD_ID?TYPE_oid:type);
        }
@@ -796,21 +809,21 @@ older_delta( sql_delta *d, sql_trans *tr
 }
 
 static BAT *
-bind_ubat(sql_trans *tr, sql_delta *d, int access, int type)
+bind_ubat(sql_trans *tr, sql_delta *d, int access, int type, size_t cnt)
 {
        assert(tr->active);
        sql_delta *o = NULL;
        BAT *ui = NULL, *uv = NULL;
 
-       ui = cs_bind_ubat(&d->cs, RD_UPD_ID, type);
+       ui = cs_bind_ubat(&d->cs, RD_UPD_ID, type, cnt);
        if (access == RD_UPD_VAL)
-               uv = cs_bind_ubat(&d->cs, RD_UPD_VAL, type);
+               uv = cs_bind_ubat(&d->cs, RD_UPD_VAL, type, cnt);
        while ((o = older_delta(d, tr)) != NULL) {
                BAT *oui = NULL, *ouv = NULL;
                if (!oui)
-                       oui = cs_bind_ubat(&o->cs, RD_UPD_ID, type);
+                       oui = cs_bind_ubat(&o->cs, RD_UPD_ID, type, cnt);
                if (access == RD_UPD_VAL)
-                       ouv = cs_bind_ubat(&o->cs, RD_UPD_VAL, type);
+                       ouv = cs_bind_ubat(&o->cs, RD_UPD_VAL, type, cnt);
                if (!ui || !oui || (access == RD_UPD_VAL && (!uv || !ouv)))
                        return NULL;
                if ((ui = merge_updates(ui, &uv, oui, ouv)) == NULL)
@@ -825,16 +838,16 @@ bind_ubat(sql_trans *tr, sql_delta *d, i
 }
 
 static BAT *
-bind_ucol(sql_trans *tr, sql_column *c, int access)
+bind_ucol(sql_trans *tr, sql_column *c, int access, size_t cnt)
 {
-       return bind_ubat(tr, col_timestamp_delta(tr, c), access, 
c->type.type->localtype);
+       return bind_ubat(tr, col_timestamp_delta(tr, c), access, 
c->type.type->localtype, cnt);
 }
 
 static BAT *
-bind_uidx(sql_trans *tr, sql_idx * i, int access)
+bind_uidx(sql_trans *tr, sql_idx * i, int access, size_t cnt)
 {
        int type = oid_index(i->type)?TYPE_oid:TYPE_lng;
-       return bind_ubat(tr, idx_timestamp_delta(tr, i), access, type);
+       return bind_ubat(tr, idx_timestamp_delta(tr, i), access, type, cnt);
 }
 
 static BAT *
@@ -863,10 +876,10 @@ bind_col(sql_trans *tr, sql_column *c, i
        assert(access == QUICK || tr->active);
        if (!isTable(c->t))
                return NULL;
-       if (access == RD_UPD_ID || access == RD_UPD_VAL)
-               return bind_ucol(tr, c, access);
        sql_delta *d = col_timestamp_delta(tr, c);
        size_t cnt = count_col(tr, c, 0);
+       if (access == RD_UPD_ID || access == RD_UPD_VAL)
+               return bind_ucol(tr, c, access, cnt);
        return cs_bind_bat( &d->cs, access, cnt);
 }
 
@@ -876,10 +889,10 @@ bind_idx(sql_trans *tr, sql_idx * i, int
        assert(access == QUICK || tr->active);
        if (!isTable(i->t))
                return NULL;
-       if (access == RD_UPD_ID || access == RD_UPD_VAL)
-               return bind_uidx(tr, i, access);
        sql_delta *d = idx_timestamp_delta(tr, i);
        size_t cnt = count_idx(tr, i, 0);
+       if (access == RD_UPD_ID || access == RD_UPD_VAL)
+               return bind_uidx(tr, i, access, cnt);
        return cs_bind_bat( &d->cs, access, cnt);
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to