Changeset: ce8b3b55e2c2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ce8b3b55e2c2
Added Files:
        sql/test/Triggers/Tests/trigger_schema.sql
        sql/test/Triggers/Tests/trigger_schema.stable.err
        sql/test/Triggers/Tests/trigger_schema.stable.out
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/test/Triggers/Tests/All
Branch: Oct2020
Log Message:

When a trigger is instantied, set the trigger's schema as the session's schema


diffs (161 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -3570,9 +3570,9 @@ rel2bin_sample(backend *be, sql_rel *rel
 }
 
 static stmt *
-sql_parse(backend *be, const char *query, char mode)
+sql_parse(backend *be, sql_schema *s, const char *query, char mode)
 {
-       sql_rel *rel = rel_parse(be->mvc, be->mvc->session->schema, 
(char*)query, mode);
+       sql_rel *rel = rel_parse(be->mvc, s, (char*)query, mode);
        stmt *sq = NULL;
 
        if ((rel = sql_processrelation(be->mvc, rel, 1, 1)))
@@ -3844,7 +3844,7 @@ sql_insert_triggers(backend *be, sql_tab
                                stack_pop_frame(sql);
                                return 0;
                        }
-                       if (!sql_parse(be, trigger->statement, m_instantiate)) {
+                       if (!sql_parse(be, trigger->t->s, trigger->statement, 
m_instantiate)) {
                                stack_pop_frame(sql);
                                return 0;
                        }
@@ -4777,7 +4777,7 @@ sql_update_triggers(backend *be, sql_tab
                                return 0;
                        }
 
-                       if (!sql_parse(be, trigger->statement, m_instantiate)) {
+                       if (!sql_parse(be, trigger->t->s, trigger->statement, 
m_instantiate)) {
                                stack_pop_frame(sql);
                                return 0;
                        }
@@ -5058,7 +5058,7 @@ sql_delete_triggers(backend *be, sql_tab
                                return 0;
                        }
 
-                       if (!sql_parse(be, trigger->statement, m_instantiate)) {
+                       if (!sql_parse(be, trigger->t->s, trigger->statement, 
m_instantiate)) {
                                stack_pop_frame(sql);
                                return 0;
                        }
diff --git a/sql/test/Triggers/Tests/All b/sql/test/Triggers/Tests/All
--- a/sql/test/Triggers/Tests/All
+++ b/sql/test/Triggers/Tests/All
@@ -8,3 +8,4 @@ trigger_owner
 triggers_schema_operations
 trigger_insert
 KNOWNFAIL?trigger_projection
+trigger_schema
diff --git a/sql/test/Triggers/Tests/trigger_schema.sql 
b/sql/test/Triggers/Tests/trigger_schema.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/Triggers/Tests/trigger_schema.sql
@@ -0,0 +1,28 @@
+-- Verify the trigger's schema is the one set every time the trigger is fired
+START TRANSACTION;
+create schema foo;
+set schema foo;
+create table t1 (id serial, ref bigint);
+create table t2 (id serial, ref bigint);
+
+create function f(ref bigint) returns bigint begin return 10*ref; end;
+
+create schema bar;
+set schema bar;
+create function f(ref bigint) returns bigint begin return 100*ref; end;
+create table t1 (id serial, ref bigint);
+create table t2 (id serial, ref bigint);
+
+create trigger extra_insert
+    AFTER INSERT ON t1 referencing new row as new_row
+    FOR EACH statement insert into t2(ref) values (f(new_row.ref));
+
+insert into t1(ref) values (10);
+set schema foo;
+insert into bar.t1(ref) values (10);
+
+select * from bar.t1;
+select * from bar.t2;
+select * from foo.t1;
+select * from foo.t2;
+ROLLBACK;
diff --git a/sql/test/Triggers/Tests/trigger_schema.stable.err 
b/sql/test/Triggers/Tests/trigger_schema.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/Triggers/Tests/trigger_schema.stable.err
@@ -0,0 +1,12 @@
+stderr of test 'trigger_schema` in directory 'sql/test/Triggers` itself:
+
+
+# 14:26:57 >  
+# 14:26:57 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-75225" "--port=38787"
+# 14:26:57 >  
+
+
+# 14:26:57 >  
+# 14:26:57 >  "Done."
+# 14:26:57 >  
+
diff --git a/sql/test/Triggers/Tests/trigger_schema.stable.out 
b/sql/test/Triggers/Tests/trigger_schema.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/Triggers/Tests/trigger_schema.stable.out
@@ -0,0 +1,56 @@
+stdout of test 'trigger_schema` in directory 'sql/test/Triggers` itself:
+
+
+# 14:26:57 >  
+# 14:26:57 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-75225" "--port=38787"
+# 14:26:57 >  
+
+#START TRANSACTION;
+#create schema foo;
+#set schema foo;
+#create table t1 (id serial, ref bigint);
+#create table t2 (id serial, ref bigint);
+#create function f(ref bigint) returns bigint begin return 10*ref; end;
+#create schema bar;
+#set schema bar;
+#create function f(ref bigint) returns bigint begin return 100*ref; end;
+#create table t1 (id serial, ref bigint);
+#create table t2 (id serial, ref bigint);
+#create trigger extra_insert
+#    AFTER INSERT ON t1 referencing new row as new_row
+#    FOR EACH statement insert into t2(ref) values (f(new_row.ref));
+#insert into t1(ref) values (10);
+[ 1    ]
+#set schema foo;
+#insert into bar.t1(ref) values (10);
+[ 1    ]
+#select * from bar.t1;
+% bar.t1,      bar.t1 # table_name
+% id,  ref # name
+% int, bigint # type
+% 1,   2 # length
+[ 1,   10      ]
+[ 2,   10      ]
+#select * from bar.t2;
+% bar.t2,      bar.t2 # table_name
+% id,  ref # name
+% int, bigint # type
+% 1,   4 # length
+[ 1,   1000    ]
+[ 2,   1000    ]
+#select * from foo.t1;
+% foo.t1,      foo.t1 # table_name
+% id,  ref # name
+% int, bigint # type
+% 1,   1 # length
+#select * from foo.t2;
+% foo.t2,      foo.t2 # table_name
+% id,  ref # name
+% int, bigint # type
+% 1,   1 # length
+#ROLLBACK;
+
+# 14:26:57 >  
+# 14:26:57 >  "Done."
+# 14:26:57 >  
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to