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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list