Changeset: 9a784a7f358c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9a784a7f358c
Modified Files:
sql/storage/store.c
Branch: nospare
Log Message:
handle first alter's
diffs (81 lines):
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -233,15 +233,21 @@ base_destroy(sqlstore *store, sql_base *
else if (newer && older)
newer->older = older;
+ if (newer) /* nothing to remove */
+ return;
if (l1) {
node *bn = list_find(l1, b, NULL);
if (bn)
list_remove_node(l1, bn);
+ if (older)
+ list_append(l1, older);
}
if (l2) {
node *bn = list_find(l2, b, NULL);
if (bn)
list_remove_node(l2, bn);
+ if (older)
+ list_append(l2, older);
}
}
@@ -284,6 +290,25 @@ tc_gc_key(sqlstore *store, sql_change *c
}
static int
+tc_gc_column(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest)
+{
+ sql_column *i = (sql_column*)change->obj;
+
+ (void)store;
+ if (i->base.deleted || !commit_ts) {
+ if (i->base.ts < oldest || (i->base.ts == commit_ts &&
commit_ts == oldest) || !commit_ts) {
+ int ok = LOG_OK;
+ base_destroy(store, &i->base, commit_ts,
i->t->columns.set, NULL);
+ if (ok == LOG_OK)
+ return 1; /* handled */
+ else
+ return LOG_ERR;
+ }
+ }
+ return 0;
+}
+
+static int
tc_gc_idx(sqlstore *store, sql_change *change, ulng commit_ts, ulng oldest)
{
sql_idx *i = (sql_idx*)change->obj;
@@ -5241,6 +5266,7 @@ sql_column *
sql_trans_alter_null(sql_trans *tr, sql_column *col, int isnull)
{
sqlstore *store = tr->store;
+
if (col->null != isnull) {
sql_schema *syss = find_sql_schema(tr,
isGlobal(col->t)?"sys":"tmp");
sql_table *syscolumn = find_sql_table(tr, syss, "_columns");
@@ -5250,7 +5276,20 @@ sql_trans_alter_null(sql_trans *tr, sql_
if (is_oid_nil(rid))
return NULL;
store->table_api.column_update_value(tr,
find_sql_column(syscolumn, "null"), rid, &isnull);
- col->null = isnull;
+ /* change */
+ sql_column *cc = SA_ZNEW(tr->sa, sql_column);
+ *cc = *col;
+ cc->base.ts = tr->tid;
+ cc->base.older = &col->base;
+ col->base.newer = &cc->base;
+ trans_add(tr, &cc->base, cc->data, &tc_gc_column, NULL);
+ node *n = list_find_base_id(col->t->columns.set, col->base.id);
+ if (n) {
+ assert(n->data == col);
+ list_update_data(col->t->columns.set, n, cc);
+ }
+ cc->null = isnull;
+ col = cc;
}
return col;
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list