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

Dump table data.


diffs (229 lines):

diff --git a/dump_output.sql b/dump_output.sql
--- a/dump_output.sql
+++ b/dump_output.sql
@@ -52,6 +52,7 @@ CREATE TABLE "sys"."foo" ("i" INTEGER, "
 create function "sys"."f1" () returns int begin return 10; end;
 create procedure "sys"."f1" (i int) begin declare x int; end;
 create procedure "sys"."f1" () begin declare x int; end;
+CREATE TABLE "sys"."tbl_with_data" ("c1" INTEGER, "c2" BIGINT, "c3" BINARY 
LARGE OBJECT, "c4" BOOLEAN, "c5" CHARACTER LARGE OBJECT, "c6" DATE, "c7" 
INTERVAL DAY, "c8" DECIMAL(18,3), "c9" DECIMAL(5), "c10" DECIMAL(5,2), "c11" 
DOUBLE, "c12" FLOAT(5), "c13" FLOAT(5,4), "c14" GEOMETRY(POINT), "c18" INTERVAL 
YEAR, "c19" INTERVAL YEAR TO MONTH, "c20" INTERVAL MONTH, "c21" REAL, "c22" 
INTERVAL DAY, "c23" INTERVAL DAY TO HOUR, "c24" INTERVAL HOUR, "c25" INTERVAL 
HOUR TO MINUTE, "c26" TIME, "c27" TIMESTAMP, "c28" TIMESTAMP(2), "c29" 
TIMESTAMP WITH TIME ZONE, "c30" JSON, "c31" INET, "c32" URL, "c33" UUID);
 ALTER TABLE "sys"."yoyo" ALTER COLUMN "tsz" SET DEFAULT 'BLABOLO';
 ALTER TABLE "sys"."bolo" ADD CONSTRAINT "cpk" PRIMARY KEY ("s", "v");
 ALTER TABLE "sys"."rolo" ADD CONSTRAINT "rolo_v_pkey" PRIMARY KEY ("v");
@@ -82,4 +83,8 @@ INSERT INTO sys.privileges VALUES ((SELE
 INSERT INTO sys.privileges VALUES ((SELECT fqn.id FROM 
fully_qualified_functions() fqn WHERE fqn.nme =  'sys.f1(INTEGER)'  AND fqn.tpe 
=  'PROCEDURE' ),(SELECT id FROM auths a WHERE a.name =  'voc' ),(SELECT 
pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name =  
'EXECUTE' ),(SELECT id FROM auths g WHERE g.name =  'monetdb' ),false);
 INSERT INTO sys.privileges VALUES ((SELECT fqn.id FROM 
fully_qualified_functions() fqn WHERE fqn.nme =  'sys.f1()'  AND fqn.tpe =  
'PROCEDURE' ),(SELECT id FROM auths a WHERE a.name =  'voc' ),(SELECT 
pc.privilege_code_id FROM privilege_codes pc WHERE pc.privilege_code_name =  
'EXECUTE' ),(SELECT id FROM auths g WHERE g.name =  'monetdb' ),true);
 INSERT INTO sys.privileges VALUES (0,(SELECT id FROM auths a WHERE a.name =  
'voc' ),(SELECT pc.privilege_code_id FROM privilege_codes pc WHERE 
pc.privilege_code_name =  'UPDATE' ),(SELECT id FROM auths g WHERE g.name =  
'monetdb' ),false);
+COPY 3 RECORDS INTO "sys"."tbl_with_data"("c1", "c2", "c3", "c4", "c5", "c6", 
"c7", "c8", "c9", "c10", "c11", "c12", "c13", "c14", "c18", "c19", "c20", 
"c21", "c22", "c23", "c24", "c25", "c26", "c27", "c28", "c29", "c30", "c31", 
"c32", "c33") FROM STDIN USING DELIMITERS '|','\n','"';
+1234|5678|90|true|"Hello\n \\|\" 
World"|2020-12-20|10.000|1023.345|12345|123.45|1123.455|1122133.5|121233.45|"POINT
 (5.1 
34.5)"|2000|4000|8000|65333.414|8000.000|4000.000|2000.000|1000.000|14:18:18|2015-05-22
 14:18:17.780331|2015-05-22 00:00:00.00|2015-05-22 
13:18:17.780331+01:00|"{\"price\":9}"|10.1.0.0/16|"https://m...@www.monetdb.org:458/Doc/Abc.html?lang=nl&sort=asc#example";|65950c76-a2f6-4543-660a-b849cf5f2453
+null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null
+null|null|null|null|"null"|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null|null
 COMMIT;
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
@@ -141,32 +141,102 @@ END;
 --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));
+CREATE TABLE sys.dump_statements(o INT, s STRING, PRIMARY KEY (o));
+
+CREATE FUNCTION current_size_dump_statements() RETURNS INT BEGIN RETURN SELECT 
COUNT(*) FROM dump_statements; END;
+
+CREATE PROCEDURE _dump_table_data(sch STRING, tbl STRING) BEGIN
+
+    DECLARE k INT;
+    SET k = (SELECT MIN(c.id) FROM columns c, tables t WHERE c.table_id = t.id 
AND t.name = tbl);
+       IF k IS NOT NULL THEN
+
+               DECLARE cname STRING;
+               DECLARE ctype STRING;
+               SET cname = (SELECT c.name FROM sys.columns c WHERE c.id = k);
+               SET ctype = (SELECT c.type FROM sys.columns c WHERE c.id = k);
+
+               DECLARE COPY_INTO_STMT STRING;
+               DECLARE _cnt INT;
+               SET _cnt = (SELECT MIN(s.count) FROM sys.storage() s WHERE 
s.schema = sch AND s.table = tbl);
+
+               IF _cnt > 0 THEN
+                       SET COPY_INTO_STMT = 'COPY ' || _cnt ||  ' RECORDS INTO 
' || FQN(sch, tbl) || '(' || DQ(cname);
+
+                       DECLARE SELECT_DATA_STMT STRING;
+                       SET SELECT_DATA_STMT = 'SELECT 
current_size_dump_statements() + RANK() OVER(), ' || prepare_esc(cname, ctype);
+
+                       DECLARE M INT;
+                       SET M = (SELECT MAX(c.id) FROM columns c, tables t 
WHERE c.table_id = t.id AND t.name = tbl);
+
+                       IF (k < M) THEN
+                               SET k = (SELECT MIN(c.id) FROM columns c, 
tables t WHERE c.table_id = t.id AND t.name = tbl AND c.id > k);
+                       END IF;
+
+                       WHILE (k < M) DO
+                               SET cname = (SELECT c.name FROM sys.columns c 
WHERE c.id = k);
+                               SET ctype = (SELECT c.type FROM sys.columns c 
WHERE c.id = k);
+                               SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' || 
DQ(cname));
+                               SET SELECT_DATA_STMT = SELECT_DATA_STMT || '|| 
''|'' || ' || prepare_esc(cname, ctype);
+                               SET k = (SELECT MIN(c.id ) FROM columns c, 
tables t WHERE c.table_id = t.id AND t.name = tbl AND c.id > k);
+                       END WHILE;
 
---Because ALTER SEQUENCE statements are not allowed in procedures,
---we have to do a really nasty hack to restart the _auto_increment sequence.
+                       SET cname = (SELECT c.name FROM sys.columns c WHERE 
c.id = k);
+                       SET ctype = (SELECT c.type FROM sys.columns c WHERE 
c.id = k);
+                       SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' || 
DQ(cname));
+                       SET SELECT_DATA_STMT = SELECT_DATA_STMT || '|| ''|'' || 
' || prepare_esc(cname, ctype);
+
+                       SET COPY_INTO_STMT = (COPY_INTO_STMT || ') FROM STDIN 
USING DELIMITERS ''|'',''\\n'',''"'';');
+                       SET SELECT_DATA_STMT =  SELECT_DATA_STMT || ' FROM ' || 
FQN(sch, tbl);
+
+                       insert into dump_statements VALUES 
(current_size_dump_statements() + 1, COPY_INTO_STMT);
+
+                       CALL sys.EVAL('INSERT INTO dump_statements ' || 
SELECT_DATA_STMT || ';');
+               END IF;
+       END IF;
+END;
+
+CREATE PROCEDURE dump_table_data() BEGIN
+
+       DECLARE i INT;
+    SET i = (SELECT MIN(t.id) FROM sys.tables t, sys.table_types ts WHERE 
t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT t.system);
 
-CREATE FUNCTION sys.restart_sequence(sch STRING, seq STRING, val BIGINT) 
RETURNS BIGINT EXTERNAL NAME sql."restart";
+       IF i IS NOT NULL THEN
+               DECLARE M INT;
+               SET M = (SELECT MAX(t.id) FROM sys.tables t, sys.table_types ts 
WHERE t.type = ts.table_type_id AND ts.table_type_name = 'TABLE' AND NOT 
t.system);
+
+               DECLARE sch STRING;
+               DECLARE tbl STRING;
+
+               WHILE i < M DO
+                       set sch = (SELECT s.name FROM sys.tables t, sys.schemas 
s WHERE s.id = t.schema_id AND t.id = i);
+                       set tbl = (SELECT t.name FROM sys.tables t, sys.schemas 
s WHERE s.id = t.schema_id AND t.id = i);
+                       CALL _dump_table_data(sch, tbl);
+                       SET i = (SELECT MIN(t.id) FROM sys.tables t, 
sys.table_types ts WHERE t.type = ts.table_type_id AND ts.table_type_name = 
'TABLE' AND NOT t.system AND t.id > i);
+               END WHILE;
+
+               set sch = (SELECT s.name FROM sys.tables t, sys.schemas s WHERE 
s.id = t.schema_id AND t.id = i);
+               set tbl = (SELECT t.name FROM sys.tables t, sys.schemas s WHERE 
s.id = t.schema_id AND t.id = i);
+               CALL _dump_table_data(sch, tbl);
+       END IF;
+END;
 
 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 VALUES (0, 'START TRANSACTION;');
+       INSERT INTO dump_statements VALUES (current_size_dump_statements() + 1, 
'SET SCHEMA "sys";');
 
-       INSERT INTO dump_statements(s) --dump_create_roles
-               SELECT 'CREATE ROLE ' || sys.dq(name) || ';' FROM sys.auths
+       INSERT INTO dump_statements --dump_create_roles
+               SELECT current_size_dump_statements() + RANK() OVER(), '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
+       INSERT INTO dump_statements --dump_create_users
+               SELECT current_size_dump_statements() + RANK() OVER(),
         'CREATE USER ' ||  sys.dq(ui.name) ||  ' WITH ENCRYPTED PASSWORD ' ||
             sys.sq(sys.password_hash(ui.name)) ||
         ' NAME ' || sys.sq(ui.fullname) ||  ' SCHEMA sys;'
@@ -175,16 +245,16 @@ BEGIN
             AND ui.name <> 'monetdb'
             AND ui.name <> '.snapshot';
 
-       INSERT INTO dump_statements(s) --dump_create_schemas
-        SELECT
+       INSERT INTO dump_statements --dump_create_schemas
+        SELECT current_size_dump_statements() + RANK() OVER(),
             '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 SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_user_defined_types();
 
-    INSERT INTO dump_statements(s) --dump_add_schemas_to_users
-           SELECT
+    INSERT INTO dump_statements --dump_add_schemas_to_users
+           SELECT current_size_dump_statements() + RANK() OVER(),
             '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
@@ -192,45 +262,42 @@ BEGIN
             AND ui.name <> '.snapshot'
             AND s.name <> 'sys';
 
-    INSERT INTO dump_statements(s) --dump_grant_user_priviledges
-        SELECT
+    INSERT INTO dump_statements --dump_grant_user_priviledges
+        SELECT current_size_dump_statements() + RANK() OVER(),
             '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;
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_sequences();
 
-       SET offs = (SELECT max(o) + 1 FROM dump_statements);
-       SET dummy_result = sys.restart_sequence('sys', '_auto_increment', offs);
-       --END OF COMPLICATED DEPENDENCY STUFF.
+       --functions and table-likes can be interdependent. They should be 
inserted in the order of their catalogue id.
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(ORDER BY stmts.o), stmts.s
+       FROM (
+                       SELECT * FROM sys.dump_functions() f
+                       UNION
+                       SELECT * FROM sys.dump_tables() t
+               ) AS stmts(o, s);
 
-       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();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_column_defaults();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_table_constraint_type();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_indices();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_foreign_keys();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_partition_tables();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt from sys.dump_triggers();
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), 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();
+       INSERT INTO dump_statements VALUES (current_size_dump_statements() + 1, 
'TRUNCATE sys.privileges;');
+       INSERT INTO dump_statements SELECT current_size_dump_statements() + 
RANK() OVER(), stmt FROM sys.dump_privileges();
 
-       --TODO dumping table data
+       CALL dump_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;');
+       INSERT INTO dump_statements VALUES (current_size_dump_statements() + 1, 
'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