mirror of
https://github.com/postgres/postgres.git
synced 2026-07-07 16:50:58 -04:00
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:
parent
831bec4592
commit
d69fdf79b8
11 changed files with 616 additions and 625 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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__);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in a new issue