Changeset: a9f28545e9e2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a9f28545e9e2
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/objectset.c
sql/storage/sql_catalog.c
sql/storage/store.c
Branch: tempscs2os
Log Message:
various fixes
diffs (194 lines):
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
@@ -2296,7 +2296,6 @@ append_idx(sql_trans *tr, sql_idx *i, BU
return LOG_ERR;
assert(delta->cs.st == ST_DEFAULT);
- assert(delta && delta->cs.ts == tr->tid);
odelta = delta;
res = append_col_execute(tr, &delta, i->base.id, offset, offsets, data,
cnt, tpe, NULL);
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -402,7 +402,8 @@ objectversion_destroy(sqlstore *store, o
if (os->destroy)
os->destroy(store, ov->b);
- if (os->temporary) os_destroy(os, store); // TODO tempscs2os : embed
into refcounting subproject
+ if (os->temporary && (state & deleted || state & under_destruction ||
state & rollbacked))
+ os_destroy(os, store); // TODO tempscs2os : embed into
refcounting subproject : reference is already dropped by os_cleanup
_DELETE(ov);
}
@@ -581,6 +582,9 @@ os_cleanup(sqlstore* store, objectversio
return LOG_OK;
}
+ assert(os_atmc_get_state(ov) != deleted && os_atmc_get_state(ov) !=
under_destruction && os_atmc_get_state(ov) != rollbacked);
+ if (ov->os->temporary) os_destroy(ov->os, store); // TODO tempscs2os :
embed into refcounting subproject: (old) live versions should drop their
reference to the os
+
while (ov->id_based_older && ov->id_based_older == ov->name_based_older
&& ov->ts >= oldest) {
ov = ov->id_based_older;
}
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -141,10 +141,14 @@ schema_find_key(sql_trans *tr, sql_schem
sql_base *b = os_find_name(s->keys, tr, name);
if (!b && tr->tmp == s) {
- sql_table *t = (sql_table*) os_find_name(tr->_localtmps, tr,
name);
- sql_key *o = find_sql_key(t, name);
- if (o)
- return o;
+ struct os_iter oi;
+ os_iterator(&oi, tr->_localtmps, tr, NULL);
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+ sql_table *t = (sql_table *) b;
+ sql_key *o = find_sql_key(t, name);
+ if (o)
+ return o;
+ }
}
return (sql_key*)b;
}
@@ -178,10 +182,14 @@ schema_find_idx(sql_trans *tr, sql_schem
sql_base *b = os_find_name(s->idxs, tr, name);
if (!b && tr->tmp == s) {
- sql_table *t = (sql_table*) os_find_name(tr->_localtmps, tr, name);
- sql_idx *o = find_sql_idx(t, name);
- if (o)
- return o;
+ struct os_iter oi;
+ os_iterator(&oi, tr->_localtmps, tr, NULL);
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+ sql_table *t = (sql_table *) b;
+ sql_idx *o = find_sql_idx(t, name);
+ if (o)
+ return o;
+ }
}
return (sql_idx*)b;
}
@@ -194,7 +202,7 @@ schema_find_idx_id(sql_trans *tr, sql_sc
if (!b && tr->tmp == s) {
struct os_iter oi;
os_iterator(&oi, tr->_localtmps, tr, NULL);
- for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) { // TODO:
maybe an objectset for idxs or have idxs in global idxs os
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
sql_table *t = (sql_table *) b;
node *o = ol_find_id(t->idxs, id);
if (o)
@@ -381,10 +389,14 @@ schema_find_trigger(sql_trans *tr, sql_s
sql_base *b = os_find_name(s->triggers, tr, name);
if (!b && tr->tmp == s) {
- sql_table *t = (sql_table*) os_find_name(tr->_localtmps, tr,
name);
- sql_trigger *o = find_sql_trigger(t, name);
- if (o)
- return o;
+ struct os_iter oi;
+ os_iterator(&oi, tr->_localtmps, tr, NULL);
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+ sql_table *t = (sql_table *) b;
+ sql_trigger *o = find_sql_trigger(t, name);
+ if (o)
+ return o;
+ }
}
return (sql_trigger*)b;
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3147,6 +3147,7 @@ cleanup:
sql_table *
globaltmp_instantiate(sql_trans *tr, sql_table *ot)
{
+ assert(isGlobal(ot)&& isTempTable(ot));
sql_table *t = NULL;
if (table_dup(tr, ot, NULL, NULL, &t) == LOG_OK)
return t;
@@ -3583,6 +3584,14 @@ sql_trans_rollback(sql_trans *tr, bool c
{
sqlstore *store = tr->store;
if (!list_empty(tr->changes)) {
+ struct os_iter oi;
+ os_iterator(&oi, tr->_localtmps, tr, NULL);
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+ sql_table *t = (sql_table *) b;
+ if (t->commit_action == CA_DROP && !b->deleted) {
+ (void) sql_trans_drop_table_id(tr, t->s, b->id,
DROP_RESTRICT);// TODO tempscs2os : fix result code sql_trans_drop_table_id
+ }
+ }
/* revert the change list */
list *nl = SA_LIST(tr->sa, (fdestroy) NULL);
for(node *n=tr->changes->h; n; n = n->next)
@@ -3858,6 +3867,15 @@ sql_trans_commit(sql_trans *tr)
sqlstore *store = tr->store;
if (!list_empty(tr->changes)) {
+ struct os_iter oi;
+ os_iterator(&oi, tr->_localtmps, tr, NULL);
+ for(sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+ sql_table *t = (sql_table *) b;
+ if (t->commit_action == CA_DROP && !b->deleted) {
+ (void) sql_trans_drop_table_id(tr, t->s, b->id,
DROP_RESTRICT);;// TODO tempscs2os : fix result code sql_trans_drop_table_id
+ }
+ }
+
int flush = 0;
ulng commit_ts = 0, oldest = 0, log_file_id = 0;
@@ -5816,24 +5834,21 @@ create_sql_column(sqlstore *store, sql_a
int
sql_trans_drop_table(sql_trans *tr, sql_schema *s, const char *name, int
drop_action)
{
- sql_table *t = find_sql_table(tr, s, name), *gt = NULL;
+ sql_table *t = find_sql_table(tr, s, name);
if (!t) {
TRC_ERROR(SQL_STORE, "sql_trans_drop_table: Table %s.%s does
not exist\n", s->base.name, name);
return -1;
}
+ sql_table *gt = t;
if (t && isTempTable(t)) {
- gt = find_sql_table_id(tr, s, t->base.id);
- assert(t == gt); // TODO tempscs2os: Check if this code is ever
different
- if (gt)
- t = gt;
- }
- int is_global = isGlobal(t), res = LOG_OK;
- sql_base *n = NULL;
-
- if (!is_global || gt)
- n = os_find_id(tr->_localtmps, tr, t->base.id);
+ gt = (sql_table*)os_find_id(s->tables, tr, t->base.id);
+ }
+
+ assert(t == gt || !gt || (isTempTable(gt) && !isLocalTemp(gt) &&
isLocalTemp(t)));
+
+ int res = LOG_OK;
if ((drop_action == DROP_CASCADE_START || drop_action == DROP_CASCADE)
&&
tr->dropped && list_find_id(tr->dropped, t->base.id))
@@ -5860,11 +5875,10 @@ sql_trans_drop_table(sql_trans *tr, sql_
return res;
t->base.deleted = 1;
- if (is_global) {
- if ((res = os_del(s->tables, tr, t->base.name,
dup_base(&t->base))))
- return res;
- }
- if (n && (res =os_del(tr->_localtmps, tr, n->name, dup_base(n))))
+
+ if (gt && (res = os_del(s->tables, tr, gt->base.name,
dup_base(>->base))))
+ return res;
+ if (t != gt && (res =os_del(tr->_localtmps, tr, t->base.name,
dup_base(&t->base))))
return res;
sqlstore *store = tr->store;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]