Changeset: fd1f3abf5ec0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fd1f3abf5ec0
Modified Files:
sql/backends/monet5/sql_cat.c
sql/storage/sql_catalog.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: nospare
Log Message:
just checking list length (==0 for list_empty) isn't enough anymore, ie need to
validate if list remaining objects are
visible and/or already deleted
diffs (220 lines):
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -1075,7 +1075,8 @@ SQLcreate_schema(Client cntxt, MalBlkPtr
str
SQLdrop_schema(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
-{ mvc *sql = NULL;
+{
+ mvc *sql = NULL;
str msg= MAL_SUCCEED;
str sname = *getArgReference_str(stk, pci, 1);
str notused = *getArgReference_str(stk, pci, 2);
@@ -1091,6 +1092,7 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m
throw(SQL,"sql.drop_schema",SQLSTATE(3F000) "DROP
SCHEMA: name %s does not exist", sname);
return MAL_SUCCEED;
}
+ sql_trans *tr = sql->session->tr;
if (!mvc_schema_privs(sql, s))
throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA:
access denied for %s to schema '%s'", get_string_global_var(sql,
"current_user"), s->base.name);
if (s == cur_schema(sql))
@@ -1100,8 +1102,8 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m
if (sql_schema_has_user(sql, s))
throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA:
unable to drop schema '%s' (there are database objects which depend on it)",
sname);
if (!action /* RESTRICT */ && (
- !list_empty(s->tables.set) || !list_empty(s->types.set) ||
- !list_empty(s->funcs.set) || !list_empty(s->seqs.set)))
+ !tr_empty(tr, s->tables.set) || !tr_empty(tr, s->types.set) ||
+ !tr_empty(tr, s->funcs.set) || !tr_empty(tr, s->seqs.set)))
throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA:
unable to drop schema '%s' (there are database objects which depend on it)",
sname);
if (mvc_drop_schema(sql, s, action))
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
@@ -70,6 +70,32 @@ static void *
return NULL;
}
+static sql_base *
+tr_get_object(sql_trans *tr, sql_base *b)
+{
+ while (b) {
+ if (b->ts == tr->tid || b->ts < tr->ts)
+ return b;
+ else
+ b = b->older;
+ }
+ return b;
+}
+
+int
+tr_empty(sql_trans *tr, list *l)
+{
+ if (list_empty(l))
+ return 1;
+ for(node *n = l->h; n; n=n->next) {
+ sql_base *b = tr_get_object(tr, n->data);
+
+ if (b && !b->deleted)
+ return 0;
+ }
+ return 1;
+}
+
void
trans_add(sql_trans *tr, sql_base *b, void *data, tc_cleanup_fptr cleanup,
tc_log_fptr log)
{
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -442,6 +442,8 @@ extern sql_part *sql_trans_copy_part(sql
extern void sql_trans_drop_any_comment(sql_trans *tr, sqlid id);
extern void sql_trans_drop_obj_priv(sql_trans *tr, sqlid obj_id);
+extern int tr_empty(sql_trans *tr, list *l);
+
#define TRANSACTION_ID_BASE (1ULL<<63)
#define inTransaction(tr, obj) (((sql_base*)obj)->ts == tr->tid)
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -433,7 +433,8 @@ tc_log_table(sql_trans *tr, sql_change *
if (t->base.deleted) {
ok = store->storage_api.log_destroy_del(tr, change,
commit_ts, oldest);
} else { /* new table ? */
- ok = store->storage_api.log_create_del(tr, change,
commit_ts, oldest);
+ if (t->base.flags == TR_NEW)
+ ok = store->storage_api.log_create_del(tr,
change, commit_ts, oldest);
if (ok == LOG_OK)
return tc_commit_table_(tr, t, commit_ts,
oldest);
}
@@ -4020,7 +4021,8 @@ sys_drop_part(sql_trans *tr, sql_table *
sql_part *pt = partition_find_part(tr, t, NULL);
assert(pt);
- sql_trans_del_table(tr, pt->t, t, drop_action);
+ if (!sql_trans_del_table(tr, pt->t, t, drop_action))
+ break;
}
}
@@ -5045,6 +5047,22 @@ create_sql_column(sqlstore *store, sql_a
return create_sql_column_with_id(sa, next_oid(store), t, name, tpe);
}
+static sql_table*
+new_table( sql_trans *tr, sql_table *t, node *n)
+{
+ if (t->base.ts == tr->tid)
+ return t;
+ sql_table *dt = SA_ZNEW(tr->sa, sql_table);
+ *dt = *t;
+ dt->base.ts = tr->tid;
+ dt->base.older = &t->base;
+ t->base.newer = &dt->base;
+ trans_add(tr, &dt->base, dt->data, &tc_gc_table, &tc_log_table);
+ //n->data = dt;
+ list_update_data(t->s->tables.set, n, dt);
+ return dt;
+}
+
int
sql_trans_drop_table(sql_trans *tr, sql_schema *s, sqlid id, int drop_action)
{
@@ -5079,15 +5097,9 @@ sql_trans_drop_table(sql_trans *tr, sql_
if (isTempTable(t)) {
cs_del(&s->tables, n, t->base.flags);
} else {
- sql_table *dt = SA_ZNEW(tr->sa, sql_table);
- *dt = *t;
- dt->base.ts = tr->tid;
+ sql_table *dt = new_table(tr, t, n);
+
dt->base.deleted = 1;
- dt->base.older = &t->base;
- t->base.newer = &dt->base;
- trans_add(tr, &dt->base, dt->data, &tc_gc_table, &tc_log_table);
- list_update_data(s->tables.set, n, dt);
- //n->data = dt;
}
/* todo use changes list instead of dropped and moved_tables */
@@ -5233,6 +5245,25 @@ sql_trans_drop_column(sql_trans *tr, sql
return 0;
}
+static sql_column*
+new_column( sql_trans *tr, sql_column *col)
+{
+ if (col->base.ts == tr->tid)
+ return col;
+ 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;
+ 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);
+ }
+ trans_add(tr, &cc->base, cc->data, &tc_gc_column, NULL);
+ return cc;
+}
+
sql_column *
sql_trans_alter_null(sql_trans *tr, sql_column *col, int isnull)
{
@@ -5247,20 +5278,9 @@ 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);
- /* 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;
+
+ col = new_column(tr, col);
+ col->null = isnull;
}
return col;
}
@@ -5278,6 +5298,7 @@ sql_trans_alter_access(sql_trans *tr, sq
if (is_oid_nil(rid))
return NULL;
store->table_api.column_update_value(tr,
find_sql_column(systable, "access"), rid, &access);
+ t = new_table(tr, t, find_sql_table_node(t->s, t->base.id));
t->access = access;
}
return t;
@@ -5303,6 +5324,8 @@ sql_trans_alter_default(sql_trans *tr, s
if (sys_drop_default_object(tr, col, 0) == -1)
return NULL;
store->table_api.column_update_value(tr, col_dfs, rid, p);
+
+ col = new_column(tr, col);
col->def = NULL;
if (val)
col->def = sa_strdup(tr->sa, val);
@@ -5328,6 +5351,8 @@ sql_trans_alter_storage(sql_trans *tr, s
if (is_oid_nil(rid))
return NULL;
store->table_api.column_update_value(tr, col_dfs, rid, p);
+
+ col = new_column(tr, col);
col->storage_type = NULL;
if (storage)
col->storage_type = sa_strdup(tr->sa, storage);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list