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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to