Changeset: 5890bd776993 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5890bd776993
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/common/sql_types.c
        sql/include/sql_catalog.h
        sql/server/sql_mvc.c
        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/sql_storage.h
        sql/storage/store.c
        sql/test/pg_regress/Tests/alter_table.stable.err
Branch: default
Log Message:

Merge with Jul2015 branch.


diffs (truncated from 1742 to 300 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -882,7 +882,7 @@ dump_joinN(backend *sql, MalBlkPtr mb, s
                return -1;
        mod = sql_func_mod(s->op4.funcval->func);
        fimp = sql_func_imp(s->op4.funcval->func);
-       fimp = strconcat(fimp, "subjoin");
+       fimp = sa_strconcat(sql->mvc->sa, fimp, "subjoin");
 
        /* dump left and right operands */
        _dumpstmt(sql, mb, s->op1);
@@ -1457,7 +1457,7 @@ static int
 
                                        mod = sql_func_mod(f);
                                        fimp = sql_func_imp(f);
-                                       fimp = strconcat(fimp, "subselect");
+                                       fimp = sa_strconcat(sql->mvc->sa, fimp, 
"subselect");
                                        q = newStmt(mb, mod, 
convertOperator(fimp));
                                        // push pointer to the SQL structure 
into the MAL call
                                        // allows getting argument names for 
example
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
@@ -136,6 +136,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
@@ -167,6 +167,7 @@ typedef struct sql_base {
        int rtime;
        int allocated;
        int flag;
+       int refcnt;
        sqlid id;
        char *name;
 } sql_base;
@@ -369,6 +370,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;
 
@@ -446,6 +448,7 @@ typedef struct sql_column {
        char *max;
 
        struct sql_table *t;
+       struct sql_column *po;  /* the outer transactions column */
        void *data;
 } sql_column;
 
@@ -492,6 +495,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/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -216,10 +216,44 @@ mvc_trans(mvc *m)
        store_unlock();
 }
 
+static sql_trans *
+sql_trans_deref( sql_trans *tr ) 
+{
+       node *n, *m, *o;
+
+       for ( n = tr->schemas.set->h; n; n = n->next) {
+               sql_schema *s = n->data;
+
+               if (s->tables.set)
+               for ( m = s->tables.set->h; m; m = m->next) {
+                       sql_table *t = m->data;
+
+                       if (t->po) 
+                               t->po = t->po->po;
+
+                       if (t->columns.set)
+                       for ( o = t->columns.set->h; o; o = o->next) {
+                               sql_column *c = o->data;
+
+                               if (c->po) 
+                                       c->po = c->po->po;
+                       }
+                       if (t->idxs.set)
+                       for ( o = t->idxs.set->h; o; o = o->next) {
+                               sql_idx *i = o->data;
+
+                               if (i->po) 
+                                       i->po = i->po->po;
+                       }
+               }
+       }
+       return tr->parent;
+}
+
 int
 mvc_commit(mvc *m, int chain, const char *name)
 {
-       sql_trans *cur, *tr = m->session->tr;
+       sql_trans *cur, *tr = m->session->tr, *ctr;
        int ok = SQL_OK;//, wait = 0;
 
        assert(tr);
@@ -253,11 +287,15 @@ build up the hash (not copied in the tra
        }
 
        /* first release all intermediate savepoints */
-       cur = tr;
+       ctr = cur = tr;
        tr = tr->parent;
        if (tr->parent) {
                store_lock();
                while (tr->parent != NULL && ok == SQL_OK) {
+                       /* first free references to tr objects, ie
+                        * c->po = c->po->po etc
+                        */
+                       ctr = sql_trans_deref(ctr);
                        tr = sql_trans_destroy(tr);
                }
                store_unlock();
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
@@ -15,6 +15,13 @@
 
 #define SNAPSHOT_MINSIZE ((BUN) 1024*128)
 
+static sql_trans *
+oldest_active_transaction(void)
+{
+       sql_session *s = active_sessions->h->data;
+       return s->tr;
+}
+
 sql_delta *
 timestamp_delta( sql_delta *d, int ts)
 {
@@ -899,30 +906,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 +934,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 +948,6 @@ double_elim_col(sql_trans *tr, sql_colum
        return de;
 }
 
-
 static int
 load_delta(sql_delta *bat, int bid, int type)
 {
@@ -2070,14 +2058,10 @@ tr_update_dbat(sql_trans *tr, sql_dbat *
        if (BUNlast(db) > db->batInserted || cleared) {
                BAT *odb = temp_descriptor(tdb->dbid);
 
-               /* For large deletes write the new deletes bat */
-               if (BATcount(db) > SNAPSHOT_MINSIZE) {
-                       temp_destroy(tdb->dbid);
-                       tdb->dbid = fdb->dbid;
-               } else {
-                       append_inserted(odb, db);
-                       temp_destroy(fdb->dbid);
-               }
+               append_inserted(odb, db);
+               BATcommit(odb);
+               temp_destroy(fdb->dbid);
+
                fdb->dbid = 0;
                tdb->cnt = fdb->cnt;
                bat_destroy(odb);
@@ -2110,7 +2094,7 @@ tr_merge_dbat(sql_trans *tr, sql_dbat *t
 static int
 update_table(sql_trans *tr, sql_table *ft, sql_table *tt)
 {
-       sql_trans *oldest = active_transactions->h->data;
+       sql_trans *oldest = oldest_active_transaction();
        int ok = LOG_OK;
        node *n, *m;
 
@@ -2346,7 +2330,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);
@@ -31,9 +33,12 @@ static BAT *
        tids->H->dense = 1;
 
        if (store_funcs.count_del(tr, t)) {
-               BAT *d = store_funcs.bind_del(tr, t, RD_INS);
-               BAT *diff = BATdiff(tids, d, NULL, NULL, 0, BUN_NONE);
-               bat_destroy(d);
+               BAT *d, *diff = NULL;
+
+               if ((d = store_funcs.bind_del(tr, t, RD_INS)) != NULL) {
+                       diff = BATdiff(tids, d, NULL, NULL, 0, BUN_NONE);
+                       bat_destroy(d);
+               }
                bat_destroy(tids);
                tids = diff;
        }
@@ -60,7 +65,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()
@@ -70,7 +75,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;
@@ -91,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) {
                                assert(b->htype == TYPE_void);
                                r = COLcopy(b, b->ttype, 1, TRANSIENT); 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to