Changeset: 220421593af4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/220421593af4
Modified Files:
sql/backends/monet5/sql_upgrades.c
sql/storage/bat/bat_logger.c
sql/storage/store.c
Branch: mangled
Log Message:
Add upgrade code.
diffs (truncated from 663 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
@@ -4511,6 +4511,291 @@ 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;
+
+ (void) sql;
+ (void) prev_schema;
+ (void) systabfixed;
+
+ if ((buf = GDKmalloc(bufsize)) == NULL)
+ 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, "dump_comments");
+ t->system = 0;
+ t = mvc_bind_table(sql, s, "describe_comments");
+ t->system = 0;
+ t = mvc_bind_table(sql, s, "describe_privileges");
+ t->system = 0;
+ t = mvc_bind_table(sql, s, "fully_qualified_functions");
+ t->system = 0;
+ t = mvc_bind_table(sql, s, "dump_functions");
+ t->system = 0;
+ t = mvc_bind_table(sql, s, "describe_functions");
+ t->system = 0;
+ t = mvc_bind_table(sql, s, "dump_function_grants");
+ t->system = 0;
+
+ pos += snprintf(buf + pos, bufsize - pos,
+ "DROP FUNCTION sys.dump_database;\n"
+ "DROP VIEW sys.dump_comments;\n"
+ "CREATE OR REPLACE 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, sys.FQN(s.name,
f.sqlname) FROM sys.functions f, sys.function_types ft, sys.schemas s WHERE
f.type = ft.function_type_id AND f.schema_id = s.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"
+ "DROP VIEW sys.describe_privileges;\n"
+ "CREATE OR REPLACE 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"
+ "s.name || '.' || f.sqlname ||
'()'\n"
+ "ELSE\n"
+ "s.name || '.' || f.sqlname ||
'(' || 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"
+ "DROP VIEW dump_functions;\n"
+ "CREATE OR REPLACE VIEW sys.describe_functions AS\n"
+ "WITH func_args_all(func_id, number, max_number,
func_arg) AS\n"
+ "(\n"
+ "SELECT\n"
+ "func_id,\n"
+ "number,\n"
+ "max(number) OVER (PARTITION BY func_id
ORDER BY number DESC),\n"
+ "group_concat(sys.dq(name) || ' ' ||
sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY
func_id ORDER BY number)\n"
+ "FROM sys.args\n"
+ "WHERE inout = 1\n"
+ "),\n"
+ "func_args(func_id, func_arg) AS\n"
+ "(\n"
+ "SELECT func_id, func_arg\n"
+ "FROM func_args_all\n"
+ "WHERE number = max_number\n"
+ "),\n"
+ "func_rets_all(func_id, number, max_number, func_ret,
func_ret_type) AS\n"
+ "(\n"
+ "SELECT\n"
+ "func_id,\n"
+ "number,\n"
+ "max(number) OVER (PARTITION BY func_id
ORDER BY number DESC),\n"
+ "group_concat(sys.dq(name) || ' ' ||
sys.describe_type(type, type_digits, type_scale),', ') OVER (PARTITION BY
func_id ORDER BY number),\n"
+ "group_concat(sys.describe_type(type,
type_digits, type_scale),', ') OVER (PARTITION BY func_id ORDER BY number)\n"
+ "FROM sys.args\n"
+ "WHERE inout = 0\n"
+ "),\n"
+ "func_rets(func_id, func_ret, func_ret_type) AS\n"
+ "(\n"
+ "SELECT\n"
+ "func_id,\n"
+ "func_ret,\n"
+ "func_ret_type\n"
+ "FROM func_rets_all\n"
+ "WHERE number = max_number\n"
+ ")\n"
+ "SELECT\n"
+ "f.id o,\n"
+ "s.name sch,\n"
+ "f.sqlname fun,\n"
+ "CASE WHEN f.language IN (1, 2) THEN f.func
ELSE 'CREATE ' || ft.function_type_keyword || ' ' || sys.FQN(s.name, f.sqlname)
|| '(' || coalesce(fa.func_arg, '') || ')' || CASE WHEN f.type = 5 THEN '
RETURNS TABLE (' || coalesce(fr.func_ret, '') || ')' WHEN f.type IN (1,3) THEN
' RETURNS ' || fr.func_ret_type ELSE '' END || CASE WHEN fl.language_keyword IS
NULL THEN '' ELSE ' LANGUAGE ' || fl.language_keyword END || ' ' || f.func END
def\n"
+ "FROM sys.functions f\n"
+ "LEFT OUTER JOIN func_args fa ON fa.func_id =
f.id\n"
+ "LEFT OUTER JOIN func_rets fr ON fr.func_id =
f.id\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"
+ "WHERE s.name <> 'tmp' AND NOT f.system;\n"
+ "CREATE VIEW sys.dump_functions AS\n"
+ "SELECT f.o o, sys.schema_guard(f.sch, f.fun, f.def)
stmt,\n"
+ "f.sch schema_name,\n"
+ "f.fun function_name\n"
+ "FROM sys.describe_functions f;\n"
+ "UPDATE sys.functions SET system = false WHERE system <> false
AND sqlname in ('describe_function') and schema_id = (SELECT id FROM
sys.schemas WHERE name = 'sys');\n"
+ "DROP FUNCTION sys.describe_function;\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.sqlname,
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.sqlname=functionName AND
s.name = schemaName;\n"
+ "END;\n"
+ "UPDATE sys.functions SET system = true WHERE system = false
AND sqlname in ('describe_function') and schema_id = (SELECT id FROM
sys.schemas WHERE name = 'sys');\n"
+ "CREATE OR REPLACE VIEW sys.dump_function_grants AS\n"
+ "WITH func_args_all(func_id, number, max_number,
func_arg) AS\n"
+ "(SELECT a.func_id,\n"
+ "a.number,\n"
+ "max(a.number) OVER (PARTITION BY a.func_id
ORDER BY a.number DESC),\n"
+ "group_concat(sys.describe_type(a.type,
a.type_digits, a.type_scale), ', ') OVER (PARTITION BY a.func_id ORDER BY
a.number)\n"
+ "FROM sys.args a\n"
+ "WHERE a.inout = 1),\n"
+ "func_args(func_id, func_arg) AS\n"
+ "(SELECT func_id, func_arg FROM func_args_all WHERE
number = max_number)\n"
+ "SELECT\n"
+ "'GRANT ' || pc.privilege_code_name || ' ON ' ||
ft.function_type_keyword || ' '\n"
+ "|| sys.FQN(s.name, f.sqlname) || '(' ||
coalesce(fa.func_arg, '') || ') TO '\n"
+ "|| ifthenelse(a.name = 'public', 'PUBLIC',
sys.dq(a.name))\n"
+ "|| CASE WHEN p.grantable = 1 THEN ' WITH GRANT
OPTION' ELSE '' END || ';' stmt,\n"
+ "s.name schema_name,\n"
+ "f.sqlname function_name,\n"
+ "a.name grantee\n"
+ "FROM sys.schemas s,\n"
+ "sys.functions f LEFT OUTER JOIN func_args fa
ON f.id = fa.func_id,\n"
+ "sys.auths a,\n"
+ "sys.privileges p,\n"
+ "sys.auths g,\n"
+ "sys.function_types ft,\n"
+ "sys.privilege_codes pc\n"
+ "WHERE s.id = f.schema_id\n"
+ "AND f.id = p.obj_id\n"
+ "AND p.auth_id = a.id\n"
+ "AND p.grantor = g.id\n"
+ "AND p.privileges = pc.privilege_code_id\n"
+ "AND f.type = ft.function_type_id\n"
+ "AND NOT f.system\n"
+ "ORDER BY s.name, f.sqlname, a.name, g.name,
p.grantable;\n"
+ "CREATE FUNCTION sys.dump_database(describe BOOLEAN)
RETURNS TABLE(o int, stmt STRING)\n"
+ "BEGIN\n"
+ "SET SCHEMA sys;\n"
+ "TRUNCATE sys.dump_statements;\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"
+ "--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"
+ "IF NOT DESCRIBE THEN\n"
+ "CALL sys.dump_table_data();\n"
+ "END IF;\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"
+ "INSERT INTO sys.dump_statements VALUES ((SELECT
COUNT(*) FROM sys.dump_statements) + 1, 'COMMIT;');\n"
+ "RETURN sys.dump_statements;\n"
+ "END;\n"
+ "UPDATE sys._tables SET system = true WHERE\n"
+ " system <> true AND\n"
+ " schema_id = (SELECT id FROM sys.schemas WHERE name =
'sys') AND\n"
+ " name IN ('\n"
+ " dump_comments',\n"
+ "'describe_comments',\n"
+ "'describe_privileges',\n"
+ "'storagemodelinput',\n"
+ "'fully_qualified_functions',\n"
+ "'dump_functions'\n"
+ "'describe_functions'\n"
+ "'dump_function_grants'\n"
+ ");\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)
{
@@ -4716,6 +5001,13 @@ SQLupgrades(Client c, mvc *m)
return -1;
}
+ if ((err = sql_update_default(c, m, prev_schema, &systabfixed)) !=
NULL) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list