Changeset: b745c54e099a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b745c54e099a
Added Files:
        sql/test/BugTracker-2019/Tests/drop-table-cascade.Bug-6805.sql
        sql/test/BugTracker-2019/Tests/drop-table-cascade.Bug-6805.stable.err
        sql/test/BugTracker-2019/Tests/drop-table-cascade.Bug-6805.stable.out
Modified Files:
        sql/include/sql_catalog.h
        sql/storage/sql_catalog.c
        sql/storage/store.c
        sql/test/BugTracker-2019/Tests/All
Branch: Nov2019
Log Message:

Added test and fix for bug 6805, ie the dependencies of an object can be on a 
different schema, so search on all schemas of the current transaction for the 
dependent ids.


diffs (truncated from 528 to 300 lines):

diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -696,8 +696,12 @@ extern node *list_find_id(list *l, sqlid
 extern node *list_find_base_id(list *l, sqlid id);
 
 extern sql_key *find_sql_key(sql_table *t, const char *kname);
+extern node *find_sql_key_node(sql_schema *s, sqlid id);
+extern sql_key *sql_trans_find_key(sql_trans *tr, sqlid id);
 
 extern sql_idx *find_sql_idx(sql_table *t, const char *kname);
+extern node *find_sql_idx_node(sql_schema *s, sqlid id);
+extern sql_idx *sql_trans_find_idx(sql_trans *tr, sqlid id);
 
 extern sql_column *find_sql_column(sql_table *t, const char *cname);
 
@@ -706,6 +710,7 @@ extern sql_part *find_sql_part(sql_table
 extern sql_table *find_sql_table(sql_schema *s, const char *tname);
 extern sql_table *find_sql_table_id(sql_schema *s, sqlid id);
 extern node *find_sql_table_node(sql_schema *s, sqlid id);
+extern sql_table *sql_trans_find_table(sql_trans *tr, sqlid id);
 
 extern sql_sequence *find_sql_sequence(sql_schema *s, const char *sname);
 
@@ -716,6 +721,7 @@ extern node *find_sql_schema_node(sql_tr
 extern sql_type *find_sql_type(sql_schema * s, const char *tname);
 extern sql_type *sql_trans_bind_type(sql_trans *tr, sql_schema *s, const char 
*name);
 extern node *find_sql_type_node(sql_schema *s, sqlid id);
+extern sql_type *sql_trans_find_type(sql_trans *tr, sqlid id);
 
 extern sql_func *find_sql_func(sql_schema * s, const char *tname);
 extern list *find_all_sql_func(sql_schema * s, const char *tname, sql_ftype 
type);
@@ -723,6 +729,9 @@ extern sql_func *sql_trans_bind_func(sql
 extern sql_func *sql_trans_find_func(sql_trans *tr, sqlid id);
 extern node *find_sql_func_node(sql_schema *s, sqlid id);
 
+extern node *find_sql_trigger_node(sql_schema *s, sqlid id);
+extern sql_trigger *sql_trans_find_trigger(sql_trans *tr, sqlid id);
+
 extern void *sql_values_list_element_validate_and_insert(void *v1, void *v2, 
int* res);
 extern void *sql_range_part_validate_and_insert(void *v1, void *v2);
 extern void *sql_values_part_validate_and_insert(void *v1, void *v2);
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
@@ -164,12 +164,56 @@ find_sql_key(sql_table *t, const char *k
        return _cs_find_name(&t->keys, kname);
 }
 
+node *
+find_sql_key_node(sql_schema *s, sqlid id)
+{
+       return list_find_base_id(s->keys, id);
+}
+
+sql_key *
+sql_trans_find_key(sql_trans *tr, sqlid id)
+{
+       node *n, *m;
+       sql_key *k = NULL;
+
+       if (tr->schemas.set) {
+               for (n = tr->schemas.set->h; n && !k; n = n->next) {
+                       m = find_sql_key_node(n->data, id);
+                       if (m)
+                               k = m->data;
+               }
+       }
+       return k;
+}
+
 sql_idx *
 find_sql_idx(sql_table *t, const char *iname)
 {
        return _cs_find_name(&t->idxs, iname);
 }
 
+node *
+find_sql_idx_node(sql_schema *s, sqlid id)
+{
+       return list_find_base_id(s->idxs, id);
+}
+
+sql_idx *
+sql_trans_find_idx(sql_trans *tr, sqlid id)
+{
+       node *n, *m;
+       sql_idx *i = NULL;
+
+       if (tr->schemas.set) {
+               for (n = tr->schemas.set->h; n && !i; n = n->next) {
+                       m = find_sql_idx_node(n->data, id);
+                       if (m)
+                               i = m->data;
+               }
+       }
+       return i;
+}
+
 sql_column *
 find_sql_column(sql_table *t, const char *cname)
 {
@@ -204,6 +248,22 @@ find_sql_table_node(sql_schema *s, sqlid
        return cs_find_id(&s->tables, id);
 }
 
+sql_table *
+sql_trans_find_table(sql_trans *tr, sqlid id)
+{
+       node *n, *m;
+       sql_table *t = NULL;
+
+       if (tr->schemas.set) {
+               for (n = tr->schemas.set->h; n && !t; n = n->next) {
+                       m = find_sql_table_node(n->data, id);
+                       if (m)
+                               t = m->data;
+               }
+       }
+       return t;
+}
+
 sql_sequence *
 find_sql_sequence(sql_schema *s, const char *sname)
 {
@@ -249,13 +309,13 @@ find_sqlname(list *l, const char *name)
 }
 
 node *
-find_sql_type_node(sql_schema * s, sqlid id)
+find_sql_type_node(sql_schema *s, sqlid id)
 {
        return cs_find_id(&s->types, id);
 }
 
 sql_type *
-find_sql_type(sql_schema * s, const char *tname)
+find_sql_type(sql_schema *s, const char *tname)
 {
        return find_sqlname(s->types.set, tname);
 }
@@ -278,20 +338,36 @@ sql_trans_bind_type(sql_trans *tr, sql_s
        return t;
 }
 
+sql_type *
+sql_trans_find_type(sql_trans *tr, sqlid id)
+{
+       node *n, *m;
+       sql_type *t = NULL;
+
+       if (tr->schemas.set) {
+               for (n = tr->schemas.set->h; n && !t; n = n->next) {
+                       m = find_sql_type_node(n->data, id);
+                       if (m)
+                               t = m->data;
+               }
+       }
+       return t;
+}
+
 node *
-find_sql_func_node(sql_schema * s, sqlid id)
+find_sql_func_node(sql_schema *s, sqlid id)
 {
        return cs_find_id(&s->funcs, id);
 }
 
 sql_func *
-find_sql_func(sql_schema * s, const char *tname)
+find_sql_func(sql_schema *s, const char *tname)
 {
        return _cs_find_name(&s->funcs, tname);
 }
 
 list *
-find_all_sql_func(sql_schema * s, const char *name, sql_ftype type)
+find_all_sql_func(sql_schema *s, const char *name, sql_ftype type)
 {
        list *l = s->funcs.set, *res = NULL;
        node *n = NULL;
@@ -348,6 +424,28 @@ sql_trans_find_func(sql_trans *tr, sqlid
        return t;
 }
 
+node *
+find_sql_trigger_node(sql_schema *s, sqlid id)
+{
+       return list_find_base_id(s->triggers, id);
+}
+
+sql_trigger *
+sql_trans_find_trigger(sql_trans *tr, sqlid id)
+{
+       node *n, *m;
+       sql_trigger *t = NULL;
+
+       if (tr->schemas.set) {
+               for (n = tr->schemas.set->h; n && !t; n = n->next) {
+                       m = find_sql_trigger_node(n->data, id);
+                       if (m)
+                               t = m->data;
+               }
+       }
+       return t;
+}
+
 void*
 sql_values_list_element_validate_and_insert(void *v1, void *v2, int* res)
 {
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4426,11 +4426,10 @@ sql_trans_commit(sql_trans *tr)
 }
 
 static int
-sql_trans_drop_all_dependencies(sql_trans *tr, sql_schema *s, sqlid id, 
sql_dependency type)
+sql_trans_drop_all_dependencies(sql_trans *tr, sqlid id, sql_dependency type)
 {
        sqlid dep_id=0, t_id = -1;
        sht dep_type = 0;
-       sql_table *t = NULL;
        list *dep = sql_trans_get_dependencies(tr, id, type, NULL);
        node *n;
 
@@ -4451,37 +4450,39 @@ sql_trans_drop_all_dependencies(sql_tran
                                        (void) sql_trans_drop_schema(tr, 
dep_id, DROP_CASCADE);
                                        break;
                                case TABLE_DEPENDENCY:
-                                       (void) sql_trans_drop_table(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
-                               case COLUMN_DEPENDENCY:
+                               case VIEW_DEPENDENCY: {
+                                       sql_table *t = sql_trans_find_table(tr, 
dep_id);
+                                       (void) sql_trans_drop_table(tr, t->s, 
dep_id, DROP_CASCADE);
+                               } break;
+                               case COLUMN_DEPENDENCY: {
                                        if ((t_id = 
sql_trans_get_dependency_type(tr, dep_id, TABLE_DEPENDENCY)) > 0) {
-                                               t = find_sql_table_id(s, t_id);
+                                               sql_table *t = 
sql_trans_find_table(tr, dep_id);
                                                if (t)
                                                        (void) 
sql_trans_drop_column(tr, t, dep_id, DROP_CASCADE);
                                        }
-                                       break;
-                               case VIEW_DEPENDENCY:
-                                       (void) sql_trans_drop_table(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
-                               case TRIGGER_DEPENDENCY:
-                                       (void) sql_trans_drop_trigger(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
+                               } break;
+                               case TRIGGER_DEPENDENCY: {
+                                       sql_trigger *t = 
sql_trans_find_trigger(tr, dep_id);
+                                       (void) sql_trans_drop_trigger(tr, 
t->t->s, dep_id, DROP_CASCADE);
+                               } break;
                                case KEY_DEPENDENCY:
-                                       (void) sql_trans_drop_key(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
-                               case FKEY_DEPENDENCY:
-                                       (void) sql_trans_drop_key(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
-                               case INDEX_DEPENDENCY:
-                                       (void) sql_trans_drop_idx(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
+                               case FKEY_DEPENDENCY: {
+                                       sql_key *k = sql_trans_find_key(tr, 
dep_id);
+                                       (void) sql_trans_drop_key(tr, k->t->s, 
dep_id, DROP_CASCADE);
+                               } break;
+                               case INDEX_DEPENDENCY: {
+                                       sql_idx *i = sql_trans_find_idx(tr, 
dep_id);
+                                       (void) sql_trans_drop_idx(tr, i->t->s, 
dep_id, DROP_CASCADE);
+                               } break;
                                case PROC_DEPENDENCY:
-                               case FUNC_DEPENDENCY:
-                                       (void) sql_trans_drop_func(tr, s, 
dep_id, DROP_CASCADE);
-                                       break;
-                               case TYPE_DEPENDENCY:
-                                       sql_trans_drop_type(tr, s, dep_id, 
DROP_CASCADE);
-                                       break;
+                               case FUNC_DEPENDENCY: {
+                                       sql_func *f = sql_trans_find_func(tr, 
dep_id);
+                                       (void) sql_trans_drop_func(tr, f->s, 
dep_id, DROP_CASCADE);
+                               } break;
+                               case TYPE_DEPENDENCY: {
+                                       sql_type *t = sql_trans_find_type(tr, 
dep_id);
+                                       sql_trans_drop_type(tr, t->s, dep_id, 
DROP_CASCADE);
+                               } break;
                                case USER_DEPENDENCY:  /*TODO schema and users 
dependencies*/
                                        break;
                        }
@@ -4548,7 +4549,7 @@ sys_drop_idx(sql_trans *tr, sql_idx * i,
                tr->schema_updates ++;
 
        if (drop_action)
-               sql_trans_drop_all_dependencies(tr, i->t->s, i->base.id, 
INDEX_DEPENDENCY);
+               sql_trans_drop_all_dependencies(tr, i->base.id, 
INDEX_DEPENDENCY);
 }
 
 static void
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to