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

Reply via email to