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