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

merged with jun2020


diffs (141 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
@@ -541,6 +541,7 @@ mvc_bind(mvc *m, const char *sname, cons
                return NULL;
 
        b = store_funcs.bind_col(tr, c, access);
+       assert(b);
        return b;
 }
 
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
@@ -2688,8 +2688,9 @@ static int
 update_table(sql_trans *tr, sql_table *ft, sql_table *tt)
 {
        sql_trans *oldest = oldest_active_transaction();
+       sql_table *ot = NULL;
        int ok = LOG_OK;
-       node *n, *m;
+       node *n, *m, *o = NULL;
 
        if (ATOMIC_GET(&store_nr_active) == 1 || ft->base.allocated) {
                if (ATOMIC_GET(&store_nr_active) > 1 && ft->data) { /* move 
delta */
@@ -2706,12 +2707,16 @@ update_table(sql_trans *tr, sql_table *f
                                bat_destroy(b->cached);
                                b->cached = NULL;
                        }
-                       while (b && b->wtime >= oldest->stime)
-                               b = b->next;
-                       if (b && b->next) {
+                       /* find table t->base.stime */
+            ot = tr_find_table(oldest, tt);
+                       if (b && ot && b->wtime < ot->base.stime) {
+                               while (b && b->wtime >= ot->base.stime)
+                                       b = b->next;
                                /* anything older can go */
-                               delayed_destroy_dbat(b->next);
-                               b->next = NULL;
+                               if (b && b->next && b->wtime < ot->base.stime) {
+                                       delayed_destroy_dbat(b->next);
+                                       b->next = NULL;
+                               }
                        }
                } else if (tt->data && ft->base.allocated) {
                        if (tr_update_dbat(tr, tt->data, ft->data) != LOG_OK)
@@ -2733,7 +2738,9 @@ update_table(sql_trans *tr, sql_table *f
                        ft->data = NULL;
                }
        }
-       for (n = ft->columns.set->h, m = tt->columns.set->h; ok == LOG_OK && n 
&& m; n = n->next, m = m->next) {
+       if (ot)
+               o = ot->columns.set->h;
+       for (n = ft->columns.set->h, m = tt->columns.set->h; ok == LOG_OK && n 
&& m; n = n->next, m = m->next, o=(o?o->next:NULL)) {
                sql_column *cc = n->data; // TODO: either stick to to/from 
terminology or old/current terminology
                sql_column *oc = m->data;
 
@@ -2741,6 +2748,7 @@ update_table(sql_trans *tr, sql_table *f
                        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 */
                                sql_delta *b = cc->data;
+                               sql_column *oldc = NULL;
 
                                if (!oc->data)
                                        oc->base.allocated = cc->base.allocated;
@@ -2754,12 +2762,17 @@ update_table(sql_trans *tr, sql_table *f
                                        bat_destroy(b->cached);
                                        b->cached = NULL;
                                }
-                               while (b && b->wtime >= oldest->stime)
-                                       b = b->next;
-                               if (b && b->next) {
+                               /* find column c->base.stime */
+                if (o)
+                                       oldc = o->data;
+                               if (oldc && b && oldc->base.id == cc->base.id 
&& b->wtime < oldc->base.stime) {
+                                       while (b && b->wtime >= 
oldc->base.stime)
+                                               b = b->next;
                                        /* anything older can go */
-                                       delayed_destroy_bat(b->next);
-                                       b->next = NULL;
+                                       if (b && b->next && b->wtime < 
oldc->base.stime) {
+                                               delayed_destroy_bat(b->next);
+                                               b->next = NULL;
+                                       }
                                }
                        } else if (oc->data && cc->base.allocated) {
                                if (tr_update_delta(tr, oc->data, cc->data, 
cc->unique == 1) != LOG_OK)
@@ -2812,7 +2825,9 @@ update_table(sql_trans *tr, sql_table *f
                cc->base.allocated = 0;
        }
        if (ok == LOG_OK && tt->idxs.set) {
-               for (n = ft->idxs.set->h, m = tt->idxs.set->h; ok == LOG_OK && 
n && m; n = n->next, m = m->next) {
+               if (ot)
+                       o = ot->idxs.set->h;
+               for (n = ft->idxs.set->h, m = tt->idxs.set->h; ok == LOG_OK && 
n && m; n = n->next, m = m->next, o=(o?o->next:NULL)) {
                        sql_idx *ci = n->data;
                        sql_idx *oi = m->data;
 
@@ -2825,6 +2840,7 @@ update_table(sql_trans *tr, sql_table *f
                        if (ATOMIC_GET(&store_nr_active) == 1 || 
(ci->base.wtime && ci->base.allocated)) {
                                if (ATOMIC_GET(&store_nr_active) > 1 && 
ci->data) { /* move delta */
                                        sql_delta *b = ci->data;
+                                       sql_idx *oldi = NULL;
 
                                        if (!oi->data)
                                                oi->base.allocated = 
ci->base.allocated;
@@ -2838,12 +2854,16 @@ update_table(sql_trans *tr, sql_table *f
                                                bat_destroy(b->cached);
                                                b->cached = NULL;
                                        }
-                                       while (b && b->wtime >= oldest->stime)
-                                               b = b->next;
-                                       if (b && b->next) {
+                                       if (o)
+                                               oldi = o->data;
+                                       if (oldi && b && oldi->base.id == 
ci->base.id && b->wtime < oldi->base.stime) {
+                                               while (b && b->wtime >= 
oldi->base.stime)
+                                                       b = b->next;
                                                /* anything older can go */
-                                               delayed_destroy_bat(b->next);
-                                               b->next = NULL;
+                                               if (b && b->next && b->wtime >= 
oldi->base.stime) {
+                                                       
delayed_destroy_bat(b->next);
+                                                       b->next = NULL;
+                                               }
                                        }
                                } else if (oi->data && ci->base.allocated) {
                                        if (tr_update_delta(tr, oi->data, 
ci->data, 0) != LOG_OK)
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1872,6 +1872,7 @@ bootstrap_create_schema(sql_trans *tr, c
        cs_new(&s->types, tr->sa, (fdestroy) NULL);
        cs_new(&s->funcs, tr->sa, (fdestroy) NULL);
        cs_new(&s->seqs, tr->sa, (fdestroy) NULL);
+       cs_new(&s->parts, tr->sa, (fdestroy) &part_destroy);
        s->keys = list_new(tr->sa, (fdestroy) NULL);
        s->idxs = list_new(tr->sa, (fdestroy) NULL);
        s->triggers = list_new(tr->sa, (fdestroy) NULL);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to