Changeset: 993e35f80e9e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=993e35f80e9e Modified Files: clients/mapiclient/dump.c Branch: system-functions Log Message:
Use sys.functions.system if the server supports it. This also works around a bug in mserver5. diffs (172 lines): diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c --- a/clients/mapiclient/dump.c +++ b/clients/mapiclient/dump.c @@ -116,10 +116,10 @@ has_hugeint(Mapi mid) { MapiHdl hdl; int ret; - static int hashge = -1; + static int answer = -1; - if (hashge >= 0) - return hashge; + if (answer >= 0) + return answer; if ((hdl = mapi_query(mid, "SELECT id " @@ -135,8 +135,56 @@ has_hugeint(Mapi mid) if (mapi_error(mid)) goto bailout; mapi_close_handle(hdl); - hashge = ret; - return ret; + answer = ret; + return answer; + + bailout: + if (hdl) { + if (mapi_result_error(hdl)) + mapi_explain_result(hdl, stderr); + else + mapi_explain_query(hdl, stderr); + mapi_close_handle(hdl); + } else + mapi_explain(mid, stderr); + return 0; +} + +/* return TRUE if the sys.functions table has a column called system */ +static int +has_funcsys(Mapi mid) +{ + MapiHdl hdl; + int ret; + static int answer = -1; + + if (answer >= 0) + return answer; + + if ((hdl = mapi_query(mid, + "SELECT id " + "FROM sys._columns " + "WHERE name = 'system' " + "AND table_id = (" + " SELECT id" + " FROM sys._tables" + " WHERE name = 'functions'" + " AND schema_id = (" + " SELECT id" + " FROM sys.schemas" + " WHERE name = 'sys'))")) == NULL || + mapi_error(mid)) + goto bailout; + ret = mapi_get_row_count(hdl) == 1; + while ((mapi_fetch_row(hdl)) != 0) { + if (mapi_error(mid)) + goto bailout; + } + if (mapi_error(mid)) + goto bailout; + mapi_close_handle(hdl); + answer = ret; + return answer; bailout: if (hdl) { @@ -1544,15 +1592,19 @@ dump_functions(Mapi mid, stream *toConso "FROM sys.schemas s " "JOIN sys.functions f ON s.id = f.schema_id " "LEFT OUTER JOIN sys.comments rem ON f.id = rem.id " - "WHERE f.language > 0 "); + "WHERE f.language > 0"); if (sname) - q += snprintf(q, end_q - q, "AND s.name = '%s' ", sname); + q += snprintf(q, end_q - q, " AND s.name = '%s'", sname); if (fname) - q += snprintf(q, end_q - q, "AND f.name = '%s' ", fname); + q += snprintf(q, end_q - q, " AND f.name = '%s'", fname); if (id) - q += snprintf(q, end_q - q, "AND f.id = %s ", id); - if (!wantSystem) - q += snprintf(q, end_q - q, "AND f.id NOT IN (SELECT function_id FROM sys.systemfunctions) "); + q += snprintf(q, end_q - q, " AND f.id = %s", id); + if (!wantSystem) { + if (has_funcsys(mid)) + q += snprintf(q, end_q - q, " AND NOT f.system"); + else + q += snprintf(q, end_q - q, " AND f.id NOT IN (SELECT function_id FROM sys.systemfunctions)"); + } q += snprintf(q, end_q - q, " ORDER BY f.func, f.id"); hdl = mapi_query(mid, query); @@ -1675,6 +1727,25 @@ dump_database(Mapi mid, stream *toConsol "p.grantor = g.id " "ORDER BY s.name, t.name, c.name, a.name, g.name, p.grantable"; const char *function_grants = + has_funcsys(mid) ? + "SELECT s.name, f.name, a.name, " + "CASE p.privileges " + "WHEN 1 THEN 'SELECT' " + "WHEN 2 THEN 'UPDATE' " + "WHEN 4 THEN 'INSERT' " + "WHEN 8 THEN 'DELETE' " + "WHEN 16 THEN 'EXECUTE' " + "WHEN 32 THEN 'GRANT' END, " + "g.name, p.grantable " + "FROM sys.schemas s, sys.functions f, " + "sys.auths a, sys.privileges p, sys.auths g " + "WHERE s.id = f.schema_id AND " + "f.id = p.obj_id AND " + "p.auth_id = a.id AND " + "p.grantor = g.id " + "AND NOT f.system " + "ORDER BY s.name, f.name, a.name, g.name, p.grantable" + : "SELECT s.name, f.name, a.name, " "CASE p.privileges " "WHEN 1 THEN 'SELECT' " @@ -1751,6 +1822,43 @@ dump_database(Mapi mid, stream *toConsol /* we must dump views, functions and triggers in order of * creation since they can refer to each other */ const char *views_functions_triggers = + has_funcsys(mid) ? + "WITH vft (sname, name, id, query, remark) AS (" + "SELECT s.name AS sname, " + "t.name AS name, " + "t.id AS id, " + "t.query AS query, " + "rem.remark AS remark " + "FROM sys.schemas s, " + "sys._tables t LEFT OUTER JOIN sys.comments rem ON t.id = rem.id " + "WHERE t.type = 1 AND " + "t.system = FALSE AND " + "s.id = t.schema_id AND " + "s.name <> 'tmp' " + "UNION " + "SELECT s.name AS sname, " + "f.name AS name, " + "f.id AS id, " + "NULL AS query, " + "NULL AS remark " /* emitted separately */ + "FROM sys.schemas s, " + "sys.functions f " + "WHERE s.id = f.schema_id " + "AND NOT f.system " + "UNION " + "SELECT s.name AS sname, " + "tr.name AS name, " + "tr.id AS id, " + "tr.\"statement\" AS query, " + "NULL AS remark " /* not available yet */ + "FROM sys.triggers tr, " + "sys.schemas s, " + "sys._tables t " + "WHERE s.id = t.schema_id AND " + "t.id = tr.table_id AND t.system = FALSE" + ") " + "SELECT id, sname, name, query, remark FROM vft ORDER BY id" + : "WITH vft (sname, name, id, query, remark) AS (" "SELECT s.name AS sname, " "t.name AS name, " _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list