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.
*/
ExecuteSqlStatement(AH, "SET statement_timeout = 0");
ExecuteSqlStatement(AH, "SET lock_timeout = 0");
ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0");
ExecuteSqlStatement(AH, "SET lock_timeout = 0");
ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0");
if (AH->remoteVersion >= 170000)
ExecuteSqlStatement(AH, "SET transaction_timeout = 0");
@ -1505,10 +1505,10 @@ setup_connection(Archive *AH, const char *dumpencoding,
/*
* Adjust row-security mode, if supported.
*/
if (dopt->enable_row_security)
ExecuteSqlStatement(AH, "SET row_security = on");
else
ExecuteSqlStatement(AH, "SET row_security = off");
if (dopt->enable_row_security)
ExecuteSqlStatement(AH, "SET row_security = on");
else
ExecuteSqlStatement(AH, "SET row_security = off");
/*
* 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);
/*
* Mark the member object to have any non-initial ACLs
* dumped. (Any initial ACLs will be removed later, using data from
* pg_init_privs, so that we'll dump only the delta from the extension's
* initial setup.)
* Mark the member object to have any non-initial ACLs dumped. (Any
* initial ACLs will be removed later, using data from pg_init_privs, so
* that we'll dump only the delta from the extension's initial setup.)
*
* In binary upgrades, we still dump all components of the members
* individually, since the idea is to exactly reproduce the database
@ -1953,7 +1952,7 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout)
if (fout->dopt->binary_upgrade)
dobj->dump = ext->dobj.dump;
else
dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL);
dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL);
return true;
}
@ -1987,9 +1986,9 @@ selectDumpableNamespace(NamespaceInfo *nsinfo, Archive *fout)
else if (strcmp(nsinfo->dobj.name, "pg_catalog") == 0)
{
/*
* We dump out any ACLs defined in pg_catalog, if
* they are interesting (and not the original ACLs which were set at
* initdb time, see pg_init_privs).
* We dump out any ACLs defined in pg_catalog, if they are interesting
* (and not the original ACLs which were set at initdb time, see
* pg_init_privs).
*/
nsinfo->dobj.dump_contains = nsinfo->dobj.dump = DUMP_COMPONENT_ACL;
}
@ -3296,7 +3295,7 @@ dumpDatabase(Archive *fout)
"datcollate, datctype, datfrozenxid, "
"datacl, acldefault('d', datdba) AS acldefault, "
"datistemplate, datconnlimit, ");
appendPQExpBufferStr(dbQry, "datminmxid, ");
appendPQExpBufferStr(dbQry, "datminmxid, ");
if (fout->remoteVersion >= 170000)
appendPQExpBufferStr(dbQry, "datlocprovider, datlocale, datcollversion, ");
else if (fout->remoteVersion >= 150000)
@ -3638,11 +3637,11 @@ dumpDatabase(Archive *fout)
ii_oid,
ii_relminmxid;
appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n"
"FROM pg_catalog.pg_class\n"
"WHERE oid IN (%u, %u, %u, %u);\n",
LargeObjectRelationId, LargeObjectLOidPNIndexId,
LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId);
appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid, relminmxid, relfilenode, oid\n"
"FROM pg_catalog.pg_class\n"
"WHERE oid IN (%u, %u, %u, %u);\n",
LargeObjectRelationId, LargeObjectLOidPNIndexId,
LargeObjectMetadataRelationId, LargeObjectMetadataOidIndexId);
lo_res = ExecuteSqlQuery(fout, loFrozenQry->data, PGRES_TUPLES_OK);
@ -4274,7 +4273,7 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
printfPQExpBuffer(query,
"SELECT pol.oid, pol.tableoid, pol.polrelid, pol.polname, pol.polcmd, ");
appendPQExpBufferStr(query, "pol.polpermissive, ");
appendPQExpBufferStr(query, "pol.polpermissive, ");
appendPQExpBuffer(query,
"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, "
@ -6633,9 +6632,9 @@ getAccessMethods(Archive *fout)
* Select all access methods from pg_am table.
*/
appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
appendPQExpBufferStr(query,
"amtype, "
"amhandler::pg_catalog.regproc AS amhandler ");
appendPQExpBufferStr(query,
"amtype, "
"amhandler::pg_catalog.regproc AS amhandler ");
appendPQExpBufferStr(query, "FROM pg_am");
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
* rationale behind the filtering logic.
*/
agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'"
: "p.proisagg");
agg_check = (fout->remoteVersion >= 110000 ? "p.prokind = 'a'"
: "p.proisagg");
appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, "
"p.proname AS aggname, "
"p.pronamespace AS aggnamespace, "
"p.pronargs, p.proargtypes, "
"p.proowner, "
"p.proacl AS aggacl, "
"acldefault('f', p.proowner) AS acldefault "
"FROM pg_proc p "
"LEFT JOIN pg_init_privs pip ON "
"(p.oid = pip.objoid "
"AND pip.classoid = 'pg_proc'::regclass "
"AND pip.objsubid = 0) "
"WHERE %s AND ("
"p.pronamespace != "
"(SELECT oid FROM pg_namespace "
"WHERE nspname = 'pg_catalog') OR "
"p.proacl IS DISTINCT FROM pip.initprivs",
agg_check);
if (dopt->binary_upgrade)
appendPQExpBufferStr(query,
" OR EXISTS(SELECT 1 FROM pg_depend WHERE "
"classid = 'pg_proc'::regclass AND "
"objid = p.oid AND "
"refclassid = 'pg_extension'::regclass AND "
"deptype = 'e')");
appendPQExpBufferChar(query, ')');
appendPQExpBuffer(query, "SELECT p.tableoid, p.oid, "
"p.proname AS aggname, "
"p.pronamespace AS aggnamespace, "
"p.pronargs, p.proargtypes, "
"p.proowner, "
"p.proacl AS aggacl, "
"acldefault('f', p.proowner) AS acldefault "
"FROM pg_proc p "
"LEFT JOIN pg_init_privs pip ON "
"(p.oid = pip.objoid "
"AND pip.classoid = 'pg_proc'::regclass "
"AND pip.objsubid = 0) "
"WHERE %s AND ("
"p.pronamespace != "
"(SELECT oid FROM pg_namespace "
"WHERE nspname = 'pg_catalog') OR "
"p.proacl IS DISTINCT FROM pip.initprivs",
agg_check);
if (dopt->binary_upgrade)
appendPQExpBufferStr(query,
" OR EXISTS(SELECT 1 FROM pg_depend WHERE "
"classid = 'pg_proc'::regclass AND "
"objid = p.oid AND "
"refclassid = 'pg_extension'::regclass AND "
"deptype = 'e')");
appendPQExpBufferChar(query, ')');
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
* 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
* they are built-in. Also, include functions in
* pg_catalog if they have an ACL different from what's shown in
* pg_init_privs (so we have to join to pg_init_privs; annoying).
* they are built-in. Also, include functions in pg_catalog if they have
* an ACL different from what's shown in pg_init_privs (so we have to join
* to pg_init_privs; annoying).
*/
not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'"
: "NOT p.proisagg");
not_agg_check = (fout->remoteVersion >= 110000 ? "p.prokind <> 'a'"
: "NOT p.proisagg");
appendPQExpBuffer(query,
"SELECT p.tableoid, p.oid, p.proname, p.prolang, "
"p.pronargs, p.proargtypes, p.prorettype, "
"p.proacl, "
"acldefault('f', p.proowner) AS acldefault, "
"p.pronamespace, "
"p.proowner "
"FROM pg_proc p "
"LEFT JOIN pg_init_privs pip ON "
"(p.oid = pip.objoid "
"AND pip.classoid = 'pg_proc'::regclass "
"AND pip.objsubid = 0) "
"WHERE %s"
"\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
"WHERE classid = 'pg_proc'::regclass AND "
"objid = p.oid AND deptype = 'i')"
"\n AND ("
"\n pronamespace != "
"(SELECT oid FROM pg_namespace "
"WHERE nspname = 'pg_catalog')"
"\n OR EXISTS (SELECT 1 FROM pg_cast"
"\n WHERE pg_cast.oid > %u "
"\n AND p.oid = pg_cast.castfunc)"
"\n OR EXISTS (SELECT 1 FROM pg_transform"
"\n WHERE pg_transform.oid > %u AND "
"\n (p.oid = pg_transform.trffromsql"
"\n OR p.oid = pg_transform.trftosql))",
not_agg_check,
g_last_builtin_oid,
g_last_builtin_oid);
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')");
appendPQExpBuffer(query,
"SELECT p.tableoid, p.oid, p.proname, p.prolang, "
"p.pronargs, p.proargtypes, p.prorettype, "
"p.proacl, "
"acldefault('f', p.proowner) AS acldefault, "
"p.pronamespace, "
"p.proowner "
"FROM pg_proc p "
"LEFT JOIN pg_init_privs pip ON "
"(p.oid = pip.objoid "
"AND pip.classoid = 'pg_proc'::regclass "
"AND pip.objsubid = 0) "
"WHERE %s"
"\n AND NOT EXISTS (SELECT 1 FROM pg_depend "
"WHERE classid = 'pg_proc'::regclass AND "
"objid = p.oid AND deptype = 'i')"
"\n AND ("
"\n pronamespace != "
"(SELECT oid FROM pg_namespace "
"WHERE nspname = 'pg_catalog')"
"\n OR EXISTS (SELECT 1 FROM pg_cast"
"\n WHERE pg_cast.oid > %u "
"\n AND p.oid = pg_cast.castfunc)"
"\n OR EXISTS (SELECT 1 FROM pg_transform"
"\n WHERE pg_transform.oid > %u AND "
"\n (p.oid = pg_transform.trffromsql"
"\n OR p.oid = pg_transform.trftosql))",
not_agg_check,
g_last_builtin_oid,
g_last_builtin_oid);
if (dopt->binary_upgrade)
appendPQExpBufferStr(query,
"\n OR p.proacl IS DISTINCT FROM pip.initprivs");
appendPQExpBufferChar(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,
"\n OR p.proacl IS DISTINCT FROM pip.initprivs");
appendPQExpBufferChar(query, ')');
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@ -7252,31 +7251,31 @@ getTables(Archive *fout, int *numTables)
appendPQExpBufferStr(query,
"c.relhasoids, ");
appendPQExpBufferStr(query,
"c.relispopulated, ");
appendPQExpBufferStr(query,
"c.relispopulated, ");
appendPQExpBufferStr(query,
"c.relreplident, ");
appendPQExpBufferStr(query,
"c.relreplident, ");
appendPQExpBufferStr(query,
"c.relrowsecurity, c.relforcerowsecurity, ");
appendPQExpBufferStr(query,
"c.relrowsecurity, c.relforcerowsecurity, ");
appendPQExpBufferStr(query,
"c.relminmxid, tc.relminmxid AS tminmxid, ");
appendPQExpBufferStr(query,
"c.relminmxid, tc.relminmxid AS tminmxid, ");
appendPQExpBufferStr(query,
"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 "
"WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, ");
appendPQExpBufferStr(query,
"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 "
"WHEN 'check_option=cascaded' = ANY (c.reloptions) THEN 'CASCADED'::text ELSE NULL END AS checkoption, ");
appendPQExpBufferStr(query,
"am.amname, ");
appendPQExpBufferStr(query,
"am.amname, ");
appendPQExpBufferStr(query,
"(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
appendPQExpBufferStr(query,
"(d.deptype = 'i') IS TRUE AS is_identity_sequence, ");
appendPQExpBufferStr(query,
"c.relispartition AS ispartition ");
appendPQExpBufferStr(query,
"c.relispartition AS ispartition ");
/*
* 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.
*/
appendPQExpBufferStr(query,
"LEFT JOIN pg_am am ON (c.relam = am.oid)\n");
appendPQExpBufferStr(query,
"LEFT JOIN pg_am am ON (c.relam = am.oid)\n");
/*
* 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, ");
appendPQExpBufferStr(query,
"i.indisreplident, ");
appendPQExpBufferStr(query,
"i.indisreplident, ");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query,
@ -9313,8 +9312,8 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
appendPQExpBufferStr(q,
"'' AS attcompression,\n");
appendPQExpBufferStr(q,
"a.attidentity,\n");
appendPQExpBufferStr(q,
"a.attidentity,\n");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(q,
@ -10717,73 +10716,73 @@ getAdditionalACLs(Archive *fout)
PQclear(res);
/* Fetch initial-privileges data */
printfPQExpBuffer(query,
"SELECT objoid, classoid, objsubid, privtype, initprivs "
"FROM pg_init_privs");
printfPQExpBuffer(query,
"SELECT objoid, classoid, objsubid, privtype, initprivs "
"FROM pg_init_privs");
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
ntups = PQntuples(res);
for (i = 0; i < ntups; i++)
ntups = PQntuples(res);
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));
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)
/* Cope with sub-object initprivs */
if (objsubid != 0)
{
/* Cope with sub-object initprivs */
if (objsubid != 0)
if (dobj->objType == DO_TABLE)
{
if (dobj->objType == DO_TABLE)
{
/* For a column initprivs, set the table's ACL flags */
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);
/* For a column initprivs, set the table's ACL flags */
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
pg_log_warning("unsupported pg_init_privs entry: %u %u %d",
classoid, objoid, objsubid);
}
PQclear(res);
}
PQclear(res);
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
* parameters to ensure we remain in sync as we walk through the TOC.
*
* For versions before 19, the redundant filter clause on s.tablename =
* ANY(...) seems sufficient to convince the planner to use
* For versions before 19, the redundant filter clause on s.tablename
* = ANY(...) seems sufficient to convince the planner to use
* pg_class_relname_nsp_index, which avoids a full scan of pg_stats.
* In newer versions, pg_stats returns the table OIDs, eliminating the
* 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"
"proleakproof,\n");
appendPQExpBufferStr(query,
"array_to_string(protrftypes, ' ') AS protrftypes,\n");
appendPQExpBufferStr(query,
"array_to_string(protrftypes, ' ') AS protrftypes,\n");
appendPQExpBufferStr(query,
"proparallel,\n");
appendPQExpBufferStr(query,
"proparallel,\n");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query,
@ -14963,9 +14962,9 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
/* Get collation-specific details */
appendPQExpBufferStr(query, "SELECT ");
appendPQExpBufferStr(query,
"collprovider, "
"collversion, ");
appendPQExpBufferStr(query,
"collprovider, "
"collversion, ");
if (fout->remoteVersion >= 120000)
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_identity_arguments(p.oid) AS funciargs,\n");
appendPQExpBufferStr(query,
"aggkind,\n"
"aggmtransfn,\n"
"aggminvtransfn,\n"
"aggmfinalfn,\n"
"aggmtranstype::pg_catalog.regtype,\n"
"aggfinalextra,\n"
"aggmfinalextra,\n"
"aggtransspace,\n"
"aggmtransspace,\n"
"aggminitval,\n");
appendPQExpBufferStr(query,
"aggkind,\n"
"aggmtransfn,\n"
"aggminvtransfn,\n"
"aggmfinalfn,\n"
"aggmtranstype::pg_catalog.regtype,\n"
"aggfinalextra,\n"
"aggmfinalextra,\n"
"aggtransspace,\n"
"aggmtransspace,\n"
"aggminitval,\n");
appendPQExpBufferStr(query,
"aggcombinefn,\n"
"aggserialfn,\n"
"aggdeserialfn,\n"
"proparallel,\n");
appendPQExpBufferStr(query,
"aggcombinefn,\n"
"aggserialfn,\n"
"aggdeserialfn,\n"
"proparallel,\n");
if (fout->remoteVersion >= 110000)
appendPQExpBufferStr(query,
@ -16848,30 +16847,30 @@ dumpTable(Archive *fout, const TableInfo *tbinfo)
appendPQExpBufferStr(query,
"PREPARE getColumnACLs(pg_catalog.oid) AS\n");
/*
* In principle we should call acldefault('c', relowner) to
* get the default ACL for a column. However, we don't
* currently store the numeric OID of the relowner in
* TableInfo. We could convert the owner name using regrole,
* but that creates a risk of failure due to concurrent role
* renames. Given that the default ACL for columns is empty
* and is likely to stay that way, it's not worth extra cycles
* and risk to avoid hard-wiring that knowledge here.
*/
appendPQExpBufferStr(query,
"SELECT at.attname, "
"at.attacl, "
"'{}' AS acldefault, "
"pip.privtype, pip.initprivs "
"FROM pg_catalog.pg_attribute at "
"LEFT JOIN pg_catalog.pg_init_privs pip ON "
"(at.attrelid = pip.objoid "
"AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass "
"AND at.attnum = pip.objsubid) "
"WHERE at.attrelid = $1 AND "
"NOT at.attisdropped "
"AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) "
"ORDER BY at.attnum");
/*
* In principle we should call acldefault('c', relowner) to get
* the default ACL for a column. However, we don't currently
* store the numeric OID of the relowner in TableInfo. We could
* convert the owner name using regrole, but that creates a risk
* of failure due to concurrent role renames. Given that the
* default ACL for columns is empty and is likely to stay that
* way, it's not worth extra cycles and risk to avoid hard-wiring
* that knowledge here.
*/
appendPQExpBufferStr(query,
"SELECT at.attname, "
"at.attacl, "
"'{}' AS acldefault, "
"pip.privtype, pip.initprivs "
"FROM pg_catalog.pg_attribute at "
"LEFT JOIN pg_catalog.pg_init_privs pip ON "
"(at.attrelid = pip.objoid "
"AND pip.classoid = 'pg_catalog.pg_class'::pg_catalog.regclass "
"AND at.attnum = pip.objsubid) "
"WHERE at.attrelid = $1 AND "
"NOT at.attisdropped "
"AND (at.attacl IS NOT NULL OR pip.initprivs IS NOT NULL) "
"ORDER BY at.attnum");
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.
*/
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), "
"seqstart, seqincrement, "
"seqmax, seqmin, "
@ -19227,15 +19226,14 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo)
qseqname = pg_strdup(fmtId(tbinfo->dobj.name));
/*
* The sequence information is gathered in a sorted
* table before any calls to dumpSequence(). See collectSequences() for
* more information.
* The sequence information is gathered in a sorted table before any calls
* to dumpSequence(). See collectSequences() for more information.
*/
Assert(sequences);
Assert(sequences);
key.oid = tbinfo->dobj.catId.oid;
seq = bsearch(&key, sequences, nsequences,
sizeof(SequenceItem), SequenceItemCmp);
key.oid = tbinfo->dobj.catId.oid;
seq = bsearch(&key, sequences, nsequences,
sizeof(SequenceItem), SequenceItemCmp);
/* Calculate default limits for a sequence of this type */
is_ascending = (seq->incby >= 0);

View file

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

View file

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

View file

@ -228,7 +228,7 @@ get_control_data(ClusterInfo *cluster)
p++; /* remove ':' char */
cluster->controldata.chkpnt_nxtepoch = str2uint(p);
p = strchr(p, ':');
p = strchr(p, ':');
if (p == NULL || strlen(p) <= 1)
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)
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_TBLSPC_DIR);
check_single_dir(pg_data, "pg_twophase");
check_single_dir(pg_data, "pg_wal");
check_single_dir(pg_data, "pg_xact");
check_single_dir(pg_data, "pg_wal");
check_single_dir(pg_data, "pg_xact");
}
@ -385,7 +385,7 @@ check_bin_dir(ClusterInfo *cluster, bool check_versions)
*/
get_bin_version(cluster);
check_exec(cluster->bindir, "pg_resetwal", check_versions);
check_exec(cluster->bindir, "pg_resetwal", check_versions);
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
* old cluster.
*/
old_reader = AllocOldMultiXactRead(old_cluster.pgdata,
old_cluster.controldata.chkpnt_nxtmulti,
old_cluster.controldata.chkpnt_nxtmxoff);
old_reader = AllocOldMultiXactRead(old_cluster.pgdata,
old_cluster.controldata.chkpnt_nxtmulti,
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;
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)
{
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;
RecordMultiXactMembers(members_writer, next_offset, 1, &member);
next_offset += 1;
}
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 */
RecordMultiXactOffset(offsets_writer, to_multi,

View file

@ -833,7 +833,7 @@ copy_xact_xlog_xid(void)
* Determine the range of multixacts to convert.
*/
nxtmulti = old_cluster.controldata.chkpnt_nxtmulti;
oldstMulti = old_cluster.controldata.chkpnt_oldstMulti;
oldstMulti = old_cluster.controldata.chkpnt_oldstMulti;
/* handle wraparound */
if (nxtmulti < FirstMultiXactId)
nxtmulti = FirstMultiXactId;
@ -898,15 +898,15 @@ set_frozenxids(void)
int i_datname;
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");
/* set pg_database.datfrozenxid */
PQclear(executeQueryOrDie(conn_template1,
"UPDATE pg_catalog.pg_database "
"SET datfrozenxid = '%u'",
old_cluster.controldata.chkpnt_nxtxid));
/* set pg_database.datfrozenxid */
PQclear(executeQueryOrDie(conn_template1,
"UPDATE pg_catalog.pg_database "
"SET datfrozenxid = '%u'",
old_cluster.controldata.chkpnt_nxtxid));
/* set pg_database.datminmxid */
PQclear(executeQueryOrDie(conn_template1,
@ -942,16 +942,16 @@ set_frozenxids(void)
conn = connectToServer(&new_cluster, datname);
/* set pg_class.relfrozenxid */
PQclear(executeQueryOrDie(conn,
"UPDATE pg_catalog.pg_class "
"SET relfrozenxid = '%u' "
/* only heap, materialized view, and TOAST are vacuumed */
"WHERE relkind IN ("
CppAsString2(RELKIND_RELATION) ", "
CppAsString2(RELKIND_MATVIEW) ", "
CppAsString2(RELKIND_TOASTVALUE) ")",
old_cluster.controldata.chkpnt_nxtxid));
/* set pg_class.relfrozenxid */
PQclear(executeQueryOrDie(conn,
"UPDATE pg_catalog.pg_class "
"SET relfrozenxid = '%u' "
/* only heap, materialized view, and TOAST are vacuumed */
"WHERE relkind IN ("
CppAsString2(RELKIND_RELATION) ", "
CppAsString2(RELKIND_MATVIEW) ", "
CppAsString2(RELKIND_TOASTVALUE) ")",
old_cluster.controldata.chkpnt_nxtxid));
/* set pg_class.relminmxid */
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. */
pg_log(PG_STATUS, "%s", old_file);
switch (user_opts.transfer_mode)
{
case TRANSFER_MODE_CLONE:
pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"",
old_file, new_file);
cloneFile(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_COPY:
pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"",
old_file, new_file);
copyFile(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_COPY_FILE_RANGE:
pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\" with copy_file_range",
old_file, new_file);
copyFileByRange(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_LINK:
pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"",
old_file, new_file);
linkFile(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_SWAP:
/* swap mode is handled in its own code path */
pg_fatal("should never happen");
break;
}
switch (user_opts.transfer_mode)
{
case TRANSFER_MODE_CLONE:
pg_log(PG_VERBOSE, "cloning \"%s\" to \"%s\"",
old_file, new_file);
cloneFile(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_COPY:
pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\"",
old_file, new_file);
copyFile(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_COPY_FILE_RANGE:
pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\" with copy_file_range",
old_file, new_file);
copyFileByRange(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_LINK:
pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"",
old_file, new_file);
linkFile(old_file, new_file, map->nspname, map->relname);
break;
case TRANSFER_MODE_SWAP:
/* swap mode is handled in its own code path */
pg_fatal("should never happen");
break;
}
}
}

View file

@ -29,10 +29,8 @@ sub test_mode
}
$new->init();
$new->append_conf('postgresql.conf',
"allow_in_place_tablespaces = true");
$old->append_conf('postgresql.conf',
"allow_in_place_tablespaces = true");
$new->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
# have dummy_seclabel.
@ -76,15 +74,14 @@ sub test_mode
"CREATE TABLE test4 AS SELECT generate_series(400, 502)");
}
$old->safe_psql('postgres',
"CREATE TABLESPACE inplc_tblspc LOCATION ''");
$old->safe_psql('postgres',
"CREATE DATABASE testdb3 TABLESPACE inplc_tblspc");
$old->safe_psql('postgres',
"CREATE TABLE test5 TABLESPACE inplc_tblspc AS SELECT generate_series(503, 606)"
);
$old->safe_psql('testdb3',
"CREATE TABLE test6 AS SELECT generate_series(607, 711)");
$old->safe_psql('postgres', "CREATE TABLESPACE inplc_tblspc LOCATION ''");
$old->safe_psql('postgres',
"CREATE DATABASE testdb3 TABLESPACE inplc_tblspc");
$old->safe_psql('postgres',
"CREATE TABLE test5 TABLESPACE inplc_tblspc AS SELECT generate_series(503, 606)"
);
$old->safe_psql('testdb3',
"CREATE TABLE test6 AS SELECT generate_series(607, 711)");
# While we are here, test handling of large objects.
$old->safe_psql(
@ -152,12 +149,10 @@ sub test_mode
}
# Tests for in-place tablespaces.
$result =
$new->safe_psql('postgres', "SELECT COUNT(*) FROM test5");
is($result, '104', "test5 data after pg_upgrade $mode");
$result =
$new->safe_psql('testdb3', "SELECT COUNT(*) FROM test6");
is($result, '105', "test6 data after pg_upgrade $mode");
$result = $new->safe_psql('postgres', "SELECT COUNT(*) FROM test5");
is($result, '104', "test5 data after pg_upgrade $mode");
$result = $new->safe_psql('testdb3', "SELECT COUNT(*) FROM test6");
is($result, '105', "test6 data after pg_upgrade $mode");
# Tests for large objects
$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
* to be sure it's a view.
*
* Views may have WITH [LOCAL|CASCADED]
* CHECK OPTION. These are not part of the view definition
* returned by pg_get_viewdef() and so need to be retrieved
* separately. Materialized views may have
* arbitrary storage parameter reloptions.
* Views may have WITH [LOCAL|CASCADED] CHECK OPTION. These are
* not part of the view definition returned by pg_get_viewdef()
* and so need to be retrieved separately. Materialized views may
* have arbitrary storage parameter reloptions.
*/
printfPQExpBuffer(query, "/* %s */\n", _("Get view's definition and details"));
appendPQExpBuffer(query,
"SELECT nspname, relname, relkind, "
"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, "
"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 "
"FROM pg_catalog.pg_class c "
"LEFT JOIN pg_catalog.pg_namespace n "
"ON c.relnamespace = n.oid WHERE c.oid = %u",
oid);
appendPQExpBuffer(query,
"SELECT nspname, relname, relkind, "
"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, "
"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 "
"FROM pg_catalog.pg_class c "
"LEFT JOIN pg_catalog.pg_namespace n "
"ON c.relnamespace = n.oid WHERE c.oid = %u",
oid);
break;
}

View file

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