Changeset: 894bcfe0f18f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/894bcfe0f18f
Modified Files:
        clients/mapiclient/dump.c
        sql/test/testdb-previous-upgrade-hge/Tests/dump.stable.out
        sql/test/testdb-previous-upgrade/Tests/dump.stable.out
        sql/test/testdb-upgrade-hge/Tests/dump.stable.out
        sql/test/testdb-upgrade/Tests/dump.stable.out
        sql/test/testdb/Tests/dump-nogeom.stable.out
        sql/test/testdb/Tests/dump.stable.out
Branch: Sep2022
Log Message:

Improve dump of function grants: include argument types.
Also, grant to PUBLIC instead of "public".


diffs (213 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -2611,24 +2611,42 @@ dump_database(Mapi mid, stream *toConsol
                  "AND p.grantable = go.id "
                "ORDER BY s.name, t.name, c.name, a.name, g.name, p.grantable";
        const char *function_grants =
-               "SELECT s.name, f.name, a.name, "
-                      "pc.privilege_code_name, "
-                      "g.name, go.opt, "
-                      "ft.function_type_keyword "
-               "FROM sys.schemas s, sys.functions f, "
-                    "sys.auths a, sys.privileges p, sys.auths g, "
-                    "sys.function_types ft, "
-                    "sys.privilege_codes pc, "
-                    "(VALUES (0, ''), (1, ' WITH GRANT OPTION')) AS go (id, 
opt) "
-               "WHERE s.id = f.schema_id "
+               "SELECT f.id, "
+                          "s.name, "
+                          "f.name, "
+                          "a.type, "
+                          "a.type_digits, "
+                          "a.type_scale, "
+                          "a.inout, "
+                          "a.number, "
+                          "au.name, "
+                          "pc.privilege_code_name, "
+                          "go.opt, "
+                          "ft.function_type_keyword "
+               "FROM sys.schemas s, "
+                        "sys.functions f LEFT OUTER JOIN sys.args a ON f.id = 
a.func_id, "
+                        "sys.auths au, "
+                        "sys.privileges p, "
+                        "sys.auths g, "
+                        "sys.function_types ft, "
+                        "sys.privilege_codes pc, "
+                        "(VALUES (0, ''), (1, ' WITH GRANT OPTION')) AS go 
(id, opt) "
+               "WHERE NOT f.system "
+                 "AND s.id = f.schema_id "
                  "AND f.id = p.obj_id "
-                 "AND p.auth_id = a.id "
+                 "AND p.auth_id = au.id "
                  "AND p.grantor = g.id "
                  "AND p.privileges = pc.privilege_code_id "
                  "AND f.type = ft.function_type_id "
-                 "AND NOT f.system "
                  "AND p.grantable = go.id "
-               "ORDER BY s.name, f.name, a.name, g.name, p.grantable";
+               "ORDER BY s.name, "
+                                "f.name, "
+                                "au.name, "
+                                "g.name, "
+                                "p.grantable, "
+                                "f.id, "
+                                "a.inout DESC, "
+                                "a.number";
        const char *global_grants =
                "SELECT a.name, pc.grnt, g.name, go.opt "
                "FROM sys.privileges p, "
@@ -2758,6 +2776,9 @@ dump_database(Mapi mid, stream *toConsol
        char *curschema = NULL;
        MapiHdl hdl = NULL;
        int rc = 0;
+       int lastfid = 0;
+       const char *sep;
+       bool hashge = has_hugeint(mid);
 
        /* start a transaction for the dump */
        mnstr_printf(toConsole, "%s;\n", start_trx);
@@ -3269,7 +3290,7 @@ dump_database(Mapi mid, stream *toConsol
                if (priv == 79) {
                        mnstr_printf(toConsole, " ALL PRIVILEGES");
                } else {
-                       const char *sep = "";
+                       sep = "";
 
                        if (priv & 1) {
                                mnstr_printf(toConsole, "%s SELECT", sep);
@@ -3327,7 +3348,11 @@ dump_database(Mapi mid, stream *toConsol
                dquoted_print(toConsole, cname, ") ON ");
                dquoted_print(toConsole, schema, ".");
                dquoted_print(toConsole, tname, " TO ");
-               dquoted_print(toConsole, aname, grantable);
+               if (strcmp(aname, "public") == 0) {
+                       mnstr_printf(toConsole, "PUBLIC%s", grantable);
+               } else {
+                       dquoted_print(toConsole, aname, grantable);
+               }
                mnstr_printf(toConsole, ";\n");
        }
        if (mapi_error(mid))
@@ -3338,21 +3363,44 @@ dump_database(Mapi mid, stream *toConsol
            mapi_error(mid))
                goto bailout;
 
+       sep = "";
        while (mapi_fetch_row(hdl) != 0) {
-               const char *schema = mapi_fetch_field(hdl, 0);
-               const char *fname = mapi_fetch_field(hdl, 1);
-               const char *aname = mapi_fetch_field(hdl, 2);
-               const char *priv = mapi_fetch_field(hdl, 3);
-               const char *grantable = mapi_fetch_field(hdl, 5);
-               const char *ftype = mapi_fetch_field(hdl, 6);
+               const char *fid = mapi_fetch_field(hdl, 0);
+               const char *schema = mapi_fetch_field(hdl, 1);
+               const char *fname = mapi_fetch_field(hdl, 2);
+               const char *argtype = mapi_fetch_field(hdl, 3);
+               const char *argdigits = mapi_fetch_field(hdl, 4);
+               const char *argscale = mapi_fetch_field(hdl, 5);
+               const char *arginout = mapi_fetch_field(hdl, 6);
+               const char *argnumber = mapi_fetch_field(hdl, 7);
+               const char *aname = mapi_fetch_field(hdl, 8);
+               const char *priv = mapi_fetch_field(hdl, 9);
+               const char *grantable = mapi_fetch_field(hdl, 10);
+               const char *ftype = mapi_fetch_field(hdl, 11);
 
                if (sname != NULL && strcmp(schema, sname) != 0)
                        continue;
-               mnstr_printf(toConsole, "GRANT %s ON %s ", priv, ftype);
-               dquoted_print(toConsole, schema, ".");
-               dquoted_print(toConsole, fname, " TO ");
-               dquoted_print(toConsole, aname, grantable);
-               mnstr_printf(toConsole, ";\n");
+               int thisfid = atoi(fid);
+               if (lastfid != thisfid) {
+                       lastfid = thisfid;
+                       sep = "";
+                       mnstr_printf(toConsole, "GRANT %s ON %s ", priv, ftype);
+                       dquoted_print(toConsole, schema, ".");
+                       dquoted_print(toConsole, fname, "(");
+               }
+               if (arginout != NULL && strcmp(arginout, "1") == 0) {
+                       mnstr_printf(toConsole, "%s", sep);
+                       dump_type(mid, toConsole, argtype, argdigits, argscale, 
hashge);
+                       sep = ", ";
+               } else if (argnumber == NULL || strcmp(argnumber, "0") == 0) {
+                       mnstr_printf(toConsole, ") TO ");
+                       if (strcmp(aname, "public") == 0) {
+                               mnstr_printf(toConsole, "PUBLIC%s", grantable);
+                       } else {
+                               dquoted_print(toConsole, aname, grantable);
+                       }
+                       mnstr_printf(toConsole, ";\n");
+               }
        }
        if (mapi_error(mid))
                goto bailout;
diff --git a/sql/test/testdb-previous-upgrade-hge/Tests/dump.stable.out 
b/sql/test/testdb-previous-upgrade-hge/Tests/dump.stable.out
--- a/sql/test/testdb-previous-upgrade-hge/Tests/dump.stable.out
+++ b/sql/test/testdb-previous-upgrade-hge/Tests/dump.stable.out
@@ -101438,6 +101438,6 @@ ALTER TABLE "testschema"."keytest2" ADD 
 ALTER TABLE "testschema"."selfref" ADD CONSTRAINT "selfref_parentid_fkey" 
FOREIGN KEY ("parentid") REFERENCES "testschema"."selfref" ("id");
 ALTER SEQUENCE "testschema"."selfref_seq" RESTART WITH 7 NO CYCLE;
 ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 
5 MAXVALUE 10 CYCLE;
-GRANT EXECUTE ON FUNCTION "testschema"."keyjoin" TO "public";
+GRANT EXECUTE ON FUNCTION "testschema"."keyjoin"() TO PUBLIC;
 SET SCHEMA "sys";
 COMMIT;
diff --git a/sql/test/testdb-previous-upgrade/Tests/dump.stable.out 
b/sql/test/testdb-previous-upgrade/Tests/dump.stable.out
--- a/sql/test/testdb-previous-upgrade/Tests/dump.stable.out
+++ b/sql/test/testdb-previous-upgrade/Tests/dump.stable.out
@@ -101438,6 +101438,6 @@ ALTER TABLE "testschema"."keytest2" ADD 
 ALTER TABLE "testschema"."selfref" ADD CONSTRAINT "selfref_parentid_fkey" 
FOREIGN KEY ("parentid") REFERENCES "testschema"."selfref" ("id");
 ALTER SEQUENCE "testschema"."selfref_seq" RESTART WITH 7 NO CYCLE;
 ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 
5 MAXVALUE 10 CYCLE;
-GRANT EXECUTE ON FUNCTION "testschema"."keyjoin" TO "public";
+GRANT EXECUTE ON FUNCTION "testschema"."keyjoin"() TO PUBLIC;
 SET SCHEMA "sys";
 COMMIT;
diff --git a/sql/test/testdb-upgrade-hge/Tests/dump.stable.out 
b/sql/test/testdb-upgrade-hge/Tests/dump.stable.out
--- a/sql/test/testdb-upgrade-hge/Tests/dump.stable.out
+++ b/sql/test/testdb-upgrade-hge/Tests/dump.stable.out
@@ -101441,6 +101441,6 @@ ALTER SEQUENCE "testschema"."selfref_seq
 ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 
5 MAXVALUE 10 CYCLE;
 GRANT SELECT("string1") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
 GRANT SELECT("string3") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
-GRANT EXECUTE ON FUNCTION "testschema"."keyjoin" TO "public";
+GRANT EXECUTE ON FUNCTION "testschema"."keyjoin"() TO PUBLIC;
 SET SCHEMA "sys";
 COMMIT;
diff --git a/sql/test/testdb-upgrade/Tests/dump.stable.out 
b/sql/test/testdb-upgrade/Tests/dump.stable.out
--- a/sql/test/testdb-upgrade/Tests/dump.stable.out
+++ b/sql/test/testdb-upgrade/Tests/dump.stable.out
@@ -101441,6 +101441,6 @@ ALTER SEQUENCE "testschema"."selfref_seq
 ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 
5 MAXVALUE 10 CYCLE;
 GRANT SELECT("string1") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
 GRANT SELECT("string3") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
-GRANT EXECUTE ON FUNCTION "testschema"."keyjoin" TO "public";
+GRANT EXECUTE ON FUNCTION "testschema"."keyjoin"() TO PUBLIC;
 SET SCHEMA "sys";
 COMMIT;
diff --git a/sql/test/testdb/Tests/dump-nogeom.stable.out 
b/sql/test/testdb/Tests/dump-nogeom.stable.out
--- a/sql/test/testdb/Tests/dump-nogeom.stable.out
+++ b/sql/test/testdb/Tests/dump-nogeom.stable.out
@@ -101423,6 +101423,6 @@ ALTER SEQUENCE "testschema"."selfref_seq
 ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 
5 MAXVALUE 10 CYCLE;
 GRANT SELECT("string1") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
 GRANT SELECT("string3") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
-GRANT EXECUTE ON FUNCTION "testschema"."keyjoin" TO "public";
+GRANT EXECUTE ON FUNCTION "testschema"."keyjoin"() TO PUBLIC;
 SET SCHEMA "sys";
 COMMIT;
diff --git a/sql/test/testdb/Tests/dump.stable.out 
b/sql/test/testdb/Tests/dump.stable.out
--- a/sql/test/testdb/Tests/dump.stable.out
+++ b/sql/test/testdb/Tests/dump.stable.out
@@ -101441,6 +101441,6 @@ ALTER SEQUENCE "testschema"."selfref_seq
 ALTER SEQUENCE "testschema"."test_seq" RESTART WITH 8 INCREMENT BY 3 MINVALUE 
5 MAXVALUE 10 CYCLE;
 GRANT SELECT("string1") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
 GRANT SELECT("string3") ON "testschema"."smallstring" TO "testuser" WITH GRANT 
OPTION;
-GRANT EXECUTE ON FUNCTION "testschema"."keyjoin" TO "public";
+GRANT EXECUTE ON FUNCTION "testschema"."keyjoin"() TO PUBLIC;
 SET SCHEMA "sys";
 COMMIT;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to