This is an automated email from the ASF dual-hosted git repository. tuhaihe pushed a commit to branch REL_2_STABLE in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 8bc719d8cfc98d5f6c1877e32d31f5072a11ce33 Author: Tom Lane <[email protected]> AuthorDate: Fri Dec 31 11:39:26 2021 -0500 pg_dump: minor performance improvements from eliminating sub-SELECTs. Backported from PG15 d5e8930f50e31d836d84b353b9dadedd5007bb70 Conflicts resolved: * Updated getExtProtocols to use new method of role name lookups. Original commit message follows: Get rid of the "username_subquery" mechanism in favor of doing local lookups of role names from role OIDs. The PG backend isn't terribly smart about scalar SubLinks in SELECT output lists, so this offers a small performance improvement, at least in installations with more than a couple of users. In any case the old method didn't make for particularly readable SQL code. While at it, I removed the various custom warning messages about failing to find an object's owner, in favor of just fatal'ing in the local lookup function. AFAIK there is no reason any longer to treat that as anything but a catalog-corruption case, and certainly no reason to make translators deal with a dozen different messages where one would do. (If it turns out that fatal() is indeed a bad idea, we can back off to issuing pg_log_warning() and returning an empty string, resulting in the same behavior as before, except more consistent.) Also drop an entirely unnecessary sub-SELECT to check on the pg_depend status of a sequence relation: we already have a LEFT JOIN to fetch the row of interest in the FROM clause. Discussion: https://postgr.es/m/[email protected] --- src/bin/pg_dump/pg_dump.c | 489 ++++++++++++++++++++++------------------------ src/bin/pg_dump/pg_dump.h | 43 ++-- 2 files changed, 260 insertions(+), 272 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 1f61c046578..69a05f30660 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -69,6 +69,12 @@ #include "pg_dump.h" #include "storage/block.h" +typedef struct +{ + Oid roleoid; /* role's OID */ + const char *rolename; /* role's name */ +} RoleNameItem; + typedef struct { const char *descr; /* comment for an object */ @@ -103,9 +109,6 @@ bool isGPbackend; /* END MPP ADDITION */ -/* subquery used to convert user ID (eg, datdba) to user name */ -static const char *username_subquery; - /* * For 8.0 and earlier servers, pulled from pg_database, for 8.1+ we use * FirstNormalObjectId - 1. @@ -161,6 +164,10 @@ static DumpId binary_upgrade_dumpid; static bool have_extra_float_digits = false; static int extra_float_digits; +/* sorted table of role names */ +static RoleNameItem *rolenames = NULL; +static int nrolenames = 0; + /* sorted table of comments */ static CommentItem *comments = NULL; static int ncomments = 0; @@ -219,6 +226,8 @@ static void guessConstraintInheritance(TableInfo *tblinfo, int numTables); static void dumpComment(Archive *fout, const char *type, const char *name, const char *namespace, const char *owner, CatalogId catalogId, int subid, DumpId dumpId); +static const char *getRoleName(const char *roleoid_str); +static void collectRoleNames(Archive *fout); static void getAdditionalACLs(Archive *fout); static int findComments(Archive *fout, Oid classoid, Oid objoid, CommentItem **items); @@ -1011,8 +1020,6 @@ main(int argc, char **argv) if (fout->isStandby) dopt.no_unlogged_table_data = true; - username_subquery = "SELECT rolname FROM pg_catalog.pg_roles WHERE oid ="; - /* * Remember whether or not this GP database supports partitioning. */ @@ -1103,6 +1110,11 @@ main(int argc, char **argv) if (dopt.include_everything && !dopt.schemaOnly && !dopt.dontOutputBlobs) dopt.outputBlobs = true; + /* + * Collect role names so we can map object owner OIDs to names. + */ + collectRoleNames(fout); + /* * Now scan the database and create DumpableObject structs for all the * objects we intend to dump. @@ -3388,7 +3400,7 @@ dumpDatabase(Archive *fout) int i_tableoid, i_oid, i_datname, - i_dba, + i_datdba, i_encoding, i_collate, i_ctype, @@ -3422,7 +3434,7 @@ dumpDatabase(Archive *fout) if (fout->remoteVersion >= 90300) { appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " + "datdba, " "pg_encoding_to_char(encoding) AS encoding, " "datcollate, datctype, datfrozenxid, datminmxid, " "datacl, acldefault('d', datdba) AS acldefault, " @@ -3431,13 +3443,12 @@ dumpDatabase(Archive *fout) "shobj_description(oid, 'pg_database') AS description " "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); + "WHERE datname = current_database()"); } else if (fout->remoteVersion >= 90200) { appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " + "datdba, " "pg_encoding_to_char(encoding) AS encoding, " "datcollate, datctype, datfrozenxid, 0 AS datminmxid, " "datacl, acldefault('d', datdba) AS acldefault, " @@ -3446,13 +3457,12 @@ dumpDatabase(Archive *fout) "shobj_description(oid, 'pg_database') AS description " "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); + "WHERE datname = current_database()"); } else if (fout->remoteVersion >= 80400) { appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " + "datdba, " "pg_encoding_to_char(encoding) AS encoding, " "datcollate, datctype, datfrozenxid, 0 AS datminmxid, " "datacl, NULL AS acldefault, " @@ -3461,13 +3471,12 @@ dumpDatabase(Archive *fout) "shobj_description(oid, 'pg_database') AS description " "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); + "WHERE datname = current_database()"); } else { appendPQExpBuffer(dbQry, "SELECT tableoid, oid, datname, " - "(%s datdba) AS dba, " + "datdba, " "pg_encoding_to_char(encoding) AS encoding, " "NULL AS datcollate, NULL AS datctype, datfrozenxid, 0 AS datminmxid, " "datacl, NULL AS acldefault, " @@ -3476,8 +3485,7 @@ dumpDatabase(Archive *fout) "shobj_description(oid, 'pg_database') AS description " "FROM pg_database " - "WHERE datname = current_database()", - username_subquery); + "WHERE datname = current_database()"); } res = ExecuteSqlQueryForSingleRow(fout, dbQry->data); @@ -3485,7 +3493,7 @@ dumpDatabase(Archive *fout) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_datname = PQfnumber(res, "datname"); - i_dba = PQfnumber(res, "dba"); + i_datdba = PQfnumber(res, "datdba"); i_encoding = PQfnumber(res, "encoding"); i_collate = PQfnumber(res, "datcollate"); i_ctype = PQfnumber(res, "datctype"); @@ -3500,7 +3508,7 @@ dumpDatabase(Archive *fout) dbCatId.tableoid = atooid(PQgetvalue(res, 0, i_tableoid)); dbCatId.oid = atooid(PQgetvalue(res, 0, i_oid)); datname = PQgetvalue(res, 0, i_datname); - dba = PQgetvalue(res, 0, i_dba); + dba = getRoleName(PQgetvalue(res, 0, i_datdba)); encoding = PQgetvalue(res, 0, i_encoding); collate = PQgetvalue(res, 0, i_collate); ctype = PQgetvalue(res, 0, i_ctype); @@ -3983,17 +3991,15 @@ getBlobs(Archive *fout) if (fout->remoteVersion >= 90200) { appendPQExpBuffer(blobQry, - "SELECT oid, (%s lomowner) AS rolname, lomacl, " + "SELECT oid, lomowner, lomacl, " "acldefault('L', lomowner) AS acldefault " - "FROM pg_largeobject_metadata", - username_subquery); + "FROM pg_largeobject_metadata"); } else if (fout->remoteVersion >= 90000) appendPQExpBuffer(blobQry, - "SELECT oid, (%s lomowner) AS rolname, lomacl, " + "SELECT oid, lomowner, lomacl, " "NULL AS acldefault " - "FROM pg_largeobject_metadata", - username_subquery); + "FROM pg_largeobject_metadata"); else appendPQExpBufferStr(blobQry, "SELECT DISTINCT loid AS oid, " @@ -4004,7 +4010,7 @@ getBlobs(Archive *fout) res = ExecuteSqlQuery(fout, blobQry->data, PGRES_TUPLES_OK); i_oid = PQfnumber(res, "oid"); - i_lomowner = PQfnumber(res, "rolname"); + i_lomowner = PQfnumber(res, "lomowner"); i_lomacl = PQfnumber(res, "lomacl"); i_acldefault = PQfnumber(res, "acldefault"); @@ -4027,7 +4033,7 @@ getBlobs(Archive *fout) binfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); binfo[i].dacl.privtype = 0; binfo[i].dacl.initprivs = NULL; - binfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_lomowner)); + binfo[i].rolname = getRoleName(PQgetvalue(res, i, i_lomowner)); /* Blobs have data */ binfo[i].dobj.components |= DUMP_COMPONENT_DATA; @@ -4494,7 +4500,7 @@ getPublications(Archive *fout, int *numPublications) int i_tableoid; int i_oid; int i_pubname; - int i_rolname; + int i_pubowner; int i_puballtables; int i_pubinsert; int i_pubupdate; @@ -4518,24 +4524,15 @@ getPublications(Archive *fout, int *numPublications) if (fout->remoteVersion >= 130000) appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " - "(%s p.pubowner) AS rolname, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubviaroot " - "FROM pg_publication p", - username_subquery); - else if (fout->remoteVersion >= 110000) - appendPQExpBuffer(query, - "SELECT p.tableoid, p.oid, p.pubname, " - "(%s p.pubowner) AS rolname, " + "p.pubowner, " "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false AS pubviaroot " - "FROM pg_publication p", - username_subquery); + "FROM pg_publication p"); else appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, p.pubname, " - "(%s p.pubowner) AS rolname, " + "p.pubowner, " "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false AS pubviaroot " - "FROM pg_publication p", - username_subquery); + "FROM pg_publication p"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -4544,7 +4541,7 @@ getPublications(Archive *fout, int *numPublications) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_pubname = PQfnumber(res, "pubname"); - i_rolname = PQfnumber(res, "rolname"); + i_pubowner = PQfnumber(res, "pubowner"); i_puballtables = PQfnumber(res, "puballtables"); i_pubinsert = PQfnumber(res, "pubinsert"); i_pubupdate = PQfnumber(res, "pubupdate"); @@ -4562,7 +4559,7 @@ getPublications(Archive *fout, int *numPublications) pubinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid)); AssignDumpId(&pubinfo[i].dobj); pubinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_pubname)); - pubinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + pubinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_pubowner)); pubinfo[i].puballtables = (strcmp(PQgetvalue(res, i, i_puballtables), "t") == 0); pubinfo[i].pubinsert = @@ -4576,10 +4573,6 @@ getPublications(Archive *fout, int *numPublications) pubinfo[i].pubviaroot = (strcmp(PQgetvalue(res, i, i_pubviaroot), "t") == 0); - if (strlen(pubinfo[i].rolname) == 0) - pg_log_warning("owner of publication \"%s\" appears to be invalid", - pubinfo[i].dobj.name); - /* Decide whether we want to dump it */ selectDumpableObject(&(pubinfo[i].dobj), fout); } @@ -4863,7 +4856,7 @@ getSubscriptions(Archive *fout) int i_tableoid; int i_oid; int i_subname; - int i_rolname; + int i_subowner; int i_substream; int i_subconninfo; int i_subslotname; @@ -4896,26 +4889,21 @@ getSubscriptions(Archive *fout) /* Get the subscriptions in current database. */ appendPQExpBuffer(query, - "SELECT s.tableoid, s.oid, s.subname,\n" - " (%s s.subowner) AS rolname,\n" - " s.subconninfo, s.subslotname, s.subsynccommit,\n" - " s.subpublications,\n", - username_subquery); - - if (fout->remoteVersion >= 140000) - appendPQExpBufferStr(query, " s.subbinary,\n"); - else - appendPQExpBufferStr(query, " false AS subbinary,\n"); - + "SELECT s.tableoid, s.oid, s.subname, " + "s.subowner, " + "s.subconninfo, s.subslotname, s.subsynccommit, " + "s.subpublications, "); + if (fout->remoteVersion >= 140000) - appendPQExpBufferStr(query, " s.substream\n"); + appendPQExpBufferStr(query, " s.subbinary, s.substream\n"); else - appendPQExpBufferStr(query, " false AS substream\n"); - - appendPQExpBufferStr(query, - "FROM pg_subscription s\n" - "WHERE s.subdbid = (SELECT oid FROM pg_database\n" - " WHERE datname = current_database())"); + appendPQExpBufferStr(query, " false AS subbinary, false AS substream\n"); + + + appendPQExpBuffer(query, + "FROM pg_subscription s " + "WHERE s.subdbid = (SELECT oid FROM pg_database" + " WHERE datname = current_database())"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -4924,7 +4912,7 @@ getSubscriptions(Archive *fout) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_subname = PQfnumber(res, "subname"); - i_rolname = PQfnumber(res, "rolname"); + i_subowner = PQfnumber(res, "subowner"); i_subconninfo = PQfnumber(res, "subconninfo"); i_subslotname = PQfnumber(res, "subslotname"); i_subsynccommit = PQfnumber(res, "subsynccommit"); @@ -4942,7 +4930,7 @@ getSubscriptions(Archive *fout) subinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid)); AssignDumpId(&subinfo[i].dobj); subinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_subname)); - subinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + subinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_subowner)); subinfo[i].subconninfo = pg_strdup(PQgetvalue(res, i, i_subconninfo)); if (PQgetisnull(res, i, i_subslotname)) subinfo[i].subslotname = NULL; @@ -4957,10 +4945,6 @@ getSubscriptions(Archive *fout) subinfo[i].substream = pg_strdup(PQgetvalue(res, i, i_substream)); - if (strlen(subinfo[i].rolname) == 0) - pg_log_warning("owner of subscription \"%s\" appears to be invalid", - subinfo[i].dobj.name); - /* Decide whether we want to dump it */ selectDumpableObject(&(subinfo[i].dobj), fout); } @@ -5756,7 +5740,7 @@ getNamespaces(Archive *fout, int *numNamespaces) int i_tableoid; int i_oid; int i_nspname; - int i_rolname; + int i_nspowner; int i_nspacl; int i_acldefault; @@ -5768,11 +5752,10 @@ getNamespaces(Archive *fout, int *numNamespaces) */ if (fout->remoteVersion >= 90200) appendPQExpBuffer(query, "SELECT n.tableoid, n.oid, n.nspname, " - "(%s nspowner) AS rolname, " + "n.nspowner, " "n.nspacl, " "acldefault('n', n.nspowner) AS acldefault " - "FROM pg_namespace n", - username_subquery); + "FROM pg_namespace n"); else appendPQExpBuffer(query, "SELECT n.tableoid, n.oid, n.nspname, " "n.nspowner, " @@ -5788,12 +5771,14 @@ getNamespaces(Archive *fout, int *numNamespaces) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_nspname = PQfnumber(res, "nspname"); - i_rolname = PQfnumber(res, "rolname"); + i_nspowner = PQfnumber(res, "nspowner"); i_nspacl = PQfnumber(res, "nspacl"); i_acldefault = PQfnumber(res, "acldefault"); for (i = 0; i < ntups; i++) { + const char *nspowner; + nsinfo[i].dobj.objType = DO_NAMESPACE; nsinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid)); nsinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid)); @@ -5803,7 +5788,9 @@ getNamespaces(Archive *fout, int *numNamespaces) nsinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); nsinfo[i].dacl.privtype = 0; nsinfo[i].dacl.initprivs = NULL; - nsinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + nspowner = PQgetvalue(res, i, i_nspowner); + nsinfo[i].nspowner = atooid(nspowner); + nsinfo[i].rolname = getRoleName(nspowner); /* Decide whether to dump this namespace */ selectDumpableNamespace(&nsinfo[i], fout); @@ -5811,12 +5798,6 @@ getNamespaces(Archive *fout, int *numNamespaces) /* Mark whether namespace has an ACL */ if (!PQgetisnull(res, i, i_nspacl)) nsinfo[i].dobj.components |= DUMP_COMPONENT_ACL; - - - - if (strlen(nsinfo[i].rolname) == 0) - pg_log_warning("owner of schema \"%s\" appears to be invalid", - nsinfo[i].dobj.name); } PQclear(res); @@ -5964,7 +5945,7 @@ getTypes(Archive *fout, int *numTypes) int i_typnamespace; int i_typacl; int i_acldefault; - int i_rolname; + int i_typowner; int i_typelem; int i_typrelid; int i_typrelkind; @@ -5994,7 +5975,7 @@ getTypes(Archive *fout, int *numTypes) appendPQExpBuffer(query, "SELECT t.tableoid, t.oid, t.typname, " "t.typnamespace, t.typacl, " "acldefault('T', t.typowner) AS acldefault, " - "(%s t.typowner) AS rolname, " + "typowner, " "t.typelem, t.typrelid, " "CASE WHEN t.typrelid = 0 THEN ' '::\"char\" " "ELSE (SELECT relkind FROM pg_class WHERE oid = t.typrelid) END AS typrelkind, " @@ -6003,15 +5984,14 @@ getTypes(Archive *fout, int *numTypes) "(SELECT typarray FROM pg_type te WHERE oid = t.typelem) = t.oid AS isarray, " "coalesce(array_to_string(e.typoptions, ', '), '') AS typstorage " "FROM pg_type t " - "LEFT JOIN pg_type_encoding e ON t.oid = e.typid ", - username_subquery); + "LEFT JOIN pg_type_encoding e ON t.oid = e.typid "); } else { appendPQExpBuffer(query, "SELECT t.tableoid, t.oid, t.typname, " "t.typnamespace, NULL AS typacl, " "NULL AS acldefault, " - "(%s t.typowner) AS rolname, " + "typowner, " "t.typelem, t.typrelid, " "CASE WHEN t.typrelid = 0 THEN ' '::\"char\" " "ELSE (SELECT relkind FROM pg_class WHERE oid = t.typrelid) END AS typrelkind, " @@ -6020,8 +6000,7 @@ getTypes(Archive *fout, int *numTypes) "(SELECT typarray FROM pg_type te WHERE oid = t.typelem) = t.oid AS isarray, " "coalesce(array_to_string(e.typoptions, ', '), '') AS typstorage " "FROM pg_type t " - "LEFT JOIN pg_type_encoding e ON t.oid = e.typid ", - username_subquery); + "LEFT JOIN pg_type_encoding e ON t.oid = e.typid "); } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6036,7 +6015,7 @@ getTypes(Archive *fout, int *numTypes) i_typnamespace = PQfnumber(res, "typnamespace"); i_typacl = PQfnumber(res, "typacl"); i_acldefault = PQfnumber(res, "acldefault"); - i_rolname = PQfnumber(res, "rolname"); + i_typowner = PQfnumber(res, "typowner"); i_typelem = PQfnumber(res, "typelem"); i_typrelid = PQfnumber(res, "typrelid"); i_typrelkind = PQfnumber(res, "typrelkind"); @@ -6059,7 +6038,7 @@ getTypes(Archive *fout, int *numTypes) tyinfo[i].dacl.privtype = 0; tyinfo[i].dacl.initprivs = NULL; tyinfo[i].ftypname = NULL; /* may get filled later */ - tyinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + tyinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_typowner)); tyinfo[i].typelem = atooid(PQgetvalue(res, i, i_typelem)); tyinfo[i].typrelid = atooid(PQgetvalue(res, i, i_typrelid)); tyinfo[i].typrelkind = *PQgetvalue(res, i, i_typrelkind); @@ -6129,10 +6108,6 @@ getTypes(Archive *fout, int *numTypes) */ stinfo->dobj.dump = DUMP_COMPONENT_NONE; } - - if (strlen(tyinfo[i].rolname) == 0) - pg_log_warning("owner of data type \"%s\" appears to be invalid", - tyinfo[i].dobj.name); } *numTypes = ntups; @@ -6163,7 +6138,7 @@ getOperators(Archive *fout, int *numOprs) int i_oid; int i_oprname; int i_oprnamespace; - int i_rolname; + int i_oprowner; int i_oprkind; int i_oprcode; @@ -6174,11 +6149,10 @@ getOperators(Archive *fout, int *numOprs) appendPQExpBuffer(query, "SELECT tableoid, oid, oprname, " "oprnamespace, " - "(%s oprowner) AS rolname, " + "oprowner, " "oprkind, " "oprcode::oid AS oprcode " - "FROM pg_operator", - username_subquery); + "FROM pg_operator"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6191,7 +6165,7 @@ getOperators(Archive *fout, int *numOprs) i_oid = PQfnumber(res, "oid"); i_oprname = PQfnumber(res, "oprname"); i_oprnamespace = PQfnumber(res, "oprnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_oprowner = PQfnumber(res, "oprowner"); i_oprkind = PQfnumber(res, "oprkind"); i_oprcode = PQfnumber(res, "oprcode"); @@ -6204,16 +6178,12 @@ getOperators(Archive *fout, int *numOprs) oprinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oprname)); oprinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace))); - oprinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner)); oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0]; oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode)); /* Decide whether we want to dump it */ selectDumpableObject(&(oprinfo[i].dobj), fout); - - if (strlen(oprinfo[i].rolname) == 0) - pg_log_warning("owner of operator \"%s\" appears to be invalid", - oprinfo[i].dobj.name); } PQclear(res); @@ -6242,7 +6212,7 @@ getCollations(Archive *fout, int *numCollations) int i_oid; int i_collname; int i_collnamespace; - int i_rolname; + int i_collowner; /* Collations didn't exist pre-9.1 */ if (fout->remoteVersion < 90100) @@ -6260,9 +6230,8 @@ getCollations(Archive *fout, int *numCollations) appendPQExpBuffer(query, "SELECT tableoid, oid, collname, " "collnamespace, " - "(%s collowner) AS rolname " - "FROM pg_collation", - username_subquery); + "collowner " + "FROM pg_collation"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6275,7 +6244,7 @@ getCollations(Archive *fout, int *numCollations) i_oid = PQfnumber(res, "oid"); i_collname = PQfnumber(res, "collname"); i_collnamespace = PQfnumber(res, "collnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_collowner = PQfnumber(res, "collowner"); for (i = 0; i < ntups; i++) { @@ -6286,7 +6255,7 @@ getCollations(Archive *fout, int *numCollations) collinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_collname)); collinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_collnamespace))); - collinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner)); /* Decide whether we want to dump it */ selectDumpableObject(&(collinfo[i].dobj), fout); @@ -6318,7 +6287,7 @@ getConversions(Archive *fout, int *numConversions) int i_oid; int i_conname; int i_connamespace; - int i_rolname; + int i_conowner; query = createPQExpBuffer(); @@ -6329,9 +6298,8 @@ getConversions(Archive *fout, int *numConversions) appendPQExpBuffer(query, "SELECT tableoid, oid, conname, " "connamespace, " - "(%s conowner) AS rolname " - "FROM pg_conversion", - username_subquery); + "conowner " + "FROM pg_conversion"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6344,7 +6312,7 @@ getConversions(Archive *fout, int *numConversions) i_oid = PQfnumber(res, "oid"); i_conname = PQfnumber(res, "conname"); i_connamespace = PQfnumber(res, "connamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_conowner = PQfnumber(res, "conowner"); for (i = 0; i < ntups; i++) { @@ -6355,7 +6323,7 @@ getConversions(Archive *fout, int *numConversions) convinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname)); convinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_connamespace))); - convinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + convinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_conowner)); /* Decide whether we want to dump it */ selectDumpableObject(&(convinfo[i].dobj), fout); @@ -6458,7 +6426,7 @@ getOpclasses(Archive *fout, int *numOpclasses) int i_oid; int i_opcname; int i_opcnamespace; - int i_rolname; + int i_opcowner; /* * find all opclasses, including builtin opclasses; we filter out @@ -6467,9 +6435,8 @@ getOpclasses(Archive *fout, int *numOpclasses) appendPQExpBuffer(query, "SELECT tableoid, oid, opcname, " "opcnamespace, " - "(%s opcowner) AS rolname " - "FROM pg_opclass", - username_subquery); + "opcowner " + "FROM pg_opclass"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6482,7 +6449,7 @@ getOpclasses(Archive *fout, int *numOpclasses) i_oid = PQfnumber(res, "oid"); i_opcname = PQfnumber(res, "opcname"); i_opcnamespace = PQfnumber(res, "opcnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_opcowner = PQfnumber(res, "opcowner"); for (i = 0; i < ntups; i++) { @@ -6493,14 +6460,10 @@ getOpclasses(Archive *fout, int *numOpclasses) opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname)); opcinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace))); - opcinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner)); /* Decide whether we want to dump it */ selectDumpableObject(&(opcinfo[i].dobj), fout); - - if (strlen(opcinfo[i].rolname) == 0) - pg_log_warning("owner of operator class \"%s\" appears to be invalid", - opcinfo[i].dobj.name); } PQclear(res); @@ -6529,7 +6492,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) int i_oid; int i_opfname; int i_opfnamespace; - int i_rolname; + int i_opfowner; /* Before 8.3, there is no separate concept of opfamilies */ if (fout->remoteVersion < 80300) @@ -6547,9 +6510,8 @@ getOpfamilies(Archive *fout, int *numOpfamilies) appendPQExpBuffer(query, "SELECT tableoid, oid, opfname, " "opfnamespace, " - "(%s opfowner) AS rolname " - "FROM pg_opfamily", - username_subquery); + "opfowner " + "FROM pg_opfamily"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6562,7 +6524,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) i_oid = PQfnumber(res, "oid"); i_opfname = PQfnumber(res, "opfname"); i_opfnamespace = PQfnumber(res, "opfnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_opfowner = PQfnumber(res, "opfowner"); for (i = 0; i < ntups; i++) { @@ -6573,14 +6535,10 @@ getOpfamilies(Archive *fout, int *numOpfamilies) opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname)); opfinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace))); - opfinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner)); /* Decide whether we want to dump it */ selectDumpableObject(&(opfinfo[i].dobj), fout); - - if (strlen(opfinfo[i].rolname) == 0) - pg_log_warning("owner of operator family \"%s\" appears to be invalid", - opfinfo[i].dobj.name); } PQclear(res); @@ -6612,7 +6570,7 @@ getAggregates(Archive *fout, int *numAggs) int i_aggnamespace; int i_pronargs; int i_proargtypes; - int i_rolname; + int i_proowner; int i_aggacl; int i_acldefault; @@ -6631,7 +6589,7 @@ getAggregates(Archive *fout, int *numAggs) "p.proname AS aggname, " "p.pronamespace AS aggnamespace, " "p.pronargs, p.proargtypes, " - "(%s p.proowner) AS rolname, " + "p.proowner, " "p.proacl AS aggacl, " "acldefault('f', p.proowner) AS acldefault " "FROM pg_proc p " @@ -6644,7 +6602,6 @@ getAggregates(Archive *fout, int *numAggs) "(SELECT oid FROM pg_namespace " "WHERE nspname = 'pg_catalog') OR " "p.proacl IS DISTINCT FROM pip.initprivs", - username_subquery, agg_check); if (dopt->binary_upgrade) appendPQExpBufferStr(query, @@ -6660,15 +6617,14 @@ getAggregates(Archive *fout, int *numAggs) appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, " "pronamespace AS aggnamespace, " "pronargs, proargtypes, " - "(%s proowner) AS rolname, " + "proowner, " "proacl AS aggacl, " "acldefault('f', proowner) AS acldefault " "FROM pg_proc p " "WHERE proisagg AND (" "pronamespace != " "(SELECT oid FROM pg_namespace " - "WHERE nspname = 'pg_catalog')", - username_subquery); + "WHERE nspname = 'pg_catalog')"); if (dopt->binary_upgrade) appendPQExpBufferStr(query, " OR EXISTS(SELECT 1 FROM pg_depend WHERE " @@ -6683,15 +6639,14 @@ getAggregates(Archive *fout, int *numAggs) appendPQExpBuffer(query, "SELECT tableoid, oid, proname AS aggname, " "pronamespace AS aggnamespace, " "pronargs, proargtypes, " - "(%s proowner) AS rolname, " + "proowner, " "proacl AS aggacl, " "NULL AS acldefault " "FROM pg_proc p " "WHERE proisagg AND (" "pronamespace != " "(SELECT oid FROM pg_namespace " - "WHERE nspname = 'pg_catalog')", - username_subquery); + "WHERE nspname = 'pg_catalog')"); if (dopt->binary_upgrade && fout->remoteVersion >= 90100) appendPQExpBufferStr(query, " OR EXISTS(SELECT 1 FROM pg_depend WHERE " @@ -6715,7 +6670,7 @@ getAggregates(Archive *fout, int *numAggs) i_aggnamespace = PQfnumber(res, "aggnamespace"); i_pronargs = PQfnumber(res, "pronargs"); i_proargtypes = PQfnumber(res, "proargtypes"); - i_rolname = PQfnumber(res, "rolname"); + i_proowner = PQfnumber(res, "proowner"); i_aggacl = PQfnumber(res, "aggacl"); i_acldefault = PQfnumber(res, "acldefault"); @@ -6732,10 +6687,7 @@ getAggregates(Archive *fout, int *numAggs) agginfo[i].aggfn.dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); agginfo[i].aggfn.dacl.privtype = 0; agginfo[i].aggfn.dacl.initprivs = NULL; - agginfo[i].aggfn.rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); - if (strlen(agginfo[i].aggfn.rolname) == 0) - pg_log_warning("owner of aggregate function \"%s\" appears to be invalid", - agginfo[i].aggfn.dobj.name); + agginfo[i].aggfn.rolname = getRoleName(PQgetvalue(res, i, i_proowner)); agginfo[i].aggfn.lang = InvalidOid; /* not currently interesting */ agginfo[i].aggfn.prorettype = InvalidOid; /* not saved */ agginfo[i].aggfn.nargs = atoi(PQgetvalue(res, i, i_pronargs)); @@ -6783,7 +6735,7 @@ getExtProtocols(Archive *fout, int *numExtProtocols) int i_oid; int i_tableoid; int i_ptcname; - int i_rolname; + int i_ptcowner; int i_ptcacl; int i_acldefault; int i_ptctrusted; @@ -6800,11 +6752,10 @@ getExtProtocols(Archive *fout, int *numExtProtocols) "ptcreadfn as ptcreadoid, " "ptcwritefn as ptcwriteoid, " "ptcvalidatorfn as ptcvaloid, " - "(%s ptcowner) as rolname, " + "ptcowner, " "ptctrusted, ptcacl, " "acldefault('E', ptcowner) AS acldefault " - "FROM pg_extprotocol ", - username_subquery); + "FROM pg_extprotocol "); } else { @@ -6814,11 +6765,10 @@ getExtProtocols(Archive *fout, int *numExtProtocols) "ptcreadfn as ptcreadoid, " "ptcwritefn as ptcwriteoid, " "ptcvalidatorfn as ptcvaloid, " - "(%s ptcowner) as rolname, " + "ptcowner, " "ptctrusted, ptcacl, " "NULL AS acldefault " - "FROM pg_extprotocol ", - username_subquery); + "FROM pg_extprotocol "); } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6831,7 +6781,7 @@ getExtProtocols(Archive *fout, int *numExtProtocols) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_ptcname = PQfnumber(res, "ptcname"); - i_rolname = PQfnumber(res, "rolname"); + i_ptcowner = PQfnumber(res, "ptcowner"); i_ptcacl = PQfnumber(res, "ptcacl"); i_acldefault = PQfnumber(res, "acldefault"); i_ptctrusted = PQfnumber(res, "ptctrusted"); @@ -6847,10 +6797,7 @@ getExtProtocols(Archive *fout, int *numExtProtocols) AssignDumpId(&ptcinfo[i].dobj); ptcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_ptcname)); ptcinfo[i].dobj.namespace = NULL; - ptcinfo[i].ptcowner = pg_strdup(PQgetvalue(res, i, i_rolname)); - if (strlen(ptcinfo[i].ptcowner) == 0) - pg_log_warning("owner of external protocol \"%s\" appears to be invalid", - ptcinfo[i].dobj.name); + ptcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_ptcowner)); if (PQgetisnull(res, i, i_ptcreadid)) ptcinfo[i].ptcreadid = InvalidOid; @@ -6910,7 +6857,7 @@ getFuncs(Archive *fout, int *numFuncs) int i_oid; int i_proname; int i_pronamespace; - int i_rolname; + int i_proowner; int i_prolang; int i_pronargs; int i_proargtypes; @@ -6953,7 +6900,7 @@ getFuncs(Archive *fout, int *numFuncs) "p.proacl, " "acldefault('f', p.proowner) AS acldefault, " "p.pronamespace, " - "(%s p.proowner) AS rolname " + "p.proowner " "FROM pg_proc p " "LEFT JOIN pg_init_privs pip ON " "(p.oid = pip.objoid " @@ -6974,7 +6921,6 @@ getFuncs(Archive *fout, int *numFuncs) "\n WHERE pg_transform.oid > %u AND " "\n (p.oid = pg_transform.trffromsql" "\n OR p.oid = pg_transform.trftosql))", - username_subquery, not_agg_check, g_last_builtin_oid, g_last_builtin_oid); @@ -7001,11 +6947,10 @@ getFuncs(Archive *fout, int *numFuncs) "pronargs, proargtypes, prorettype, proacl, " "%s AS acldefault, " "pronamespace, " - "(%s proowner) AS rolname " + "proowner " "FROM pg_proc p " "WHERE NOT proisagg", - acldefault_call, - username_subquery); + acldefault_call); if (fout->remoteVersion >= 90200) appendPQExpBufferStr(query, "\n AND NOT EXISTS (SELECT 1 FROM pg_depend " @@ -7058,7 +7003,7 @@ getFuncs(Archive *fout, int *numFuncs) i_oid = PQfnumber(res, "oid"); i_proname = PQfnumber(res, "proname"); i_pronamespace = PQfnumber(res, "pronamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_proowner = PQfnumber(res, "proowner"); i_prolang = PQfnumber(res, "prolang"); i_pronargs = PQfnumber(res, "pronargs"); i_proargtypes = PQfnumber(res, "proargtypes"); @@ -7079,7 +7024,7 @@ getFuncs(Archive *fout, int *numFuncs) finfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); finfo[i].dacl.privtype = 0; finfo[i].dacl.initprivs = NULL; - finfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + finfo[i].rolname = getRoleName(PQgetvalue(res, i, i_proowner)); finfo[i].lang = atooid(PQgetvalue(res, i, i_prolang)); finfo[i].prorettype = atooid(PQgetvalue(res, i, i_prorettype)); finfo[i].nargs = atoi(PQgetvalue(res, i, i_pronargs)); @@ -7099,10 +7044,6 @@ getFuncs(Archive *fout, int *numFuncs) /* Mark whether function has an ACL */ if (!PQgetisnull(res, i, i_proacl)) finfo[i].dobj.components |= DUMP_COMPONENT_ACL; - - if (strlen(finfo[i].rolname) == 0) - pg_log_warning("owner of function \"%s\" appears to be invalid", - finfo[i].dobj.name); } PQclear(res); @@ -7135,7 +7076,7 @@ getTables(Archive *fout, int *numTables) int i_relnamespace; int i_relkind; int i_reltype; - int i_rolname; + int i_relowner; int i_relchecks; int i_relhastriggers; int i_relhasindex; @@ -7197,15 +7138,14 @@ getTables(Archive *fout, int *numTables) appendPQExpBuffer(query, "SELECT c.tableoid, c.oid, c.relname, " "c.relnamespace, c.relkind, c.reltype, " - "(%s c.relowner) AS rolname, " + "c.relowner, " "c.relchecks, " "c.relhasindex, c.relhasrules, c.relpages, " "d.refobjid AS owning_tab, " "d.refobjsubid AS owning_col, " "tsp.spcname AS reltablespace, " "c.relfrozenxid, tc.relfrozenxid AS tfrozenxid, " - "tc.oid AS toid, ", - username_subquery); + "tc.oid AS toid, "); if (fout->remoteVersion >= 90600) appendPQExpBufferStr(query, @@ -7451,7 +7391,7 @@ getTables(Archive *fout, int *numTables) i_relnamespace = PQfnumber(res, "relnamespace"); i_relkind = PQfnumber(res, "relkind"); i_reltype = PQfnumber(res, "reltype"); - i_rolname = PQfnumber(res, "rolname"); + i_relowner = PQfnumber(res, "relowner"); i_relchecks = PQfnumber(res, "relchecks"); i_relhasindex = PQfnumber(res, "relhasindex"); i_relhasrules = PQfnumber(res, "relhasrules"); @@ -7522,7 +7462,7 @@ getTables(Archive *fout, int *numTables) tblinfo[i].dacl.initprivs = NULL; tblinfo[i].relkind = *(PQgetvalue(res, i, i_relkind)); tblinfo[i].reltype = atooid(PQgetvalue(res, i, i_reltype)); - tblinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + tblinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_relowner)); tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks)); tblinfo[i].hasindex = (strcmp(PQgetvalue(res, i, i_relhasindex), "t") == 0); tblinfo[i].hasrules = (strcmp(PQgetvalue(res, i, i_relhasrules), "t") == 0); @@ -7677,11 +7617,6 @@ getTables(Archive *fout, int *numTables) fmtQualifiedDumpable(&tblinfo[i])); lockTableDumped = true; } - - /* Emit notice if join for owner failed */ - if (strlen(tblinfo[i].rolname) == 0) - pg_log_warning("owner of table \"%s\" appears to be invalid", - tblinfo[i].dobj.name); } /* Are there any tables to lock? */ if (lockTableDumped) @@ -8214,7 +8149,7 @@ getExtendedStatistics(Archive *fout) int i_oid; int i_stxname; int i_stxnamespace; - int i_rolname; + int i_stxowner; int i_stattarget; int i; @@ -8226,14 +8161,13 @@ getExtendedStatistics(Archive *fout) if (fout->remoteVersion < 130000) appendPQExpBuffer(query, "SELECT tableoid, oid, stxname, " - "stxnamespace, (%s stxowner) AS rolname, (-1) AS stxstattarget " - "FROM pg_catalog.pg_statistic_ext", - username_subquery); + "stxnamespace, stxowner, (-1) AS stxstattarget " + "FROM pg_catalog.pg_statistic_ext"); else appendPQExpBuffer(query, "SELECT tableoid, oid, stxname, " - "stxnamespace, (%s stxowner) AS rolname, stxstattarget " - "FROM pg_catalog.pg_statistic_ext", - username_subquery); + "stxnamespace, stxowner, stxstattarget " + "FROM pg_catalog.pg_statistic_ext"); + res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -8243,7 +8177,7 @@ getExtendedStatistics(Archive *fout) i_oid = PQfnumber(res, "oid"); i_stxname = PQfnumber(res, "stxname"); i_stxnamespace = PQfnumber(res, "stxnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_stxowner = PQfnumber(res, "stxowner"); i_stattarget = PQfnumber(res, "stxstattarget"); statsextinfo = (StatsExtInfo *) pg_malloc(ntups * sizeof(StatsExtInfo)); @@ -8257,7 +8191,7 @@ getExtendedStatistics(Archive *fout) statsextinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_stxname)); statsextinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_stxnamespace))); - statsextinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + statsextinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_stxowner)); statsextinfo[i].stattarget = atoi(PQgetvalue(res, i, i_stattarget)); /* Decide whether we want to dump it */ @@ -8973,14 +8907,13 @@ getEventTriggers(Archive *fout, int *numEventTriggers) appendPQExpBuffer(query, "SELECT e.tableoid, e.oid, evtname, evtenabled, " - "evtevent, (%s evtowner) AS evtowner, " + "evtevent, evtowner, " "array_to_string(array(" "select quote_literal(x) " " from unnest(evttags) as t(x)), ', ') as evttags, " "e.evtfoid::regproc as evtfname " "FROM pg_event_trigger e " - "ORDER BY e.oid", - username_subquery); + "ORDER BY e.oid"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -9008,7 +8941,7 @@ getEventTriggers(Archive *fout, int *numEventTriggers) evtinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_evtname)); evtinfo[i].evtname = pg_strdup(PQgetvalue(res, i, i_evtname)); evtinfo[i].evtevent = pg_strdup(PQgetvalue(res, i, i_evtevent)); - evtinfo[i].evtowner = pg_strdup(PQgetvalue(res, i, i_evtowner)); + evtinfo[i].evtowner = getRoleName(PQgetvalue(res, i, i_evtowner)); evtinfo[i].evttags = pg_strdup(PQgetvalue(res, i, i_evttags)); evtinfo[i].evtfname = pg_strdup(PQgetvalue(res, i, i_evtfname)); evtinfo[i].evtenabled = *(PQgetvalue(res, i, i_evtenabled)); @@ -9065,11 +8998,10 @@ getProcLangs(Archive *fout, int *numProcLangs) "laninline, lanvalidator, " "lanacl, " "acldefault('l', lanowner) AS acldefault, " - "(%s lanowner) AS lanowner " + "lanowner " "FROM pg_language " "WHERE lanispl " - "ORDER BY oid", - username_subquery); + "ORDER BY oid"); } else if (fout->remoteVersion >= 90000) { @@ -9078,11 +9010,10 @@ getProcLangs(Archive *fout, int *numProcLangs) "lanname, lanpltrusted, lanplcallfoid, " "laninline, lanvalidator, " "lanacl, NULL AS acldefault, " - "(%s lanowner) AS lanowner " + "lanowner " "FROM pg_language " "WHERE lanispl " - "ORDER BY oid", - username_subquery); + "ORDER BY oid"); } else /* GPDB5 */ { @@ -9093,11 +9024,10 @@ getProcLangs(Archive *fout, int *numProcLangs) "laninline, lanvalidator, lanacl, " "0 AS laninline, lanvalidator, lanacl, " "NULL AS acldefault, " - "(%s lanowner) AS lanowner " + "lanowner " "FROM pg_language " "WHERE lanispl " - "ORDER BY oid", - username_subquery); + "ORDER BY oid"); } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -9135,7 +9065,7 @@ getProcLangs(Archive *fout, int *numProcLangs) planginfo[i].lanplcallfoid = atooid(PQgetvalue(res, i, i_lanplcallfoid)); planginfo[i].laninline = atooid(PQgetvalue(res, i, i_laninline)); planginfo[i].lanvalidator = atooid(PQgetvalue(res, i, i_lanvalidator)); - planginfo[i].lanowner = pg_strdup(PQgetvalue(res, i, i_lanowner)); + planginfo[i].lanowner = getRoleName(PQgetvalue(res, i, i_lanowner)); /* Decide whether we want to dump it */ selectDumpableProcLang(&(planginfo[i]), fout); @@ -10108,7 +10038,7 @@ getTSDictionaries(Archive *fout, int *numTSDicts) int i_oid; int i_dictname; int i_dictnamespace; - int i_rolname; + int i_dictowner; int i_dicttemplate; int i_dictinitoption; @@ -10122,10 +10052,9 @@ getTSDictionaries(Archive *fout, int *numTSDicts) query = createPQExpBuffer(); appendPQExpBuffer(query, "SELECT tableoid, oid, dictname, " - "dictnamespace, (%s dictowner) AS rolname, " + "dictnamespace, dictowner, " "dicttemplate, dictinitoption " - "FROM pg_ts_dict", - username_subquery); + "FROM pg_ts_dict"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -10138,7 +10067,7 @@ getTSDictionaries(Archive *fout, int *numTSDicts) i_oid = PQfnumber(res, "oid"); i_dictname = PQfnumber(res, "dictname"); i_dictnamespace = PQfnumber(res, "dictnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_dictowner = PQfnumber(res, "dictowner"); i_dictinitoption = PQfnumber(res, "dictinitoption"); i_dicttemplate = PQfnumber(res, "dicttemplate"); @@ -10151,7 +10080,7 @@ getTSDictionaries(Archive *fout, int *numTSDicts) dictinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_dictname)); dictinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_dictnamespace))); - dictinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + dictinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_dictowner)); dictinfo[i].dicttemplate = atooid(PQgetvalue(res, i, i_dicttemplate)); if (PQgetisnull(res, i, i_dictinitoption)) dictinfo[i].dictinitoption = NULL; @@ -10260,7 +10189,7 @@ getTSConfigurations(Archive *fout, int *numTSConfigs) int i_oid; int i_cfgname; int i_cfgnamespace; - int i_rolname; + int i_cfgowner; int i_cfgparser; /* Before 8.3, there is no built-in text search support */ @@ -10273,9 +10202,8 @@ getTSConfigurations(Archive *fout, int *numTSConfigs) query = createPQExpBuffer(); appendPQExpBuffer(query, "SELECT tableoid, oid, cfgname, " - "cfgnamespace, (%s cfgowner) AS rolname, cfgparser " - "FROM pg_ts_config", - username_subquery); + "cfgnamespace, cfgowner, cfgparser " + "FROM pg_ts_config"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -10288,7 +10216,7 @@ getTSConfigurations(Archive *fout, int *numTSConfigs) i_oid = PQfnumber(res, "oid"); i_cfgname = PQfnumber(res, "cfgname"); i_cfgnamespace = PQfnumber(res, "cfgnamespace"); - i_rolname = PQfnumber(res, "rolname"); + i_cfgowner = PQfnumber(res, "cfgowner"); i_cfgparser = PQfnumber(res, "cfgparser"); for (i = 0; i < ntups; i++) @@ -10300,7 +10228,7 @@ getTSConfigurations(Archive *fout, int *numTSConfigs) cfginfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_cfgname)); cfginfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_cfgnamespace))); - cfginfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + cfginfo[i].rolname = getRoleName(PQgetvalue(res, i, i_cfgowner)); cfginfo[i].cfgparser = atooid(PQgetvalue(res, i, i_cfgparser)); /* Decide whether we want to dump it */ @@ -10332,7 +10260,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) int i_tableoid; int i_oid; int i_fdwname; - int i_rolname; + int i_fdwowner; int i_fdwhandler; int i_fdwvalidator; int i_fdwacl; @@ -10351,7 +10279,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) if (fout->remoteVersion >= 90200) { appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " - "(%s fdwowner) AS rolname, " + "fdwowner, " "fdwhandler::pg_catalog.regproc, " "fdwvalidator::pg_catalog.regproc, " "fdwacl, " @@ -10362,13 +10290,12 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) "FROM pg_options_to_table(fdwoptions) " "ORDER BY option_name" "), E',\n ') AS fdwoptions " - "FROM pg_foreign_data_wrapper", - username_subquery); + "FROM pg_foreign_data_wrapper"); } else if (fout->remoteVersion >= 90100) { appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " - "(%s fdwowner) AS rolname, " + "fdwowner, " "fdwhandler::pg_catalog.regproc, " "fdwvalidator::pg_catalog.regproc, fdwacl, " "NULL AS acldefault, " @@ -10378,13 +10305,12 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) "FROM pg_options_to_table(fdwoptions) " "ORDER BY option_name" "), E',\n ') AS fdwoptions " - "FROM pg_foreign_data_wrapper", - username_subquery); + "FROM pg_foreign_data_wrapper"); } else { appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, " - "(%s fdwowner) AS rolname, " + "fdwowner, " "'-' AS fdwhandler, " "fdwvalidator::pg_catalog.regproc, fdwacl, " "NULL AS acldefault, " @@ -10394,8 +10320,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) "FROM pg_options_to_table(fdwoptions) " "ORDER BY option_name" "), E',\n ') AS fdwoptions " - "FROM pg_foreign_data_wrapper", - username_subquery); + "FROM pg_foreign_data_wrapper"); } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -10408,7 +10333,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_fdwname = PQfnumber(res, "fdwname"); - i_rolname = PQfnumber(res, "rolname"); + i_fdwowner = PQfnumber(res, "fdwowner"); i_fdwhandler = PQfnumber(res, "fdwhandler"); i_fdwvalidator = PQfnumber(res, "fdwvalidator"); i_fdwacl = PQfnumber(res, "fdwacl"); @@ -10427,7 +10352,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers) fdwinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); fdwinfo[i].dacl.privtype = 0; fdwinfo[i].dacl.initprivs = NULL; - fdwinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + fdwinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_fdwowner)); fdwinfo[i].fdwhandler = pg_strdup(PQgetvalue(res, i, i_fdwhandler)); fdwinfo[i].fdwvalidator = pg_strdup(PQgetvalue(res, i, i_fdwvalidator)); fdwinfo[i].fdwoptions = pg_strdup(PQgetvalue(res, i, i_fdwoptions)); @@ -10469,7 +10394,7 @@ getForeignServers(Archive *fout, int *numForeignServers) int i_tableoid; int i_oid; int i_srvname; - int i_rolname; + int i_srvowner; int i_srvfdw; int i_srvtype; int i_srvversion; @@ -10489,7 +10414,7 @@ getForeignServers(Archive *fout, int *numForeignServers) if (fout->remoteVersion >= 90200) { appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, " - "(%s srvowner) AS rolname, " + "srvowner, " "srvfdw, srvtype, srvversion, srvacl, " "acldefault('S', srvowner) AS acldefault, " "array_to_string(ARRAY(" @@ -10498,13 +10423,12 @@ getForeignServers(Archive *fout, int *numForeignServers) "FROM pg_options_to_table(srvoptions) " "ORDER BY option_name" "), E',\n ') AS srvoptions " - "FROM pg_foreign_server", - username_subquery); + "FROM pg_foreign_server"); } else { appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, " - "(%s srvowner) AS rolname, " + "srvowner, " "srvfdw, srvtype, srvversion, srvacl, " "NULL AS acldefault, " "array_to_string(ARRAY(" @@ -10513,8 +10437,7 @@ getForeignServers(Archive *fout, int *numForeignServers) "FROM pg_options_to_table(srvoptions) " "ORDER BY option_name" "), E',\n ') AS srvoptions " - "FROM pg_foreign_server", - username_subquery); + "FROM pg_foreign_server"); } res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -10527,7 +10450,7 @@ getForeignServers(Archive *fout, int *numForeignServers) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_srvname = PQfnumber(res, "srvname"); - i_rolname = PQfnumber(res, "rolname"); + i_srvowner = PQfnumber(res, "srvowner"); i_srvfdw = PQfnumber(res, "srvfdw"); i_srvtype = PQfnumber(res, "srvtype"); i_srvversion = PQfnumber(res, "srvversion"); @@ -10547,7 +10470,7 @@ getForeignServers(Archive *fout, int *numForeignServers) srvinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); srvinfo[i].dacl.privtype = 0; srvinfo[i].dacl.initprivs = NULL; - srvinfo[i].rolname = pg_strdup(PQgetvalue(res, i, i_rolname)); + srvinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_srvowner)); srvinfo[i].srvfdw = atooid(PQgetvalue(res, i, i_srvfdw)); srvinfo[i].srvtype = pg_strdup(PQgetvalue(res, i, i_srvtype)); srvinfo[i].srvversion = pg_strdup(PQgetvalue(res, i, i_srvversion)); @@ -10609,11 +10532,10 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs) appendPQExpBuffer(query, "SELECT oid, tableoid, " - "(%s defaclrole) AS defaclrole, " + "defaclrole, " "defaclnamespace, " "defaclobjtype, " - "defaclacl, ", - username_subquery); + "defaclacl, "); if (fout->remoteVersion >= 90200) { @@ -10678,7 +10600,7 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs) daclinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); daclinfo[i].dacl.privtype = 0; daclinfo[i].dacl.initprivs = NULL; - daclinfo[i].defaclrole = pg_strdup(PQgetvalue(res, i, i_defaclrole)); + daclinfo[i].defaclrole = getRoleName(PQgetvalue(res, i, i_defaclrole)); daclinfo[i].defaclobjtype = *(PQgetvalue(res, i, i_defaclobjtype)); /* Default ACLs are ACLs, of course */ @@ -10695,6 +10617,71 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs) return daclinfo; } +/* + * getRoleName -- look up the name of a role, given its OID + * + * In current usage, we don't expect failures, so error out for a bad OID. + */ +static const char * +getRoleName(const char *roleoid_str) +{ + Oid roleoid = atooid(roleoid_str); + + /* + * Do binary search to find the appropriate item. + */ + if (nrolenames > 0) + { + RoleNameItem *low = &rolenames[0]; + RoleNameItem *high = &rolenames[nrolenames - 1]; + + while (low <= high) + { + RoleNameItem *middle = low + (high - low) / 2; + + if (roleoid < middle->roleoid) + high = middle - 1; + else if (roleoid > middle->roleoid) + low = middle + 1; + else + return middle->rolename; /* found a match */ + } + } + + fatal("role with OID %u does not exist", roleoid); + return NULL; /* keep compiler quiet */ +} + +/* + * collectRoleNames -- + * + * Construct a table of all known roles. + * The table is sorted by OID for speed in lookup. + */ +static void +collectRoleNames(Archive *fout) +{ + PGresult *res; + const char *query; + int i; + + query = "SELECT oid, rolname FROM pg_catalog.pg_roles ORDER BY 1"; + + res = ExecuteSqlQuery(fout, query, PGRES_TUPLES_OK); + + nrolenames = PQntuples(res); + + rolenames = (RoleNameItem *) pg_malloc(nrolenames * sizeof(RoleNameItem)); + + for (i = 0; i < nrolenames; i++) + { + rolenames[i].roleoid = atooid(PQgetvalue(res, i, 0)); + rolenames[i].rolename = pg_strdup(PQgetvalue(res, i, 1)); + } + + PQclear(res); +} + /* * getAdditionalACLs * @@ -15890,7 +15877,7 @@ dumpExtProtocol(Archive *fout, const ExtProtInfo *ptcinfo) ArchiveEntry(fout, ptcinfo->dobj.catId, ptcinfo->dobj.dumpId, ARCHIVE_OPTS(.tag = ptcinfo->dobj.name, - .owner = ptcinfo->ptcowner, + .owner = ptcinfo->rolname, .description = "PROTOCOL", .section = SECTION_PRE_DATA, .createStmt = q->data, @@ -15903,7 +15890,7 @@ dumpExtProtocol(Archive *fout, const ExtProtInfo *ptcinfo) dumpACL(fout, ptcinfo->dobj.dumpId, InvalidDumpId, "PROTOCOL", namecopy, NULL, - NULL, ptcinfo->ptcowner, &ptcinfo->dacl); + NULL, ptcinfo->rolname, &ptcinfo->dacl); free(namecopy); destroyPQExpBuffer(q); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 1badb50b482..dc6791deb49 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -180,7 +180,8 @@ typedef struct _namespaceInfo { DumpableObject dobj; DumpableAcl dacl; - char *rolname; /* name of owner, or empty string */ + Oid nspowner; /* OID of owner */ + const char *rolname; /* name of owner */ } NamespaceInfo; typedef struct _extensionInfo @@ -204,7 +205,7 @@ typedef struct _typeInfo * schema-qualified too. */ char *ftypname; - char *rolname; /* name of owner, or empty string */ + const char *rolname; /* name of owner, or empty string */ char *typacl; char *rtypacl; char *inittypacl; @@ -236,7 +237,7 @@ typedef struct _funcInfo { DumpableObject dobj; DumpableAcl dacl; - char *rolname; /* name of owner, or empty string */ + const char *rolname; Oid lang; int nargs; Oid *argtypes; @@ -256,7 +257,7 @@ typedef struct _ptcInfo DumpableAcl dacl; char *ptcreadfn; char *ptcwritefn; - char *ptcowner; + const char *rolname; char *ptcacl; bool ptctrusted; Oid ptcreadid; @@ -267,7 +268,7 @@ typedef struct _ptcInfo typedef struct _oprInfo { DumpableObject dobj; - char *rolname; + const char *rolname; char oprkind; Oid oprcode; } OprInfo; @@ -282,25 +283,25 @@ typedef struct _accessMethodInfo typedef struct _opclassInfo { DumpableObject dobj; - char *rolname; + const char *rolname; } OpclassInfo; typedef struct _opfamilyInfo { DumpableObject dobj; - char *rolname; + const char *rolname; } OpfamilyInfo; typedef struct _collInfo { DumpableObject dobj; - char *rolname; + const char *rolname; } CollInfo; typedef struct _convInfo { DumpableObject dobj; - char *rolname; + const char *rolname; } ConvInfo; typedef struct _tableInfo @@ -310,7 +311,7 @@ typedef struct _tableInfo */ DumpableObject dobj; DumpableAcl dacl; - char *rolname; /* name of owner, or empty string */ + const char *rolname; char relkind; char relstorage; char relpersistence; /* relation persistence */ @@ -452,7 +453,7 @@ typedef struct _indexAttachInfo typedef struct _statsExtInfo { DumpableObject dobj; - char *rolname; /* name of owner, or empty string */ + const char *rolname; /* name of owner, or empty string */ int stattarget; /* statistics target */ } StatsExtInfo; @@ -491,7 +492,7 @@ typedef struct _evttriggerInfo DumpableObject dobj; char *evtname; char *evtevent; - char *evtowner; + const char *evtowner; char *evttags; char *evtfname; char evtenabled; @@ -528,7 +529,7 @@ typedef struct _procLangInfo Oid lanplcallfoid; Oid laninline; Oid lanvalidator; - char *lanowner; /* name of owner, or empty string */ + const char *lanowner; } ProcLangInfo; typedef struct _castInfo @@ -570,7 +571,7 @@ typedef struct _prsInfo typedef struct _dictInfo { DumpableObject dobj; - char *rolname; + const char *rolname; Oid dicttemplate; char *dictinitoption; } TSDictInfo; @@ -585,7 +586,7 @@ typedef struct _tmplInfo typedef struct _cfgInfo { DumpableObject dobj; - char *rolname; + const char *rolname; Oid cfgparser; } TSConfigInfo; @@ -593,7 +594,7 @@ typedef struct _fdwInfo { DumpableObject dobj; DumpableAcl dacl; - char *rolname; + const char *rolname; char *fdwhandler; char *fdwvalidator; char *fdwoptions; @@ -603,7 +604,7 @@ typedef struct _foreignServerInfo { DumpableObject dobj; DumpableAcl dacl; - char *rolname; + const char *rolname; Oid srvfdw; char *srvtype; char *srvversion; @@ -614,7 +615,7 @@ typedef struct _defaultACLInfo { DumpableObject dobj; DumpableAcl dacl; - char *defaclrole; + const char *defaclrole; char defaclobjtype; } DefaultACLInfo; @@ -622,7 +623,7 @@ typedef struct _blobInfo { DumpableObject dobj; DumpableAcl dacl; - char *rolname; + const char *rolname; } BlobInfo; /* @@ -649,7 +650,7 @@ typedef struct _policyInfo typedef struct _PublicationInfo { DumpableObject dobj; - char *rolname; + const char *rolname; bool puballtables; bool pubinsert; bool pubupdate; @@ -675,7 +676,7 @@ typedef struct _PublicationRelInfo typedef struct _SubscriptionInfo { DumpableObject dobj; - char *rolname; + const char *rolname; char *subconninfo; char *subslotname; char *subbinary; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
