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