Changeset: 19c7b7fb0065 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/19c7b7fb0065
Modified Files:
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jul2021
Log Message:

make sure bind (col/idx) use the proper range of rows
added locks around segs_end
cleanup not used bind_del
fixed leak in dropping columns, indices and tables

fixed issue with segment handling, ie leading too all sorts of incorrect assess 
(projects failing)


diffs (truncated from 410 to 300 lines):

diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -1261,13 +1261,14 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
                        } else {
                                /* BAT b holds the UPD_ID bat */
                                oid l, h;
-                               BAT *c = mvc_bind(m, sname, tname, cname, 0);
-                               if (c == NULL) {
+                               BAT *s = mvc_bind(m, sname, tname, cname, 0);
+                               if (s == NULL) {
                                        BBPunfix(b->batCacheid);
                                        throw(SQL,"sql.bind",SQLSTATE(HY005) 
"Cannot access the update column %s.%s.%s",
                                              sname,tname,cname);
                                }
-                               cnt = BATcount(c);
+                               cnt = BATcount(s);
+                               cnt = 
store->storage_api.count_col(m->session->tr, c, 0);
                                psz = cnt ? (cnt / nr_parts) : 0;
                                l = part_nr * psz;
                                if (l > cnt)
@@ -1277,7 +1278,7 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
                                        h = cnt;
                                h--;
                                bn = BATselect(b, NULL, &l, &h, true, true, 
false);
-                               BBPunfix(c->batCacheid);
+                               BBPunfix(s->batCacheid);
                                if(bn == NULL) {
                                        BBPunfix(b->batCacheid);
                                        throw(SQL, "sql.bind", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -1567,12 +1568,16 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
                return msg;
        if ((msg = checkSQLContext(cntxt)) != NULL)
                return msg;
+       sqlstore *store = m->store;
+       sql_schema *s = mvc_bind_schema(m, sname);
+       sql_idx *i = mvc_bind_idx(m, s, iname);
        b = mvc_bind_idxbat(m, sname, tname, iname, access);
        if (b && b->ttype != coltype)
                throw(SQL,"sql.bind",SQLSTATE(42000) "Column type mismatch 
%s.%s.%s",sname,tname,iname);
        if (b) {
                if (pci->argc == (8 + upd) && getArgType(mb, pci, 6 + upd) == 
TYPE_int) {
                        BUN cnt = BATcount(b), psz;
+                       cnt = store->storage_api.count_idx(m->session->tr, i, 
0);
                        /* partitioned access */
                        int part_nr = *getArgReference_int(stk, pci, 6 + upd);
                        int nr_parts = *getArgReference_int(stk, pci, 7 + upd);
@@ -1593,12 +1598,13 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
                        } else {
                                /* BAT b holds the UPD_ID bat */
                                oid l, h;
-                               BAT *c = mvc_bind_idxbat(m, sname, tname, 
iname, 0);
-                               if ( c == NULL) {
+                               BAT *s = mvc_bind_idxbat(m, sname, tname, 
iname, 0);
+                               if ( s == NULL) {
                                        BBPunfix(b->batCacheid);
                                        throw(SQL,"sql.bindidx",SQLSTATE(42000) 
"Cannot access index column %s.%s.%s",sname,tname,iname);
                                }
-                               cnt = BATcount(c);
+                               cnt = BATcount(s);
+                               cnt = 
store->storage_api.count_idx(m->session->tr, i, 0);
                                psz = cnt ? (cnt / nr_parts) : 0;
                                l = part_nr * psz;
                                if (l > cnt)
@@ -1608,7 +1614,7 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
                                        h = cnt;
                                h--;
                                bn = BATselect(b, NULL, &l, &h, true, true, 
false);
-                               BBPunfix(c->batCacheid);
+                               BBPunfix(s->batCacheid);
                                if(bn == NULL) {
                                        BBPunfix(b->batCacheid);
                                        throw(SQL, "sql.bindidx", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
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
@@ -230,7 +230,8 @@ merge_segments(segments *segs, sql_trans
        segment *cur = segs->h, *seg = NULL;
        for (; cur; cur = cur->next) {
                if (cur->ts == tr->tid) {
-                       cur->oldts = 0;
+                       if (!cur->deleted)
+                               cur->oldts = 0;
                        cur->ts = commit_ts;
                }
                if (cur->ts <= oldest && cur->ts < TRANSACTION_ID_BASE) { /* 
possibly merge range */
@@ -301,6 +302,7 @@ segments2cs(sql_trans *tr, segments *seg
                        }
                }
        }
+       bat_destroy(b);
        return LOG_OK;
 }
 
@@ -538,14 +540,16 @@ count_deletes( segment *s, sql_trans *tr
 }
 
 static size_t
-segs_end( segments *segs, sql_trans *tr)
+segs_end( segments *segs, sql_trans *tr, sql_table *table)
 {
+       lock_table(tr->store, table->base.id);
        segment *s = segs->h, *l = NULL;
 
        for(;s; s = s->next) {
                if (SEG_IS_VALID(s, tr))
                                l = s;
        }
+       unlock_table(tr->store, table->base.id);
        if (!l)
                return 0;
        return l->end;
@@ -569,7 +573,7 @@ count_col(sql_trans *tr, sql_column *c, 
                return count_inserts(d->segs->h, tr);
        if (access == QUICK || isTempTable(c->t))
                return d->segs->t?d->segs->t->end:0;
-       return segs_end(d->segs, tr);
+       return segs_end(d->segs, tr, c->t);
 }
 
 static size_t
@@ -590,7 +594,7 @@ count_idx(sql_trans *tr, sql_idx *i, int
                return count_inserts(d->segs->h, tr);
        if (access == QUICK || isTempTable(i->t))
                return d->segs->t?d->segs->t->end:0;
-       return segs_end(d->segs, tr);
+       return segs_end(d->segs, tr, i->t);
 }
 
 static BAT *
@@ -673,20 +677,6 @@ bind_idx(sql_trans *tr, sql_idx * i, int
        return cs_bind_bat( &d->cs, access, cnt);
 }
 
-static void *                                  /* BAT * */
-bind_del(sql_trans *tr, sql_table *t, int access)
-{
-       assert(access == QUICK || tr->active);
-       if (!isTable(t))
-               return NULL;
-       storage *d = tab_timestamp_storage(tr, t);
-       if (access == RD_UPD_ID || access == RD_UPD_VAL) {
-               return cs_bind_ubat( &d->cs, access, TYPE_msk);
-       } else {
-               return cs_bind_bat( &d->cs, access, 
d->segs->t?d->segs->t->end:0);
-       }
-}
-
 static int
 cs_real_update_bats( column_storage *cs, BAT **Ui, BAT **Uv)
 {
@@ -1718,7 +1708,7 @@ create_col(sql_trans *tr, sql_column *c)
                /* alter ? */
                if (ol_first_node(c->t->columns) && (fc = 
ol_first_node(c->t->columns)->data) != NULL) {
                        storage *s = ATOMIC_PTR_GET(&fc->t->data);
-                       cnt = segs_end(s->segs, tr);
+                       cnt = segs_end(s->segs, tr, c->t);
                }
                if (cnt && fc != c) {
                        sql_delta *d = ATOMIC_PTR_GET(&fc->data);
@@ -2151,10 +2141,8 @@ log_destroy_col_(sql_trans *tr, sql_colu
 }
 
 static int
-log_destroy_col(sql_trans *tr, sql_change *change, ulng commit_ts, ulng oldest)
+log_destroy_col(sql_trans *tr, sql_change *change)
 {
-       (void) commit_ts;
-       (void) oldest;
        return log_destroy_col_(tr, (sql_column*)change->obj);
 }
 
@@ -2182,14 +2170,11 @@ log_destroy_idx_(sql_trans *tr, sql_idx 
 }
 
 static int
-log_destroy_idx(sql_trans *tr, sql_change *change, ulng commit_ts, ulng oldest)
+log_destroy_idx(sql_trans *tr, sql_change *change)
 {
-       (void) commit_ts;
-       (void) oldest;
        return log_destroy_idx_(tr, (sql_idx*)change->obj);
 }
 
-
 static int
 destroy_del(sqlstore *store, sql_table *t)
 {
@@ -2214,18 +2199,13 @@ log_destroy_storage(sql_trans *tr, stora
 }
 
 static int
-log_destroy_del(sql_trans *tr, sql_change *change, ulng commit_ts, ulng oldest)
+log_destroy_del(sql_trans *tr, sql_change *change)
 {
        int ok = LOG_OK;
        sql_table *t = (sql_table*)change->obj;
+
        assert(!isTempTable(t));
-       storage *dbat = ATOMIC_PTR_GET(&t->data);
-       (void) commit_ts;
-       (void) oldest;
-       if (dbat->cs.ts < tr->ts) /* no changes ? */
-               return ok;
        ok = log_destroy_storage(tr, ATOMIC_PTR_GET(&t->data), t->base.id);
-
        if (ok == LOG_OK) {
                for(node *n = ol_first_node(t->columns); n && ok == LOG_OK; n = 
n->next) {
                        sql_column *c = n->data;
@@ -2243,6 +2223,53 @@ log_destroy_del(sql_trans *tr, sql_chang
        return ok;
 }
 
+static int
+commit_destroy_del( sql_trans *tr, sql_change *change, ulng commit_ts, ulng 
oldest)
+{
+       (void)tr;
+       (void)change;
+       (void)commit_ts;
+       (void)oldest;
+       return 0;
+}
+
+static int
+drop_del(sql_trans *tr, sql_table *t)
+{
+       int ok = LOG_OK;
+
+       if (!isNew(t) && !isTempTable(t)) {
+               storage *bat = ATOMIC_PTR_GET(&t->data);
+               trans_add(tr, &t->base, bat, &tc_gc_del, &commit_destroy_del, 
&log_destroy_del);
+       }
+       return ok;
+}
+
+static int
+drop_col(sql_trans *tr, sql_column *c)
+{
+       int ok = LOG_OK;
+
+       if (!isNew(c) && !isTempTable(c->t)) {
+               sql_delta *d = ATOMIC_PTR_GET(&c->data);
+               trans_add(tr, &c->base, d, &tc_gc_del, &commit_destroy_del, 
&log_destroy_col);
+       }
+       return ok;
+}
+
+static int
+drop_idx(sql_trans *tr, sql_idx *i)
+{
+       int ok = LOG_OK;
+
+       if (!isNew(i) && !isTempTable(i->t)) {
+               sql_delta *d = ATOMIC_PTR_GET(&i->data);
+               trans_add(tr, &i->base, d, &tc_gc_del, &commit_destroy_del, 
&log_destroy_idx);
+       }
+       return ok;
+}
+
+
 static BUN
 clear_cs(sql_trans *tr, column_storage *cs)
 {
@@ -2452,7 +2479,7 @@ log_table_append(sql_trans *tr, sql_tabl
 
        if (isTempTable(t))
                return LOG_OK;
-       size_t end = segs_end(segs, tr);
+       size_t end = segs_end(segs, tr, t);
        for (segment *cur = segs->h; cur && ok; cur = cur->next) {
                if (cur->ts == tr->tid && !cur->deleted && cur->start < end) {
                        for (node *n = ol_first_node(t->columns); n && ok; n = 
n->next) {
@@ -3094,7 +3121,7 @@ bind_cands(sql_trans *tr, sql_table *t, 
 
        if (!s)
                return NULL;
-       size_t nr = segs_end(s->segs, tr);
+       size_t nr = segs_end(s->segs, tr, t);
 
        if (!nr)
                return BATdense(0, 0, 0);
@@ -3121,7 +3148,6 @@ bat_storage_init( store_functions *sf)
 {
        sf->bind_col = &bind_col;
        sf->bind_idx = &bind_idx;
-       sf->bind_del = &bind_del;
        sf->bind_cands = &bind_cands;
 
        sf->claim_tab = &claim_tab;
@@ -3146,18 +3172,17 @@ bat_storage_init( store_functions *sf)
        sf->idx_dup = &idx_dup;
        sf->del_dup = &del_dup;
 
-       sf->create_col = &create_col;
+       sf->create_col = &create_col;   /* create and add too change list */
        sf->create_idx = &create_idx;
        sf->create_del = &create_del;
 
-       sf->destroy_col = &destroy_col;
+       sf->destroy_col = &destroy_col; /* free resources */
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to