Changeset: ab06884ff50e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ab06884ff50e
Modified Files:
sql/backends/monet5/sql_cat.c
sql/server/rel_psm.c
sql/storage/store.c
sql/test/BugTracker-2024/Tests/7542-column-name-resolution.test
sql/test/BugTracker-2024/Tests/7547-drop-login-trigger-crash.test
Branch: Aug2024
Log Message:
fixed bug #7547. Added missing loading of global triggers. Handle global
triggers
in storage layer better. Fixed drop code for global triggers.
diffs (208 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
@@ -634,12 +634,14 @@ drop_trigger(mvc *sql, char *sname, char
sql_trigger *tri = NULL;
sql_schema *s = NULL;
- if (!(s = mvc_bind_schema(sql, sname))) {
+ if (!strNil(sname) && !(s = mvc_bind_schema(sql, sname))) {
if (if_exists)
return MAL_SUCCEED;
throw(SQL,"sql.drop_trigger",SQLSTATE(3F000) "DROP TRIGGER: no
such schema '%s'", sname);
}
- if (!mvc_schema_privs(sql, s))
+ if (!s)
+ s = mvc_bind_schema(sql, "sys");
+ if (s && !mvc_schema_privs(sql, s))
throw(SQL,"sql.drop_trigger",SQLSTATE(42000) "DROP TRIGGER:
access denied for %s to schema '%s'", get_string_global_var(sql,
"current_user"), s->base.name);
if ((tri = mvc_bind_trigger(sql, s, tname)) == NULL) {
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -1489,9 +1489,9 @@ drop_trigger(mvc *sql, dlist *qname, int
}
return NULL;
}
- if (!mvc_schema_privs(sql, tr->t->s))
+ if (tr->t && !mvc_schema_privs(sql, tr->t->s))
return sql_error(sql, 02, SQLSTATE(3F000) "DROP TRIGGER: access
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"),
tr->t->s->base.name);
- return rel_drop_trigger(sql, tr->t->s->base.name, tname, if_exists);
+ return rel_drop_trigger(sql, tr->t?tr->t->s->base.name:NULL, tname,
if_exists);
}
static sql_rel*
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -540,13 +540,16 @@ load_trigger(sql_trans *tr, sql_table *t
nt->statement =_STRDUP(v);
nt->t = t;
- nt->columns = list_create((fdestroy) &kc_destroy);
-
- for ( ; rt_triggercols->cur_row < rt_triggercols->nr_rows;
rt_triggercols->cur_row++) {
- sqlid nid =
*(sqlid*)store->table_api.table_fetch_value(rt_triggercols,
find_sql_column(objects, "id"));
- if (nid != nt->base.id)
- break;
- load_triggercolumn(tr, nt, rt_triggercols);
+ if (t)
+ nt->columns = list_create((fdestroy) &kc_destroy);
+
+ if (rt_triggercols) {
+ for ( ; rt_triggercols->cur_row < rt_triggercols->nr_rows;
rt_triggercols->cur_row++) {
+ sqlid nid =
*(sqlid*)store->table_api.table_fetch_value(rt_triggercols,
find_sql_column(objects, "id"));
+ if (nid != nt->base.id)
+ break;
+ load_triggercolumn(tr, nt, rt_triggercols);
+ }
}
return nt;
}
@@ -1407,7 +1410,7 @@ load_trans(sql_trans* tr)
find_sql_column(syskeys, "table_id"),
find_sql_column(sysobjects, "id"),
find_sql_column(sysobjects, "nr"), NULL);
- res_table *rt_triggers = store->table_api.table_orderby(tr, systriggers,
+ res_table *rt_tabletriggers = store->table_api.table_orderby(tr,
systriggers,
find_sql_column(systriggers, "table_id"),
find_sql_column(systables, "id"),
NULL, NULL,
@@ -1423,9 +1426,13 @@ load_trans(sql_trans* tr)
find_sql_column(systriggers, "table_id"),
find_sql_column(sysobjects, "id"),
find_sql_column(sysobjects, "nr"), NULL);
+ res_table *rt_triggers = store->table_api.table_orderby(tr, systriggers,
+ NULL, NULL, NULL, NULL,
+ find_sql_column(systriggers, "id"),
+ find_sql_column(systriggers, "table_id"), NULL);
for ( ; rt_schemas->cur_row < rt_schemas->nr_rows;
rt_schemas->cur_row++) {
sql_schema *ns = load_schema(tr, rt_schemas, rt_tables,
rt_parts,
- rt_cols, rt_idx, rt_idxcols, rt_keys,
rt_keycols, rt_triggers, rt_triggercols);
+ rt_cols, rt_idx, rt_idxcols, rt_keys,
rt_keycols, rt_tabletriggers, rt_triggercols);
if (ns == NULL) {
ok = false;
goto finish;
@@ -1439,6 +1446,19 @@ load_trans(sql_trans* tr)
tr->tmp = ns;
}
}
+ if (rt_triggers) {
+ for ( ; rt_triggers->cur_row < rt_triggers->nr_rows;
rt_triggers->cur_row++) {
+ sqlid ntid =
*(sqlid*)store->table_api.table_fetch_value(rt_triggers,
find_sql_column(systriggers, "table_id"));
+ if (ntid != int_nil)
+ continue;
+ sql_trigger *k = load_trigger(tr, NULL, rt_triggers,
NULL);
+
+ if (!k || os_add(syss->triggers, tr, k->base.name,
&k->base)) {
+ ok = false;
+ goto finish;
+ }
+ }
+ }
finish:
store->table_api.table_result_destroy(rt_schemas);
@@ -1449,8 +1469,9 @@ finish:
store->table_api.table_result_destroy(rt_idxcols);
store->table_api.table_result_destroy(rt_keys);
store->table_api.table_result_destroy(rt_keycols);
+ store->table_api.table_result_destroy(rt_tabletriggers);
+ store->table_api.table_result_destroy(rt_triggercols);
store->table_api.table_result_destroy(rt_triggers);
- store->table_api.table_result_destroy(rt_triggercols);
return ok;
}
@@ -4554,7 +4575,7 @@ sys_drop_trigger(sql_trans *tr, sql_trig
{
sqlstore *store = tr->store;
node *n;
- sql_schema *syss = find_sql_schema(tr, isGlobal(i->t)?"sys":"tmp");
+ sql_schema *syss = find_sql_schema(tr, (!i->t ||
isGlobal(i->t))?"sys":"tmp");
sql_table *systrigger = find_sql_table(tr, syss, "triggers");
oid rid = store->table_api.column_find_row(tr,
find_sql_column(systrigger, "id"), &i->base.id, NULL);
int res = LOG_OK;
@@ -4564,14 +4585,16 @@ sys_drop_trigger(sql_trans *tr, sql_trig
if ((res = store->table_api.table_delete(tr, systrigger, rid)))
return res;
- for (n = i->columns->h; n; n = n->next) {
- sql_kc *tc = n->data;
-
- if ((res = sys_drop_tc(tr, i, tc)))
- return res;
+ if (i->t) {
+ for (n = i->columns->h; n; n = n->next) {
+ sql_kc *tc = n->data;
+
+ if ((res = sys_drop_tc(tr, i, tc)))
+ return res;
+ }
}
/* remove trigger from schema */
- if ((res = os_del(i->t->s->triggers, tr, i->base.name,
dup_base(&i->base))))
+ if ((res = os_del(i->t?i->t->s->triggers:syss->triggers, tr,
i->base.name, dup_base(&i->base))))
return res;
if (!isNew(i) && (res = sql_trans_add_dependency_change(tr, i->base.id,
ddl)))
return res;
@@ -7050,13 +7073,15 @@ sql_trans_drop_trigger(sql_trans *tr, sq
list_append(tr->dropped, local_id);
}
- if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql
functions depending on the table */
- return res;
+ if (i->t) {
+ if ((res = store_reset_sql_functions(tr, i->t->base.id))) /*
reset sql functions depending on the table */
+ return res;
+ node *n = ol_find_name(i->t->triggers, i->base.name);
+ if (n)
+ ol_del(i->t->triggers, store, n);
+ }
if ((res = sys_drop_trigger(tr, i)))
return res;
- node *n = ol_find_name(i->t->triggers, i->base.name);
- if (n)
- ol_del(i->t->triggers, store, n);
if (drop_action == DROP_CASCADE_START && tr->dropped) {
list_destroy(tr->dropped);
diff --git a/sql/test/BugTracker-2024/Tests/7542-column-name-resolution.test
b/sql/test/BugTracker-2024/Tests/7542-column-name-resolution.test
--- a/sql/test/BugTracker-2024/Tests/7542-column-name-resolution.test
+++ b/sql/test/BugTracker-2024/Tests/7542-column-name-resolution.test
@@ -1,7 +1,6 @@
-- https://github.com/MonetDB/MonetDB/issues/7542
-skipif knownfail
query I nosort
WITH "E" AS ( SELECT 2 AS "F" )
SELECT 3 AS "Z" FROM (
diff --git a/sql/test/BugTracker-2024/Tests/7547-drop-login-trigger-crash.test
b/sql/test/BugTracker-2024/Tests/7547-drop-login-trigger-crash.test
--- a/sql/test/BugTracker-2024/Tests/7547-drop-login-trigger-crash.test
+++ b/sql/test/BugTracker-2024/Tests/7547-drop-login-trigger-crash.test
@@ -22,23 +22,15 @@ system_update_schemas
lt1
lt2
-skipif knownfail
statement ok
drop trigger lt2
-skipif knownfail
statement ok
drop trigger "lt1"
-- after drop we should be able to recreate trigger again
-skipif knownfail
statement ok
CREATE OR REPLACE TRIGGER lt1 BEFORE LOGIN SET SCHEMA tmp
-skipif knownfail
statement ok
drop trigger "lt1"
-
--- Program terminated with signal SIGSEGV, Segmentation fault.
--- #0 0x00007faa024fa2ca in drop_trigger () from lib64/libmonetdbsql.so.14
-
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]