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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list