Changeset: b72a963da690 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b72a963da690 Modified Files: clients/Tests/MAL-signatures.stable.out clients/Tests/MAL-signatures.stable.out.int128 clients/mapiclient/dump.c sql/backends/monet5/sql.mal sql/backends/monet5/sql_scenario.c sql/backends/monet5/sql_scenario.h sql/common/sql_types.c sql/scripts/99_system.sql sql/storage/sql_storage.h sql/storage/store.c sql/test/Dependencies/Tests/Dependencies.stable.out sql/test/Dependencies/Tests/Dependencies.stable.out.int128 sql/test/leaks/Tests/check1.stable.out sql/test/leaks/Tests/check1.stable.out.int128 Branch: Jul2017 Log Message:
fixed bug 6437, ie added trigger to update the in memory c-structures, which are used to (disallow) dropping of these system schemas. diffs (truncated from 417 to 300 lines): diff --git a/clients/Tests/MAL-signatures.stable.out b/clients/Tests/MAL-signatures.stable.out --- a/clients/Tests/MAL-signatures.stable.out +++ b/clients/Tests/MAL-signatures.stable.out @@ -8425,6 +8425,8 @@ Ready. [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)" ] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)" ] +[ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table" ] +[ "sql", "update_tables", "pattern sql.update_tables():void ", "SYSupdate_tables;", "Procedure triggered on update of the sys._tables table" ] [ "sql", "vacuum", "pattern sql.vacuum(sch:str, tbl:str):void ", "SQLvacuum;", "Choose an approach to consolidate the deletions" ] [ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1]):any_1 ", "zero_or_one;", "if col contains exactly one value return this. Incase of more raise an exception else return nil" ] [ "sqlblob", "#fromstr", "command sqlblob.#fromstr():void ", "SQLBLOBfromstr;", "" ] diff --git a/clients/Tests/MAL-signatures.stable.out.int128 b/clients/Tests/MAL-signatures.stable.out.int128 --- a/clients/Tests/MAL-signatures.stable.out.int128 +++ b/clients/Tests/MAL-signatures.stable.out.int128 @@ -10789,6 +10789,8 @@ Ready. [ "sql", "transaction_release", "pattern sql.transaction_release(chain:int, name:str):void ", "SQLtransaction_release;", "A transaction statement (type can be commit,release,rollback or start)" ] [ "sql", "transaction_rollback", "pattern sql.transaction_rollback(chain:int, name:str):void ", "SQLtransaction_rollback;", "A transaction statement (type can be commit,release,rollback or start)" ] [ "sql", "update", "pattern sql.update(mvc:int, sname:str, tname:str, cname:str, rids:any, upd:any):int ", "mvc_update_wrap;", "Update the values of the column tname.cname. Returns sequence number for order dependence)" ] +[ "sql", "update_schemas", "pattern sql.update_schemas():void ", "SYSupdate_schemas;", "Procedure triggered on update of the sys.schemas table" ] +[ "sql", "update_tables", "pattern sql.update_tables():void ", "SYSupdate_tables;", "Procedure triggered on update of the sys._tables table" ] [ "sql", "vacuum", "pattern sql.vacuum(sch:str, tbl:str):void ", "SQLvacuum;", "Choose an approach to consolidate the deletions" ] [ "sql", "zero_or_one", "command sql.zero_or_one(col:bat[:any_1]):any_1 ", "zero_or_one;", "if col contains exactly one value return this. Incase of more raise an exception else return nil" ] [ "sqlblob", "#fromstr", "command sqlblob.#fromstr():void ", "SQLBLOBfromstr;", "" ] diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -1477,7 +1477,7 @@ dump_database(Mapi mid, stream *toConsol "sys.schemas s, " "sys._tables t " "WHERE s.id = t.schema_id AND " - "t.id = tr.table_id" + "t.id = tr.table_id AND t.system = FALSE" ") " "SELECT sname, query FROM vft ORDER BY id"; char *sname = NULL; diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -1078,6 +1078,14 @@ command batcalc.strings(v:bat[:str]) :ba address BATSTRstrings comment "Return the strings"; +pattern update_tables():void +address SYSupdate_tables +comment "Procedure triggered on update of the sys._tables table"; + +pattern update_schemas():void +address SYSupdate_schemas +comment "Procedure triggered on update of the sys.schemas table"; + include sql_decimal; include sql_rank; #include sql_cast; diff --git a/sql/backends/monet5/sql_scenario.c b/sql/backends/monet5/sql_scenario.c --- a/sql/backends/monet5/sql_scenario.c +++ b/sql/backends/monet5/sql_scenario.c @@ -1262,3 +1262,29 @@ SQLCacheRemove(Client c, str nme) deleteSymbol(c->nspace, s); return MAL_SUCCEED; } + +str +SYSupdate_tables(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + mvc *m = ((backend *) cntxt->sqlcontext)->mvc; + + (void) mb; + (void) stk; + (void) pci; + + sql_trans_update_tables(m->session->tr, mvc_bind_schema(m, "sys")); + return MAL_SUCCEED; +} + +str +SYSupdate_schemas(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + mvc *m = ((backend *) cntxt->sqlcontext)->mvc; + + (void) mb; + (void) stk; + (void) pci; + + sql_trans_update_schemas(m->session->tr); + return MAL_SUCCEED; +} diff --git a/sql/backends/monet5/sql_scenario.h b/sql/backends/monet5/sql_scenario.h --- a/sql/backends/monet5/sql_scenario.h +++ b/sql/backends/monet5/sql_scenario.h @@ -45,5 +45,8 @@ sql5_export str SQLinclude(Client cntxt, sql5_export str SQLCacheRemove(Client c, str nme); sql5_export str SQLescapeString(str s); +sql5_export str SYSupdate_tables(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); +sql5_export str SYSupdate_schemas(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); + sql5_export MT_Lock sql_contextLock; #endif /* _SQL_SCENARIO_H_ */ diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -1194,7 +1194,8 @@ sql_create_func_(sql_allocator *sa, cons { sql_func *t = SA_ZNEW(sa, sql_func); - assert(res && ops); + if (!ops) + ops = sa_list(sa); base_init(sa, &t->base, store_next_oid(), TR_OLD, name); t->imp = sa_strdup(sa, imp); t->mod = sa_strdup(sa, mod); @@ -1830,6 +1831,10 @@ sqltypeinit( sql_allocator *sa) create_arg(sa, NULL, sql_create_subtype(sa, STR, 0, 0), ARG_IN)), create_arg(sa, NULL, sql_create_subtype(sa, STR, 0, 0), ARG_IN)), sres, FALSE, F_UNION, SCALE_FIX); f->varres = 1; + + /* sys_update_schemas, sys_update_tables */ + f = sql_create_func_(sa, "sys_update_schemas", "sql", "update_schemas", NULL, NULL, FALSE, F_PROC, SCALE_NONE); + f = sql_create_func_(sa, "sys_update_tables", "sql", "update_tables", NULL, NULL, FALSE, F_PROC, SCALE_NONE); } void diff --git a/sql/scripts/99_system.sql b/sql/scripts/99_system.sql --- a/sql/scripts/99_system.sql +++ b/sql/scripts/99_system.sql @@ -9,6 +9,9 @@ create table systemfunctions (function_i as (select id from functions) with data; grant select on systemfunctions to public; +create trigger system_update_schemas after update on sys.schemas for each statement call sys_update_schemas(); +create trigger system_update_tables after update on sys._tables for each statement call sys_update_tables(); + -- only system tables until now update _tables set system = true; diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -349,6 +349,9 @@ extern sql_func *sql_trans_create_func(s extern void sql_trans_drop_func(sql_trans *tr, sql_schema *s, int id, int drop_action); extern void sql_trans_drop_all_func(sql_trans *tr, sql_schema *s, list *list_func, int drop_action); +extern void sql_trans_update_tables(sql_trans *tr, sql_schema *s); +extern void sql_trans_update_schemas(sql_trans *tr); + extern void reset_functions(sql_trans *tr); extern sql_schema *sql_trans_create_schema(sql_trans *tr, const char *name, int auth_id, int owner); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -574,6 +574,13 @@ load_part(sql_trans *tr, sql_table *t, o cs_add(&t->members, pt, TR_OLD); } +void +sql_trans_update_tables(sql_trans* tr, sql_schema *s) +{ + (void)tr; + (void)s; +} + static sql_table * load_table(sql_trans *tr, sql_schema *s, sqlid tid, subrids *nrs) { @@ -873,6 +880,34 @@ set_members(changeset *ts) } } +static void +sql_trans_update_schema(sql_trans *tr, oid rid) +{ + void *v; + sql_schema *s = NULL, *syss = find_sql_schema(tr, "sys"); + sql_table *ss = find_sql_table(syss, "schemas"); + sqlid sid; + + v = table_funcs.column_find_value(tr, find_sql_column(ss, "id"), rid); + sid = *(sqlid *)v; _DELETE(v); + s = find_sql_schema_id(tr, sid); + + if (s==NULL) + return ; + + if (bs_debug) + fprintf(stderr, "#update schema %s %d\n", s->base.name, s->base.id); + + v = table_funcs.column_find_value(tr, find_sql_column(ss, "name"), rid); + base_init(tr->sa, &s->base, sid, TR_OLD, v); _DELETE(v); + v = table_funcs.column_find_value(tr, find_sql_column(ss, "authorization"), rid); + s->auth_id = *(sqlid *)v; _DELETE(v); + v = table_funcs.column_find_value(tr, find_sql_column(ss, "system"), rid); + s->system = *(bit *)v; _DELETE(v); + v = table_funcs.column_find_value(tr, find_sql_column(ss, "owner"), rid); + s->owner = *(sqlid *)v; _DELETE(v); +} + static sql_schema * load_schema(sql_trans *tr, sqlid id, oid rid) { @@ -1008,6 +1043,24 @@ create_trans(sql_allocator *sa, backend_ return t; } +void +sql_trans_update_schemas(sql_trans* tr) +{ + sql_schema *syss = find_sql_schema(tr, "sys"); + sql_table *sysschema = find_sql_table(syss, "schemas"); + sql_column *sysschema_ids = find_sql_column(sysschema, "id"); + rids *schemas = table_funcs.rids_select(tr, sysschema_ids, NULL, NULL); + oid rid; + + if (bs_debug) + fprintf(stderr, "#update schemas\n"); + + for(rid = table_funcs.rids_next(schemas); rid != oid_nil; rid = table_funcs.rids_next(schemas)) { + sql_trans_update_schema(tr, rid); + } + table_funcs.rids_destroy(schemas); +} + static void load_trans(sql_trans* tr, sqlid id) { diff --git a/sql/test/Dependencies/Tests/Dependencies.stable.out b/sql/test/Dependencies/Tests/Dependencies.stable.out --- a/sql/test/Dependencies/Tests/Dependencies.stable.out +++ b/sql/test/Dependencies/Tests/Dependencies.stable.out @@ -110,7 +110,9 @@ Dependencies between database objects % .L115, .L115, .L115 # table_name % name, trigname, L44 # name % varchar, varchar, char # type -% 2, 14, 11 # length +% 7, 21, 11 # length +[ "schemas", "system_update_schemas", "DEP_TRIGGER" ] +[ "_tables", "system_update_tables", "DEP_TRIGGER" ] [ "t1", "trigger_test", "DEP_TRIGGER" ] [ "t1", "trigger_test_4", "DEP_TRIGGER" ] [ "t2", "trigger_test", "DEP_TRIGGER" ] @@ -606,7 +608,9 @@ Cleanup % .L111, .L111, .L111 # table_name % name, name, L42 # name % varchar, varchar, char # type -% 0, 0, 11 # length +% 7, 21, 11 # length +[ "schemas", "system_update_schemas", "DEP_TRIGGER" ] +[ "_tables", "system_update_tables", "DEP_TRIGGER" ] #SELECT t.name, fk.name, 'DEP_FKEY' from tables as t, keys as k, keys as fk where fk.rkey = k.id and k.table_id = t.id; % .t, .fk, .L42 # table_name % name, name, L42 # name diff --git a/sql/test/Dependencies/Tests/Dependencies.stable.out.int128 b/sql/test/Dependencies/Tests/Dependencies.stable.out.int128 --- a/sql/test/Dependencies/Tests/Dependencies.stable.out.int128 +++ b/sql/test/Dependencies/Tests/Dependencies.stable.out.int128 @@ -110,7 +110,9 @@ Dependencies between database objects % .L115, .L115, .L115 # table_name % name, trigname, L44 # name % varchar, varchar, char # type -% 2, 14, 11 # length +% 7, 21, 11 # length +[ "schemas", "system_update_schemas", "DEP_TRIGGER" ] +[ "_tables", "system_update_tables", "DEP_TRIGGER" ] [ "t1", "trigger_test", "DEP_TRIGGER" ] [ "t1", "trigger_test_4", "DEP_TRIGGER" ] [ "t2", "trigger_test", "DEP_TRIGGER" ] @@ -606,7 +608,9 @@ Cleanup % .L111, .L111, .L111 # table_name % name, name, L42 # name % varchar, varchar, char # type -% 0, 0, 11 # length +% 7, 21, 11 # length +[ "schemas", "system_update_schemas", "DEP_TRIGGER" ] +[ "_tables", "system_update_tables", "DEP_TRIGGER" ] #SELECT t.name, fk.name, 'DEP_FKEY' from tables as t, keys as k, keys as fk where fk.rkey = k.id and k.table_id = t.id; % .t, .fk, .L42 # table_name % name, name, L42 # name diff --git a/sql/test/leaks/Tests/check1.stable.out b/sql/test/leaks/Tests/check1.stable.out --- a/sql/test/leaks/Tests/check1.stable.out +++ b/sql/test/leaks/Tests/check1.stable.out @@ -76,9 +76,9 @@ Ready. [ "int", 0 ] [ "int", 0 ] [ "int", 0 ] -[ "int", 0 ] -[ "int", 0 ] [ "int", 1 ] +[ "int", 2 ] +[ "int", 2 ] [ "int", 3 ] [ "int", 3 ] [ "int", 5 ] @@ -211,9 +211,9 @@ Ready. [ "sht", 0 ] [ "sht", 0 ] [ "sht", 0 ] -[ "sht", 0 ] -[ "sht", 0 ] -[ "sht", 0 ] +[ "sht", 2 ] +[ "sht", 2 ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list