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

Move remaining dump logic to dedicated 76_dump.sql.


diffs (247 lines):

diff --git a/dump.sql b/dump.sql
--- a/dump.sql
+++ b/dump.sql
@@ -1,104 +1,5 @@
 START TRANSACTION;
 
---The dump statement should normally have an auto-incremented column 
representing the creation order.
---But in cases of db objects that can be interdependent, i.e. sys.functions 
and table-likes, we need access to the underlying sequence of the 
AUTO_INCREMENT property.
---Because we need to explicitly overwrite the creation order column "o" in 
those cases. After inserting the dump statements for sys.functions and 
table-likes,
---we can restart the auto-increment sequence with a sensible value for 
following dump statements.
-
-CREATE SEQUENCE tmp._auto_increment;
-CREATE TEMPORARY TABLE dump_statements(o INT DEFAULT NEXT VALUE FOR 
tmp._auto_increment, s STRING, PRIMARY KEY (o));
-
---Because ALTER SEQUENCE statements are not allowed in procedures,
---we have to do a really nasty hack to restart the _auto_increment sequence.
-
-CREATE FUNCTION tmp.restart_sequence(sch STRING, seq STRING, val BIGINT) 
RETURNS BIGINT EXTERNAL NAME sql."restart";
-
-
-CREATE PROCEDURE tmp.dump_database(describe BOOLEAN)
-BEGIN
-
-    set schema sys;
-
-       INSERT INTO dump_statements(s) VALUES ('START TRANSACTION;');
-       INSERT INTO dump_statements(s) VALUES ('SET SCHEMA "sys";');
-
-       INSERT INTO dump_statements(s) --dump_create_roles
-               SELECT 'CREATE ROLE ' || sys.dq(name) || ';' FROM sys.auths
-        WHERE name NOT IN (SELECT name FROM sys.db_user_info)
-        AND grantor <> 0;
-
-       INSERT INTO dump_statements(s) --dump_create_users
-               SELECT
-        'CREATE USER ' ||  sys.dq(ui.name) ||  ' WITH ENCRYPTED PASSWORD ' ||
-            sys.sq(sys.password_hash(ui.name)) ||
-        ' NAME ' || sys.sq(ui.fullname) ||  ' SCHEMA sys;'
-        FROM sys.db_user_info ui, sys.schemas s
-        WHERE ui.default_schema = s.id
-            AND ui.name <> 'monetdb'
-            AND ui.name <> '.snapshot';
-
-       INSERT INTO dump_statements(s) --dump_create_schemas
-        SELECT
-            'CREATE SCHEMA ' ||  sys.dq(s.name) || ifthenelse(a.name <> 
'sysadmin', ' AUTHORIZATION ' || a.name, ' ') || ';'
-        FROM sys.schemas s, sys.auths a
-        WHERE s.authorization = a.id AND s.system = FALSE;
-
-       INSERT INTO dump_statements(s) SELECT * FROM 
sys.dump_user_defined_types();
-
-    INSERT INTO dump_statements(s) --dump_add_schemas_to_users
-           SELECT
-            'ALTER USER ' || sys.dq(ui.name) || ' SET SCHEMA ' || 
sys.dq(s.name) || ';'
-        FROM sys.db_user_info ui, sys.schemas s
-        WHERE ui.default_schema = s.id
-            AND ui.name <> 'monetdb'
-            AND ui.name <> '.snapshot'
-            AND s.name <> 'sys';
-
-    INSERT INTO dump_statements(s) --dump_grant_user_priviledges
-        SELECT
-            'GRANT ' || sys.dq(a2.name) || ' ' || ifthenelse(a1.name = 
'public', 'PUBLIC', sys.dq(a1.name)) || ';'
-               FROM sys.auths a1, sys.auths a2, sys.user_role ur
-               WHERE a1.id = ur.login_id AND a2.id = ur.role_id;
-
-       INSERT INTO dump_statements(s) SELECT * FROM sys.dump_sequences();
-
-       --START OF COMPLICATED DEPENDENCY STUFF:
-       --functions and table-likes can be interdependent. They should be 
inserted in the order of their catalogue id.
-       DECLARE offs INT;
-       SET offs = (SELECT max(o) FROM dump_statements) - (SELECT min(ids.id) 
FROM (select id from sys.tables union select id from sys.functions) ids(id));
-
-       INSERT INTO dump_statements SELECT f.o + offs, f.stmt FROM 
sys.dump_functions() f;
-       INSERT INTO dump_statements SELECT t.o + offs, t.stmt FROM 
sys.dump_tables() t;
-
-       SET offs = (SELECT max(o) + 1 FROM dump_statements);
-       DECLARE dummy_result BIGINT; --HACK: otherwise I cannot call 
restart_sequence.
-       SET dummy_result = tmp.restart_sequence('tmp', '_auto_increment', offs);
-       --END OF COMPLICATED DEPENDENCY STUFF.
-
-       INSERT INTO dump_statements(s) SELECT * FROM sys.dump_column_defaults();
-       INSERT INTO dump_statements(s) SELECT * FROM 
sys.dump_table_constraint_type();
-       INSERT INTO dump_statements(s) SELECT * FROM sys.dump_indices();
-       INSERT INTO dump_statements(s) SELECT * FROM sys.dump_foreign_keys();
-       INSERT INTO dump_statements(s) SELECT * FROM 
sys.dump_partition_tables();
-       INSERT INTO dump_statements(s) SELECT * from sys.dump_triggers();
-       INSERT INTO dump_statements(s) SELECT * FROM sys.dump_comments();
-
-       --We are dumping ALL privileges so we need to erase existing privileges 
on the receiving side;
-       INSERT INTO dump_statements(s) VALUES ('TRUNCATE sys.privileges;');
-       INSERT INTO dump_statements(s) SELECT * FROM sys.dump_privileges();
-
-       --TODO dumping table data
-       --TODO ALTER SEQUENCE using RESTART WITH after importing table_data.
-       --TODO loaders ,procedures, window and filter sys.functions.    
-       --TODO look into order dependent group_concat
-       --TODO ADD upgrade code 
-
-    INSERT INTO dump_statements(s) VALUES ('COMMIT;');
-
-END;
-
-CALL tmp.dump_database(TRUE);
-
-SELECT s FROM dump_statements order by o;
+SELECT * FROM sys.dump_database(TRUE);
 
 ROLLBACK;
diff --git a/sql/scripts/76_dump.sql b/sql/scripts/76_dump.sql
--- a/sql/scripts/76_dump.sql
+++ b/sql/scripts/76_dump.sql
@@ -1,4 +1,4 @@
-CREATE FUNCTION dump_table_constraint_type() RETURNS TABLE(stm STRING) BEGIN
+CREATE FUNCTION dump_table_constraint_type() RETURNS TABLE(stmt STRING) BEGIN
        RETURN
                SELECT
                        'ALTER TABLE ' || DQ(s) || '.' || DQ("table") ||
@@ -7,7 +7,7 @@ CREATE FUNCTION dump_table_constraint_ty
                FROM describe_constraints() GROUP BY s, "table", con, type;
 END;
 
-CREATE FUNCTION dump_indices() RETURNS TABLE(stm STRING) BEGIN
+CREATE FUNCTION dump_indices() RETURNS TABLE(stmt STRING) BEGIN
        RETURN
                SELECT
                        'CREATE ' || it || ' ' ||
@@ -118,3 +118,119 @@ RETURN
                ');'
        FROM describe_privileges() dp;
 END;
+
+CREATE PROCEDURE EVAL(stmt STRING) EXTERNAL NAME sql.eval;
+
+CREATE FUNCTION esc(s STRING) RETURNS STRING BEGIN RETURN '"' || 
sys.replace(sys.replace(sys.replace(s,'\\', '\\\\'), '\n', '\\n'), '"', '\\"') 
|| '"'; END;
+
+CREATE FUNCTION esc_null(s STRING) RETURNS STRING BEGIN RETURN CASE WHEN s IS 
NULL THEN 'null' ELSE s END; END;
+
+CREATE FUNCTION prepare_esc(s STRING, t STRING) RETURNS STRING
+BEGIN
+    RETURN
+        CASE
+            WHEN (t = 'varchar' OR t ='char' OR t = 'clob' OR t = 'json' OR t 
= 'geometry' OR t = 'url') THEN
+                'esc_null(esc(' || DQ(s) || '))'
+            ELSE
+                'esc_null(' || DQ(s) || ')'
+        END;
+END;
+
+--The dump statement should normally have an auto-incremented column 
representing the creation order.
+--But in cases of db objects that can be interdependent, i.e. sys.functions 
and table-likes, we need access to the underlying sequence of the 
AUTO_INCREMENT property.
+--Because we need to explicitly overwrite the creation order column "o" in 
those cases. After inserting the dump statements for sys.functions and 
table-likes,
+--we can restart the auto-increment sequence with a sensible value for 
following dump statements.
+
+CREATE SEQUENCE sys._auto_increment;
+CREATE TABLE sys.dump_statements(o INT DEFAULT NEXT VALUE FOR 
sys._auto_increment, s STRING, PRIMARY KEY (o));
+
+--Because ALTER SEQUENCE statements are not allowed in procedures,
+--we have to do a really nasty hack to restart the _auto_increment sequence.
+
+CREATE FUNCTION sys.restart_sequence(sch STRING, seq STRING, val BIGINT) 
RETURNS BIGINT EXTERNAL NAME sql."restart";
+
+CREATE FUNCTION sys.dump_database(describe BOOLEAN) RETURNS TABLE(o int, stmt 
STRING)
+BEGIN
+
+       SET SCHEMA sys;
+       TRUNCATE dump_statements;
+       DECLARE dummy_result BIGINT; --HACK: otherwise I cannot call 
restart_sequence.
+       SET dummy_result = sys.restart_sequence('sys', '_auto_increment', 0);
+
+       INSERT INTO dump_statements(s) VALUES ('START TRANSACTION;');
+       INSERT INTO dump_statements(s) VALUES ('SET SCHEMA "sys";');
+
+       INSERT INTO dump_statements(s) --dump_create_roles
+               SELECT 'CREATE ROLE ' || sys.dq(name) || ';' FROM sys.auths
+        WHERE name NOT IN (SELECT name FROM sys.db_user_info)
+        AND grantor <> 0;
+
+       INSERT INTO dump_statements(s) --dump_create_users
+               SELECT
+        'CREATE USER ' ||  sys.dq(ui.name) ||  ' WITH ENCRYPTED PASSWORD ' ||
+            sys.sq(sys.password_hash(ui.name)) ||
+        ' NAME ' || sys.sq(ui.fullname) ||  ' SCHEMA sys;'
+        FROM sys.db_user_info ui, sys.schemas s
+        WHERE ui.default_schema = s.id
+            AND ui.name <> 'monetdb'
+            AND ui.name <> '.snapshot';
+
+       INSERT INTO dump_statements(s) --dump_create_schemas
+        SELECT
+            'CREATE SCHEMA ' ||  sys.dq(s.name) || ifthenelse(a.name <> 
'sysadmin', ' AUTHORIZATION ' || a.name, ' ') || ';'
+        FROM sys.schemas s, sys.auths a
+        WHERE s.authorization = a.id AND s.system = FALSE;
+
+       INSERT INTO dump_statements(s) SELECT stmt FROM 
sys.dump_user_defined_types();
+
+    INSERT INTO dump_statements(s) --dump_add_schemas_to_users
+           SELECT
+            'ALTER USER ' || sys.dq(ui.name) || ' SET SCHEMA ' || 
sys.dq(s.name) || ';'
+        FROM sys.db_user_info ui, sys.schemas s
+        WHERE ui.default_schema = s.id
+            AND ui.name <> 'monetdb'
+            AND ui.name <> '.snapshot'
+            AND s.name <> 'sys';
+
+    INSERT INTO dump_statements(s) --dump_grant_user_priviledges
+        SELECT
+            'GRANT ' || sys.dq(a2.name) || ' ' || ifthenelse(a1.name = 
'public', 'PUBLIC', sys.dq(a1.name)) || ';'
+               FROM sys.auths a1, sys.auths a2, sys.user_role ur
+               WHERE a1.id = ur.login_id AND a2.id = ur.role_id;
+
+       INSERT INTO dump_statements(s) SELECT stmt FROM sys.dump_sequences();
+
+       --START OF COMPLICATED DEPENDENCY STUFF:
+       --functions and table-likes can be interdependent. They should be 
inserted in the order of their catalogue id.
+       DECLARE offs INT;
+       SET offs = (SELECT max(o) FROM dump_statements) - (SELECT min(ids.id) 
FROM (select id from sys.tables union select id from sys.functions) ids(id));
+
+       INSERT INTO dump_statements SELECT f.o + offs, f.stmt FROM 
sys.dump_functions() f;
+       INSERT INTO dump_statements SELECT t.o + offs, t.stmt FROM 
sys.dump_tables() t;
+
+       SET offs = (SELECT max(o) + 1 FROM dump_statements);
+       SET dummy_result = sys.restart_sequence('sys', '_auto_increment', offs);
+       --END OF COMPLICATED DEPENDENCY STUFF.
+
+       INSERT INTO dump_statements(s) SELECT stmt FROM 
sys.dump_column_defaults();
+       INSERT INTO dump_statements(s) SELECT stmt FROM 
sys.dump_table_constraint_type();
+       INSERT INTO dump_statements(s) SELECT stmt FROM sys.dump_indices();
+       INSERT INTO dump_statements(s) SELECT stmt FROM sys.dump_foreign_keys();
+       INSERT INTO dump_statements(s) SELECT stmt FROM 
sys.dump_partition_tables();
+       INSERT INTO dump_statements(s) SELECT stmt from sys.dump_triggers();
+       INSERT INTO dump_statements(s) SELECT stmt FROM sys.dump_comments();
+
+       --We are dumping ALL privileges so we need to erase existing privileges 
on the receiving side;
+       INSERT INTO dump_statements(s) VALUES ('TRUNCATE sys.privileges;');
+       INSERT INTO dump_statements(s) SELECT stmt FROM sys.dump_privileges();
+
+       --TODO dumping table data
+       --TODO ALTER SEQUENCE using RESTART WITH after importing table_data.
+       --TODO loaders ,procedures, window and filter sys.functions.
+       --TODO look into order dependent group_concat
+       --TODO ADD upgrade code
+
+       INSERT INTO dump_statements(s) VALUES ('COMMIT;');
+
+       RETURN dump_statements;
+END;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to