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

Reply via email to