Changeset: 05363a87418d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/05363a87418d
Modified Files:
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/52_describe.sql
        sql/test/emptydb/Tests/check.stable.out
        sql/test/emptydb/Tests/check.stable.out.32bit
        sql/test/emptydb/Tests/check.stable.out.int128
Branch: mangled
Log Message:

Fix missing dependencies in upgrade.


diffs (truncated from 334 to 300 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
@@ -4650,6 +4650,226 @@ sql_update_jan2022(Client c, mvc *sql, c
        return err;             /* usually MAL_SUCCEED */
 }
 
+static str
+sql_update_default(Client c, mvc *sql, const char *prev_schema, bool 
*systabfixed)
+{
+       size_t bufsize = 65536, pos = 0;
+       char *buf = NULL, *err = NULL;
+       res_table *output;
+
+       if ((buf = GDKmalloc(bufsize)) == NULL)
+               throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
+       pos += snprintf(buf + pos, bufsize - pos,
+                       "select c.id from schemas s, tables t, columns c, 
functions f, dependencies d \n"
+                       "where s.id = t.schema_id and t.id = c.table_id and 
d.id = c.id and d.depend_id = f.id and f.name = 'describe_function' and s.name 
= 'sys' and t.name = 'functions' and c.name = 'mangled_name';\n");
+       err = SQLstatementIntern(c, buf, "update", 1, 0, &output);
+       if (err) {
+               GDKfree(buf);
+               return err;
+       }
+       BAT* b = BATdescriptor(output->cols[0].b);
+       if (b) {
+               if (BATcount(b)) {
+                       assert(BATcount(b) == 1);
+                       BBPunfix(b->batCacheid);
+                       /* nothing to do */
+                       GDKfree(buf);
+                       return NULL;
+               }
+               BBPunfix(b->batCacheid);
+       }
+       else
+               throw(SQL, __func__, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+
+       if (!*systabfixed && (err = sql_fix_system_tables(c, sql, prev_schema)) 
!= NULL)
+               return err;
+       *systabfixed = true;
+
+       pos = snprintf(buf, bufsize, "SET SCHEMA \"sys\";\n");
+
+       sql_schema *s = mvc_bind_schema(sql, "sys");
+       sql_table* t = NULL;
+
+       t = mvc_bind_table(sql, s, "describe_privileges");
+       t->system = 0;
+       t = mvc_bind_table(sql, s, "dump_comments");
+       t->system = 0;
+       t = mvc_bind_table(sql, s, "describe_comments");
+       t->system = 0;
+       t = mvc_bind_table(sql, s, "fully_qualified_functions");
+       t->system = 0;
+
+       pos += snprintf(buf + pos, bufsize - pos,
+                               "DROP VIEW sys.describe_privileges;\n"
+                               "DROP FUNCTION sys.dump_database(BOOLEAN);\n"
+                               "DROP VIEW sys.dump_comments;\n"
+                               "DROP VIEW sys.describe_comments;\n"
+                               "DROP VIEW sys.fully_qualified_functions;\n"
+                               "DROP FUNCTION sys.describe_function(STRING, 
STRING);\n"
+                               "CREATE FUNCTION 
sys.describe_function(schemaName string, functionName string)\n"
+                               "       RETURNS TABLE(id integer, name string, 
type string, language string, remark string)\n"
+                               "BEGIN\n"
+                               "       RETURN SELECT f.id, f.name, 
ft.function_type_keyword, fl.language_keyword, c.remark\n"
+                               "               FROM sys.functions f\n"
+                               "               JOIN sys.schemas s ON 
f.schema_id = s.id\n"
+                               "               JOIN sys.function_types ft ON 
f.type = ft.function_type_id\n"
+                               "               LEFT OUTER JOIN 
sys.function_languages fl ON f.language = fl.language_id\n"
+                               "               LEFT OUTER JOIN sys.comments c 
ON f.id = c.id\n"
+                               "               WHERE f.name=functionName AND 
s.name = schemaName;\n"
+                               "END;\n"
+                               "CREATE VIEW sys.fully_qualified_functions AS\n"
+                               "       WITH fqn(id, tpe, sig, num) AS\n"
+                               "       (\n"
+                               "               SELECT\n"
+                               "                       f.id,\n"
+                               "                       
ft.function_type_keyword,\n"
+                               "                       CASE WHEN a.type IS 
NULL THEN\n"
+                               "                               sys.fqn(s.name, 
f.name) || '()'\n"
+                               "                       ELSE\n"
+                               "                               sys.fqn(s.name, 
f.name) || '(' || group_concat(sys.describe_type(a.type, a.type_digits, 
a.type_scale), ',') OVER (PARTITION BY f.id ORDER BY a.number)  || ')'\n"
+                               "                       END,\n"
+                               "                       a.number\n"
+                               "               FROM sys.schemas s, 
sys.function_types ft, sys.functions f LEFT JOIN sys.args a ON f.id = 
a.func_id\n"
+                               "               WHERE s.id= f.schema_id AND 
f.type = ft.function_type_id\n"
+                               "       )\n"
+                               "       SELECT\n"
+                               "               fqn1.id id,\n"
+                               "               fqn1.tpe tpe,\n"
+                               "               fqn1.sig nme\n"
+                               "       FROM\n"
+                               "               fqn fqn1 JOIN (SELECT id, 
max(num) FROM fqn GROUP BY id)  fqn2(id, num)\n"
+                               "               ON fqn1.id = fqn2.id AND 
(fqn1.num = fqn2.num OR fqn1.num IS NULL AND fqn2.num is NULL);\n"
+                               "       CREATE VIEW sys.describe_privileges 
AS\n"
+                               "       SELECT\n"
+                               "               CASE\n"
+                               "                       WHEN o.tpe IS NULL AND 
pc.privilege_code_name = 'SELECT' THEN --GLOBAL privileges: SELECT maps to COPY 
FROM\n"
+                               "                               'COPY FROM'\n"
+                               "                       WHEN o.tpe IS NULL AND 
pc.privilege_code_name = 'UPDATE' THEN --GLOBAL privileges: UPDATE maps to COPY 
INTO\n"
+                               "                               'COPY INTO'\n"
+                               "                       ELSE\n"
+                               "                               o.nme\n"
+                               "               END o_nme,\n"
+                               "               coalesce(o.tpe, 'GLOBAL') 
o_tpe,\n"
+                               "               pc.privilege_code_name p_nme,\n"
+                               "               a.name a_nme,\n"
+                               "               g.name g_nme,\n"
+                               "               p.grantable grantable\n"
+                               "       FROM\n"
+                               "               sys.privileges p LEFT JOIN\n"
+                               "               (\n"
+                               "               SELECT t.id, s.name || '.' || 
t.name , 'TABLE'\n"
+                               "                       from sys.schemas s, 
sys.tables t where s.id = t.schema_id\n"
+                               "               UNION ALL\n"
+                               "                       SELECT c.id, s.name || 
'.' || t.name || '.' || c.name, 'COLUMN'\n"
+                               "                       FROM sys.schemas s, 
sys.tables t, sys.columns c where s.id = t.schema_id AND t.id = c.table_id\n"
+                               "               UNION ALL\n"
+                               "                       SELECT f.id, f.nme, 
f.tpe\n"
+                               "                       FROM 
sys.fully_qualified_functions f\n"
+                               "               ) o(id, nme, tpe) ON o.id = 
p.obj_id,\n"
+                               "               sys.privilege_codes pc,\n"
+                               "               auths a, auths g\n"
+                               "       WHERE\n"
+                               "               p.privileges = 
pc.privilege_code_id AND\n"
+                               "               p.auth_id = a.id AND\n"
+                               "               p.grantor = g.id;\n"
+                               "UPDATE sys._tables SET system = true WHERE\n"
+                               "               system <> true AND\n"
+                               "               schema_id = 2000 AND\n"
+                               "               type = (SELECT table_type_id 
FROM sys.table_types WHERE table_type_name = 'SYSTEM VIEW') AND\n"
+                               "               name in (\n"
+                               "                       
'describe_privileges',\n"
+                               "                       
'fully_qualified_functions'\n"
+                               "               );\n"
+                               "CREATE VIEW sys.describe_comments AS\n"
+                               "       SELECT\n"
+                               "               o.id id,\n"
+                               "               o.tpe tpe,\n"
+                               "               o.nme fqn,\n"
+                               "               c.remark rem\n"
+                               "       FROM (\n"
+                               "               SELECT id, 'SCHEMA', 
sys.DQ(name) FROM sys.schemas\n"
+                               "               UNION ALL\n"
+                               "               SELECT t.id, 
ifthenelse(ts.table_type_name = 'VIEW', 'VIEW', 'TABLE'), sys.FQN(s.name, 
t.name)\n"
+                               "               FROM sys.schemas s JOIN 
sys.tables t ON s.id = t.schema_id JOIN sys.table_types ts ON t.type = 
ts.table_type_id\n"
+                               "               WHERE s.name <> 'tmp'\n"
+                               "               UNION ALL\n"
+                               "               SELECT c.id, 'COLUMN', 
sys.FQN(s.name, t.name) || '.' || sys.DQ(c.name) FROM sys.columns c, sys.tables 
t, sys.schemas s WHERE c.table_id = t.id AND t.schema_id = s.id\n"
+                               "               UNION ALL\n"
+                               "               SELECT idx.id, 'INDEX', 
sys.FQN(s.name, idx.name) FROM sys.idxs idx, sys._tables t, sys.schemas s WHERE 
idx.table_id = t.id AND t.schema_id = s.id\n"
+                               "               UNION ALL\n"
+                               "               SELECT seq.id, 'SEQUENCE', 
sys.FQN(s.name, seq.name) FROM sys.sequences seq, sys.schemas s WHERE 
seq.schema_id = s.id\n"
+                               "               UNION ALL\n"
+                               "               SELECT f.id, 
ft.function_type_keyword, qf.nme FROM sys.functions f, sys.function_types ft, 
sys.schemas s, sys.fully_qualified_functions qf WHERE f.type = 
ft.function_type_id AND f.schema_id = s.id AND qf.id = f.id\n"
+                               "               ) AS o(id, tpe, nme)\n"
+                               "               JOIN sys.comments c ON c.id = 
o.id;\n"
+                               "CREATE VIEW sys.dump_comments AS\n"
+                               "       SELECT 'COMMENT ON ' || c.tpe || ' ' || 
c.fqn || ' IS ' || sys.SQ(c.rem) || ';' stmt FROM sys.describe_comments c;\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 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"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_user_defined_types;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_add_schemas_to_users;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_grant_user_privileges;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_sequences;\n"
+                               "\n"
+                               "  --functions and table-likes can be 
interdependent. They should be inserted in the order of their catalogue id.\n"
+                               "  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"
+                               "                                     SELECT 
t.o, t.stmt FROM sys.dump_tables t\n"
+                               "                                   ) AS 
stmts(o, s);\n"
+                               "\n"
+                               "  -- dump table data before adding constraints 
and fixing sequences\n"
+                               "  IF NOT DESCRIBE THEN\n"
+                               "    CALL sys.dump_table_data();\n"
+                               "  END IF;\n"
+                               "\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_start_sequences;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_column_defaults;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_table_constraint_type;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_indices;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_foreign_keys;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_partition_tables;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_triggers;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_comments;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_table_grants;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_column_grants;\n"
+                               "  INSERT INTO sys.dump_statements SELECT 
(SELECT COUNT(*) FROM sys.dump_statements) + RANK() OVER(), stmt FROM 
sys.dump_function_grants;\n"
+                               "\n"
+                               "  --TODO Improve performance of 
dump_table_data.\n"
+                               "  --TODO loaders ,procedures, window and 
filter sys.functions.\n"
+                               "  --TODO look into order dependent 
group_concat\n"
+                               "\n"
+                               "  INSERT INTO sys.dump_statements VALUES 
((SELECT COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
+                               "\n"
+                               "  RETURN sys.dump_statements;\n"
+                               "END;\n"
+                               "UPDATE sys.functions SET system = TRUE WHERE 
system <> true AND schema_id = 2000 AND name = 'describe_function';\n"
+                               "GRANT SELECT ON sys.fully_qualified_functions 
TO PUBLIC;\n"
+                               "GRANT SELECT ON sys.describe_comments TO 
PUBLIC;\n"
+                               "GRANT SELECT ON sys.dump_comments TO PUBLIC;\n"
+                               "GRANT SELECT ON sys.describe_privileges TO 
PUBLIC;\n"
+                               "GRANT EXECUTE ON FUNCTION 
sys.describe_function(STRING, STRING) TO PUBLIC;\n"
+       );
+
+       assert(pos < bufsize);
+       printf("Running database upgrade commands:\n%s\n", buf);
+       err = SQLstatementIntern(c, buf, "update", true, false, NULL);
+
+       GDKfree(buf);
+       return err;             /* usually MAL_SUCCEED */
+}
+
 int
 SQLupgrades(Client c, mvc *m)
 {
@@ -4855,6 +5075,13 @@ SQLupgrades(Client c, mvc *m)
                return -1;
        }
 
+       if ((err = sql_update_default(c, m, prev_schema, &systabfixed)) != 
NULL) {
+               TRC_CRITICAL(SQL_PARSER, "%s\n", err);
+               freeException(err);
+               GDKfree(prev_schema);
+               return -1;
+       }
+
        GDKfree(prev_schema);
        return 0;
 }
diff --git a/sql/scripts/52_describe.sql b/sql/scripts/52_describe.sql
--- a/sql/scripts/52_describe.sql
+++ b/sql/scripts/52_describe.sql
@@ -345,29 +345,18 @@ CREATE VIEW sys.describe_comments AS
                        c.remark rem
                FROM (
                        SELECT id, 'SCHEMA', sys.DQ(name) FROM sys.schemas
-
                        UNION ALL
-
                        SELECT t.id, ifthenelse(ts.table_type_name = 'VIEW', 
'VIEW', 'TABLE'), sys.FQN(s.name, t.name)
                        FROM sys.schemas s JOIN sys.tables t ON s.id = 
t.schema_id JOIN sys.table_types ts ON t.type = ts.table_type_id
                        WHERE s.name <> 'tmp'
-
                        UNION ALL
-
                        SELECT c.id, 'COLUMN', sys.FQN(s.name, t.name) || '.' 
|| sys.DQ(c.name) FROM sys.columns c, sys.tables t, sys.schemas s WHERE 
c.table_id = t.id AND t.schema_id = s.id
-
                        UNION ALL
-
                        SELECT idx.id, 'INDEX', sys.FQN(s.name, idx.name) FROM 
sys.idxs idx, sys._tables t, sys.schemas s WHERE idx.table_id = t.id AND 
t.schema_id = s.id
-
                        UNION ALL
-
                        SELECT seq.id, 'SEQUENCE', sys.FQN(s.name, seq.name) 
FROM sys.sequences seq, sys.schemas s WHERE seq.schema_id = s.id
-
                        UNION ALL
-
                        SELECT f.id, ft.function_type_keyword, qf.nme FROM 
sys.functions f, sys.function_types ft, sys.schemas s, 
sys.fully_qualified_functions qf WHERE f.type = ft.function_type_id AND 
f.schema_id = s.id AND qf.id = f.id
-
                        ) AS o(id, tpe, nme)
                        JOIN sys.comments c ON c.id = o.id;
 
diff --git a/sql/test/emptydb/Tests/check.stable.out 
b/sql/test/emptydb/Tests/check.stable.out
--- a/sql/test/emptydb/Tests/check.stable.out
+++ b/sql/test/emptydb/Tests/check.stable.out
@@ -4407,6 +4407,7 @@ select 'null in value_partitions.value',
 [ "column used by function",   "sys",  "functions",    "func", "sys",  
"describe_function",    "FUNCTION"      ]
 [ "column used by function",   "sys",  "functions",    "id",   "sys",  
"describe_function",    "FUNCTION"      ]
 [ "column used by function",   "sys",  "functions",    "language",     "sys",  
"describe_function",    "FUNCTION"      ]
+[ "column used by function",   "sys",  "functions",    "mangled_name", "sys",  
"describe_function",    "FUNCTION"      ]
 [ "column used by function",   "sys",  "functions",    "mod",  "sys",  
"describe_function",    "FUNCTION"      ]
 [ "column used by function",   "sys",  "functions",    "name", "sys",  
"describe_function",    "FUNCTION"      ]
 [ "column used by function",   "sys",  "functions",    "schema_id",    "sys",  
"describe_function",    "FUNCTION"      ]
@@ -5433,6 +5434,7 @@ select 'null in value_partitions.value',
 [ "column used by view",       "sys",  "functions",    "func", "sys",  
"fully_qualified_functions",    "VIEW"  ]
 [ "column used by view",       "sys",  "functions",    "id",   "sys",  
"fully_qualified_functions",    "VIEW"  ]
 [ "column used by view",       "sys",  "functions",    "language",     "sys",  
"fully_qualified_functions",    "VIEW"  ]
+[ "column used by view",       "sys",  "functions",    "mangled_name", "sys",  
"fully_qualified_functions",    "VIEW"  ]
 [ "column used by view",       "sys",  "functions",    "mod",  "sys",  
"fully_qualified_functions",    "VIEW"  ]
 [ "column used by view",       "sys",  "functions",    "name", "sys",  
"fully_qualified_functions",    "VIEW"  ]
 [ "column used by view",       "sys",  "functions",    "schema_id",    "sys",  
"fully_qualified_functions",    "VIEW"  ]
diff --git a/sql/test/emptydb/Tests/check.stable.out.32bit 
b/sql/test/emptydb/Tests/check.stable.out.32bit
--- a/sql/test/emptydb/Tests/check.stable.out.32bit
+++ b/sql/test/emptydb/Tests/check.stable.out.32bit
@@ -4406,6 +4406,7 @@ select 'null in value_partitions.value',
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to