Changeset: 2227f1d52305 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2227f1d52305
Modified Files:
dump.sql
dump_output.sql
Branch: monetdbe-proxy
Log Message:
dump functions while being careful with object dependencies.
diffs (98 lines):
diff --git a/dump.sql b/dump.sql
--- a/dump.sql
+++ b/dump.sql
@@ -2,6 +2,7 @@ START TRANSACTION;
--We start with creating static versions of catalogue tables that are going to
be affected by this dump script itself.
CREATE TEMPORARY TABLE _user_sequences AS SELECT * FROM sys.sequences;
+CREATE TEMPORARY TABLE _user_functions AS SELECT * FROM sys.functions f WHERE
NOT f.system;
CREATE FUNCTION SQ (s STRING) RETURNS STRING BEGIN RETURN ' ''' || s || ''' ';
END;
CREATE FUNCTION DQ (s STRING) RETURNS STRING BEGIN RETURN '"' || s || '"';
END; --TODO: Figure out why this breaks with the space
@@ -353,20 +354,35 @@ RETURN
FROM describe_sequences();
END;
+CREATE FUNCTION describe_functions() RETURNS TABLE (o INT, sch STRING, fun
STRING, def STRING) BEGIN
+RETURN
+ SELECT f.id, s.name, f.name, f.func from _user_functions f JOIN schemas
s ON f.schema_id = s.id;
+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;
+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. 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 and after inserting the dump statements for functions and
table-likes,
+--Because we need to explicitly overwrite the creation order column "o" in
those cases. After inserting the dump statements for functions and table-likes,
--we can restart the auto-increment sequence with a sensible value for
following dump statements.
CREATE SEQUENCE _auto_increment;
CREATE TEMPORARY TABLE dump_statements(o INT DEFAULT NEXT VALUE FOR
_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 restart_sequence(sch STRING, seq STRING, val BIGINT) RETURNS
BIGINT EXTERNAL NAME sql."restart";
+
CREATE PROCEDURE 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 ' || DQ(name) || ';' FROM auths
@@ -418,6 +434,15 @@ BEGIN
sys.sequences seq JOIN sys.comments rem ON seq.id =
rem.id
WHERE sch.id = seq.schema_id;
+ DECLARE current_order INT;
+ SET current_order = (SELECT max(o) FROM dump_statements) - (SELECT
min(ids.id) FROM (select id from tables union select id from functions)
ids(id));
+
+ INSERT INTO dump_statements SELECT f.o + current_order, f.stmt FROM
dump_functions() f;
+
+ SET current_order = (SELECT max(o) + 1 FROM dump_statements);
+ DECLARE dummy_result BIGINT;
+ SET dummy_result = restart_sequence('sys', '_auto_increment',
current_order + 1);
+
INSERT INTO dump_statements(s) --dump_create_tables
SELECT
'CREATE ' || ts.table_type_name || ' ' || DQ(s.name) ||
'.' || DQ(t.name) || dump_column_definition(t.id) ||
@@ -449,15 +474,12 @@ 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 STREAM TABLE?
- --TODO functions
--TODO VIEW
--TODO Triggers
--TODO COMMENTS ON TABLE
--TODO TABLE level grants
--TODO COLUMN level grants
--TODO User Defined Types? sys.types
- --TODO Triggers
--TODO ALTER SEQUENCE using RESTART WITH after importing table_data.
INSERT INTO dump_statements(s) VALUES ('COMMIT;');
diff --git a/dump_output.sql b/dump_output.sql
--- a/dump_output.sql
+++ b/dump_output.sql
@@ -1,4 +1,5 @@
START TRANSACTION;
+SET SCHEMA "sys";
CREATE ROLE "king";
CREATE USER "voc" WITH ENCRYPTED PASSWORD
'ea45cf4e124b215a28631ec7ff0bf06e82fc26b2be7a066c9594855690fb5d42438be58d6523132384a1738cb4e5139caa1f970ebdfb422d65834d9a4ef61c0e'
NAME 'VOC Explorer' SCHEMA sys;
CREATE USER "voc2" WITH ENCRYPTED PASSWORD
'ea45cf4e124b215a28631ec7ff0bf06e82fc26b2be7a066c9594855690fb5d42438be58d6523132384a1738cb4e5139caa1f970ebdfb422d65834d9a4ef61c0e'
NAME 'VOC Explorer' SCHEMA sys;
@@ -16,6 +17,8 @@ CREATE SEQUENCE "sys"."seq7"AS BIGINT S
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.' ;
+SET SCHEMA "sfoo";create function
+func1(x int, y int) returns int begin return x + y; end;SET SCHEMA "sys";
CREATE TABLE "sys"."test" ("s" CHARACTER LARGE OBJECT);
CREATE TABLE "sys"."bla" ("s" CHARACTER LARGE OBJECT(10));
CREATE TABLE "sys"."bob" ("ts" TIMESTAMP(3) );
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list