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