mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
Clean up some more freshly-dead code in pg_dump and pg_upgrade.
I missed a few things in 30e7c175b and e469f0aaf, as noted by Justin Pryzby. Discussion: https://postgr.es/m/2923349.1634942313@sss.pgh.pa.us
This commit is contained in:
parent
58e2e6eb67
commit
c49d926833
@ -39,8 +39,7 @@ static void AddAcl(PQExpBuffer aclbuf, const char *keyword,
|
|||||||
* TABLE, SEQUENCE, FUNCTION, PROCEDURE, LANGUAGE, SCHEMA, DATABASE, TABLESPACE,
|
* TABLE, SEQUENCE, FUNCTION, PROCEDURE, LANGUAGE, SCHEMA, DATABASE, TABLESPACE,
|
||||||
* FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT)
|
* FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT)
|
||||||
* acls: the ACL string fetched from the database
|
* acls: the ACL string fetched from the database
|
||||||
* baseacls: the initial ACL string for this object; can be
|
* baseacls: the initial ACL string for this object
|
||||||
* NULL or empty string to indicate "not available from server"
|
|
||||||
* owner: username of object owner (will be passed through fmtId); can be
|
* owner: username of object owner (will be passed through fmtId); can be
|
||||||
* NULL or empty string to indicate "no owner known"
|
* NULL or empty string to indicate "no owner known"
|
||||||
* prefix: string to prefix to each generated command; typically empty
|
* prefix: string to prefix to each generated command; typically empty
|
||||||
@ -104,17 +103,14 @@ buildACLCommands(const char *name, const char *subname, const char *nspname,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the baseacls, if provided */
|
/* Parse the baseacls too */
|
||||||
if (baseacls && *baseacls != '\0')
|
if (!parsePGArray(baseacls, &baseitems, &nbaseitems))
|
||||||
{
|
{
|
||||||
if (!parsePGArray(baseacls, &baseitems, &nbaseitems))
|
if (aclitems)
|
||||||
{
|
free(aclitems);
|
||||||
if (aclitems)
|
if (baseitems)
|
||||||
free(aclitems);
|
free(baseitems);
|
||||||
if (baseitems)
|
return false;
|
||||||
free(baseitems);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -56,18 +56,13 @@ _check_database_version(ArchiveHandle *AH)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When running against 9.0 or later, check if we are in recovery mode,
|
* Check if server is in recovery mode, which means we are on a hot
|
||||||
* which means we are on a hot standby.
|
* standby.
|
||||||
*/
|
*/
|
||||||
if (remoteversion >= 90000)
|
res = ExecuteSqlQueryForSingleRow((Archive *) AH,
|
||||||
{
|
"SELECT pg_catalog.pg_is_in_recovery()");
|
||||||
res = ExecuteSqlQueryForSingleRow((Archive *) AH, "SELECT pg_catalog.pg_is_in_recovery()");
|
AH->public.isStandby = (strcmp(PQgetvalue(res, 0, 0), "t") == 0);
|
||||||
|
PQclear(res);
|
||||||
AH->public.isStandby = (strcmp(PQgetvalue(res, 0, 0), "t") == 0);
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AH->public.isStandby = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -11444,19 +11444,17 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* See backend/commands/functioncmds.c for details of how the 'AS' clause
|
* See backend/commands/functioncmds.c for details of how the 'AS' clause
|
||||||
* is used. In 8.4 and up, an unused probin is NULL (here ""); previous
|
* is used.
|
||||||
* versions would set it to "-". There are no known cases in which prosrc
|
|
||||||
* is unused, so the tests below for "-" are probably useless.
|
|
||||||
*/
|
*/
|
||||||
if (prosqlbody)
|
if (prosqlbody)
|
||||||
{
|
{
|
||||||
appendPQExpBufferStr(asPart, prosqlbody);
|
appendPQExpBufferStr(asPart, prosqlbody);
|
||||||
}
|
}
|
||||||
else if (probin[0] != '\0' && strcmp(probin, "-") != 0)
|
else if (probin[0] != '\0')
|
||||||
{
|
{
|
||||||
appendPQExpBufferStr(asPart, "AS ");
|
appendPQExpBufferStr(asPart, "AS ");
|
||||||
appendStringLiteralAH(asPart, probin, fout);
|
appendStringLiteralAH(asPart, probin, fout);
|
||||||
if (strcmp(prosrc, "-") != 0)
|
if (prosrc[0] != '\0')
|
||||||
{
|
{
|
||||||
appendPQExpBufferStr(asPart, ", ");
|
appendPQExpBufferStr(asPart, ", ");
|
||||||
|
|
||||||
@ -11473,15 +11471,12 @@ dumpFunc(Archive *fout, const FuncInfo *finfo)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (strcmp(prosrc, "-") != 0)
|
appendPQExpBufferStr(asPart, "AS ");
|
||||||
{
|
/* with no bin, dollar quote src unconditionally if allowed */
|
||||||
appendPQExpBufferStr(asPart, "AS ");
|
if (dopt->disable_dollar_quoting)
|
||||||
/* with no bin, dollar quote src unconditionally if allowed */
|
appendStringLiteralAH(asPart, prosrc, fout);
|
||||||
if (dopt->disable_dollar_quoting)
|
else
|
||||||
appendStringLiteralAH(asPart, prosrc, fout);
|
appendStringLiteralDQ(asPart, prosrc, NULL);
|
||||||
else
|
|
||||||
appendStringLiteralDQ(asPart, prosrc, NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nallargs = finfo->nargs; /* unless we learn different from allargs */
|
nallargs = finfo->nargs; /* unless we learn different from allargs */
|
||||||
|
@ -149,9 +149,6 @@ typedef struct _dumpableObject
|
|||||||
/*
|
/*
|
||||||
* Object types that have ACLs must store them in a DumpableAcl sub-struct,
|
* Object types that have ACLs must store them in a DumpableAcl sub-struct,
|
||||||
* which must immediately follow the DumpableObject base struct.
|
* which must immediately follow the DumpableObject base struct.
|
||||||
*
|
|
||||||
* Note: when dumping from a pre-9.2 server, which lacks the acldefault()
|
|
||||||
* function, acldefault will be NULL or empty.
|
|
||||||
*/
|
*/
|
||||||
typedef struct _dumpableAcl
|
typedef struct _dumpableAcl
|
||||||
{
|
{
|
||||||
|
@ -55,16 +55,6 @@ Here are the steps needed to create a regression database dump file:
|
|||||||
Commands like CREATE TRIGGER and ALTER TABLE sometimes have
|
Commands like CREATE TRIGGER and ALTER TABLE sometimes have
|
||||||
differences.
|
differences.
|
||||||
|
|
||||||
d) For pre-9.0, change CREATE OR REPLACE LANGUAGE to CREATE LANGUAGE
|
|
||||||
|
|
||||||
e) For pre-9.0, remove 'regex_flavor'
|
|
||||||
|
|
||||||
f) For pre-9.0, adjust extra_float_digits
|
|
||||||
Postgres 9.0 pg_dump uses extra_float_digits=-2 for pre-9.0
|
|
||||||
databases, and extra_float_digits=-3 for >= 9.0 databases.
|
|
||||||
It is necessary to modify 9.0 pg_dump to always use -3, and
|
|
||||||
modify the pre-9.0 old server to accept extra_float_digits=-3.
|
|
||||||
|
|
||||||
Once the dump is created, it can be repeatedly loaded into the old
|
Once the dump is created, it can be repeatedly loaded into the old
|
||||||
database, upgraded, and dumped out of the new database, and then
|
database, upgraded, and dumped out of the new database, and then
|
||||||
compared to the original version. To test the dump file, perform these
|
compared to the original version. To test the dump file, perform these
|
||||||
|
@ -55,7 +55,6 @@ get_loadable_libraries(void)
|
|||||||
PGresult **ress;
|
PGresult **ress;
|
||||||
int totaltups;
|
int totaltups;
|
||||||
int dbnum;
|
int dbnum;
|
||||||
bool found_public_plpython_handler = false;
|
|
||||||
|
|
||||||
ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *));
|
ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *));
|
||||||
totaltups = 0;
|
totaltups = 0;
|
||||||
@ -79,68 +78,9 @@ get_loadable_libraries(void)
|
|||||||
FirstNormalObjectId);
|
FirstNormalObjectId);
|
||||||
totaltups += PQntuples(ress[dbnum]);
|
totaltups += PQntuples(ress[dbnum]);
|
||||||
|
|
||||||
/*
|
|
||||||
* Systems that install plpython before 8.1 have
|
|
||||||
* plpython_call_handler() defined in the "public" schema, causing
|
|
||||||
* pg_dump to dump it. However that function still references
|
|
||||||
* "plpython" (no "2"), so it throws an error on restore. This code
|
|
||||||
* checks for the problem function, reports affected databases to the
|
|
||||||
* user and explains how to remove them. 8.1 git commit:
|
|
||||||
* e0dedd0559f005d60c69c9772163e69c204bac69
|
|
||||||
* http://archives.postgresql.org/pgsql-hackers/2012-03/msg01101.php
|
|
||||||
* http://archives.postgresql.org/pgsql-bugs/2012-05/msg00206.php
|
|
||||||
*/
|
|
||||||
if (GET_MAJOR_VERSION(old_cluster.major_version) <= 900)
|
|
||||||
{
|
|
||||||
PGresult *res;
|
|
||||||
|
|
||||||
res = executeQueryOrDie(conn,
|
|
||||||
"SELECT 1 "
|
|
||||||
"FROM pg_catalog.pg_proc p "
|
|
||||||
" JOIN pg_catalog.pg_namespace n "
|
|
||||||
" ON pronamespace = n.oid "
|
|
||||||
"WHERE proname = 'plpython_call_handler' AND "
|
|
||||||
"nspname = 'public' AND "
|
|
||||||
"prolang = %u AND "
|
|
||||||
"probin = '$libdir/plpython' AND "
|
|
||||||
"p.oid >= %u;",
|
|
||||||
ClanguageId,
|
|
||||||
FirstNormalObjectId);
|
|
||||||
if (PQntuples(res) > 0)
|
|
||||||
{
|
|
||||||
if (!found_public_plpython_handler)
|
|
||||||
{
|
|
||||||
pg_log(PG_WARNING,
|
|
||||||
"\nThe old cluster has a \"plpython_call_handler\" function defined\n"
|
|
||||||
"in the \"public\" schema which is a duplicate of the one defined\n"
|
|
||||||
"in the \"pg_catalog\" schema. You can confirm this by executing\n"
|
|
||||||
"in psql:\n"
|
|
||||||
"\n"
|
|
||||||
" \\df *.plpython_call_handler\n"
|
|
||||||
"\n"
|
|
||||||
"The \"public\" schema version of this function was created by a\n"
|
|
||||||
"pre-8.1 install of plpython, and must be removed for pg_upgrade\n"
|
|
||||||
"to complete because it references a now-obsolete \"plpython\"\n"
|
|
||||||
"shared object file. You can remove the \"public\" schema version\n"
|
|
||||||
"of this function by running the following command:\n"
|
|
||||||
"\n"
|
|
||||||
" DROP FUNCTION public.plpython_call_handler()\n"
|
|
||||||
"\n"
|
|
||||||
"in each affected database:\n"
|
|
||||||
"\n");
|
|
||||||
}
|
|
||||||
pg_log(PG_WARNING, " %s\n", active_db->db_name);
|
|
||||||
found_public_plpython_handler = true;
|
|
||||||
}
|
|
||||||
PQclear(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found_public_plpython_handler)
|
|
||||||
pg_fatal("Remove the problem functions from the old cluster to continue.\n");
|
|
||||||
|
|
||||||
os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo));
|
os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo));
|
||||||
totaltups = 0;
|
totaltups = 0;
|
||||||
|
|
||||||
@ -209,22 +149,6 @@ check_loadable_libraries(void)
|
|||||||
/* Did the library name change? Probe it. */
|
/* Did the library name change? Probe it. */
|
||||||
if (libnum == 0 || strcmp(lib, os_info.libraries[libnum - 1].name) != 0)
|
if (libnum == 0 || strcmp(lib, os_info.libraries[libnum - 1].name) != 0)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* In Postgres 9.0, Python 3 support was added, and to do that, a
|
|
||||||
* plpython2u language was created with library name plpython2.so
|
|
||||||
* as a symbolic link to plpython.so. In Postgres 9.1, only the
|
|
||||||
* plpython2.so library was created, and both plpythonu and
|
|
||||||
* plpython2u point to it. For this reason, any reference to
|
|
||||||
* library name "plpython" in an old PG <= 9.1 cluster must look
|
|
||||||
* for "plpython2" in the new cluster.
|
|
||||||
*/
|
|
||||||
if (GET_MAJOR_VERSION(old_cluster.major_version) <= 900 &&
|
|
||||||
strcmp(lib, "$libdir/plpython") == 0)
|
|
||||||
{
|
|
||||||
lib = "$libdir/plpython2";
|
|
||||||
llen = strlen(lib);
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(cmd, "LOAD '");
|
strcpy(cmd, "LOAD '");
|
||||||
PQescapeStringConn(conn, cmd + strlen(cmd), lib, llen, NULL);
|
PQescapeStringConn(conn, cmd + strlen(cmd), lib, llen, NULL);
|
||||||
strcat(cmd, "'");
|
strcat(cmd, "'");
|
||||||
|
@ -160,11 +160,6 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
|
||||||
* Someday, the port number option could be removed and passed
|
|
||||||
* using -o/-O, but that requires postmaster -C to be
|
|
||||||
* supported on all old/new versions (added in PG 9.2).
|
|
||||||
*/
|
|
||||||
case 'p':
|
case 'p':
|
||||||
if ((old_cluster.port = atoi(optarg)) <= 0)
|
if ((old_cluster.port = atoi(optarg)) <= 0)
|
||||||
pg_fatal("invalid old port number\n");
|
pg_fatal("invalid old port number\n");
|
||||||
@ -187,12 +182,6 @@ parseCommandLine(int argc, char *argv[])
|
|||||||
pg_free(os_info.user);
|
pg_free(os_info.user);
|
||||||
os_info.user = pg_strdup(optarg);
|
os_info.user = pg_strdup(optarg);
|
||||||
os_info.user_specified = true;
|
os_info.user_specified = true;
|
||||||
|
|
||||||
/*
|
|
||||||
* Push the user name into the environment so pre-9.1
|
|
||||||
* pg_ctl/libpq uses it.
|
|
||||||
*/
|
|
||||||
setenv("PGUSER", os_info.user, 1);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
@ -469,67 +458,51 @@ void
|
|||||||
get_sock_dir(ClusterInfo *cluster, bool live_check)
|
get_sock_dir(ClusterInfo *cluster, bool live_check)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_UNIX_SOCKETS) && !defined(WIN32)
|
#if defined(HAVE_UNIX_SOCKETS) && !defined(WIN32)
|
||||||
|
if (!live_check)
|
||||||
/*
|
cluster->sockdir = user_opts.socketdir;
|
||||||
* sockdir and port were added to postmaster.pid in PG 9.1. Pre-9.1 cannot
|
|
||||||
* process pg_ctl -w for sockets in non-default locations.
|
|
||||||
*/
|
|
||||||
if (GET_MAJOR_VERSION(cluster->major_version) >= 901)
|
|
||||||
{
|
|
||||||
if (!live_check)
|
|
||||||
cluster->sockdir = user_opts.socketdir;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* If we are doing a live check, we will use the old cluster's
|
|
||||||
* Unix domain socket directory so we can connect to the live
|
|
||||||
* server.
|
|
||||||
*/
|
|
||||||
unsigned short orig_port = cluster->port;
|
|
||||||
char filename[MAXPGPATH],
|
|
||||||
line[MAXPGPATH];
|
|
||||||
FILE *fp;
|
|
||||||
int lineno;
|
|
||||||
|
|
||||||
snprintf(filename, sizeof(filename), "%s/postmaster.pid",
|
|
||||||
cluster->pgdata);
|
|
||||||
if ((fp = fopen(filename, "r")) == NULL)
|
|
||||||
pg_fatal("could not open file \"%s\": %s\n",
|
|
||||||
filename, strerror(errno));
|
|
||||||
|
|
||||||
for (lineno = 1;
|
|
||||||
lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
|
|
||||||
lineno++)
|
|
||||||
{
|
|
||||||
if (fgets(line, sizeof(line), fp) == NULL)
|
|
||||||
pg_fatal("could not read line %d from file \"%s\": %s\n",
|
|
||||||
lineno, filename, strerror(errno));
|
|
||||||
|
|
||||||
/* potentially overwrite user-supplied value */
|
|
||||||
if (lineno == LOCK_FILE_LINE_PORT)
|
|
||||||
sscanf(line, "%hu", &old_cluster.port);
|
|
||||||
if (lineno == LOCK_FILE_LINE_SOCKET_DIR)
|
|
||||||
{
|
|
||||||
/* strip trailing newline and carriage return */
|
|
||||||
cluster->sockdir = pg_strdup(line);
|
|
||||||
(void) pg_strip_crlf(cluster->sockdir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
/* warn of port number correction */
|
|
||||||
if (orig_port != DEF_PGUPORT && old_cluster.port != orig_port)
|
|
||||||
pg_log(PG_WARNING, "user-supplied old port number %hu corrected to %hu\n",
|
|
||||||
orig_port, cluster->port);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* Can't get sockdir and pg_ctl -w can't use a non-default, use
|
* If we are doing a live check, we will use the old cluster's Unix
|
||||||
* default
|
* domain socket directory so we can connect to the live server.
|
||||||
*/
|
*/
|
||||||
cluster->sockdir = NULL;
|
unsigned short orig_port = cluster->port;
|
||||||
|
char filename[MAXPGPATH],
|
||||||
|
line[MAXPGPATH];
|
||||||
|
FILE *fp;
|
||||||
|
int lineno;
|
||||||
|
|
||||||
|
snprintf(filename, sizeof(filename), "%s/postmaster.pid",
|
||||||
|
cluster->pgdata);
|
||||||
|
if ((fp = fopen(filename, "r")) == NULL)
|
||||||
|
pg_fatal("could not open file \"%s\": %s\n",
|
||||||
|
filename, strerror(errno));
|
||||||
|
|
||||||
|
for (lineno = 1;
|
||||||
|
lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
|
||||||
|
lineno++)
|
||||||
|
{
|
||||||
|
if (fgets(line, sizeof(line), fp) == NULL)
|
||||||
|
pg_fatal("could not read line %d from file \"%s\": %s\n",
|
||||||
|
lineno, filename, strerror(errno));
|
||||||
|
|
||||||
|
/* potentially overwrite user-supplied value */
|
||||||
|
if (lineno == LOCK_FILE_LINE_PORT)
|
||||||
|
sscanf(line, "%hu", &old_cluster.port);
|
||||||
|
if (lineno == LOCK_FILE_LINE_SOCKET_DIR)
|
||||||
|
{
|
||||||
|
/* strip trailing newline and carriage return */
|
||||||
|
cluster->sockdir = pg_strdup(line);
|
||||||
|
(void) pg_strip_crlf(cluster->sockdir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* warn of port number correction */
|
||||||
|
if (orig_port != DEF_PGUPORT && old_cluster.port != orig_port)
|
||||||
|
pg_log(PG_WARNING, "user-supplied old port number %hu corrected to %hu\n",
|
||||||
|
orig_port, cluster->port);
|
||||||
|
}
|
||||||
#else /* !HAVE_UNIX_SOCKETS || WIN32 */
|
#else /* !HAVE_UNIX_SOCKETS || WIN32 */
|
||||||
cluster->sockdir = NULL;
|
cluster->sockdir = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user