Changeset: 43c1e0da5145 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=43c1e0da5145
Modified Files:
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_table.c
        sql/storage/bat/bat_utils.c
        sql/storage/bat/bat_utils.h
        sql/storage/store.c
Branch: Jul2015
Log Message:

fixes for using tables/columns structures after these are removed from the 
global transaction.


diffs (truncated from 664 to 300 lines):

diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -135,6 +135,7 @@ base_init(sql_allocator *sa, sql_base * 
        b->rtime = 0;
        b->flag = flag;
        b->name = NULL;
+       b->refcnt = 1;
        if (name)
                b->name = sa_strdup(sa,name);
 }
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -162,6 +162,7 @@ typedef struct sql_base {
        int rtime;
        int allocated;
        int flag;
+       int refcnt;
        sqlid id;
        char *name;
 } sql_base;
@@ -362,6 +363,7 @@ typedef struct sql_idx {
        struct list *columns;   /* list of sql_kc */
        struct sql_table *t;
        struct sql_key *key;    /* key */
+       struct sql_idx *po;     /* the outer transactions idx */
        void *data;
 } sql_idx;
 
@@ -439,6 +441,7 @@ typedef struct sql_column {
        char *max;
 
        struct sql_table *t;
+       struct sql_column *po;  /* the outer transactions column */
        void *data;
 } sql_column;
 
@@ -485,6 +488,7 @@ typedef struct sql_table {
        void *data;
        struct sql_schema *s;
        struct sql_table *p;    /* The table is part of this merge table */
+       struct sql_table *po;   /* the outer transactions table */
 } sql_table;
 
 typedef struct res_col {
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
@@ -899,30 +899,16 @@ count_del(sql_trans *tr, sql_table *t)
        return d->cnt;
 }
 
-static sql_column *
-find_col( sql_trans *tr, char *sname, char *tname, char *cname )
-{
-       sql_schema *s = find_sql_schema(tr, sname);
-       sql_table *t = NULL;
-       sql_column *c = NULL;
-
-       if (s) 
-               t = find_sql_table(s, tname);
-       if (t) 
-               c = find_sql_column(t, cname);
-       return c;
-}
-
 static int
 sorted_col(sql_trans *tr, sql_column *col)
 {
        int sorted = 0;
 
-       /* fallback to central bat */
        if (!isTable(col->t) || !col->t->s)
                return 0;
-       if (tr && tr->parent && !col->data) 
-               col = find_col(tr->parent, col->t->s->base.name, 
col->t->base.name, col->base.name);
+       /* fallback to central bat */
+       if (tr && tr->parent && !col->data && col->po) 
+               col = col->po; 
 
        if (col && col->data) {
                BAT *b = bind_col(tr, col, QUICK);
@@ -941,12 +927,8 @@ double_elim_col(sql_trans *tr, sql_colum
        if (!isTable(col->t) || !col->t->s)
                return 0;
        /* fallback to central bat */
-       if (tr && tr->parent && !col->data) {
-               col = find_col(tr->parent, 
-                       col->t->s->base.name, 
-                       col->t->base.name,
-                       col->base.name);
-       }
+       if (tr && tr->parent && !col->data && col->po) 
+               col = col->po;
 
        if (col && col->data) {
                BAT *b = bind_col(tr, col, QUICK);
@@ -959,7 +941,6 @@ double_elim_col(sql_trans *tr, sql_colum
        return de;
 }
 
-
 static int
 load_delta(sql_delta *bat, int bid, int type)
 {
@@ -2346,7 +2327,7 @@ log_table(sql_trans *tr, sql_table *ft)
        node *n;
 
        assert(tr->parent == gtrans);
-       if (ft->base.allocated)
+       if (ft->base.wtime && ft->base.allocated)
                ok = tr_log_dbat(tr, ft->data, ft->cleared);
        for (n = ft->columns.set->h; ok == LOG_OK && n; n = n->next) {
                sql_column *cc = n->data;
diff --git a/sql/storage/bat/bat_table.c b/sql/storage/bat/bat_table.c
--- a/sql/storage/bat/bat_table.c
+++ b/sql/storage/bat/bat_table.c
@@ -19,6 +19,8 @@ static BAT *
        BAT *tids = BATnew(TYPE_void, TYPE_void, 0, TRANSIENT);
        size_t nr = store_funcs.count_col(tr, c, 1);
 
+       if (!tids)
+               return NULL;
        tids->H->seq = 0;
        tids->T->seq = 0;
        BATsetcount(tids, (BUN) nr);
@@ -32,8 +34,10 @@ static BAT *
 
        if (store_funcs.count_del(tr, t)) {
                BAT *d = store_funcs.bind_del(tr, t, RD_INS);
-               BAT *diff = BATkdiff(tids, BATmirror(d));
+               BAT *diff = (d)?BATkdiff(tids, BATmirror(d)):NULL;
 
+               if (!d || !diff)
+                       return NULL;
                bat_destroy(tids);
                tids = BATmirror(BATmark(diff, 0));
                bat_destroy(diff);
@@ -62,7 +66,7 @@ delta_cands(sql_trans *tr, sql_table *t)
 }
 
 static BAT *
-delta_full_bat_( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
+delta_full_bat_( sql_column *c, sql_delta *bat, int temp)
 {
        /* return full normalized column bat
         *      b := b.copy()
@@ -72,7 +76,8 @@ delta_full_bat_( sql_trans *tr, sql_colu
        BAT *r, *b, *ui, *uv, *i = temp_descriptor(bat->ibid);
        int needcopy = 1;
 
-(void)tr;
+       if (!i)
+               return NULL;
        r = i; 
        if (temp) 
                return r;
@@ -92,7 +97,7 @@ delta_full_bat_( sql_trans *tr, sql_colu
        if (bat->uibid && bat->ucnt) {
                ui = temp_descriptor(bat->uibid);
                uv = temp_descriptor(bat->uvbid);
-               if (BATcount(ui)) {
+               if (ui && BATcount(ui)) {
                        if (needcopy) {
                                r = BATcopy(b, b->htype, b->ttype, 1, 
TRANSIENT); 
                                bat_destroy(b); 
@@ -110,11 +115,11 @@ delta_full_bat_( sql_trans *tr, sql_colu
 }
 
 static BAT *
-delta_full_bat( sql_trans *tr, sql_column *c, sql_delta *bat, int temp)
+delta_full_bat( sql_column *c, sql_delta *bat, int temp)
 {
        if (!store_initialized && bat->cached) 
                return bat->cached;
-       return delta_full_bat_( tr, c, bat, temp);
+       return delta_full_bat_( c, bat, temp);
 }
 
 static BAT *
@@ -124,7 +129,7 @@ full_column(sql_trans *tr, sql_column *c
                sql_column *oc = tr_find_column(tr->parent, c);
                c->data = timestamp_delta(oc->data, tr->stime);
        }
-       return delta_full_bat(tr, c, c->data, isTemp(c));
+       return delta_full_bat(c, c->data, isTemp(c));
 }
 
 static void
@@ -146,8 +151,12 @@ column_find_row(sql_trans *tr, sql_colum
        sql_column *n = NULL;
 
        s = delta_cands(tr, c->t);
+       if (!s)
+               return oid_nil;
        va_start(va, value);
        b = full_column(tr, c);
+       if (!b)
+               return oid_nil;
        if ((n = va_arg(va, sql_column *)) == NULL) {
                if (BAThash(b, 0) == GDK_SUCCEED) {
                        BATiter cni = bat_iterator(b);
@@ -166,6 +175,8 @@ column_find_row(sql_trans *tr, sql_colum
                return rid;
        }
        r = BATsubselect(b, s, value, NULL, 1, 0, 0);
+       if (!r)
+               return oid_nil;
        bat_destroy(s);
        s = r;
        full_destroy(c, b);
@@ -174,7 +185,11 @@ column_find_row(sql_trans *tr, sql_colum
                c = n;
 
                b = full_column(tr, c);
+               if (!b)
+                       return oid_nil;
                r = BATsubselect(b, s, value, NULL, 1, 0, 0);
+               if (!r)
+                       return oid_nil;
                bat_destroy(s);
                s = r;
                full_destroy(c, b);
@@ -196,7 +211,8 @@ column_find_value(sql_trans *tr, sql_col
        void *res = NULL;
 
        b = full_column(tr, c);
-       q = BUNfnd(BATmirror(b), (ptr) &rid);
+       if (b)
+               q = BUNfnd(BATmirror(b), (ptr) &rid);
        if (q != BUN_NONE) {
                BATiter bi = bat_iterator(b);
                void *r;
diff --git a/sql/storage/bat/bat_utils.c b/sql/storage/bat/bat_utils.c
--- a/sql/storage/bat/bat_utils.c
+++ b/sql/storage/bat/bat_utils.c
@@ -195,63 +195,30 @@ bat_utils_init(void)
        }
 }
 
-sql_schema *
-tr_find_schema( sql_trans *tr, sql_schema *s)
-{
-       sql_schema *ns = NULL;
-
-       while (!ns && tr) {
-               ns = find_sql_schema_id(tr, s->base.id);
-               tr = tr->parent;
-       }
-       return ns;
-}
-
 sql_table *
 tr_find_table( sql_trans *tr, sql_table *t)
 {
-       sql_table *nt = NULL;
-
-       while ((!nt || !nt->data) && tr) {
-               sql_schema *s = tr_find_schema( tr, t->s);
-
-               if (list_length(s->tables.set) < HASH_MIN_SIZE)
-                       nt = find_sql_table_id(s, t->base.id);
-               else
-                       nt = find_sql_table(s, t->base.name);
-               assert(!nt || nt->base.id == t->base.id);
-               tr = tr->parent;
-       }
-       return nt;
+       (void)tr;
+       if (t->po)
+               return t->po;
+       return NULL;
 }
 
 sql_column *
 tr_find_column( sql_trans *tr, sql_column *c)
 {
-       sql_column *nc = NULL;
-
-       while ((!nc || !nc->data) && tr) {
-               sql_table *t =  tr_find_table(tr, c->t);
-               node *n = cs_find_id(&t->columns, c->base.id);
-               if (n)
-                       nc = n->data;
-               tr = tr->parent;
-       }
-       return nc;
+       (void)tr;
+       if (c->po)
+               return c->po;
+       return NULL;
 }
 
 sql_idx *
 tr_find_idx( sql_trans *tr, sql_idx *i)
 {
-       sql_idx *ni = NULL;
-
-       while ((!ni || !ni->data) && tr) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to