Changeset: 76407e0ba055 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=76407e0ba055
Modified Files:
        dump.sql
        dump_output.sql
Branch: monetdbe-proxy
Log Message:

Implement schema guards for functions and views.


diffs (95 lines):

diff --git a/dump.sql b/dump.sql
--- a/dump.sql
+++ b/dump.sql
@@ -11,6 +11,13 @@ CREATE FUNCTION ALTER_TABLE(s STRING, t 
 
 CREATE FUNCTION comment_on(ob STRING, id STRING, r STRING) RETURNS STRING 
BEGIN RETURN ifthenelse(r IS NOT NULL, 'COMMENT ON ' || ob ||  ' ' || id || ' 
IS ' || SQ(r) || ';', ''); END;
 
+--We need pcre to implement a header guard which means adding the schema of an 
object explicitely to its identifier.
+CREATE FUNCTION replace_first(ori STRING, pat STRING, rep STRING, flg STRING) 
RETURNS STRING EXTERNAL NAME "pcre"."replace_first";
+CREATE FUNCTION schema_guard(sch STRING, nme STRING, stmt STRING) RETURNS 
STRING BEGIN
+RETURN
+       SELECT replace_first(stmt, '(\\s*"?' || sch ||  '"?\\s*\\.|)\\s*"?' || 
nme || '"?\\s*', ' ' || FQTN(sch, nme) || ' ', 'imsx');
+END;
+
 CREATE FUNCTION dump_type(type STRING, digits INT, scale INT) RETURNS STRING 
BEGIN
        RETURN
                CASE
@@ -360,7 +367,7 @@ RETURN
 END;
 
 CREATE FUNCTION dump_functions() RETURNS TABLE (o INT, stmt STRING) BEGIN
-       RETURN SELECT f.o, 'SET SCHEMA ' || DQ(f.sch) || ';' || f.def || 'SET 
SCHEMA "sys";' FROM describe_functions() f;
+       RETURN SELECT f.o, schema_guard(f.sch, f.fun, f.def)  FROM 
describe_functions() f;
 END;
 
 CREATE FUNCTION describe_tables() RETURNS TABLE(o INT, sch STRING, tab STRING, 
typ STRING,  col STRING, opt STRING) BEGIN
@@ -377,7 +384,7 @@ RETURN
                        WHEN ts.table_type_name = 'MERGE TABLE' THEN
                                dump_merge_table_partition_expressions(t.id)
                        WHEN ts.table_type_name = 'VIEW' THEN
-                               t.query
+                               schema_guard(s.name, t.name, t.query)
                        ELSE
                                ''
                END
@@ -499,10 +506,8 @@ BEGIN
         SELECT comment_on('COLUMN', DQ(s.name) || '.' || DQ(t.name) || '.' || 
DQ(c.name), rem.remark)
                FROM sys.columns c JOIN sys.comments rem ON c.id = rem.id, 
sys.tables t, sys.schemas s WHERE c.table_id = t.id AND t.schema_id = s.id AND 
NOT t.system;
 
-       --TODO VIEW
-       --TODO SCHEMA GUARD
        --TODO Triggers
-       --TODO COMMENTS ON TABLE
+       --TODO COMMENTS ON TABLE and add schema to commented objects identifier
        --TODO TABLE level grants
        --TODO COLUMN level grants
        --TODO User Defined Types? sys.types
diff --git a/dump_output.sql b/dump_output.sql
--- a/dump_output.sql
+++ b/dump_output.sql
@@ -7,15 +7,15 @@ CREATE SCHEMA "sbar" AUTHORIZATION monet
 CREATE SCHEMA "sfoo" AUTHORIZATION monetdb;
 COMMENT ON SCHEMA "sbar" IS  'This is a comment on sbar' ;
 ALTER USER "voc" SET SCHEMA "sfoo";
-CREATE SEQUENCE "sys"."seq1"AS BIGINT  START WITH 5 INCREMENT BY 3 MINVALUE 4 
MAXVALUE 10 CACHE 2 CYCLE;
-CREATE SEQUENCE "sys"."seq2"AS BIGINT  START WITH 4 INCREMENT BY 3 MINVALUE 4 
MAXVALUE 10 CACHE 2 CYCLE;
-CREATE SEQUENCE "sys"."seq3"AS BIGINT  START WITH 4 MINVALUE 4 MAXVALUE 10 
CACHE 2 CYCLE;
-CREATE SEQUENCE "sys"."seq4"AS BIGINT  START WITH 1 MAXVALUE 10 CACHE 2 CYCLE;
-CREATE SEQUENCE "sys"."seq5"AS BIGINT  START WITH 1 MAXVALUE 10 CACHE 2;
-CREATE SEQUENCE "sys"."seq6"AS BIGINT  START WITH 1 CACHE 2;
-CREATE SEQUENCE "sys"."seq7"AS BIGINT  START WITH 1;
-CREATE SEQUENCE "sys"."seq8"AS BIGINT  START WITH -10 INCREMENT BY -1 MINVALUE 
-10 MAXVALUE -1;
-CREATE SEQUENCE "sys"."seq9"AS BIGINT  START WITH 10 MINVALUE 10 MAXVALUE 10;
+CREATE SEQUENCE "sys"."seq1" AS BIGINT  START WITH 5 INCREMENT BY 3 MINVALUE 4 
MAXVALUE 10 CACHE 2 CYCLE;
+CREATE SEQUENCE "sys"."seq2" AS BIGINT  START WITH 4 INCREMENT BY 3 MINVALUE 4 
MAXVALUE 10 CACHE 2 CYCLE;
+CREATE SEQUENCE "sys"."seq3" AS BIGINT  START WITH 4 MINVALUE 4 MAXVALUE 10 
CACHE 2 CYCLE;
+CREATE SEQUENCE "sys"."seq4" AS BIGINT  START WITH 1 MAXVALUE 10 CACHE 2 CYCLE;
+CREATE SEQUENCE "sys"."seq5" AS BIGINT  START WITH 1 MAXVALUE 10 CACHE 2;
+CREATE SEQUENCE "sys"."seq6" AS BIGINT  START WITH 1 CACHE 2;
+CREATE SEQUENCE "sys"."seq7" AS BIGINT  START WITH 1;
+CREATE SEQUENCE "sys"."seq8" AS BIGINT  START WITH -10 INCREMENT BY -1 
MINVALUE -10 MAXVALUE -1;
+CREATE SEQUENCE "sys"."seq9" AS BIGINT  START WITH 10 MINVALUE 10 MAXVALUE 10;
 COMMENT ON SEQUENCE "sys"."seq1" IS  'This is a comment on a sequence.' ;
 CREATE TABLE "sys"."test" ("s" CHARACTER LARGE OBJECT);
 CREATE TABLE "sys"."bla" ("s" CHARACTER LARGE OBJECT(10));
@@ -29,8 +29,8 @@ CREATE TABLE "sfoo"."tfoo" ("i" INTEGER)
 CREATE TABLE "sfoo"."test" ("s" CHARACTER LARGE OBJECT);
 CREATE TABLE "sys"."pfoo1" ("i" INTEGER);
 CREATE TABLE "sys"."pfoo2" ("i" INTEGER);
-SET SCHEMA "sfoo";create function
-func1(x int, y int) returns int begin return x + y; end;SET SCHEMA "sys";
+create function "sfoo"."func1" (x int, y int) returns int begin return x + y; 
end;
+create view "sfoo"."baz" (i) as select func1(t.x, t.y) from (values (10, 1), 
(20, 2)) as t(x,y);
 CREATE TABLE "sys"."lower_scorers" ("name" CHARACTER LARGE OBJECT, 
"first_score" INTEGER, "second_score" INTEGER);
 CREATE TABLE "sys"."higher_scorers" ("name" CHARACTER LARGE OBJECT, 
"first_score" INTEGER, "second_score" INTEGER);
 CREATE TABLE "sys"."unknown_scorers" ("name" CHARACTER LARGE OBJECT, 
"first_score" INTEGER, "second_score" INTEGER);
@@ -54,7 +54,7 @@ ALTER TABLE "sbar"."bar" ADD CONSTRAINT 
 CREATE INDEX "ind1" ON "sys"."ungolo"(x,y);
 CREATE IMPRINTS INDEX "ind2" ON "sys"."ungolo"(y,z);
 CREATE ORDERED INDEX "ind3" ON "sys"."ungolo"(x,z);
-ALTER TABLE "sfoo"."foo" ADD CONSTRAINT "fk_foo_to_bar" FOREIGN KEY("fi","fs") 
REFERENCES "sbar"."bar"("bi","bs") ON DELETE CASCADE ON UPDATE SET NULL;
+ALTER TABLE "sfoo"."foo" ADD CONSTRAINT "fk_foo_to_bar" FOREIGN KEY("fi","fs") 
REFERENCES "sbar"."bar"("bi","bs") ON DELETE SET NULL ON UPDATE CASCADE;
 ALTER TABLE "sys"."scorers"  ADD TABLE "sys"."unknown_scorers" AS PARTITION 
FOR NULL VALUES;
 ALTER TABLE "sys"."scorers"  ADD TABLE "sys"."lower_scorers" AS PARTITION IN 
(0,1,2,3,4);
 ALTER TABLE "sys"."scorers"  ADD TABLE "sys"."higher_scorers" AS PARTITION IN 
(5,6,7,8,9);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to