Changeset: 721b7889b3f1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/721b7889b3f1
Modified Files:
        sql/backends/monet5/sql_upgrades.c
Branch: default
Log Message:

Update the upgrade program, part of fix 7282


diffs (108 lines):

diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -4591,7 +4591,7 @@ sql_update_jan2022(Client c, mvc *sql)
 static str
 sql_update_default(Client c, mvc *sql)
 {
-       size_t bufsize = 8192, pos = 0;
+       size_t bufsize = 65536, pos = 0;
        char *err = NULL, *buf = GDKmalloc(bufsize);
        res_table *output;
        BAT *b;
@@ -4625,6 +4625,8 @@ sql_update_default(Client c, mvc *sql)
                pos += snprintf(buf + pos, bufsize - pos,
                        /* drop dependent stuff from 76_dump.sql */
                        "drop function sys.dump_database(boolean);\n"
+                       "drop procedure sys.dump_table_data();\n"
+                       "drop procedure sys.dump_table_data(string, string);\n"
                        "drop view sys.dump_partition_tables;\n"
                        "drop view sys.describe_partition_tables;\n"
                        "drop view sys.dump_sequences;\n"
@@ -4722,14 +4724,65 @@ sql_update_default(Client c, mvc *sql)
                        "    sch schema_name,\n"
                        "    seq sequence_name\n"
                        "    FROM sys.describe_sequences;\n"
+                       "CREATE PROCEDURE sys.dump_table_data(sch STRING, tbl 
STRING)\n"
+                       "BEGIN\n"
+                       "  DECLARE tid INT;\n"
+                       "  SET tid = (SELECT MIN(t.id) FROM sys.tables t, 
sys.schemas s WHERE t.name = tbl AND t.schema_id = s.id AND s.name = sch);\n"
+                       "  IF tid IS NOT NULL THEN\n"
+                       "    DECLARE k INT;\n"
+                       "    DECLARE m INT;\n"
+                       "    SET k = (SELECT MIN(c.id) FROM sys.columns c WHERE 
c.table_id = tid);\n"
+                       "    SET m = (SELECT MAX(c.id) FROM sys.columns c WHERE 
c.table_id = tid);\n"
+                       "    IF k IS NOT NULL AND m IS NOT NULL THEN\n"
+                       "      DECLARE cname STRING;\n"
+                       "      DECLARE ctype STRING;\n"
+                       "      DECLARE _cnt INT;\n"
+                       "      SET cname = (SELECT c.name FROM sys.columns c 
WHERE c.id = k);\n"
+                       "      SET ctype = (SELECT c.type FROM sys.columns c 
WHERE c.id = k);\n"
+                       "      SET _cnt = (SELECT count FROM sys.storage(sch, 
tbl, cname));\n"
+                       "      IF _cnt > 0 THEN\n"
+                       "        DECLARE COPY_INTO_STMT STRING;\n"
+                       "        DECLARE SELECT_DATA_STMT STRING;\n"
+                       "        SET COPY_INTO_STMT = 'COPY ' || _cnt || ' 
RECORDS INTO ' || sys.FQN(sch, tbl) || '(' || sys.DQ(cname);\n"
+                       "        SET SELECT_DATA_STMT = 'SELECT (SELECT 
COUNT(*) FROM sys.dump_statements) + RANK() OVER(), ' || sys.prepare_esc(cname, 
ctype);\n"
+                       "        WHILE (k < m) DO\n"
+                       "          SET k = (SELECT MIN(c.id) FROM sys.columns c 
WHERE c.table_id = tid AND c.id > k);\n"
+                       "          SET cname = (SELECT c.name FROM sys.columns 
c WHERE c.id = k);\n"
+                       "          SET ctype = (SELECT c.type FROM sys.columns 
c WHERE c.id = k);\n"
+                       "          SET COPY_INTO_STMT = (COPY_INTO_STMT || ', ' 
|| sys.DQ(cname));\n"
+                       "          SET SELECT_DATA_STMT = (SELECT_DATA_STMT || 
'|| ''|'' || ' || sys.prepare_esc(cname, ctype));\n"
+                       "        END WHILE;\n"
+                       "        SET COPY_INTO_STMT = (COPY_INTO_STMT || ') 
FROM STDIN USING DELIMITERS ''|'',E''\\\\n'',''\"'';');\n"
+                       "        SET SELECT_DATA_STMT = (SELECT_DATA_STMT || ' 
FROM ' || sys.FQN(sch, tbl));\n"
+                       "        INSERT INTO sys.dump_statements VALUES 
((SELECT COUNT(*) FROM sys.dump_statements) + 1, COPY_INTO_STMT);\n"
+                       "        CALL sys.EVAL('INSERT INTO sys.dump_statements 
' || SELECT_DATA_STMT || ';');\n"
+                       "      END IF;\n"
+                       "    END IF;\n"
+                       "  END IF;\n"
+                       "END;\n"
+                       "CREATE PROCEDURE sys.dump_table_data()\n"
+                       "BEGIN\n"
+                       "  DECLARE i INT;\n"
+                       "  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);\n"
+                       "  IF i IS NOT NULL THEN\n"
+                       "    DECLARE M INT;\n"
+                       "    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);\n"
+                       "    DECLARE sch STRING;\n"
+                       "    DECLARE tbl STRING;\n"
+                       "    WHILE i IS NOT NULL AND i <= M DO\n"
+                       "      SET sch = (SELECT s.name FROM sys.tables t, 
sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
+                       "      SET tbl = (SELECT t.name FROM sys.tables t, 
sys.schemas s WHERE s.id = t.schema_id AND t.id = i);\n"
+                       "      CALL sys.dump_table_data(sch, tbl);\n"
+                       "      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);\n"
+                       "    END WHILE;\n"
+                       "  END IF;\n"
+                       "END;\n"
                        "CREATE FUNCTION sys.dump_database(describe BOOLEAN) 
RETURNS TABLE(o int, stmt STRING)\n"
                        "BEGIN\n"
-                       "\n"
                        "SET SCHEMA sys;\n"
                        "TRUNCATE sys.dump_statements;\n"
-                       "\n"
                        "INSERT INTO sys.dump_statements VALUES (1, 'START 
TRANSACTION;');\n"
-                       "INSERT INTO sys.dump_statements VALUES ((SELECT 
COUNT(*) FROM sys.dump_statements) + 1, 'SET SCHEMA \"sys\";');\n"
+                       "INSERT INTO sys.dump_statements VALUES (2, 'SET SCHEMA 
\"sys\";');\n"
                        "INSERT INTO sys.dump_statements SELECT (SELECT 
COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_create_roles;\n"
                        "INSERT INTO sys.dump_statements SELECT (SELECT 
COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_create_users;\n"
                        "INSERT INTO sys.dump_statements SELECT (SELECT 
COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_create_schemas;\n"
@@ -4742,7 +4795,7 @@ sql_update_default(Client c, mvc *sql)
                        "INSERT INTO sys.dump_statements SELECT (SELECT 
COUNT(*) FROM sys.dump_statements) + RANK() OVER(ORDER BY stmts.o), stmts.s\n"
                        "                                       FROM (\n"
                        "                                       SELECT f.o, 
f.stmt FROM sys.dump_functions f\n"
-                       "                                       UNION\n"
+                       "                                       UNION ALL\n"
                        "                                       SELECT t.o, 
t.stmt FROM sys.dump_tables t\n"
                        "                                       ) AS stmts(o, 
s);\n"
                        "\n"
@@ -4775,6 +4828,8 @@ sql_update_default(Client c, mvc *sql)
                pos += snprintf(buf + pos, bufsize - pos,
                        "update sys._tables set system = true where name in 
('describe_partition_tables', 'dump_partition_tables', 'dump_sequences', 
'dump_start_sequences') AND schema_id = 2000;\n");
                pos += snprintf(buf + pos, bufsize - pos,
+                       "update sys.functions set system = true where system <> 
true and name in ('dump_table_data') and schema_id = 2000 and type = %d;\n", 
F_PROC);
+               pos += snprintf(buf + pos, bufsize - pos,
                        "update sys.functions set system = true where system <> 
true and name in ('dump_database') and schema_id = 2000 and type = %d;\n", 
F_UNION);
 
                /* 12_url.sql */
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to