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