Run pgindent and pgperltidy for previous 3 commits.

For ease of review, and to be able to put the indentation changes
in .git-blame-ignore-revs, I did not fix the indentation of the
last 3 commits.  Do that now.

Discussion: https://postgr.es/m/adZ4j88Dq9r8y9_9%40nathan
This commit is contained in:
Nathan Bossart 2026-07-02 13:05:50 -05:00
parent 831bec4592
commit d69fdf79b8
11 changed files with 616 additions and 625 deletions

View file

@ -1491,8 +1491,8 @@ setup_connection(Archive *AH, const char *dumpencoding,
* Disable timeouts if supported. * Disable timeouts if supported.
*/ */
ExecuteSqlStatement(AH, "SET statement_timeout = 0"); ExecuteSqlStatement(AH, "SET statement_timeout = 0");
ExecuteSqlStatement(AH, "SET lock_timeout = 0"); ExecuteSqlStatement(AH, "SET lock_timeout = 0");
ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0"); ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0");
if (AH->remoteVersion >= 170000) if (AH->remoteVersion >= 170000)
ExecuteSqlStatement(AH, "SET transaction_timeout = 0"); ExecuteSqlStatement(AH, "SET transaction_timeout = 0");
@ -1505,10 +1505,10 @@ setup_connection(Archive *AH, const char *dumpencoding,
/* /*
* Adjust row-security mode, if supported. * Adjust row-security mode, if supported.
*/ */
if (dopt->enable_row_security) if (dopt->enable_row_security)
ExecuteSqlStatement(AH, "SET row_security = on"); ExecuteSqlStatement(AH, "SET row_security = on");
else else
ExecuteSqlStatement(AH, "SET row_security = off"); ExecuteSqlStatement(AH, "SET row_security = off");
/* /*
* For security reasons, we restrict the expansion of non-system views and * For security reasons, we restrict the expansion of non-system views and
@ -1933,10 +1933,9 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout)
addObjectDependency(dobj, ext->dobj.dumpId); addObjectDependency(dobj, ext->dobj.dumpId);
/* /*
* Mark the member object to have any non-initial ACLs * Mark the member object to have any non-initial ACLs dumped. (Any
* dumped. (Any initial ACLs will be removed later, using data from * initial ACLs will be removed later, using data from pg_init_privs, so
* pg_init_privs, so that we'll dump only the delta from the extension's * that we'll dump only the delta from the extension's initial setup.)
* initial setup.)
* *
* In binary upgrades, we still dump all components of the members * In binary upgrades, we still dump all components of the members
* individually, since the idea is to exactly reproduce the database * individually, since the idea is to exactly reproduce the database
@ -1953,7 +1952,7 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout)
if (fout->dopt->binary_upgrade) if (fout->dopt->binary_upgrade)
dobj->dump = ext->dobj.dump; dobj->dump = ext->dobj.dump;
else else
dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL); dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL);
return true; return true;
} }
@ -1987,9 +1986,9 @@ selectDumpableNamespace(NamespaceInfo *nsinfo, Archive *fout)
else if (strcmp(nsinfo->dobj.name, "pg_catalog") == 0) else if (strcmp(nsinfo->dobj.name, "pg_catalog") == 0)
{ {
/* /*
* We dump out any ACLs defined in pg_catalog, if * We dump out any ACLs defined in pg_catalog, if they are interesting
* they are interesting (and not the original ACLs which were set at * (and not the original ACLs which were set at initdb time, see
* initdb time, see pg_init_privs). * pg_init_privs).
*/ */
nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ACL; nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ACL;
} }
@ -3296,7 +3295,7 @@ dumpDatabase(Archive *fout)
"datcollate, datctype, datfrozenxid, " "datcollate, datctype, datfrozenxid, "
"datacl, acldefault('d', datdba) AS acldefault, " "datacl, acldefault('d', datdba) AS acldefault, "
"datistemplate, datconnlimit, "); "datistemplate, datconnlimit, ");
appendPQExpBufferStr(dbQry, "datminmxid, "); appendPQExpBufferStr(dbQry, "datminmxid, ");
if (fout->remoteVersion >= 170000) if (fout->remoteVersion >= 170000)
appendPQExpBufferStr(dbQry, "datlocprovider, datlocale, datcollversion, "); appendPQExpBufferStr(dbQry, "datlocprovider, datlocale, datcollversion, ");
else if (fout->remoteVersion >= 150000) else if (fout->remoteVersion >= 150000)
@ -3638,11 +3637,11 @@ dumpDatabase(Archive *fout)
ii_oid, ii_oid,
ii_relminmxid; ii_relminmxid;
appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n" appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n"
"FROM pg_catalog.pg_class\n" "FROM pg_catalog.pg_class\n"
"WHERE oid IN (%u, %u, %u, %u);\n", "WHERE oid IN (%u, %u, %u, %u);\n",
LargeObjectRelationId, LargeObjectLOidPNIndexId, LargeObjectRelationId, LargeObjectLOidPNIndexId,
LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId); LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId);
lo_res = ExecuteSqlQuery(fout, loFrozenQry->data, PGRES_TUPLES_OK); lo_res = ExecuteSqlQuery(fout, loFrozenQry->data, PGRES_TUPLES_OK);
@ -4274,7 +4273,7 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
printfPQExpBuffer(query, printfPQExpBuffer(query,
"SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, "); "SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, ");
appendPQExpBufferStr(query, "pol.polpermissive, "); appendPQExpBufferStr(query, "pol.polpermissive, ");
appendPQExpBuffer(query, appendPQExpBuffer(query,
"CASE WHEN pol.polroles = '{0}' THEN NULL ELSE " "CASE WHEN pol.polroles = '{0}' THEN NULL ELSE "
" pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(rolname) from pg_catalog.pg_roles WHERE oid = ANY(pol.polroles)), ', ') END AS polroles, " " pg_catalog.array_to_string(ARRAY(SELECT pg_catalog.quote_ident(rolname) from pg_catalog.pg_roles WHERE oid = ANY(pol.polroles)), ', ') END AS polroles, "
@ -6633,9 +6632,9 @@ getAccessMethods(Archive *fout)
* Select all access methods from pg_am table. * Select all access methods from pg_am table.
*/ */
appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, "); appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"amtype, " "amtype, "
"amhandler::pg_catalog.regproc AS amhandler "); "amhandler::pg_catalog.regproc AS amhandler ");
appendPQExpBufferStr(query, "FROM pg_am"); appendPQExpBufferStr(query, "FROM pg_am");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@ -6827,35 +6826,35 @@ getAggregates(Archive *fout)
* Find all interesting aggregates. See comment in getFuncs() for the * Find all interesting aggregates. See comment in getFuncs() for the
* rationale behind the filtering logic. * rationale behind the filtering logic.
*/ */
agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'" agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'"
: "p.proisagg"); : "p.proisagg");
appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, " appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, "
"p.proname AS aggname, " "p.proname AS aggname, "
"p.pronamespace AS aggnamespace, " "p.pronamespace AS aggnamespace, "
"p.pronargs, p.proargtypes, " "p.pronargs, p.proargtypes, "
"p.proowner, " "p.proowner, "
"p.proacl AS aggacl, " "p.proacl AS aggacl, "
"acldefault('f', p.proowner) AS acldefault " "acldefault('f', p.proowner) AS acldefault "
"FROM pg_proc p " "FROM pg_proc p "
"LEFT JOIN pg_init_privs pip ON " "LEFT JOIN pg_init_privs pip ON "
"(p.oid = pip.objoid " "(p.oid = pip.objoid "
"AND pip.classoid = 'pg_proc'::regclass " "AND pip.classoid = 'pg_proc'::regclass "
"AND pip.objsubid = 0) " "AND pip.objsubid = 0) "
"WHERE %s AND (" "WHERE %s AND ("
"p.pronamespace != " "p.pronamespace != "
"(SELECT oid FROM pg_namespace " "(SELECT oid FROM pg_namespace "
"WHERE nspname = 'pg_catalog') OR " "WHERE nspname = 'pg_catalog') OR "
"p.proacl IS DISTINCT FROM pip.initprivs", "p.proacl IS DISTINCT FROM pip.initprivs",
agg_check); agg_check);
if (dopt->binary_upgrade) if (dopt->binary_upgrade)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
" OR EXISTS(SELECT 1 FROM pg_depend WHERE " " OR EXISTS(SELECT 1 FROM pg_depend WHERE "
"classid = 'pg_proc'::regclass AND " "classid = 'pg_proc'::regclass AND "
"objid = p.oid AND " "objid = p.oid AND "
"refclassid = 'pg_extension'::regclass AND " "refclassid = 'pg_extension'::regclass AND "
"deptype = 'e')"); "deptype = 'e')");
appendPQExpBufferChar(query, ')'); appendPQExpBufferChar(query, ')');
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@ -6957,53 +6956,53 @@ getFuncs(Archive *fout)
* include them, since we want to dump extension members individually in * include them, since we want to dump extension members individually in
* that mode. Also, if they are used by casts or transforms then we need * that mode. Also, if they are used by casts or transforms then we need
* to gather the information about them, though they won't be dumped if * to gather the information about them, though they won't be dumped if
* they are built-in. Also, include functions in * they are built-in. Also, include functions in pg_catalog if they have
* pg_catalog if they have an ACL different from what's shown in * an ACL different from what's shown in pg_init_privs (so we have to join
* pg_init_privs (so we have to join to pg_init_privs; annoying). * to pg_init_privs; annoying).
*/ */
not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'" not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'"
: "NOT p.proisagg"); : "NOT p.proisagg");
appendPQExpBuffer(query, appendPQExpBuffer(query,
"SELECT p.tableoid, p.oid, p.proname, p.prolang, " "SELECT p.tableoid, p.oid, p.proname, p.prolang, "
"p.pronargs, p.proargtypes, p.prorettype, " "p.pronargs, p.proargtypes, p.prorettype, "
"p.proacl, " "p.proacl, "
"acldefault('f', p.proowner) AS acldefault, " "acldefault('f', p.proowner) AS acldefault, "
"p.pronamespace, " "p.pronamespace, "
"p.proowner " "p.proowner "
"FROM pg_proc p " "FROM pg_proc p "
"LEFT JOIN pg_init_privs pip ON " "LEFT JOIN pg_init_privs pip ON "
"(p.oid = pip.objoid " "(p.oid = pip.objoid "
"AND pip.classoid = 'pg_proc'::regclass " "AND pip.classoid = 'pg_proc'::regclass "
"AND pip.objsubid = 0) " "AND pip.objsubid = 0) "
"WHERE %s" "WHERE %s"
"\n AND NOT EXISTS (SELECT 1 FROM pg_depend " "\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
"WHERE classid = 'pg_proc'::regclass AND " "WHERE classid = 'pg_proc'::regclass AND "
"objid = p.oid AND deptype = 'i')" "objid = p.oid AND deptype = 'i')"
"\n AND (" "\n AND ("
"\n pronamespace != " "\n pronamespace != "
"(SELECT oid FROM pg_namespace " "(SELECT oid FROM pg_namespace "
"WHERE nspname = 'pg_catalog')" "WHERE nspname = 'pg_catalog')"
"\n OR EXISTS (SELECT 1 FROM pg_cast" "\n OR EXISTS (SELECT 1 FROM pg_cast"
"\n WHERE pg_cast.oid > %u " "\n WHERE pg_cast.oid > %u "
"\n AND p.oid = pg_cast.castfunc)" "\n AND p.oid = pg_cast.castfunc)"
"\n OR EXISTS (SELECT 1 FROM pg_transform" "\n OR EXISTS (SELECT 1 FROM pg_transform"
"\n WHERE pg_transform.oid > %u AND " "\n WHERE pg_transform.oid > %u AND "
"\n (p.oid = pg_transform.trffromsql" "\n (p.oid = pg_transform.trffromsql"
"\n OR p.oid = pg_transform.trftosql))", "\n OR p.oid = pg_transform.trftosql))",
not_agg_check, not_agg_check,
g_last_builtin_oid, g_last_builtin_oid,
g_last_builtin_oid); g_last_builtin_oid);
if (dopt->binary_upgrade) if (dopt->binary_upgrade)
appendPQExpBufferStr(query,
"\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
"classid = 'pg_proc'::regclass AND "
"objid = p.oid AND "
"refclassid = 'pg_extension'::regclass AND "
"deptype = 'e')");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"\n OR p.proacl IS DISTINCT FROM pip.initprivs"); "\n OR EXISTS(SELECT 1 FROM pg_depend WHERE "
appendPQExpBufferChar(query, ')'); "classid = 'pg_proc'::regclass AND "
"objid = p.oid AND "
"refclassid = 'pg_extension'::regclass AND "
"deptype = 'e')");
appendPQExpBufferStr(query,
"\n OR p.proacl IS DISTINCT FROM pip.initprivs");
appendPQExpBufferChar(query, ')');
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@ -7252,31 +7251,31 @@ getTables(Archive *fout, int *numTables)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"c.relhasoids, "); "c.relhasoids, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"c.relispopulated, "); "c.relispopulated, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"c.relreplident, "); "c.relreplident, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"c.relrowsecurity, c.relforcerowsecurity, "); "c.relrowsecurity, c.relforcerowsecurity, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"c.relminmxid, tc.relminmxid AS tminmxid, "); "c.relminmxid, tc.relminmxid AS tminmxid, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"array_remove(array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, " "array_remove(array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
"CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text " "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
"WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, "); "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"am.amname, "); "am.amname, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"(d.deptype = 'i') IS TRUE AS is_identity_sequence, "); "(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"c.relispartition AS ispartition "); "c.relispartition AS ispartition ");
/* /*
* Left join to pg_depend to pick up dependency info linking sequences to * Left join to pg_depend to pick up dependency info linking sequences to
@ -7296,8 +7295,8 @@ getTables(Archive *fout, int *numTables)
/* /*
* Left join to pg_am to pick up the amname. * Left join to pg_am to pick up the amname.
*/ */
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"LEFT JOIN pg_am am ON (c.relam = am.oid)\n"); "LEFT JOIN pg_am am ON (c.relam = am.oid)\n");
/* /*
* We purposefully ignore toast OIDs for partitioned tables; the reason is * We purposefully ignore toast OIDs for partitioned tables; the reason is
@ -7868,8 +7867,8 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
"t.reloptions AS indreloptions, "); "t.reloptions AS indreloptions, ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"i.indisreplident, "); "i.indisreplident, ");
if (fout->remoteVersion >= 110000) if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
@ -9313,8 +9312,8 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
appendPQExpBufferStr(q, appendPQExpBufferStr(q,
"'' AS attcompression,\n"); "'' AS attcompression,\n");
appendPQExpBufferStr(q, appendPQExpBufferStr(q,
"a.attidentity,\n"); "a.attidentity,\n");
if (fout->remoteVersion >= 110000) if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(q, appendPQExpBufferStr(q,
@ -10717,73 +10716,73 @@ getAdditionalACLs(Archive *fout)
PQclear(res); PQclear(res);
/* Fetch initial-privileges data */ /* Fetch initial-privileges data */
printfPQExpBuffer(query, printfPQExpBuffer(query,
"SELECT objoid, classoid, objsubid, privtype, initprivs " "SELECT objoid, classoid, objsubid, privtype, initprivs "
"FROM pg_init_privs"); "FROM pg_init_privs");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res); ntups = PQntuples(res);
for (i = 0; i < ntups; i++) for (i = 0; i < ntups; i++)
{
Oid objoid = atooid(PQgetvalue(res, i, 0));
Oid classoid = atooid(PQgetvalue(res, i, 1));
int objsubid = atoi(PQgetvalue(res, i, 2));
char privtype = *(PQgetvalue(res, i, 3));
char *initprivs = PQgetvalue(res, i, 4);
CatalogId objId;
DumpableObject *dobj;
objId.tableoid = classoid;
objId.oid = objoid;
dobj = findObjectByCatalogId(objId);
/* OK to ignore entries we haven't got a DumpableObject for */
if (dobj)
{ {
Oid objoid = atooid(PQgetvalue(res, i, 0)); /* Cope with sub-object initprivs */
Oid classoid = atooid(PQgetvalue(res, i, 1)); if (objsubid != 0)
int objsubid = atoi(PQgetvalue(res, i, 2));
char privtype = *(PQgetvalue(res, i, 3));
char *initprivs = PQgetvalue(res, i, 4);
CatalogId objId;
DumpableObject *dobj;
objId.tableoid = classoid;
objId.oid = objoid;
dobj = findObjectByCatalogId(objId);
/* OK to ignore entries we haven't got a DumpableObject for */
if (dobj)
{ {
/* Cope with sub-object initprivs */ if (dobj->objType == DO_TABLE)
if (objsubid != 0)
{ {
if (dobj->objType == DO_TABLE) /* For a column initprivs, set the table's ACL flags */
{ dobj->components |= DUMP_COMPONENT_ACL;
/* For a column initprivs, set the table's ACL flags */ ((TableInfo *) dobj)->hascolumnACLs = true;
dobj->components |= DUMP_COMPONENT_ACL;
((TableInfo *) dobj)->hascolumnACLs = true;
}
else
pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
classoid, objoid, objsubid);
continue;
}
/*
* We ignore any pg_init_privs.initprivs entry for the public
* schema, as explained in getNamespaces().
*/
if (dobj->objType == DO_NAMESPACE &&
strcmp(dobj->name, "public") == 0)
continue;
/* Else it had better be of a type we think has ACLs */
if (dobj->objType == DO_NAMESPACE ||
dobj->objType == DO_TYPE ||
dobj->objType == DO_FUNC ||
dobj->objType == DO_AGG ||
dobj->objType == DO_TABLE ||
dobj->objType == DO_PROCLANG ||
dobj->objType == DO_FDW ||
dobj->objType == DO_FOREIGN_SERVER)
{
DumpableObjectWithAcl *daobj = (DumpableObjectWithAcl *) dobj;
daobj->dacl.privtype = privtype;
daobj->dacl.initprivs = pstrdup(initprivs);
} }
else else
pg_log_warning("unsupported pg_init_privs entry: %u %u %d", pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
classoid, objoid, objsubid); classoid, objoid, objsubid);
continue;
} }
/*
* We ignore any pg_init_privs.initprivs entry for the public
* schema, as explained in getNamespaces().
*/
if (dobj->objType == DO_NAMESPACE &&
strcmp(dobj->name, "public") == 0)
continue;
/* Else it had better be of a type we think has ACLs */
if (dobj->objType == DO_NAMESPACE ||
dobj->objType == DO_TYPE ||
dobj->objType == DO_FUNC ||
dobj->objType == DO_AGG ||
dobj->objType == DO_TABLE ||
dobj->objType == DO_PROCLANG ||
dobj->objType == DO_FDW ||
dobj->objType == DO_FOREIGN_SERVER)
{
DumpableObjectWithAcl *daobj = (DumpableObjectWithAcl *) dobj;
daobj->dacl.privtype = privtype;
daobj->dacl.initprivs = pstrdup(initprivs);
}
else
pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
classoid, objoid, objsubid);
} }
PQclear(res); }
PQclear(res);
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
} }
@ -11128,8 +11127,8 @@ dumpRelationStats_dumper(Archive *fout, const void *userArg, const TocEntry *te)
* The results must be in the order of the relations supplied in the * The results must be in the order of the relations supplied in the
* parameters to ensure we remain in sync as we walk through the TOC. * parameters to ensure we remain in sync as we walk through the TOC.
* *
* For versions before 19, the redundant filter clause on s.tablename = * For versions before 19, the redundant filter clause on s.tablename
* ANY(...) seems sufficient to convince the planner to use * = ANY(...) seems sufficient to convince the planner to use
* pg_class_relname_nsp_index, which avoids a full scan of pg_stats. * pg_class_relname_nsp_index, which avoids a full scan of pg_stats.
* In newer versions, pg_stats returns the table OIDs, eliminating the * In newer versions, pg_stats returns the table OIDs, eliminating the
* need for that hack. * need for that hack.
@ -13469,11 +13468,11 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
"pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n" "pg_catalog.pg_get_function_result(p.oid) AS funcresult,\n"
"proleakproof,\n"); "proleakproof,\n");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"array_to_string(protrftypes, ' ') AS protrftypes,\n"); "array_to_string(protrftypes, ' ') AS protrftypes,\n");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"proparallel,\n"); "proparallel,\n");
if (fout->remoteVersion >= 110000) if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
@ -14963,9 +14962,9 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
/* Get collation-specific details */ /* Get collation-specific details */
appendPQExpBufferStr(query, "SELECT "); appendPQExpBufferStr(query, "SELECT ");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"collprovider, " "collprovider, "
"collversion, "); "collversion, ");
if (fout->remoteVersion >= 120000) if (fout->remoteVersion >= 120000)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
@ -15372,23 +15371,23 @@ dumpAgg(Archive *fout, const AggInfo *agginfo)
"pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n" "pg_catalog.pg_get_function_arguments(p.oid) AS funcargs,\n"
"pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n"); "pg_catalog.pg_get_function_identity_arguments(p.oid) AS funciargs,\n");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"aggkind,\n" "aggkind,\n"
"aggmtransfn,\n" "aggmtransfn,\n"
"aggminvtransfn,\n" "aggminvtransfn,\n"
"aggmfinalfn,\n" "aggmfinalfn,\n"
"aggmtranstype::pg_catalog.regtype,\n" "aggmtranstype::pg_catalog.regtype,\n"
"aggfinalextra,\n" "aggfinalextra,\n"
"aggmfinalextra,\n" "aggmfinalextra,\n"
"aggtransspace,\n" "aggtransspace,\n"
"aggmtransspace,\n" "aggmtransspace,\n"
"aggminitval,\n"); "aggminitval,\n");
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"aggcombinefn,\n" "aggcombinefn,\n"
"aggserialfn,\n" "aggserialfn,\n"
"aggdeserialfn,\n" "aggdeserialfn,\n"
"proparallel,\n"); "proparallel,\n");
if (fout->remoteVersion >= 110000) if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
@ -16848,30 +16847,30 @@ dumpTable(Archive *fout, const TableInfo *tbinfo)
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"PREPARE getColumnACLs(pg_catalog.oid) AS\n"); "PREPARE getColumnACLs(pg_catalog.oid) AS\n");
/* /*
* In principle we should call acldefault('c', relowner) to * In principle we should call acldefault('c', relowner) to get
* get the default ACL for a column. However, we don't * the default ACL for a column. However, we don't currently
* currently store the numeric OID of the relowner in * store the numeric OID of the relowner in TableInfo. We could
* TableInfo. We could convert the owner name using regrole, * convert the owner name using regrole, but that creates a risk
* but that creates a risk of failure due to concurrent role * of failure due to concurrent role renames. Given that the
* renames. Given that the default ACL for columns is empty * default ACL for columns is empty and is likely to stay that
* and is likely to stay that way, it's not worth extra cycles * way, it's not worth extra cycles and risk to avoid hard-wiring
* and risk to avoid hard-wiring that knowledge here. * that knowledge here.
*/ */
appendPQExpBufferStr(query, appendPQExpBufferStr(query,
"SELECT at.attname, " "SELECT at.attname, "
"at.attacl, " "at.attacl, "
"'{}' AS acldefault, " "'{}' AS acldefault, "
"pip.privtype, pip.initprivs " "pip.privtype, pip.initprivs "
"FROM pg_catalog.pg_attribute at " "FROM pg_catalog.pg_attribute at "
"LEFT JOIN pg_catalog.pg_init_privs pip ON " "LEFT JOIN pg_catalog.pg_init_privs pip ON "
"(at.attrelid = pip.objoid " "(at.attrelid = pip.objoid "
"AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass " "AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass "
"AND at.attnum = pip.objsubid) " "AND at.attnum = pip.objsubid) "
"WHERE at.attrelid = $1 AND " "WHERE at.attrelid = $1 AND "
"NOT at.attisdropped " "NOT at.attisdropped "
"AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) " "AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) "
"ORDER BY at.attnum"); "ORDER BY at.attnum");
ExecuteSqlStatement(fout, query->data); ExecuteSqlStatement(fout, query->data);
@ -19165,7 +19164,7 @@ collectSequences(Archive *fout)
* pg_get_sequence_data(), but we only do so for non-schema-only dumps. * pg_get_sequence_data(), but we only do so for non-schema-only dumps.
*/ */
if (fout->remoteVersion < 180000 || if (fout->remoteVersion < 180000 ||
(!fout->dopt->dumpData && !fout->dopt->sequence_data)) (!fout->dopt->dumpData && !fout->dopt->sequence_data))
query = "SELECT seqrelid, format_type(seqtypid, NULL), " query = "SELECT seqrelid, format_type(seqtypid, NULL), "
"seqstart, seqincrement, " "seqstart, seqincrement, "
"seqmax, seqmin, " "seqmax, seqmin, "
@ -19227,15 +19226,14 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo)
qseqname = pg_strdup(fmtId(tbinfo->dobj.name)); qseqname = pg_strdup(fmtId(tbinfo->dobj.name));
/* /*
* The sequence information is gathered in a sorted * The sequence information is gathered in a sorted table before any calls
* table before any calls to dumpSequence(). See collectSequences() for * to dumpSequence(). See collectSequences() for more information.
* more information.
*/ */
Assert(sequences); Assert(sequences);
key.oid = tbinfo->dobj.catId.oid; key.oid = tbinfo->dobj.catId.oid;
seq = bsearch(&key, sequences, nsequences, seq = bsearch(&key, sequences, nsequences,
sizeof(SequenceItem), SequenceItemCmp); sizeof(SequenceItem), SequenceItemCmp);
/* Calculate default limits for a sequence of this type */ /* Calculate default limits for a sequence of this type */
is_ascending = (seq->incby >= 0); is_ascending = (seq->incby >= 0);

View file

@ -785,11 +785,11 @@ dropRoles(PGconn *conn)
int i_rolname; int i_rolname;
int i; int i;
printfPQExpBuffer(buf, printfPQExpBuffer(buf,
"SELECT rolname " "SELECT rolname "
"FROM %s " "FROM %s "
"WHERE rolname !~ '^pg_' " "WHERE rolname !~ '^pg_' "
"ORDER BY 1", role_catalog); "ORDER BY 1", role_catalog);
res = executeQuery(conn, buf->data); res = executeQuery(conn, buf->data);
@ -843,16 +843,16 @@ dumpRoles(PGconn *conn)
* Notes: rolconfig is dumped later, and pg_authid must be used for * Notes: rolconfig is dumped later, and pg_authid must be used for
* extracting rolcomment regardless of role_catalog. * extracting rolcomment regardless of role_catalog.
*/ */
printfPQExpBuffer(buf, printfPQExpBuffer(buf,
"SELECT oid, rolname, rolsuper, rolinherit, " "SELECT oid, rolname, rolsuper, rolinherit, "
"rolcreaterole, rolcreatedb, " "rolcreaterole, rolcreatedb, "
"rolcanlogin, rolconnlimit, rolpassword, " "rolcanlogin, rolconnlimit, rolpassword, "
"rolvaliduntil, rolreplication, rolbypassrls, " "rolvaliduntil, rolreplication, rolbypassrls, "
"pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, " "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, "
"rolname = current_user AS is_current_user " "rolname = current_user AS is_current_user "
"FROM %s " "FROM %s "
"WHERE rolname !~ '^pg_' " "WHERE rolname !~ '^pg_' "
"ORDER BY 2", role_catalog); "ORDER BY 2", role_catalog);
res = executeQuery(conn, buf->data); res = executeQuery(conn, buf->data);

View file

@ -1475,15 +1475,15 @@ check_for_incompatible_polymorphics(ClusterInfo *cluster)
", 'array_cat(anyarray,anyarray)'" ", 'array_cat(anyarray,anyarray)'"
", 'array_prepend(anyelement,anyarray)'"); ", 'array_prepend(anyelement,anyarray)'");
appendPQExpBufferStr(&old_polymorphics, appendPQExpBufferStr(&old_polymorphics,
", 'array_remove(anyarray,anyelement)'" ", 'array_remove(anyarray,anyelement)'"
", 'array_replace(anyarray,anyelement,anyelement)'"); ", 'array_replace(anyarray,anyelement,anyelement)'");
appendPQExpBufferStr(&old_polymorphics, appendPQExpBufferStr(&old_polymorphics,
", 'array_position(anyarray,anyelement)'" ", 'array_position(anyarray,anyelement)'"
", 'array_position(anyarray,anyelement,integer)'" ", 'array_position(anyarray,anyelement,integer)'"
", 'array_positions(anyarray,anyelement)'" ", 'array_positions(anyarray,anyelement)'"
", 'width_bucket(anyelement,anyarray)'"); ", 'width_bucket(anyelement,anyarray)'");
/* /*
* The query below hardcodes FirstNormalObjectId as 16384 rather than * The query below hardcodes FirstNormalObjectId as 16384 rather than

View file

@ -228,7 +228,7 @@ get_control_data(ClusterInfo *cluster)
p++; /* remove ':' char */ p++; /* remove ':' char */
cluster->controldata.chkpnt_nxtepoch = str2uint(p); cluster->controldata.chkpnt_nxtepoch = str2uint(p);
p = strchr(p, ':'); p = strchr(p, ':');
if (p == NULL || strlen(p) <= 1) if (p == NULL || strlen(p) <= 1)
pg_fatal("%d: controldata retrieval problem", __LINE__); pg_fatal("%d: controldata retrieval problem", __LINE__);

View file

@ -55,7 +55,7 @@ get_bin_version(ClusterInfo *cluster)
if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1) if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
pg_fatal("could not get pg_ctl version output from %s", cmd); pg_fatal("could not get pg_ctl version output from %s", cmd);
cluster->bin_version = v1 * 10000; cluster->bin_version = v1 * 10000;
} }
@ -344,8 +344,8 @@ check_data_dir(ClusterInfo *cluster)
check_single_dir(pg_data, "pg_subtrans"); check_single_dir(pg_data, "pg_subtrans");
check_single_dir(pg_data, PG_TBLSPC_DIR); check_single_dir(pg_data, PG_TBLSPC_DIR);
check_single_dir(pg_data, "pg_twophase"); check_single_dir(pg_data, "pg_twophase");
check_single_dir(pg_data, "pg_wal"); check_single_dir(pg_data, "pg_wal");
check_single_dir(pg_data, "pg_xact"); check_single_dir(pg_data, "pg_xact");
} }
@ -385,7 +385,7 @@ check_bin_dir(ClusterInfo *cluster, bool check_versions)
*/ */
get_bin_version(cluster); get_bin_version(cluster);
check_exec(cluster->bindir, "pg_resetwal", check_versions); check_exec(cluster->bindir, "pg_resetwal", check_versions);
if (cluster == &new_cluster) if (cluster == &new_cluster)
{ {

View file

@ -61,52 +61,52 @@ rewrite_multixacts(MultiXactId from_multi, MultiXactId to_multi)
* Convert old multixids, if needed, by reading them one-by-one from the * Convert old multixids, if needed, by reading them one-by-one from the
* old cluster. * old cluster.
*/ */
old_reader = AllocOldMultiXactRead(old_cluster.pgdata, old_reader = AllocOldMultiXactRead(old_cluster.pgdata,
old_cluster.controldata.chkpnt_nxtmulti, old_cluster.controldata.chkpnt_nxtmulti,
old_cluster.controldata.chkpnt_nxtmxoff); old_cluster.controldata.chkpnt_nxtmxoff);
for (MultiXactId multi = from_multi; multi != to_multi;) for (MultiXactId multi = from_multi; multi != to_multi;)
{
MultiXactMember member;
bool multixid_valid;
/*
* Read this multixid's members.
*
* Locking-only XIDs that may be part of multi-xids don't matter after
* upgrade, as there can be no transactions running across upgrade. So
* as a small optimization, we only read one member from each
* multixid: the one updating one, or if there was no update,
* arbitrarily the first locking xid.
*/
multixid_valid = GetOldMultiXactIdSingleMember(old_reader, multi, &member);
/*
* Write the new offset to pg_multixact/offsets.
*
* Even if this multixid is invalid, we still need to write its offset
* if the *previous* multixid was valid. That's because when reading
* a multixid, the number of members is calculated from the difference
* between the two offsets.
*/
RecordMultiXactOffset(offsets_writer, multi,
(multixid_valid || prev_multixid_valid) ? next_offset : 0);
/* Write the members */
if (multixid_valid)
{ {
MultiXactMember member; RecordMultiXactMembers(members_writer, next_offset, 1, &member);
bool multixid_valid; next_offset += 1;
/*
* Read this multixid's members.
*
* Locking-only XIDs that may be part of multi-xids don't matter
* after upgrade, as there can be no transactions running across
* upgrade. So as a small optimization, we only read one member
* from each multixid: the one updating one, or if there was no
* update, arbitrarily the first locking xid.
*/
multixid_valid = GetOldMultiXactIdSingleMember(old_reader, multi, &member);
/*
* Write the new offset to pg_multixact/offsets.
*
* Even if this multixid is invalid, we still need to write its
* offset if the *previous* multixid was valid. That's because
* when reading a multixid, the number of members is calculated
* from the difference between the two offsets.
*/
RecordMultiXactOffset(offsets_writer, multi,
(multixid_valid || prev_multixid_valid) ? next_offset : 0);
/* Write the members */
if (multixid_valid)
{
RecordMultiXactMembers(members_writer, next_offset, 1, &member);
next_offset += 1;
}
/* Advance to next multixid, handling wraparound */
multi++;
if (multi < FirstMultiXactId)
multi = FirstMultiXactId;
prev_multixid_valid = multixid_valid;
} }
FreeOldMultiXactReader(old_reader); /* Advance to next multixid, handling wraparound */
multi++;
if (multi < FirstMultiXactId)
multi = FirstMultiXactId;
prev_multixid_valid = multixid_valid;
}
FreeOldMultiXactReader(old_reader);
/* Write the final 'next' offset to the last SLRU page */ /* Write the final 'next' offset to the last SLRU page */
RecordMultiXactOffset(offsets_writer, to_multi, RecordMultiXactOffset(offsets_writer, to_multi,

View file

@ -833,7 +833,7 @@ copy_xact_xlog_xid(void)
* Determine the range of multixacts to convert. * Determine the range of multixacts to convert.
*/ */
nxtmulti = old_cluster.controldata.chkpnt_nxtmulti; nxtmulti = old_cluster.controldata.chkpnt_nxtmulti;
oldstMulti = old_cluster.controldata.chkpnt_oldstMulti; oldstMulti = old_cluster.controldata.chkpnt_oldstMulti;
/* handle wraparound */ /* handle wraparound */
if (nxtmulti < FirstMultiXactId) if (nxtmulti < FirstMultiXactId)
nxtmulti = FirstMultiXactId; nxtmulti = FirstMultiXactId;
@ -898,15 +898,15 @@ set_frozenxids(void)
int i_datname; int i_datname;
int i_datallowconn; int i_datallowconn;
prep_status("Setting frozenxid and minmxid counters in new cluster"); prep_status("Setting frozenxid and minmxid counters in new cluster");
conn_template1 = connectToServer(&new_cluster, "template1"); conn_template1 = connectToServer(&new_cluster, "template1");
/* set pg_database.datfrozenxid */ /* set pg_database.datfrozenxid */
PQclear(executeQueryOrDie(conn_template1, PQclear(executeQueryOrDie(conn_template1,
"UPDATE pg_catalog.pg_database " "UPDATE pg_catalog.pg_database "
"SET datfrozenxid = '%u'", "SET datfrozenxid = '%u'",
old_cluster.controldata.chkpnt_nxtxid)); old_cluster.controldata.chkpnt_nxtxid));
/* set pg_database.datminmxid */ /* set pg_database.datminmxid */
PQclear(executeQueryOrDie(conn_template1, PQclear(executeQueryOrDie(conn_template1,
@ -942,16 +942,16 @@ set_frozenxids(void)
conn = connectToServer(&new_cluster, datname); conn = connectToServer(&new_cluster, datname);
/* set pg_class.relfrozenxid */ /* set pg_class.relfrozenxid */
PQclear(executeQueryOrDie(conn, PQclear(executeQueryOrDie(conn,
"UPDATE pg_catalog.pg_class " "UPDATE pg_catalog.pg_class "
"SET relfrozenxid = '%u' " "SET relfrozenxid = '%u' "
/* only heap, materialized view, and TOAST are vacuumed */ /* only heap, materialized view, and TOAST are vacuumed */
"WHERE relkind IN (" "WHERE relkind IN ("
CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_RELATION) ", "
CppAsString2(RELKIND_MATVIEW) ", " CppAsString2(RELKIND_MATVIEW) ", "
CppAsString2(RELKIND_TOASTVALUE) ")", CppAsString2(RELKIND_TOASTVALUE) ")",
old_cluster.controldata.chkpnt_nxtxid)); old_cluster.controldata.chkpnt_nxtxid));
/* set pg_class.relminmxid */ /* set pg_class.relminmxid */
PQclear(executeQueryOrDie(conn, PQclear(executeQueryOrDie(conn,

View file

@ -587,32 +587,32 @@ transfer_relfile(FileNameMap *map, const char *type_suffix)
/* Copying files might take some time, so give feedback. */ /* Copying files might take some time, so give feedback. */
pg_log(PG_STATUS, "%s", old_file); pg_log(PG_STATUS, "%s", old_file);
switch (user_opts.transfer_mode) switch (user_opts.transfer_mode)
{ {
case TRANSFER_MODE_CLONE: case TRANSFER_MODE_CLONE:
pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"", pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"",
old_file, new_file); old_file, new_file);
cloneFile(old_file, new_file, map->nspname, map->relname); cloneFile(old_file, new_file, map->nspname, map->relname);
break; break;
case TRANSFER_MODE_COPY: case TRANSFER_MODE_COPY:
pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"", pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"",
old_file, new_file); old_file, new_file);
copyFile(old_file, new_file, map->nspname, map->relname); copyFile(old_file, new_file, map->nspname, map->relname);
break; break;
case TRANSFER_MODE_COPY_FILE_RANGE: case TRANSFER_MODE_COPY_FILE_RANGE:
pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\" with copy_file_range", pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\" with copy_file_range",
old_file, new_file); old_file, new_file);
copyFileByRange(old_file, new_file, map->nspname, map->relname); copyFileByRange(old_file, new_file, map->nspname, map->relname);
break; break;
case TRANSFER_MODE_LINK: case TRANSFER_MODE_LINK:
pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"", pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"",
old_file, new_file); old_file, new_file);
linkFile(old_file, new_file, map->nspname, map->relname); linkFile(old_file, new_file, map->nspname, map->relname);
break; break;
case TRANSFER_MODE_SWAP: case TRANSFER_MODE_SWAP:
/* swap mode is handled in its own code path */ /* swap mode is handled in its own code path */
pg_fatal("should never happen"); pg_fatal("should never happen");
break; break;
} }
} }
} }

View file

@ -29,10 +29,8 @@ sub test_mode
} }
$new->init(); $new->init();
$new->append_conf('postgresql.conf', $new->append_conf('postgresql.conf', "allow_in_place_tablespaces = true");
"allow_in_place_tablespaces = true"); $old->append_conf('postgresql.conf', "allow_in_place_tablespaces = true");
$old->append_conf('postgresql.conf',
"allow_in_place_tablespaces = true");
# We can only test security labels if both the old and new installations # We can only test security labels if both the old and new installations
# have dummy_seclabel. # have dummy_seclabel.
@ -76,15 +74,14 @@ sub test_mode
"CREATE TABLE test4 AS SELECT generate_series(400, 502)"); "CREATE TABLE test4 AS SELECT generate_series(400, 502)");
} }
$old->safe_psql('postgres', $old->safe_psql('postgres', "CREATE TABLESPACE inplc_tblspc LOCATION ''");
"CREATE TABLESPACE inplc_tblspc LOCATION ''"); $old->safe_psql('postgres',
$old->safe_psql('postgres', "CREATE DATABASE testdb3 TABLESPACE inplc_tblspc");
"CREATE DATABASE testdb3 TABLESPACE inplc_tblspc"); $old->safe_psql('postgres',
$old->safe_psql('postgres', "CREATE TABLE test5 TABLESPACE inplc_tblspc AS SELECT generate_series(503, 606)"
"CREATE TABLE test5 TABLESPACE inplc_tblspc AS SELECT generate_series(503, 606)" );
); $old->safe_psql('testdb3',
$old->safe_psql('testdb3', "CREATE TABLE test6 AS SELECT generate_series(607, 711)");
"CREATE TABLE test6 AS SELECT generate_series(607, 711)");
# While we are here, test handling of large objects. # While we are here, test handling of large objects.
$old->safe_psql( $old->safe_psql(
@ -152,12 +149,10 @@ sub test_mode
} }
# Tests for in-place tablespaces. # Tests for in-place tablespaces.
$result = $result = $new->safe_psql('postgres', "SELECT COUNT(*) FROM test5");
$new->safe_psql('postgres', "SELECT COUNT(*) FROM test5"); is($result, '104', "test5 data after pg_upgrade $mode");
is($result, '104', "test5 data after pg_upgrade $mode"); $result = $new->safe_psql('testdb3', "SELECT COUNT(*) FROM test6");
$result = is($result, '105', "test6 data after pg_upgrade $mode");
$new->safe_psql('testdb3', "SELECT COUNT(*) FROM test6");
is($result, '105', "test6 data after pg_upgrade $mode");
# Tests for large objects # Tests for large objects
$result = $new->safe_psql('postgres', "SELECT lo_get(4532)"); $result = $new->safe_psql('postgres', "SELECT lo_get(4532)");

View file

@ -6278,23 +6278,22 @@ get_create_object_cmd(EditableObjectType obj_type, Oid oid,
* ensure the right view gets replaced. Also, check relation kind * ensure the right view gets replaced. Also, check relation kind
* to be sure it's a view. * to be sure it's a view.
* *
* Views may have WITH [LOCAL|CASCADED] * Views may have WITH [LOCAL|CASCADED] CHECK OPTION. These are
* CHECK OPTION. These are not part of the view definition * not part of the view definition returned by pg_get_viewdef()
* returned by pg_get_viewdef() and so need to be retrieved * and so need to be retrieved separately. Materialized views may
* separately. Materialized views may have * have arbitrary storage parameter reloptions.
* arbitrary storage parameter reloptions.
*/ */
printfPQExpBuffer(query, "/* %s */\n", _("Get view's definition and details")); printfPQExpBuffer(query, "/* %s */\n", _("Get view's definition and details"));
appendPQExpBuffer(query, appendPQExpBuffer(query,
"SELECT nspname, relname, relkind, " "SELECT nspname, relname, relkind, "
"pg_catalog.pg_get_viewdef(c.oid, true), " "pg_catalog.pg_get_viewdef(c.oid, true), "
"pg_catalog.array_remove(pg_catalog.array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, " "pg_catalog.array_remove(pg_catalog.array_remove(c.reloptions,'check_option=local'),'check_option=cascaded') AS reloptions, "
"CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text " "CASE WHEN 'check_option=local' = ANY (c.reloptions) THEN 'LOCAL'::text "
"WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption " "WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption "
"FROM pg_catalog.pg_class c " "FROM pg_catalog.pg_class c "
"LEFT JOIN pg_catalog.pg_namespace n " "LEFT JOIN pg_catalog.pg_namespace n "
"ON c.relnamespace = n.oid WHERE c.oid = %u", "ON c.relnamespace = n.oid WHERE c.oid = %u",
oid); oid);
break; break;
} }

View file

@ -387,19 +387,19 @@ describeFunctions(const char *functypes, const char *func_pattern,
gettext_noop("stable"), gettext_noop("stable"),
gettext_noop("volatile"), gettext_noop("volatile"),
gettext_noop("Volatility")); gettext_noop("Volatility"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
",\n CASE\n" ",\n CASE\n"
" WHEN p.proparallel = " " WHEN p.proparallel = "
CppAsString2(PROPARALLEL_RESTRICTED) " THEN '%s'\n" CppAsString2(PROPARALLEL_RESTRICTED) " THEN '%s'\n"
" WHEN p.proparallel = " " WHEN p.proparallel = "
CppAsString2(PROPARALLEL_SAFE) " THEN '%s'\n" CppAsString2(PROPARALLEL_SAFE) " THEN '%s'\n"
" WHEN p.proparallel = " " WHEN p.proparallel = "
CppAsString2(PROPARALLEL_UNSAFE) " THEN '%s'\n" CppAsString2(PROPARALLEL_UNSAFE) " THEN '%s'\n"
" END as \"%s\"", " END as \"%s\"",
gettext_noop("restricted"), gettext_noop("restricted"),
gettext_noop("safe"), gettext_noop("safe"),
gettext_noop("unsafe"), gettext_noop("unsafe"),
gettext_noop("Parallel")); gettext_noop("Parallel"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
",\n pg_catalog.pg_get_userbyid(p.proowner) as \"%s\"" ",\n pg_catalog.pg_get_userbyid(p.proowner) as \"%s\""
",\n CASE WHEN prosecdef THEN '%s' ELSE '%s' END AS \"%s\"" ",\n CASE WHEN prosecdef THEN '%s' ELSE '%s' END AS \"%s\""
@ -599,8 +599,8 @@ describeFunctions(const char *functypes, const char *func_pattern,
myopt.title = _("List of functions"); myopt.title = _("List of functions");
myopt.translate_header = true; myopt.translate_header = true;
myopt.translate_columns = translate_columns; myopt.translate_columns = translate_columns;
myopt.n_translate_columns = lengthof(translate_columns); myopt.n_translate_columns = lengthof(translate_columns);
printQuery(res, &myopt, pset.queryFout, false, pset.logfile); printQuery(res, &myopt, pset.queryFout, false, pset.logfile);
@ -1086,38 +1086,38 @@ permissionsList(const char *pattern, bool showSystem)
" ), E'\\n') AS \"%s\"", " ), E'\\n') AS \"%s\"",
gettext_noop("Column privileges")); gettext_noop("Column privileges"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
",\n pg_catalog.array_to_string(ARRAY(\n" ",\n pg_catalog.array_to_string(ARRAY(\n"
" SELECT polname\n" " SELECT polname\n"
" || CASE WHEN NOT polpermissive THEN\n" " || CASE WHEN NOT polpermissive THEN\n"
" E' (RESTRICTIVE)'\n" " E' (RESTRICTIVE)'\n"
" ELSE '' END\n" " ELSE '' END\n"
" || CASE WHEN polcmd != '*' THEN\n" " || CASE WHEN polcmd != '*' THEN\n"
" E' (' || polcmd::pg_catalog.text || E'):'\n" " E' (' || polcmd::pg_catalog.text || E'):'\n"
" ELSE E':'\n" " ELSE E':'\n"
" END\n" " END\n"
" || CASE WHEN polqual IS NOT NULL THEN\n" " || CASE WHEN polqual IS NOT NULL THEN\n"
" E'\\n (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)\n" " E'\\n (u): ' || pg_catalog.pg_get_expr(polqual, polrelid)\n"
" ELSE E''\n" " ELSE E''\n"
" END\n" " END\n"
" || CASE WHEN polwithcheck IS NOT NULL THEN\n" " || CASE WHEN polwithcheck IS NOT NULL THEN\n"
" E'\\n (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)\n" " E'\\n (c): ' || pg_catalog.pg_get_expr(polwithcheck, polrelid)\n"
" ELSE E''\n" " ELSE E''\n"
" END" " END"
" || CASE WHEN polroles <> '{0}' THEN\n" " || CASE WHEN polroles <> '{0}' THEN\n"
" E'\\n to: ' || pg_catalog.array_to_string(\n" " E'\\n to: ' || pg_catalog.array_to_string(\n"
" ARRAY(\n" " ARRAY(\n"
" SELECT rolname\n" " SELECT rolname\n"
" FROM pg_catalog.pg_roles\n" " FROM pg_catalog.pg_roles\n"
" WHERE oid = ANY (polroles)\n" " WHERE oid = ANY (polroles)\n"
" ORDER BY 1\n" " ORDER BY 1\n"
" ), E', ')\n" " ), E', ')\n"
" ELSE E''\n" " ELSE E''\n"
" END\n" " END\n"
" FROM pg_catalog.pg_policy pol\n" " FROM pg_catalog.pg_policy pol\n"
" WHERE polrelid = c.oid), E'\\n')\n" " WHERE polrelid = c.oid), E'\\n')\n"
" AS \"%s\"", " AS \"%s\"",
gettext_noop("Policies")); gettext_noop("Policies"));
appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_class c\n" appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_class c\n"
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n" " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
@ -1675,27 +1675,27 @@ describeOneTableDetails(const char *schemaname,
char *footers[3] = {NULL, NULL, NULL}; char *footers[3] = {NULL, NULL, NULL};
printfPQExpBuffer(&buf, "/* %s */\n", _("Get sequence information")); printfPQExpBuffer(&buf, "/* %s */\n", _("Get sequence information"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
"SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n" "SELECT pg_catalog.format_type(seqtypid, NULL) AS \"%s\",\n"
" seqstart AS \"%s\",\n" " seqstart AS \"%s\",\n"
" seqmin AS \"%s\",\n" " seqmin AS \"%s\",\n"
" seqmax AS \"%s\",\n" " seqmax AS \"%s\",\n"
" seqincrement AS \"%s\",\n" " seqincrement AS \"%s\",\n"
" CASE WHEN seqcycle THEN '%s' ELSE '%s' END AS \"%s\",\n" " CASE WHEN seqcycle THEN '%s' ELSE '%s' END AS \"%s\",\n"
" seqcache AS \"%s\"\n", " seqcache AS \"%s\"\n",
gettext_noop("Type"), gettext_noop("Type"),
gettext_noop("Start"), gettext_noop("Start"),
gettext_noop("Minimum"), gettext_noop("Minimum"),
gettext_noop("Maximum"), gettext_noop("Maximum"),
gettext_noop("Increment"), gettext_noop("Increment"),
gettext_noop("yes"), gettext_noop("yes"),
gettext_noop("no"), gettext_noop("no"),
gettext_noop("Cycles?"), gettext_noop("Cycles?"),
gettext_noop("Cache")); gettext_noop("Cache"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
"FROM pg_catalog.pg_sequence\n" "FROM pg_catalog.pg_sequence\n"
"WHERE seqrelid = '%s';", "WHERE seqrelid = '%s';",
oid); oid);
res = PSQLexec(buf.data); res = PSQLexec(buf.data);
if (!res) if (!res)
@ -1913,7 +1913,7 @@ describeOneTableDetails(const char *schemaname,
appendPQExpBufferStr(&buf, ",\n (SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t\n" appendPQExpBufferStr(&buf, ",\n (SELECT c.collname FROM pg_catalog.pg_collation c, pg_catalog.pg_type t\n"
" WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) AS attcollation"); " WHERE c.oid = a.attcollation AND t.oid = a.atttypid AND a.attcollation <> t.typcollation) AS attcollation");
attcoll_col = cols++; attcoll_col = cols++;
appendPQExpBufferStr(&buf, ",\n a.attidentity"); appendPQExpBufferStr(&buf, ",\n a.attidentity");
attidentity_col = cols++; attidentity_col = cols++;
if (pset.sversion >= 120000) if (pset.sversion >= 120000)
appendPQExpBufferStr(&buf, ",\n a.attgenerated"); appendPQExpBufferStr(&buf, ",\n a.attgenerated");
@ -2326,7 +2326,7 @@ describeOneTableDetails(const char *schemaname,
CppAsString2(CONSTRAINT_EXCLUSION) ") AND " CppAsString2(CONSTRAINT_EXCLUSION) ") AND "
"condeferred) AS condeferred,\n"); "condeferred) AS condeferred,\n");
appendPQExpBufferStr(&buf, "i.indisreplident,\n"); appendPQExpBufferStr(&buf, "i.indisreplident,\n");
if (pset.sversion >= 150000) if (pset.sversion >= 150000)
appendPQExpBufferStr(&buf, "i.indnullsnotdistinct,\n"); appendPQExpBufferStr(&buf, "i.indnullsnotdistinct,\n");
@ -2431,7 +2431,7 @@ describeOneTableDetails(const char *schemaname,
"pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),\n " "pg_catalog.pg_get_indexdef(i.indexrelid, 0, true),\n "
"pg_catalog.pg_get_constraintdef(con.oid, true), " "pg_catalog.pg_get_constraintdef(con.oid, true), "
"contype, condeferrable, condeferred"); "contype, condeferrable, condeferred");
appendPQExpBufferStr(&buf, ", i.indisreplident"); appendPQExpBufferStr(&buf, ", i.indisreplident");
appendPQExpBufferStr(&buf, ", c2.reltablespace"); appendPQExpBufferStr(&buf, ", c2.reltablespace");
if (pset.sversion >= 180000) if (pset.sversion >= 180000)
appendPQExpBufferStr(&buf, ", con.conperiod"); appendPQExpBufferStr(&buf, ", con.conperiod");
@ -2682,81 +2682,80 @@ describeOneTableDetails(const char *schemaname,
PQclear(result); PQclear(result);
/* print any row-level policies */ /* print any row-level policies */
printfPQExpBuffer(&buf, "/* %s */\n", printfPQExpBuffer(&buf, "/* %s */\n",
_("Get row-level policies for this table")); _("Get row-level policies for this table"));
appendPQExpBufferStr(&buf, "SELECT pol.polname,"); appendPQExpBufferStr(&buf, "SELECT pol.polname,");
appendPQExpBufferStr(&buf, appendPQExpBufferStr(&buf,
" pol.polpermissive,\n"); " pol.polpermissive,\n");
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
" CASE WHEN pol.polroles = '{0}' THEN NULL ELSE pg_catalog.array_to_string(array(select rolname from pg_catalog.pg_roles where oid = any (pol.polroles) order by 1),',') END,\n" " CASE WHEN pol.polroles = '{0}' THEN NULL ELSE pg_catalog.array_to_string(array(select rolname from pg_catalog.pg_roles where oid = any (pol.polroles) order by 1),',') END,\n"
" pg_catalog.pg_get_expr(pol.polqual, pol.polrelid),\n" " pg_catalog.pg_get_expr(pol.polqual, pol.polrelid),\n"
" pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid),\n" " pg_catalog.pg_get_expr(pol.polwithcheck, pol.polrelid),\n"
" CASE pol.polcmd\n" " CASE pol.polcmd\n"
" WHEN 'r' THEN 'SELECT'\n" " WHEN 'r' THEN 'SELECT'\n"
" WHEN 'a' THEN 'INSERT'\n" " WHEN 'a' THEN 'INSERT'\n"
" WHEN 'w' THEN 'UPDATE'\n" " WHEN 'w' THEN 'UPDATE'\n"
" WHEN 'd' THEN 'DELETE'\n" " WHEN 'd' THEN 'DELETE'\n"
" END AS cmd\n" " END AS cmd\n"
"FROM pg_catalog.pg_policy pol\n" "FROM pg_catalog.pg_policy pol\n"
"WHERE pol.polrelid = '%s' ORDER BY 1;", "WHERE pol.polrelid = '%s' ORDER BY 1;",
oid); oid);
result = PSQLexec(buf.data); result = PSQLexec(buf.data);
if (!result) if (!result)
goto error_return; goto error_return;
else else
tuples = PQntuples(result); tuples = PQntuples(result);
/* /*
* Handle cases where RLS is enabled and there are policies, or * Handle cases where RLS is enabled and there are policies, or there
* there aren't policies, or RLS isn't enabled but there are * aren't policies, or RLS isn't enabled but there are policies
* policies */
*/ if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples > 0)
if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples > 0) printTableAddFooter(&cont, _("Policies:"));
printTableAddFooter(&cont, _("Policies:"));
if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples > 0) if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples > 0)
printTableAddFooter(&cont, _("Policies (forced row security enabled):")); printTableAddFooter(&cont, _("Policies (forced row security enabled):"));
if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples == 0) if (tableinfo.rowsecurity && !tableinfo.forcerowsecurity && tuples == 0)
printTableAddFooter(&cont, _("Policies (row security enabled): (none)")); printTableAddFooter(&cont, _("Policies (row security enabled): (none)"));
if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples == 0) if (tableinfo.rowsecurity && tableinfo.forcerowsecurity && tuples == 0)
printTableAddFooter(&cont, _("Policies (forced row security enabled): (none)")); printTableAddFooter(&cont, _("Policies (forced row security enabled): (none)"));
if (!tableinfo.rowsecurity && tuples > 0) if (!tableinfo.rowsecurity && tuples > 0)
printTableAddFooter(&cont, _("Policies (row security disabled):")); printTableAddFooter(&cont, _("Policies (row security disabled):"));
/* Might be an empty set - that's ok */ /* Might be an empty set - that's ok */
for (i = 0; i < tuples; i++) for (i = 0; i < tuples; i++)
{
printfPQExpBuffer(&buf, " POLICY \"%s\"",
PQgetvalue(result, i, 0));
if (*(PQgetvalue(result, i, 1)) == 'f')
appendPQExpBufferStr(&buf, " AS RESTRICTIVE");
if (!PQgetisnull(result, i, 5))
appendPQExpBuffer(&buf, " FOR %s",
PQgetvalue(result, i, 5));
if (!PQgetisnull(result, i, 2))
{ {
printfPQExpBuffer(&buf, " POLICY \"%s\"", appendPQExpBuffer(&buf, "\n TO %s",
PQgetvalue(result, i, 0)); PQgetvalue(result, i, 2));
if (*(PQgetvalue(result, i, 1)) == 'f')
appendPQExpBufferStr(&buf, " AS RESTRICTIVE");
if (!PQgetisnull(result, i, 5))
appendPQExpBuffer(&buf, " FOR %s",
PQgetvalue(result, i, 5));
if (!PQgetisnull(result, i, 2))
{
appendPQExpBuffer(&buf, "\n TO %s",
PQgetvalue(result, i, 2));
}
if (!PQgetisnull(result, i, 3))
appendPQExpBuffer(&buf, "\n USING (%s)",
PQgetvalue(result, i, 3));
if (!PQgetisnull(result, i, 4))
appendPQExpBuffer(&buf, "\n WITH CHECK (%s)",
PQgetvalue(result, i, 4));
printTableAddFooter(&cont, buf.data);
} }
PQclear(result);
if (!PQgetisnull(result, i, 3))
appendPQExpBuffer(&buf, "\n USING (%s)",
PQgetvalue(result, i, 3));
if (!PQgetisnull(result, i, 4))
appendPQExpBuffer(&buf, "\n WITH CHECK (%s)",
PQgetvalue(result, i, 4));
printTableAddFooter(&cont, buf.data);
}
PQclear(result);
/* print any extended statistics */ /* print any extended statistics */
if (pset.sversion >= 140000) if (pset.sversion >= 140000)
@ -3025,115 +3024,115 @@ describeOneTableDetails(const char *schemaname,
} }
/* print any publications */ /* print any publications */
printfPQExpBuffer(&buf, "/* %s */\n", printfPQExpBuffer(&buf, "/* %s */\n",
_("Get publications that publish this table")); _("Get publications that publish this table"));
if (pset.sversion >= 150000) if (pset.sversion >= 150000)
{ {
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
"SELECT pubname\n" "SELECT pubname\n"
" , NULL\n" " , NULL\n"
" , NULL\n" " , NULL\n"
"FROM pg_catalog.pg_publication p\n" "FROM pg_catalog.pg_publication p\n"
" JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n" " JOIN pg_catalog.pg_publication_namespace pn ON p.oid = pn.pnpubid\n"
" JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n" " JOIN pg_catalog.pg_class pc ON pc.relnamespace = pn.pnnspid\n"
"WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n" "WHERE pc.oid ='%s' and pg_catalog.pg_relation_is_publishable('%s')\n"
"UNION\n" "UNION\n"
"SELECT pubname\n" "SELECT pubname\n"
" , pg_catalog.pg_get_expr(pr.prqual, c.oid)\n" " , pg_catalog.pg_get_expr(pr.prqual, c.oid)\n"
" , (CASE WHEN pr.prattrs IS NOT NULL THEN\n" " , (CASE WHEN pr.prattrs IS NOT NULL THEN\n"
" (SELECT pg_catalog.string_agg(attname, ', ')\n" " (SELECT pg_catalog.string_agg(attname, ', ')\n"
" FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n" " FROM pg_catalog.generate_series(0, pg_catalog.array_upper(pr.prattrs::pg_catalog.int2[], 1)) s,\n"
" pg_catalog.pg_attribute\n" " pg_catalog.pg_attribute\n"
" WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n" " WHERE attrelid = pr.prrelid AND attnum = prattrs[s])\n"
" ELSE NULL END) " " ELSE NULL END) "
"FROM pg_catalog.pg_publication p\n" "FROM pg_catalog.pg_publication p\n"
" JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n" " JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
" JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n" " JOIN pg_catalog.pg_class c ON c.oid = pr.prrelid\n"
"WHERE pr.prrelid = '%s'\n", "WHERE pr.prrelid = '%s'\n",
oid, oid, oid); oid, oid, oid);
if (pset.sversion >= 190000) if (pset.sversion >= 190000)
{
/*
* Skip entries where this relation appears in the
* publication's EXCEPT list.
*/
appendPQExpBuffer(&buf,
" AND NOT pr.prexcept\n"
"UNION\n"
"SELECT pubname\n"
" , NULL\n"
" , NULL\n"
"FROM pg_catalog.pg_publication p\n"
"WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
" AND NOT EXISTS (\n"
" SELECT 1\n"
" FROM pg_catalog.pg_publication_rel pr\n"
" WHERE pr.prpubid = p.oid AND\n"
" (pr.prrelid = '%s' OR pr.prrelid = pg_catalog.pg_partition_root('%s')))\n"
"ORDER BY 1;",
oid, oid, oid);
}
else
{
appendPQExpBuffer(&buf,
"UNION\n"
"SELECT pubname\n"
" , NULL\n"
" , NULL\n"
"FROM pg_catalog.pg_publication p\n"
"WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
"ORDER BY 1;",
oid);
}
}
else
{ {
/*
* Skip entries where this relation appears in the
* publication's EXCEPT list.
*/
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
"SELECT pubname\n" " AND NOT pr.prexcept\n"
" , NULL\n" "UNION\n"
" , NULL\n"
"FROM pg_catalog.pg_publication p\n"
"JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
"WHERE pr.prrelid = '%s'\n"
"UNION ALL\n"
"SELECT pubname\n" "SELECT pubname\n"
" , NULL\n" " , NULL\n"
" , NULL\n" " , NULL\n"
"FROM pg_catalog.pg_publication p\n" "FROM pg_catalog.pg_publication p\n"
"WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n" "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
" AND NOT EXISTS (\n"
" SELECT 1\n"
" FROM pg_catalog.pg_publication_rel pr\n"
" WHERE pr.prpubid = p.oid AND\n"
" (pr.prrelid = '%s' OR pr.prrelid = pg_catalog.pg_partition_root('%s')))\n"
"ORDER BY 1;", "ORDER BY 1;",
oid, oid); oid, oid, oid);
} }
result = PSQLexec(buf.data);
if (!result)
goto error_return;
else else
tuples = PQntuples(result);
if (tuples > 0)
printTableAddFooter(&cont, _("Included in publications:"));
/* Might be an empty set - that's ok */
for (i = 0; i < tuples; i++)
{ {
printfPQExpBuffer(&buf, " \"%s\"", appendPQExpBuffer(&buf,
PQgetvalue(result, i, 0)); "UNION\n"
"SELECT pubname\n"
/* column list (if any) */ " , NULL\n"
if (!PQgetisnull(result, i, 2)) " , NULL\n"
appendPQExpBuffer(&buf, " (%s)", "FROM pg_catalog.pg_publication p\n"
PQgetvalue(result, i, 2)); "WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
"ORDER BY 1;",
/* row filter (if any) */ oid);
if (!PQgetisnull(result, i, 1))
appendPQExpBuffer(&buf, " WHERE %s",
PQgetvalue(result, i, 1));
printTableAddFooter(&cont, buf.data);
} }
PQclear(result); }
else
{
appendPQExpBuffer(&buf,
"SELECT pubname\n"
" , NULL\n"
" , NULL\n"
"FROM pg_catalog.pg_publication p\n"
"JOIN pg_catalog.pg_publication_rel pr ON p.oid = pr.prpubid\n"
"WHERE pr.prrelid = '%s'\n"
"UNION ALL\n"
"SELECT pubname\n"
" , NULL\n"
" , NULL\n"
"FROM pg_catalog.pg_publication p\n"
"WHERE p.puballtables AND pg_catalog.pg_relation_is_publishable('%s')\n"
"ORDER BY 1;",
oid, oid);
}
result = PSQLexec(buf.data);
if (!result)
goto error_return;
else
tuples = PQntuples(result);
if (tuples > 0)
printTableAddFooter(&cont, _("Included in publications:"));
/* Might be an empty set - that's ok */
for (i = 0; i < tuples; i++)
{
printfPQExpBuffer(&buf, " \"%s\"",
PQgetvalue(result, i, 0));
/* column list (if any) */
if (!PQgetisnull(result, i, 2))
appendPQExpBuffer(&buf, " (%s)",
PQgetvalue(result, i, 2));
/* row filter (if any) */
if (!PQgetisnull(result, i, 1))
appendPQExpBuffer(&buf, " WHERE %s",
PQgetvalue(result, i, 1));
printTableAddFooter(&cont, buf.data);
}
PQclear(result);
/* Print publications where the table is in the EXCEPT clause */ /* Print publications where the table is in the EXCEPT clause */
if (pset.sversion >= 190000) if (pset.sversion >= 190000)
@ -3805,7 +3804,7 @@ describeRoles(const char *pattern, bool verbose, bool showSystem)
ncols++; ncols++;
} }
appendPQExpBufferStr(&buf, "\n, r.rolreplication"); appendPQExpBufferStr(&buf, "\n, r.rolreplication");
appendPQExpBufferStr(&buf, "\n, r.rolbypassrls"); appendPQExpBufferStr(&buf, "\n, r.rolbypassrls");
appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_roles r\n"); appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_roles r\n");
@ -3860,8 +3859,8 @@ describeRoles(const char *pattern, bool verbose, bool showSystem)
if (strcmp(PQgetvalue(res, i, (verbose ? 9 : 8)), "t") == 0) if (strcmp(PQgetvalue(res, i, (verbose ? 9 : 8)), "t") == 0)
add_role_attribute(&buf, _("Replication")); add_role_attribute(&buf, _("Replication"));
if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0) if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0)
add_role_attribute(&buf, _("Bypass RLS")); add_role_attribute(&buf, _("Bypass RLS"));
conns = atoi(PQgetvalue(res, i, 6)); conns = atoi(PQgetvalue(res, i, 6));
if (conns >= 0) if (conns >= 0)
@ -5155,14 +5154,14 @@ listCollations(const char *pattern, bool verbose, bool showSystem)
gettext_noop("Schema"), gettext_noop("Schema"),
gettext_noop("Name")); gettext_noop("Name"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
" CASE c.collprovider " " CASE c.collprovider "
"WHEN " CppAsString2(COLLPROVIDER_DEFAULT) " THEN 'default' " "WHEN " CppAsString2(COLLPROVIDER_DEFAULT) " THEN 'default' "
"WHEN " CppAsString2(COLLPROVIDER_BUILTIN) " THEN 'builtin' " "WHEN " CppAsString2(COLLPROVIDER_BUILTIN) " THEN 'builtin' "
"WHEN " CppAsString2(COLLPROVIDER_LIBC) " THEN 'libc' " "WHEN " CppAsString2(COLLPROVIDER_LIBC) " THEN 'libc' "
"WHEN " CppAsString2(COLLPROVIDER_ICU) " THEN 'icu' " "WHEN " CppAsString2(COLLPROVIDER_ICU) " THEN 'icu' "
"END AS \"%s\",\n", "END AS \"%s\",\n",
gettext_noop("Provider")); gettext_noop("Provider"));
appendPQExpBuffer(&buf, appendPQExpBuffer(&buf,
" c.collcollate AS \"%s\",\n" " c.collcollate AS \"%s\",\n"