Attached are a couple of patches for loose ends that I didn't
get to when I was working on pg_dump before the last CF.
0001 removes all the "username_subquery" subqueries in favor
of doing local username lookups. On the regression database
with no extra roles, it seems to be more or less a wash ...
but if I create 100 roles, then the patch seems to save five
or ten percent compared to HEAD.
I also got rid of the rather-pointless-IMO checks for pg_authid
join failures, in favor of having the lookup subroutine just
fatal() if it doesn't find a match. I don't think we need to
burden translators with all those strings for cases that shouldn't
happen. Note that a lot of object types weren't checking
for this condition anyway, making it even more pointless.
0002 is a very small patch that gets rid of an extra subquery
for identity-sequence checking, realizing that the LEFT JOIN
in the FROM clause will have picked up that row already,
if it exists. This again saves a few percent for
"pg_dump -s regression", though the effects would depend a lot
on how many sequences you have.
These don't seem complicated enough to require real review,
so I plan to just push them, unless there are objections.
regards, tom lane
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 94f1f32558..76226de485 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -66,6 +66,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 */
@@ -93,9 +99,6 @@ typedef enum OidOptions
/* global decls */
static bool dosync = true; /* Issue fsync() to make dump durable on disk. */
-/* subquery used to convert user ID (eg, datdba) to user name */
-static const char *username_subquery;
-
static Oid g_last_builtin_oid; /* value of the last builtin oid */
/* The specified names/patterns should to match at least one entity */
@@ -130,6 +133,10 @@ static const CatalogId nilCatalogId = {0, 0};
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;
@@ -174,6 +181,8 @@ static void expand_table_name_patterns(Archive *fout,
static NamespaceInfo *findNamespace(Oid nsoid);
static void dumpTableData(Archive *fout, const TableDataInfo *tdinfo);
static void refreshMatViewData(Archive *fout, const TableDataInfo *tdinfo);
+static const char *getRoleName(const char *roleoid_str);
+static void collectRoleNames(Archive *fout);
static void getAdditionalACLs(Archive *fout);
static void dumpCommentExtended(Archive *fout, const char *type,
const char *name, const char *namespace,
@@ -744,9 +753,6 @@ main(int argc, char **argv)
if (fout->isStandby)
dopt.no_unlogged_table_data = true;
- /* Select the appropriate subquery to convert user IDs to names */
- username_subquery = "SELECT rolname FROM pg_catalog.pg_roles WHERE oid =";
-
/*
* Find the last built-in OID, if needed (prior to 8.1)
*
@@ -814,6 +820,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.
@@ -2737,7 +2748,7 @@ dumpDatabase(Archive *fout)
int i_tableoid,
i_oid,
i_datname,
- i_dba,
+ i_datdba,
i_encoding,
i_collate,
i_ctype,
@@ -2771,7 +2782,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, "
@@ -2780,13 +2791,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, "
"datcollate, datctype, datfrozenxid, 0 AS datminmxid, "
"datacl, acldefault('d', datdba) AS acldefault, "
@@ -2795,8 +2805,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);
@@ -2804,7 +2813,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");
@@ -2819,7 +2828,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);
@@ -3264,15 +3273,14 @@ getBlobs(Archive *fout)
/* Fetch BLOB OIDs, and owner/ACL data */
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");
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");
@@ -3295,7 +3303,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;
@@ -3743,7 +3751,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;
@@ -3767,24 +3775,21 @@ getPublications(Archive *fout, int *numPublications)
if (fout->remoteVersion >= 130000)
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, p.pubviaroot "
- "FROM pg_publication p",
- username_subquery);
+ "FROM pg_publication p");
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);
@@ -3793,7 +3798,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");
@@ -3811,7 +3816,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 =
@@ -3825,10 +3830,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);
}
@@ -4215,7 +4216,7 @@ getSubscriptions(Archive *fout)
int i_tableoid;
int i_oid;
int i_subname;
- int i_rolname;
+ int i_subowner;
int i_substream;
int i_subtwophasestate;
int i_subconninfo;
@@ -4250,10 +4251,9 @@ 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.subowner,\n"
" s.subconninfo, s.subslotname, s.subsynccommit,\n"
- " s.subpublications,\n",
- username_subquery);
+ " s.subpublications,\n");
if (fout->remoteVersion >= 140000)
appendPQExpBufferStr(query, " s.subbinary,\n");
@@ -4284,7 +4284,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");
@@ -4303,7 +4303,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;
@@ -4320,10 +4320,6 @@ getSubscriptions(Archive *fout)
subinfo[i].subtwophasestate =
pg_strdup(PQgetvalue(res, i, i_subtwophasestate));
- 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);
}
@@ -4740,7 +4736,6 @@ getNamespaces(Archive *fout, int *numNamespaces)
int i_oid;
int i_nspname;
int i_nspowner;
- int i_rolname;
int i_nspacl;
int i_acldefault;
@@ -4752,11 +4747,9 @@ getNamespaces(Archive *fout, int *numNamespaces)
*/
appendPQExpBuffer(query, "SELECT n.tableoid, n.oid, n.nspname, "
"n.nspowner, "
- "(%s nspowner) AS rolname, "
"n.nspacl, "
"acldefault('n', n.nspowner) AS acldefault "
- "FROM pg_namespace n",
- username_subquery);
+ "FROM pg_namespace n");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -4768,12 +4761,13 @@ getNamespaces(Archive *fout, int *numNamespaces)
i_oid = PQfnumber(res, "oid");
i_nspname = PQfnumber(res, "nspname");
i_nspowner = PQfnumber(res, "nspowner");
- i_rolname = PQfnumber(res, "rolname");
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));
@@ -4783,8 +4777,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].nspowner = atooid(PQgetvalue(res, i, i_nspowner));
- 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);
@@ -4833,10 +4828,6 @@ getNamespaces(Archive *fout, int *numNamespaces)
destroyPQExpBuffer(aclarray);
destroyPQExpBuffer(aclitem);
}
-
- if (strlen(nsinfo[i].rolname) == 0)
- pg_log_warning("owner of schema \"%s\" appears to be invalid",
- nsinfo[i].dobj.name);
}
PQclear(res);
@@ -4959,7 +4950,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;
@@ -4985,15 +4976,14 @@ getTypes(Archive *fout, int *numTypes)
appendPQExpBuffer(query, "SELECT tableoid, oid, typname, "
"typnamespace, typacl, "
"acldefault('T', typowner) AS acldefault, "
- "(%s typowner) AS rolname, "
+ "typowner, "
"typelem, typrelid, "
"CASE WHEN typrelid = 0 THEN ' '::\"char\" "
"ELSE (SELECT relkind FROM pg_class WHERE oid = typrelid) END AS typrelkind, "
"typtype, typisdefined, "
"typname[0] = '_' AND typelem != 0 AND "
"(SELECT typarray FROM pg_type te WHERE oid = pg_type.typelem) = oid AS isarray "
- "FROM pg_type",
- username_subquery);
+ "FROM pg_type");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -5007,7 +4997,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");
@@ -5029,7 +5019,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);
@@ -5097,10 +5087,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;
@@ -5131,7 +5117,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;
@@ -5142,11 +5128,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);
@@ -5159,7 +5144,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");
@@ -5172,16 +5157,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);
@@ -5210,7 +5191,7 @@ getCollations(Archive *fout, int *numCollations)
int i_oid;
int i_collname;
int i_collnamespace;
- int i_rolname;
+ int i_collowner;
query = createPQExpBuffer();
@@ -5221,9 +5202,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);
@@ -5236,7 +5216,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++)
{
@@ -5247,7 +5227,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);
@@ -5279,7 +5259,7 @@ getConversions(Archive *fout, int *numConversions)
int i_oid;
int i_conname;
int i_connamespace;
- int i_rolname;
+ int i_conowner;
query = createPQExpBuffer();
@@ -5290,9 +5270,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);
@@ -5305,7 +5284,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++)
{
@@ -5316,7 +5295,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);
@@ -5419,7 +5398,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
@@ -5428,9 +5407,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);
@@ -5443,7 +5421,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++)
{
@@ -5454,14 +5432,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);
@@ -5490,7 +5464,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
int i_oid;
int i_opfname;
int i_opfnamespace;
- int i_rolname;
+ int i_opfowner;
query = createPQExpBuffer();
@@ -5501,9 +5475,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);
@@ -5516,7 +5489,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++)
{
@@ -5527,14 +5500,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);
@@ -5566,7 +5535,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;
@@ -5585,7 +5554,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 "
@@ -5598,7 +5567,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,
@@ -5614,15 +5582,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 "
@@ -5646,7 +5613,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");
@@ -5663,10 +5630,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));
@@ -5715,7 +5679,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;
@@ -5757,7 +5721,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 "
@@ -5778,7 +5742,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);
@@ -5800,7 +5763,7 @@ getFuncs(Archive *fout, int *numFuncs)
"pronargs, proargtypes, prorettype, proacl, "
"acldefault('f', proowner) AS acldefault, "
"pronamespace, "
- "(%s proowner) AS rolname "
+ "proowner "
"FROM pg_proc p "
"WHERE NOT proisagg"
"\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
@@ -5813,7 +5776,6 @@ getFuncs(Archive *fout, int *numFuncs)
"\n OR EXISTS (SELECT 1 FROM pg_cast"
"\n WHERE pg_cast.oid > '%u'::oid"
"\n AND p.oid = pg_cast.castfunc)",
- username_subquery,
g_last_builtin_oid);
if (fout->remoteVersion >= 90500)
@@ -5846,7 +5808,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");
@@ -5867,7 +5829,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));
@@ -5886,10 +5848,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);
@@ -5921,7 +5879,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_relhasindex;
int i_relhasrules;
@@ -5973,7 +5931,7 @@ 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, "
"c.relhastriggers, "
@@ -5991,8 +5949,7 @@ getTables(Archive *fout, int *numTables)
"tc.reloptions AS toast_reloptions, "
"d.refobjid AS owning_tab, "
"d.refobjsubid AS owning_col, "
- "tsp.spcname AS reltablespace, ",
- username_subquery);
+ "tsp.spcname AS reltablespace, ");
if (fout->remoteVersion >= 120000)
appendPQExpBufferStr(query,
@@ -6141,7 +6098,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");
@@ -6203,7 +6160,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);
@@ -6311,11 +6268,6 @@ getTables(Archive *fout, int *numTables)
fmtQualifiedDumpable(&tblinfo[i]));
ExecuteSqlStatement(fout, query->data);
}
-
- /* 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);
}
if (dopt->lockWaitTimeout)
@@ -6759,7 +6711,7 @@ getExtendedStatistics(Archive *fout)
int i_oid;
int i_stxname;
int i_stxnamespace;
- int i_rolname;
+ int i_stxowner;
int i_stattarget;
int i;
@@ -6771,14 +6723,12 @@ 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);
@@ -6788,7 +6738,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));
@@ -6802,7 +6752,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 */
@@ -7477,14 +7427,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);
@@ -7512,7 +7461,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));
@@ -7561,11 +7510,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");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -7602,7 +7550,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);
@@ -8510,17 +8458,16 @@ 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;
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);
@@ -8533,7 +8480,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");
@@ -8546,7 +8493,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;
@@ -8648,15 +8595,14 @@ getTSConfigurations(Archive *fout, int *numTSConfigs)
int i_oid;
int i_cfgname;
int i_cfgnamespace;
- int i_rolname;
+ int i_cfgowner;
int i_cfgparser;
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);
@@ -8669,7 +8615,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++)
@@ -8681,7 +8627,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 */
@@ -8713,7 +8659,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;
@@ -8723,7 +8669,7 @@ getForeignDataWrappers(Archive *fout, int *numForeignDataWrappers)
query = createPQExpBuffer();
appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, "
- "(%s fdwowner) AS rolname, "
+ "fdwowner, "
"fdwhandler::pg_catalog.regproc, "
"fdwvalidator::pg_catalog.regproc, "
"fdwacl, "
@@ -8734,8 +8680,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);
@@ -8747,7 +8692,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");
@@ -8766,7 +8711,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));
@@ -8804,7 +8749,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;
@@ -8815,7 +8760,7 @@ getForeignServers(Archive *fout, int *numForeignServers)
query = createPQExpBuffer();
appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, "
- "(%s srvowner) AS rolname, "
+ "srvowner, "
"srvfdw, srvtype, srvversion, srvacl, "
"acldefault('S', srvowner) AS acldefault, "
"array_to_string(ARRAY("
@@ -8824,8 +8769,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);
@@ -8837,7 +8781,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");
@@ -8857,7 +8801,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));
@@ -8921,7 +8865,7 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs)
*/
appendPQExpBuffer(query,
"SELECT oid, tableoid, "
- "(%s defaclrole) AS defaclrole, "
+ "defaclrole, "
"defaclnamespace, "
"defaclobjtype, "
"defaclacl, "
@@ -8929,8 +8873,7 @@ getDefaultACLs(Archive *fout, int *numDefaultACLs)
"acldefault(CASE WHEN defaclobjtype = 'S' "
"THEN 's'::\"char\" ELSE defaclobjtype END, "
"defaclrole) ELSE '{}' END AS acldefault "
- "FROM pg_default_acl",
- username_subquery);
+ "FROM pg_default_acl");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -8967,7 +8910,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 */
@@ -8984,6 +8927,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
*
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index f011ace8a8..f9deb321ac 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -171,8 +171,8 @@ typedef struct _namespaceInfo
DumpableObject dobj;
DumpableAcl dacl;
bool create; /* CREATE SCHEMA, or just set owner? */
- Oid nspowner;
- char *rolname; /* name of owner, or empty string */
+ Oid nspowner; /* OID of owner */
+ const char *rolname; /* name of owner */
} NamespaceInfo;
typedef struct _extensionInfo
@@ -196,7 +196,7 @@ typedef struct _typeInfo
* schema-qualified too.
*/
char *ftypname;
- char *rolname; /* name of owner, or empty string */
+ const char *rolname;
Oid typelem;
Oid typrelid;
char typrelkind; /* 'r', 'v', 'c', etc */
@@ -222,7 +222,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;
@@ -239,7 +239,7 @@ typedef struct _aggInfo
typedef struct _oprInfo
{
DumpableObject dobj;
- char *rolname;
+ const char *rolname;
char oprkind;
Oid oprcode;
} OprInfo;
@@ -254,25 +254,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
@@ -282,7 +282,7 @@ typedef struct _tableInfo
*/
DumpableObject dobj;
DumpableAcl dacl;
- char *rolname; /* name of owner, or empty string */
+ const char *rolname;
char relkind;
char relpersistence; /* relation persistence */
bool relispopulated; /* relation is populated */
@@ -415,7 +415,7 @@ typedef struct _indexAttachInfo
typedef struct _statsExtInfo
{
DumpableObject dobj;
- char *rolname; /* name of owner, or empty string */
+ const char *rolname;
int stattarget; /* statistics target */
} StatsExtInfo;
@@ -454,7 +454,7 @@ typedef struct _evttriggerInfo
DumpableObject dobj;
char *evtname;
char *evtevent;
- char *evtowner;
+ const char *evtowner;
char *evttags;
char *evtfname;
char evtenabled;
@@ -491,7 +491,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
@@ -533,7 +533,7 @@ typedef struct _prsInfo
typedef struct _dictInfo
{
DumpableObject dobj;
- char *rolname;
+ const char *rolname;
Oid dicttemplate;
char *dictinitoption;
} TSDictInfo;
@@ -548,7 +548,7 @@ typedef struct _tmplInfo
typedef struct _cfgInfo
{
DumpableObject dobj;
- char *rolname;
+ const char *rolname;
Oid cfgparser;
} TSConfigInfo;
@@ -556,7 +556,7 @@ typedef struct _fdwInfo
{
DumpableObject dobj;
DumpableAcl dacl;
- char *rolname;
+ const char *rolname;
char *fdwhandler;
char *fdwvalidator;
char *fdwoptions;
@@ -566,7 +566,7 @@ typedef struct _foreignServerInfo
{
DumpableObject dobj;
DumpableAcl dacl;
- char *rolname;
+ const char *rolname;
Oid srvfdw;
char *srvtype;
char *srvversion;
@@ -577,7 +577,7 @@ typedef struct _defaultACLInfo
{
DumpableObject dobj;
DumpableAcl dacl;
- char *defaclrole;
+ const char *defaclrole;
char defaclobjtype;
} DefaultACLInfo;
@@ -585,7 +585,7 @@ typedef struct _blobInfo
{
DumpableObject dobj;
DumpableAcl dacl;
- char *rolname;
+ const char *rolname;
} BlobInfo;
/*
@@ -612,7 +612,7 @@ typedef struct _policyInfo
typedef struct _PublicationInfo
{
DumpableObject dobj;
- char *rolname;
+ const char *rolname;
bool puballtables;
bool pubinsert;
bool pubupdate;
@@ -649,7 +649,7 @@ typedef struct _PublicationSchemaInfo
typedef struct _SubscriptionInfo
{
DumpableObject dobj;
- char *rolname;
+ const char *rolname;
char *subconninfo;
char *subslotname;
char *subbinary;
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 76226de485..bdb7129ef5 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -6005,12 +6005,7 @@ getTables(Archive *fout, int *numTables)
if (fout->remoteVersion >= 90600)
appendPQExpBufferStr(query,
- "c.relkind = " CppAsString2(RELKIND_SEQUENCE)
- " AND EXISTS (SELECT 1 FROM pg_depend "
- "WHERE classid = 'pg_class'::regclass AND "
- "objid = c.oid AND objsubid = 0 AND "
- "refclassid = 'pg_class'::regclass AND "
- "deptype = 'i') AS is_identity_sequence, ");
+ "(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
else
appendPQExpBufferStr(query,
"false AS is_identity_sequence, ");