Changeset: 643bc4348f62 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/643bc4348f62
Branch: default
Log Message:

Merged with Jan2022


diffs (166 lines):

diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1076,7 +1076,7 @@ mvc_drop_type(mvc *m, sql_schema *s, sql
 {
        TRC_DEBUG(SQL_TRANS, "Drop type: %s %s\n", s->base.name, t->base.name);
        if (t)
-               return sql_trans_drop_type(m->session->tr, s, t->base.id, 
drop_action);
+               return sql_trans_drop_type(m->session->tr, s, t->base.id, 
drop_action ? DROP_CASCADE_START : DROP_RESTRICT);
        return 0;
 }
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3707,6 +3707,8 @@ sql_trans_destroy(sql_trans *tr)
        }
        store_unlock(store);
        MT_lock_destroy(&tr->lock);
+       if (!list_empty(tr->dropped))
+               list_destroy(tr->dropped);
        _DELETE(tr);
        return res;
 }
@@ -4833,10 +4835,31 @@ sql_trans_drop_type(sql_trans *tr, sql_s
        sql_type *t = sql_trans_find_type(tr, s, id);
        int res = LOG_OK;
 
+       if (drop_action == DROP_CASCADE_START || drop_action == DROP_CASCADE) {
+               sqlid* local_id = MNEW(sqlid);
+               if (!local_id)
+                       return -1;
+
+               if (!tr->dropped) {
+                       tr->dropped = list_create((fdestroy) &id_destroy);
+                       if (!tr->dropped) {
+                               _DELETE(local_id);
+                               return -1;
+                       }
+               }
+               *local_id = t->base.id;
+               list_append(tr->dropped, local_id);
+       }
+
        if ((res = sys_drop_type(tr, t, drop_action)))
                return res;
        if ((res = os_del(s->types, tr, t->base.name, dup_base(&t->base))))
                return res;
+
+       if (drop_action == DROP_CASCADE_START && tr->dropped) {
+               list_destroy(tr->dropped);
+               tr->dropped = NULL;
+       }
        return res;
 }
 
@@ -4979,22 +5002,17 @@ build_drop_func_list_item(sql_trans *tr,
 int
 sql_trans_drop_all_func(sql_trans *tr, sql_schema *s, list *list_func, int 
drop_action)
 {
-       node *n = NULL;
-       sql_func *func = NULL;
-       list* to_drop = NULL;
+       list *to_drop = NULL;
        int res = LOG_OK;
 
        (void) drop_action;
-
-       if (!tr->dropped) {
-               tr->dropped = list_create((fdestroy) &id_destroy);
-               if (!tr->dropped)
-                       return -1;
-       }
-       for (n = list_func->h; n ; n = n->next ) {
-               func = (sql_func *) n->data;
-
-               if (! list_find_id(tr->dropped, func->base.id)){
+       if (!tr->dropped && !(tr->dropped = list_create((fdestroy) 
&id_destroy)))
+               return -1;
+
+       for (node *n = list_func->h; n ; n = n->next ) {
+               sql_func *func = (sql_func *) n->data;
+
+               if (!list_find_id(tr->dropped, func->base.id)) {
                        sqlid *local_id = MNEW(sqlid);
                        if (!local_id) {
                                list_destroy(tr->dropped);
@@ -5003,33 +5021,32 @@ sql_trans_drop_all_func(sql_trans *tr, s
                                        list_destroy(to_drop);
                                return -1;
                        }
-                       if (!to_drop) {
-                               to_drop = list_create(NULL);
-                               if (!to_drop) {
-                                       list_destroy(tr->dropped);
-                                       return -1;
-                               }
+                       if (!to_drop && !(to_drop = list_create(NULL))) {
+                               list_destroy(tr->dropped);
+                               tr->dropped = NULL;
+                               return -1;
                        }
                        *local_id = func->base.id;
                        list_append(tr->dropped, local_id);
                        list_append(to_drop, func);
-                       //sql_trans_drop_func(tr, s, func->base.id, drop_action 
? DROP_CASCADE : DROP_RESTRICT);
                }
        }
 
        if (to_drop) {
-               for (n = to_drop->h; n ; n = n->next ) {
-                       func = (sql_func *) n->data;
-                       if ((res = build_drop_func_list_item(tr, s, 
func->base.id)))
+               for (node *n = to_drop->h; n ; n = n->next ) {
+                       sql_func *func = (sql_func *) n->data;
+                       if ((res = build_drop_func_list_item(tr, s, 
func->base.id))) {
+                               list_destroy(tr->dropped);
+                               tr->dropped = NULL;
+                               list_destroy(to_drop);
                                return res;
+                       }
                }
                list_destroy(to_drop);
        }
 
-       if ( tr->dropped) {
-               list_destroy(tr->dropped);
-               tr->dropped = NULL;
-       }
+       list_destroy(tr->dropped);
+       tr->dropped = NULL;
        return res;
 }
 
@@ -6806,10 +6823,31 @@ sql_trans_drop_sequence(sql_trans *tr, s
 {
        int res = LOG_OK;
 
+       if (drop_action == DROP_CASCADE_START || drop_action == DROP_CASCADE) {
+               sqlid* local_id = MNEW(sqlid);
+               if (!local_id)
+                       return -1;
+
+               if (!tr->dropped) {
+                       tr->dropped = list_create((fdestroy) &id_destroy);
+                       if (!tr->dropped) {
+                               _DELETE(local_id);
+                               return -1;
+                       }
+               }
+               *local_id = seq->base.id;
+               list_append(tr->dropped, local_id);
+       }
+
        if ((res = sys_drop_sequence(tr, seq, drop_action)))
                return res;
        if ((res = os_del(s->seqs, tr, seq->base.name, dup_base(&seq->base))))
                return res;
+
+       if (drop_action == DROP_CASCADE_START && tr->dropped) {
+               list_destroy(tr->dropped);
+               tr->dropped = NULL;
+       }
        return res;
 }
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to