summaryrefslogtreecommitdiffstats
path: root/src/bin/pg_upgrade
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:44:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 13:44:03 +0000
commit293913568e6a7a86fd1479e1cff8e2ecb58d6568 (patch)
treefc3b469a3ec5ab71b36ea97cc7aaddb838423a0c /src/bin/pg_upgrade
parentInitial commit. (diff)
downloadpostgresql-16-293913568e6a7a86fd1479e1cff8e2ecb58d6568.tar.xz
postgresql-16-293913568e6a7a86fd1479e1cff8e2ecb58d6568.zip
Adding upstream version 16.2.upstream/16.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/bin/pg_upgrade')
-rw-r--r--src/bin/pg_upgrade/.gitignore8
-rw-r--r--src/bin/pg_upgrade/IMPLEMENTATION98
-rw-r--r--src/bin/pg_upgrade/Makefile60
-rw-r--r--src/bin/pg_upgrade/TESTING66
-rw-r--r--src/bin/pg_upgrade/check.c1453
-rw-r--r--src/bin/pg_upgrade/controldata.c733
-rw-r--r--src/bin/pg_upgrade/dump.c71
-rw-r--r--src/bin/pg_upgrade/exec.c459
-rw-r--r--src/bin/pg_upgrade/file.c377
-rw-r--r--src/bin/pg_upgrade/function.c194
-rw-r--r--src/bin/pg_upgrade/info.c662
-rw-r--r--src/bin/pg_upgrade/meson.build50
-rw-r--r--src/bin/pg_upgrade/nls.mk24
-rw-r--r--src/bin/pg_upgrade/option.c507
-rw-r--r--src/bin/pg_upgrade/parallel.c341
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.c862
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.h473
-rw-r--r--src/bin/pg_upgrade/po/LINGUAS1
-rw-r--r--src/bin/pg_upgrade/po/cs.po1804
-rw-r--r--src/bin/pg_upgrade/po/de.po1833
-rw-r--r--src/bin/pg_upgrade/po/es.po1829
-rw-r--r--src/bin/pg_upgrade/po/fr.po2158
-rw-r--r--src/bin/pg_upgrade/po/ja.po1828
-rw-r--r--src/bin/pg_upgrade/po/ka.po1910
-rw-r--r--src/bin/pg_upgrade/po/ko.po1882
-rw-r--r--src/bin/pg_upgrade/po/meson.build3
-rw-r--r--src/bin/pg_upgrade/po/ru.po2272
-rw-r--r--src/bin/pg_upgrade/po/sv.po1903
-rw-r--r--src/bin/pg_upgrade/po/tr.po1668
-rw-r--r--src/bin/pg_upgrade/po/uk.po1698
-rw-r--r--src/bin/pg_upgrade/po/zh_CN.po1850
-rw-r--r--src/bin/pg_upgrade/po/zh_TW.po1805
-rw-r--r--src/bin/pg_upgrade/relfilenumber.c259
-rw-r--r--src/bin/pg_upgrade/server.c377
-rw-r--r--src/bin/pg_upgrade/t/001_basic.pl13
-rw-r--r--src/bin/pg_upgrade/t/002_pg_upgrade.pl461
-rw-r--r--src/bin/pg_upgrade/tablespace.c111
-rw-r--r--src/bin/pg_upgrade/util.c355
-rw-r--r--src/bin/pg_upgrade/version.c461
39 files changed, 32919 insertions, 0 deletions
diff --git a/src/bin/pg_upgrade/.gitignore b/src/bin/pg_upgrade/.gitignore
new file mode 100644
index 0000000..a66166e
--- /dev/null
+++ b/src/bin/pg_upgrade/.gitignore
@@ -0,0 +1,8 @@
+/pg_upgrade
+# Generated by manual invocation
+/delete_old_cluster.sh
+/delete_old_cluster.bat
+/reindex_hash.sql
+# Generated by test suite
+/log/
+/tmp_check/
diff --git a/src/bin/pg_upgrade/IMPLEMENTATION b/src/bin/pg_upgrade/IMPLEMENTATION
new file mode 100644
index 0000000..229399a
--- /dev/null
+++ b/src/bin/pg_upgrade/IMPLEMENTATION
@@ -0,0 +1,98 @@
+------------------------------------------------------------------------------
+PG_UPGRADE: IN-PLACE UPGRADES FOR POSTGRESQL
+------------------------------------------------------------------------------
+
+Upgrading a PostgreSQL database from one major release to another can be
+an expensive process. For minor upgrades, you can simply install new
+executables and forget about upgrading existing data. But for major
+upgrades, you have to export all of your data using pg_dump, install the
+new release, run initdb to create a new cluster, and then import your
+old data. If you have a lot of data, that can take a considerable amount
+of time. If you have too much data, you may have to buy more storage
+since you need enough room to hold the original data plus the exported
+data. pg_upgrade can reduce the amount of time and disk space required
+for many upgrades.
+
+The URL http://momjian.us/main/writings/pgsql/pg_upgrade.pdf contains a
+presentation about pg_upgrade internals that mirrors the text
+description below.
+
+------------------------------------------------------------------------------
+WHAT IT DOES
+------------------------------------------------------------------------------
+
+pg_upgrade is a tool that performs an in-place upgrade of existing
+data. Some upgrades change the on-disk representation of data;
+pg_upgrade cannot help in those upgrades. However, many upgrades do
+not change the on-disk representation of a user-defined table. In those
+cases, pg_upgrade can move existing user-defined tables from the old
+database cluster into the new cluster.
+
+There are two factors that determine whether an in-place upgrade is
+practical.
+
+Every table in a cluster shares the same on-disk representation of the
+table headers and trailers and the on-disk representation of tuple
+headers. If this changes between the old version of PostgreSQL and the
+new version, pg_upgrade cannot move existing tables to the new cluster;
+you will have to pg_dump the old data and then import that data into the
+new cluster.
+
+Second, all data types should have the same binary representation
+between the two major PostgreSQL versions.
+
+------------------------------------------------------------------------------
+HOW IT WORKS
+------------------------------------------------------------------------------
+
+To use pg_upgrade during an upgrade, start by installing a fresh
+cluster using the newest version in a new directory. When you've
+finished installation, the new cluster will contain the new executables
+and the usual template0, template1, and postgres, but no user-defined
+tables. At this point, you can shut down the old and new postmasters and
+invoke pg_upgrade.
+
+When pg_upgrade starts, it ensures that all required executables are
+present and contain the expected version numbers. The verification
+process also checks the old and new $PGDATA directories to ensure that
+the expected files and subdirectories are in place. If the verification
+process succeeds, pg_upgrade starts the old postmaster and runs
+pg_dumpall --schema-only to capture the metadata contained in the old
+cluster. The script produced by pg_dumpall will be used in a later step
+to recreate all user-defined objects in the new cluster.
+
+Note that the script produced by pg_dumpall will only recreate
+user-defined objects, not system-defined objects. The new cluster will
+contain the system-defined objects created by the latest version of
+PostgreSQL.
+
+Once pg_upgrade has extracted the metadata from the old cluster, it
+performs a number of bookkeeping tasks required to 'sync up' the new
+cluster with the existing data.
+
+First, pg_upgrade copies the commit status information and 'next
+transaction ID' from the old cluster to the new cluster. This step
+ensures that the proper tuples are visible from the new cluster.
+Remember, pg_upgrade does not export/import the content of user-defined
+tables so the transaction IDs in the new cluster must match the
+transaction IDs in the old data. pg_upgrade also copies the starting
+address for write-ahead logs from the old cluster to the new cluster.
+
+Now pg_upgrade begins reconstructing the metadata obtained from the old
+cluster using the first part of the pg_dumpall output.
+
+Next, pg_upgrade executes the remainder of the script produced earlier
+by pg_dumpall --- this script effectively creates the complete
+user-defined metadata from the old cluster to the new cluster. It
+preserves the relfilenode numbers so TOAST and other references
+to relfilenodes in user data is preserved. (See binary-upgrade usage
+in pg_dump). We choose to preserve tablespace and database OIDs as well.
+
+Finally, pg_upgrade links or copies each user-defined table and its
+supporting indexes and toast tables from the old cluster to the new
+cluster.
+
+An important feature of the pg_upgrade design is that it leaves the
+original cluster intact --- if a problem occurs during the upgrade, you
+can still run the previous version, after renaming the tablespaces back
+to the original names.
diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile
new file mode 100644
index 0000000..5834513
--- /dev/null
+++ b/src/bin/pg_upgrade/Makefile
@@ -0,0 +1,60 @@
+# src/bin/pg_upgrade/Makefile
+
+PGFILEDESC = "pg_upgrade - an in-place binary upgrade utility"
+PGAPPICON = win32
+
+subdir = src/bin/pg_upgrade
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+ $(WIN32RES) \
+ check.o \
+ controldata.o \
+ dump.o \
+ exec.o \
+ file.o \
+ function.o \
+ info.o \
+ option.o \
+ parallel.o \
+ pg_upgrade.o \
+ relfilenumber.o \
+ server.o \
+ tablespace.o \
+ util.o \
+ version.o
+
+override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+# required for 002_pg_upgrade.pl
+REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX)
+export REGRESS_SHLIB
+
+all: pg_upgrade
+
+pg_upgrade: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_upgrade$(X) '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_upgrade$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_upgrade$(X) $(OBJS)
+ rm -rf delete_old_cluster.sh log/ tmp_check/ \
+ reindex_hash.sql
+
+export with_icu
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING
new file mode 100644
index 0000000..81a4324
--- /dev/null
+++ b/src/bin/pg_upgrade/TESTING
@@ -0,0 +1,66 @@
+THE SHORT VERSION
+-----------------
+
+On non-Windows machines, you can execute the testing process
+described below by running the following command in this directory:
+
+ make check
+
+This will run the TAP tests to run pg_upgrade, performing an upgrade
+from the version in this source tree to a new instance of the same
+version.
+
+Testing an upgrade from a different PG version is also possible, and
+provides a more thorough test that pg_upgrade does what it's meant for.
+This requires both a source tree and an installed tree for the old
+version, as well as a dump file to set up the instance to be upgraded.
+The following environment variables must be set to enable this testing:
+export olddump=...somewhere/dump.sql (old version's dump)
+export oldinstall=...otherversion/ (old version's install base path)
+See DETAILS below for more information about creation of the dump.
+
+You can also test the different transfer modes (--copy, --link,
+--clone) by setting the environment variable PG_TEST_PG_UPGRADE_MODE
+to the respective command-line option, like
+
+ make check PG_TEST_PG_UPGRADE_MODE=--link
+
+The default is --copy. Note that the other modes are not supported on
+all operating systems.
+
+DETAILS
+-------
+
+The most effective way to test pg_upgrade, aside from testing on user
+data, is by upgrading the PostgreSQL regression database.
+
+This testing process first requires the creation of a valid regression
+database dump that can then be used for $olddump. Such files contain
+most database features and are specific to each major version of Postgres.
+
+Here are the steps needed to create a dump file:
+
+1) Create and populate the regression database in the old cluster.
+ This database can be created by running 'make installcheck' from
+ src/test/regress in the old version's source code tree.
+
+ If you like, you can also populate regression databases for one or
+ more contrib modules by running 'make installcheck USE_MODULE_DB=1'
+ in their directories. (USE_MODULE_DB is essential so that the
+ pg_upgrade test script will understand which database is which.)
+
+2) Use pg_dumpall to dump out the contents of the instance, including the
+ regression database(s), into a SQL file. Use the *old* version's
+ pg_dumpall so that the dump created is compatible with that version.
+
+Once the dump file is created, it can be used repeatedly. Set $olddump
+to point to the dump file and run 'make check' or 'make installcheck'
+in the new version's src/bin/pg_upgrade directory. (If you included any
+contrib databases in the old dump, you must use 'make installcheck' and
+ensure that the corresponding contrib modules have been installed in
+the new version's installation tree.) This will build a temporary cluster
+using the old installation's executables, populate it from the dump file,
+and then try to pg_upgrade it to the new version. Success is reported
+if pg_dumpall output matches between the pre-upgrade and post-upgrade
+databases. In case of trouble, manually comparing those dump files may
+help to isolate the problem.
diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
new file mode 100644
index 0000000..f1cd14e
--- /dev/null
+++ b/src/bin/pg_upgrade/check.c
@@ -0,0 +1,1453 @@
+/*
+ * check.c
+ *
+ * server checks and output routines
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/check.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_authid_d.h"
+#include "catalog/pg_collation.h"
+#include "fe_utils/string_utils.h"
+#include "mb/pg_wchar.h"
+#include "pg_upgrade.h"
+
+static void check_new_cluster_is_empty(void);
+static void check_is_install_user(ClusterInfo *cluster);
+static void check_proper_datallowconn(ClusterInfo *cluster);
+static void check_for_prepared_transactions(ClusterInfo *cluster);
+static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster);
+static void check_for_user_defined_postfix_ops(ClusterInfo *cluster);
+static void check_for_incompatible_polymorphics(ClusterInfo *cluster);
+static void check_for_tables_with_oids(ClusterInfo *cluster);
+static void check_for_composite_data_type_usage(ClusterInfo *cluster);
+static void check_for_reg_data_type_usage(ClusterInfo *cluster);
+static void check_for_aclitem_data_type_usage(ClusterInfo *cluster);
+static void check_for_removed_data_type_usage(ClusterInfo *cluster,
+ const char *version,
+ const char *datatype);
+static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
+static void check_for_pg_role_prefix(ClusterInfo *cluster);
+static void check_for_new_tablespace_dir(ClusterInfo *new_cluster);
+static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster);
+
+
+/*
+ * fix_path_separator
+ * For non-Windows, just return the argument.
+ * For Windows convert any forward slash to a backslash
+ * such as is suitable for arguments to builtin commands
+ * like RMDIR and DEL.
+ */
+static char *
+fix_path_separator(char *path)
+{
+#ifdef WIN32
+
+ char *result;
+ char *c;
+
+ result = pg_strdup(path);
+
+ for (c = result; *c != '\0'; c++)
+ if (*c == '/')
+ *c = '\\';
+
+ return result;
+#else
+
+ return path;
+#endif
+}
+
+void
+output_check_banner(bool live_check)
+{
+ if (user_opts.check && live_check)
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks on Old Live Server\n"
+ "------------------------------------------------");
+ }
+ else
+ {
+ pg_log(PG_REPORT,
+ "Performing Consistency Checks\n"
+ "-----------------------------");
+ }
+}
+
+
+void
+check_and_dump_old_cluster(bool live_check)
+{
+ /* -- OLD -- */
+
+ if (!live_check)
+ start_postmaster(&old_cluster, true);
+
+ /* Extract a list of databases and tables from the old cluster */
+ get_db_and_rel_infos(&old_cluster);
+
+ init_tablespaces();
+
+ get_loadable_libraries();
+
+
+ /*
+ * Check for various failure cases
+ */
+ check_is_install_user(&old_cluster);
+ check_proper_datallowconn(&old_cluster);
+ check_for_prepared_transactions(&old_cluster);
+ check_for_composite_data_type_usage(&old_cluster);
+ check_for_reg_data_type_usage(&old_cluster);
+ check_for_isn_and_int8_passing_mismatch(&old_cluster);
+
+ /*
+ * PG 16 increased the size of the 'aclitem' type, which breaks the
+ * on-disk format for existing data.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1500)
+ check_for_aclitem_data_type_usage(&old_cluster);
+
+ /*
+ * PG 12 removed types abstime, reltime, tinterval.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ {
+ check_for_removed_data_type_usage(&old_cluster, "12", "abstime");
+ check_for_removed_data_type_usage(&old_cluster, "12", "reltime");
+ check_for_removed_data_type_usage(&old_cluster, "12", "tinterval");
+ }
+
+ /*
+ * PG 14 changed the function signature of encoding conversion functions.
+ * Conversions from older versions cannot be upgraded automatically
+ * because the user-defined functions used by the encoding conversions
+ * need to be changed to match the new signature.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_encoding_conversions(&old_cluster);
+
+ /*
+ * Pre-PG 14 allowed user defined postfix operators, which are not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_user_defined_postfix_ops(&old_cluster);
+
+ /*
+ * PG 14 changed polymorphic functions from anyarray to
+ * anycompatiblearray.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1300)
+ check_for_incompatible_polymorphics(&old_cluster);
+
+ /*
+ * Pre-PG 12 allowed tables to be declared WITH OIDS, which is not
+ * supported anymore. Verify there are none, iff applicable.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ check_for_tables_with_oids(&old_cluster);
+
+ /*
+ * PG 12 changed the 'sql_identifier' type storage to be based on name,
+ * not varchar, which breaks on-disk format for existing data. So we need
+ * to prevent upgrade when used in user objects (tables, indexes, ...).
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100)
+ old_11_check_for_sql_identifier_data_type_usage(&old_cluster);
+
+ /*
+ * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged
+ * hash indexes
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ {
+ old_9_6_check_for_unknown_data_type_usage(&old_cluster);
+ if (user_opts.check)
+ old_9_6_invalidate_hash_indexes(&old_cluster, true);
+ }
+
+ /* 9.5 and below should not have roles starting with pg_ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 905)
+ check_for_pg_role_prefix(&old_cluster);
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) == 904 &&
+ old_cluster.controldata.cat_ver < JSONB_FORMAT_CHANGE_CAT_VER)
+ check_for_jsonb_9_4_usage(&old_cluster);
+
+ /* Pre-PG 9.4 had a different 'line' data type internal format */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 903)
+ old_9_3_check_for_line_data_type_usage(&old_cluster);
+
+ /*
+ * While not a check option, we do this now because this is the only time
+ * the old server is running.
+ */
+ if (!user_opts.check)
+ generate_old_dump();
+
+ if (!live_check)
+ stop_postmaster(false);
+}
+
+
+void
+check_new_cluster(void)
+{
+ get_db_and_rel_infos(&new_cluster);
+
+ check_new_cluster_is_empty();
+
+ check_loadable_libraries();
+
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ check_file_clone();
+ break;
+ case TRANSFER_MODE_COPY:
+ break;
+ case TRANSFER_MODE_LINK:
+ check_hard_link();
+ break;
+ }
+
+ check_is_install_user(&new_cluster);
+
+ check_for_prepared_transactions(&new_cluster);
+
+ check_for_new_tablespace_dir(&new_cluster);
+}
+
+
+void
+report_clusters_compatible(void)
+{
+ if (user_opts.check)
+ {
+ pg_log(PG_REPORT, "\n*Clusters are compatible*");
+ /* stops new cluster */
+ stop_postmaster(false);
+
+ cleanup_output_dirs();
+ exit(0);
+ }
+
+ pg_log(PG_REPORT, "\n"
+ "If pg_upgrade fails after this point, you must re-initdb the\n"
+ "new cluster before continuing.");
+}
+
+
+void
+issue_warnings_and_set_wal_level(void)
+{
+ /*
+ * We unconditionally start/stop the new server because pg_resetwal -o set
+ * wal_level to 'minimum'. If the user is upgrading standby servers using
+ * the rsync instructions, they will need pg_upgrade to write its final
+ * WAL record showing wal_level as 'replica'.
+ */
+ start_postmaster(&new_cluster, true);
+
+ /* Reindex hash indexes for old < 10.0 */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906)
+ old_9_6_invalidate_hash_indexes(&new_cluster, false);
+
+ report_extension_updates(&new_cluster);
+
+ stop_postmaster(false);
+}
+
+
+void
+output_completion_banner(char *deletion_script_file_name)
+{
+ PQExpBufferData user_specification;
+
+ initPQExpBuffer(&user_specification);
+ if (os_info.user_specified)
+ {
+ appendPQExpBufferStr(&user_specification, "-U ");
+ appendShellString(&user_specification, os_info.user);
+ appendPQExpBufferChar(&user_specification, ' ');
+ }
+
+ pg_log(PG_REPORT,
+ "Optimizer statistics are not transferred by pg_upgrade.\n"
+ "Once you start the new server, consider running:\n"
+ " %s/vacuumdb %s--all --analyze-in-stages", new_cluster.bindir, user_specification.data);
+
+ if (deletion_script_file_name)
+ pg_log(PG_REPORT,
+ "Running this script will delete the old cluster's data files:\n"
+ " %s",
+ deletion_script_file_name);
+ else
+ pg_log(PG_REPORT,
+ "Could not create a script to delete the old cluster's data files\n"
+ "because user-defined tablespaces or the new cluster's data directory\n"
+ "exist in the old cluster directory. The old cluster's contents must\n"
+ "be deleted manually.");
+
+ termPQExpBuffer(&user_specification);
+}
+
+
+void
+check_cluster_versions(void)
+{
+ prep_status("Checking cluster versions");
+
+ /* cluster versions should already have been obtained */
+ Assert(old_cluster.major_version != 0);
+ Assert(new_cluster.major_version != 0);
+
+ /*
+ * We allow upgrades from/to the same major version for alpha/beta
+ * upgrades
+ */
+
+ if (GET_MAJOR_VERSION(old_cluster.major_version) < 902)
+ pg_fatal("This utility can only upgrade from PostgreSQL version %s and later.",
+ "9.2");
+
+ /* Only current PG version is supported as a target */
+ if (GET_MAJOR_VERSION(new_cluster.major_version) != GET_MAJOR_VERSION(PG_VERSION_NUM))
+ pg_fatal("This utility can only upgrade to PostgreSQL version %s.",
+ PG_MAJORVERSION);
+
+ /*
+ * We can't allow downgrading because we use the target pg_dump, and
+ * pg_dump cannot operate on newer database versions, only current and
+ * older versions.
+ */
+ if (old_cluster.major_version > new_cluster.major_version)
+ pg_fatal("This utility cannot be used to downgrade to older major PostgreSQL versions.");
+
+ /* Ensure binaries match the designated data directories */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) !=
+ GET_MAJOR_VERSION(old_cluster.bin_version))
+ pg_fatal("Old cluster data and binary directories are from different major versions.");
+ if (GET_MAJOR_VERSION(new_cluster.major_version) !=
+ GET_MAJOR_VERSION(new_cluster.bin_version))
+ pg_fatal("New cluster data and binary directories are from different major versions.");
+
+ check_ok();
+}
+
+
+void
+check_cluster_compatibility(bool live_check)
+{
+ /* get/check pg_control data of servers */
+ get_control_data(&old_cluster, live_check);
+ get_control_data(&new_cluster, false);
+ check_control_data(&old_cluster.controldata, &new_cluster.controldata);
+
+ if (live_check && old_cluster.port == new_cluster.port)
+ pg_fatal("When checking a live server, "
+ "the old and new port numbers must be different.");
+}
+
+
+static void
+check_new_cluster_is_empty(void)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < new_cluster.dbarr.ndbs; dbnum++)
+ {
+ int relnum;
+ RelInfoArr *rel_arr = &new_cluster.dbarr.dbs[dbnum].rel_arr;
+
+ for (relnum = 0; relnum < rel_arr->nrels;
+ relnum++)
+ {
+ /* pg_largeobject and its index should be skipped */
+ if (strcmp(rel_arr->rels[relnum].nspname, "pg_catalog") != 0)
+ pg_fatal("New cluster database \"%s\" is not empty: found relation \"%s.%s\"",
+ new_cluster.dbarr.dbs[dbnum].db_name,
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname);
+ }
+ }
+}
+
+/*
+ * A previous run of pg_upgrade might have failed and the new cluster
+ * directory recreated, but they might have forgotten to remove
+ * the new cluster's tablespace directories. Therefore, check that
+ * new cluster tablespace directories do not already exist. If
+ * they do, it would cause an error while restoring global objects.
+ * This allows the failure to be detected at check time, rather than
+ * during schema restore.
+ */
+static void
+check_for_new_tablespace_dir(ClusterInfo *new_cluster)
+{
+ int tblnum;
+ char new_tablespace_dir[MAXPGPATH];
+
+ prep_status("Checking for new cluster tablespace directories");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statbuf;
+
+ snprintf(new_tablespace_dir, MAXPGPATH, "%s%s",
+ os_info.old_tablespaces[tblnum],
+ new_cluster->tablespace_suffix);
+
+ if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT)
+ pg_fatal("new cluster tablespace directory already exists: \"%s\"",
+ new_tablespace_dir);
+ }
+
+ check_ok();
+}
+
+/*
+ * create_script_for_old_cluster_deletion()
+ *
+ * This is particularly useful for tablespace deletion.
+ */
+void
+create_script_for_old_cluster_deletion(char **deletion_script_file_name)
+{
+ FILE *script = NULL;
+ int tblnum;
+ char old_cluster_pgdata[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ *deletion_script_file_name = psprintf("%sdelete_old_cluster.%s",
+ SCRIPT_PREFIX, SCRIPT_EXT);
+
+ strlcpy(old_cluster_pgdata, old_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(old_cluster_pgdata);
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ /* Some people put the new data directory inside the old one. */
+ if (path_is_prefix_of_path(old_cluster_pgdata, new_cluster_pgdata))
+ {
+ pg_log(PG_WARNING,
+ "\nWARNING: new data directory should not be inside the old data directory, i.e. %s", old_cluster_pgdata);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+
+ /*
+ * Some users (oddly) create tablespaces inside the cluster data
+ * directory. We can't create a proper old cluster delete script in that
+ * case.
+ */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ char old_tablespace_dir[MAXPGPATH];
+
+ strlcpy(old_tablespace_dir, os_info.old_tablespaces[tblnum], MAXPGPATH);
+ canonicalize_path(old_tablespace_dir);
+ if (path_is_prefix_of_path(old_cluster_pgdata, old_tablespace_dir))
+ {
+ /* reproduce warning from CREATE TABLESPACE that is in the log */
+ pg_log(PG_WARNING,
+ "\nWARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s", old_tablespace_dir);
+
+ /* Unlink file in case it is left over from a previous run. */
+ unlink(*deletion_script_file_name);
+ pg_free(*deletion_script_file_name);
+ *deletion_script_file_name = NULL;
+ return;
+ }
+ }
+
+ prep_status("Creating script to delete old cluster");
+
+ if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ *deletion_script_file_name, strerror(errno));
+
+#ifndef WIN32
+ /* add shebang header */
+ fprintf(script, "#!/bin/sh\n\n");
+#endif
+
+ /* delete old cluster's default tablespace */
+ fprintf(script, RMDIR_CMD " %c%s%c\n", PATH_QUOTE,
+ fix_path_separator(old_cluster.pgdata), PATH_QUOTE);
+
+ /* delete old cluster's alternate tablespaces */
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ /*
+ * Do the old cluster's per-database directories share a directory
+ * with a new version-specific tablespace?
+ */
+ if (strlen(old_cluster.tablespace_suffix) == 0)
+ {
+ /* delete per-database directories */
+ int dbnum;
+
+ fprintf(script, "\n");
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ fprintf(script, RMDIR_CMD " %c%s%c%u%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ PATH_SEPARATOR, old_cluster.dbarr.dbs[dbnum].db_oid,
+ PATH_QUOTE);
+ }
+ else
+ {
+ char *suffix_path = pg_strdup(old_cluster.tablespace_suffix);
+
+ /*
+ * Simply delete the tablespace directory, which might be ".old"
+ * or a version-specific subdirectory.
+ */
+ fprintf(script, RMDIR_CMD " %c%s%s%c\n", PATH_QUOTE,
+ fix_path_separator(os_info.old_tablespaces[tblnum]),
+ fix_path_separator(suffix_path), PATH_QUOTE);
+ pfree(suffix_path);
+ }
+ }
+
+ fclose(script);
+
+#ifndef WIN32
+ if (chmod(*deletion_script_file_name, S_IRWXU) != 0)
+ pg_fatal("could not add execute permission to file \"%s\": %s",
+ *deletion_script_file_name, strerror(errno));
+#endif
+
+ check_ok();
+}
+
+
+/*
+ * check_is_install_user()
+ *
+ * Check we are the install user, and that the new cluster
+ * has no other users.
+ */
+static void
+check_is_install_user(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking database user is the install user");
+
+ /* Can't use pg_authid because only superusers can view it. */
+ res = executeQueryOrDie(conn,
+ "SELECT rolsuper, oid "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname = current_user "
+ "AND rolname !~ '^pg_'");
+
+ /*
+ * We only allow the install user in the new cluster (see comment below)
+ * and we preserve pg_authid.oid, so this must be the install user in the
+ * old cluster too.
+ */
+ if (PQntuples(res) != 1 ||
+ atooid(PQgetvalue(res, 0, 1)) != BOOTSTRAP_SUPERUSERID)
+ pg_fatal("database user \"%s\" is not the install user",
+ os_info.user);
+
+ PQclear(res);
+
+ res = executeQueryOrDie(conn,
+ "SELECT COUNT(*) "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname !~ '^pg_'");
+
+ if (PQntuples(res) != 1)
+ pg_fatal("could not determine the number of users");
+
+ /*
+ * We only allow the install user in the new cluster because other defined
+ * users might match users defined in the old cluster and generate an
+ * error during pg_dump restore.
+ */
+ if (cluster == &new_cluster && strcmp(PQgetvalue(res, 0, 0), "1") != 0)
+ pg_fatal("Only the install user can be defined in the new cluster.");
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_proper_datallowconn
+ *
+ * Ensure that all non-template0 databases allow connections since they
+ * otherwise won't be restored; and that template0 explicitly doesn't allow
+ * connections since it would make pg_dumpall --globals restore fail.
+ */
+static void
+check_proper_datallowconn(ClusterInfo *cluster)
+{
+ int dbnum;
+ PGconn *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking database connection settings");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "databases_with_datallowconn_false.txt");
+
+ conn_template1 = connectToServer(cluster, "template1");
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ if (strcmp(datname, "template0") == 0)
+ {
+ /* avoid restore failure when pg_dumpall tries to create template0 */
+ if (strcmp(datallowconn, "t") == 0)
+ pg_fatal("template0 must not allow connections, "
+ "i.e. its pg_database.datallowconn must be false");
+ }
+ else
+ {
+ /*
+ * avoid datallowconn == false databases from being skipped on
+ * restore
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+
+ fprintf(script, "%s\n", datname);
+ }
+ }
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("All non-template0 databases must allow connections, i.e. their\n"
+ "pg_database.datallowconn must be true. Your installation contains\n"
+ "non-template0 databases with their pg_database.datallowconn set to\n"
+ "false. Consider allowing connection for all non-template0 databases\n"
+ "or drop the databases which do not allow connections. A list of\n"
+ "databases with the problem is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_prepared_transactions()
+ *
+ * Make sure there are no prepared transactions because the storage format
+ * might have changed.
+ */
+static void
+check_for_prepared_transactions(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+
+ prep_status("Checking for prepared transactions");
+
+ res = executeQueryOrDie(conn,
+ "SELECT * "
+ "FROM pg_catalog.pg_prepared_xacts");
+
+ if (PQntuples(res) != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster contains prepared transactions");
+ else
+ pg_fatal("The target cluster contains prepared transactions");
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ check_ok();
+}
+
+
+/*
+ * check_for_isn_and_int8_passing_mismatch()
+ *
+ * contrib/isn relies on data type int8, and in 8.4 int8 can now be passed
+ * by value. The schema dumps the CREATE TYPE PASSEDBYVALUE setting so
+ * it must match for the old and new servers.
+ */
+static void
+check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for contrib/isn with bigint-passing mismatch");
+
+ if (old_cluster.controldata.float8_pass_by_value ==
+ new_cluster.controldata.float8_pass_by_value)
+ {
+ /* no mismatch */
+ check_ok();
+ return;
+ }
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "contrib_isn_and_int8_pass_by_value.txt");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_proname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* Find any functions coming from contrib/isn */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, p.proname "
+ "FROM pg_catalog.pg_proc p, "
+ " pg_catalog.pg_namespace n "
+ "WHERE p.pronamespace = n.oid AND "
+ " p.probin = '$libdir/isn'");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_proname = PQfnumber(res, "proname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_proname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains \"contrib/isn\" functions which rely on the\n"
+ "bigint data type. Your old and new clusters pass bigint values\n"
+ "differently so this cluster cannot currently be upgraded. You can\n"
+ "manually dump databases in the old cluster that use \"contrib/isn\"\n"
+ "facilities, drop them, perform the upgrade, and then restore them. A\n"
+ "list of the problem functions is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * Verify that no user defined postfix operators exist.
+ */
+static void
+check_for_user_defined_postfix_ops(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined postfix operators");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "postfix_ops.txt");
+
+ /* Find any user defined postfix operators */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_oproid,
+ i_oprnsp,
+ i_oprname,
+ i_typnsp,
+ i_typname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT o.oid AS oproid, "
+ " n.nspname AS oprnsp, "
+ " o.oprname, "
+ " tn.nspname AS typnsp, "
+ " t.typname "
+ "FROM pg_catalog.pg_operator o, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_type t, "
+ " pg_catalog.pg_namespace tn "
+ "WHERE o.oprnamespace = n.oid AND "
+ " o.oprleft = t.oid AND "
+ " t.typnamespace = tn.oid AND "
+ " o.oprright = 0 AND "
+ " o.oid >= 16384");
+ ntups = PQntuples(res);
+ i_oproid = PQfnumber(res, "oproid");
+ i_oprnsp = PQfnumber(res, "oprnsp");
+ i_oprname = PQfnumber(res, "oprname");
+ i_typnsp = PQfnumber(res, "typnsp");
+ i_typname = PQfnumber(res, "typname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s (%s.%s, NONE)\n",
+ PQgetvalue(res, rowno, i_oproid),
+ PQgetvalue(res, rowno, i_oprnsp),
+ PQgetvalue(res, rowno, i_oprname),
+ PQgetvalue(res, rowno, i_typnsp),
+ PQgetvalue(res, rowno, i_typname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains user-defined postfix operators, which are not\n"
+ "supported anymore. Consider dropping the postfix operators and replacing\n"
+ "them with prefix operators or function calls.\n"
+ "A list of user-defined postfix operators is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_incompatible_polymorphics()
+ *
+ * Make sure nothing is using old polymorphic functions with
+ * anyarray/anyelement rather than the new anycompatible variants.
+ */
+static void
+check_for_incompatible_polymorphics(ClusterInfo *cluster)
+{
+ PGresult *res;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+ PQExpBufferData old_polymorphics;
+
+ prep_status("Checking for incompatible polymorphic functions");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "incompatible_polymorphics.txt");
+
+ /* The set of problematic functions varies a bit in different versions */
+ initPQExpBuffer(&old_polymorphics);
+
+ appendPQExpBufferStr(&old_polymorphics,
+ "'array_append(anyarray,anyelement)'"
+ ", 'array_cat(anyarray,anyarray)'"
+ ", 'array_prepend(anyelement,anyarray)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 903)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_remove(anyarray,anyelement)'"
+ ", 'array_replace(anyarray,anyelement,anyelement)'");
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 905)
+ appendPQExpBufferStr(&old_polymorphics,
+ ", 'array_position(anyarray,anyelement)'"
+ ", 'array_position(anyarray,anyelement,integer)'"
+ ", 'array_positions(anyarray,anyelement)'"
+ ", 'width_bucket(anyelement,anyarray)'");
+
+ for (int dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ bool db_used = false;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ int ntups;
+ int i_objkind,
+ i_objname;
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ /* Aggregate transition functions */
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS transfn ON transfn.oid=a.aggtransfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggtransfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Aggregate final functions */
+ "UNION ALL "
+ "SELECT 'aggregate' AS objkind, p.oid::regprocedure::text AS objname "
+ "FROM pg_proc AS p "
+ "JOIN pg_aggregate AS a ON a.aggfnoid=p.oid "
+ "JOIN pg_proc AS finalfn ON finalfn.oid=a.aggfinalfn "
+ "WHERE p.oid >= 16384 "
+ "AND a.aggfinalfn = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND a.aggtranstype = ANY(ARRAY['anyarray', 'anyelement']::regtype[]) "
+
+ /* Operators */
+ "UNION ALL "
+ "SELECT 'operator' AS objkind, op.oid::regoperator::text AS objname "
+ "FROM pg_operator AS op "
+ "WHERE op.oid >= 16384 "
+ "AND oprcode = ANY(ARRAY[%s]::regprocedure[]) "
+ "AND oprleft = ANY(ARRAY['anyarray', 'anyelement']::regtype[]);",
+ old_polymorphics.data,
+ old_polymorphics.data,
+ old_polymorphics.data);
+
+ ntups = PQntuples(res);
+
+ i_objkind = PQfnumber(res, "objkind");
+ i_objname = PQfnumber(res, "objname");
+
+ for (int rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+
+ fprintf(script, " %s: %s\n",
+ PQgetvalue(res, rowno, i_objkind),
+ PQgetvalue(res, rowno, i_objname));
+ }
+
+ PQclear(res);
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains user-defined objects that refer to internal\n"
+ "polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+ "These user-defined objects must be dropped before upgrading and restored\n"
+ "afterwards, changing them to refer to the new corresponding functions with\n"
+ "arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+ "A list of the problematic objects is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+
+ termPQExpBuffer(&old_polymorphics);
+}
+
+/*
+ * Verify that no tables are declared WITH OIDS.
+ */
+static void
+check_for_tables_with_oids(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for tables WITH OIDS");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_with_oids.txt");
+
+ /* Find any tables declared WITH OIDS */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.relnamespace = n.oid AND "
+ " c.relhasoids AND"
+ " n.nspname NOT IN ('pg_catalog')");
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains tables declared WITH OIDS, which is not\n"
+ "supported anymore. Consider removing the oid column using\n"
+ " ALTER TABLE ... SET WITHOUT OIDS;\n"
+ "A list of tables with the problem is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_composite_data_type_usage()
+ * Check for system-defined composite types used in user tables.
+ *
+ * The OIDs of rowtypes of system catalogs and information_schema views
+ * can change across major versions; unlike user-defined types, we have
+ * no mechanism for forcing them to be the same in the new cluster.
+ * Hence, if any user table uses one, that's problematic for pg_upgrade.
+ */
+static void
+check_for_composite_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ Oid firstUserOid;
+ char output_path[MAXPGPATH];
+ char *base_query;
+
+ prep_status("Checking for system-defined composite types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_composite.txt");
+
+ /*
+ * Look for composite types that were made during initdb *or* belong to
+ * information_schema; that's important in case information_schema was
+ * dropped and reloaded.
+ *
+ * The cutoff OID here should match the source cluster's value of
+ * FirstNormalObjectId. We hardcode it rather than using that C #define
+ * because, if that #define is ever changed, our own version's value is
+ * NOT what to use. Eventually we may need a test on the source cluster's
+ * version to select the correct value.
+ */
+ firstUserOid = 16384;
+
+ base_query = psprintf("SELECT t.oid FROM pg_catalog.pg_type t "
+ "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid "
+ " WHERE typtype = 'c' AND (t.oid < %u OR nspname = 'information_schema')",
+ firstUserOid);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains system-defined composite types in user tables.\n"
+ "These type OIDs are not stable across PostgreSQL versions,\n"
+ "so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_reg_data_type_usage()
+ * pg_upgrade only preserves these system values:
+ * pg_class.oid
+ * pg_type.oid
+ * pg_enum.oid
+ *
+ * Many of the reg* data types reference system catalog info that is
+ * not preserved, and hence these data types cannot be used in user
+ * tables upgraded by pg_upgrade.
+ */
+static void
+check_for_reg_data_type_usage(ClusterInfo *cluster)
+{
+ bool found;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for reg* data types in user tables");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_reg.txt");
+
+ /*
+ * Note: older servers will not have all of these reg* types, so we have
+ * to write the query like this rather than depending on casts to regtype.
+ */
+ found = check_for_data_types_usage(cluster,
+ "SELECT oid FROM pg_catalog.pg_type t "
+ "WHERE t.typnamespace = "
+ " (SELECT oid FROM pg_catalog.pg_namespace "
+ " WHERE nspname = 'pg_catalog') "
+ " AND t.typname IN ( "
+ /* pg_class.oid is preserved, so 'regclass' is OK */
+ " 'regcollation', "
+ " 'regconfig', "
+ " 'regdictionary', "
+ " 'regnamespace', "
+ " 'regoper', "
+ " 'regoperator', "
+ " 'regproc', "
+ " 'regprocedure' "
+ /* pg_authid.oid is preserved, so 'regrole' is OK */
+ /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */
+ " )",
+ output_path);
+
+ if (found)
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains one of the reg* data types in user tables.\n"
+ "These data types reference system OIDs that are not preserved by\n"
+ "pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_aclitem_data_type_usage
+ *
+ * aclitem changed its storage format in 16, so check for it.
+ */
+static void
+check_for_aclitem_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"%s\" data type in user tables",
+ "aclitem");
+
+ snprintf(output_path, sizeof(output_path), "tables_using_aclitem.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.aclitem", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"aclitem\" data type in user tables.\n"
+ "The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+ "so this cluster cannot currently be upgraded. You can drop the\n"
+ "problem columns and restart the upgrade. A list of the problem\n"
+ "columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_removed_data_type_usage
+ *
+ * Check for in-core data types that have been removed. Callers know
+ * the exact list.
+ */
+static void
+check_for_removed_data_type_usage(ClusterInfo *cluster, const char *version,
+ const char *datatype)
+{
+ char output_path[MAXPGPATH];
+ char typename[NAMEDATALEN];
+
+ prep_status("Checking for removed \"%s\" data type in user tables",
+ datatype);
+
+ snprintf(output_path, sizeof(output_path), "tables_using_%s.txt",
+ datatype);
+ snprintf(typename, sizeof(typename), "pg_catalog.%s", datatype);
+
+ if (check_for_data_type_usage(cluster, typename, output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"%s\" data type in user tables.\n"
+ "The \"%s\" type has been removed in PostgreSQL version %s,\n"
+ "so this cluster cannot currently be upgraded. You can drop the\n"
+ "problem columns, or change them to another data type, and restart\n"
+ "the upgrade. A list of the problem columns is in the file:\n"
+ " %s", datatype, datatype, version, output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * check_for_jsonb_9_4_usage()
+ *
+ * JSONB changed its storage format during 9.4 beta, so check for it.
+ */
+static void
+check_for_jsonb_9_4_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"jsonb\" data type");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_jsonb.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.jsonb", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"jsonb\" data type in user tables.\n"
+ "The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * check_for_pg_role_prefix()
+ *
+ * Versions older than 9.6 should not have any pg_* roles
+ */
+static void
+check_for_pg_role_prefix(ClusterInfo *cluster)
+{
+ PGresult *res;
+ PGconn *conn = connectToServer(cluster, "template1");
+ int ntups;
+ int i_roloid;
+ int i_rolname;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for roles starting with \"pg_\"");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "pg_role_prefix.txt");
+
+ res = executeQueryOrDie(conn,
+ "SELECT oid AS roloid, rolname "
+ "FROM pg_catalog.pg_roles "
+ "WHERE rolname ~ '^pg_'");
+
+ ntups = PQntuples(res);
+ i_roloid = PQfnumber(res, "roloid");
+ i_rolname = PQfnumber(res, "rolname");
+ for (int rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ fprintf(script, "%s (oid=%s)\n",
+ PQgetvalue(res, rowno, i_rolname),
+ PQgetvalue(res, rowno, i_roloid));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains roles starting with \"pg_\".\n"
+ "\"pg_\" is a reserved prefix for system roles. The cluster\n"
+ "cannot be upgraded until these roles are renamed.\n"
+ "A list of roles starting with \"pg_\" is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * Verify that no user-defined encoding conversions exist.
+ */
+static void
+check_for_user_defined_encoding_conversions(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for user-defined encoding conversions");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "encoding_conversions.txt");
+
+ /* Find any user defined encoding conversions */
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_conoid,
+ i_conname,
+ i_nspname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /*
+ * The query below hardcodes FirstNormalObjectId as 16384 rather than
+ * interpolating that C #define into the query because, if that
+ * #define is ever changed, the cutoff we want to use is the value
+ * used by pre-version 14 servers, not that of some future version.
+ */
+ res = executeQueryOrDie(conn,
+ "SELECT c.oid as conoid, c.conname, n.nspname "
+ "FROM pg_catalog.pg_conversion c, "
+ " pg_catalog.pg_namespace n "
+ "WHERE c.connamespace = n.oid AND "
+ " c.oid >= 16384");
+ ntups = PQntuples(res);
+ i_conoid = PQfnumber(res, "conoid");
+ i_conname = PQfnumber(res, "conname");
+ i_nspname = PQfnumber(res, "nspname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL &&
+ (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " (oid=%s) %s.%s\n",
+ PQgetvalue(res, rowno, i_conoid),
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_conname));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains user-defined encoding conversions.\n"
+ "The conversion function parameters changed in PostgreSQL version 14\n"
+ "so this cluster cannot currently be upgraded. You can remove the\n"
+ "encoding conversions in the old cluster and restart the upgrade.\n"
+ "A list of user-defined encoding conversions is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c
new file mode 100644
index 0000000..9071a6f
--- /dev/null
+++ b/src/bin/pg_upgrade/controldata.c
@@ -0,0 +1,733 @@
+/*
+ * controldata.c
+ *
+ * controldata functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/controldata.c
+ */
+
+#include "postgres_fe.h"
+
+#include <ctype.h>
+
+#include "pg_upgrade.h"
+#include "common/string.h"
+
+
+/*
+ * get_control_data()
+ *
+ * gets pg_control information in "ctrl". Assumes that bindir and
+ * datadir are valid absolute paths to postgresql bin and pgdata
+ * directories respectively *and* pg_resetwal is version compatible
+ * with datadir. The main purpose of this function is to get pg_control
+ * data in a version independent manner.
+ *
+ * The approach taken here is to invoke pg_resetwal with -n option
+ * and then pipe its output. With little string parsing we get the
+ * pg_control data. pg_resetwal cannot be run while the server is running
+ * so we use pg_controldata; pg_controldata doesn't provide all the fields
+ * we need to actually perform the upgrade, but it provides enough for
+ * check mode. We do not implement pg_resetwal -n because it is hard to
+ * return valid xid data for a running server.
+ */
+void
+get_control_data(ClusterInfo *cluster, bool live_check)
+{
+ char cmd[MAXPGPATH];
+ char bufin[MAX_STRING];
+ FILE *output;
+ char *p;
+ bool got_tli = false;
+ bool got_log_id = false;
+ bool got_log_seg = false;
+ bool got_xid = false;
+ bool got_oid = false;
+ bool got_multi = false;
+ bool got_oldestmulti = false;
+ bool got_oldestxid = false;
+ bool got_mxoff = false;
+ bool got_nextxlogfile = false;
+ bool got_float8_pass_by_value = false;
+ bool got_align = false;
+ bool got_blocksz = false;
+ bool got_largesz = false;
+ bool got_walsz = false;
+ bool got_walseg = false;
+ bool got_ident = false;
+ bool got_index = false;
+ bool got_toast = false;
+ bool got_large_object = false;
+ bool got_date_is_int = false;
+ bool got_data_checksum_version = false;
+ bool got_cluster_state = false;
+ char *lc_collate = NULL;
+ char *lc_ctype = NULL;
+ char *lc_monetary = NULL;
+ char *lc_numeric = NULL;
+ char *lc_time = NULL;
+ char *lang = NULL;
+ char *language = NULL;
+ char *lc_all = NULL;
+ char *lc_messages = NULL;
+ uint32 tli = 0;
+ uint32 logid = 0;
+ uint32 segno = 0;
+ char *resetwal_bin;
+ int rc;
+
+ /*
+ * Because we test the pg_resetwal output as strings, it has to be in
+ * English. Copied from pg_regress.c.
+ */
+ if (getenv("LC_COLLATE"))
+ lc_collate = pg_strdup(getenv("LC_COLLATE"));
+ if (getenv("LC_CTYPE"))
+ lc_ctype = pg_strdup(getenv("LC_CTYPE"));
+ if (getenv("LC_MONETARY"))
+ lc_monetary = pg_strdup(getenv("LC_MONETARY"));
+ if (getenv("LC_NUMERIC"))
+ lc_numeric = pg_strdup(getenv("LC_NUMERIC"));
+ if (getenv("LC_TIME"))
+ lc_time = pg_strdup(getenv("LC_TIME"));
+ if (getenv("LANG"))
+ lang = pg_strdup(getenv("LANG"));
+ if (getenv("LANGUAGE"))
+ language = pg_strdup(getenv("LANGUAGE"));
+ if (getenv("LC_ALL"))
+ lc_all = pg_strdup(getenv("LC_ALL"));
+ if (getenv("LC_MESSAGES"))
+ lc_messages = pg_strdup(getenv("LC_MESSAGES"));
+
+ unsetenv("LC_COLLATE");
+ unsetenv("LC_CTYPE");
+ unsetenv("LC_MONETARY");
+ unsetenv("LC_NUMERIC");
+ unsetenv("LC_TIME");
+#ifndef WIN32
+ unsetenv("LANG");
+#else
+ /* On Windows the default locale may not be English, so force it */
+ setenv("LANG", "en", 1);
+#endif
+ unsetenv("LANGUAGE");
+ unsetenv("LC_ALL");
+ setenv("LC_MESSAGES", "C", 1);
+
+ /*
+ * Check for clean shutdown
+ */
+ if (!live_check || cluster == &new_cluster)
+ {
+ /* only pg_controldata outputs the cluster state */
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_controldata\" \"%s\"",
+ cluster->bindir, cluster->pgdata);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, strerror(errno));
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ if ((p = strstr(bufin, "Database cluster state:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: database cluster state problem", __LINE__);
+
+ p++; /* remove ':' char */
+
+ /*
+ * We checked earlier for a postmaster lock file, and if we
+ * found one, we tried to start/stop the server to replay the
+ * WAL. However, pg_ctl -m immediate doesn't leave a lock
+ * file, but does require WAL replay, so we check here that
+ * the server was shut down cleanly, from the controldata
+ * perspective.
+ */
+ /* remove leading spaces */
+ while (*p == ' ')
+ p++;
+ if (strcmp(p, "shut down in recovery\n") == 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.");
+ else
+ pg_fatal("The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.");
+ }
+ else if (strcmp(p, "shut down\n") != 0)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster was not shut down cleanly.");
+ else
+ pg_fatal("The target cluster was not shut down cleanly.");
+ }
+ got_cluster_state = true;
+ }
+ }
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ if (!got_cluster_state)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("The source cluster lacks cluster state information:");
+ else
+ pg_fatal("The target cluster lacks cluster state information:");
+ }
+ }
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ resetwal_bin = "pg_resetxlog\" -n";
+ else
+ resetwal_bin = "pg_resetwal\" -n";
+ snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
+ cluster->bindir,
+ live_check ? "pg_controldata\"" : resetwal_bin,
+ cluster->pgdata);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, strerror(errno));
+
+ /* Only in <= 9.2 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ cluster->controldata.data_checksum_version = 0;
+ got_data_checksum_version = true;
+ }
+
+ /* we have the result of cmd in "output". so parse it line by line now */
+ while (fgets(bufin, sizeof(bufin), output))
+ {
+ /* In verbose mode, log each line */
+ pg_strip_crlf(bufin);
+ pg_log(PG_VERBOSE, "%s", bufin);
+
+ if ((p = strstr(bufin, "pg_control version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: pg_resetwal problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ctrl_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Catalog version number:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.cat_ver = str2uint(p);
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's TimeLineID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ tli = str2uint(p);
+ got_tli = true;
+ }
+ else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ logid = str2uint(p);
+ got_log_id = true;
+ }
+ else if ((p = strstr(bufin, "First log file segment after reset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ segno = str2uint(p);
+ got_log_seg = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtepoch = str2uint(p);
+
+ /*
+ * Delimiter changed from '/' to ':' in 9.6. We don't test for
+ * the catalog version of the change because the catalog version
+ * is pulled from pg_controldata too, and it isn't worth adding an
+ * order dependency for this --- we just check the string.
+ */
+ if (strchr(p, '/') != NULL)
+ p = strchr(p, '/');
+ else if (GET_MAJOR_VERSION(cluster->major_version) >= 906)
+ p = strchr(p, ':');
+ else
+ p = NULL;
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove '/' or ':' char */
+ cluster->controldata.chkpnt_nxtxid = str2uint(p);
+ got_xid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtoid = str2uint(p);
+ got_oid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiXactId:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmulti = str2uint(p);
+ got_multi = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestXID:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstxid = str2uint(p);
+ got_oldestxid = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's oldestMultiXid:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_oldstMulti = str2uint(p);
+ got_oldestmulti = true;
+ }
+ else if ((p = strstr(bufin, "Latest checkpoint's NextMultiOffset:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.chkpnt_nxtmxoff = str2uint(p);
+ got_mxoff = true;
+ }
+ else if ((p = strstr(bufin, "First log segment after reset:")) != NULL)
+ {
+ /* Skip the colon and any whitespace after it */
+ p = strchr(p, ':');
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+ p = strpbrk(p, "01234567890ABCDEF");
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ /* Make sure it looks like a valid WAL file name */
+ if (strspn(p, "0123456789ABCDEF") != 24)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ strlcpy(cluster->controldata.nextxlogfile, p, 25);
+ got_nextxlogfile = true;
+ }
+ else if ((p = strstr(bufin, "Float8 argument passing:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ /* used later for contrib check */
+ cluster->controldata.float8_pass_by_value = strstr(p, "by value") != NULL;
+ got_float8_pass_by_value = true;
+ }
+ else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.align = str2uint(p);
+ got_align = true;
+ }
+ else if ((p = strstr(bufin, "Database block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.blocksz = str2uint(p);
+ got_blocksz = true;
+ }
+ else if ((p = strstr(bufin, "Blocks per segment of large relation:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.largesz = str2uint(p);
+ got_largesz = true;
+ }
+ else if ((p = strstr(bufin, "WAL block size:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walsz = str2uint(p);
+ got_walsz = true;
+ }
+ else if ((p = strstr(bufin, "Bytes per WAL segment:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.walseg = str2uint(p);
+ got_walseg = true;
+ }
+ else if ((p = strstr(bufin, "Maximum length of identifiers:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.ident = str2uint(p);
+ got_ident = true;
+ }
+ else if ((p = strstr(bufin, "Maximum columns in an index:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.index = str2uint(p);
+ got_index = true;
+ }
+ else if ((p = strstr(bufin, "Maximum size of a TOAST chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.toast = str2uint(p);
+ got_toast = true;
+ }
+ else if ((p = strstr(bufin, "Size of a large-object chunk:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.large_object = str2uint(p);
+ got_large_object = true;
+ }
+ else if ((p = strstr(bufin, "Date/time type storage:")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.date_is_int = strstr(p, "64-bit integers") != NULL;
+ got_date_is_int = true;
+ }
+ else if ((p = strstr(bufin, "checksum")) != NULL)
+ {
+ p = strchr(p, ':');
+
+ if (p == NULL || strlen(p) <= 1)
+ pg_fatal("%d: controldata retrieval problem", __LINE__);
+
+ p++; /* remove ':' char */
+ cluster->controldata.data_checksum_version = str2uint(p);
+ got_data_checksum_version = true;
+ }
+ }
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get control data using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ /*
+ * Restore environment variables. Note all but LANG and LC_MESSAGES were
+ * unset above.
+ */
+ if (lc_collate)
+ setenv("LC_COLLATE", lc_collate, 1);
+ if (lc_ctype)
+ setenv("LC_CTYPE", lc_ctype, 1);
+ if (lc_monetary)
+ setenv("LC_MONETARY", lc_monetary, 1);
+ if (lc_numeric)
+ setenv("LC_NUMERIC", lc_numeric, 1);
+ if (lc_time)
+ setenv("LC_TIME", lc_time, 1);
+ if (lang)
+ setenv("LANG", lang, 1);
+ else
+ unsetenv("LANG");
+ if (language)
+ setenv("LANGUAGE", language, 1);
+ if (lc_all)
+ setenv("LC_ALL", lc_all, 1);
+ if (lc_messages)
+ setenv("LC_MESSAGES", lc_messages, 1);
+ else
+ unsetenv("LC_MESSAGES");
+
+ pg_free(lc_collate);
+ pg_free(lc_ctype);
+ pg_free(lc_monetary);
+ pg_free(lc_numeric);
+ pg_free(lc_time);
+ pg_free(lang);
+ pg_free(language);
+ pg_free(lc_all);
+ pg_free(lc_messages);
+
+ /*
+ * Before 9.3, pg_resetwal reported the xlogid and segno of the first log
+ * file after reset as separate lines. Starting with 9.3, it reports the
+ * WAL file name. If the old cluster is older than 9.3, we construct the
+ * WAL file name from the xlogid and segno.
+ */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 902)
+ {
+ if (got_tli && got_log_id && got_log_seg)
+ {
+ snprintf(cluster->controldata.nextxlogfile, 25, "%08X%08X%08X",
+ tli, logid, segno);
+ got_nextxlogfile = true;
+ }
+ }
+
+ /* verify that we got all the mandatory pg_control data */
+ if (!got_xid || !got_oid ||
+ !got_multi || !got_oldestxid ||
+ (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER) ||
+ !got_mxoff || (!live_check && !got_nextxlogfile) ||
+ !got_float8_pass_by_value || !got_align || !got_blocksz ||
+ !got_largesz || !got_walsz || !got_walseg || !got_ident ||
+ !got_index || !got_toast ||
+ (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER) ||
+ !got_date_is_int || !got_data_checksum_version)
+ {
+ if (cluster == &old_cluster)
+ pg_log(PG_REPORT,
+ "The source cluster lacks some required control information:");
+ else
+ pg_log(PG_REPORT,
+ "The target cluster lacks some required control information:");
+
+ if (!got_xid)
+ pg_log(PG_REPORT, " checkpoint next XID");
+
+ if (!got_oid)
+ pg_log(PG_REPORT, " latest checkpoint next OID");
+
+ if (!got_multi)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactId");
+
+ if (!got_oldestmulti &&
+ cluster->controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ pg_log(PG_REPORT, " latest checkpoint oldest MultiXactId");
+
+ if (!got_oldestxid)
+ pg_log(PG_REPORT, " latest checkpoint oldestXID");
+
+ if (!got_mxoff)
+ pg_log(PG_REPORT, " latest checkpoint next MultiXactOffset");
+
+ if (!live_check && !got_nextxlogfile)
+ pg_log(PG_REPORT, " first WAL segment after reset");
+
+ if (!got_float8_pass_by_value)
+ pg_log(PG_REPORT, " float8 argument passing method");
+
+ if (!got_align)
+ pg_log(PG_REPORT, " maximum alignment");
+
+ if (!got_blocksz)
+ pg_log(PG_REPORT, " block size");
+
+ if (!got_largesz)
+ pg_log(PG_REPORT, " large relation segment size");
+
+ if (!got_walsz)
+ pg_log(PG_REPORT, " WAL block size");
+
+ if (!got_walseg)
+ pg_log(PG_REPORT, " WAL segment size");
+
+ if (!got_ident)
+ pg_log(PG_REPORT, " maximum identifier length");
+
+ if (!got_index)
+ pg_log(PG_REPORT, " maximum number of indexed columns");
+
+ if (!got_toast)
+ pg_log(PG_REPORT, " maximum TOAST chunk size");
+
+ if (!got_large_object &&
+ cluster->controldata.ctrl_ver >= LARGE_OBJECT_SIZE_PG_CONTROL_VER)
+ pg_log(PG_REPORT, " large-object chunk size");
+
+ if (!got_date_is_int)
+ pg_log(PG_REPORT, " dates/times are integers?");
+
+ /* value added in Postgres 9.3 */
+ if (!got_data_checksum_version)
+ pg_log(PG_REPORT, " data checksum version");
+
+ pg_fatal("Cannot continue without required control information, terminating");
+ }
+}
+
+
+/*
+ * check_control_data()
+ *
+ * check to make sure the control data settings are compatible
+ */
+void
+check_control_data(ControlData *oldctrl,
+ ControlData *newctrl)
+{
+ if (oldctrl->align == 0 || oldctrl->align != newctrl->align)
+ pg_fatal("old and new pg_controldata alignments are invalid or do not match.\n"
+ "Likely one cluster is a 32-bit install, the other 64-bit");
+
+ if (oldctrl->blocksz == 0 || oldctrl->blocksz != newctrl->blocksz)
+ pg_fatal("old and new pg_controldata block sizes are invalid or do not match");
+
+ if (oldctrl->largesz == 0 || oldctrl->largesz != newctrl->largesz)
+ pg_fatal("old and new pg_controldata maximum relation segment sizes are invalid or do not match");
+
+ if (oldctrl->walsz == 0 || oldctrl->walsz != newctrl->walsz)
+ pg_fatal("old and new pg_controldata WAL block sizes are invalid or do not match");
+
+ if (oldctrl->walseg == 0 || oldctrl->walseg != newctrl->walseg)
+ pg_fatal("old and new pg_controldata WAL segment sizes are invalid or do not match");
+
+ if (oldctrl->ident == 0 || oldctrl->ident != newctrl->ident)
+ pg_fatal("old and new pg_controldata maximum identifier lengths are invalid or do not match");
+
+ if (oldctrl->index == 0 || oldctrl->index != newctrl->index)
+ pg_fatal("old and new pg_controldata maximum indexed columns are invalid or do not match");
+
+ if (oldctrl->toast == 0 || oldctrl->toast != newctrl->toast)
+ pg_fatal("old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match");
+
+ /* large_object added in 9.5, so it might not exist in the old cluster */
+ if (oldctrl->large_object != 0 &&
+ oldctrl->large_object != newctrl->large_object)
+ pg_fatal("old and new pg_controldata large-object chunk sizes are invalid or do not match");
+
+ if (oldctrl->date_is_int != newctrl->date_is_int)
+ pg_fatal("old and new pg_controldata date/time storage types do not match");
+
+ /*
+ * float8_pass_by_value does not need to match, but is used in
+ * check_for_isn_and_int8_passing_mismatch().
+ */
+
+ /*
+ * We might eventually allow upgrades from checksum to no-checksum
+ * clusters.
+ */
+ if (oldctrl->data_checksum_version == 0 &&
+ newctrl->data_checksum_version != 0)
+ pg_fatal("old cluster does not use data checksums but the new one does");
+ else if (oldctrl->data_checksum_version != 0 &&
+ newctrl->data_checksum_version == 0)
+ pg_fatal("old cluster uses data checksums but the new one does not");
+ else if (oldctrl->data_checksum_version != newctrl->data_checksum_version)
+ pg_fatal("old and new cluster pg_controldata checksum versions do not match");
+}
+
+
+void
+disable_old_cluster(void)
+{
+ char old_path[MAXPGPATH],
+ new_path[MAXPGPATH];
+
+ /* rename pg_control so old server cannot be accidentally started */
+ prep_status("Adding \".old\" suffix to old global/pg_control");
+
+ snprintf(old_path, sizeof(old_path), "%s/global/pg_control", old_cluster.pgdata);
+ snprintf(new_path, sizeof(new_path), "%s/global/pg_control.old", old_cluster.pgdata);
+ if (pg_mv_file(old_path, new_path) != 0)
+ pg_fatal("could not rename file \"%s\" to \"%s\": %m",
+ old_path, new_path);
+ check_ok();
+
+ pg_log(PG_REPORT, "\n"
+ "If you want to start the old cluster, you will need to remove\n"
+ "the \".old\" suffix from %s/global/pg_control.old.\n"
+ "Because \"link\" mode was used, the old cluster cannot be safely\n"
+ "started once the new cluster has been started.",
+ old_cluster.pgdata);
+}
diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c
new file mode 100644
index 0000000..6c8c82d
--- /dev/null
+++ b/src/bin/pg_upgrade/dump.c
@@ -0,0 +1,71 @@
+/*
+ * dump.c
+ *
+ * dump functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/dump.c
+ */
+
+#include "postgres_fe.h"
+
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+void
+generate_old_dump(void)
+{
+ int dbnum;
+
+ prep_status("Creating dump of global objects");
+
+ /* run new pg_dumpall binary for globals */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_dumpall\" %s --globals-only --quote-all-identifiers "
+ "--binary-upgrade %s -f \"%s/%s\"",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ log_opts.dumpdir,
+ GLOBALS_DUMP_FILE);
+ check_ok();
+
+ prep_status_progress("Creating dump of database schemas");
+
+ /* create per-db dump files */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ PQExpBufferData connstr,
+ escaped_connstr;
+
+ initPQExpBuffer(&connstr);
+ appendPQExpBufferStr(&connstr, "dbname=");
+ appendConnStrVal(&connstr, old_db->db_name);
+ initPQExpBuffer(&escaped_connstr);
+ appendShellString(&escaped_connstr, connstr.data);
+ termPQExpBuffer(&connstr);
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ parallel_exec_prog(log_file_name, NULL,
+ "\"%s/pg_dump\" %s --schema-only --quote-all-identifiers "
+ "--binary-upgrade --format=custom %s --file=\"%s/%s\" %s",
+ new_cluster.bindir, cluster_conn_opts(&old_cluster),
+ log_opts.verbose ? "--verbose" : "",
+ log_opts.dumpdir,
+ sql_file_name, escaped_connstr.data);
+
+ termPQExpBuffer(&escaped_connstr);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c
new file mode 100644
index 0000000..5b2edeb
--- /dev/null
+++ b/src/bin/pg_upgrade/exec.c
@@ -0,0 +1,459 @@
+/*
+ * exec.c
+ *
+ * execution functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/exec.c
+ */
+
+#include "postgres_fe.h"
+
+#include <fcntl.h>
+
+#include "common/string.h"
+#include "pg_upgrade.h"
+
+static void check_data_dir(ClusterInfo *cluster);
+static void check_bin_dir(ClusterInfo *cluster, bool check_versions);
+static void get_bin_version(ClusterInfo *cluster);
+static void check_exec(const char *dir, const char *program, bool check_version);
+
+#ifdef WIN32
+static int win32_check_directory_write_permissions(void);
+#endif
+
+
+/*
+ * get_bin_version
+ *
+ * Fetch major version of binaries for cluster.
+ */
+static void
+get_bin_version(ClusterInfo *cluster)
+{
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *output;
+ int rc;
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get pg_ctl version data using %s: %s",
+ cmd, strerror(errno));
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get pg_ctl version data using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ if (sscanf(cmd_output, "%*s %*s %d.%d", &v1, &v2) < 1)
+ pg_fatal("could not get pg_ctl version output from %s", cmd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ cluster->bin_version = v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ cluster->bin_version = v1 * 10000;
+ }
+}
+
+
+/*
+ * exec_prog()
+ * Execute an external program with stdout/stderr redirected, and report
+ * errors
+ *
+ * Formats a command from the given argument list, logs it to the log file,
+ * and attempts to execute that command. If the command executes
+ * successfully, exec_prog() returns true.
+ *
+ * If the command fails, an error message is optionally written to the specified
+ * log_file, and the program optionally exits.
+ *
+ * The code requires it be called first from the primary thread on Windows.
+ */
+bool
+exec_prog(const char *log_filename, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...)
+{
+ int result = 0;
+ int written;
+ char log_file[MAXPGPATH];
+
+#define MAXCMDLEN (2 * MAXPGPATH)
+ char cmd[MAXCMDLEN];
+ FILE *log;
+ va_list ap;
+
+#ifdef WIN32
+ static DWORD mainThreadId = 0;
+
+ /* We assume we are called from the primary thread first */
+ if (mainThreadId == 0)
+ mainThreadId = GetCurrentThreadId();
+#endif
+
+ snprintf(log_file, MAXPGPATH, "%s/%s", log_opts.logdir, log_filename);
+
+ written = 0;
+ va_start(ap, fmt);
+ written += vsnprintf(cmd + written, MAXCMDLEN - written, fmt, ap);
+ va_end(ap);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long");
+ written += snprintf(cmd + written, MAXCMDLEN - written,
+ " >> \"%s\" 2>&1", log_file);
+ if (written >= MAXCMDLEN)
+ pg_fatal("command too long");
+
+ pg_log(PG_VERBOSE, "%s", cmd);
+
+#ifdef WIN32
+
+ /*
+ * For some reason, Windows issues a file-in-use error if we write data to
+ * the log file from a non-primary thread just before we create a
+ * subprocess that also writes to the same log file. One fix is to sleep
+ * for 100ms. A cleaner fix is to write to the log file _after_ the
+ * subprocess has completed, so we do this only when writing from a
+ * non-primary thread. fflush(), running system() twice, and pre-creating
+ * the file do not see to help.
+ */
+ if (mainThreadId != GetCurrentThreadId())
+ {
+ fflush(NULL);
+ result = system(cmd);
+ }
+#endif
+
+ log = fopen(log_file, "a");
+
+#ifdef WIN32
+ {
+ /*
+ * "pg_ctl -w stop" might have reported that the server has stopped
+ * because the postmaster.pid file has been removed, but "pg_ctl -w
+ * start" might still be in the process of closing and might still be
+ * holding its stdout and -l log file descriptors open. Therefore,
+ * try to open the log file a few more times.
+ */
+ int iter;
+
+ for (iter = 0; iter < 4 && log == NULL; iter++)
+ {
+ pg_usleep(1000000); /* 1 sec */
+ log = fopen(log_file, "a");
+ }
+ }
+#endif
+
+ if (log == NULL)
+ pg_fatal("could not open log file \"%s\": %m", log_file);
+
+#ifdef WIN32
+ /* Are we printing "command:" before its output? */
+ if (mainThreadId == GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+ fprintf(log, "command: %s\n", cmd);
+#ifdef WIN32
+ /* Are we printing "command:" after its output? */
+ if (mainThreadId != GetCurrentThreadId())
+ fprintf(log, "\n\n");
+#endif
+
+ /*
+ * In Windows, we must close the log file at this point so the file is not
+ * open while the command is running, or we get a share violation.
+ */
+ fclose(log);
+
+#ifdef WIN32
+ /* see comment above */
+ if (mainThreadId == GetCurrentThreadId())
+#endif
+ {
+ fflush(NULL);
+ result = system(cmd);
+ }
+
+ if (result != 0 && report_error)
+ {
+ /* we might be in on a progress status line, so go to the next line */
+ report_status(PG_REPORT, "\n*failure*");
+ fflush(stdout);
+
+ pg_log(PG_VERBOSE, "There were problems executing \"%s\"", cmd);
+ if (opt_log_file)
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" or \"%s\" for\n"
+ "the probable cause of the failure.",
+ log_file, opt_log_file);
+ else
+ pg_log(exit_on_error ? PG_FATAL : PG_REPORT,
+ "Consult the last few lines of \"%s\" for\n"
+ "the probable cause of the failure.",
+ log_file);
+ }
+
+#ifndef WIN32
+
+ /*
+ * We can't do this on Windows because it will keep the "pg_ctl start"
+ * output filename open until the server stops, so we do the \n\n above on
+ * that platform. We use a unique filename for "pg_ctl start" that is
+ * never reused while the server is running, so it works fine. We could
+ * log these commands to a third file, but that just adds complexity.
+ */
+ if ((log = fopen(log_file, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m", log_file);
+ fprintf(log, "\n\n");
+ fclose(log);
+#endif
+
+ return result == 0;
+}
+
+
+/*
+ * pid_lock_file_exists()
+ *
+ * Checks whether the postmaster.pid file exists.
+ */
+bool
+pid_lock_file_exists(const char *datadir)
+{
+ char path[MAXPGPATH];
+ int fd;
+
+ snprintf(path, sizeof(path), "%s/postmaster.pid", datadir);
+
+ if ((fd = open(path, O_RDONLY, 0)) < 0)
+ {
+ /* ENOTDIR means we will throw a more useful error later */
+ if (errno != ENOENT && errno != ENOTDIR)
+ pg_fatal("could not open file \"%s\" for reading: %s",
+ path, strerror(errno));
+
+ return false;
+ }
+
+ close(fd);
+ return true;
+}
+
+
+/*
+ * verify_directories()
+ *
+ * does all the hectic work of verifying directories and executables
+ * of old and new server.
+ *
+ * NOTE: May update the values of all parameters
+ */
+void
+verify_directories(void)
+{
+#ifndef WIN32
+ if (access(".", R_OK | W_OK | X_OK) != 0)
+#else
+ if (win32_check_directory_write_permissions() != 0)
+#endif
+ pg_fatal("You must have read and write access in the current directory.");
+
+ check_bin_dir(&old_cluster, false);
+ check_data_dir(&old_cluster);
+ check_bin_dir(&new_cluster, true);
+ check_data_dir(&new_cluster);
+}
+
+
+#ifdef WIN32
+/*
+ * win32_check_directory_write_permissions()
+ *
+ * access() on WIN32 can't check directory permissions, so we have to
+ * optionally create, then delete a file to check.
+ * http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx
+ */
+static int
+win32_check_directory_write_permissions(void)
+{
+ int fd;
+
+ /*
+ * We open a file we would normally create anyway. We do this even in
+ * 'check' mode, which isn't ideal, but this is the best we can do.
+ */
+ if ((fd = open(GLOBALS_DUMP_FILE, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0)
+ return -1;
+ close(fd);
+
+ return unlink(GLOBALS_DUMP_FILE);
+}
+#endif
+
+
+/*
+ * check_single_dir()
+ *
+ * Check for the presence of a single directory in PGDATA, and fail if
+ * is it missing or not accessible.
+ */
+static void
+check_single_dir(const char *pg_data, const char *subdir)
+{
+ struct stat statBuf;
+ char subDirName[MAXPGPATH];
+
+ snprintf(subDirName, sizeof(subDirName), "%s%s%s", pg_data,
+ /* Win32 can't stat() a directory with a trailing slash. */
+ *subdir ? "/" : "",
+ subdir);
+
+ if (stat(subDirName, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s",
+ subDirName, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory",
+ subDirName);
+}
+
+
+/*
+ * check_data_dir()
+ *
+ * This function validates the given cluster directory - we search for a
+ * small set of subdirectories that we expect to find in a valid $PGDATA
+ * directory. If any of the subdirectories are missing (or secured against
+ * us) we display an error message and exit()
+ *
+ */
+static void
+check_data_dir(ClusterInfo *cluster)
+{
+ const char *pg_data = cluster->pgdata;
+
+ /* get the cluster version */
+ cluster->major_version = get_major_server_version(cluster);
+
+ check_single_dir(pg_data, "");
+ check_single_dir(pg_data, "base");
+ check_single_dir(pg_data, "global");
+ check_single_dir(pg_data, "pg_multixact");
+ check_single_dir(pg_data, "pg_subtrans");
+ check_single_dir(pg_data, "pg_tblspc");
+ check_single_dir(pg_data, "pg_twophase");
+
+ /* pg_xlog has been renamed to pg_wal in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_xlog");
+ else
+ check_single_dir(pg_data, "pg_wal");
+
+ /* pg_clog has been renamed to pg_xact in v10 */
+ if (GET_MAJOR_VERSION(cluster->major_version) <= 906)
+ check_single_dir(pg_data, "pg_clog");
+ else
+ check_single_dir(pg_data, "pg_xact");
+}
+
+
+/*
+ * check_bin_dir()
+ *
+ * This function searches for the executables that we expect to find
+ * in the binaries directory. If we find that a required executable
+ * is missing (or secured against us), we display an error message and
+ * exit().
+ *
+ * If check_versions is true, then the versions of the binaries are checked
+ * against the version of this pg_upgrade. This is for checking the target
+ * bindir.
+ */
+static void
+check_bin_dir(ClusterInfo *cluster, bool check_versions)
+{
+ struct stat statBuf;
+
+ /* check bindir */
+ if (stat(cluster->bindir, &statBuf) != 0)
+ report_status(PG_FATAL, "check for \"%s\" failed: %s",
+ cluster->bindir, strerror(errno));
+ else if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL, "\"%s\" is not a directory",
+ cluster->bindir);
+
+ check_exec(cluster->bindir, "postgres", check_versions);
+ check_exec(cluster->bindir, "pg_controldata", check_versions);
+ check_exec(cluster->bindir, "pg_ctl", check_versions);
+
+ /*
+ * Fetch the binary version after checking for the existence of pg_ctl.
+ * This way we report a useful error if the pg_ctl binary used for version
+ * fetching is missing/broken.
+ */
+ get_bin_version(cluster);
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) <= 906)
+ check_exec(cluster->bindir, "pg_resetxlog", check_versions);
+ else
+ check_exec(cluster->bindir, "pg_resetwal", check_versions);
+
+ if (cluster == &new_cluster)
+ {
+ /*
+ * These binaries are only needed for the target version. pg_dump and
+ * pg_dumpall are used to dump the old cluster, but must be of the
+ * target version.
+ */
+ check_exec(cluster->bindir, "initdb", check_versions);
+ check_exec(cluster->bindir, "pg_dump", check_versions);
+ check_exec(cluster->bindir, "pg_dumpall", check_versions);
+ check_exec(cluster->bindir, "pg_restore", check_versions);
+ check_exec(cluster->bindir, "psql", check_versions);
+ check_exec(cluster->bindir, "vacuumdb", check_versions);
+ }
+}
+
+static void
+check_exec(const char *dir, const char *program, bool check_version)
+{
+ char path[MAXPGPATH];
+ char line[MAXPGPATH];
+ char cmd[MAXPGPATH];
+ char versionstr[128];
+
+ snprintf(path, sizeof(path), "%s/%s", dir, program);
+
+ if (validate_exec(path) != 0)
+ pg_fatal("check for \"%s\" failed: %m", path);
+
+ snprintf(cmd, sizeof(cmd), "\"%s\" -V", path);
+
+ if (!pipe_read_line(cmd, line, sizeof(line)))
+ pg_fatal("check for \"%s\" failed: cannot execute",
+ path);
+
+ if (check_version)
+ {
+ pg_strip_crlf(line);
+
+ snprintf(versionstr, sizeof(versionstr), "%s (PostgreSQL) " PG_VERSION, program);
+
+ if (strcmp(line, versionstr) != 0)
+ pg_fatal("check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"",
+ path, line, versionstr);
+ }
+}
diff --git a/src/bin/pg_upgrade/file.c b/src/bin/pg_upgrade/file.c
new file mode 100644
index 0000000..d173602
--- /dev/null
+++ b/src/bin/pg_upgrade/file.c
@@ -0,0 +1,377 @@
+/*
+ * file.c
+ *
+ * file system operations
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/file.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_COPYFILE_H
+#include <copyfile.h>
+#endif
+#ifdef __linux__
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#endif
+
+#include "access/visibilitymapdefs.h"
+#include "common/file_perm.h"
+#include "pg_upgrade.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+/*
+ * cloneFile()
+ *
+ * Clones/reflinks a relation file from src to dst.
+ *
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(src, dst, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not open file \"%s\": %s",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while cloning relation \"%s.%s\": could not create file \"%s\": %s",
+ schemaName, relName, dst, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ {
+ int save_errno = errno;
+
+ unlink(dst);
+
+ pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(save_errno));
+ }
+
+ close(src_fd);
+ close(dest_fd);
+#endif
+}
+
+
+/*
+ * copyFile()
+ *
+ * Copies a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+#ifndef WIN32
+ int src_fd;
+ int dest_fd;
+ char *buffer;
+
+ if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s",
+ schemaName, relName, src, strerror(errno));
+
+ if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s",
+ schemaName, relName, dst, strerror(errno));
+
+ /* copy in fairly large chunks for best efficiency */
+#define COPY_BUF_SIZE (50 * BLCKSZ)
+
+ buffer = (char *) pg_malloc(COPY_BUF_SIZE);
+
+ /* perform data copying i.e read src source, write to destination */
+ while (true)
+ {
+ ssize_t nbytes = read(src_fd, buffer, COPY_BUF_SIZE);
+
+ if (nbytes < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s",
+ schemaName, relName, src, strerror(errno));
+
+ if (nbytes == 0)
+ break;
+
+ errno = 0;
+ if (write(dest_fd, buffer, nbytes) != nbytes)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s",
+ schemaName, relName, dst, strerror(errno));
+ }
+ }
+
+ pg_free(buffer);
+ close(src_fd);
+ close(dest_fd);
+
+#else /* WIN32 */
+
+ if (CopyFile(src, dst, true) == 0)
+ {
+ _dosmaperr(GetLastError());
+ pg_fatal("error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(errno));
+ }
+
+#endif /* WIN32 */
+}
+
+
+/*
+ * linkFile()
+ *
+ * Hard-links a relation file from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ */
+void
+linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName)
+{
+ if (link(src, dst) < 0)
+ pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ schemaName, relName, src, dst, strerror(errno));
+}
+
+
+/*
+ * rewriteVisibilityMap()
+ *
+ * Transform a visibility map file, copying from src to dst.
+ * schemaName/relName are relation's SQL name (used for error messages only).
+ *
+ * In versions of PostgreSQL prior to catversion 201603011, PostgreSQL's
+ * visibility map included one bit per heap page; it now includes two.
+ * When upgrading a cluster from before that time to a current PostgreSQL
+ * version, we could refuse to copy visibility maps from the old cluster
+ * to the new cluster; the next VACUUM would recreate them, but at the
+ * price of scanning the entire table. So, instead, we rewrite the old
+ * visibility maps in the new format. That way, the all-visible bits
+ * remain set for the pages for which they were set previously. The
+ * all-frozen bits are never set by this conversion; we leave that to VACUUM.
+ */
+void
+rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName)
+{
+ int src_fd;
+ int dst_fd;
+ PGIOAlignedBlock buffer;
+ PGIOAlignedBlock new_vmbuf;
+ ssize_t totalBytesRead = 0;
+ ssize_t src_filesize;
+ int rewriteVmBytesPerPage;
+ BlockNumber new_blkno = 0;
+ struct stat statbuf;
+
+ /* Compute number of old-format bytes per new page */
+ rewriteVmBytesPerPage = (BLCKSZ - SizeOfPageHeaderData) / 2;
+
+ if ((src_fd = open(fromfile, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if (fstat(src_fd, &statbuf) != 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not stat file \"%s\": %s",
+ schemaName, relName, fromfile, strerror(errno));
+
+ if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s",
+ schemaName, relName, tofile, strerror(errno));
+
+ /* Save old file size */
+ src_filesize = statbuf.st_size;
+
+ /*
+ * Turn each visibility map page into 2 pages one by one. Each new page
+ * has the same page header as the old one. If the last section of the
+ * last page is empty, we skip it, mostly to avoid turning one-page
+ * visibility maps for small relations into two pages needlessly.
+ */
+ while (totalBytesRead < src_filesize)
+ {
+ ssize_t bytesRead;
+ char *old_cur;
+ char *old_break;
+ char *old_blkend;
+ PageHeaderData pageheader;
+ bool old_lastblk;
+
+ if ((bytesRead = read(src_fd, buffer.data, BLCKSZ)) != BLCKSZ)
+ {
+ if (bytesRead < 0)
+ pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s",
+ schemaName, relName, fromfile, strerror(errno));
+ else
+ pg_fatal("error while copying relation \"%s.%s\": partial page found in file \"%s\"",
+ schemaName, relName, fromfile);
+ }
+
+ totalBytesRead += BLCKSZ;
+ old_lastblk = (totalBytesRead == src_filesize);
+
+ /* Save the page header data */
+ memcpy(&pageheader, buffer.data, SizeOfPageHeaderData);
+
+ /*
+ * These old_* variables point to old visibility map page. old_cur
+ * points to current position on old page. old_blkend points to end of
+ * old block. old_break is the end+1 position on the old page for the
+ * data that will be transferred to the current new page.
+ */
+ old_cur = buffer.data + SizeOfPageHeaderData;
+ old_blkend = buffer.data + bytesRead;
+ old_break = old_cur + rewriteVmBytesPerPage;
+
+ while (old_break <= old_blkend)
+ {
+ char *new_cur;
+ bool empty = true;
+ bool old_lastpart;
+
+ /* First, copy old page header to new page */
+ memcpy(new_vmbuf.data, &pageheader, SizeOfPageHeaderData);
+
+ /* Rewriting the last part of the last old page? */
+ old_lastpart = old_lastblk && (old_break == old_blkend);
+
+ new_cur = new_vmbuf.data + SizeOfPageHeaderData;
+
+ /* Process old page bytes one by one, and turn it into new page. */
+ while (old_cur < old_break)
+ {
+ uint8 byte = *(uint8 *) old_cur;
+ uint16 new_vmbits = 0;
+ int i;
+
+ /* Generate new format bits while keeping old information */
+ for (i = 0; i < BITS_PER_BYTE; i++)
+ {
+ if (byte & (1 << i))
+ {
+ empty = false;
+ new_vmbits |=
+ VISIBILITYMAP_ALL_VISIBLE << (BITS_PER_HEAPBLOCK * i);
+ }
+ }
+
+ /* Copy new visibility map bytes to new-format page */
+ new_cur[0] = (char) (new_vmbits & 0xFF);
+ new_cur[1] = (char) (new_vmbits >> 8);
+
+ old_cur++;
+ new_cur += BITS_PER_HEAPBLOCK;
+ }
+
+ /* If the last part of the last page is empty, skip writing it */
+ if (old_lastpart && empty)
+ break;
+
+ /* Set new checksum for visibility map page, if enabled */
+ if (new_cluster.controldata.data_checksum_version != 0)
+ ((PageHeader) new_vmbuf.data)->pd_checksum =
+ pg_checksum_page(new_vmbuf.data, new_blkno);
+
+ errno = 0;
+ if (write(dst_fd, new_vmbuf.data, BLCKSZ) != BLCKSZ)
+ {
+ /* if write didn't set errno, assume problem is no disk space */
+ if (errno == 0)
+ errno = ENOSPC;
+ pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s",
+ schemaName, relName, tofile, strerror(errno));
+ }
+
+ /* Advance for next new page */
+ old_break += rewriteVmBytesPerPage;
+ new_blkno++;
+ }
+ }
+
+ /* Clean up */
+ close(dst_fd);
+ close(src_fd);
+}
+
+void
+check_file_clone(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.clonetest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)
+ if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s",
+ strerror(errno));
+#elif defined(__linux__) && defined(FICLONE)
+ {
+ int src_fd;
+ int dest_fd;
+
+ if ((src_fd = open(existing_file, O_RDONLY | PG_BINARY, 0)) < 0)
+ pg_fatal("could not open file \"%s\": %s",
+ existing_file, strerror(errno));
+
+ if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL | PG_BINARY,
+ pg_file_create_mode)) < 0)
+ pg_fatal("could not create file \"%s\": %s",
+ new_link_file, strerror(errno));
+
+ if (ioctl(dest_fd, FICLONE, src_fd) < 0)
+ pg_fatal("could not clone file between old and new data directories: %s",
+ strerror(errno));
+
+ close(src_fd);
+ close(dest_fd);
+ }
+#else
+ pg_fatal("file cloning not supported on this platform");
+#endif
+
+ unlink(new_link_file);
+}
+
+void
+check_hard_link(void)
+{
+ char existing_file[MAXPGPATH];
+ char new_link_file[MAXPGPATH];
+
+ snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata);
+ snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.linktest", new_cluster.pgdata);
+ unlink(new_link_file); /* might fail */
+
+ if (link(existing_file, new_link_file) < 0)
+ pg_fatal("could not create hard link between old and new data directories: %s\n"
+ "In link mode the old and new data directories must be on the same file system.",
+ strerror(errno));
+
+ unlink(new_link_file);
+}
diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c
new file mode 100644
index 0000000..dc8800c
--- /dev/null
+++ b/src/bin/pg_upgrade/function.c
@@ -0,0 +1,194 @@
+/*
+ * function.c
+ *
+ * server-side function support
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/function.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_language_d.h"
+#include "pg_upgrade.h"
+
+/*
+ * qsort comparator for pointers to library names
+ *
+ * We sort first by name length, then alphabetically for names of the
+ * same length, then database array index. This is to ensure that, eg,
+ * "hstore_plpython" sorts after both "hstore" and "plpython"; otherwise
+ * transform modules will probably fail their LOAD tests. (The backend
+ * ought to cope with that consideration, but it doesn't yet, and even
+ * when it does it'll still be a good idea to have a predictable order of
+ * probing here.)
+ */
+static int
+library_name_compare(const void *p1, const void *p2)
+{
+ const char *str1 = ((const LibraryInfo *) p1)->name;
+ const char *str2 = ((const LibraryInfo *) p2)->name;
+ int slen1 = strlen(str1);
+ int slen2 = strlen(str2);
+ int cmp = strcmp(str1, str2);
+
+ if (slen1 != slen2)
+ return slen1 - slen2;
+ if (cmp != 0)
+ return cmp;
+ else
+ return ((const LibraryInfo *) p1)->dbnum -
+ ((const LibraryInfo *) p2)->dbnum;
+}
+
+
+/*
+ * get_loadable_libraries()
+ *
+ * Fetch the names of all old libraries containing C-language functions.
+ * We will later check that they all exist in the new installation.
+ */
+void
+get_loadable_libraries(void)
+{
+ PGresult **ress;
+ int totaltups;
+ int dbnum;
+
+ ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *));
+ totaltups = 0;
+
+ /* Fetch all library names, removing duplicates within each DB */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(&old_cluster, active_db->db_name);
+
+ /*
+ * Fetch all libraries containing non-built-in C functions in this DB.
+ */
+ ress[dbnum] = executeQueryOrDie(conn,
+ "SELECT DISTINCT probin "
+ "FROM pg_catalog.pg_proc "
+ "WHERE prolang = %u AND "
+ "probin IS NOT NULL AND "
+ "oid >= %u;",
+ ClanguageId,
+ FirstNormalObjectId);
+ totaltups += PQntuples(ress[dbnum]);
+
+ PQfinish(conn);
+ }
+
+ os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo));
+ totaltups = 0;
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ PGresult *res = ress[dbnum];
+ int ntups;
+ int rowno;
+
+ ntups = PQntuples(res);
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ char *lib = PQgetvalue(res, rowno, 0);
+
+ os_info.libraries[totaltups].name = pg_strdup(lib);
+ os_info.libraries[totaltups].dbnum = dbnum;
+
+ totaltups++;
+ }
+ PQclear(res);
+ }
+
+ pg_free(ress);
+
+ os_info.num_libraries = totaltups;
+}
+
+
+/*
+ * check_loadable_libraries()
+ *
+ * Check that the new cluster contains all required libraries.
+ * We do this by actually trying to LOAD each one, thereby testing
+ * compatibility as well as presence.
+ */
+void
+check_loadable_libraries(void)
+{
+ PGconn *conn = connectToServer(&new_cluster, "template1");
+ int libnum;
+ int was_load_failure = false;
+ FILE *script = NULL;
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for presence of required libraries");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir, "loadable_libraries.txt");
+
+ /*
+ * Now we want to sort the library names into order. This avoids multiple
+ * probes of the same library, and ensures that libraries are probed in a
+ * consistent order, which is important for reproducible behavior if one
+ * library depends on another.
+ */
+ qsort(os_info.libraries, os_info.num_libraries,
+ sizeof(LibraryInfo), library_name_compare);
+
+ for (libnum = 0; libnum < os_info.num_libraries; libnum++)
+ {
+ char *lib = os_info.libraries[libnum].name;
+ int llen = strlen(lib);
+ char cmd[7 + 2 * MAXPGPATH + 1];
+ PGresult *res;
+
+ /* Did the library name change? Probe it. */
+ if (libnum == 0 || strcmp(lib, os_info.libraries[libnum - 1].name) != 0)
+ {
+ strcpy(cmd, "LOAD '");
+ PQescapeStringConn(conn, cmd + strlen(cmd), lib, llen, NULL);
+ strcat(cmd, "'");
+
+ res = PQexec(conn, cmd);
+
+ if (PQresultStatus(res) != PGRES_COMMAND_OK)
+ {
+ was_load_failure = true;
+
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s",
+ output_path, strerror(errno));
+ fprintf(script, _("could not load library \"%s\": %s"),
+ lib,
+ PQerrorMessage(conn));
+ }
+ else
+ was_load_failure = false;
+
+ PQclear(res);
+ }
+
+ if (was_load_failure)
+ fprintf(script, _("In database: %s\n"),
+ old_cluster.dbarr.dbs[os_info.libraries[libnum].dbnum].db_name);
+ }
+
+ PQfinish(conn);
+
+ if (script)
+ {
+ fclose(script);
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation references loadable libraries that are missing from the\n"
+ "new installation. You can add these libraries to the new installation,\n"
+ "or remove the functions using them from the old installation. A list of\n"
+ "problem libraries is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c
new file mode 100644
index 0000000..a9988ab
--- /dev/null
+++ b/src/bin/pg_upgrade/info.c
@@ -0,0 +1,662 @@
+/*
+ * info.c
+ *
+ * information support functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/info.c
+ */
+
+#include "postgres_fe.h"
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map);
+static void report_unmatched_relation(const RelInfo *rel, const DbInfo *db,
+ bool is_new_db);
+static void free_db_and_rel_infos(DbInfoArr *db_arr);
+static void get_template0_info(ClusterInfo *cluster);
+static void get_db_infos(ClusterInfo *cluster);
+static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo);
+static void free_rel_infos(RelInfoArr *rel_arr);
+static void print_db_infos(DbInfoArr *db_arr);
+static void print_rel_infos(RelInfoArr *rel_arr);
+
+
+/*
+ * gen_db_file_maps()
+ *
+ * generates a database mapping from "old_db" to "new_db".
+ *
+ * Returns a malloc'ed array of mappings. The length of the array
+ * is returned into *nmaps.
+ */
+FileNameMap *
+gen_db_file_maps(DbInfo *old_db, DbInfo *new_db,
+ int *nmaps,
+ const char *old_pgdata, const char *new_pgdata)
+{
+ FileNameMap *maps;
+ int old_relnum,
+ new_relnum;
+ int num_maps = 0;
+ bool all_matched = true;
+
+ /* There will certainly not be more mappings than there are old rels */
+ maps = (FileNameMap *) pg_malloc(sizeof(FileNameMap) *
+ old_db->rel_arr.nrels);
+
+ /*
+ * Each of the RelInfo arrays should be sorted by OID. Scan through them
+ * and match them up. If we fail to match everything, we'll abort, but
+ * first print as much info as we can about mismatches.
+ */
+ old_relnum = new_relnum = 0;
+ while (old_relnum < old_db->rel_arr.nrels ||
+ new_relnum < new_db->rel_arr.nrels)
+ {
+ RelInfo *old_rel = (old_relnum < old_db->rel_arr.nrels) ?
+ &old_db->rel_arr.rels[old_relnum] : NULL;
+ RelInfo *new_rel = (new_relnum < new_db->rel_arr.nrels) ?
+ &new_db->rel_arr.rels[new_relnum] : NULL;
+
+ /* handle running off one array before the other */
+ if (!new_rel)
+ {
+ /*
+ * old_rel is unmatched. This should never happen, because we
+ * force new rels to have TOAST tables if the old one did.
+ */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ if (!old_rel)
+ {
+ /*
+ * new_rel is unmatched. This shouldn't really happen either, but
+ * if it's a TOAST table, we can ignore it and continue
+ * processing, assuming that the new server made a TOAST table
+ * that wasn't needed.
+ */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /* check for mismatched OID */
+ if (old_rel->reloid < new_rel->reloid)
+ {
+ /* old_rel is unmatched, see comment above */
+ report_unmatched_relation(old_rel, old_db, false);
+ all_matched = false;
+ old_relnum++;
+ continue;
+ }
+ else if (old_rel->reloid > new_rel->reloid)
+ {
+ /* new_rel is unmatched, see comment above */
+ if (strcmp(new_rel->nspname, "pg_toast") != 0)
+ {
+ report_unmatched_relation(new_rel, new_db, true);
+ all_matched = false;
+ }
+ new_relnum++;
+ continue;
+ }
+
+ /*
+ * Verify that rels of same OID have same name. The namespace name
+ * should always match, but the relname might not match for TOAST
+ * tables (and, therefore, their indexes).
+ */
+ if (strcmp(old_rel->nspname, new_rel->nspname) != 0 ||
+ strcmp(old_rel->relname, new_rel->relname) != 0)
+ {
+ pg_log(PG_WARNING, "Relation names for OID %u in database \"%s\" do not match: "
+ "old name \"%s.%s\", new name \"%s.%s\"",
+ old_rel->reloid, old_db->db_name,
+ old_rel->nspname, old_rel->relname,
+ new_rel->nspname, new_rel->relname);
+ all_matched = false;
+ old_relnum++;
+ new_relnum++;
+ continue;
+ }
+
+ /* OK, create a mapping entry */
+ create_rel_filename_map(old_pgdata, new_pgdata, old_db, new_db,
+ old_rel, new_rel, maps + num_maps);
+ num_maps++;
+ old_relnum++;
+ new_relnum++;
+ }
+
+ if (!all_matched)
+ pg_fatal("Failed to match up old and new tables in database \"%s\"",
+ old_db->db_name);
+
+ *nmaps = num_maps;
+ return maps;
+}
+
+
+/*
+ * create_rel_filename_map()
+ *
+ * fills a file node map structure and returns it in "map".
+ */
+static void
+create_rel_filename_map(const char *old_data, const char *new_data,
+ const DbInfo *old_db, const DbInfo *new_db,
+ const RelInfo *old_rel, const RelInfo *new_rel,
+ FileNameMap *map)
+{
+ /* In case old/new tablespaces don't match, do them separately. */
+ if (strlen(old_rel->tablespace) == 0)
+ {
+ /*
+ * relation belongs to the default tablespace, hence relfiles should
+ * exist in the data directories.
+ */
+ map->old_tablespace = old_data;
+ map->old_tablespace_suffix = "/base";
+ }
+ else
+ {
+ /* relation belongs to a tablespace, so use the tablespace location */
+ map->old_tablespace = old_rel->tablespace;
+ map->old_tablespace_suffix = old_cluster.tablespace_suffix;
+ }
+
+ /* Do the same for new tablespaces */
+ if (strlen(new_rel->tablespace) == 0)
+ {
+ map->new_tablespace = new_data;
+ map->new_tablespace_suffix = "/base";
+ }
+ else
+ {
+ map->new_tablespace = new_rel->tablespace;
+ map->new_tablespace_suffix = new_cluster.tablespace_suffix;
+ }
+
+ /* DB oid and relfilenumbers are preserved between old and new cluster */
+ map->db_oid = old_db->db_oid;
+ map->relfilenumber = old_rel->relfilenumber;
+
+ /* used only for logging and error reporting, old/new are identical */
+ map->nspname = old_rel->nspname;
+ map->relname = old_rel->relname;
+}
+
+
+/*
+ * Complain about a relation we couldn't match to the other database,
+ * identifying it as best we can.
+ */
+static void
+report_unmatched_relation(const RelInfo *rel, const DbInfo *db, bool is_new_db)
+{
+ Oid reloid = rel->reloid; /* we might change rel below */
+ char reldesc[1000];
+ int i;
+
+ snprintf(reldesc, sizeof(reldesc), "\"%s.%s\"",
+ rel->nspname, rel->relname);
+ if (rel->indtable)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *hrel = &db->rel_arr.rels[i];
+
+ if (hrel->reloid == rel->indtable)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on \"%s.%s\""),
+ hrel->nspname, hrel->relname);
+ /* Shift attention to index's table for toast check */
+ rel = hrel;
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is an index on OID %u"), rel->indtable);
+ }
+ if (rel->toastheap)
+ {
+ for (i = 0; i < db->rel_arr.nrels; i++)
+ {
+ const RelInfo *brel = &db->rel_arr.rels[i];
+
+ if (brel->reloid == rel->toastheap)
+ {
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for \"%s.%s\""),
+ brel->nspname, brel->relname);
+ break;
+ }
+ }
+ if (i >= db->rel_arr.nrels)
+ snprintf(reldesc + strlen(reldesc),
+ sizeof(reldesc) - strlen(reldesc),
+ _(" which is the TOAST table for OID %u"), rel->toastheap);
+ }
+
+ if (is_new_db)
+ pg_log(PG_WARNING, "No match found in old cluster for new relation with OID %u in database \"%s\": %s",
+ reloid, db->db_name, reldesc);
+ else
+ pg_log(PG_WARNING, "No match found in new cluster for old relation with OID %u in database \"%s\": %s",
+ reloid, db->db_name, reldesc);
+}
+
+/*
+ * get_db_and_rel_infos()
+ *
+ * higher level routine to generate dbinfos for the database running
+ * on the given "port". Assumes that server is already running.
+ */
+void
+get_db_and_rel_infos(ClusterInfo *cluster)
+{
+ int dbnum;
+
+ if (cluster->dbarr.dbs != NULL)
+ free_db_and_rel_infos(&cluster->dbarr);
+
+ get_template0_info(cluster);
+ get_db_infos(cluster);
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ get_rel_infos(cluster, &cluster->dbarr.dbs[dbnum]);
+
+ if (cluster == &old_cluster)
+ pg_log(PG_VERBOSE, "\nsource databases:");
+ else
+ pg_log(PG_VERBOSE, "\ntarget databases:");
+
+ if (log_opts.verbose)
+ print_db_infos(&cluster->dbarr);
+}
+
+
+/*
+ * Get information about template0, which will be copied from the old cluster
+ * to the new cluster.
+ */
+static void
+get_template0_info(ClusterInfo *cluster)
+{
+ PGconn *conn = connectToServer(cluster, "template1");
+ DbLocaleInfo *locale;
+ PGresult *dbres;
+ int i_datencoding;
+ int i_datlocprovider;
+ int i_datcollate;
+ int i_datctype;
+ int i_daticulocale;
+
+ if (GET_MAJOR_VERSION(cluster->major_version) >= 1500)
+ dbres = executeQueryOrDie(conn,
+ "SELECT encoding, datlocprovider, "
+ " datcollate, datctype, daticulocale "
+ "FROM pg_catalog.pg_database "
+ "WHERE datname='template0'");
+ else
+ dbres = executeQueryOrDie(conn,
+ "SELECT encoding, 'c' AS datlocprovider, "
+ " datcollate, datctype, NULL AS daticulocale "
+ "FROM pg_catalog.pg_database "
+ "WHERE datname='template0'");
+
+
+ if (PQntuples(dbres) != 1)
+ pg_fatal("template0 not found");
+
+ locale = pg_malloc(sizeof(DbLocaleInfo));
+
+ i_datencoding = PQfnumber(dbres, "encoding");
+ i_datlocprovider = PQfnumber(dbres, "datlocprovider");
+ i_datcollate = PQfnumber(dbres, "datcollate");
+ i_datctype = PQfnumber(dbres, "datctype");
+ i_daticulocale = PQfnumber(dbres, "daticulocale");
+
+ locale->db_encoding = atoi(PQgetvalue(dbres, 0, i_datencoding));
+ locale->db_collprovider = PQgetvalue(dbres, 0, i_datlocprovider)[0];
+ locale->db_collate = pg_strdup(PQgetvalue(dbres, 0, i_datcollate));
+ locale->db_ctype = pg_strdup(PQgetvalue(dbres, 0, i_datctype));
+ if (PQgetisnull(dbres, 0, i_daticulocale))
+ locale->db_iculocale = NULL;
+ else
+ locale->db_iculocale = pg_strdup(PQgetvalue(dbres, 0, i_daticulocale));
+
+ cluster->template0 = locale;
+
+ PQclear(dbres);
+ PQfinish(conn);
+}
+
+
+/*
+ * get_db_infos()
+ *
+ * Scans pg_database system catalog and populates all user
+ * databases.
+ */
+static void
+get_db_infos(ClusterInfo *cluster)
+{
+ PGconn *conn = connectToServer(cluster, "template1");
+ PGresult *res;
+ int ntups;
+ int tupnum;
+ DbInfo *dbinfos;
+ int i_datname,
+ i_oid,
+ i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, ");
+ if (GET_MAJOR_VERSION(cluster->major_version) < 1500)
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "'c' AS datlocprovider, NULL AS daticulocale, ");
+ else
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "datlocprovider, daticulocale, ");
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
+ "FROM pg_catalog.pg_database d "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON d.dattablespace = t.oid "
+ "WHERE d.datallowconn = true "
+ "ORDER BY 1");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ i_oid = PQfnumber(res, "oid");
+ i_datname = PQfnumber(res, "datname");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ ntups = PQntuples(res);
+ dbinfos = (DbInfo *) pg_malloc(sizeof(DbInfo) * ntups);
+
+ for (tupnum = 0; tupnum < ntups; tupnum++)
+ {
+ dbinfos[tupnum].db_oid = atooid(PQgetvalue(res, tupnum, i_oid));
+ dbinfos[tupnum].db_name = pg_strdup(PQgetvalue(res, tupnum, i_datname));
+ snprintf(dbinfos[tupnum].db_tablespace, sizeof(dbinfos[tupnum].db_tablespace), "%s",
+ PQgetvalue(res, tupnum, i_spclocation));
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ cluster->dbarr.dbs = dbinfos;
+ cluster->dbarr.ndbs = ntups;
+}
+
+
+/*
+ * get_rel_infos()
+ *
+ * gets the relinfos for all the user tables and indexes of the database
+ * referred to by "dbinfo".
+ *
+ * Note: the resulting RelInfo array is assumed to be sorted by OID.
+ * This allows later processing to match up old and new databases efficiently.
+ */
+static void
+get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo)
+{
+ PGconn *conn = connectToServer(cluster,
+ dbinfo->db_name);
+ PGresult *res;
+ RelInfo *relinfos;
+ int ntups;
+ int relnum;
+ int num_rels = 0;
+ char *nspname = NULL;
+ char *relname = NULL;
+ char *tablespace = NULL;
+ int i_spclocation,
+ i_nspname,
+ i_relname,
+ i_reloid,
+ i_indtable,
+ i_toastheap,
+ i_relfilenumber,
+ i_reltablespace;
+ char query[QUERY_ALLOC];
+ char *last_namespace = NULL,
+ *last_tablespace = NULL;
+
+ query[0] = '\0'; /* initialize query string to empty */
+
+ /*
+ * Create a CTE that collects OIDs of regular user tables and matviews,
+ * but excluding toast tables and indexes. We assume that relations with
+ * OIDs >= FirstNormalObjectId belong to the user. (That's probably
+ * redundant with the namespace-name exclusions, but let's be safe.)
+ *
+ * pg_largeobject contains user data that does not appear in pg_dump
+ * output, so we have to copy that system table. It's easiest to do that
+ * by treating it as a user table.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "WITH regular_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.oid, 0::oid, 0::oid "
+ " FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " WHERE relkind IN (" CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ") AND "
+ /* exclude possible orphaned temp tables */
+ " ((n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ " n.nspname NOT IN ('pg_catalog', 'information_schema', "
+ " 'binary_upgrade', 'pg_toast') AND "
+ " c.oid >= %u::pg_catalog.oid) OR "
+ " (n.nspname = 'pg_catalog' AND "
+ " relname IN ('pg_largeobject') ))), ",
+ FirstNormalObjectId);
+
+ /*
+ * Add a CTE that collects OIDs of toast tables belonging to the tables
+ * selected by the regular_heap CTE. (We have to do this separately
+ * because the namespace-name rules above don't work for toast tables.)
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " toast_heap (reloid, indtable, toastheap) AS ( "
+ " SELECT c.reltoastrelid, 0::oid, c.oid "
+ " FROM regular_heap JOIN pg_catalog.pg_class c "
+ " ON regular_heap.reloid = c.oid "
+ " WHERE c.reltoastrelid != 0), ");
+
+ /*
+ * Add a CTE that collects OIDs of all valid indexes on the previously
+ * selected tables. We can ignore invalid indexes since pg_dump does.
+ * Testing indisready is necessary in 9.2, and harmless in earlier/later
+ * versions.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ " all_index (reloid, indtable, toastheap) AS ( "
+ " SELECT indexrelid, indrelid, 0::oid "
+ " FROM pg_catalog.pg_index "
+ " WHERE indisvalid AND indisready "
+ " AND indrelid IN "
+ " (SELECT reloid FROM regular_heap "
+ " UNION ALL "
+ " SELECT reloid FROM toast_heap)) ");
+
+ /*
+ * And now we can write the query that retrieves the data we want for each
+ * heap and index relation. Make sure result is sorted by OID.
+ */
+ snprintf(query + strlen(query), sizeof(query) - strlen(query),
+ "SELECT all_rels.*, n.nspname, c.relname, "
+ " c.relfilenode, c.reltablespace, "
+ " pg_catalog.pg_tablespace_location(t.oid) AS spclocation "
+ "FROM (SELECT * FROM regular_heap "
+ " UNION ALL "
+ " SELECT * FROM toast_heap "
+ " UNION ALL "
+ " SELECT * FROM all_index) all_rels "
+ " JOIN pg_catalog.pg_class c "
+ " ON all_rels.reloid = c.oid "
+ " JOIN pg_catalog.pg_namespace n "
+ " ON c.relnamespace = n.oid "
+ " LEFT OUTER JOIN pg_catalog.pg_tablespace t "
+ " ON c.reltablespace = t.oid "
+ "ORDER BY 1;");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ ntups = PQntuples(res);
+
+ relinfos = (RelInfo *) pg_malloc(sizeof(RelInfo) * ntups);
+
+ i_reloid = PQfnumber(res, "reloid");
+ i_indtable = PQfnumber(res, "indtable");
+ i_toastheap = PQfnumber(res, "toastheap");
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_relfilenumber = PQfnumber(res, "relfilenode");
+ i_reltablespace = PQfnumber(res, "reltablespace");
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (relnum = 0; relnum < ntups; relnum++)
+ {
+ RelInfo *curr = &relinfos[num_rels++];
+
+ curr->reloid = atooid(PQgetvalue(res, relnum, i_reloid));
+ curr->indtable = atooid(PQgetvalue(res, relnum, i_indtable));
+ curr->toastheap = atooid(PQgetvalue(res, relnum, i_toastheap));
+
+ nspname = PQgetvalue(res, relnum, i_nspname);
+ curr->nsp_alloc = false;
+
+ /*
+ * Many of the namespace and tablespace strings are identical, so we
+ * try to reuse the allocated string pointers where possible to reduce
+ * memory consumption.
+ */
+ /* Can we reuse the previous string allocation? */
+ if (last_namespace && strcmp(nspname, last_namespace) == 0)
+ curr->nspname = last_namespace;
+ else
+ {
+ last_namespace = curr->nspname = pg_strdup(nspname);
+ curr->nsp_alloc = true;
+ }
+
+ relname = PQgetvalue(res, relnum, i_relname);
+ curr->relname = pg_strdup(relname);
+
+ curr->relfilenumber = atooid(PQgetvalue(res, relnum, i_relfilenumber));
+ curr->tblsp_alloc = false;
+
+ /* Is the tablespace oid non-default? */
+ if (atooid(PQgetvalue(res, relnum, i_reltablespace)) != 0)
+ {
+ /*
+ * The tablespace location might be "", meaning the cluster
+ * default location, i.e. pg_default or pg_global.
+ */
+ tablespace = PQgetvalue(res, relnum, i_spclocation);
+
+ /* Can we reuse the previous string allocation? */
+ if (last_tablespace && strcmp(tablespace, last_tablespace) == 0)
+ curr->tablespace = last_tablespace;
+ else
+ {
+ last_tablespace = curr->tablespace = pg_strdup(tablespace);
+ curr->tblsp_alloc = true;
+ }
+ }
+ else
+ /* A zero reltablespace oid indicates the database tablespace. */
+ curr->tablespace = dbinfo->db_tablespace;
+ }
+ PQclear(res);
+
+ PQfinish(conn);
+
+ dbinfo->rel_arr.rels = relinfos;
+ dbinfo->rel_arr.nrels = num_rels;
+}
+
+
+static void
+free_db_and_rel_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ free_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ pg_free(db_arr->dbs[dbnum].db_name);
+ }
+ pg_free(db_arr->dbs);
+ db_arr->dbs = NULL;
+ db_arr->ndbs = 0;
+}
+
+
+static void
+free_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ {
+ if (rel_arr->rels[relnum].nsp_alloc)
+ pg_free(rel_arr->rels[relnum].nspname);
+ pg_free(rel_arr->rels[relnum].relname);
+ if (rel_arr->rels[relnum].tblsp_alloc)
+ pg_free(rel_arr->rels[relnum].tablespace);
+ }
+ pg_free(rel_arr->rels);
+ rel_arr->nrels = 0;
+}
+
+
+static void
+print_db_infos(DbInfoArr *db_arr)
+{
+ int dbnum;
+
+ for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++)
+ {
+ pg_log(PG_VERBOSE, "Database: %s", db_arr->dbs[dbnum].db_name);
+ print_rel_infos(&db_arr->dbs[dbnum].rel_arr);
+ }
+}
+
+
+static void
+print_rel_infos(RelInfoArr *rel_arr)
+{
+ int relnum;
+
+ for (relnum = 0; relnum < rel_arr->nrels; relnum++)
+ pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s",
+ rel_arr->rels[relnum].nspname,
+ rel_arr->rels[relnum].relname,
+ rel_arr->rels[relnum].reloid,
+ rel_arr->rels[relnum].tablespace);
+}
diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build
new file mode 100644
index 0000000..12a97f8
--- /dev/null
+++ b/src/bin/pg_upgrade/meson.build
@@ -0,0 +1,50 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+pg_upgrade_sources = files(
+ 'check.c',
+ 'controldata.c',
+ 'dump.c',
+ 'exec.c',
+ 'file.c',
+ 'function.c',
+ 'info.c',
+ 'option.c',
+ 'parallel.c',
+ 'pg_upgrade.c',
+ 'relfilenumber.c',
+ 'server.c',
+ 'tablespace.c',
+ 'util.c',
+ 'version.c',
+)
+
+if host_system == 'windows'
+ pg_upgrade_sources += rc_bin_gen.process(win32ver_rc, extra_args: [
+ '--NAME', 'pg_upgrade',
+ '--FILEDESC', 'pg_upgrade - an in-place binary upgrade utility'])
+endif
+
+pg_upgrade = executable('pg_upgrade',
+ pg_upgrade_sources,
+ c_pch: pch_postgres_fe_h,
+ dependencies: [frontend_code, libpq],
+ kwargs: default_bin_args,
+)
+bin_targets += pg_upgrade
+
+
+tests += {
+ 'name': 'pg_upgrade',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'tap': {
+ 'env': {'with_icu': icu.found() ? 'yes' : 'no'},
+ 'tests': [
+ 't/001_basic.pl',
+ 't/002_pg_upgrade.pl',
+ ],
+ 'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow
+ },
+}
+
+subdir('po', if_found: libintl)
diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk
new file mode 100644
index 0000000..9e2c138
--- /dev/null
+++ b/src/bin/pg_upgrade/nls.mk
@@ -0,0 +1,24 @@
+# src/bin/pg_upgrade/nls.mk
+CATALOG_NAME = pg_upgrade
+GETTEXT_FILES = check.c \
+ controldata.c \
+ dump.c \
+ exec.c \
+ file.c \
+ function.c \
+ info.c \
+ option.c \
+ parallel.c \
+ pg_upgrade.c \
+ relfilenumber.c \
+ server.c \
+ tablespace.c \
+ util.c \
+ version.c
+GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status prep_status_progress report_status:2
+GETTEXT_FLAGS = \
+ pg_fatal:1:c-format \
+ pg_log:2:c-format \
+ prep_status:1:c-format \
+ prep_status_progress:1:c-format \
+ report_status:2:c-format
diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c
new file mode 100644
index 0000000..6403610
--- /dev/null
+++ b/src/bin/pg_upgrade/option.c
@@ -0,0 +1,507 @@
+/*
+ * option.c
+ *
+ * options functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/option.c
+ */
+
+#include "postgres_fe.h"
+
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "common/string.h"
+#include "getopt_long.h"
+#include "pg_upgrade.h"
+#include "utils/pidfile.h"
+
+static void usage(void);
+static void check_required_directory(char **dirpath,
+ const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk);
+#define FIX_DEFAULT_READ_ONLY "-c default_transaction_read_only=false"
+
+
+UserOpts user_opts;
+
+
+/*
+ * parseCommandLine()
+ *
+ * Parses the command line (argc, argv[]) and loads structures
+ */
+void
+parseCommandLine(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"old-datadir", required_argument, NULL, 'd'},
+ {"new-datadir", required_argument, NULL, 'D'},
+ {"old-bindir", required_argument, NULL, 'b'},
+ {"new-bindir", required_argument, NULL, 'B'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"old-options", required_argument, NULL, 'o'},
+ {"new-options", required_argument, NULL, 'O'},
+ {"old-port", required_argument, NULL, 'p'},
+ {"new-port", required_argument, NULL, 'P'},
+
+ {"username", required_argument, NULL, 'U'},
+ {"check", no_argument, NULL, 'c'},
+ {"link", no_argument, NULL, 'k'},
+ {"retain", no_argument, NULL, 'r'},
+ {"jobs", required_argument, NULL, 'j'},
+ {"socketdir", required_argument, NULL, 's'},
+ {"verbose", no_argument, NULL, 'v'},
+ {"clone", no_argument, NULL, 1},
+ {"copy", no_argument, NULL, 2},
+
+ {NULL, 0, NULL, 0}
+ };
+ int option; /* Command line option */
+ int optindex = 0; /* used by getopt_long */
+ int os_user_effective_id;
+
+ user_opts.do_sync = true;
+ user_opts.transfer_mode = TRANSFER_MODE_COPY;
+
+ os_info.progname = get_progname(argv[0]);
+
+ /* Process libpq env. variables; load values here for usage() output */
+ old_cluster.port = getenv("PGPORTOLD") ? atoi(getenv("PGPORTOLD")) : DEF_PGUPORT;
+ new_cluster.port = getenv("PGPORTNEW") ? atoi(getenv("PGPORTNEW")) : DEF_PGUPORT;
+
+ os_user_effective_id = get_user_info(&os_info.user);
+ /* we override just the database user name; we got the OS id above */
+ if (getenv("PGUSER"))
+ {
+ pg_free(os_info.user);
+ /* must save value, getenv()'s pointer is not stable */
+ os_info.user = pg_strdup(getenv("PGUSER"));
+ }
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_upgrade (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ /* Allow help and version to be run as root, so do the test here. */
+ if (os_user_effective_id == 0)
+ pg_fatal("%s: cannot be run as root", os_info.progname);
+
+ while ((option = getopt_long(argc, argv, "b:B:cd:D:j:kNo:O:p:P:rs:U:v",
+ long_options, &optindex)) != -1)
+ {
+ switch (option)
+ {
+ case 'b':
+ old_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'B':
+ new_cluster.bindir = pg_strdup(optarg);
+ break;
+
+ case 'c':
+ user_opts.check = true;
+ break;
+
+ case 'd':
+ old_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'D':
+ new_cluster.pgdata = pg_strdup(optarg);
+ break;
+
+ case 'j':
+ user_opts.jobs = atoi(optarg);
+ break;
+
+ case 'k':
+ user_opts.transfer_mode = TRANSFER_MODE_LINK;
+ break;
+
+ case 'N':
+ user_opts.do_sync = false;
+ break;
+
+ case 'o':
+ /* append option? */
+ if (!old_cluster.pgopts)
+ old_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *old_pgopts = old_cluster.pgopts;
+
+ old_cluster.pgopts = psprintf("%s %s", old_pgopts, optarg);
+ free(old_pgopts);
+ }
+ break;
+
+ case 'O':
+ /* append option? */
+ if (!new_cluster.pgopts)
+ new_cluster.pgopts = pg_strdup(optarg);
+ else
+ {
+ char *new_pgopts = new_cluster.pgopts;
+
+ new_cluster.pgopts = psprintf("%s %s", new_pgopts, optarg);
+ free(new_pgopts);
+ }
+ break;
+
+ case 'p':
+ if ((old_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid old port number");
+ break;
+
+ case 'P':
+ if ((new_cluster.port = atoi(optarg)) <= 0)
+ pg_fatal("invalid new port number");
+ break;
+
+ case 'r':
+ log_opts.retain = true;
+ break;
+
+ case 's':
+ user_opts.socketdir = pg_strdup(optarg);
+ break;
+
+ case 'U':
+ pg_free(os_info.user);
+ os_info.user = pg_strdup(optarg);
+ os_info.user_specified = true;
+ break;
+
+ case 'v':
+ log_opts.verbose = true;
+ break;
+
+ case 1:
+ user_opts.transfer_mode = TRANSFER_MODE_CLONE;
+ break;
+
+ case 2:
+ user_opts.transfer_mode = TRANSFER_MODE_COPY;
+ break;
+
+ default:
+ fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
+ os_info.progname);
+ exit(1);
+ }
+ }
+
+ if (optind < argc)
+ pg_fatal("too many command-line arguments (first is \"%s\")", argv[optind]);
+
+ if (log_opts.verbose)
+ pg_log(PG_REPORT, "Running in verbose mode");
+
+ log_opts.isatty = isatty(fileno(stdout));
+
+ /* Turn off read-only mode; add prefix to PGOPTIONS? */
+ if (getenv("PGOPTIONS"))
+ {
+ char *pgoptions = psprintf("%s %s", FIX_DEFAULT_READ_ONLY,
+ getenv("PGOPTIONS"));
+
+ setenv("PGOPTIONS", pgoptions, 1);
+ pfree(pgoptions);
+ }
+ else
+ setenv("PGOPTIONS", FIX_DEFAULT_READ_ONLY, 1);
+
+ /* Get values from env if not already set */
+ check_required_directory(&old_cluster.bindir, "PGBINOLD", false,
+ "-b", _("old cluster binaries reside"), false);
+ check_required_directory(&new_cluster.bindir, "PGBINNEW", false,
+ "-B", _("new cluster binaries reside"), true);
+ check_required_directory(&old_cluster.pgdata, "PGDATAOLD", false,
+ "-d", _("old cluster data resides"), false);
+ check_required_directory(&new_cluster.pgdata, "PGDATANEW", false,
+ "-D", _("new cluster data resides"), false);
+ check_required_directory(&user_opts.socketdir, "PGSOCKETDIR", true,
+ "-s", _("sockets will be created"), false);
+
+#ifdef WIN32
+
+ /*
+ * On Windows, initdb --sync-only will fail with a "Permission denied"
+ * error on file pg_upgrade_utility.log if pg_upgrade is run inside the
+ * new cluster directory, so we do a check here.
+ */
+ {
+ char cwd[MAXPGPATH],
+ new_cluster_pgdata[MAXPGPATH];
+
+ strlcpy(new_cluster_pgdata, new_cluster.pgdata, MAXPGPATH);
+ canonicalize_path(new_cluster_pgdata);
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory");
+ canonicalize_path(cwd);
+ if (path_is_prefix_of_path(new_cluster_pgdata, cwd))
+ pg_fatal("cannot run pg_upgrade from inside the new cluster data directory on Windows");
+ }
+#endif
+}
+
+
+static void
+usage(void)
+{
+ printf(_("pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"));
+ printf(_("Usage:\n"));
+ printf(_(" pg_upgrade [OPTION]...\n\n"));
+ printf(_("Options:\n"));
+ printf(_(" -b, --old-bindir=BINDIR old cluster executable directory\n"));
+ printf(_(" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+ " same directory as pg_upgrade)\n"));
+ printf(_(" -c, --check check clusters only, don't change any data\n"));
+ printf(_(" -d, --old-datadir=DATADIR old cluster data directory\n"));
+ printf(_(" -D, --new-datadir=DATADIR new cluster data directory\n"));
+ printf(_(" -j, --jobs=NUM number of simultaneous processes or threads to use\n"));
+ printf(_(" -k, --link link instead of copying files to new cluster\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -o, --old-options=OPTIONS old cluster options to pass to the server\n"));
+ printf(_(" -O, --new-options=OPTIONS new cluster options to pass to the server\n"));
+ printf(_(" -p, --old-port=PORT old cluster port number (default %d)\n"), old_cluster.port);
+ printf(_(" -P, --new-port=PORT new cluster port number (default %d)\n"), new_cluster.port);
+ printf(_(" -r, --retain retain SQL and log files after success\n"));
+ printf(_(" -s, --socketdir=DIR socket directory to use (default current dir.)\n"));
+ printf(_(" -U, --username=NAME cluster superuser (default \"%s\")\n"), os_info.user);
+ printf(_(" -v, --verbose enable verbose internal logging\n"));
+ printf(_(" -V, --version display version information, then exit\n"));
+ printf(_(" --clone clone instead of copying files to new cluster\n"));
+ printf(_(" --copy copy files to new cluster (default)\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\n"
+ "Before running pg_upgrade you must:\n"
+ " create a new database cluster (using the new version of initdb)\n"
+ " shutdown the postmaster servicing the old cluster\n"
+ " shutdown the postmaster servicing the new cluster\n"));
+ printf(_("\n"
+ "When you run pg_upgrade, you must provide the following information:\n"
+ " the data directory for the old cluster (-d DATADIR)\n"
+ " the data directory for the new cluster (-D DATADIR)\n"
+ " the \"bin\" directory for the old version (-b BINDIR)\n"
+ " the \"bin\" directory for the new version (-B BINDIR)\n"));
+ printf(_("\n"
+ "For example:\n"
+ " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+ "or\n"));
+#ifndef WIN32
+ printf(_(" $ export PGDATAOLD=oldCluster/data\n"
+ " $ export PGDATANEW=newCluster/data\n"
+ " $ export PGBINOLD=oldCluster/bin\n"
+ " $ export PGBINNEW=newCluster/bin\n"
+ " $ pg_upgrade\n"));
+#else
+ printf(_(" C:\\> set PGDATAOLD=oldCluster/data\n"
+ " C:\\> set PGDATANEW=newCluster/data\n"
+ " C:\\> set PGBINOLD=oldCluster/bin\n"
+ " C:\\> set PGBINNEW=newCluster/bin\n"
+ " C:\\> pg_upgrade\n"));
+#endif
+ printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+
+/*
+ * check_required_directory()
+ *
+ * Checks a directory option.
+ * dirpath - the directory name supplied on the command line, or NULL
+ * envVarName - the name of an environment variable to get if dirpath is NULL
+ * useCwd - true if OK to default to CWD
+ * cmdLineOption - the command line option for this directory
+ * description - a description of this directory option
+ * missingOk - true if OK that both dirpath and envVarName are not existing
+ *
+ * We use the last two arguments to construct a meaningful error message if the
+ * user hasn't provided the required directory name.
+ */
+static void
+check_required_directory(char **dirpath, const char *envVarName, bool useCwd,
+ const char *cmdLineOption, const char *description,
+ bool missingOk)
+{
+ if (*dirpath == NULL || strlen(*dirpath) == 0)
+ {
+ const char *envVar;
+
+ if ((envVar = getenv(envVarName)) && strlen(envVar))
+ *dirpath = pg_strdup(envVar);
+ else if (useCwd)
+ {
+ char cwd[MAXPGPATH];
+
+ if (!getcwd(cwd, MAXPGPATH))
+ pg_fatal("could not determine current directory");
+ *dirpath = pg_strdup(cwd);
+ }
+ else if (missingOk)
+ return;
+ else
+ pg_fatal("You must identify the directory where the %s.\n"
+ "Please use the %s command-line option or the %s environment variable.",
+ description, cmdLineOption, envVarName);
+ }
+
+ /*
+ * Clean up the path, in particular trimming any trailing path separators,
+ * because we construct paths by appending to this path.
+ */
+ canonicalize_path(*dirpath);
+}
+
+/*
+ * adjust_data_dir
+ *
+ * If a configuration-only directory was specified, find the real data dir
+ * by querying the running server. This has limited checking because we
+ * can't check for a running server because we can't find postmaster.pid.
+ *
+ * On entry, cluster->pgdata has been set from command line or env variable,
+ * but cluster->pgconfig isn't set. We fill both variables with corrected
+ * values.
+ */
+void
+adjust_data_dir(ClusterInfo *cluster)
+{
+ char filename[MAXPGPATH];
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *fp,
+ *output;
+ int rc;
+
+ /* Initially assume config dir and data dir are the same */
+ cluster->pgconfig = pg_strdup(cluster->pgdata);
+
+ /* If there is no postgresql.conf, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/postgresql.conf", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) == NULL)
+ return;
+ fclose(fp);
+
+ /* If PG_VERSION exists, it can't be a config-only dir */
+ snprintf(filename, sizeof(filename), "%s/PG_VERSION", cluster->pgconfig);
+ if ((fp = fopen(filename, "r")) != NULL)
+ {
+ fclose(fp);
+ return;
+ }
+
+ /* Must be a configuration directory, so find the real data directory. */
+
+ if (cluster == &old_cluster)
+ prep_status("Finding the real data directory for the source cluster");
+ else
+ prep_status("Finding the real data directory for the target cluster");
+
+ /*
+ * We don't have a data directory yet, so we can't check the PG version,
+ * so this might fail --- only works for PG 9.2+. If this fails,
+ * pg_upgrade will fail anyway because the data files will not be found.
+ */
+ snprintf(cmd, sizeof(cmd), "\"%s/postgres\" -D \"%s\" -C data_directory",
+ cluster->bindir, cluster->pgconfig);
+ fflush(NULL);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get data directory using %s: %s",
+ cmd, strerror(errno));
+
+ rc = pclose(output);
+ if (rc != 0)
+ pg_fatal("could not get data directory using %s: %s",
+ cmd, wait_result_to_str(rc));
+
+ /* strip trailing newline and carriage return */
+ (void) pg_strip_crlf(cmd_output);
+
+ cluster->pgdata = pg_strdup(cmd_output);
+
+ check_ok();
+}
+
+
+/*
+ * get_sock_dir
+ *
+ * Identify the socket directory to use for this cluster. If we're doing
+ * a live check (old cluster only), we need to find out where the postmaster
+ * is listening. Otherwise, we're going to put the socket into the current
+ * directory.
+ */
+void
+get_sock_dir(ClusterInfo *cluster, bool live_check)
+{
+#if !defined(WIN32)
+ 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",
+ 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",
+ 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",
+ orig_port, cluster->port);
+ }
+#else /* WIN32 */
+ cluster->sockdir = NULL;
+#endif
+}
diff --git a/src/bin/pg_upgrade/parallel.c b/src/bin/pg_upgrade/parallel.c
new file mode 100644
index 0000000..eaf0f0a
--- /dev/null
+++ b/src/bin/pg_upgrade/parallel.c
@@ -0,0 +1,341 @@
+/*
+ * parallel.c
+ *
+ * multi-process support
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/parallel.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/wait.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#include "pg_upgrade.h"
+
+static int parallel_jobs;
+
+#ifdef WIN32
+/*
+ * Array holding all active threads. There can't be any gaps/zeros so
+ * it can be passed to WaitForMultipleObjects(). We use two arrays
+ * so the thread_handles array can be passed to WaitForMultipleObjects().
+ */
+HANDLE *thread_handles;
+
+typedef struct
+{
+ char *log_file;
+ char *opt_log_file;
+ char *cmd;
+} exec_thread_arg;
+
+typedef struct
+{
+ DbInfoArr *old_db_arr;
+ DbInfoArr *new_db_arr;
+ char *old_pgdata;
+ char *new_pgdata;
+ char *old_tablespace;
+} transfer_thread_arg;
+
+exec_thread_arg **exec_thread_args;
+transfer_thread_arg **transfer_thread_args;
+
+/* track current thread_args struct so reap_child() can be used for all cases */
+void **cur_thread_args;
+
+DWORD win32_exec_prog(exec_thread_arg *args);
+DWORD win32_transfer_all_new_dbs(transfer_thread_arg *args);
+#endif
+
+/*
+ * parallel_exec_prog
+ *
+ * This has the same API as exec_prog, except it does parallel execution,
+ * and therefore must throw errors and doesn't return an error status.
+ */
+void
+parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...)
+{
+ va_list args;
+ char cmd[MAX_STRING];
+
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ exec_thread_arg *new_arg;
+#endif
+
+ va_start(args, fmt);
+ vsnprintf(cmd, sizeof(cmd), fmt, args);
+ va_end(args);
+
+ if (user_opts.jobs <= 1)
+ /* exit_on_error must be true to allow jobs */
+ exec_prog(log_file, opt_log_file, true, true, "%s", cmd);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (exec_thread_args == NULL)
+ {
+ int i;
+
+ exec_thread_args = pg_malloc(user_opts.jobs * sizeof(exec_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ exec_thread_args[i] = pg_malloc0(sizeof(exec_thread_arg));
+ }
+
+ cur_thread_args = (void **) exec_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ /* use _exit to skip atexit() functions */
+ _exit(!exec_prog(log_file, opt_log_file, true, true, "%s", cmd));
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = exec_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ pg_free(new_arg->log_file);
+ new_arg->log_file = pg_strdup(log_file);
+ pg_free(new_arg->opt_log_file);
+ new_arg->opt_log_file = opt_log_file ? pg_strdup(opt_log_file) : NULL;
+ pg_free(new_arg->cmd);
+ new_arg->cmd = pg_strdup(cmd);
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_exec_prog,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_exec_prog(exec_thread_arg *args)
+{
+ int ret;
+
+ ret = !exec_prog(args->log_file, args->opt_log_file, true, true, "%s", args->cmd);
+
+ /* terminates thread */
+ return ret;
+}
+#endif
+
+
+/*
+ * parallel_transfer_all_new_dbs
+ *
+ * This has the same API as transfer_all_new_dbs, except it does parallel execution
+ * by transferring multiple tablespaces in parallel
+ */
+void
+parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace)
+{
+#ifndef WIN32
+ pid_t child;
+#else
+ HANDLE child;
+ transfer_thread_arg *new_arg;
+#endif
+
+ if (user_opts.jobs <= 1)
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata, NULL);
+ else
+ {
+ /* parallel */
+#ifdef WIN32
+ if (thread_handles == NULL)
+ thread_handles = pg_malloc(user_opts.jobs * sizeof(HANDLE));
+
+ if (transfer_thread_args == NULL)
+ {
+ int i;
+
+ transfer_thread_args = pg_malloc(user_opts.jobs * sizeof(transfer_thread_arg *));
+
+ /*
+ * For safety and performance, we keep the args allocated during
+ * the entire life of the process, and we don't free the args in a
+ * thread different from the one that allocated it.
+ */
+ for (i = 0; i < user_opts.jobs; i++)
+ transfer_thread_args[i] = pg_malloc0(sizeof(transfer_thread_arg));
+ }
+
+ cur_thread_args = (void **) transfer_thread_args;
+#endif
+ /* harvest any dead children */
+ while (reap_child(false) == true)
+ ;
+
+ /* must we wait for a dead child? */
+ if (parallel_jobs >= user_opts.jobs)
+ reap_child(true);
+
+ /* set this before we start the job */
+ parallel_jobs++;
+
+ /* Ensure stdio state is quiesced before forking */
+ fflush(NULL);
+
+#ifndef WIN32
+ child = fork();
+ if (child == 0)
+ {
+ transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata, new_pgdata,
+ old_tablespace);
+ /* if we take another exit path, it will be non-zero */
+ /* use _exit to skip atexit() functions */
+ _exit(0);
+ }
+ else if (child < 0)
+ /* fork failed */
+ pg_fatal("could not create worker process: %s", strerror(errno));
+#else
+ /* empty array element are always at the end */
+ new_arg = transfer_thread_args[parallel_jobs - 1];
+
+ /* Can only pass one pointer into the function, so use a struct */
+ new_arg->old_db_arr = old_db_arr;
+ new_arg->new_db_arr = new_db_arr;
+ pg_free(new_arg->old_pgdata);
+ new_arg->old_pgdata = pg_strdup(old_pgdata);
+ pg_free(new_arg->new_pgdata);
+ new_arg->new_pgdata = pg_strdup(new_pgdata);
+ pg_free(new_arg->old_tablespace);
+ new_arg->old_tablespace = old_tablespace ? pg_strdup(old_tablespace) : NULL;
+
+ child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_transfer_all_new_dbs,
+ new_arg, 0, NULL);
+ if (child == 0)
+ pg_fatal("could not create worker thread: %s", strerror(errno));
+
+ thread_handles[parallel_jobs - 1] = child;
+#endif
+ }
+}
+
+
+#ifdef WIN32
+DWORD
+win32_transfer_all_new_dbs(transfer_thread_arg *args)
+{
+ transfer_all_new_dbs(args->old_db_arr, args->new_db_arr, args->old_pgdata,
+ args->new_pgdata, args->old_tablespace);
+
+ /* terminates thread */
+ return 0;
+}
+#endif
+
+
+/*
+ * collect status from a completed worker child
+ */
+bool
+reap_child(bool wait_for_child)
+{
+#ifndef WIN32
+ int work_status;
+ pid_t child;
+#else
+ int thread_num;
+ DWORD res;
+#endif
+
+ if (user_opts.jobs <= 1 || parallel_jobs == 0)
+ return false;
+
+#ifndef WIN32
+ child = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG);
+ if (child == (pid_t) -1)
+ pg_fatal("%s() failed: %s", "waitpid", strerror(errno));
+ if (child == 0)
+ return false; /* no children, or no dead children */
+ if (work_status != 0)
+ pg_fatal("child process exited abnormally: status %d", work_status);
+#else
+ /* wait for one to finish */
+ thread_num = WaitForMultipleObjects(parallel_jobs, thread_handles,
+ false, wait_for_child ? INFINITE : 0);
+
+ if (thread_num == WAIT_TIMEOUT || thread_num == WAIT_FAILED)
+ return false;
+
+ /* compute thread index in active_threads */
+ thread_num -= WAIT_OBJECT_0;
+
+ /* get the result */
+ GetExitCodeThread(thread_handles[thread_num], &res);
+ if (res != 0)
+ pg_fatal("child worker exited abnormally: %s", strerror(errno));
+
+ /* dispose of handle to stop leaks */
+ CloseHandle(thread_handles[thread_num]);
+
+ /* Move last slot into dead child's position */
+ if (thread_num != parallel_jobs - 1)
+ {
+ void *tmp_args;
+
+ thread_handles[thread_num] = thread_handles[parallel_jobs - 1];
+
+ /*
+ * Move last active thread arg struct into the now-dead slot, and the
+ * now-dead slot to the end for reuse by the next thread. Though the
+ * thread struct is in use by another thread, we can safely swap the
+ * struct pointers within the array.
+ */
+ tmp_args = cur_thread_args[thread_num];
+ cur_thread_args[thread_num] = cur_thread_args[parallel_jobs - 1];
+ cur_thread_args[parallel_jobs - 1] = tmp_args;
+ }
+#endif
+
+ /* do this after job has been removed */
+ parallel_jobs--;
+
+ return true;
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
new file mode 100644
index 0000000..4562daf
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -0,0 +1,862 @@
+/*
+ * pg_upgrade.c
+ *
+ * main source file
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.c
+ */
+
+/*
+ * To simplify the upgrade process, we force certain system values to be
+ * identical between old and new clusters:
+ *
+ * We control all assignments of pg_class.oid (and relfilenode) so toast
+ * oids are the same between old and new clusters. This is important
+ * because toast oids are stored as toast pointers in user tables.
+ *
+ * While pg_class.oid and pg_class.relfilenode are initially the same in a
+ * cluster, they can diverge due to CLUSTER, REINDEX, or VACUUM FULL. We
+ * control assignments of pg_class.relfilenode because we want the filenames
+ * to match between the old and new cluster.
+ *
+ * We control assignment of pg_tablespace.oid because we want the oid to match
+ * between the old and new cluster.
+ *
+ * We control all assignments of pg_type.oid because these oids are stored
+ * in user composite type values.
+ *
+ * We control all assignments of pg_enum.oid because these oids are stored
+ * in user tables as enum values.
+ *
+ * We control all assignments of pg_authid.oid for historical reasons (the
+ * oids used to be stored in pg_largeobject_metadata, which is now copied via
+ * SQL commands), that might change at some point in the future.
+ */
+
+
+
+#include "postgres_fe.h"
+
+#include <time.h>
+
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+
+#include "catalog/pg_class_d.h"
+#include "common/file_perm.h"
+#include "common/logging.h"
+#include "common/restricted_token.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+static void set_locale_and_encoding(void);
+static void prepare_new_cluster(void);
+static void prepare_new_globals(void);
+static void create_new_objects(void);
+static void copy_xact_xlog_xid(void);
+static void set_frozenxids(bool minmxid_only);
+static void make_outputdirs(char *pgdata);
+static void setup(char *argv0, bool *live_check);
+
+ClusterInfo old_cluster,
+ new_cluster;
+OSInfo os_info;
+
+char *output_files[] = {
+ SERVER_LOG_FILE,
+#ifdef WIN32
+ /* unique file for pg_ctl start */
+ SERVER_START_LOG_FILE,
+#endif
+ UTILITY_LOG_FILE,
+ INTERNAL_LOG_FILE,
+ NULL
+};
+
+
+int
+main(int argc, char **argv)
+{
+ char *deletion_script_file_name = NULL;
+ bool live_check = false;
+
+ /*
+ * pg_upgrade doesn't currently use common/logging.c, but initialize it
+ * anyway because we might call common code that does.
+ */
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade"));
+
+ /* Set default restrictive mask until new cluster permissions are read */
+ umask(PG_MODE_MASK_OWNER);
+
+ parseCommandLine(argc, argv);
+
+ get_restricted_token();
+
+ adjust_data_dir(&old_cluster);
+ adjust_data_dir(&new_cluster);
+
+ /*
+ * Set mask based on PGDATA permissions, needed for the creation of the
+ * output directories with correct permissions.
+ */
+ if (!GetDataDirectoryCreatePerm(new_cluster.pgdata))
+ pg_fatal("could not read permissions of directory \"%s\": %s",
+ new_cluster.pgdata, strerror(errno));
+
+ umask(pg_mode_mask);
+
+ /*
+ * This needs to happen after adjusting the data directory of the new
+ * cluster in adjust_data_dir().
+ */
+ make_outputdirs(new_cluster.pgdata);
+
+ setup(argv[0], &live_check);
+
+ output_check_banner(live_check);
+
+ check_cluster_versions();
+
+ get_sock_dir(&old_cluster, live_check);
+ get_sock_dir(&new_cluster, false);
+
+ check_cluster_compatibility(live_check);
+
+ check_and_dump_old_cluster(live_check);
+
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ check_new_cluster();
+ report_clusters_compatible();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Performing Upgrade\n"
+ "------------------");
+
+ set_locale_and_encoding();
+
+ prepare_new_cluster();
+
+ stop_postmaster(false);
+
+ /*
+ * Destructive Changes to New Cluster
+ */
+
+ copy_xact_xlog_xid();
+
+ /* New now using xids of the old system */
+
+ /* -- NEW -- */
+ start_postmaster(&new_cluster, true);
+
+ prepare_new_globals();
+
+ create_new_objects();
+
+ stop_postmaster(false);
+
+ /*
+ * Most failures happen in create_new_objects(), which has completed at
+ * this point. We do this here because it is just before linking, which
+ * will link the old and new cluster data files, preventing the old
+ * cluster from being safely started once the new cluster is started.
+ */
+ if (user_opts.transfer_mode == TRANSFER_MODE_LINK)
+ disable_old_cluster();
+
+ transfer_all_new_tablespaces(&old_cluster.dbarr, &new_cluster.dbarr,
+ old_cluster.pgdata, new_cluster.pgdata);
+
+ /*
+ * Assuming OIDs are only used in system tables, there is no need to
+ * restore the OID counter because we have not transferred any OIDs from
+ * the old system, but we do it anyway just in case. We do it late here
+ * because there is no need to have the schema load use new oids.
+ */
+ prep_status("Setting next OID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -o %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtoid,
+ new_cluster.pgdata);
+ check_ok();
+
+ if (user_opts.do_sync)
+ {
+ prep_status("Sync data directory to disk");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ create_script_for_old_cluster_deletion(&deletion_script_file_name);
+
+ issue_warnings_and_set_wal_level();
+
+ pg_log(PG_REPORT,
+ "\n"
+ "Upgrade Complete\n"
+ "----------------");
+
+ output_completion_banner(deletion_script_file_name);
+
+ pg_free(deletion_script_file_name);
+
+ cleanup_output_dirs();
+
+ return 0;
+}
+
+/*
+ * Create and assign proper permissions to the set of output directories
+ * used to store any data generated internally, filling in log_opts in
+ * the process.
+ */
+static void
+make_outputdirs(char *pgdata)
+{
+ FILE *fp;
+ char **filename;
+ time_t run_time = time(NULL);
+ char filename_path[MAXPGPATH];
+ char timebuf[128];
+ struct timeval time;
+ time_t tt;
+ int len;
+
+ log_opts.rootdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.rootdir, MAXPGPATH, "%s/%s", pgdata, BASE_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /* BASE_OUTPUTDIR/$timestamp/ */
+ gettimeofday(&time, NULL);
+ tt = (time_t) time.tv_sec;
+ strftime(timebuf, sizeof(timebuf), "%Y%m%dT%H%M%S", localtime(&tt));
+ /* append milliseconds */
+ snprintf(timebuf + strlen(timebuf), sizeof(timebuf) - strlen(timebuf),
+ ".%03d", (int) (time.tv_usec / 1000));
+ log_opts.basedir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.basedir, MAXPGPATH, "%s/%s", log_opts.rootdir,
+ timebuf);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /* BASE_OUTPUTDIR/$timestamp/dump/ */
+ log_opts.dumpdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.dumpdir, MAXPGPATH, "%s/%s/%s", log_opts.rootdir,
+ timebuf, DUMP_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /* BASE_OUTPUTDIR/$timestamp/log/ */
+ log_opts.logdir = (char *) pg_malloc0(MAXPGPATH);
+ len = snprintf(log_opts.logdir, MAXPGPATH, "%s/%s/%s", log_opts.rootdir,
+ timebuf, LOG_OUTPUTDIR);
+ if (len >= MAXPGPATH)
+ pg_fatal("directory path for new cluster is too long");
+
+ /*
+ * Ignore the error case where the root path exists, as it is kept the
+ * same across runs.
+ */
+ if (mkdir(log_opts.rootdir, pg_dir_create_mode) < 0 && errno != EEXIST)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.rootdir);
+ if (mkdir(log_opts.basedir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.basedir);
+ if (mkdir(log_opts.dumpdir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.dumpdir);
+ if (mkdir(log_opts.logdir, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", log_opts.logdir);
+
+ len = snprintf(filename_path, sizeof(filename_path), "%s/%s",
+ log_opts.logdir, INTERNAL_LOG_FILE);
+ if (len >= sizeof(filename_path))
+ pg_fatal("directory path for new cluster is too long");
+
+ if ((log_opts.internal = fopen_priv(filename_path, "a")) == NULL)
+ pg_fatal("could not open log file \"%s\": %m", filename_path);
+
+ /* label start of upgrade in logfiles */
+ for (filename = output_files; *filename != NULL; filename++)
+ {
+ len = snprintf(filename_path, sizeof(filename_path), "%s/%s",
+ log_opts.logdir, *filename);
+ if (len >= sizeof(filename_path))
+ pg_fatal("directory path for new cluster is too long");
+ if ((fp = fopen_priv(filename_path, "a")) == NULL)
+ pg_fatal("could not write to log file \"%s\": %m", filename_path);
+
+ fprintf(fp,
+ "-----------------------------------------------------------------\n"
+ " pg_upgrade run on %s"
+ "-----------------------------------------------------------------\n\n",
+ ctime(&run_time));
+ fclose(fp);
+ }
+}
+
+
+static void
+setup(char *argv0, bool *live_check)
+{
+ /*
+ * make sure the user has a clean environment, otherwise, we may confuse
+ * libpq when we connect to one (or both) of the servers.
+ */
+ check_pghost_envvar();
+
+ /*
+ * In case the user hasn't specified the directory for the new binaries
+ * with -B, default to using the path of the currently executed pg_upgrade
+ * binary.
+ */
+ if (!new_cluster.bindir)
+ {
+ char exec_path[MAXPGPATH];
+
+ if (find_my_exec(argv0, exec_path) < 0)
+ pg_fatal("%s: could not find own program executable", argv0);
+ /* Trim off program name and keep just path */
+ *last_dir_separator(exec_path) = '\0';
+ canonicalize_path(exec_path);
+ new_cluster.bindir = pg_strdup(exec_path);
+ }
+
+ verify_directories();
+
+ /* no postmasters should be running, except for a live check */
+ if (pid_lock_file_exists(old_cluster.pgdata))
+ {
+ /*
+ * If we have a postmaster.pid file, try to start the server. If it
+ * starts, the pid file was stale, so stop the server. If it doesn't
+ * start, assume the server is running. If the pid file is left over
+ * from a server crash, this also allows any committed transactions
+ * stored in the WAL to be replayed so they are not lost, because WAL
+ * files are not transferred from old to new servers. We later check
+ * for a clean shutdown.
+ */
+ if (start_postmaster(&old_cluster, false))
+ stop_postmaster(false);
+ else
+ {
+ if (!user_opts.check)
+ pg_fatal("There seems to be a postmaster servicing the old cluster.\n"
+ "Please shutdown that postmaster and try again.");
+ else
+ *live_check = true;
+ }
+ }
+
+ /* same goes for the new postmaster */
+ if (pid_lock_file_exists(new_cluster.pgdata))
+ {
+ if (start_postmaster(&new_cluster, false))
+ stop_postmaster(false);
+ else
+ pg_fatal("There seems to be a postmaster servicing the new cluster.\n"
+ "Please shutdown that postmaster and try again.");
+ }
+}
+
+
+/*
+ * Copy locale and encoding information into the new cluster's template0.
+ *
+ * We need to copy the encoding, datlocprovider, datcollate, datctype, and
+ * daticulocale. We don't need datcollversion because that's never set for
+ * template0.
+ */
+static void
+set_locale_and_encoding(void)
+{
+ PGconn *conn_new_template1;
+ char *datcollate_literal;
+ char *datctype_literal;
+ char *daticulocale_literal = NULL;
+ DbLocaleInfo *locale = old_cluster.template0;
+
+ prep_status("Setting locale and encoding for new cluster");
+
+ /* escape literals with respect to new cluster */
+ conn_new_template1 = connectToServer(&new_cluster, "template1");
+
+ datcollate_literal = PQescapeLiteral(conn_new_template1,
+ locale->db_collate,
+ strlen(locale->db_collate));
+ datctype_literal = PQescapeLiteral(conn_new_template1,
+ locale->db_ctype,
+ strlen(locale->db_ctype));
+ if (locale->db_iculocale)
+ daticulocale_literal = PQescapeLiteral(conn_new_template1,
+ locale->db_iculocale,
+ strlen(locale->db_iculocale));
+ else
+ daticulocale_literal = pg_strdup("NULL");
+
+ /* update template0 in new cluster */
+ if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500)
+ PQclear(executeQueryOrDie(conn_new_template1,
+ "UPDATE pg_catalog.pg_database "
+ " SET encoding = %d, "
+ " datlocprovider = '%c', "
+ " datcollate = %s, "
+ " datctype = %s, "
+ " daticulocale = %s "
+ " WHERE datname = 'template0' ",
+ locale->db_encoding,
+ locale->db_collprovider,
+ datcollate_literal,
+ datctype_literal,
+ daticulocale_literal));
+ else
+ PQclear(executeQueryOrDie(conn_new_template1,
+ "UPDATE pg_catalog.pg_database "
+ " SET encoding = %d, "
+ " datcollate = %s, "
+ " datctype = %s "
+ " WHERE datname = 'template0' ",
+ locale->db_encoding,
+ datcollate_literal,
+ datctype_literal));
+
+ PQfreemem(datcollate_literal);
+ PQfreemem(datctype_literal);
+ PQfreemem(daticulocale_literal);
+
+ PQfinish(conn_new_template1);
+
+ check_ok();
+}
+
+
+static void
+prepare_new_cluster(void)
+{
+ /*
+ * It would make more sense to freeze after loading the schema, but that
+ * would cause us to lose the frozenxids restored by the load. We use
+ * --analyze so autovacuum doesn't update statistics later
+ */
+ prep_status("Analyzing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --analyze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+
+ /*
+ * We do freeze after analyze so pg_statistic is also frozen. template0 is
+ * not frozen here, but data rows were frozen by initdb, and we set its
+ * datfrozenxid, relfrozenxids, and relminmxid later to match the new xid
+ * counter later.
+ */
+ prep_status("Freezing all rows in the new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/vacuumdb\" %s --all --freeze %s",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.verbose ? "--verbose" : "");
+ check_ok();
+}
+
+
+static void
+prepare_new_globals(void)
+{
+ /*
+ * Before we restore anything, set frozenxids of initdb-created tables.
+ */
+ set_frozenxids(false);
+
+ /*
+ * Now restore global objects (roles and tablespaces).
+ */
+ prep_status("Restoring global objects in the new cluster");
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/psql\" " EXEC_PSQL_ARGS " %s -f \"%s/%s\"",
+ new_cluster.bindir, cluster_conn_opts(&new_cluster),
+ log_opts.dumpdir,
+ GLOBALS_DUMP_FILE);
+ check_ok();
+}
+
+
+static void
+create_new_objects(void)
+{
+ int dbnum;
+
+ prep_status_progress("Restoring database schemas in the new cluster");
+
+ /*
+ * We cannot process the template1 database concurrently with others,
+ * because when it's transiently dropped, connection attempts would fail.
+ * So handle it in a separate non-parallelized pass.
+ */
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Process only template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") != 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * template1 database will already exist in the target installation,
+ * so tell pg_restore to drop and recreate it; otherwise we would fail
+ * to propagate its database-level properties.
+ */
+ create_opts = "--clean --create";
+
+ exec_prog(log_file_name,
+ NULL,
+ true,
+ true,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname postgres \"%s/%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ log_opts.dumpdir,
+ sql_file_name);
+
+ break; /* done once we've processed template1 */
+ }
+
+ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
+ {
+ char sql_file_name[MAXPGPATH],
+ log_file_name[MAXPGPATH];
+ DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum];
+ const char *create_opts;
+
+ /* Skip template1 in this pass */
+ if (strcmp(old_db->db_name, "template1") == 0)
+ continue;
+
+ pg_log(PG_STATUS, "%s", old_db->db_name);
+ snprintf(sql_file_name, sizeof(sql_file_name), DB_DUMP_FILE_MASK, old_db->db_oid);
+ snprintf(log_file_name, sizeof(log_file_name), DB_DUMP_LOG_FILE_MASK, old_db->db_oid);
+
+ /*
+ * postgres database will already exist in the target installation, so
+ * tell pg_restore to drop and recreate it; otherwise we would fail to
+ * propagate its database-level properties.
+ */
+ if (strcmp(old_db->db_name, "postgres") == 0)
+ create_opts = "--clean --create";
+ else
+ create_opts = "--create";
+
+ parallel_exec_prog(log_file_name,
+ NULL,
+ "\"%s/pg_restore\" %s %s --exit-on-error --verbose "
+ "--dbname template1 \"%s/%s\"",
+ new_cluster.bindir,
+ cluster_conn_opts(&new_cluster),
+ create_opts,
+ log_opts.dumpdir,
+ sql_file_name);
+ }
+
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+
+ end_progress_output();
+ check_ok();
+
+ /*
+ * We don't have minmxids for databases or relations in pre-9.3 clusters,
+ * so set those after we have restored the schema.
+ */
+ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 902)
+ set_frozenxids(true);
+
+ /* update new_cluster info now that we have objects in the databases */
+ get_db_and_rel_infos(&new_cluster);
+}
+
+/*
+ * Delete the given subdirectory contents from the new cluster
+ */
+static void
+remove_new_subdir(const char *subdir, bool rmtopdir)
+{
+ char new_path[MAXPGPATH];
+
+ prep_status("Deleting files from new %s", subdir);
+
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, subdir);
+ if (!rmtree(new_path, rmtopdir))
+ pg_fatal("could not delete directory \"%s\"", new_path);
+
+ check_ok();
+}
+
+/*
+ * Copy the files from the old cluster into it
+ */
+static void
+copy_subdir_files(const char *old_subdir, const char *new_subdir)
+{
+ char old_path[MAXPGPATH];
+ char new_path[MAXPGPATH];
+
+ remove_new_subdir(new_subdir, true);
+
+ snprintf(old_path, sizeof(old_path), "%s/%s", old_cluster.pgdata, old_subdir);
+ snprintf(new_path, sizeof(new_path), "%s/%s", new_cluster.pgdata, new_subdir);
+
+ prep_status("Copying old %s to new server", old_subdir);
+
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+#ifndef WIN32
+ "cp -Rf \"%s\" \"%s\"",
+#else
+ /* flags: everything, no confirm, quiet, overwrite read-only */
+ "xcopy /e /y /q /r \"%s\" \"%s\\\"",
+#endif
+ old_path, new_path);
+
+ check_ok();
+}
+
+static void
+copy_xact_xlog_xid(void)
+{
+ /*
+ * Copy old commit logs to new data dir. pg_clog has been renamed to
+ * pg_xact in post-10 clusters.
+ */
+ copy_subdir_files(GET_MAJOR_VERSION(old_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact",
+ GET_MAJOR_VERSION(new_cluster.major_version) <= 906 ?
+ "pg_clog" : "pg_xact");
+
+ prep_status("Setting oldest XID for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -u %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_oldstxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /* set the next transaction id and epoch of the new cluster */
+ prep_status("Setting next transaction ID and epoch for new cluster");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -x %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -e %u \"%s\"",
+ new_cluster.bindir, old_cluster.controldata.chkpnt_nxtepoch,
+ new_cluster.pgdata);
+ /* must reset commit timestamp limits also */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -f -c %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtxid,
+ old_cluster.controldata.chkpnt_nxtxid,
+ new_cluster.pgdata);
+ check_ok();
+
+ /*
+ * If the old server is before the MULTIXACT_FORMATCHANGE_CAT_VER change
+ * (see pg_upgrade.h) and the new server is after, then we don't copy
+ * pg_multixact files, but we need to reset pg_control so that the new
+ * server doesn't attempt to read multis older than the cutoff value.
+ */
+ if (old_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER &&
+ new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ copy_subdir_files("pg_multixact/offsets", "pg_multixact/offsets");
+ copy_subdir_files("pg_multixact/members", "pg_multixact/members");
+
+ prep_status("Setting next multixact ID and offset for new cluster");
+
+ /*
+ * we preserve all files and contents, so we must preserve both "next"
+ * counters here and the oldest multi present on system.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -O %u -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmxoff,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ old_cluster.controldata.chkpnt_oldstMulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+ else if (new_cluster.controldata.cat_ver >= MULTIXACT_FORMATCHANGE_CAT_VER)
+ {
+ /*
+ * Remove offsets/0000 file created by initdb that no longer matches
+ * the new multi-xid value. "members" starts at zero so no need to
+ * remove it.
+ */
+ remove_new_subdir("pg_multixact/offsets", false);
+
+ prep_status("Setting oldest multixact ID in new cluster");
+
+ /*
+ * We don't preserve files in this case, but it's important that the
+ * oldest multi is set to the latest value used by the old system, so
+ * that multixact.c returns the empty set for multis that might be
+ * present on disk. We set next multi to the value following that; it
+ * might end up wrapped around (i.e. 0) if the old cluster had
+ * next=MaxMultiXactId, but multixact.c can cope with that just fine.
+ */
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ "\"%s/pg_resetwal\" -m %u,%u \"%s\"",
+ new_cluster.bindir,
+ old_cluster.controldata.chkpnt_nxtmulti + 1,
+ old_cluster.controldata.chkpnt_nxtmulti,
+ new_cluster.pgdata);
+ check_ok();
+ }
+
+ /* now reset the wal archives in the new cluster */
+ prep_status("Resetting WAL archives");
+ exec_prog(UTILITY_LOG_FILE, NULL, true, true,
+ /* use timeline 1 to match controldata and no WAL history file */
+ "\"%s/pg_resetwal\" -l 00000001%s \"%s\"", new_cluster.bindir,
+ old_cluster.controldata.nextxlogfile + 8,
+ new_cluster.pgdata);
+ check_ok();
+}
+
+
+/*
+ * set_frozenxids()
+ *
+ * This is called on the new cluster before we restore anything, with
+ * minmxid_only = false. Its purpose is to ensure that all initdb-created
+ * vacuumable tables have relfrozenxid/relminmxid matching the old cluster's
+ * xid/mxid counters. We also initialize the datfrozenxid/datminmxid of the
+ * built-in databases to match.
+ *
+ * As we create user tables later, their relfrozenxid/relminmxid fields will
+ * be restored properly by the binary-upgrade restore script. Likewise for
+ * user-database datfrozenxid/datminmxid. However, if we're upgrading from a
+ * pre-9.3 database, which does not store per-table or per-DB minmxid, then
+ * the relminmxid/datminmxid values filled in by the restore script will just
+ * be zeroes.
+ *
+ * Hence, with a pre-9.3 source database, a second call occurs after
+ * everything is restored, with minmxid_only = true. This pass will
+ * initialize all tables and databases, both those made by initdb and user
+ * objects, with the desired minmxid value. frozenxid values are left alone.
+ */
+static void
+set_frozenxids(bool minmxid_only)
+{
+ int dbnum;
+ PGconn *conn,
+ *conn_template1;
+ PGresult *dbres;
+ int ntups;
+ int i_datname;
+ int i_datallowconn;
+
+ if (!minmxid_only)
+ prep_status("Setting frozenxid and minmxid counters in new cluster");
+ else
+ prep_status("Setting minmxid counter in new cluster");
+
+ conn_template1 = connectToServer(&new_cluster, "template1");
+
+ if (!minmxid_only)
+ /* 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,
+ "UPDATE pg_catalog.pg_database "
+ "SET datminmxid = '%u'",
+ old_cluster.controldata.chkpnt_nxtmulti));
+
+ /* get database names */
+ dbres = executeQueryOrDie(conn_template1,
+ "SELECT datname, datallowconn "
+ "FROM pg_catalog.pg_database");
+
+ i_datname = PQfnumber(dbres, "datname");
+ i_datallowconn = PQfnumber(dbres, "datallowconn");
+
+ ntups = PQntuples(dbres);
+ for (dbnum = 0; dbnum < ntups; dbnum++)
+ {
+ char *datname = PQgetvalue(dbres, dbnum, i_datname);
+ char *datallowconn = PQgetvalue(dbres, dbnum, i_datallowconn);
+
+ /*
+ * We must update databases where datallowconn = false, e.g.
+ * template0, because autovacuum increments their datfrozenxids,
+ * relfrozenxids, and relminmxid even if autovacuum is turned off, and
+ * even though all the data rows are already frozen. To enable this,
+ * we temporarily change datallowconn.
+ */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = true",
+ quote_identifier(datname)));
+
+ conn = connectToServer(&new_cluster, datname);
+
+ if (!minmxid_only)
+ /* 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,
+ "UPDATE pg_catalog.pg_class "
+ "SET relminmxid = '%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_nxtmulti));
+ PQfinish(conn);
+
+ /* Reset datallowconn flag */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(conn_template1,
+ "ALTER DATABASE %s ALLOW_CONNECTIONS = false",
+ quote_identifier(datname)));
+ }
+
+ PQclear(dbres);
+
+ PQfinish(conn_template1);
+
+ check_ok();
+}
diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h
new file mode 100644
index 0000000..7afa967
--- /dev/null
+++ b/src/bin/pg_upgrade/pg_upgrade.h
@@ -0,0 +1,473 @@
+/*
+ * pg_upgrade.h
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/pg_upgrade.h
+ */
+
+#include <unistd.h>
+#include <assert.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include "common/relpath.h"
+#include "libpq-fe.h"
+
+/* For now, pg_upgrade does not use common/logging.c; use our own pg_fatal */
+#undef pg_fatal
+
+/* Use port in the private/dynamic port number range */
+#define DEF_PGUPORT 50432
+
+#define MAX_STRING 1024
+#define QUERY_ALLOC 8192
+
+#define MESSAGE_WIDTH 62
+
+#define GET_MAJOR_VERSION(v) ((v) / 100)
+
+/* contains both global db information and CREATE DATABASE commands */
+#define GLOBALS_DUMP_FILE "pg_upgrade_dump_globals.sql"
+#define DB_DUMP_FILE_MASK "pg_upgrade_dump_%u.custom"
+
+/*
+ * Base directories that include all the files generated internally, from the
+ * root path of the new cluster. The paths are dynamically built as of
+ * BASE_OUTPUTDIR/$timestamp/{LOG_OUTPUTDIR,DUMP_OUTPUTDIR} to ensure their
+ * uniqueness in each run.
+ */
+#define BASE_OUTPUTDIR "pg_upgrade_output.d"
+#define LOG_OUTPUTDIR "log"
+#define DUMP_OUTPUTDIR "dump"
+
+#define DB_DUMP_LOG_FILE_MASK "pg_upgrade_dump_%u.log"
+#define SERVER_LOG_FILE "pg_upgrade_server.log"
+#define UTILITY_LOG_FILE "pg_upgrade_utility.log"
+#define INTERNAL_LOG_FILE "pg_upgrade_internal.log"
+
+extern char *output_files[];
+
+/*
+ * WIN32 files do not accept writes from multiple processes
+ *
+ * On Win32, we can't send both pg_upgrade output and command output to the
+ * same file because we get the error: "The process cannot access the file
+ * because it is being used by another process." so send the pg_ctl
+ * command-line output to a new file, rather than into the server log file.
+ * Ideally we could use UTILITY_LOG_FILE for this, but some Windows platforms
+ * keep the pg_ctl output file open by the running postmaster, even after
+ * pg_ctl exits.
+ *
+ * We could use the Windows pgwin32_open() flags to allow shared file
+ * writes but is unclear how all other tools would use those flags, so
+ * we just avoid it and log a little differently on Windows; we adjust
+ * the error message appropriately.
+ */
+#ifndef WIN32
+#define SERVER_START_LOG_FILE SERVER_LOG_FILE
+#define SERVER_STOP_LOG_FILE SERVER_LOG_FILE
+#else
+#define SERVER_START_LOG_FILE "pg_upgrade_server_start.log"
+/*
+ * "pg_ctl start" keeps SERVER_START_LOG_FILE and SERVER_LOG_FILE open
+ * while the server is running, so we use UTILITY_LOG_FILE for "pg_ctl
+ * stop".
+ */
+#define SERVER_STOP_LOG_FILE UTILITY_LOG_FILE
+#endif
+
+
+#ifndef WIN32
+#define pg_mv_file rename
+#define PATH_SEPARATOR '/'
+#define PATH_QUOTE '\''
+#define RM_CMD "rm -f"
+#define RMDIR_CMD "rm -rf"
+#define SCRIPT_PREFIX "./"
+#define SCRIPT_EXT "sh"
+#define ECHO_QUOTE "'"
+#define ECHO_BLANK ""
+#else
+#define pg_mv_file pgrename
+#define PATH_SEPARATOR '\\'
+#define PATH_QUOTE '"'
+/* @ prefix disables command echo in .bat files */
+#define RM_CMD "@DEL /q"
+#define RMDIR_CMD "@RMDIR /s/q"
+#define SCRIPT_PREFIX ""
+#define SCRIPT_EXT "bat"
+#define EXE_EXT ".exe"
+#define ECHO_QUOTE ""
+#define ECHO_BLANK "."
+#endif
+
+
+/*
+ * The format of visibility map was changed with this 9.6 commit.
+ */
+#define VISIBILITY_MAP_FROZEN_BIT_CAT_VER 201603011
+
+/*
+ * pg_multixact format changed in 9.3 commit 0ac5ad5134f2769ccbaefec73844f85,
+ * ("Improve concurrency of foreign key locking") which also updated catalog
+ * version to this value. pg_upgrade behavior depends on whether old and new
+ * server versions are both newer than this, or only the new one is.
+ */
+#define MULTIXACT_FORMATCHANGE_CAT_VER 201301231
+
+/*
+ * large object chunk size added to pg_controldata,
+ * commit 5f93c37805e7485488480916b4585e098d3cc883
+ */
+#define LARGE_OBJECT_SIZE_PG_CONTROL_VER 942
+
+/*
+ * change in JSONB format during 9.4 beta
+ */
+#define JSONB_FORMAT_CHANGE_CAT_VER 201409291
+
+
+/*
+ * Each relation is represented by a relinfo structure.
+ */
+typedef struct
+{
+ /* Can't use NAMEDATALEN; not guaranteed to be same on client */
+ char *nspname; /* namespace name */
+ char *relname; /* relation name */
+ Oid reloid; /* relation OID */
+ RelFileNumber relfilenumber; /* relation file number */
+ Oid indtable; /* if index, OID of its table, else 0 */
+ Oid toastheap; /* if toast table, OID of base table, else 0 */
+ char *tablespace; /* tablespace path; "" for cluster default */
+ bool nsp_alloc; /* should nspname be freed? */
+ bool tblsp_alloc; /* should tablespace be freed? */
+} RelInfo;
+
+typedef struct
+{
+ RelInfo *rels;
+ int nrels;
+} RelInfoArr;
+
+/*
+ * The following structure represents a relation mapping.
+ */
+typedef struct
+{
+ const char *old_tablespace;
+ const char *new_tablespace;
+ const char *old_tablespace_suffix;
+ const char *new_tablespace_suffix;
+ Oid db_oid;
+ RelFileNumber relfilenumber;
+ /* the rest are used only for logging and error reporting */
+ char *nspname; /* namespaces */
+ char *relname;
+} FileNameMap;
+
+/*
+ * Structure to store database information
+ */
+typedef struct
+{
+ Oid db_oid; /* oid of the database */
+ char *db_name; /* database name */
+ char db_tablespace[MAXPGPATH]; /* database default tablespace
+ * path */
+ RelInfoArr rel_arr; /* array of all user relinfos */
+} DbInfo;
+
+/*
+ * Locale information about a database.
+ */
+typedef struct
+{
+ char *db_collate;
+ char *db_ctype;
+ char db_collprovider;
+ char *db_iculocale;
+ int db_encoding;
+} DbLocaleInfo;
+
+typedef struct
+{
+ DbInfo *dbs; /* array of db infos */
+ int ndbs; /* number of db infos */
+} DbInfoArr;
+
+/*
+ * The following structure is used to hold pg_control information.
+ * Rather than using the backend's control structure we use our own
+ * structure to avoid pg_control version issues between releases.
+ */
+typedef struct
+{
+ uint32 ctrl_ver;
+ uint32 cat_ver;
+ char nextxlogfile[25];
+ uint32 chkpnt_nxtxid;
+ uint32 chkpnt_nxtepoch;
+ uint32 chkpnt_nxtoid;
+ uint32 chkpnt_nxtmulti;
+ uint32 chkpnt_nxtmxoff;
+ uint32 chkpnt_oldstMulti;
+ uint32 chkpnt_oldstxid;
+ uint32 align;
+ uint32 blocksz;
+ uint32 largesz;
+ uint32 walsz;
+ uint32 walseg;
+ uint32 ident;
+ uint32 index;
+ uint32 toast;
+ uint32 large_object;
+ bool date_is_int;
+ bool float8_pass_by_value;
+ uint32 data_checksum_version;
+} ControlData;
+
+/*
+ * Enumeration to denote transfer modes
+ */
+typedef enum
+{
+ TRANSFER_MODE_CLONE,
+ TRANSFER_MODE_COPY,
+ TRANSFER_MODE_LINK
+} transferMode;
+
+/*
+ * Enumeration to denote pg_log modes
+ */
+typedef enum
+{
+ PG_VERBOSE,
+ PG_STATUS, /* these messages do not get a newline added */
+ PG_REPORT_NONL, /* these too */
+ PG_REPORT,
+ PG_WARNING,
+ PG_FATAL
+} eLogType;
+
+
+/*
+ * cluster
+ *
+ * information about each cluster
+ */
+typedef struct
+{
+ ControlData controldata; /* pg_control information */
+ DbLocaleInfo *template0; /* template0 locale info */
+ DbInfoArr dbarr; /* dbinfos array */
+ char *pgdata; /* pathname for cluster's $PGDATA directory */
+ char *pgconfig; /* pathname for cluster's config file
+ * directory */
+ char *bindir; /* pathname for cluster's executable directory */
+ char *pgopts; /* options to pass to the server, like pg_ctl
+ * -o */
+ char *sockdir; /* directory for Unix Domain socket, if any */
+ unsigned short port; /* port number where postmaster is waiting */
+ uint32 major_version; /* PG_VERSION of cluster */
+ char major_version_str[64]; /* string PG_VERSION of cluster */
+ uint32 bin_version; /* version returned from pg_ctl */
+ const char *tablespace_suffix; /* directory specification */
+} ClusterInfo;
+
+
+/*
+ * LogOpts
+*/
+typedef struct
+{
+ FILE *internal; /* internal log FILE */
+ bool verbose; /* true -> be verbose in messages */
+ bool retain; /* retain log files on success */
+ /* Set of internal directories for output files */
+ char *rootdir; /* Root directory, aka pg_upgrade_output.d */
+ char *basedir; /* Base output directory, with timestamp */
+ char *dumpdir; /* Dumps */
+ char *logdir; /* Log files */
+ bool isatty; /* is stdout a tty */
+} LogOpts;
+
+
+/*
+ * UserOpts
+*/
+typedef struct
+{
+ bool check; /* true -> ask user for permission to make
+ * changes */
+ bool do_sync; /* flush changes to disk */
+ transferMode transfer_mode; /* copy files or link them? */
+ int jobs; /* number of processes/threads to use */
+ char *socketdir; /* directory to use for Unix sockets */
+} UserOpts;
+
+typedef struct
+{
+ char *name;
+ int dbnum;
+} LibraryInfo;
+
+/*
+ * OSInfo
+ */
+typedef struct
+{
+ const char *progname; /* complete pathname for this program */
+ char *user; /* username for clusters */
+ bool user_specified; /* user specified on command-line */
+ char **old_tablespaces; /* tablespaces */
+ int num_old_tablespaces;
+ LibraryInfo *libraries; /* loadable libraries */
+ int num_libraries;
+ ClusterInfo *running_cluster;
+} OSInfo;
+
+
+/*
+ * Global variables
+ */
+extern LogOpts log_opts;
+extern UserOpts user_opts;
+extern ClusterInfo old_cluster,
+ new_cluster;
+extern OSInfo os_info;
+
+
+/* check.c */
+
+void output_check_banner(bool live_check);
+void check_and_dump_old_cluster(bool live_check);
+void check_new_cluster(void);
+void report_clusters_compatible(void);
+void issue_warnings_and_set_wal_level(void);
+void output_completion_banner(char *deletion_script_file_name);
+void check_cluster_versions(void);
+void check_cluster_compatibility(bool live_check);
+void create_script_for_old_cluster_deletion(char **deletion_script_file_name);
+
+
+/* controldata.c */
+
+void get_control_data(ClusterInfo *cluster, bool live_check);
+void check_control_data(ControlData *oldctrl, ControlData *newctrl);
+void disable_old_cluster(void);
+
+
+/* dump.c */
+
+void generate_old_dump(void);
+
+
+/* exec.c */
+
+#define EXEC_PSQL_ARGS "--echo-queries --set ON_ERROR_STOP=on --no-psqlrc --dbname=template1"
+
+bool exec_prog(const char *log_filename, const char *opt_log_file,
+ bool report_error, bool exit_on_error, const char *fmt,...) pg_attribute_printf(5, 6);
+void verify_directories(void);
+bool pid_lock_file_exists(const char *datadir);
+
+
+/* file.c */
+
+void cloneFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void copyFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void linkFile(const char *src, const char *dst,
+ const char *schemaName, const char *relName);
+void rewriteVisibilityMap(const char *fromfile, const char *tofile,
+ const char *schemaName, const char *relName);
+void check_file_clone(void);
+void check_hard_link(void);
+
+/* fopen_priv() is no longer different from fopen() */
+#define fopen_priv(path, mode) fopen(path, mode)
+
+/* function.c */
+
+void get_loadable_libraries(void);
+void check_loadable_libraries(void);
+
+/* info.c */
+
+FileNameMap *gen_db_file_maps(DbInfo *old_db,
+ DbInfo *new_db, int *nmaps, const char *old_pgdata,
+ const char *new_pgdata);
+void get_db_and_rel_infos(ClusterInfo *cluster);
+
+/* option.c */
+
+void parseCommandLine(int argc, char *argv[]);
+void adjust_data_dir(ClusterInfo *cluster);
+void get_sock_dir(ClusterInfo *cluster, bool live_check);
+
+/* relfilenumber.c */
+
+void transfer_all_new_tablespaces(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata);
+void transfer_all_new_dbs(DbInfoArr *old_db_arr,
+ DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+
+/* tablespace.c */
+
+void init_tablespaces(void);
+
+
+/* server.c */
+
+PGconn *connectToServer(ClusterInfo *cluster, const char *db_name);
+PGresult *executeQueryOrDie(PGconn *conn, const char *fmt,...) pg_attribute_printf(2, 3);
+
+char *cluster_conn_opts(ClusterInfo *cluster);
+
+bool start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error);
+void stop_postmaster(bool in_atexit);
+uint32 get_major_server_version(ClusterInfo *cluster);
+void check_pghost_envvar(void);
+
+
+/* util.c */
+
+char *quote_identifier(const char *s);
+int get_user_info(char **user_name_p);
+void check_ok(void);
+void report_status(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
+void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
+void end_progress_output(void);
+void cleanup_output_dirs(void);
+void prep_status(const char *fmt,...) pg_attribute_printf(1, 2);
+void prep_status_progress(const char *fmt,...) pg_attribute_printf(1, 2);
+unsigned int str2uint(const char *str);
+
+
+/* version.c */
+
+bool check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path);
+bool check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path);
+void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster);
+void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster);
+void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster,
+ bool check_mode);
+
+void old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster);
+void report_extension_updates(ClusterInfo *cluster);
+
+/* parallel.c */
+void parallel_exec_prog(const char *log_file, const char *opt_log_file,
+ const char *fmt,...) pg_attribute_printf(3, 4);
+void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata,
+ char *old_tablespace);
+bool reap_child(bool wait_for_child);
diff --git a/src/bin/pg_upgrade/po/LINGUAS b/src/bin/pg_upgrade/po/LINGUAS
new file mode 100644
index 0000000..4777c84
--- /dev/null
+++ b/src/bin/pg_upgrade/po/LINGUAS
@@ -0,0 +1 @@
+cs de es fr ja ka ko ru sv tr uk zh_CN zh_TW
diff --git a/src/bin/pg_upgrade/po/cs.po b/src/bin/pg_upgrade/po/cs.po
new file mode 100644
index 0000000..06698c5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/cs.po
@@ -0,0 +1,1804 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2020-10-31 16:15+0000\n"
+"PO-Revision-Date: 2021-09-16 09:14+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.1\n"
+
+#: check.c:67
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence na Starém Live Serveru\n"
+"----------------------------------------------------\n"
+
+#: check.c:73
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Provádím Kontrolu Konzistence\n"
+"-----------------------------\n"
+
+#: check.c:193
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Clustery jsou kompatibilní*\n"
+
+#: check.c:199
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Pokud pg_upgrade selže po tomto místě, musíte reinicializovat\n"
+"(initdb) nový cluster než budete pokračovat.\n"
+
+#: check.c:233
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Statistiky optimalizéru nejsou zachovány při pg_upgrade,\n"
+"takže po nastartování nového serveru zvažte spuštění:\n"
+" %s\n"
+"\n"
+
+#: check.c:239
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Spuštění tohoto skriptu smaže datové soubory starého clusteru:\n"
+" %s\n"
+
+#: check.c:244
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Nelze vytvořit skript pro smazání datových souborů starého cluster\n"
+"protože uživatelem definované tablespaces nebo datový adresář nového\n"
+"clusteru jsou v adresáři starého clusteru. Obsah starého clusteru musí\n"
+"být smazán manuálně.\n"
+
+#: check.c:254
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontroluji verze clusterů"
+
+#: check.c:266
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Tato utilita může upgradovat pouze z PostgreSQL verze 8.4 a novějších.\n"
+
+#: check.c:270
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Tato utilita může upgradovat pouze na PostgreSQL verze %s.\n"
+
+#: check.c:279
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "Tato utilita nemůže být použita pro downgrade na starší major PostgreSQL verze.\n"
+
+#: check.c:284
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře starého clusteru jsou z jiných major verzí.\n"
+
+#: check.c:287
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Data a binární adresáře nového clusteru jsou z různých minárních verzí.\n"
+
+#: check.c:304
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "Při kontrole pre-PG 9.1 živého starého serveru, musíte zadat číslo portu starého serveru.\n"
+
+#: check.c:308
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Při kontrole živého serveru, staré a nové číslo portu musí být různá.\n"
+
+#: check.c:323
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "kódování databáze \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:328
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_collate hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:331
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "lc_ctype hodnoty pro databázi \"%s\" neodpovídají: stará \"%s\", nová \"%s\"\n"
+
+#: check.c:404
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "Databáze \"%s\" na novém clusteru není prázdná: nalezena relace \"%s.%s\"\n"
+
+#: check.c:453
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Vytvářím skript pro analyze nového clusteru"
+
+#: check.c:467 check.c:626 check.c:890 check.c:969 check.c:1079 check.c:1170
+#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199
+#: version.c:341
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "nelze otevřít soubor \"%s\": %s\n"
+
+#: check.c:515 check.c:682
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "nelze přidat právo na spuštění pro soubor \"%s\": %s\n"
+
+#: check.c:545
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Kontroluji tablespace adresáře v novém clusteru"
+
+#: check.c:556
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "tablespace adresář v novém clusteru již existuje \"%s\"\n"
+
+#: check.c:589
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÁNÍ: nový datový adresář by neměl být ve starém datovém adresáři, e.g. %s\n"
+
+#: check.c:613
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"VAROVÁNÍ: umístění uživatelem definovaných tablespaces by neměly být v datovém adresáři, e.g. %s\n"
+
+#: check.c:623
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Vytvářím skript pro smazání starého clusteru"
+
+#: check.c:702
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontroluji že databázový uživatel je použit pro instalaci"
+
+#: check.c:718
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "databázový uživatel \"%s\" nebyl použit pro instalaci\n"
+
+#: check.c:729
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "nelže určit počet uživatelů\n"
+
+#: check.c:737
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Pouze instalační uživatel může být definován pro nový cluster.\n"
+
+#: check.c:757
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontroluji nastavení databázového spojení"
+
+#: check.c:779
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 nesmí povolovat spojení, i.e. příslušná hodnota pg_database.datallowconn musí být false\n"
+
+#: check.c:789
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "Všechny non-template0 databáze musí povolovat spojení, i.e. jejich pg_database.datallowconn musí být true\n"
+
+#: check.c:814
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Kontroluji prepared transakce"
+
+#: check.c:823
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Zdrojový cluster obsahuje prepared transakce\n"
+
+#: check.c:825
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Cílový cluster obsahuje prepared transakce\n"
+
+#: check.c:851
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Kontroluji contrib/isn s bigint-passing rozdílem"
+
+#: check.c:912 check.c:991 check.c:1102 check.c:1193 function.c:262
+#: version.c:245 version.c:282 version.c:425
+#, c-format
+msgid "fatal\n"
+msgstr "fatal\n"
+
+#: check.c:913
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"contrib/isn\" funkce které spoléhají na\n"
+"bigint datový typ. Váš starý a nový cluster předávají bigint hodnoty\n"
+"rozdílně takže tento cluster aktuálně nelze upgradovat. Můžete manuálně\n"
+"upgradovat databáze které používají \"contrib/isn\" prostředky a odstranit\n"
+"\"contrib/isn\" ze starého clusteru a znovu spustit upgrade. Seznam\n"
+"problematických funkcí je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:937
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Kontrola tabulek s WITH OIDS"
+
+#: check.c:992
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje tabulky deklarované s WITH OIDS, což již nadále není podporováno.\n"
+"Zvažte odstranění oid sloupce pomocí\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Seznam tabulek s tímto problémem je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1022
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kontroluji reg* datové typy v uživatelských tabulkách"
+
+#: check.c:1103
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the\n"
+"problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje některý z reg* datových typů v uživatelských\n"
+"tabulkách. Tyto datové typy odkazují na systémové OID hodnoty které\n"
+"nejsou zachovány při pg_upgrade, takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit\n"
+"upgrade. Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1128
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Kontroluji nekompatibilní \"jsonb\" datový typ"
+
+#: check.c:1194
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can remove the problem\n"
+"tables and restart the upgrade. A list of the problem columns is\n"
+"in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"jsonb\" datový typ v uživatelských tabulkách.\n"
+"Interní formát \"jsonb\" se změnil v 9.4 beta takže tento cluster aktuálně nelze\n"
+"upgradovat. Můžete odstranit problematické tabulky a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: check.c:1216
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Kontroluji existenci rolí začínajících na \"pg_\""
+
+#: check.c:1226
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Zdrojový cluster obsahuje role začínající na \"pg_\"\n"
+
+#: check.c:1228
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Cílový cluster obsahuje role začínající na \"pg_\"\n"
+
+#: check.c:1254
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "selhalo získání aktuální hodnoty locale\n"
+
+#: check.c:1263
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "selhalo získání jména systémové locale pro \"%s\"\n"
+
+#: check.c:1269
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "selhala obnova staré locale \"%s\"\n"
+
+#: controldata.c:127 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "nelze získat control data pomocí %s: %s\n"
+
+#: controldata.c:138
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: problém se stavem databázového clusteru\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Zdrojový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Cílový cluster byl vypnut v recovery módu. Pro upgrade použijte \"rsync\" jak je uvedeno v dokumentaci nebo ho vypněte jako primary.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Zdrojový cluster nebyl zastaven čistě.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Cílový cluster nebyl zastaven čistě.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Cílový cluster postrádá některé nutné informace o stavu:\n"
+
+#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375
+#: relfilenode.c:243 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal problem\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata retrieval problem\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Zdrojový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Cílový cluster postrádá některé nutné control informace:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " další XID checkpointu\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " další OID posledního checkpointu\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " další MultiXactId posledního checkpointu\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " nejstarší MultiXactId posledního checkpointu\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " MultiXactOffset posledního checkpointu\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " první WAL segment po resets\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " metoda předávání float8 argumentů\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " maximální alignment\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " velikost bloku\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " velikost segmentu velkých relací\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " velikost WAL bloku\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " velikost WAL segmentu\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " maximální délka identifikátoru\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " maximální počet indexovaných sloupců\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " maximální velikost TOAST chunku\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " velikost large-object chunku\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " datum/čas jsou integery?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " verze datových kontrolních součtů\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Nelze pokračovat bez kontrolních informací, končím\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"stará a nová hodnota pg_controldata alignmentu jsou neplatné nebo se neshodují\n"
+"Pravděpodobně jeden z clusterů je 32-bitový a druhý je 64-bitový\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti segmentu relace jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL bloku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikost WAL segmentu jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální délky identifikátoru jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximálního počtu indexovaných sloupců jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata maximální velikosti TOAST chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "stará a nová hodnota pg_controldata velikosti large-object chunku jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "stará a nová hodnota pg_controldata typu pro datum/čas jsou neplatné nebo se neshodují\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "starý cluster nepoužívá data chechsums ale nový ano\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "starý cluster používá data chechsums ale nový nikoliv\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "verze kontrolních součtů na starém a novém clusteru se neshodují\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Přidávám \".old\" příponu ke starému global/pg_control souboru"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "Nelze přejmenovat %s na %s.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Pokud budete chtít nastartovat starý cluster, budete muset odstranit\n"
+"příponu \".old\" z %s/global/pg_control.old.\n"
+"Protože byl použit \"link\" mód, starý cluster nemůže být bezpečně\n"
+"spuštěn jakmile bude nastartován nový cluster.\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Vytvářím dump globálních objektů"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Vytvářím dump databázových schémat\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "nelze získat verzi pg_ctl pomocí %s: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "nelze získat výstup s pg_ctl verzí z %s\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "příkaz je příliš dlouhý\n"
+
+#: exec.c:110 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 option.c:217
+#, c-format
+msgid "could not open log file \"%s\": %m\n"
+msgstr "nelze otevřít logovací soubor \"%s\": %m\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*failure*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "Došlo k problémům při spuštění \"%s\"\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravděpodobnou příčinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\" nebo \"%s\".\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Pro pravděpodobnou příčinu selhání prozkoumejte posledních pár\n"
+"řádek z \"%s\".\n"
+
+#: exec.c:204 option.c:226
+#, c-format
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "nelze zapsat do log souboru \"%s\": %m\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "nelze otevřít soubor \"%s\" pro čtení: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Musíte mít práva na čtení a zápis v aktuálním adresáři.\n"
+
+#: exec.c:310 exec.c:372 exec.c:436
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "kontrola pro \"%s\" selhala: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" není adresář\n"
+
+#: exec.c:439
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "check for \"%s\" failed: not a regular file\n"
+
+#: exec.c:451
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze číst soubor (přístup odepřen)\n"
+
+#: exec.c:459
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "kontrola \"%s\" selhala: nelze spustit soubor (přístup odepřen)\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při klonování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při klonování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze otevřít soubor \"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze číst ze souboru \"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze zapsat do souboru \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při vytváření odkazů pro relaci \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "chyba při kopírování relace \"%s.%s\": nelze získat informace o souboru \"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "chyba při kopírování relace \"%s.%s\": částečně zapsaná stránka nalezena v souboru \"%s\"\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "nelze klonovat soubory mezi starým a novým datovým adresářem: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "nelze vytvořit soubor \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "klonování souborů na této platformě není podporováno\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"nelze vytvořit hard link mezi starým a novým datovým adresářem: %s\n"
+"V link módu musí být starý a nový datový adresář na stejném souborovém systému.\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The 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"
+msgstr ""
+"\n"
+"Starý cluster má \"plpython_call_handler\" funkci definovanou\n"
+"v \"public\" schématu což je duplicitní s tou definovanou v \"pg_catalog\"\n"
+"schématu. Ověřit to můžete spuštěním tohoto v psql:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Veze z \"public\" schématu byla vytvořena instalací plpython před 8.1,\n"
+"a musí být odstraněna aby pg_upgrade mohlo fungovat protože\n"
+"odkazuje na nyní zastaralý \"plpython\" sdílený objekt. Verzi z \"public\"\n"
+"schématu můžete odstranit spuštěním následujícího příkazu:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"v každé postižené databázi:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Pro pokračování ze starého clusteru odstraňte problematické funkce.\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontroluji dostupnost potřebných knihoven"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "nelze načíst knihovnu \"%s\": %s"
+
+#: function.c:253
+#, c-format
+msgid "In database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace odkazuje na knihovny které chybí v nové instalaci. Můtete\n"
+"je buď přidat do nové instalace, nebo odstranit funkce které je vyžadují ze\n"
+"staré instalace. Seznam problematických knihoven je v souboru:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "Názvy relace pro OID %u v databázi \"%s\" neodpovídají: staré jméno \"%s.%s\", nové jméno \"%s.%s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "Chyba při párování starých a nových tabulek v databázi \"%s\"\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " což je index na \"%s.%s\""
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " což je index na OID %u"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " což je TOAST tabulka pro \"%s.%s\""
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " což je TOAST tabulka pro OID %u"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "Ve starém clusteru nebyl nalezen odpovídající záznam pro novou relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "V novém clusteru nebyl nalezen odpovídající záznam pro relaci s OID %u v databázi \"%s\": %s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "mapování pro databázi \"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u na %u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"zdrojové databáze:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"cílové databáze:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "Databáze: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: nelze spouštět jako root\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "neplatné staré číslo portu\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "neplatné nové číslo portu\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Zkuste \"%s --help\" pro více informací.\n"
+
+#: option.c:214
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "příliš mnoho argumentů v příkazové řádce (první je \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Běží v módu s detailním (verbose) logováním.\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "binárky starého clusteru jsou umístěny"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "binárky nového clusteru jsou umístěny"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "data starého clusteru jsou umístěna"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "data nového clusteru jsou umístěna"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "sockety budou vytvořeny"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "nelze určit aktuální adresář\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "na Windows nelze spouštět pg_upgrade z datového adresáře nového clusteru\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade upgraduje PostgreSQL cluster na jinou major verzi.\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "Použití:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [VOLBA]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "Přepínače:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR adresář se spustitelnými soubory starého clusteru\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR adresář se spustitelnými soubory nového clusteru\n"
+" (výchozí hodnota je stejný adresář jako pg_upgrade)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check pouze kontroluje clustery, nemění žádná data\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR datový adresář starého clusteru\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR datový adresář nového clusteru\n"
+
+#: option.c:298
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM počet paralelních procesů nebo threadů\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link vytváří odkazy namísto kopírování souborů do nového clusteru\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=VOLBY volby pro starý cluster které se mají předat serveru\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=VOLBY volby pro nový cluster které se mají předat serveru\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT číslo portu pro starý cluster (implicitně %d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT číslo portu pro nový cluster (implicitně %d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain v případě úspěchu zachovat SQL a log soubory\n"
+
+#: option.c:305
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR adresář pro sockety (implicitně současný adresář)\n"
+"\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=JMÉNO superuživatel pro cluster (implicitně \"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose zapné podrobné interní logování\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version zobrazí informaci o verzi, poté skončí\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone klonuje namísto kopírování souborů do nového clusteru\n"
+"\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help zobrazí tuto nápovědu, poté skončí\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Před spuštěním pg_upgrade musíte:\n"
+" vytvořit nový databázový cluster (pomocí nové verze initdb)\n"
+" zastavit postmaster proces běžící nad starým clusterem\n"
+" zastavit postmaster proces běžízí nad novým clusterem\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Při spuštění pg_upgrade musíte zadat následující informace:\n"
+" datový adresář pro starý cluster (-d DATADIR)\n"
+" datový adresář pro nový cluster (-D DATADIR)\n"
+" \"bin\" adresář pro starou verzi (-b BINDIR)\n"
+" \"bin\" adresář pro novou verzi (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Například:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"nebo\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Chyby hlašte na <%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s domácí stránka: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"Musíte zadat adresář kde %s.\n"
+"Použijte prosím volbu %s na příkazové řádce nebo proměnnou prostředí %s.\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Vyhledávám skutečný datový adresář pro zdrojový cluster"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Vyhledávám skutečný datový adresář pro cílový cluster"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "nelze získat datový adresář pomocí %s: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "nelze načíst řádek %d ze souboru \"%s\": %s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "uživatelem-zadané číslo starého portu %hu opraveno na %hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "nelze vytvořit worker proces: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "nelze vytvořit worker thread: %s\n"
+
+#: parallel.c:300
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "volání waitpid() selhalo: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "podřízený proces abnormálně skončil: status %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "podřízený proces neočekávaně skončil: %s\n"
+
+#: pg_upgrade.c:108
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "nelze zjistit přístupová práva adresáře \"%s\": %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Provádím Upgrade\n"
+"----------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Nastavuji další OID pro nový cluster"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronizuji datový adresář na disk"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Upgrade Dokončen\n"
+"----------------\n"
+
+#: pg_upgrade.c:220
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: nelze najít vlastní spustitelný soubor\n"
+
+#: pg_upgrade.c:246
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad starým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:259
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Zdá se že postmaster nad novým clusterem stále běží.\n"
+"Prosím zastavte příslušný postmaster proces a zkuste to znovu.\n"
+
+#: pg_upgrade.c:273
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyzuji všechny řádky v novém clusteru"
+
+#: pg_upgrade.c:286
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Provádím freeze na všech řádcích v novém clusteru"
+
+#: pg_upgrade.c:306
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Obnovuji globální objekty v novém clusteru"
+
+#: pg_upgrade.c:321
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Obnovuji databázová schémata v novém clusteru\n"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Mažu soubory z nového %s"
+
+#: pg_upgrade.c:429
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "nelze smazat adresář \"%s\"\n"
+
+#: pg_upgrade.c:448
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopíruji starý %s do nového serveru"
+
+#: pg_upgrade.c:475
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Nastavuij následující transaction ID a epochu pro nový cluster"
+
+#: pg_upgrade.c:505
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Nastavuji následující multixact ID a offset pro nový cluster"
+
+#: pg_upgrade.c:529
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Nastavuji nejstarší multixact ID v novém clusteru"
+
+#: pg_upgrade.c:549
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resetuji WAL archivy"
+
+#: pg_upgrade.c:592
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Nastavuji frozenxid a minmxid v novém clusteru"
+
+#: pg_upgrade.c:594
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Nastavuji minmxid v novém clustreru"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "Klonuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kopíruji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Linkuji soubory pro uživatelské relace\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "stará databáze \"%s\" nenalezena v novém clusteru\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "chyba při kontrole existence souboru \"%s.%s\" (\"%s\" na \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "přepisuji \"%s\" na \"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "klonuji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "kopíruji \"%s\" do \"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "linkuji \"%s\" na \"%s\"\n"
+
+#: server.c:33
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "spojení do databáze selhalo: %s"
+
+#: server.c:39 server.c:141 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Chyba, končím\n"
+
+#: server.c:131
+#, c-format
+msgid "executing: %s\n"
+msgstr "spouštím: %s\n"
+
+#: server.c:137
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL příkaz selhal\n"
+"%s\n"
+"%s"
+
+#: server.c:167
+#, c-format
+msgid "could not open version file \"%s\": %m\n"
+msgstr "nelze otevřít soubor s verzí: \"%s\": %m\n"
+
+#: server.c:171
+#, c-format
+msgid "could not parse version file \"%s\"\n"
+msgstr "neplatný formát řetězce s verzí \"%s\"\n"
+
+#: server.c:297
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"spojení na databázi selhalo: %s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit ke zdrojovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"nelze se připojit k cílovému postmaster procesu příkazem:\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat zdrojový server, nebo selhal pokus o spojení\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl selhal při pokusu nastartovat cílový server, nebo selhal pokus o spojení\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "nedostatek paměti\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq proměnná prostředí %s má hodnotu odkazující na nelokální server: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Při použití tablespaces nelze provádět upgrade na/ze stejné verze\n"
+"systémových katalogů.\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "adresář pro tablespace \"%s\" neexistuje\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "nelze přistoupit k tablespace adresáři \"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "cesta k tabespace \"%s\" není adresář\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "Kontrola velkých objektů"
+
+#: version.c:77 version.c:384
+#, c-format
+msgid "warning"
+msgstr "varování"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům. Po upgrade vám bude poskytnut příkaz pro\n"
+"naplnění tabulky pg_largeobject_metadata s výchozími právy.\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje velké objekty. Nová databáze má další tabulku\n"
+"s právy k velkým objektům, takže pro všechny velké objekty musí být\n"
+"definována výchozí práva. Soubor\n"
+" %s\n"
+"po spuštění z psql pod superuživatelským účtem tato výchozí práva nastaví.\n"
+"\n"
+
+#: version.c:239
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Kontrola nekompatibilního \"line\" datového typu"
+
+#: version.c:246
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje datový typ \"line\" v uživatelských tabulkách. Tento\n"
+"datový typ změnil interní a vstupní/výstupní formát mezi vaším starým a novým\n"
+"clusterem takže tento cluster nemůže být aktuálně upgradován. Můžete odstranit\n"
+"problematické tabulky a znovu spustit upgrade. Seznam problematických sloupců\n"
+"je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:276
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Kontrola pro neplatné \"unknown\" uživatelské sloupce"
+
+#: version.c:283
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"unknown\" datový typ v uživatelských tabulkách. Tento\n"
+"datový typ není v uživatelských tabulkách nadále povolen, takže tento cluster nelze\n"
+"aktuálně upgradovat. Můžete problematické tabulky odstranit a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#: version.c:306
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Kontrola hash indexů"
+
+#: version.c:386
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Po skončení upgrade vám budou poskytnuty instrukce\n"
+"jak REINDEX provést.\n"
+"\n"
+
+#: version.c:392
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Vaše instalace obsahuje hash indexy. Tyto indexy mají rozdílný interní\n"
+"formát mezi vaším starým a novým clusterem, takže musí být reindexovány\n"
+"příkazem REINDEX. Soubor\n"
+" %s\n"
+"po spuštění z psql pod superuživatelským účtem znovu vytvoří všechny\n"
+"neplatné indexy; dokud k tomu nedojde tyto indexy nebudou používány.\n"
+"\n"
+
+#: version.c:418
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Kontrola pro neplatné \"sql_identifier\" uživatelské sloupce"
+
+#: version.c:426
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables\n"
+"and/or indexes. The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can remove the problem tables or\n"
+"change the data type to \"name\" and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Vaše instalace obsahuje \"sql_identifier\" datový typ v uživatelských tabulkách\n"
+"a/nebo indexech. Formát uložení na disku pro tento datový typ se změnil, takže\n"
+"tento cluster nelze aktuálně upgradovat. Můžete problematické tabulky\n"
+"odstranit nebo datový typ změnit na \"name\" a znovu spustit upgrade.\n"
+"Seznam problematických sloupců je v souboru:\n"
+" %s\n"
+"\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "nelze naparsovat PG_VERSION soubor z %s\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Chyby hlaste na adresu <pgsql-bugs@postgresql.org>.\n"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Statistiky optimalizéru a informace o volném místě nejsou zachovány\n"
+#~ "při pg_upgrade, takže po nastartování nového serveru zvažte spuštění:\n"
+#~ " %s\n"
+#~ "\n"
diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po
new file mode 100644
index 0000000..36efb8e
--- /dev/null
+++ b/src/bin/pg_upgrade/po/de.po
@@ -0,0 +1,1833 @@
+# German message translation file for pg_upgrade
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 13:18+0000\n"
+"PO-Revision-Date: 2023-11-03 10:42-0400\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Führe Konsistenzprüfungen am alten laufenden Server durch\n"
+"---------------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Führe Konsistenzprüfungen durch\n"
+"-------------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Cluster sind kompatibel*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Wenn pg_upgrade ab diesem Punkt fehlschlägt, dann müssen Sie den\n"
+"neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n"
+"werden kann."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Optimizer-Statistiken werden von pg_upgrade nicht übertragen. Wenn Sie\n"
+"den neuen Server starten, sollte Sie diesen Befehl ausführen:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"Ein Skript zum Löschen der Dateien des alten Clusters konnte nicht\n"
+"erzeugt werden, weil benutzerdefinierte Tablespaces oder das\n"
+"Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n"
+"liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Prüfe Cluster-Versionen"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version %s oder später durchführen."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«"
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis, d.h. %s, liegen"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis, d.h. %s, liegen"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Erzeuge Skript zum Löschen des alten Clusters"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht öffnen: %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht ausführbar machen: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "konnte die Anzahl der Benutzer nicht ermitteln"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Prüfe Verbindungseinstellungen der Datenbank"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Alle Datenbanken außer template0 müssen Verbindungen erlauben,\n"
+"d.h. ihr pg_database.datallowconn muss wahr sein. Ihre Installation\n"
+"enthält Datenbanken außer template0, deren pg_database.datallowconn\n"
+"auf falsch gesetzt ist. Sie sollten Verbindungen für alle Datenbanken\n"
+"außer template0 erlauben oder die Datenbanken, die keine Verbindungen\n"
+"erlauben, löschen. Eine Liste der Datenbanken mit diesem Problem ist\n"
+"in der Datei:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Prüfe auf vorbereitete Transaktionen"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Der alte Cluster enthält vorbereitete Transaktionen"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Der neue Cluster enthält vorbereitete Transaktionen"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält Funktionen aus »contrib/isn«, welche den\n"
+"Datentyp bigint verwenden. Der alte und der neue Cluster übergeben\n"
+"bigint auf andere Weise und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können Datenbanken im alten Cluster,\n"
+"die »contrib/isn« verwenden, manuell dumpen, löschen, dann das\n"
+"Upgrade durchführen und sie dann wiederherstellen. Eine Liste\n"
+"der problematischen Funktionen ist in der Datei:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Postfixoperatoren, was\n"
+"nicht mehr unterstützt wird. Entfernen Sie die Postfixoperatoren und\n"
+"ersetzten Sie sie durch Präfixoperatoren oder Funktionsaufrufe. Eine\n"
+"Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Prüfe auf inkompatible polymorphische Funktionen"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte Objekte, die auf interne\n"
+"polymorphische Funktionen mit Argumenten vom Typ »anyarray« und\n"
+"»anyelement« verweisen. Diese benutzerdefinierten Objekte müsen vor\n"
+"dem Upgrade gelöscht werden und danach wiederhergestellt werden,\n"
+"nachdem sie so geändert wurden, dass sie auf die entsprechenden\n"
+"Funktionen mit Argumenten vom Typ »anycompatiblearray« und\n"
+"»anycompatible« verweisen.\n"
+"Eine Liste der problematischen Objekte ist in der Datei:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Prüfe auf Tabellen mit WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält Tabellen, die mit WITH OIDS deklariert sind,\n"
+"was nicht mehr unterstützt wird. Entfernen Sie die oid-Spalte mit\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Eine Liste der Tabellen mit dem Problem ist in der Datei:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält systemdefinierte zusammengesetzte Typen in\n"
+"Benutzertabellen. Die OIDs dieser Typen sind nicht über\n"
+"PostgreSQL-Versionen stabil und daher kann dieser Cluster gegenwärtig\n"
+"nicht aktualisiert werden. Sie können die Problemspalten löschen\n"
+"und das Upgrade neu starten. Eine Liste der Problemspalten ist in der\n"
+"Datei:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält einen der reg*-Datentypen in\n"
+"Benutzertabellen. Diese Datentypen verweisen auf System-OIDs, die von\n"
+"pg_upgrade nicht erhalten werden. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n"
+"löschen und das Upgrade neu starten. Eine Liste der Problemspalten\n"
+"ist in der Datei:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Prüfe auf inkompatiblen Datentyp »%s« in Benutzertabellen"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »aclitem« in\n"
+"Benutzertabellen. Das interne Format von »aclitem« wurde in PostgreSQL\n"
+"16 geändert. Daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Prüfe auf entfernten Datentyp »%s« in Benutzertabellen"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »%s« in Benutzertabellen. Der\n"
+"Typ »%s« wurde in PostgreSQL %s entfernt. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die Problemspalten\n"
+"löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »jsonb« in\n"
+"Benutzertabellen. Das interne Format von »jsonb« wurde während 9.4\n"
+"Beta geändert. Daher kann dieser Cluster gegenwärtig nicht\n"
+"aktualisiert werden. Sie können die Problemspalten löschen und das\n"
+"Upgrade neu starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Prüfe auf Rollen, die mit »pg_« anfangen"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält Rollen, die mit »pg_« anfangen.\n"
+"»pg_« ist ein reservierter Präfix für Systemrollen. Der Cluster kann\n"
+"erst aktualisiert werden, wenn diese Rollen umbenannt sind.\n"
+"Eine Liste der Rollen, die mit »pg_« anfangen, ist in der Datei:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält benutzerdefinierte\n"
+"Kodierungsumwandlungen. Die Parameter von Umwandlungsfunktionen wurden\n"
+"in PostgreSQL Version 14 geändert. Daher kann dieser Cluster\n"
+"gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Kodierungsumwandlungen im alten Cluster entfernen und das Upgrade neu\n"
+"starten. Eine Liste der benutzerdefinierten Kodierungsumwandlungen ist\n"
+"in der Datei:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: Problem mit dem Zustand des Clusters"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Der alte Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Der neue Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um ihn zu aktualisieren, verwenden Sie »rsync« wie in der Dokumentation beschrieben oder fahren Sie ihn im Primärmodus herunter."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Der alte Cluster wurde nicht sauber heruntergefahren."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Der neue Cluster wurde nicht sauber heruntergefahren."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: Problem mit pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: Problem beim Ermitteln der Kontrolldaten"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Im alten Cluster fehlen einige notwendige Kontrollinformationen:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Im neuen Cluster fehlen einige notwendige Kontrollinformationen:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " Checkpoint nächste XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " NextOID des letzten Checkpoints"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " NextMultiXactId des letzten Checkpoints"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " oldestMultiXid des letzten Checkpoints"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " oldestXID des letzten Checkpoints"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " NextMultiOffset des letzten Checkpoints"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " erstes WAL-Segment nach dem Reset"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " Übergabe von Float8-Argumenten"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " maximale Ausrichtung (Alignment)"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " Blockgröße"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " Segmentgröße für große Relationen"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL-Blockgröße"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL-Segmentgröße"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " maximale Bezeichnerlänge"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " maximale Anzahl indizierter Spalten"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " maximale TOAST-Chunk-Größe"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " Large-Object-Chunk-Größe"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " Datum/Zeit sind Ganzzahlen?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " Datenprüfsummenversion"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Kann ohne die benötigten Kontrollinformationen nicht fortsetzen, Programm wird beendet"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"altes und neues Alignment in pg_controldata ist ungültig oder stimmt nicht überein\n"
+"Wahrscheinlich ist ein Cluster eine 32-Bit-Installation und der andere 64-Bit"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "alte und neue Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "alte und neue maximale Relationssegmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "alte und neue WAL-Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "alte und neue WAL-Segmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "alte und neue maximale Bezeichnerlängen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "alte und neue Maximalzahlen indizierter Spalten von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "alte und neue maximale TOAST-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "alte und neue Large-Object-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "alte und neue Speicherung von Datums- und Zeittypen von pg_controldata ist ungültig oder stimmt nicht überein"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "der alte Cluster verwendet keine Datenprüfsummen, aber der neue verwendet sie"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "die alte Cluster verwendet Datenprüfsummen, aber der neue nicht"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "Prüfsummenversionen im alten und neuen Cluster stimmen nicht überein"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Füge Endung ».old« an altes global/pg_control an"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Wenn Sie den alten Cluster starten wollen, müssen Sie die Endung\n"
+"».old« von %s/global/pg_control.old entfernen. Da der »link«-Modus\n"
+"verwendet wurde, kann der alte Cluster nicht gefahrlos gestartet\n"
+"werden, nachdem der neue Cluster gestartet worden ist."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Erzeuge Dump der globalen Objekte"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Erzeuge Dump der Datenbankschemas"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "konnte pg_ctl-Version nicht ermitteln von %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "Befehl zu lang"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "konnte Logdatei »%s« nicht öffnen: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*fehlgeschlagen*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Probleme beim Ausführen von »%s«"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« oder »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Prüfen Sie die letzten Zeilen von »%s« für den\n"
+"wahrscheinlichen Grund für das Scheitern."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "konnte nicht in Logdatei »%s «schreiben: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Sie müssen Lese- und Schreibzugriff im aktuellen Verzeichnis haben."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "Prüfen von »%s« fehlgeschlagen: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "»%s« ist kein Verzeichnis"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "Prüfen von »%s« fehlgeschlagen: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "Prüfen von »%s« fehlgeschlagen: falsche Version: gefunden »%s«, erwartet »%s«"
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht lesen: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht schreiben: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s« (»%s« nach »%s«): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Erzeugen einer Verknüpfung für Relation »%s.%s« (»%s« nach »%s«): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte »stat« für Datei »%s« nicht ausführen: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "Fehler beim Kopieren von Relation »%s.%s«: unvollständige Seite gefunden in Datei »%s«"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "konnte Datei nicht vom alten in das neue Datenverzeichnis klonen: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "konnte Datei »%s« nicht erstellen: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %s\n"
+"Im Link-Modus müssen das alte und das neue Datenverzeichnis im selben Dateisystem liegen."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Prüfe das Vorhandensein benötigter Bibliotheken"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "konnte Bibliothek »%s« nicht laden: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "In Datenbank: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation verweist auf ladbare Bibliotheken, die in der neuen\n"
+"Installation fehlen. Sie können diese Bibliotheken zur neuen\n"
+"Installation hinzufügen oder die Funktionen in der alten Installation\n"
+"entfernen. Eine Liste der problematischen Bibliotheken ist in der\n"
+"Datei:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Relationsnamen für OID %u in Datenbank »%s« stimmen nicht überein: alten Name »%s.%s«, neuer Name »%s.%s«"
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Alte und neue Tabellen in Datenbank »%s« konnten nicht gepaart werden"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr ", ein Index für »%s.%s«"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr ", ein Index für OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr ", eine TOAST-Tabelle für »%s.%s«"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr ", eine TOAST-Tabelle für OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "Keine Übereinstimmung gefunden im alten Cluster für neue Relation mit OID %u in Datenbank »%s«: %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "Keine Übereinstimmung gefunden im neuen Cluster für alte Relation mit OID %u in Datenbank »%s«: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"Quelldatenbanken:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"Zieldatenbanken:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 nicht gefunden"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Datenbank: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: kann nicht als root ausgeführt werden"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ungültige alte Portnummer"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ungültige neue Portnummer"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Ausführung im Verbose-Modus"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "die Programmdateien des alten Clusters liegen"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "die Programmdateien des neuen Clusters liegen"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "die Daten das alten Clusters liegen"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "die Daten des neuen Clusters liegen"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "die Sockets erzeugt werden sollen"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "konnte aktuelles Verzeichnis nicht ermitteln"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "auf Windows kann pg_upgrade nicht von innerhalb des Cluster-Datenverzeichnisses ausgeführt werden"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade aktualisiert einen PostgreSQL-Cluster auf eine neue Hauptversion.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Optionen:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINVERZ Programmverzeichnis des alten Clusters\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINVERZ Programmverzeichnis des neuen Clusters\n"
+" (Standard: gleiches Verzeichnis wie pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check nur Cluster prüfen, keine Daten ändern\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATENVERZ Datenverzeichnis des alten Clusters\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATENVERZ Datenverzeichnis des neuen Clusters\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM Anzahl paralleler Prozesse oder Threads\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link Dateien in den neuen Cluster verknüpfen statt kopieren\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONEN Serveroptionen für den alten Cluster\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONEN Serveroptionen für den neuen Cluster\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT Portnummer für den alten Cluster (Standard: %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT Portnummer für den neuen Cluster (Standard: %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL- und Logdateien bei Erfolg aufheben\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME Cluster-Superuser (Standard: »%s«)\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose »Verbose«-Modus einschalten\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone Dateien in den neuen Cluster klonen statt kopieren\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy Dateien in den neuen Cluster kopieren (Voreinstellung)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Vor dem Aufruf von pg_upgrade müssen Sie:\n"
+" den neuen Datenbankcluster anlegen (mit der neuen Version von initdb)\n"
+" den Postmaster für den alten Cluster anhalten\n"
+" den Postmaster für den neuen Cluster anhalten\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Beim Aufruf von pg_upgrade müssen die folgenden Informationen angegeben werden:\n"
+" das Datenverzeichnis des alten Clusters (-d DATENVERZ)\n"
+" das Datenverzeichnis des neuen Clusters (-D DATENVERZ)\n"
+" das »bin«-Verzeichnis der alten Version (-b BINVERZ)\n"
+" das »bin«-Verzeichnis der neuen Version (-B BINVERZ)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Zum Beispiel:\n"
+" pg_upgrade -d alterCluster/data -D neuerCluster/data -b alterCluster/bin -B neuerCluster/bin\n"
+"oder\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=alterCluster/data\n"
+" $ export PGDATANEW=neuerCluster/data\n"
+" $ export PGBINOLD=alterCluster/bin\n"
+" $ export PGBINNEW=neuerCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=alterCluster/data\n"
+" C:\\> set PGDATANEW=neuerCluster/data\n"
+" C:\\> set PGBINOLD=alterCluster/bin\n"
+" C:\\> set PGBINNEW=neuerCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Berichten Sie Fehler an <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Sie müssen das Verzeichnis angeben, wo %s.\n"
+"Bitte verwenden Sie die Kommandzeilenoption %s oder die Umgebungsvariable %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des alten Clusters"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Suche das tatsächliche Datenverzeichnis des neuen Clusters"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "vom Benutzer angegebene Portnummer %hu wurde auf %hu korrigiert"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "konnte Arbeitsprozess nicht erzeugen: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "konnte Arbeits-Thread nicht erzeugen: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() fehlgeschlagen: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "Kindprozess wurde abnormal beendet: Status %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "Kindprozess wurde abnormal beendet: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Führe Upgrade durch\n"
+"-------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Setze nächste OID im neuen Cluster"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisiere Datenverzeichnis auf Festplatte"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Upgrade abgeschlossen\n"
+"---------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "Verzeichnispfad für neuen Cluster ist zu lang"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: konnte eigene Programmdatei nicht finden"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den alten Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Es läuft scheinbar ein Postmaster für den neuen Cluster.\n"
+"Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Setze Locale und Kodierung für neuen Cluster"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analysiere alle Zeilen im neuen Cluster"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Friere alle Zeilen im neuen Cluster ein"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Stelle globale Objekte im neuen Cluster wieder her"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Stelle Datenbankschemas im neuen Cluster wieder her"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Lösche Dateien aus neuem %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "konnte Verzeichnis »%s« nicht löschen"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopiere altes %s zum neuen Server"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Setze älteste XID im neuen Cluster"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Setze älteste Multixact-ID im neuen Cluster"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Setze WAL-Archive zurück"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Setze frozenxid und minmxid im neuen Cluster"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Setze minmxid im neuen Cluster"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Klone Benutzertabellendateien"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Kopiere Benutzertabellendateien"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Verknüpfe Benutzertabellendateien"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "konvertiere »%s« nach »%s«"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "klone »%s« nach »%s«"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "kopiere »%s« nach »%s«"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "verknüpfe »%s« nach »%s«"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Fehlgeschlagen, Programm wird beendet\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "führe aus: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-Befehl fehlgeschlagen\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "konnte Versionsdatei »%s« nicht öffnen: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "konnte Versionsdatei »%s« nicht interpretieren"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl konnte den Quellserver nicht starten, oder Verbindung fehlgeschlagen"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl konnte den Zielserver nicht starten, oder Verbindung fehlgeschlagen"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "Speicher aufgebraucht"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Kann nicht auf gleiche Systemkatalogversion aktualisieren, wenn\n"
+"Tablespaces verwendet werden."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "Tablespace-Verzeichnis »%s« existiert nicht"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "Tablespace-Pfad »%s« ist kein Verzeichnis"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Prüfe auf inkompatiblen Datentyp »line«"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »line« in Benutzertabellen. Das\n"
+"interne Format und das Eingabe-/Ausgabeformat dieses Datentyps wurden\n"
+"zwischen Ihrem alten und neuen Cluster geändert und daher kann dieser\n"
+"Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n"
+"Problemspalten löschen und das Upgrade neu starten. Eine Liste der\n"
+"Problemspalten ist in der Datei:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »unknown« in\n"
+"Benutzertabellen. Dieser Datentyp ist nicht mehr in Tabellen erlaubt\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Prüfe auf Hash-Indexe"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "Warnung"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n"
+"werden Sie Anweisungen zum REINDEX erhalten."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Ihre Installation enthält Hash-Indexe. Diese Indexe haben\n"
+"unterschiedliche interne Formate im alten und neuen Cluster und müssen\n"
+"daher mit dem Befehl REINDEX reindiziert werden. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um alle\n"
+"ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n"
+"verwendet werden."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Ihre Installation enthält den Datentyp »sql_identifier« in\n"
+"Benutzertabellen. Das Speicherformat dieses Datentyps wurde geändert\n"
+"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n"
+"werden. Sie können die Problemspalten löschen und das Upgrade neu\n"
+"starten. Eine Liste der Problemspalten ist in der Datei:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Prüfe auf Aktualisierungen von Erweiterungen"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "Hinweis"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Ihre Installation enthält Erweiterungen, die mit dem Befehl ALTER\n"
+"EXTENSION aktualisiert werden sollten. Die Datei\n"
+" %s\n"
+"kann mit psql als Datenbank-Superuser ausgeführt werden, um die\n"
+"Erweiterungen zu aktualisieren."
diff --git a/src/bin/pg_upgrade/po/es.po b/src/bin/pg_upgrade/po/es.po
new file mode 100644
index 0000000..327cc36
--- /dev/null
+++ b/src/bin/pg_upgrade/po/es.po
@@ -0,0 +1,1829 @@
+# spanish message translation file for pg_upgrade
+#
+# Copyright (c) 2017-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2017.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-03 07:19+0000\n"
+"PO-Revision-Date: 2023-10-03 16:20+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: PgSQL-es-Ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: BlackCAT 1.1\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Verificando Consistencia en Vivo en el Servidor Antiguo\n"
+"-------------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Verificando Consistencia\n"
+"------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Los clústers son compatibles*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Si pg_upgrade falla a partir de este punto, deberá re-ejecutar initdb\n"
+"en el clúster nuevo antes de continuar."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Las estadísticas para el optimizador no son transferidas por pg_upgrade.\n"
+"Una vez que inicie el servidor nuevo, considere ejecutar:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"Ejecutando este script se borrarán los archivos de datos del servidor antiguo:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"No se pudo crear un script para borrar los archivos de datos del servidor\n"
+"antiguo, porque el directorio del clúster antiguo contiene tablespaces\n"
+"o el directorio de datos del servidor nuevo. El contenido del servidor\n"
+"antiguo debe ser borrado manualmente."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Verificando las versiones de los clústers"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Este programa sólo puede actualizar desde PostgreSQL versión %s y posterior."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Este programa sólo puede actualizar a PostgreSQL versión %s."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Este programa no puede usarse para volver a versiones anteriores de PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "El directorio de datos antiguo y el directorio de binarios antiguo son de versiones diferentes."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "El directorio de datos nuevo y el directorio de binarios nuevo son de versiones diferentes."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Al verificar servidores en caliente, los números de port antiguo y nuevo deben ser diferentes."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "La base de datos «%s» del clúster nuevo no está vacía: se encontró la relación «%s.%s»"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Verificando los directorios de tablespaces para el nuevo clúster"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "directorio de tablespace para el nuevo clúster ya existe: «%s»"
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"ADVERTENCIA: el directorio de datos nuevo no debería estar dentro del directorio antiguo,\n"
+"esto es, %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"ADVERTENCIA: las ubicaciones de tablespaces definidos por el usuario no deberían estar dentro del directorio de datos, esto es, %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Creando un script para borrar el clúster antiguo"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "no se pudo abrir el archivo «%s»: %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Verificando que el usuario de base de datos es el usuario de instalación"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "el usuario de base de datos «%s» no es el usuario de instalación"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "no se pudo determinar el número de usuarios"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Sólo el usuario de instalación puede estar definido en el nuevo clúster."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Verificando los parámetros de conexión de bases de datos"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 no debe permitir conexiones, es decir su pg_database.datallowconn debe ser «false»"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Todas las bases de datos que no son template0 deben permitir conexiones,\n"
+"es decir, pg_database.datallowconn debe ser true. Su instalación contiene\n"
+"bases de datos que no son template0 que tienen pg_database.datallowconn\n"
+"definido a false. Considere permitir conexiones para todas las bases de\n"
+"datos que no son template0 o eliminar las bases de datos que no permiten\n"
+"conexión. Un listado de las bases de datos con el problema se encuentra en:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Verificando transacciones preparadas"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "El clúster de origen contiene transacciones preparadas"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "El clúster de destino contiene transacciones preparadas"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Verificando contrib/isn con discordancia en mecanismo de paso de bigint"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene funciones de «contrib/isn» que usan el tip de dato\n"
+"bigint. Sus clústers nuevo y antiguo pasar el tipo bigint de distinta forma,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede hacer un volcado (dump) de las bases de datos que usan «contrib/isn»,\n"
+"eliminarlas, hacer el upgrade, y luego restaurarlas.\n"
+"Un listado de funciones problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Verificando operadores postfix definidos por el usuario"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene operadores postfix definidos por el usuario, los\n"
+"cuales ya no están soportados. Considere eliminar los operadores postfix\n"
+"y reemplazarlos con operadores de prefijo o llamadas a funciones.\n"
+"Una lista de operadores postfix definidos por el usuario aparece en el archivo:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Verificando funciones polimórficas incompatibles"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene objetos definidos por el usuario que hacen referencia\n"
+"a funciones polimórficas con argumentos de tipo «anyarray» o «anyelement».\n"
+"Esos objetos definidos por el usuario deben eliminarse antes de actualizar\n"
+"y se pueden restaurar después, cambiándolos para que hagan referencia a las nuevas\n"
+"funciones correspondientes con argumentos de tipo «anycompatiblearray» y\n"
+"«anycompatible». Una lista de los objetos problemáticos está en el archivo:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Verificando tablas WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene tablas declaradas WITH OIDS, que ya no está\n"
+"soportado. Considere eliminar la columna oid usando\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Una lista de tablas con este problema aparece en el archivo:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene tipos compuestos definidos por el sistema en\n"
+"tablas de usuario. Los OIDs de estos tipos no son estables entre diferentes\n"
+"versiones de PostgreSQL, por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Verificando tipos de datos reg* en datos de usuario"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene uno de los tipos reg* en tablas de usuario. Estos tipos\n"
+"de dato hacen referencia a OIDs de sistema que no son preservados por pg_upgrade,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Verificando datos de usuario de tipo «%s» incompatible"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n"
+"El formato interno de «jsonb» cambió durante 9.4 beta,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Verificando tipo de datos «%s» eliminado en tablas de usuario"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «%s» en tablas de usuario.\n"
+"El tipo «%s» fue eliminado en la versión %s de PostgreSQL,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas, o cambiarlas a otro\n"
+"tipo de dato, y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Verificando datos de usuario en tipo «jsonb» incompatible"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n"
+"El formato interno de «jsonb» cambió durante 9.4 beta,\n"
+"por lo que este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Verificando roles que empiecen con «pg_»"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene nombres de rol que comienzan con «pg_».\n"
+"«pg_» es un prefijo reservado para roles de sistema. El clúster\n"
+"no puede ser actualizado hasta que esos roles hayan sido renombrados.\n"
+"Un listado de los roles que empiezan con «pg_» está en el archivo:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Verificando conversiones de codificación definidas por el usuario"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene conversiones de codificación definidas por el usuario.\n"
+"Los parámetros de la función de conversión cambiaron en PostgreSQL 14\n"
+"por lo que este clúster no puede ser actualizado. Puede eliminar\n"
+"las conversiones de codificación en el clúster antiguo y reiniciar la actualización.\n"
+"Un listado de las conversiones de codificación definidas por el usuario está en el archivo:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "no se pudo obtener datos de control usando %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: problema de estado del clúster"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "El clúster de origen fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "El clúster de destino fue apagado mientras estaba en modo de recuperación. Para actualizarlo, use «rsync» como está documentado, o apáguelo siendo primario."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "El clúster de origen no fue apagado limpiamente."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "El clúster de destino no fue apagado limpiamente."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Al clúster de origen le falta información de estado:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Al cluster de destino le falta información de estado:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: problema en pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: problema de extracción de controldata"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Al clúster de origen le falta información de control requerida:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Al clúster de destino le falta información de control requerida:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " siguiente XID del último checkpoint"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " siguiente OID del último checkpoint"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " siguiente MultiXactId del último checkpoint"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " MultiXactId más antiguo del último checkpoint"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " XID más antiguo del último checkpoint"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " siguiente MultiXactOffset del siguiente checkpoint"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " primer segmento de WAL después del reinicio"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " método de paso de argumentos float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " alineamiento máximo"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " tamaño de bloques"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " tamaño de segmento de relación grande"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " tamaño de bloque de WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " tamaño de segmento de WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " máximo largo de identificadores"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " máximo número de columnas indexadas"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " tamaño máximo de trozos TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " tamaño de trozos de objetos grandes"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " fechas/horas son enteros?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " versión del checksum de datos"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "No se puede continuar sin la información de control requerida. Terminando"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"Alineamientos de pg_controldata antiguo y nuevo no son válidos o no coinciden.\n"
+"Seguramente un clúster es 32-bit y el otro es 64-bit"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "Los tamaños de bloque antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "El tamaño máximo de segmento de relación antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "El tamaño de bloques de WAL antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "El tamaño de segmentos de WAL antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "Los máximos largos de identificador antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "La cantidad máxima de columnas indexadas antigua y nueva no son válidos o no coinciden"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "Los máximos de trozos TOAST antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "Los tamaños de trozos de objetos grandes antiguo y nuevo no son válidos o no coinciden"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "Los tipos de almacenamiento de fecha/hora antiguo y nuevo no coinciden"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "El clúster antiguo no usa checksums de datos pero el nuevo sí"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "El clúster antiguo usa checksums de datos pero el nuevo no"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "Las versiones de checksum de datos antigua y nueva no coinciden"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Agregando el sufijo «.old» a global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Si desea iniciar el clúster antiguo, necesitará eliminar el sufijo\n"
+"«.old» de %s/global/pg_control.old.\n"
+"Puesto que se usó el modo «link», el clúster antiguo no puede usarse\n"
+"en forma segura después de que el clúster nuevo haya sido iniciado."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Creando el volcado de objetos globales"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Creando el volcado de esquemas de bases de datos"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "no se pudo obtener datos de versión de pg_ctl usando %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "no se pudo obtener la salida de versión de pg_ctl de %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "orden demasiado larga"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de registro «%s»: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*falló*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Hubo problemas ejecutando «%s»"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consulte las últimas línea de «%s» o «%s» para\n"
+"saber la causa probable de la falla."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consulte las últimas líneas de «%s» para saber\n"
+"la causa probable de la falla."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "no se pudo escribir al archivo de log «%s»"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "no se pudo abrir el archivo «%s» para lectura: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Debe tener privilegios de lectura y escritura en el directorio actual."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "la comprobación de «%s» falló: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "«%s» no es un directorio"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "la comprobación de «%s» falló: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "La comprobación de «%s» falló: no se puede ejecutar"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "La comprobación de «%s» falló: versión incorrecta: se encontró «%s», se esperaba «%s»"
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo escribir el archivo «%s»: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se copiaba la relación «%s.%s» («%s» a «%s»): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se creaba el link para la relación «%s.%s» («%s» a «%s»): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo hacer stat a «%s»: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "error mientras se copiaba la relación «%s.%s»: se encontró una página parcial en el archivo «%s»"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "no se pudo crear el archivo «%s»: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "el clonado de archivos no está soportado en esta plataforma"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"No se pudo crear un link duro entre los directorios de datos nuevo y antiguo: %s\n"
+"En modo link los directorios de dato nuevo y antiguo deben estar en el mismo sistema de archivos."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Verificando la presencia de las bibliotecas requeridas"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "no se pudo cargar la biblioteca «%s»: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "En la base de datos: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación hace referencia a bibliotecas que no están en la nueva\n"
+"instalación. Puede agregar estar bibliotecas la instalación nueva, o\n"
+"eliminar las funciones que las utilizan de la versión antigua. Un listado\n"
+"de las bibliotecas problemáticas está en el archivo:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Los nombres de relación para OID %u en la base de datos «%s» no coinciden: nombre antiguo «%s.%s», nombre nuevo «%s.%s»"
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "No hubo coincidencia en las tablas nueva y antigua en la base de datos «%s»"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " que es un índice en «%s.%s»"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " que es un índice en el OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " que es la tabla TOAST para «%s.%s»"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " que es la tabla TOAST para el OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr ""
+"No se encontró equivalente en el clúster antiguo para la relación nueva con OID %u\n"
+"en la base de datos «%s»: %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr ""
+"No se encontró equivalente en el clúster nuevo para la antigua relación con OID %u\n"
+"en la base de datos «%s»: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"bases de datos de origen:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"bases de datos de destino:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 no encontrado"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Base de datos: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: no puede ejecutarse como root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "número de puerto antiguo no válido"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "número de puerto nuevo no válido"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Pruebe «%s --help» para mayor información.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Ejecutando en modo verboso"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "residen los binarios del clúster antiguo"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "residen los binarios del clúster nuevo"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "residen los datos del clúster antiguo"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "residen los datos del clúster nuevo"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "se crearán los sockets"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "no se pudo identificar el directorio actual"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "no se puede ejecutar pg_upgrade desde dentro del directorio de datos del clúster nuevo en Windows"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr "pg_upgrade actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPCIÓN]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Opciones:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR directorio de ejecutables del clúster antiguo\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n"
+" (por omisión el mismo directorio que pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sólo verificar clústers, no cambiar datos\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR directorio de datos del clúster antiguo\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR directorio de datos del clúster nuevo\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link enlazar (link) archivos en vez de copiarlos\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPCIONES opciones a pasar al servidor antiguo\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPCIONES opciones a pasar al servidor nuevo\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PUERTO número de puerto del clúster antiguo (def. %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PUERTO número de puerto del clúster nuevo (def. %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain preservar archivos SQL y logs en caso de éxito\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR directorio de sockets a usar (omisión: dir. actual)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NOMBRE superusuario del clúster (def. «%s»)\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose activar registro interno verboso\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clonar los archivos en vez de copiarlos\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy copiar los archivos al clúster nuevo (por omisión)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Antes de ejecutar pg_upgrade, debe:\n"
+" crear el nuevo clúster de la base de datos (usando la nueva versión de initdb)\n"
+" apagar el postmaster que atiende al clúster antiguo\n"
+" apagar el postmaster que atiende al clúster nuevo\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Cuando ejecute pg_ugpade, debe proveer la siguiente información:\n"
+" el directorio de datos del clúster antiguo (-d DATADIR)\n"
+" el directorio de datos del clúster nuevo (-D DATADIR)\n"
+" el directorio «bin» para la versión antigua (-b BINDIR)\n"
+" el directorio «bin» para la versión nueva (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Por ejemplo:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"o\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=clusterAntiguo/data\n"
+" $ export PGDATANEW=clusterNuevo/data\n"
+" $ export PGBINOLD=clusterAntiguo/bin\n"
+" $ export PGBINNEW=clusterNuevo/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=clusterAntiguo/data\n"
+" C:\\> set PGDATANEW=clusterNuevo/data\n"
+" C:\\> set PGBINOLD=clusterAntiguo/bin\n"
+" C:\\> set PGBINNEW=clusterNuevo/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Reporte errores a <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Debe identificar el directorio donde %s.\n"
+"Por favor use la opción %s o la variable de ambiente %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Buscando el directorio de datos real para el clúster de origen"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Buscando el directorio de datos real para el clúster de destino"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "no se pudo obtener el directorio de datos usando %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "no se pudo leer la línea %d del archivo «%s»: %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "número de port entregado por el usuario %hu corregido a %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "no se pudo crear el proceso hijo: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "no se pudo crear el thread: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() falló: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "el proceso hijo terminó anormalmente: estado %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "el thread terminó anormalmente: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "no se pudo obtener los permisos del directorio «%s»: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Llevando a cabo el Upgrade\n"
+"--------------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Seteando siguiente OID para el nuevo clúster"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Sincronizando directorio de datos a disco"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Actualización Completa\n"
+"----------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "nombre de directorio para el nuevo clúster es demasiado largo"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "no se pudo crear el directorio «%s»: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: no se pudo encontrar el ejecutable propio"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster antiguo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Parece haber un postmaster sirviendo el clúster nuevo.\n"
+"Por favor detenga ese postmaster e inténtelo nuevamente."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Estableciendo la configuración regional y codificación para el nuevo clúster"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analizando todas las filas en el clúster nuevo"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Congelando todas las filas en el nuevo clúster"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restaurando objetos globales en el nuevo clúster"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Restaurando esquemas de bases de datos en el clúster nuevo"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Eliminando archivos del nuevo %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "no se pudo eliminar directorio «%s»"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copiando el %s antiguo al nuevo servidor"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Estableciendo XID más antiguo para el nuevo clúster"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Seteando el ID de transacción y «época» siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Seteando el multixact ID y offset siguientes en el nuevo clúster"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Seteando el multixact ID más antiguo en el nuevo clúster"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Reseteando los archivos de WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Seteando contadores frozenxid y minmxid en el clúster nuevo"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Seteando contador minmxid en el clúster nuevo"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonando archivos de relaciones de usuario"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copiando archivos de relaciones de usuario"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Enlazando archivos de relaciones de usuario"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "la base de datos «%s» no se encontró en el clúster nuevo"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "error mientras se comprobaba la existencia del archivo «%s.%s» («%s» a «%s»); %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "reescribiendo «%s» a «%s»"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "clonando «%s» a «%s»"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "copiando «%s» a «%s»"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "enlazando «%s» a «%s»"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Falló, saliendo\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "ejecutando: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Orden SQL falló\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "no se pudo abrir el archivo de versión «%s»: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "no se pudo interpretar el archivo de versión «%s»"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"no se pudo conectar al postmaster de origen iniciado con la orden:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"no se pudo conectar al postmaster de destino iniciado con la orden:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl no pudo iniciar el servidor de origen, o la conexión falló"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl no pudo iniciar el servidor de destino, o la conexión falló"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "memoria agotada"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "la variable de ambiente libpq %s tiene un valor de servidor no-local: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"No se puede actualizar desde el mismo número de versión del catálogo\n"
+"cuando se están usando tablespaces."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "el directorio de tablespace «%s» no existe"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "no se pudo hace stat al directorio de tablespace «%s»: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "la ruta de tablespace «%s» no es un directorio"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "no se pudo acceder al directorio «%s»: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "éxito"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Verificando datos de usuario de tipo «line» incompatible"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo de dato «line» en tablas de usuario. Este\n"
+"tipo de dato cambió su formato interno y de entrada/salida entre las\n"
+"versiones de sus clústers antiguo y nuevo, por lo que este clúster no puede\n"
+"actualmente ser actualizado. Puede eliminar las columnas problemáticas y\n"
+"reiniciar la actualización. Un listado de las columnas problemáticas está\n"
+"en el archivo:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Verificando columnas de usuario del tipo no válido «unknown»"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo «unknown» en tablas de usuario.\n"
+"Este tipo ya no es permitido en tablas,\n"
+"por lo que este clúster no puede ser actualizado. Puede\n"
+"eliminar las columnas problemáticas y reiniciar la actualización.\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Verificando índices hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "atención"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. Después de la actualización, se le entregarán\n"
+"instrucciones de REINDEX."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Su instalación contiene índices hash. Estos índices tienen formato interno\n"
+"distinto entre su versión nueva y antigua, por lo que deben ser reindexados\n"
+"con la orden REINDEX. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos recreará\n"
+"los índices no válidos; hasta entonces, ninguno de esos índices será usado."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Verificando columnas de usuario del tipo «sql_identifier»"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Su instalación contiene el tipo de dato «sql_identifier» en tablas de usuario.\n"
+"El formato en disco para este tipo de dato ha cambiado, por lo que\n"
+"este clúster no puede ser actualizado.\n"
+"Puede eliminar las columnas problemáticas y reiniciar la actualización\n"
+"Un listado de las columnas problemáticas está en el archivo:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Verificando actualizaciones para extensiones"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "aviso"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Su instalación tiene extensiones que deben ser actualizadas\n"
+"con la sentencia ALTER EXTENSION. El archivo\n"
+" %s\n"
+"cuando se ejecute en psql con el superusuario de la base de datos\n"
+"actualizará estas extensiones."
diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po
new file mode 100644
index 0000000..3804324
--- /dev/null
+++ b/src/bin/pg_upgrade/po/fr.po
@@ -0,0 +1,2158 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2017-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-10-29 17:18+0000\n"
+"PO-Revision-Date: 2023-10-30 13:44+0100\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.4\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Exécution de tests de cohérence sur l'ancien serveur\n"
+"----------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Exécution de tests de cohérence\n"
+"-------------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Les instances sont compatibles*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n"
+"sur la nouvelle instance avant de continuer."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Les statistiques de l'optimiseur ne sont pas transférées par pg_upgrade.\n"
+"Une fois le nouveau serveur démarré, pensez à exécuter :\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"Exécuter ce script supprimera les fichiers de données de l'ancienne instance :\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"N'a pas pu créer un script pour supprimer les fichiers de données\n"
+"de l'ancienne instance parce que les tablespaces définis par l'utilisateur\n"
+"ou le répertoire de données de la nouvelle instance existent dans le répertoire\n"
+"de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n"
+"manuellement."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Vérification des versions des instances"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Cet outil peut seulement mettre à jour les versions %s et ultérieures de PostgreSQL."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Vérification des répertoires de tablespace de la nouvelle instance"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »"
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"AVERTISSEMENT : les emplacements des tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Création du script pour supprimer l'ancienne instance"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "n'a pas pu déterminer le nombre d'utilisateurs"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Vérification des paramètres de connexion de la base de données"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Tous les bases de données, en dehors de template0, doivent autoriser les connexions,\n"
+"autrement dit leur pg_database.datallowconn doit être à true. Votre installation contient\n"
+"des bases, hors template0, dont le pg_database.datallowconn est configuré à false.\n"
+"Autorisez les connections aux bases, hors template0, ou supprimez les bases qui\n"
+"n'autorisent pas les connexions. Une liste des bases problématiques se trouve dans\n"
+"le fichier :\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Vérification des transactions préparées"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "L'instance source contient des transactions préparées"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "L'instance cible contient des transactions préparées"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient les fonctions « contrib/isn » qui se basent sur le\n"
+"type de données bigint. Vos ancienne et nouvelle instances passent les valeurs\n"
+"bigint différemment, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez mettre à jour manuellement vos bases de données\n"
+"qui utilisent « contrib/isn », les supprimer de l'ancienne instance,\n"
+"relancer la mise à jour, puis les restaurer. Une liste des fonctions\n"
+"problématiques est disponible\n"
+"dans le fichier :\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Vérification des opérateurs postfixes définis par les utilisateurs"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des opérateurs postfixes définis par des utilisateurs,\n"
+"qui ne sont plus supportés. Supprimez les opérateurs postfixes et remplacez-les\n"
+"avec des opérateurs préfixes ou des appels de fonctions.\n"
+"Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Vérification des fonctions polymorphiques incompatibles"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des objets définis par les utilisateurs qui font\n"
+"référence à des fonctions polymorphiques internes avec des arguments de\n"
+"type « anyarray » ou « anyelement ». Ces objets doivent être supprimés\n"
+"avant de mettre à jour, puis ils pourront être restaurés, en les changeant\n"
+"pour faire référence aux nouvelles fonctions correspondantes avec des\n"
+"arguments de type « anycompatiblearray » et « anycompatible ». Une liste\n"
+"des objets problématiques se trouve dans le fichier\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Vérification des tables WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des tables déclarées avec WITH OIDS, ce qui n'est plus supporté.\n"
+"Pensez à supprimer la colonne oid en utilisant\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Une liste des tables ayant ce problème se trouve dans le fichier :\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Vérification des types composites définis par le système dans les tables utilisateurs"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des types composites définis par le système dans vos tables\n"
+"utilisateurs. Les OID de ces types ne sont pas stables entre différentes versions\n"
+"de PostgreSQL, donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Vérification des types de données reg* dans les tables utilisateurs"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient un des types de données reg* dans vos tables\n"
+"utilisateurs. Ces types de données référencent des OID système qui ne sont\n"
+"pas préservés par pg_upgrade, donc cette instance ne peut pas être mise à\n"
+"jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n"
+"la mise à jour. Une liste des colonnes problématiques est disponible dans le\n"
+"fichier :\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Vérification du type de données « %s » incompatible dans les tables utilisateurs"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient un type de données « aclitem » dans vos tables utilisateurs.\n"
+"Le format interne de « aclitem » a changé lors du développement de la version 16, donc\n"
+"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n"
+"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n"
+"est disponible dans le fichier :\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Vérification du type de données « %s » supprimé dans les tables utilisateurs"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « %s » dans les tables utilisateurs.\n"
+"Le type «%s » a été supprimé dans PostgreSQL version %s,\n"
+"donc cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques ou les convertir en un autre type de données,\n"
+"et relancer la mise à jour. Vous trouverez une liste des colonnes problématiques dans\n"
+"le fichier :\n"
+" %s\\"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Vérification des types de données « jsonb » incompatibles"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient un type de données « jsonb » dans vos tables utilisateurs.\n"
+"Le format interne de « jsonb » a changé lors du développement de la version 9.4 beta, donc\n"
+"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n"
+"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n"
+"est disponible dans le fichier :\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Vérification des rôles commençant avec « pg_ »"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des rôles commençant par « pg_ ».\n"
+"\"pg_\" est un préfixe réservé aux rôles systèmes. L'instance\n"
+"ne peut pas être mise à jour tant que ces rôles ne sont pas renommés.\n"
+"Une liste des rôles commençant par « pg_ » se trouve dans le fichier :\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Vérification des conversions d'encodage définies par les utilisateurs"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient des conversions définies par un utilisateur.\n"
+"Les paramètres des fonctions de conversion ont changé dans PostgreSQL version 14\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous devez supprimer\n"
+"les conversions d'encodage de l'ancienne instance puis relancer la mise à jour.\n"
+"Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "n'a pas pu obtenir les données de contrôle en utilisant %s : %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d : problème sur l'état de l'instance de la base de données"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "L'instance source n'a pas été arrêtée proprement."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "L'instance cible n'a pas été arrêtée proprement."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Il manque certaines informations d'état requises sur l'instance source :"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Il manque certaines informations d'état requises sur l'instance cible :"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d : problème avec pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d : problème de récupération des controldata"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance source :"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " XID du prochain checkpoint"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " prochain OID du dernier checkpoint"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " prochain MultiXactId du dernier checkpoint"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " plus ancien MultiXactId du dernier checkpoint"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " oldestXID du dernier checkpoint"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " prochain MultiXactOffset du dernier checkpoint"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " premier segment WAL après réinitialisation"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " méthode de passage de arguments float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " alignement maximale"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " taille de bloc"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " taille de segment des relations"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " taille de bloc d'un WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " taille d'un segment WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " longueur maximum d'un identifiant"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " nombre maximum de colonnes indexées"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " taille maximale d'un morceau de TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " taille d'un morceau Large-Object"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " les dates/heures sont-ils des integers?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " version des sommes de contrôle des données"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n"
+"Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits."
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata."
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Ajout du suffixe « .old » à l'ancien global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Si vous voulez démarrer l'ancienne instance, vous devez supprimer\n"
+"le suffixe « .old » du fichier %s/global/pg_control.old.\n"
+"\n"
+"Comme le mode lien était utilisé, l'ancienne instance ne peut pas\n"
+"être démarré proprement une fois que la nouvelle instance a été démarrée."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Création de la sauvegarde des objets globaux"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Création de la sauvegarde des schémas des bases"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "commande trop longue"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*échec*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Il y a eu des problèmes lors de l'exécution de « %s »"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consultez les dernières lignes de « %s » ou « %s » pour\n"
+"trouver la cause probable de l'échec."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Consultez les dernières lignes de « %s » pour\n"
+"trouver la cause probable de l'échec."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "n'a pas pu écrire dans le fichier de traces « %s »"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "échec de la vérification de « %s » : %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "« %s » n'est pas un répertoire"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "échec de la vérification de « %s » : %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "échec de la vérification de « %s » : ne peut pas exécuter"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "échec de la vérification de « %s » : version incorrecte : « %s » trouvée, « %s » attendue"
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu lire le fichier « %s » : %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu écrire le fichier « %s » : %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » (« %s » à « %s ») : %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors de la création du lien pour la relation « %s.%s » (« %s » à « %s ») : %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu tester le fichier « %s » : %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "erreur lors de la copie de la relation « %s.%s » : page partielle trouvée dans le fichier « %s »"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "n'a pas pu cloner le fichier entre l'ancien et le nouveau répertoires : %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "n'a pas pu créer le fichier « %s » : %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "clonage de fichiers non supporté sur cette plateforme"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %s\n"
+"Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Vérification de la présence des bibliothèques requises"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "n'a pas pu charger la bibliothèque « %s » : %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "Dans la base de données : %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation référence des bibliothèques chargeables, mais manquantes sur\n"
+"la nouvelle installation. Vous pouvez ajouter ces bibliothèques à la nouvelle\n"
+"installation ou supprimer les fonctions les utilisant dans l'ancienne installation.\n"
+"Une liste des bibliothèques problématiques est disponible dans le fichier :\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »"
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " qui est un index sur \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " qui est un index sur l'OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " qui est la table TOAST pour « %s.%s »"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " qui est la table TOAST pour l'OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"bases de données sources :"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"bases de données cibles :"
+
+# /* SQL2003 mandates this error if there was no ELSE clause */
+# if (!stmt->have_else)
+# ereport(ERROR,
+# (errcode(ERRCODE_CASE_NOT_FOUND),
+# errmsg("case not found"),
+# errhint("CASE statement is missing ELSE part.")));
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 introuvable"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Base de données : %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname : %s.%s : reloid : %u reltblspace : %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s : ne peut pas être exécuté en tant que root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ancien numéro de port invalide"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "nouveau numéro de port invalide"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Exécution en mode verbeux"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "les binaires de l'ancienne instance résident"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "les binaires de la nouvelle instance résident"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "les données de l'ancienne instance résident"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "les données de la nouvelle instance résident"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "les sockets seront créés"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "n'a pas pu déterminer le répertoire courant"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade met à jour une instance PostgreSQL vers une version majeure\n"
+"différente.\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Options :\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=RÉP_BIN répertoire des exécutables de l'ancienne\n"
+" instance\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=RÉP_BIN répertoire des exécutables de la nouvelle\n"
+" instance (par défaut, le même répertoire que\n"
+" pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check vérifie seulement les instances, pas de\n"
+" modifications\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=RÉP_DONNÉES répertoire des données de l'ancienne instance\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=RÉP_DONNÉES répertoire des données de la nouvelle instance\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr ""
+" -j, --jobs=NUM nombre de processus ou threads simultanés à\n"
+" utiliser\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link lie les fichiers au lieu de les copier vers la\n"
+" nouvelle instance\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --nosync n'attend pas que les modifications soient proprement\n"
+" écrites sur disque\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=OPTIONS options à passer au serveur de l'ancienne\n"
+" instance\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=OPTIONS options à passer au serveur de la nouvelle\n"
+" instance\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=PORT numéro de port de l'ancienne instance (par\n"
+" défaut %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=PORT numéro de port de la nouvelle instance (par\n"
+" défaut %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain conserve les fichiers SQL et de traces en cas\n"
+" de succès\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=RÉP_SOCKET répertoire de la socket à utiliser (par défaut\n"
+" le répertoire courant)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=NOM super-utilisateur de l'instance (par défaut\n"
+" « %s »)\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose active des traces internes verbeuses\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version affiche la version, puis quitte\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone clone au lieu de copier les fichiers vers la\n"
+" nouvelle instance\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy copie les fichiers vers la nouvelle instance (par défaut)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide, puis quitte\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Avant d'exécuter pg_upgrade, vous devez :\n"
+" créer une nouvelle instance (en utilisant la nouvelle version d'initdb)\n"
+" arrêter le postmaster de l'ancienne instance\n"
+" arrêter le postmaster de la nouvelle instance\n"
+"\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Quand vous exécutez pg_upgrade, vous devez fournir les informations suivantes :\n"
+" le répertoire de données pour l'ancienne instance (-d RÉP_DONNÉES)\n"
+" le répertoire de données pour la nouvelle instance (-D RÉP_DONNÉES)\n"
+" le répertoire « bin » pour l'ancienne version (-b RÉP_BIN)\n"
+" le répertoire « bin » pour la nouvelle version (-B RÉP_BIN)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Par exemple :\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ou\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapporter les bogues à <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Vous devez identifier le répertoire où le %s.\n"
+"Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance source"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Recherche du vrai répertoire des données pour l'instance cible"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "n'a pas pu créer le processus de travail : %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "n'a pas pu créer le fil de travail: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "échec de %s() : %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "le processus fils a quitté anormalement : statut %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "le processus fils a quitté anormalement : %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "n'a pas pu lire les droits du répertoire « %s » : %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Réalisation de la mise à jour\n"
+"-----------------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Configuration du prochain OID sur la nouvelle instance"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synchronisation du répertoire des données sur disque"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Mise à jour terminée\n"
+"--------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "le chemin du répertoire pour la nouvelle instance est trop long"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "n'a pas pu créer le répertoire « %s » : %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s : n'a pas pu trouver l'exécutable du programme"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Il semble qu'un postmaster est démarré sur l'ancienne instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Il semble qu'un postmaster est démarré sur la nouvelle instance.\n"
+"Merci d'arrêter ce postmaster et d'essayer de nouveau."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Configuration de la locale et de l'encodage pour la nouvelle instance"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyse de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Gel de toutes les lignes dans la nouvelle instance"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Restauration des objets globaux dans la nouvelle instance"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Restauration des schémas des bases de données dans la nouvelle instance"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Suppression des fichiers à partir du nouveau %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "n'a pas pu supprimer le répertoire « %s »"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Copie de l'ancien %s vers le nouveau serveur"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Configuration du plus ancien XID sur la nouvelle instance"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Réinitialisation des archives WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Configuration du compteur minmxid dans la nouvelle instance"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clonage des fichiers des relations utilisateurs"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Copie des fichiers des relations utilisateurs"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Création des liens pour les fichiers des relations utilisateurs"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "réécriture de « %s » en « %s »"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "clonage de « %s » en « %s »"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "copie de « %s » en « %s »"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "lien de « %s » vers « %s »"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Échec, sortie\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "exécution : %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"La commande SQL a échoué\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "n'a pas pu analyser le fichier de version « %s »"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"n'a pas pu se connecter au postmaster source lancé avec la commande :\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"n'a pas pu se connecter au postmaster cible lancé avec la commande :\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "mémoire épuisée"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Ne peut pas mettre à jour vers ou à partir de la même version de\n"
+"catalogue système quand des tablespaces sont utilisés."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "le répertoire « %s » du tablespace n'existe pas"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "le chemin « %s » du tablespace n'est pas un répertoire"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "n'a pas pu accéder au répertoire « %s » : %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Vérification des types de données line incompatibles"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « line » dans vos tables utilisateurs.\n"
+"Ce type de données a changé de format interne et en entrée/sortie entre vos ancienne\n"
+"et nouvelle versions, donc cette instance ne peut pas être mise à jour\n"
+"actuellement. Vous pouvez supprimer les colonnes problématiques et relancer la mise à jour.\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Vérification des colonnes utilisateurs « unknown » invalides"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « unknown » dans vos tables\n"
+"utilisateurs. Ce type de données n'est plus autorisé dans les tables, donc\n"
+"cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n"
+"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n"
+"une liste des colonnes problématiques dans le fichier :\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Vérification des index hash"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "attention"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Votre installation contient des index hashs. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n"
+"être recréés avec la commande REINDEX. Après la mise à jour, les instructions\n"
+"REINDEX vous seront données."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Votre installation contient des index hash. Ces index ont des formats\n"
+"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n"
+"être recréés avec la commande REINDEX. Le fichier :\n"
+" %s\n"
+"une fois exécuté par psql en tant que superutilisateur va recréer tous les\n"
+"index invalides. Avant cela, aucun de ces index ne sera utilisé."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Votre installation contient le type de données « sql_identifier » dans les tables\n"
+"utilisateurs. Le format sur disque pour ce type de données a changé,\n"
+"donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer\n"
+"les colonnes problématiques, puis relancer la mise à jour.\n"
+"Une liste des colonnes problématiques se trouve dans le fichier :\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Vérification des mises à jour d'extension"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "notice"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Votre installation contient des extensions qui doivent être\n"
+"mises à jour avec la commande ALTER EXTENSION. Le fichier\n"
+" %s\n"
+"une fois exécuté par psql par le superutilisateur mettre à jour\n"
+"ces extensions."
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "The 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"
+#~ msgstr ""
+#~ "\n"
+#~ "L'ancienne instance comprend une fonction « plpython_call_handler »\n"
+#~ "définie dans le schéma « public » qui est un duplicat de celle définie\n"
+#~ "dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n"
+#~ "exécutant dans psql :\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "La version de cette fonction dans le schéma « public » a été créée\n"
+#~ "par une installation de plpython antérieure à la version 8.1 et doit\n"
+#~ "être supprimée pour que pg_upgrade puisse termine parce qu'elle\n"
+#~ "référence un fichier objet partagé « plpython » maintenant obsolète.\n"
+#~ "Vous pouvez supprimer la version de cette fonction dans le schéma\n"
+#~ "« public » en exécutant la commande suivante :\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "dans chaque base de données affectée :\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table, so default permissions must be\n"
+#~ "defined for all large objects. The file\n"
+#~ " %s\n"
+#~ "when executed by psql by the database superuser will set the default\n"
+#~ "permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Votre installation contient des Large Objects. La nouvelle base de données\n"
+#~ "a une table de droit supplémentaire pour les Large Objects, donc les droits\n"
+#~ "par défaut doivent être définies pour tous les Large Objects. Le fichier\n"
+#~ " %s\n"
+#~ "une fois exécuté par psql avec un superutilisateur définira les droits par\n"
+#~ "défaut.\n"
+#~ "\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table. After upgrading, you will be\n"
+#~ "given a command to populate the pg_largeobject_metadata table with\n"
+#~ "default permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n"
+#~ "Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "échec de la connexion à la base de données : %s"
+
+#, c-format
+#~ msgid " "
+#~ msgstr " "
+
+#, c-format
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid ""
+#~ " --index-collation-versions-unknown\n"
+#~ " mark text indexes as needing to be rebuilt\n"
+#~ msgstr ""
+#~ " --index-collation-versions-unknown\n"
+#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n"
+
+#, c-format
+#~ msgid "\"%s\" is not a directory\n"
+#~ msgstr "« %s » n'est pas un répertoire\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid "%s is not a directory\n"
+#~ msgstr "%s n'est pas un répertoire\n"
+
+#, c-format
+#~ msgid "%s.%s: %u to %u\n"
+#~ msgstr "%s.%s : %u vers %u\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#, c-format
+#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+#~ msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n"
+
+#, c-format
+#~ msgid "Checking for large objects"
+#~ msgstr "Vérification des Large Objects"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Création d'un script pour analyser la nouvelle instance"
+
+#, c-format
+#~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les valeurs de la locale ICU de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n"
+#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n"
+#~ "serveur démarré, pensez à exécuter :\n"
+#~ " %s\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "Remove the problem functions from the old cluster to continue.\n"
+#~ msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "L'instance source contient des rôles commençant avec « pg_ »\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "L'instance cible contient des rôles commençant avec « pg_ »\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n"
+#~ "à cause de changements dans l'API du moteur fait lors du développement.\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "Incapable de renommer %s à %s.\n"
+
+#, c-format
+#~ msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+#~ msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n"
+
+#~ msgid "cannot find current directory\n"
+#~ msgstr "ne peut pas trouver le répertoire courant\n"
+
+#~ msgid "cannot write to log file %s\n"
+#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr "échec de la vérification de « %s » : ne peut pas exécuter (droit refusé)\n"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr "échec de la vérification de « %s » : ne peut pas lire le fichier (droit refusé)\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "échec de la vérification de « %s » : pas un fichier régulier\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "échec de la connexion à la base de données : %s"
+
+#, c-format
+#~ msgid "could not access directory \"%s\": %m\n"
+#~ msgstr "n'a pas pu accéder au répertoire « %s » : %m\n"
+
+#, c-format
+#~ msgid "could not create directory \"%s\": %m\n"
+#~ msgstr "n'a pas pu créer le répertoire « %s » : %m\n"
+
+#~ msgid ""
+#~ "could not load library \"%s\":\n"
+#~ "%s\n"
+#~ msgstr ""
+#~ "n'a pas pu charger la biblothèque « %s »:\n"
+#~ "%s\n"
+
+#, c-format
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#, c-format
+#~ msgid "could not open log file \"%s\": %m\n"
+#~ msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n"
+
+#, c-format
+#~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les encodages de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "a échoué pour obtenir le nom de la locale système « %s »\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "a échoué pour obtenir la locale courante\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "a échoué pour restaurer l'ancienne locale « %s »\n"
+
+#, c-format
+#~ msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les valeurs de lc_collate de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les valeurs de lc_ctype de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "les fournisseurs de locale pour la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n"
+
+#, c-format
+#~ msgid "mappings for database \"%s\":\n"
+#~ msgstr "correspondances pour la base de données « %s » :\n"
+
+#, c-format
+#~ msgid "out of memory\n"
+#~ msgstr "mémoire épuisée\n"
+
+#, c-format
+#~ msgid "too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "waitpid() failed: %s\n"
+#~ msgstr "échec de waitpid() : %s\n"
diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po
new file mode 100644
index 0000000..16aaa15
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ja.po
@@ -0,0 +1,1828 @@
+# pg_upgrade.po
+# Japanese message translation file for pg_upgrade
+#
+# Copyright (C) 2011-2022 PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the PostgreSQL package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL 16)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-26 10:21+0900\n"
+"PO-Revision-Date: 2023-09-26 11:38+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"元の実行中サーバーの一貫性チェックを実行しています。\n"
+"--------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"整合性チェックを実行しています。\n"
+"-----------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"* クラスタは互換性があります *"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを\n"
+"initdbで再作成する必要があります。"
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"オプティマイザーの統計は、pg_upgrade では転送されません。そのため\n"
+"新サーバーを起動した後、以下を行うことを検討してください。\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"このスクリプトを実行すると、旧クラスタのデータファイルが削除されます:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"ユーザー定義のテーブル空間もしくは新クラスタのデータディレクトリが\n"
+"旧クラスタのディレクトリ内に存在するため、旧クラスタのデータ\n"
+"ファイルを削除するためのスクリプトを作成できませんでした。 古い\n"
+"クラスタの内容は手動で削除する必要があります。"
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "クラスタのバージョンを確認しています"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "このユーティリティではPostgreSQLバージョン%s以降のバージョンからのみアップグレードできます。"
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "このユーティリティは、PostgreSQLバージョン%sにのみアップグレードできます。"
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "このユーティリティは PostgreSQL の過去のメジャーバージョンにダウングレードする用途では使用できません。"
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "旧クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。"
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "新クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。"
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "稼働中のサーバーをチェックする場合、新旧のポート番号が異なっている必要があります。"
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました"
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "新しいクラスタのテーブル空間ディレクトリを確認しています"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "新しいクラスタのテーブル空間ディレクトリはすでに存在します: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: 新データディレクトリが旧データディレクトリ、つまり %sの中にあってはなりません"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: ユーザー定義テーブル空間の場所がデータディレクトリ、つまり %s の中にあってはなりません。"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "旧クラスタを削除するスクリプトを作成しています"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "ファイル\"%s\"をオープンできませんでした: %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "データベースユーザーがインストールユーザーかどうかをチェックしています"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "データベースユーザー\"%s\"がインストールユーザーではありません"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "ユーザー数を特定できませんでした"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "新クラスタ内で定義できるのはインストールユーザーのみです。"
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "データベース接続の設定を確認しています"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 には接続を許可してはなりません。すなわち、pg_database.datallowconn は false である必要があります"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "致命的"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"template0ではないすべてのデータベースは接続を許可しなければなりません、つまり\n"
+"pg_database.datallowconnがtrueでなければなりません。このクラスタには\n"
+"pg_database.datallowconnがfalseとなっているtemplate0以外のデータベースが\n"
+"存在しています。template0以外のすべてのデータベースへの接続を許可するか、接続が\n"
+"許可されないデータベースをすべて削除することを検討してください。問題のあるデータベースの\n"
+"一覧が以下のファイルにあります:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "準備済みトランザクションをチェックしています"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "移行元クラスタに準備済みトランザクションがあります"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "移行先クラスタに準備済みトランザクションがあります"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint を渡す際にミスマッチが発生する contrib/isn をチェックしています"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタには、bigintデータ型に依存する「contrib/isn」の関数が\n"
+"含まれています。新旧のクラスタ間でのbigint値の受け渡し方法が異なるため、\n"
+"現時点ではこのクラスタをアップグレードすることはできません。\n"
+"旧クラスタ中の「contrib/isn」の関数等を使うデータベースを手動でダンプして、\n"
+"それらを削除してからアップグレードを実行し、その後削除したデータベースを\n"
+"リストアすることができます。 \n"
+"問題のある関数の一覧は以下のファイルにあります:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "ユーザー定義の後置演算子を確認しています"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタにはユーザー定義の後置演算子が存在しますが、これは今後\n"
+"サポートされません。後置演算子を削除するか、前置演算子あるいは関数\n"
+"呼び出しで置き換えることを検討してください:\n"
+"以下のファイルにユーザー定義後置演算子の一覧があります:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "非互換の多態関数を確認しています"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタには、\"anyarray\"または\"anyelement\"型の引数を持つ内部多態関数を\n"
+"参照するユーザー定義のオブジェクトが含まれています。これらのユーザー定義オブジェクトは\n"
+"アップグレード前に削除して、のちに\"anycompatiblearray\"および\"anycompatible\"を\n"
+"引数とする対応する新しい関数を参照するように変更して復元する必要があります。\n"
+"問題となるオブジェクトの一覧は以下のファイルにあります:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS宣言されたテーブルをチェックしています"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタにはWITH OIDS宣言されたテーブルが存在しますが、これは今後\n"
+"サポートされません。以下のコマンドでoidカラムを削除することを検討してください:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"以下のファイルにこの問題を抱えるテーブルの一覧があります:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "ユーザーテーブル内のシステム定義複合型を確認しています"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタ内のユーザーテーブルには、システム定義の複合データ型が含まれています。\n"
+"これらのデータ型のOIDはPostgreSQLのバージョン間にわたって不変ではないため、\n"
+"このクラスタは現時点ではアップグレードできません。問題の列を削除したのちに\n"
+"アップグレードを再実行することができます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "ユーザーテーブル内の reg * データ型をチェックしています"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではユーザーテーブルにreg*データ型のひとつが含まれています。\n"
+"これらのデータ型はシステムOIDを参照しますが、これは pg_upgradeでは\n"
+"保存されないため、現時点ではこのクラスタをアップグレードすることはできません。\n"
+"問題の列を削除したのち、アップグレードを再実行できます。\n"
+"問題のある列の一覧は以下のファイルにあります:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "ユーザーテーブル中で使用されている非互換の\"%s\"データ型をチェックしています"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではユーザーテーブルに\"aclitem\"データ型が含まれています。\n"
+"この型の内部フォーマットはPostgreSQL バージョン16で変更されているため、\n"
+"現時点ではこのクラスタをアップグレードすることはできません。\n"
+"問題の列を削除したのち、アップグレードを再実行できます。\n"
+"問題のある列の一覧は以下のファイルにあります:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "ユーザーテーブル中で使用されている削除された\"%s\"データ型をチェックしています"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではユーザーテーブルにデータ型\"%s\"が含まれています。\n"
+"この\"%s\"型はPostgreSQLバージョン%sでは削除されています、そのためこのクラスタは\n"
+"現時点ではアップグレードできません。問題の列を削除するか、他のデータ型に変更した後に\n"
+"アップグレードを再実行できます。問題のある列の一覧は、以下のファイルにあります: \n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "互換性のない\"jsonb\"データ型をチェックしています"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではユーザーテーブルに\"jsonb\"データ型が含まれています。\n"
+"この型の内部フォーマットは9.4ベータの間に変更されているため、現時点ではこの\n"
+"クラスタをアップグレードすることはできません。\n"
+"問題の列を削除したのち、アップグレードを再実行できます。\n"
+"問題のある列の一覧は以下のファイルにあります:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "'pg_' で始まるロールをチェックしています"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタには\"pg_\"で始まるロールが含まれています。\n"
+"\"pg_\"はシステムロールのために予約されている接頭辞で、これらのロールの\n"
+"名前を変更しないとpg_upgradeではこのクラスタをアップグレードすることは\n"
+"できません。\n"
+"\"pg_\"で始まるロールの一覧は以下のファイルにあります:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "ユーザー定義のエンコーディング変換を確認しています"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタにはユーザー定義のエンコーディング変換が含まれています。\n"
+"変換関数のパラメータがPostgreSQLバージョン14で変更されているため、\n"
+"現時点ではこのクラスタをアップグレードすることはできません。\n"
+"旧クラスタ内のそれらのエンコーディング変換を削除したのち、アップグレードを\n"
+"再実行できます。\n"
+"ユーザー定義のエンコーディング変換の一覧は以下のファイルにあります:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "%s で制御情報が取得できませんでした。: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: データベースクラスタの状態異常"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "移行元クラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。"
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "移行先クラスタはリカバリモード中にシャットダウンされています。アップグレードをするにはドキュメントの通りに \"rsync\" を実行するか、プライマリとしてシャットダウンしてください。"
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "移行元クラスタはクリーンにシャットダウンされていません。"
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "移行先クラスタはクリーンにシャットダウンされていません。"
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "移行元クラスタにクラスタ状態情報がありません:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "移行先クラスタにクラスタ状態情報がありません:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal で問題発生"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: 制御情報の取得で問題発生"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "移行元クラスタに必要な制御情報の一部がありません:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "移行先クラスタに必要な制御情報の一部がありません:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " チェックポイントにおける次のXID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " 最新のチェックポイントにおける次のOID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " 最新のチェックポイントにおける次のMultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " 最新のチェックポイントにおける最古のMultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " 最新のチェックポイントにおける最古のXID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " 最新のチェックポイントにおける次のMultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " リセット後の最初のWALセグメント"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8引数の引き渡し方法"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " 最大アラインメント"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " ブロックサイズ"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " 大きなリレーションセグメントのサイズ"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WALのブロックサイズ"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WALのセグメントサイズ"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " 識別子の最大長"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " インデックス対象カラムの最大数"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " 最大のTOASTチャンクサイズ"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " ラージオブジェクトのチャンクサイズ"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " 日付/時間が整数?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " データチェックサムのバージョン"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "必要な制御情報がないので続行できません。終了します"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"新旧のpg_controldataのアラインメントが不正であるかかまたは一致しません\n"
+"一方のクラスタが32ビットで、他方が64ビットである可能性が高いです"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "新旧の pg_controldata におけるブロックサイズが有効でないかまたは一致しません"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "新旧の pg_controldata におけるリレーションの最大セグメントサイズが有効でないか一致しません"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "新旧の pg_controldata における WAL ブロックサイズが有効でないか一致しません"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "新旧の pg_controldata におけるWALセグメントサイズが有効でないか一致しません"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "新旧の pg_controldata における識別子の最大長が有効でないか一致しません"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "新旧の pg_controldata におけるインデックス付き列の最大数が有効でないか一致しません"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "新旧の pg_controldata におけるTOASTチャンクサイズの最大値が有効でないか一致しません"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "新旧の pg_controldata におけるラージオブジェクトのチャンクサイズが有効でないかまたは一致しません"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "新旧の pg_controldata における日付/時刻型データの保存バイト数が一致しません"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "旧クラスタではデータチェックサムを使用していませんが、新クラスタでは使用しています"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "旧クラスタではデータチェックサムを使用していますが、新クラスタでは使用していません"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "新旧の pg_controldata 間でチェックサムのバージョンが一致しません"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "旧の global/pg_control に \".old\" サフィックスを追加しています"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"旧クラスタを起動する場合、%s/global/pg_control.oldから\n"
+"\".old\"拡張子を削除する必要があります。「リンク」モードが使われて\n"
+"いるため、一度新クラスタを起動してしまうと旧クラスタは安全に起動\n"
+"することができなくなります。"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "グローバルオブジェクトのダンプを作成しています"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "データベーススキーマのダンプを作成しています。"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "%s でpg_ctlのバージョンデータを取得できませんでした。: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "%s からpg_ctlのバージョン出力を取得できませんでした"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "コマンドが長すぎます"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ロックファイル\"%s\"をオープンできませんでした: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失敗*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr ""
+"\"%s実行で問題が発生しました\n"
+"`1"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "ありうる失敗の原因については\"%s\"または\"%s\"の最後の数行を参照してください。"
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "ありうる失敗の原因については、\"%s\"の最後の数行を参照してください。"
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "ログファイル\"%s\"に書き込めませんでした: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "ファイル\"%s\"を読み取り用としてオープンできませんでした:%s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "カレントディレクトリに対して読み書き可能なアクセス権が必要です。"
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "\"%s\"のチェックに失敗しました: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\"はディレクトリではありません"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "\"%s\"のチェックに失敗しました: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "\"%s\"の確認に失敗しました: 実行できません"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "\"%s\"の確認に失敗しました: 間違ったバージョン: 検出\"%s\"、想定\"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "リレーション\"%s.%s\"の(\"%s\"から\"%s\"への)クローン中にエラー: %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のクローン中にエラー: ファイル\"%s\"を開けませんでした: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のクローン中にエラー: ファイル\"%s\"を作成できませんでした: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を開けませんでした: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を作成できませんでした: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"を読めませんでした: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"に書き込めませんでした: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "リレーション\"%s.%s\"の(\"%s\"から\"%s\"への)コピー中にエラー: %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "リレーション\"%s.%s\"の(\"%s\"から\"%s\"への)リンク作成中にエラー: %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"をstatできませんでした: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "リレーション\"%s.%s\"のコピー中にエラー: ファイル\"%s\"中に不完全なページがありました"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "新旧ディレクトリ間のファイルのクローンができませんでした: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "ファイル\"%s\"を作成できませんでした: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "このプラットフォームではファイルのクローンはサポートされません"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"新旧のデータディレクトリ間でハードリンクを作成できませんでした: %s\n"
+"リンクモードでは、新旧のデータディレクトリが同じファイルシステム上に存在しなければなりません。"
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "必要なライブラリの有無を確認しています"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ライブラリ\"%s\"をロードできませんでした: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "データベース: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタでは、移行先の環境にはないロード可能ライブラリを参照しています。\n"
+"これらのライブラリを移行先の環境に追加するか、もしくは移行元の環境から\n"
+"それらを使っている関数を削除してください。 問題のライブラリの一覧は、\n"
+"以下のファイルに入っています:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "データベース\"%2$s\"で OID %1$u のリレーション名が一致しません: 元の名前 \"%3$s.%4$s\"、新しい名前 \"%5$s.%6$s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "データベース\"%s\"で新旧のテーブルの照合に失敗しました"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " これは \"%s.%s\" 上のインデックスです"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " これは OID %u 上のインデックスです"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " これは \"%s.%s\" の TOAST テーブルです"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " これは OID %u の TOAST テーブルです"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "データベース\"%2$s\"でOID%1$uを持つ新リレーションに対応するリレーションが旧クラスタ内にありません: %3$s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "データベース\"%2$s\"でOID %1$uを持つ旧リレーションに対応するリレーションが新クラスタ内にありません: %3$s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"移行元データベース:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"移行先データベース:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0が見つかりません"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "データベース: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: rootでは実行できません"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "不正な旧ポート番号"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "不正な新ポート番号"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "詳細は\"%s --help\"を参照してください。\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "詳細表示モードで実行しています"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "旧クラスタのバイナリが置かれている"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "新クラスタのバイナリが置かれている"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "旧クラスタのデータが置かれている"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "新クラスタのデータが置かれている"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "ソケットが作成される"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "カレントディレクトリを特定できませんでした"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "Windowsでは、新クラスタのデータディレクトリの中でpg_upgradeを実行することはできません"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgradeは、PostgreSQLのクラスタを別のメジャーバージョンにアップグレードします。\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "使い方:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [オプション]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "オプション:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧クラスタの実行ファイルディレクトリ\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新クラスタの実行ファイルディレクトリ(デフォルト\n"
+" はpg_upgradeと同じディレクトリ)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check クラスタのチェックのみ、データを一切変更しない\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧クラスタのデータディレクトリ\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新クラスタのデータディレクトリ\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs 使用する同時実行プロセスまたはスレッドの数\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr ""
+" -k, --link 新クラスタにファイルをコピーする代わりに\n"
+" リンクする\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync 変更のディスクへの確実な書き出しを待機しない\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS サーバーに渡す旧クラスタのオプション\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS サーバーに渡す新クラスタのオプション\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧クラスタのポート番号(デフォルト %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新クラスタのポート番号(デフォルト %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQLとログファイルを、成功後も消さずに残す\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 使用するソケットディレクトリ(デフォルトは\n"
+" カレントディレクトリ)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME クラスタのスーパーユーザー(デフォルト\"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 詳細な内部ログを有効化\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr ""
+" --clone 新クラスタにファイルをコピーする代わりに\n"
+" クローンする\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy 新クラスタにファイルをコピーする(デフォルト)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade を実行する前に、以下のことを行ってください:\n"
+" (新バージョンのinitdbを使って)新しいデータベースクラスタを作成する\n"
+" 旧クラスタのpostmasterをシャットダウンする\n"
+" 新クラスタのpostmasterをシャットダウンする\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade を動かす場合、次の情報を指定する必要があります: \n"
+" 旧クラスタのデータディレクトリ (-d DATADIR)\n"
+" 新クラスタのデータディレクトリ (-D DATADIR) \n"
+" 旧バージョンの\"bin\"ディレクトリ (-b BINDIR)\n"
+" 新バージョンの\"bin\"ディレクトリ(-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"実行例:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"または\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"バグは<%s>に報告してください。\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"%sディレクトリを指定する必要があります。\n"
+"コマンドラインオプション %s または環境変数 %s を使用してください。"
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "移行元クラスタの実際のデータディレクトリを探しています"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "移行先クラスタの実際のデータディレクトリを探しています"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "%s でデータディレクトリを取得できませんでした。: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "ファイル\"%2$s\"の%1$d行目を読み取れませんでした: %3$s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "ユーザー指定の旧ポート番号%huは%huに訂正されました"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "ワーカープロセスを作成できませんでした: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "ワーカースレッドを作成できませんでした: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() が失敗しました: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "子プロセスが異常終了しました: ステータス %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "子ワーカーが異常終了しました: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"アップグレードを実行しています。\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "新クラスタの、次の OID を設定しています"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "データディレクトリをディスクに同期します"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"アップグレードが完了しました\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "新クラスタのディレクトリ・パスが長すぎます"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"を作成できませんでした: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: 自身の実行ファイルが見つかりませんでした"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"旧クラスタで稼働中のpostmasterがあるようです。\n"
+"そのpostmasterをシャットダウンしたのちにやり直してください。"
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"新クラスタで稼働中のpostmasterがあるようです。\n"
+"そのpostmasterをシャットダウンしたのちやり直してください。"
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "新クラスタの、ロケールとエンコーディングを設定しています"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "新クラスタ内のすべての行を分析しています"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "新クラスタ内のすべての行を凍結しています"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "新クラスタ内のグローバルオブジェクトを復元しています"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "新クラスタ内にデータベーススキーマを復元しています"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "新しい %s からファイルを削除しています"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "ディレクトリ\"%s\"を削除できませんでした"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "旧の %s を新サーバーにコピーしています"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "新クラスタの、最古のXIDを設定しています"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "新クラスタの、次のトランザクションIDと基点を設定しています"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "新クラスタの、次のmultixact IDとオフセットを設定しています"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "新クラスタの最古のmultixact IDを設定しています"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL アーカイブをリセットしています"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "新クラスタのfrozenxidとminmxidカウンタを設定しています"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "新クラスタのminmxidカウンタを設定しています"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "ユーザーリレーションファイルをクローニングしています"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "ユーザーリレーションのファイルをコピーしています"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "ユーザーリレーションのファイルをリンクしています"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "新クラスタ内に旧データベース\"%s\"が見つかりません"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\"ファイル (\"%s\"から\"%s\")の存在確認中にエラー: %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "\"%s\"を\"%s\"に書き換えています"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "\"%s\"から\"%s\"へクローンしています"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "\"%s\"を\"%s\"にコピーしています"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "\"%s\"から\"%s\"へリンクを作成しています"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "失敗しました、終了しています\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "実行中: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL コマンドが失敗しました\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "バージョンファイル\"%s\"をオープンできませんでした: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "バージョンファイル\"%s\"をパースできませんでした"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"以下のコマンドで起動した移行元postmasterに接続できませんでした:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"以下のコマンドで起動した移行先postmasterに接続できませんでした:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl が移行元サーバーの起動に失敗した、あるいは接続に失敗しました"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl が移行先サーバーの起動に失敗した、あるいは接続に失敗しました"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "メモリ不足です"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq の環境変数 %s で、ローカルでないサーバー値が設定されています: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"テーブル空間を使用している場合、同じシステムカタログバージョン間での\n"
+"アップグレードはできません。"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "テーブル空間のディレクトリ\"%s\"が存在しません"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "テーブル空間のディレクトリ\"%s\"を stat できませんでした: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "テーブル空間のパス\"%s\"がディレクトリではありません"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"にアクセスできませんでした: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "非互換の \"line\" データ型を確認しています"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではユーザーテーブルに\"line\"データ型が含まれています。\n"
+"このデータ型は新旧のクラスタ間で内部形式および入出力フォーマットが\n"
+"変更されているため、このクラスタは現時点ではアップグレードできません。\n"
+"問題の列を削除したのちにアップグレードを再実行できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "無効な\"unknown\"ユーザー列をチェックしています"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではユーザーテーブルに \"unknown\" データ型が含まれています。\n"
+"このデータ型はもはやテーブル内では利用できないため、このクラスタは現時点\n"
+"ではアップグレードできません。問題の列を削除したのち、アップグレードを\n"
+"再実行できます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ハッシュインデックスをチェックしています"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n"
+"内部フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n"
+"アップグレードが終わったら、REINDEX を使った操作方法が指示されます。"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"このクラスタにはハッシュインデックスがあります。このインデックスは新旧のクラスタ間で\n"
+"内部フォーマットが異なるため、REINDEX コマンドを使って再構築する必要があります。\n"
+"以下のファイル\n"
+" %s\n"
+"を、psqlを使用してデータベースのスーパーユーザーとして実行することで、無効になった\n"
+"インデックスを再構築できます。\n"
+"それまでは、これらのインデックスは使用されません。"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "無効な\"sql_identifier\"ユーザー列を確認しています"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"このクラスタではでは”sql_identifier”データ型がユーザーテーブルに含まれています。\n"
+"このデータ型のディスク上での形式は変更されているため、このクラスタは現時点では\n"
+"アップグレードできません。問題のある列を削除した後にアップグレードを再実行する\n"
+"ことができます。\n"
+"問題のある列の一覧は、以下のファイルにあります: \n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "機能拡張のアップデートを確認しています"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "注意"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"このクラスタにはALTER EXTENSIONコマンドによるアップデートが必要な機能拡張が\n"
+"あります。以下のファイルをpsqlを使ってデータベースのスーパーユーザーとして実行することで\n"
+"これらの機能拡張をアップデートできます。\n"
+" %s"
diff --git a/src/bin/pg_upgrade/po/ka.po b/src/bin/pg_upgrade/po/ka.po
new file mode 100644
index 0000000..a137cf4
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ka.po
@@ -0,0 +1,1910 @@
+# Georgian message translation file for pg_upgrade
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2024-01-04 08:18+0000\n"
+"PO-Revision-Date: 2024-01-05 09:28+0100\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.3.2\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"თანმიმდევრულობის შემოწმების შესრულება ძველ ცოცხალ სერვერზე\n"
+"------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"თანმიმდევრულობის შემოწმების ჩატარება\n"
+"-----------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*კლასტერები თავსებადია *"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"თუ ამ წერტილის შემდეგ pg_upgrade ავარიულად დასრულდება, გაგრძელებამდე\n"
+"ახალი კლასტერის init-db-ის გაკეთება შეიძლება თავიდან მოგიწიოთ."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"ოპტიმიზატორის სტატისტიკ-ის გადატანა pg_upgrade-ის მიერ არ ხდება.\n"
+"როცა ახალ სერვერს გაუშვებთ, შეასრულეთ ბრძანება:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"ამ სკრიპტის გაშვება ძველი კლასტერის მონაცემების ფაილებს წაშლის:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"მომხმარებლის მიერ აღწერილი ცხრილის სივრცეების ან ახალი კლასტერის \n"
+"მონაცემების საქაღალდის ძველი კლასტერის საქაღადლდეში არსებობის გამო\n"
+"ძველი კლასტერის მონაცემების წაშლის სკრიპტის შექმნა შეუძლებელია. ძველი კლასტერის\n"
+" შემცველობა ხელით უნდა წაშალოთ."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "კლასტერის ვერსიების შემოწმება"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "ამ პროგრამას განახლება PostgreSQL-ის ვერსიის %s-დან და ზემოთ შეუძლია."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "ამ პროგრამას შეუძლია მხოლოდ PostgreSQL ვერსიაზე გადასვლა %s."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "ეს პროგრამა არ შეიძლება გამოყენებულ იქნას უფრო ძველი ძირითადი PostgreSQL ვერსიების ჩამოსაწევად."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "ძველი კლასტერის მონაცემები და გამშვები ფაილის საქაღალდეები სხვადასხვა ძირითადი ვერსიიდანაა."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "ახალი კლასტერის მონაცემებისა და გამშვები ფაილების საქაღალდეები სხვადასხვა ძირითად ვერსიებს მიეკუთვნება."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "ცოცხალი სერვერის შემოწმებისას ძველი და ახალი პორტის ნომრები სხვადასხვა უნდა იყოს."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "ახალი კლასტერული მონაცემთა ბაზა \"%s\" ცარიელი არაა: ნაპოვნია ურთიერთობა \"%s.%s\""
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "ახალი კლასტერის ცხრილების სივრცის საქაღალდეების შემოწმება"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "ახალი კლასტერის ცხრილების სივრცის საქაღალდე უკვე არსებობს: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"გაფრთხილება: ახალი მონაცემების საქაღალდე ძველი მონაცემების საქაღალდის შიგნით არ უნდა იყოს. მაგ: %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"გაფრთხილება: მომხმარებლის მიერ აღწერილი ცხრილის სივრცეების მდებარეობები მონაცემების საქაღალდის შიგნით არ უნდა იყოს. მაგ: %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "ძველი კლასტერის წასაშლელად სკრიპტის შექმნა"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "ფაილის გახსნის შეცდომა \"%s\": %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "ფაილზე \"%s\" გაშვების წვდომის დამატების შეცდომა: %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "შემოწმება, დამყენებელი მომხმარებელი დაყენების მომხმარებელს თუ უდრის"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "მონაცემთა ბაზის მომხმარებელი \"%s\" არ არის დაყენების მომხმარებელი"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "ვერ დადგინდა მომხმარებელთა რაოდენობა"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "ახალი კლასტერისთვის მხოლოდ დაყენების მომხმარებლის მითითებაა შესაძლებელი."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "მონაცემთა ბაზის კავშირის პარამეტრების შემოწმება"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0-თან დაკავშირება შეუძლებელი უნდა იყოს. ანუ, მისი pg_database.datallowconn პარამეტრი false უნდა იყოს"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "ფატალური"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"ყველა არა-template0 ბაზაზე მიერთება შესაძლებელი უნდა იყოს, ანუ მათი\n"
+"pg_database.datallowconn -ი true-ს უნდა უნდოდეს. თქვენი ვერსია შეიცავს\n"
+"არა-template0 ბაზებს, რომლების pg_database.datallowconn -ი false-ზეა დაყენებული.\n"
+"სასურველია დაუშვათ მიერთება ყველა არა-template0 ბაზაზე, ან\n"
+"წაშალოთ ბაზები, რომლებზეც წვდომა არ არსებობს.\n"
+"პრობლემური ბაზების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "მომზადებული ტრანზაქციების შემოწმება"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "საწყისი კლასტერი მომზადებულ ტრანზაქციებს შეიცავს"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "სამიზნე კლასტერი მომზადებულ ტრანზაქციებს შეიცავს"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "\"contrib/isn\"-ის bgint-passing-ის არ-დამთხვევაზე შემოწმება"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსისა შეიცავს \"contrib/isn\" ფუნქციებს, რომლებიც bigint მონაცემების ტიპს ეყრდნობა. თქვენი ძველი \n"
+"და ახალი კლასტერები bigint მნიშვნელობებს სხვადასხვანაირად ამუშავებენ, ამიტომ თქვენი კლასტერის განახლება ამჟამად \n"
+"შეუძლებელია. შეგიძლიათ, თქვენს ძველ კლასტერში, ბაზები, რომლებიც \"contrib/isn\" ფუნქციებს იყენებს, წაშალოთ\n"
+", განაახლოთ ბაზა და აღადგინოთ ფუნქციები. პრობლემური ფუნქციების სია შეგიძლიათ იხილოთ ფაილში:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "მომხმარებლის მიერ აღწერილი postfix ოპერატორების არსებობის შემოწმება"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს მომხმარებლის მიერ აღწერილ postfix ოპერატორებს,\n"
+"რომლებიც მხარდაჭერილი აღარაა. საჭირო იქნება postfix ოპერატორების წაშლა და მათი \n"
+"prefix ოპერატორებით ან ფუნქციების გამოძახებებით ჩანაცვლება.\n"
+"მომხმარებლის მიერ აღწერილი postfix ოპერატორების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "შეუთავსებელი პოლიმორფული ფუნქციების არსებობის შემოწმება"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს მომხმარებლის მიერ აღწერილ ობიექტებს, რომლებიც\n"
+"შიდა პოლიმორფულ ფუნქციებს იძახებენ არგუმენტების ტიპით \"anyarray\" ან \"anyelement\".\n"
+"ეს მომხმარებლის მერ აღწერილი ობიექტები უნდა მოაცილოთ ვერსიის აწევამდე და\n"
+"შემდეგ აღადგინოთ, რათა მათ ახალ შესაბამის ფუნქციებს მიმართონ, არგუმენტების ტიპით\n"
+"\"anycompatiblearray\" და \"anycompatible\".\n"
+"ფაილში არსებული პრობლემური ობიექტები:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS ცხრილების შემოწმება"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს ცხრილებს, რომლებიც WITH OIDS-ითაა\n"
+"აღწერილი, რაც მხარდაჭერილი აღარაა. საჭიროა წაშალოთ oid ცხრილები ბრძანებით\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"ცხრილების სია, რომელსაც ეს პრობლემა გააჩნიათ, შეგიძლიათ იხილოთ ფაილში:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "მომხმარებლის ცხრილებში სისტემის მიერ განსაზღვრული კომპოზიტური ტიპების შემოწმება"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მომხმარებლის ცხრილებში სისტემის მიერ აღწერილ კომპოზიტურ ტიპებს შეიცავს.\n"
+"ამ ტიპის OID-ები PostgreSQL-ის ვერსიებს შორის მუდმივი არაა, ამიტომ ამ კლასტერის განახლება ამჟამად შეუძლებელია შეგიძლიათ\n"
+"წაშალოთ პრობლემური სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების სიის ხილვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "მომხმარებლის ცხრილებში reg* მონაცემის ტიპების შემოწმება"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მომხმარებლის ცხრილებში reg* მონაცემების ტიპს შეიცავს\n"
+"ამ მონაცემების ტიპის სისტემური OID-ები pg_upgrade-ის იერ არ ნარჩუნდება, ამიტომ კლასტერის\n"
+"განახლება შეუძლებელია. პრობლემის მოსაგვარებლად შეგიძლიათ წაშალოთ შესაბამისის სვეტები\n"
+"და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "მომხმარებლის ცხრილებში შეუთავსებელი \"%s\" მონაცემების ტიპის შემოწმება"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის ცხრილებში მონაცემების \"jsonb\" ტიპს შეიცავს.\n"
+"\"jsonb\"-ის შიდა ფორმატი შეიცვალა 9.4 ბეტას დროს, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "მომხმარებლის ცხრილებში წაშლილი \"%s\" მონაცემის ტიპების შემოწმება"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის ცხრილებში მონაცემების \"%s\" ტიპს შეიცავს.\n"
+"ტიპი \"%s\" გაუქმდა PostgreSQL-ის %s-ე ვერსიაში\n"
+"ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემური სვეტები, ან შეცვალოთ მათი ტიპი და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "შეუთავსებელი \"jsonb\" მონაცემთა ტიპის შემოწმება"
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის ცხრილებში მონაცემების \"jsonb\" ტიპს შეიცავს.\n"
+"\"jsonb\"-ის შიდა ფორმატი შეიცვალა 9.4 ბეტას დროს, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "როლების შემოწმება, რომლებიც \"pg_\"-ით იწყება"
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია შეიცავს როლებს, რომლებიც\n"
+"\"pg_\" სუფიქსით იწყება. ეს კი სისტემური როლებისთვის შემონახული როლებია.\n"
+"კლასტერის განახლება შეუძლებელია მანამდე, სანამ ამ როლებს სახელს არ გადაარქმევთ.\n"
+"როლების სია, რომლებიც \"pg_\"-ით იწყებიან, შეგიძლიათ იპოვოთ ფაილში:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "მომხმარებლის მიერ განსაზღვრული კოდირების კონვერტაციის შემოწმება"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის მიერ აღწერილ გადაყვანებს შეიცავს.\n"
+"\"jsonb\"-ის შიდა ფორმატი შეიცვალა 14-ე ვერსიაში, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"მომხმარებლის მიერ აღწერილი გადაყვანების ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "%s-სთვის საკონტროლო მონაცემების მიღების შეცდომა: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: ბაზის კლასტერის მდგომარეობის პრობლემა"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "საწყისი კლასტერი აღდგენის რეჟიმში იყო, როცა გაითიშა. განსაახლებლად გამოიყენეთ \"rsync\", როგორც ეს დოკუმენტაციაშია, ან გამორთეთ, როგორც ძირითადი."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "სამიზნე კლასტერი აღდგენის რეჟიმში იყო, როცა გაითიშა. განსაახლებლად, გამოიყენეთ \"rsync\", როგორც ეს დოკუმენტაციაშია, ან გამორთეთ, როგორც ძირითადი."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "საწყისი ბაზა წესების დაცვით არ გამორთულა."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "სამიზნე ბაზა წესების დაცვით არ გამორთულა."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "საწყის კლასტერს მდგომარეობის ინფორმაცია არ გააჩნია:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "სამიზნე კლასტერს მდგომარეობის ინფორმაცია არ გააჩნია:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal -ის პრობლემა"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: controldata -ის მიღების შეცდომა"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "საწყის კლასტერს ზოგიერთი საჭირო კონტროლის ინფორმაცია არ გააჩნია:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "სამიზნე კლასტერს ზოგიერთი საჭირო კონტროლის ინფორმაცია არ გააჩნია:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " საკონტროლო წერტილის შემდეგი XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " უახლესი საკონტროლო წერტილის შემდეგი OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " უახლესი საკონტროლო წერტილის შემდეგი MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " უახლესი საკონტროლო წერტილის უძველესი MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " უახლესი საკონტროლო წერტილის უძველესი XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " უახლესი საკონტროლო წერტილის შემდეგი MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " პირველი WAL სეგმენტი გადატვირთვის შემდეგ"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 არგუმენტი გავლის მეთოდი"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " მაქსიმალური სწორება"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " ბლოკის ზომა"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " დიდი ურთიერთობის სეგმენტის ზომა"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL ბლოკის ზომა"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL-ის სეგმენტის ზომა"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " იდენტიფიკატორის მაქსიმალური სიგრძე"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " ინდექსირებული სვეტების მაქსიმალური რაოდენობა"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " TOAST ნაგლეჯის მაქსიმალური ზომა"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " დიდი ობიექტის ნაგლეჯის ზომა"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " დროები და თარიღები მთელი რიცხვებია?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " მონაცემების საკონტროლო ჯამის ვერსია"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "ვერ გაგრძელდება საჭირო კონტროლის ინფორმაციის გარეშე, დასრულება"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"ძველი და ახალი pg_controldata სწორებები ბათილია ან არ ემთხვევა\n"
+"სავარაუდოდ, ერთი კლასტერი 32-ბიტიანია, დანარჩენი კი 64"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata ბლოკის ზომები ბათილია ან არ ემთხვევა"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata მაქსიმალური ურთიერთობის სეგმენტის ზომები ბათილია ან არ ემთხვევა"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata-ის WAL-ის ბლოკის ზომები არასწორია ან არ ემთხვევა"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata-ის WAL-ის სეგმენტის ზომები არასწორია ან არ ემთხვევა"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata-ის იდენტიფიკატორის მაქსიმალური სიგრძეები არასწორია ან არ ემთხვევა"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata-ის მაქსიმალური ინდექსირებული სვეტები არასწორია ან არ ემთხვევა"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata-ის TOAST-ის მაქსიმალური ნაგლეჯის ზომები არასწორია ან არ ემთხვევა"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "ძველი და ახალი pg_controldata-ის დიდი ობიექტის ნაგლეჯის ზომები არასწორია ან არ ემთხვევა"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "ძველი და ახალი pg_controldata-ის თარიღი/დროის შენახვის ტიპები არ ემთხვევა"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "ძველი კლასტერი არ იყენებს მონაცემთა შემოწმებას, მაგრამ ახალი აკეთებს"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "ძველი კლასტერი იყენებს მონაცემთა შემოწმებას, ახალი კი არა"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "ძველი და ახალი კლასტერების pg_controldata -ის საკონტროლო ჯამის ვერსიები არ ემთხვევა"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "ძველ გლობალურ/pg_control-ზე \".old\" სუფიქსის დამატება"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "გადარქმევის შეცდომა %s - %s: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"თუ გნებავთ, გაუშვათ ძველი კლასტერი, საჭიროა\n"
+"წაშალოთ .old სუფიქსი %s/global/pg_control.old-დან.\n"
+"იმის გამო, რომ გამოყენებული იყო \"ბმულის\" რეჟიმი, ძველი კლასტერის გაშვება მას შემდეგ, რაც\n"
+"ახალი სერვერი გაეშვა, ძველის გაშვება უსაფრთხო აღარაა."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "გლობალური ობიექტების დამპის შექმნა"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "მონაცემთა ბაზის სქემების დამპის შექმნა"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "%s გამოყენებით pg_ctl ვერსიის მონაცემები ვერ მივიღე: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "%s გამოყენებით pg_ctl ვერსია ვერ მივიღე"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "ბრძანება ძალიან გრძელია"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*შეცდომა"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "%s-ის შესრულების პრობლემა"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"ავარიის მიზეზის გამოსავლენად გადაავლეთ თვალი \n"
+"\"%s\"-ის ან \"%s\"-ის ბოლო რამდენიმე ფაილს."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"ავარიის მიზეზის გამოსავლენად გადაავლეთ თვალი\n"
+"\"%s\"-ის ბოლო რამდენიმე ხაზს."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "ჟურნალის ფაილში (%s) ჩაწერის შეცდომა: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "შეცდომა %s-ის წასაკითხად გახსნისას: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "მიმდინარე საქაღალდეში ჩაწერა/წაკითხვის წვდომები აუცილებელია."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "\"%s\" შემოწმების შეცდომა: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "%s საქაღალდეს არ წარმოადგენს"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "\"%s\" შემოწმების შეცდომა: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "\"%s\" შემოწმების შეცდომა: გაშვების შეცდომა"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "\"%s\" შემოწმების შეცდომა: არასწორი ვერსია: ვიპოვე \"%s\" მოველოდი \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კლონირებისას (\"%s\"-დან \"%s\"-მდე): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კლონირებისას: ფაილის (\"%s\") გახსნის შეცდომა: %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კლონირებისას: ფაილის (\"%s\") შექმნის შეცდომა: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას : ფაილის (\"%s\") გახსნის შეცდომა: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილის (\"%s\") შექმნის შეცდომა: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილის (\"%s\") წაკითხვის შეცდომა: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილში (\"%s\") ჩაწერის შეცდომა: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას (\"%s\"-დან \"%s\"-მდე): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) ბმულის შექმნისას (\"%s\"-დან \"%s\"-მდე): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "შეცდომა ურთიერთობის (%s.%s) კოპირებისას: ფაილის (\"%s\") აღმოჩენის შეცდომა: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "შეცდომა ურთიერთობის \"%s.%s\" კოპირებისას: ფაილში \"%s\" ნაპოვნია ნაწილობრივი გვერდი"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "მონაცემების ძველ და ახალ საქაღალდეებს შორის ფაილის კლონირების შეცდომა: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "ფაილის (%s) შექმნის შეცდომა: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "ამ პლატფორმაზე კლონირება მხარდაჭერილი არაა"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"ძველი და ახალი მონაცემების საქაღალდეებს შუა მყარი ბმულის შექმნა შეუძლებელია: %s\n"
+"ბმულის რეჟიმში ძველი და ახალი მონაცემების საქაღალდეები ერთი და იგივე ფაილურ სისტემაზე უნდა იყოს."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "საჭირო ბიბლიოთეკების არსებობის შემოწმება"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "ბიბლიოთეკის (\"%s\") ჩატვირთვის შეცდომა: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "მონაცემთა ბაზაში: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მიმართავს ჩატვირთვად ბიბლიოთეკები, რომლებიც თქვენს სისტემაში\n"
+"აღმოჩენილი არაა. შეგიძლიათ დაამატოთ ეს ბიბლიოთეკები ახალ ვარიანტში,\n"
+"ან წაშალოთ ფუნქციები, რომლებიც მათ იყენებენ, ძველი ვერსიიდან.\n"
+"პრობლემური ბიბლიოთეკების სიის ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "ურთიერთობის სახელები OID-ით %u ბაზაში \"%s\" არ ემთხვევა: ძველი სახელი \"%s.%s.\", ახალი კი \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "შეცდომა ძველ და ახალ ცხრილებს შორის დამთხვევისას ბაზაში \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " რომელიც ინდექსია \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " რაც არის ინდექსი OID-ზე %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " რომელიც TOAST ცხრილია \"%s.%s\"-სთვის"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " რომელიც TOAST ცხრილია %u-ე OID-სთვის"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "ძველ კლასტერში ახალი ურთიერთობისთვის OID -ით %u ბაზაში \"%s\" დამთხვევა ვერ ვიპოვე: %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "ახალ კლასტერში ძველი ურთიერთობისთვის OID -ით %u ბაზაში \"%s\" დამთხვევა ვერ ვიპოვე: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"საწყისი ბაზები:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"სამიზნე ბაზები:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 ნაპოვნი არაა"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "ბაზა: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: root-ით ვერ გაუშვებთ"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "არასწორი ძველი პორტის ნომერი"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ახალი პორტის არასწორი ნომერი"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "დამატებითი შეტყობინებების ჩართვა"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "ძველი კლასტერის გამშვები ფაილები მდებარეობს"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "ახალი კლასტერის გამშვები ფაილები მდებარეობს"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "ძველი კლასტერის მონაცემები მდებარეობს"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "ახალი კლასტერის მონაცემები მდებარეობს"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "სოკეტები შეიქმნება"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "მიმდინარე საქაღალდის იდენტიფიკაციის პრობლემა"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "pg_upgrade-ის გაშვება Windows-ზე ახალი კლასტერის მონაცემების საქაღალდიდან შეუძლებელია"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade -ი PostgreSQL კლასტერს სხვა მთავარ ვერსიაზე განაახლებს.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [პარამეტრი]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "პარამეტრები:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR ძველი კლასტერის გამშვები ფაილების საქაღალდე\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR ახალი კლასტერის გამშვები ფაილების საქაღალდე (ნაგულისხმევი\n"
+" იგივე საქაღლდე, რაც pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check კლასტერების მხოლოდ შემოწმება. მონაცემები არ შეიცვლება\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR ძველი კლასტერის მონაცემთა საქაღალდე\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR ახალი კლასტერის მონაცემთა საქაღალდე\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM ერთდროულად გასაშვები პროცესების ან ნაკადების რიცხვი\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link ახალ კლასტერში ფაილების გადაბმა, კოპირების ნაცვლად\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ ჩაწერას\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, -old-options=OPTIONS სერვერზე გადასაცემი ძველი კლასტერის პარამეტრები\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, -new-options=OPTIONS სერვერზე გადასაცემი ახალი კლასტერის პარამეტრები\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, -old-port=PORT ძველი კლასტერის პორტის ნომერი (ნაგულისხმევი %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT ახალი კლასტერის პორტის ნომერი (ნაგულისხმევი %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain SQL და ჟურნალის ფაილებს დატოვება წარმატების შემდეგ \n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR სოკეტის საქაღალდე (ნაგულისხმევია მიმდინარე.)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=მომხმარებელი კლასტერის ზემომხმარებლის სახელი (ნაგულისხმევი: \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose შიდა დამატებითი ჟურნალის ჩართვა\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის ჩვენება და გასვლა\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone ახალ კლასტერში ფაილების კლონირება კოპირების ნაცვლად \n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --clone ახალ კლასტერში ფაილების კლონირება კოპირების ნაცვლად (ნაგულისხმევი)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade-ის გაშვებამდე აუცილებელია:\n"
+" შექმნათ ახალი ბაზის კლასტერი (initdb-ის ახალი ვერსიით)\n"
+" გამორთოთ postmaster სერვისი ძველ კლასტერზე\n"
+" გამორთოთ postmaster სერვისი ახალ კლასტერზე\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade-ის გაშვებისას საჭიროა შემდეგი ინფორმაციის გადაცემა:\n"
+" ძველი კლასტერის მონაცემების საქაღალდე (-d DATADIR)\n"
+" ახალი კლასტერის მონაცემების საქაღალდე (-D DATADIR)\n"
+" ძველი ვერსიის \"bin\" საქაღალდე (-b BINDIR)\n"
+" ახალი ვერსიის \"bin\" საქაღალდე (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"მაგალითად:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"ან\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"შეცდომების შესახებ მიწერეთ: %s\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"%s-ის საქაღალდის იდენტიფიკაცია აუცილებელია.\n"
+"გამოიყენეთ ბრძანების სტრიქონის %s პარამეტრი ან გარემოს ცვლადი %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "საწყისი კლასტერის რეალური მონაცემთა საქაღალდის პოვნა"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "სამიზნე კლასტერის რეალური მონაცემთა საქაღალდის პოვნა"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "ვერ მივიღე მონაცემთა საქაღალდე %s გამოყენებით: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "ფაილიდან (%2$s) %1$d-ე ხაზის წაკითხვა შეუძლებელია: %3$s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "მომხმარებლის მიერ მოწოდებული ძველი პორტის ნომერი %hu შესწორებულია %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "დამხმარე პროცესის შექმნა შეუძლებელია: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "დამხმარე ნაკადის შექმნა შეუძლებელია: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s()-ის შეცდომა: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "შვილი პროცესი არანორმალურად დასრულდა სტატუსით %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "შვილი დამხმარე არანორმალურად დასრულდა სტატუსით %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "საქაღალდის წვდომების წაკითხვა შეუძლებელია \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"მიმდინარეობს განახლება\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "ახალი კლასტერისთვის შემდეგი OID დაყენება"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "მონაცემების საქაღალდის დისკთან სინქრონიზაცია"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"განახლება დასრულებულია\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "ახალი კლასტერის საქაღალდის ბილიკი ძალიან გრძელია"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: საკუთარი პროგრამის გამშვები ფაილის პოვნა შეუძლებელია"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"როგორც ჩანს, ძველ კლასტერს postmaster ჯერ კიდევ ემსახურება.\n"
+"გამორთეთ postmaster და თავიდან სცადეთ."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"როგორც ჩანს, ახალ კლასტერს postmaster ემსახურება.\n"
+"გამორთეთ postmaster და თავიდან სცადეთ."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "ახალი კლასტერის ლოკალის და კოდირების დაყენება"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "ახალ კლასტერში ყველა მწკრივის ანალიზი"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "ახალ კლასტერში ყველა მწკრივის გაყინვა"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "ახალი კლასტერში გლობალური ობიექტების აღდგენა"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "ახალ კლასტერში ბაზის სქემების აღდგენა"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "ფაილების წაშლა ახალი %s-დან"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "საქაღალდის (\"%s\") წაშლის შეცდომა"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "ძველი %s -ის კოპირება ახალ სერვერზე"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "უძველესი XID დაყენება ახალი კლასტერისთვის"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "ახალი კლასტერისთვის შემდეგი ტრანზაქციის ეპოქისა და ID-ის დაყენება"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "ახალი კლასტერისთვის შემდეგი მულტიტრანზაქციის წანაცვლებისა და ID-ის დაყენება"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "ახალ კლასტერში უძველესი მულტიტრანზაქციის ID-ის დაყენება"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL არქივების გადატვირთვა"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "ახალ კლასტერში frozenxid და minmxid მთვლელების დაყენება"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "ახალ კლასტერში minmxid მთვლელის დაყენება"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "მომხმარებლის ურთიერთობის ფაილების კლონირება"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "მომხმარებლის ურთიერთობის ფაილების კოპირება"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "მომხმარებლის ურთიერთობის ფაილების გადაბმა"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "ძველი მონაცემთა ბაზა \"%s\" ახალ კლასტერში არ არის ნაპოვნი"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "შეცდომა ფაილის არსებობის შემოწმებისას \"%s.%s\" (\"%s\" \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "გადაწერა \"%s\"-დან \"%s\"-მდე"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "კლონირება \"%s\"-დან \"%s\"-მდე"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "კოპირება \"%s\"-დან \"%s\"-მდე"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "ბმა \"%s\"-დან \"%s\"-მდე"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "შეცდომა. დასრულება\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "შესრულება: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL ბრძანებსი შეცდომა\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "ვერსიის ფაილის გახსნის შეცდომა \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "ვერსიის ფაილის დამუშავების შეცდომა \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ვერ ვუკავშირდები საწყის postmaster-ს, რომელიც შემდეგი ბრძანებით გაეშვა:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"ვერ ვუკავშირდები სამიზნე postmaster-ს, რომელიც შემდეგი ბრძანებით გაეშვა:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl-ის შეცდომა საწყისი სერვერის გაშვებისას ან შეერთების შეცდომა"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl-ის შეცდომა სამიზნე სერვერის გაშვებისას ან შეერთების შეცდომა"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "არასაკმარისი მეხსიერება"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq-ის გარემოს ცვლად %s-ს არალოკალური სერვერის მნიშვნელობა: %s გააჩნია"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"ცხრილის სივრცეების გამოყენებისას იგივე სისტემური კატალოგის \n"
+"ვერსიის მქონეზე/მქონემდე განახლება შეუძლებელია."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "ცხრილების სივრცის საქაღალდე \"%s\" არ არსებობს"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "ცხრილების სივრცის საქაღალდის \"%s\" აღმოჩენის შეცდომა: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "ცხრილების სივრცის ბილიკი %s საქაღალდეს არ წარმოადგენს"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "საქაღალდის (%s) წვდომის შეცდომა: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "დიახ"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "შეუთავსებელი \"line\" მონაცემთა ტიპის შემოწმება"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"თქვენი პაკეტი მომხმარებლის ცხრილებში \"line\" მონაცემის ტიპს შეიცავს.\n"
+"ეს მონაცემის ტიპი შეიცვალა შიგნიდან. ასევე შეცვალა მისი შეყვანა/გამოყვანის ფორმატი. ამიტომ თქვენი\n"
+"კლასტერის ძველი ვერსიის განახლება ამჟამად შეუძლებელია. შეგიძლიათ\n"
+"წაშალოთ ეს სვეტები და თავიდან გაუშვათ განახლება.\n"
+"პრობლენული სვეტების სია შეგიძლიათ იხილოთ ფაილში:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "არასწორი \"unknown\" მომხმარებლის სვეტების შემოწმება"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მოხმარებლის ცხრილებში მონაცემების \"unknown\" ტიპს შეიცავს.\n"
+"ეს მონაცემის ტიპი ცხრილებში დაშვებული აღარაა, ასე, რომ ამ კლასტერის განახლება ამჟამად\n"
+"შეუძლებელია შეგიძლიათ წაშალოთ პრობლემული სვეტები და განახლება თავიდან გაუშვათ.\n"
+"პრობლემური სვეტების ნახვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "ჰეშის ინდექსების შემოწმება"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "გაფრთხილება"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"პროგრამის თქვენი ვერსია ჰეშ ინდექსებს შეიცავს ამ ინდექსებს განსხვავებული\n"
+"შიდა ფორმატები გააჩნიათ ძველ და ახალ კლასტერებს შორის, ასე რომ, საჭიროა მათი\n"
+"რეინდექსი REINDEX ბრძანების საშუალებით. განახლების შემდეგ\n"
+"REINDEX-ის ინსტრუქციებიც გადმოგეცემათ."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"პროგრამის თქვენი ვერსია ჰეშ ინდექსებშ შეიცავს. ამ ინდექსებს თქვენს ძველ\n"
+"და ახალ კლასტერებში განსხვავებული შიდა ფორმატი გააჩნია, ასე რომ, საჭიროა მათი\n"
+"რეინდექსი REINDEX ბრძანების საშუალებით. ფაილი\n"
+" %s\n"
+", შესრულებული psql-ით მონაცემთა ბაზის ზემომხმარებლის მიერ, თავიდან შექნის ყველა\n"
+"არასწორ ინდექსს. მანამდე კი, ამ ინდექსებიდან არც ერთი გამოყენებული არ იქნება."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "არასწორი \"sql_identifier\" მომხმარებლის სვეტების შემოწმება"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"პროგრამის თქვენი ვერსია მომხმარებლის ცხრილებში \"sql_identifier\" მონაცემების ტიპს შეიცავს.\n"
+"მონაცემის ამ ტიპის დისკზე შენახვის ფორმატი შეიცვალა, ასე რომ, ამჟამად ამ კლასტერის განახლება შეუძლებელია.\n"
+"შეგიძლიათ წაშალოთ პრობლემური სვეტები და თავიდან გაუშვათ განახლება.\n"
+"პრობლემური ცხრილების სიის ხილვა შეგიძლიათ ფაილში:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "გაფართოების განახლებების შემოწმება"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "გაფრთხილება"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"პროგრამის თქვენი ვერსია შეიცავს გაფართოებას, რომელიც უნდა განახლდეს\n"
+"ALTER EXTENSION ბრძანებით. ფაილი\n"
+" %s\n"
+", როცა ის შესრულდება psql-ით ზემომხმარებლის მიერ, განაახლებს ამ\n"
+"გაფართოებებს."
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#, c-format
+#~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "ICU-ს ენის მნიშვნელობები მონაცემთა ბაზისთვის \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "საწყისი კლასტერი შეიცავს როლებს, რომლებიც \"pg_\"-ით იწყება\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "სამიზნე კლასტერი შეიცავს როლებს, რომლებიც \"pg_\"-ით იწყება\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "%s-ის %s-ად გადარქმევის შეცდომა.\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr "\"%s\" შემოწმების შეცდომა: გაშვების შეცდომა (წვდომა აკრძალულია)\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "\"%s\" შემოწმება ვერ მოხერხდა: რეგულარული ფაილი არაა\n"
+
+#, c-format
+#~ msgid "could not access directory \"%s\": %m\n"
+#~ msgstr "საქაღალდის (%s) წვდომის შეცდომა: %m\n"
+
+#, c-format
+#~ msgid "could not create directory \"%s\": %m\n"
+#~ msgstr "საქაღალდის (%s) შექმნის შეცდომა: %m\n"
+
+#, c-format
+#~ msgid "could not get control data directory using %s: %s"
+#~ msgstr "ვერ მივიღე მონაცემთა საქაღალდე %s გამოყენებით: %s"
+
+#, c-format
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "ფაილის გახსნის შეცდომა \"%s\": %s\n"
+
+#, c-format
+#~ msgid "could not open log file \"%s\": %m\n"
+#~ msgstr "ჟურნალის ფაილის გახსნის შეცდომა \"%s\": %m\n"
+
+#, c-format
+#~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მონაცემთა ბაზის კოდირება \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "%s-სთვის სისტემური ენის მიღების შეცდომა\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "მიმდინარე ენის მიღების პრობლემა\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "ძველი ენის (\"%s\") აღდგენის პრობლემა\n"
+
+#, c-format
+#~ msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მონაცემთა ბაზის lc_collate მნიშვნელობები \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#, c-format
+#~ msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მონაცემთა ბაზის lc_ctype მნიშვნელობები \"%s\" არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#, c-format
+#~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "მონაცემთა ბაზის \"%s\" ენის მომწოდებლები არ ემთხვევა: ძველი \"%s\", ახალი \"%s\"\n"
+
+#, c-format
+#~ msgid "out of memory\n"
+#~ msgstr "არასაკმარისი მეხსიერება\n"
+
+#, c-format
+#~ msgid "too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")\n"
diff --git a/src/bin/pg_upgrade/po/ko.po b/src/bin/pg_upgrade/po/ko.po
new file mode 100644
index 0000000..3851add
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ko.po
@@ -0,0 +1,1882 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-07 05:49+0000\n"
+"PO-Revision-Date: 2023-09-08 16:11+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: Korean <pgsql-kr@postgresql.kr>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: check.c:69
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"옛 운영 서버에서 일관성 검사를 진행합니다.\n"
+"------------------------------------------"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"일관성 검사 수행중\n"
+"------------------"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*클러스터 호환성*"
+
+#: check.c:229
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"여기서 pg_upgrade 작업을 실패한다면, 재시도 하기 전에 먼저\n"
+"새 클러스터를 처음부터 다시 만들어 진행해야 합니다."
+
+#: check.c:270
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"pg_upgrade 작업에서는 최적화기를 위한 통계 정보까지 업그레이드\n"
+"하지는 않습니다. 새 서버가 실행 될 때, 다음 명령을 수행하길 권합니다:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:276
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"아래 스크립트를 실행하면, 옛 클러스터 자료를 지울 것입니다:\n"
+" %s"
+
+#: check.c:281
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"옛 클러스터 자료 파일을 지우는 스크립트를 만들지 못했습니다.\n"
+"사용자 정의 테이블스페이스나, 새 클러스터가 옛 클러스터 안에\n"
+"있기 때문입니다. 옛 클러스터 자료는 직접 찾아서 지우세요."
+
+#: check.c:293
+#, c-format
+msgid "Checking cluster versions"
+msgstr "클러스터 버전 검사 중"
+
+#: check.c:305
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "이 도구는 PostgreSQL %s 과 그 이상 버전에서 사용할 수 있습니다."
+
+#: check.c:310
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "이 도구는 PostgreSQL %s 버전으로만 업그레이드 할 수 있습니다."
+
+#: check.c:319
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr ""
+"이 도구는 더 낮은 메이져 PostgreSQL 버전으로 다운그레이드하는데 사용할 수 없"
+"습니다."
+
+#: check.c:324
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions."
+msgstr "옛 클러스터 자료와 실행파일 디렉터리가 서로 메이져 버전이 다릅니다."
+
+#: check.c:327
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions."
+msgstr "새 클러스터 자료와 실행파일 디렉터리가 서로 메이져 버전이 다릅니다."
+
+#: check.c:342
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be different."
+msgstr ""
+"운영 서버 검사를 할 때는, 옛 서버, 새 서버의 포트를 다르게 지정해야 합니다."
+
+#: check.c:362
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr ""
+"\"%s\" 새 데이터베이스 클러스터가 비어있지 않음: \"%s.%s\" 릴레이션을 찾았음"
+
+#: check.c:385
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "새 클러스터 테이블스페이스 디렉터리 검사 중"
+
+#: check.c:396
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "새 클러스터 테이블스페이스 디렉터리가 이미 있음: \"%s\""
+
+#: check.c:429
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i."
+"e. %s"
+msgstr ""
+"\n"
+"경고: 새 데이터 디렉터리는 옛 데이터 디렉터리 안에 둘 수 없습니다, 예: %s"
+
+#: check.c:453
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, i.e. %s"
+msgstr ""
+"\n"
+"경고: 사용자 정의 테이블스페이스 위치를 데이터 디렉터리 안에 둘 수 없습니다, "
+"예: %s"
+
+#: check.c:463
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "옛 클러스터를 지우는 스크립트를 만듭니다"
+
+#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056
+#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "\"%s\" 파일을 열 수 없음: %s"
+
+#: check.c:517
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "\"%s\" 파일에 실행 권한을 추가 할 수 없음: %s"
+
+#: check.c:537
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "데이터베이스 사용자가 설치 작업을 한 사용자인지 확인합니다"
+
+#: check.c:553
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "\"%s\" 데이터베이스 사용자는 설치 작업을 한 사용자가 아닙니다"
+
+#: check.c:564
+#, c-format
+msgid "could not determine the number of users"
+msgstr "사용자 수를 확인할 수 없음"
+
+#: check.c:572
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "새 클러스터에서만 설치 사용 사용자가 정의될 수 있음"
+
+#: check.c:601
+#, c-format
+msgid "Checking database connection settings"
+msgstr "데이터베이스 연결 설정을 확인 중"
+
+#: check.c:627
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false"
+msgstr ""
+"template0 데이터베이스 접속을 금지해야 합니다. 예: 해당 데이터베이스의 "
+"pg_database.datallowconn 값이 false여야 합니다."
+
+#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135
+#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394
+#: function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "치명적 오류"
+
+#: check.c:655
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"template0이 아닌 모든 데이터베이스는 연결을 허용해야하며, 즉 \n"
+"pg_database.datallowconn 값이 true여야합니다. 설치된 데이터베이스\n"
+"중 pg_database.datallowconn 값이 false로 설정된 template0이 아닌\n"
+"데이터베이스가 있습니다. template0이 아닌 데이터베이스의 모든 연결을\n"
+"허용하거나 연결을 허용하지 않는 데이터베이스를 삭제하는 것이 좋습니다.\n"
+"문제가 있는 데이터베이스 목록은 다음 파일에 기록해 두었습니다:\n"
+" %s"
+
+#: check.c:680
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "미리 준비된 트랜잭션을 확인 중"
+
+#: check.c:689
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "옛 클러스터에 미리 준비된 트랜잭션이 있음"
+
+#: check.c:691
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "새 클러스터에 미리 준비된 트랜잭션이 있음"
+
+#: check.c:716
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "contrib/isn 모듈의 bigint 처리가 서로 같은지 확인 중"
+
+#: check.c:776
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"설치되어 있는 \"contrib/isn\" 모듈은 bigint 자료형을 사용합니다.\n"
+"이 bigint 자료형의 처리 방식이 새 버전과 옛 버전 사이 호환성이 없어,\n"
+"이 클러스터 업그레이드를 할 수 없습니다. 먼저 수동으로 데이터베이스를 \n"
+"덤프하고, 해당 모듈을 삭제하고, 업그레이드 한 뒤 다시 덤프 파일을 이용해\n"
+"복원할 수 있습니다. 문제가 있는 함수는 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:798
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "사용자 정의 postfix 연산자를 검사 중"
+
+#: check.c:874
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"더 이상 사용자 정의 postfix 연산자를 지원하지 않습니다.\n"
+"해당 연산자를 지우고, prefix 연산자로 바꾸거나, 함수 호출\n"
+"방식으로 바꾸는 것을 고려해 보십시오.\n"
+"관련 사용자 정의 postfix 연산자 목록은 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:898
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "불완전한 다형 함수를 확인합니다"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement"
+"\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"이 서버에는 \"anyarray\" 또는 \"anyelement\" 유형의 인수를 사용하는 \n"
+"내부 다형 함수를 참조하는 사용자 정의 객체가 있습니다. \n"
+"이러한 사용자 정의 객체는 업그레이드하기 전에 삭제하고, \n"
+"\"anycompatiblearray\" 또는 \"anycompatible\" 유형의 새로운 대응 함수를\n"
+"참조하도록 변경한 후 다시 복원해야합니다. 문제가 있는 객체 목록은\n"
+"다음 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "WITH OIDS 옵션 있는 테이블 확인 중"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"더 이상 WITH OIDS 옵션을 사용하는 테이블을 지원하지 않습니다.\n"
+"먼저 oid 칼럼이 있는 기존 테이블을 대상으로 다음 명령을 실행해서\n"
+"이 옵션을 뺄 것을 고려해 보십시오.\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"관련 테이블 목록은 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:1105
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "사용자가 만든 테이블에 내장 복합 자료형을 쓰는지 확인 중"
+
+#: check.c:1136
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"해당 데이터베이스 사용자가 만든 테이블에서 내장 복합 자료형을 사용하고 있습니"
+"다.\n"
+"이 자료형의 OID 값이 PostgreSQL 버전별로 다를 수 있어,\n"
+"업그레이드 할 수 없습니다. 해당 칼럼을 삭제한 뒤 다시 업그레이드하세요.\n"
+"해당 칼럼이 있는 테이블 목록은 다음 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "사용자가 만든 테이블에 reg* 자료형을 쓰는지 확인 중"
+
+#: check.c:1197
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"옛 서버에서 사용자가 만든 테이블에서 reg* 자료형을 사용하고 있습니다.\n"
+"이 자료형들은 pg_upgrade 명령으로 내정된 시스템 OID를 사용하지 못할 수\n"
+"있습니다. 그래서 업그레이드 작업을 진행할 수 없습니다.\n"
+"사용하고 있는 칼럼을 지우고 업그레이드 작업을 다시 시도하세요.\n"
+"이런 자료형을 사용하는 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:1218
+#, c-format
+msgid "Checking for incompatible \"aclitem\" data type in user tables"
+msgstr "사용자 테이블에서 \"aclitem\" 자료형 호환성 검사 중"
+
+#: check.c:1225
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"사용자 테이블에서 \"jsonb\" 자료형을 사용하고 있습니다.\n"
+"9.4 베타 비전 이후 \"jsonb\" 내부 자료 구조가 바뀌었습니다.\n"
+"그래서, 업그레이드 작업이 불가능합니다.\n"
+"해당 칼럼들을 지우고 업그레이드 작업을 진행하세요\n"
+"해당 자료형을 사용하는 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:1246
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "\"jsonb\" 자료형 호환성 확인 중"
+
+#: check.c:1255
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"사용자 테이블에서 \"jsonb\" 자료형을 사용하고 있습니다.\n"
+"9.4 베타 비전 이후 \"jsonb\" 내부 자료 구조가 바뀌었습니다.\n"
+"그래서, 업그레이드 작업이 불가능합니다.\n"
+"해당 칼럼들을 지우고 업그레이드 작업을 진행하세요\n"
+"해당 자료형을 사용하는 칼럼들은 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: check.c:1282
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\"로 시작하는 롤 확인 중"
+
+#: check.c:1314
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"기존 데이터베이스에 사용자가 만든 \"pg_\"로 시작하는 롤이\n"
+"있습니다. \"pg_\"는 시스템 롤로 예약된 접두어입니다.\n"
+"이 롤들을 다른 이름으로 바꿔야 업그레이드가 가능합니다.\n"
+"\"pg_\"로 시작하는 롤 이름 목록은 다음 파일에 있습니다:\n"
+" %s"
+
+#: check.c:1334
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "사용자 정의 인코딩 변환규칙을 검사 중"
+
+#: check.c:1395
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"사용자 정의 인코딩 변환 규칙용 변환 함수 매개 변수가\n"
+"PostgreSQL 14 비전 이후 바뀌었습니다.\n"
+"그래서, 업그레이드 작업이 불가능합니다.\n"
+"먼저 이런 변환 규칙을 옛 서버에서 지우고 다시 시도하세요.\n"
+"해당 변환 규칙 목록은 아래 파일 안에 있습니다:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "%s 사용하는 컨트롤 자료를 구할 수 없음: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: 데이터베이스 클러스터 상태 문제"
+
+#: controldata.c:158
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"원본 클러스터는 복구 모드(대기 서버 모드나, 복구 중) 상태에서 중지 되었습니"
+"다. 업그레이드 하려면, 문서에 언급한 것 처럼 \"rsync\"를 사용하든가, 그 서버"
+"를 운영 서버 모드로 바꾼 뒤 중지하고 작업하십시오."
+
+#: controldata.c:160
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"대상 클러스터는 복구 모드(대기 서버 모드나, 복구 중) 상태에서 중지 되었습니"
+"다. 업그레이드 하려면, 문서에 언급한 것 처럼 \"rsync\"를 사용하든가, 그 서버"
+"를 운영 서버 모드로 바꾼 뒤 중지하고 작업하십시오."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "원본 클러스터는 정상적으로 종료되어야 함"
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "대상 클러스터는 정상 종료되어야 함"
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "원본 클러스터에 클러스터 상태 정보가 없음:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "대상 클러스터에 클러스터 상태 정보가 없음:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal 문제"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: controldata 복원 문제"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "옛 클러스터에 필요한 컨트롤 정보가 몇몇 빠져있음:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "새 클러스터에 필요한 컨트롤 정보가 몇몇 빠져있음:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " 체크포인트 다음 XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " 마지막 체크포인트 다음 OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " 마지막 체크포인트 다음 MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " 마지막 체크포인트 제일 오래된 MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " 마지막 체크포인트 제일 오래된 XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " 마지막 체크포인트 다음 MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " 리셋 뒤 첫 WAL 조각"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 인자 처리 방식"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " 최대 정렬"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " 블록 크기"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " 대형 릴레이션 조각 크기"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL 블록 크기"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL 조각 크기"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " 최대 식별자 길이"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " 최대 인덱스 칼럼 수"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " 최대 토스트 조각 크기"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " 대형 객체 조각 크기"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " date/time 자료형을 정수로?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " 자료 체크섬 버전"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "필요한 컨트롤 정보 없이는 진행할 수 없음, 중지 함"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"클러스터간 pg_controldata 정렬이 서로 다릅니다.\n"
+"하나는 32비트고, 하나는 64비트인 경우 같습니다."
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "클러스터간 pg_controldata 블록 크기가 서로 다릅니다."
+
+#: controldata.c:666
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match"
+msgstr "클러스터간 pg_controldata 최대 릴레이션 조각 크가가 서로 다릅니다."
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "클러스터간 pg_controldata WAL 블록 크기가 서로 다릅니다."
+
+#: controldata.c:672
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "클러스터간 pg_controldata WAL 조각 크기가 서로 다릅니다."
+
+#: controldata.c:675
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match"
+msgstr "클러스터간 pg_controldata 최대 식별자 길이가 서로 다릅니다."
+
+#: controldata.c:678
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match"
+msgstr "클러스터간 pg_controldata 최대 인덱스 칼럼수가 서로 다릅니다."
+
+#: controldata.c:681
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match"
+msgstr "클러스터간 pg_controldata 최대 토스트 조각 크기가 서로 다릅니다."
+
+#: controldata.c:686
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match"
+msgstr "클러스터간 pg_controldata 대형 객체 조각 크기가 서로 다릅니다."
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "클러스터간 pg_controldata date/time 저장 크기가 서로 다릅니다."
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr ""
+"옛 클러스터는 데이터 체크섬 기능을 사용하지 않고, 새 클러스터는 사용하고 있습"
+"니다."
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr ""
+"옛 클러스터는 데이터 체크섬 기능을 사용하고, 새 클러스터는 사용하고 있지 않습"
+"니다."
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "클러스터간 pg_controldata 체크섬 버전이 서로 다릅니다."
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "옛 global/pg_control 파일에 \".old\" 이름을 덧붙입니다."
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "\"%s\" 파일을 \"%s\" 파일로 이름을 바꿀 수 없음: %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"옛 버전으로 옛 클러스터를 사용해서 서버를 실행하려면,\n"
+"%s/global/pg_control.old 파일의 이름을 \".old\" 빼고 바꾸어\n"
+"사용해야합니다. 업그레이드를 \"link\" 모드로 했기 때문에,\n"
+"한번이라도 새 버전의 서버가 이 클러스터를 이용해서 실행되었다면,\n"
+"이 파일이 더 이상 안전하지 않기 때문입니다."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "전역 객체 덤프를 만듭니다"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "데이터베이스 스키마 덤프를 만듭니다"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "%s 명령을 사용해서 pg_ctl 버전 자료를 구할 수 없음: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "%s에서 pg_ctl 버전을 알 수 없음"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "명령이 너무 긺"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "\"%s\" 로그 파일을 열 수 없음: %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*실패*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "\"%s\" 실행에서 문제 발생"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"\"%s\" 또는 \"%s\" 파일의 마지막 부분을 살펴보면\n"
+"이 문제를 풀 실마리가 보일 것입니다."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"\"%s\" 파일의 마지막 부분을 살펴보면\n"
+"이 문제를 풀 실마리가 보일 것입니다."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "\"%s\" 로그 파일을 쓸 수 없음: %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "\"%s\" 파일을 읽기 위해 열 수 없습니다: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "현재 디렉터리의 읽기 쓰기 권한을 부여하세요."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "\"%s\" 검사 실패: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" 파일은 디렉터리가 아닙니다."
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "\"%s\" 검사 실패: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "\"%s\" 검사 실패: 실행할 수 없음"
+
+#: exec.c:456
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "\"%s\" 검사 실패: 잘못된 버전: 현재 \"%s\", 기대값 \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 클론 중 오류: %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레이션 클론 중 오류: \"%s\" 파일을 열 수 없음: %s"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레이션 클론 중 오류: \"%s\" 파일을 만들 수 없음: %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 열 수 없음: %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 만들 수 없음: %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 읽을 수 없음: %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일을 쓸 수 없음: %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 복사 중 오류: %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레이션 링크 만드는 중 오류: %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr ""
+"\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일 상태 정보를 알 수 없음: %s"
+
+#: file.c:229
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "\"%s.%s\" 릴레이션 복사 중 오류: \"%s\" 파일에 페이지가 손상되었음"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "옛 데이터 디렉터리와 새 데이터 디렉터리 사이 파일 클론 실패: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "\"%s\" 파일을 만들 수 없음: %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "이 운영체제는 파일 클론 기능을 제공하지 않습니다."
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system."
+msgstr ""
+"데이터 디렉터리간 하드 링크를 만들 수 없음: %s\n"
+"하드 링크를 사용하려면, 두 디렉터리가 같은 시스템 볼륨 안에 있어야 합니다."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "필요한 라이브러리 확인 중"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" 라이브러리 로드 실패: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "데이터베이스: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"옛 버전에는 있고, 새 버전에는 없는 라이브러리들이 있습니다. 새 버전에\n"
+"해당 라이브러리들을 설치하거나, 옛 버전에서 해당 라이브러리를 삭제하고,\n"
+"업그레이드 작업을 해야합니다. 문제가 있는 라이브러리들은 다음과 같습니다:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s"
+"\", new name \"%s.%s\""
+msgstr ""
+"%u OID에 대한 \"%s\" 데이터베이스 이름이 서로 다릅니다: 옛 이름: \"%s.%s\", "
+"새 이름: \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "\"%s\" 데이터베이스 내 테이블 이름이 서로 다릅니다"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 해당 인덱스: \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 해당 인덱스의 OID: %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" 객체의 토스트 테이블"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 해당 토스트 베이블의 OID: %u"
+
+#: info.c:261
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database \"%s"
+"\": %s"
+msgstr ""
+"새 클러스터의 %u OID (해당 데이터베이스: \"%s\")가 옛 클러스터에 없음: %s"
+
+#: info.c:264
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database \"%s"
+"\": %s"
+msgstr ""
+"옛 클러스터의 %u OID (해당 데이터베이스: \"%s\")가 새 클러스터에 없음: %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"원본 데이터베이스:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"대상 데이터베이스:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 찾을 수 없음"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "데이터베이스: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: root 권한으로 실행할 수 없음"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "잘못된 옛 포트 번호"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "잘못된 새 포트 번호"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "보다 자세한 사용법은 \"%s --help\" 명령을 이용하세요.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인자를 지정 했음 (시작: \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "작업 내역을 자세히 봄"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "옛 클러스터 실행파일 위치"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "새 클러스터 실팽파일 위치"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "옛 클러스터 자료 위치"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "새 클러스터 자료 위치"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "소켓 파일 만들 위치"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "현재 디렉터리 위치를 알 수 없음"
+
+#: option.c:259
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr ""
+"윈도우즈 환경에서는 pg_upgrade 명령은 새 클러스터 데이터 디렉터리 안에서는 실"
+"행할 수 없음"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"새 데이터 클러스터 버전과 pg_upgrade 버전의 메이저 버전이 서로 다릅니다.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [옵션]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "옵션:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 옛 클러스터 실행 파일의 디렉터리\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 새 클러스터 실행 파일의 디렉터리 (기본값:\n"
+" pg_upgrade가 있는 디렉터리)\n"
+
+#: option.c:275
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 실 작업 없이, 그냥 검사만\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 옛 클러스터 데이터 디렉터리\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 새 클러스터 데이터 디렉터리\n"
+
+#: option.c:278
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=NUM 동시에 작업할 프로세스 또는 쓰레드 수\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link 새 클러스터 구축을 복사 대신 링크 사용\n"
+
+#: option.c:280
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" -N, --no-sync 작업 완료 뒤 디스크 동기화 작업을 하지 않음\n"
+
+#: option.c:281
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=옵션 옛 서버에서 사용할 서버 옵션들\n"
+
+#: option.c:282
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=옵션 새 서버에서 사용할 서버 옵션들\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 옛 클러스터 포트 번호 (기본값 %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 새 클러스터 포트 번호 (기본값 %d)\n"
+
+#: option.c:285
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain 작업 완료 후 사용했던 SQL과 로그 파일 남김\n"
+
+#: option.c:286
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=DIR 사용할 소켓 디렉터리 (기본값: 현재 디렉터"
+"리)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=이름 클러스터 슈퍼유저 (기본값 \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 작업 내역을 자세히 남김\n"
+
+#: option.c:289
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone 새 클러스터 구축을 복사 대신 클론 사용\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy 새 클러스터로 파일 복사 (기본값)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade 작업 전에 먼저 해야 할 것들:\n"
+" 새 버전의 initdb 명령으로 새 데이터베이스 클러스터를 만들고\n"
+" 옛 서버를 중지하고\n"
+" 새 서버도 중지하세요.\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade 작업은 다음 네개의 옵션 값은 반드시 지정해야 함:\n"
+" 옛 데이터 클러스터 디렉터리 (-d DATADIR)\n"
+" 새 데이터 클러스터 디렉터리 (-D DATADIR)\n"
+" 옛 버전의 \"bin\" 디렉터리 (-b BINDIR)\n"
+" 새 버전의 \"bin\" 디렉터리 (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"사용예:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"문제점 보고 주소: <%s>\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"%s 위치의 디렉터리를 알고 있어야 함.\n"
+"%s 명령행 옵션이나, %s 환경 변수를 사용하세요."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "원본 클러스터용 실 데이터 디렉터리를 찾는 중"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "대상 클러스터용 실 데이터 디렉터리를 찾는 중"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "%s 지정한 데이터 디렉터리를 찾을 수 없음: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "%d 번째 줄을 \"%s\" 파일에서 읽을 수 없음: %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "지정한 %hu 옛 포트 번호를 %hu 번호로 바꿈"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "작업용 프로세스를 만들 수 없음: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "작업용 쓰레드를 만들 수 없음: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() 실패: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "하위 작업자가 비정상 종료됨: 상태값 %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "하위 작업자가 비정상 종료됨: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "\"%s\" 디렉터리 읽기 권한 없음: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"업그레이드 진행 중\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "새 클러스터용 다음 OID 설정 중"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "데이터 디렉터리 fsync 작업 중"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"업그레이드 마침\n"
+"---------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "새 클러스터용 디렉터리 이름이 너무 김"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 만들 수 없음: %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: 실행할 프로그램을 찾을 수 없습니다."
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"옛 서버가 현재 운영 되고 있습니다.\n"
+"먼저 서버를 중지하고 진행하세요."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"새 서버가 현재 운영 되고 있습니다.\n"
+"먼저 서버를 중지하고 진행하세요."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "새 클러스터용 로케일과 인코딩 설정 중"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "새 클러스터의 모든 로우에 대해서 통계 정보 수집 중"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "새 클러스터의 모든 로우에 대해서 영구 격리(freeze) 중"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "새 클러스터에 전역 객체를 복원 중"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "새 클러스터에 데이터베이스 스키마 복원 중"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "새 %s에서 파일 지우는 중"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "\"%s\" 디렉터리를 삭제 할 수 없음"
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "옛 %s 객체를 새 서버로 복사 중"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "새 클러스터용 제일 오래된 XID 설정 중"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "새 클러스터용 다음 트랜잭션 ID와 epoch 값 설정 중"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "새 클러스터용 다음 멀티 트랜잭션 ID와 위치 값 설정 중"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "새 클러스터용 제일 오래된 멀티 트랜잭션 ID 설정 중"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL 아카이브 재설정 중"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "새 클러스터에서 frozenxid, minmxid 값 설정 중"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "새 클러스터에서 minmxid 값 설정 중"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "사용자 릴레이션 파일 클론 중"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "사용자 릴레이션 파일 복사 중"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "사용자 릴레이션 파일 링크 중"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "\"%s\" 이름의 옛 데이터베이스를 새 클러스터에서 찾을 수 없음"
+
+#: relfilenumber.c:218
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "\"%s.%s\" (\"%s\" / \"%s\") 파일이 있는지 확인 도중 오류 발생: %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "\"%s\" 객체를 \"%s\" 객체로 다시 쓰는 중"
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "\"%s\" 객체를 \"%s\" 객체로 클론 중"
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "\"%s\" 객체를 \"%s\" 객체로 복사 중"
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "\"%s\" 객체를 \"%s\" 객체로 링크 중"
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "실패, 종료함\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "실행중: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL 명령 실패\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "\"%s\" 버전 파일 열기 실패: %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "\"%s\" 버전 파일 구문 분석 실패"
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"다음 명령으로 실행된 원본 서버로 접속할 수 없음:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"다음 명령으로 실행된 대상 서버로 접속할 수 없음:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "원본 서버를 실행하는 pg_ctl 작업 실패, 또는 연결 실패"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "대상 서버를 실행하는 pg_ctl 작업 실패, 또는 연결 실패"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "메모리 부족"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "%s libpq 환경 변수가 로컬 서버 값이 아님: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"사용자 정의 테이블스페이스를 사용하는 경우 같은 시스템 카탈로그 버전으로\n"
+"업그레이드 작업을 진행할 수 없습니다."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "\"%s\" 이름의 테이블스페이스 디렉터리가 없음"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "\"%s\" 테이블스페이스 디렉터리의 상태 정보를 구할 수 없음: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "\"%s\" 테이블스페이스 경로는 디렉터리가 아님"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "\"line\" 자료형 호환성 확인 중"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"해당 데이터베이스에서 \"line\" 자료형을 사용하는 테이블이 있습니다.\n"
+"이 자료형의 입출력 방식이 옛 버전과 새 버전에서 서로 호환하지 않습니다.\n"
+"먼저 이 자료형을 사용하는 테이블을 삭제 후 업그레이드 작업을 하고,\n"
+"수동으로 복원 작업을 해야 합니다.\n"
+"작업 대상 테이블 목록을 다음 파일 안에 있습니다:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "잘못된 \"unknown\" 사용자 칼럼을 확인 중"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"해당 데이터베이스에서 사용자 테이블에서 \"unknown\" 자료형을 사용하고 있습니"
+"다.\n"
+"이 자료형은 더 이상 사용할 수 없습니다. 이 문제를 옛 버전에서 먼저 정리하고\n"
+"업그레이드 작업을 진행하세요.\n"
+"해당 테이블 목록은 다음 파일 안에 있습니다:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "해쉬 인덱스 확인 중"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "경고"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"해당 데이터베이스에서 해쉬 인덱스를 사용하고 있습니다. 해쉬 인덱스 자료구조"
+"가\n"
+"새 버전에서 호환되지 않습니다. 업그레이드 후에 해당 인덱스들을\n"
+"REINDEX 명령으로 다시 만들어야 합니다."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"해당 데이터베이스에서 해쉬 인덱스를 사용하고 있습니다. 해쉬 인덱스 자료구조"
+"가\n"
+"새 버전에서 호환되지 않습니다. 업그레이드 후 다음 파일을\n"
+"슈퍼유저 권한으로 실행한 psql에서 실행해서, REINDEX 작업을 진행하세요:\n"
+" %s\n"
+"이 작업이 있기 전까지는 해당 인덱스는 invalid 상태로 사용할 수 없게 됩니다."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "잘못된 \"sql_identifier\" 사용자 칼럼을 확인 중"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"사용자 테이블 또는 인덱스에 \"sql_identifier\" 자료형을 사용하고\n"
+"있습니다. 이 자료형의 저장 양식이 바뀌었기에, 업그레이드 할 수\n"
+"없습니다. 해당 테이블의 칼럼을 지우고 다시 업그레이드 하십시오.\n"
+"문제의 칼럼이 있는 목록은 다음 파일 안에 있습니다:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "확장 모듈 업데이트 확인 중"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "알림"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"해당 서버에는 업데이트 해야하는 확장 모듈이 있습니다.\n"
+"이 작업은 ALTER EXTENSION 명령으로 할 수 있으며, 작업 명령은\n"
+" %s\n"
+"파일 안에 있습니다. 데이터베이스 슈퍼유저로 psql로 접속해서\n"
+"이 파일 안에 있는 명령을 수행하면 확장 모듈을 업데이트 할 수 있습니다."
diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build
new file mode 100644
index 0000000..8531c3b
--- /dev/null
+++ b/src/bin/pg_upgrade/po/meson.build
@@ -0,0 +1,3 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+nls_targets += [i18n.gettext('pg_upgrade-' + pg_version_major.to_string())]
diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po
new file mode 100644
index 0000000..a761d48
--- /dev/null
+++ b/src/bin/pg_upgrade/po/ru.po
@@ -0,0 +1,2272 @@
+# Russian message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+# Maxim Yablokov <m.yablokov@postgrespro.ru>, 2021.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-11-03 09:08+0300\n"
+"PO-Revision-Date: 2023-11-03 09:24+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Проверка целостности на старом работающем сервере\n"
+"-------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Проведение проверок целостности\n"
+"-------------------------------"
+
+#: check.c:234
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Кластеры совместимы*"
+
+#: check.c:242
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Если работа pg_upgrade после этого прервётся, вы должны заново выполнить "
+"initdb\n"
+"для нового кластера, чтобы продолжить."
+
+#: check.c:283
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Статистика оптимизатора утилитой pg_upgrade не переносится.\n"
+"Запустив новый сервер, имеет смысл выполнить:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"При запуске этого скрипта будут удалены файлы данных старого кластера:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"Не удалось создать скрипт для удаления файлов данных старого кластера,\n"
+"так как каталог старого кластера содержит пользовательские табличные\n"
+"пространства или каталог данных нового кластера.\n"
+"Содержимое старого кластера нужно будет удалить вручную."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Проверка версий кластеров"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr ""
+"Эта утилита может производить обновление только с версии PostgreSQL %s и "
+"новее."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Эта утилита может повышать версию PostgreSQL только до %s."
+
+#: check.c:332
+#, c-format
+msgid ""
+"This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr ""
+"Эта утилита не может понижать версию до более старой основной версии "
+"PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid ""
+"Old cluster data and binary directories are from different major versions."
+msgstr ""
+"Каталоги данных и исполняемых файлов старого кластера относятся к разным "
+"основным версиям."
+
+#: check.c:340
+#, c-format
+msgid ""
+"New cluster data and binary directories are from different major versions."
+msgstr ""
+"Каталоги данных и исполняемых файлов нового кластера относятся к разным "
+"основным версиям."
+
+#: check.c:355
+#, c-format
+msgid ""
+"When checking a live server, the old and new port numbers must be different."
+msgstr ""
+"Для проверки работающего сервера новый номер порта должен отличаться от "
+"старого."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr ""
+"Новая база данных кластера \"%s\" не пустая: найдено отношение \"%s.%s\""
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Проверка каталогов табличных пространств в новом кластере"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr ""
+"каталог табличного пространства в новом кластере уже существует: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i."
+"e. %s"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕНИЕ: новый каталог данных не должен располагаться внутри старого "
+"каталога данных, то есть, в %s"
+
+#: check.c:466
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data "
+"directory, i.e. %s"
+msgstr ""
+"\n"
+"ПРЕДУПРЕЖДЕНИЕ: пользовательские табличные пространства не должны "
+"располагаться внутри каталога данных, то есть, в %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Создание скрипта для удаления старого кластера"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "не удалось открыть файл \"%s\": %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "не удалось добавить право выполнения для файла \"%s\": %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Проверка, является ли пользователь БД стартовым пользователем"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "пользователь БД \"%s\" не является стартовым пользователем"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "не удалось определить количество пользователей"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "В новом кластере может быть определён только стартовый пользователь."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Проверка параметров подключения к базе данных"
+
+#: check.c:640
+#, c-format
+msgid ""
+"template0 must not allow connections, i.e. its pg_database.datallowconn must "
+"be false"
+msgstr ""
+"база template0 не должна допускать подключения, то есть её свойство "
+"pg_database.datallowconn должно быть false"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "сбой"
+
+#: check.c:668
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Все базы, кроме template0, должны допускать подключения, то есть их свойство "
+"pg_database.datallowconn должно быть true. В вашей инсталляции содержатся\n"
+"базы (не считая template0), у которых pg_database.datallowconn — false.\n"
+"Имеет смысл разрешить подключения для всех баз данных, кроме template0,\n"
+"или удалить базы, к которым нельзя подключаться. Список баз данных\n"
+"с этой проблемой содержится в файле:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Проверка наличия подготовленных транзакций"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Исходный кластер содержит подготовленные транзакции"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Целевой кластер содержит подготовленные транзакции"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Проверка несоответствия при передаче bigint в contrib/isn"
+
+#: check.c:789
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции имеются функции \"contrib/isn\", задействующие тип "
+"biging.\n"
+"Однако в новом кластере значения bigint передаётся не так, как в старом,\n"
+"так что обновление кластера в текущем состоянии невозможно. Вы можете\n"
+"вручную выгрузить базы данных, где используется функциональность \"contrib/"
+"isn\",\n"
+"или удалить \"contrib/isn\" из старого кластера и перезапустить обновление. "
+"Список\n"
+"проблемных функций приведён в файле:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Проверка пользовательских постфиксных операторов"
+
+#: check.c:887
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции содержатся пользовательские постфиксные операторы, "
+"которые\n"
+"теперь не поддерживаются. Их следует удалить и использовать вместо них\n"
+"префиксные операторы или функции.\n"
+"Список пользовательских постфиксных операторов приведён в файле:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Проверка несовместимых полиморфных функций"
+
+#: check.c:1013
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or "
+"\"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции содержатся пользовательские объекты, обращающиеся\n"
+"к внутренним полиморфным функциям с аргументами типа \"anyarray\" или "
+"\"anyelement\".\n"
+"Такие объекты необходимо удалить перед процедурой обновления и восстановить\n"
+"после, изменив их так, чтобы они обращались к новым аналогичным функциям\n"
+"с аргументами типа \"anycompatiblearray\" и \"anycompatible\".\n"
+"Список проблемных объектов приведён в файле:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Проверка таблиц со свойством WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции содержатся таблицы со свойством WITH OIDS, которое "
+"теперь\n"
+"не поддерживается. Отказаться от использования столбцов oid можно так:\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Список проблемных таблиц приведён в файле:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Проверка системных составных типов в пользовательских таблицах"
+
+#: check.c:1149
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют системные составные "
+"типы.\n"
+"OID таких типов могут различаться в разных версиях PostgreSQL, в настоящем\n"
+"состоянии обновить кластер невозможно. Вы можете удалить проблемные столбцы\n"
+"и перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Проверка типов данных reg* в пользовательских таблицах"
+
+#: check.c:1210
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы содержат один из типов reg*.\n"
+"Эти типы данных ссылаются на системные OID, которые не сохраняются утилитой\n"
+"pg_upgrade, так что обновление кластера в текущем состоянии невозможно. Вы\n"
+"можете удалить проблемные столбцы и перезапустить обновление. Список "
+"проблемных\n"
+"столбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Проверка несовместимого типа данных \"%s\" в пользовательских таблицах"
+
+#: check.c:1239
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных "
+"\"aclitem\".\n"
+"Внутренний формат \"aclitem\" изменился в PostgreSQL версии 16, поэтому "
+"обновить\n"
+"кластер в текущем состоянии невозможно. Вы можете удалить проблемные столбцы "
+"и\n"
+"перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Проверка удалённого типа данных \"%s\" в пользовательских таблицах"
+
+#: check.c:1273
+#, c-format
+msgid ""
+"Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных \"%s\".\n"
+"Тип \"%s\" был удалён в PostgreSQL версии %s, поэтому обновить\n"
+"кластер в текущем состоянии невозможно. Вы можете удалить проблемные столбцы "
+"и\n"
+"перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Проверка несовместимого типа данных \"jsonb\""
+
+#: check.c:1304
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции таблицы используют тип данных jsonb.\n"
+"Внутренний формат \"jsonb\" изменился в версии 9.4 beta, поэтому обновить "
+"кластер\n"
+"в текущем состоянии невозможно. Вы можете удалить проблемные столбцы и\n"
+"перезапустить обновление. Список проблемных столбцов приведён в файле:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Проверка ролей с именами, начинающимися с \"pg_\""
+
+#: check.c:1363
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции имеются роли с именами, начинающимися с \"pg_\".\n"
+"Префикс \"pg_\" зарезервирован для системных ролей. Пока эти роли\n"
+"не будут переименованы, обновить кластер невозможно.\n"
+"Список ролей с префиксом \"pg_\" приведён в файле:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Проверка пользовательских перекодировок"
+
+#: check.c:1444
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции имеются пользовательские перекодировки.\n"
+"У функций перекодировок в PostgreSQL 14 поменялись параметры, поэтому\n"
+"в настоящем состоянии обновить кластер невозможно. Вы можете удалить\n"
+"перекодировки в старом кластере и перезапустить обновление.\n"
+"Список пользовательских перекодировок приведён в файле:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "не удалось получить управляющие данные, выполнив %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: недопустимое состояние кластера баз данных"
+
+#: controldata.c:158
+#, c-format
+msgid ""
+"The source cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"Исходный кластер был отключён в режиме восстановления. Чтобы произвести "
+"обновление, используйте документированный способ с rsync или отключите его в "
+"режиме главного сервера."
+
+#: controldata.c:160
+#, c-format
+msgid ""
+"The target cluster was shut down while in recovery mode. To upgrade, use "
+"\"rsync\" as documented or shut it down as a primary."
+msgstr ""
+"Целевой кластер был отключён в режиме восстановления. Чтобы произвести "
+"обновление, используйте документированный способ с rsync или отключите его в "
+"режиме главного сервера."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Исходный кластер не был отключён штатным образом."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Целевой кластер не был отключён штатным образом."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "В исходном кластере не хватает информации о состоянии кластера:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "В целевом кластере не хватает информации о состоянии кластера:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: проблема с выводом pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: проблема с получением управляющих данных"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "В исходном кластере не хватает необходимой управляющей информации:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "В целевом кластере не хватает необходимой управляющей информации:"
+
+# skip-rule: capital-letter-first
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " следующий XID конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " следующий OID последней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " следующий MultiXactId последней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " старейший MultiXactId последней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " oldestXID последней конт. точки"
+
+# skip-rule: capital-letter-first
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " следующий MultiXactOffset последней конт. точки"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " первый сегмент WAL после сброса"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " метод передачи аргумента float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " максимальное выравнивание"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " размер блока"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " размер сегмента большого отношения"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " размер блока WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " размер сегмента WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " максимальная длина идентификатора"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " максимальное число столбцов в индексе"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " максимальный размер порции TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " размер порции большого объекта"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " дата/время представлены целыми числами?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " версия контрольных сумм данных"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr ""
+"Нет необходимой управляющей информации для продолжения, работа прерывается"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"старое и новое выравнивание в pg_controldata различаются или некорректны\n"
+"Вероятно, один кластер установлен в 32-битной системе, а другой ~ в 64-битной"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr ""
+"старый и новый размер блоков в pg_controldata различаются или некорректны"
+
+#: controldata.c:666
+#, c-format
+msgid ""
+"old and new pg_controldata maximum relation segment sizes are invalid or do "
+"not match"
+msgstr ""
+"старый и новый максимальный размер сегментов отношений в pg_controldata "
+"различаются или некорректны"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr ""
+"старый и новый размер блоков WAL в pg_controldata различаются или некорректны"
+
+#: controldata.c:672
+#, c-format
+msgid ""
+"old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr ""
+"старый и новый размер сегментов WAL в pg_controldata различаются или "
+"некорректны"
+
+#: controldata.c:675
+#, c-format
+msgid ""
+"old and new pg_controldata maximum identifier lengths are invalid or do not "
+"match"
+msgstr ""
+"старая и новая максимальная длина идентификаторов в pg_controldata "
+"различаются или некорректны"
+
+#: controldata.c:678
+#, c-format
+msgid ""
+"old and new pg_controldata maximum indexed columns are invalid or do not "
+"match"
+msgstr ""
+"старый и новый максимум числа столбцов, составляющих индексы, в "
+"pg_controldata различаются или некорректны"
+
+#: controldata.c:681
+#, c-format
+msgid ""
+"old and new pg_controldata maximum TOAST chunk sizes are invalid or do not "
+"match"
+msgstr ""
+"старый и новый максимальный размер порции TOAST в pg_controldata различаются "
+"или некорректны"
+
+#: controldata.c:686
+#, c-format
+msgid ""
+"old and new pg_controldata large-object chunk sizes are invalid or do not "
+"match"
+msgstr ""
+"старый и новый размер порции большого объекта различаются или некорректны"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr ""
+"старый и новый тип хранения даты/времени в pg_controldata различаются или "
+"некорректны"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr ""
+"в старом кластере не применялись контрольные суммы данных, но в новом они "
+"есть"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr ""
+"в старом кластере применялись контрольные суммы данных, но в новом их нет"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr ""
+"старая и новая версия контрольных сумм кластера в pg_controldata различаются"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Добавление расширения \".old\" к старому файлу global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Если вы захотите запустить старый кластер, вам нужно будет убрать\n"
+"расширение \".old\" у файла %s/global/pg_control.old.\n"
+"Так как применялся режим \"ссылок\", работа старого кластера\n"
+"после того, как будет запущен новый, не гарантируется."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Формирование выгрузки глобальных объектов"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Формирование выгрузки схем базы данных"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "не удалось получить данные версии pg_ctl, выполнив %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "не удалось получить версию pg_ctl из результата %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "команда слишком длинная"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не удалось открыть файл протокола \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*ошибка*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "При выполнении \"%s\" возникли проблемы"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Чтобы понять причину ошибки, просмотрите последние несколько строк\n"
+"файла \"%s\" или \"%s\"."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Чтобы понять причину ошибки, просмотрите последние несколько строк\n"
+"файла \"%s\"."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "не удалось записать в файл протокола \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "не удалось открыть файл \"%s\" для чтения: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "У вас должны быть права на чтение и запись в текущем каталоге."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "проверка существования \"%s\" не пройдена: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" не является каталогом"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "файл \"%s\" не прошёл проверку: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "программа \"%s\" не прошла проверку: ошибка выполнения"
+
+#: exec.c:456
+#, c-format
+msgid ""
+"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr ""
+"программа \"%s\" не прошла проверку: получена некорректная версия \"%s\", "
+"ожидалась \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "ошибка при клонировании отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr ""
+"ошибка при клонировании отношения \"%s.%s\": не удалось открыть файл \"%s\": "
+"%s"
+
+#: file.c:55
+#, c-format
+msgid ""
+"error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr ""
+"ошибка при клонировании отношения \"%s.%s\": не удалось создать файл \"%s\": "
+"%s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось открыть файл \"%s\": "
+"%s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось создать файл \"%s\": "
+"%s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось прочитать файл "
+"\"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось записать в файл "
+"\"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "ошибка при копировании отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr ""
+"ошибка при создании ссылки для отношения \"%s.%s\" (из \"%s\" в \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": не удалось получить информацию о "
+"файле \"%s\": %s"
+
+#: file.c:229
+#, c-format
+msgid ""
+"error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr ""
+"ошибка при копировании отношения \"%s.%s\": в файле \"%s\" обнаружена "
+"неполная страница"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "не удалось клонировать файл из старого каталога данных в новый: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "не удалось создать файл \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "клонирование файлов не поддерживается в этой ОС"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file "
+"system."
+msgstr ""
+"не удалось создать жёсткую ссылку между старым и новым каталогами данных: "
+"%s\n"
+"В режиме \"ссылок\" старый и новый каталоги данных должны находиться в одной "
+"файловой системе."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Проверка наличия требуемых библиотек"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "загрузить библиотеку \"%s\" не удалось: %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "В базе данных: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции есть ссылки на загружаемые библиотеки, отсутствующие\n"
+"в новой инсталляции. Вы можете добавить эти библиотеки в новую инсталляцию\n"
+"или удалить функции, использующие их, из старой. Список проблемных\n"
+"библиотек приведён в файле:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid ""
+"Relation names for OID %u in database \"%s\" do not match: old name \"%s."
+"%s\", new name \"%s.%s\""
+msgstr ""
+"Имена отношения с OID %u в базе данных \"%s\" различаются: старое имя - \"%s."
+"%s\", новое - \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Не удалось сопоставить старые таблицы с новыми в базе данных \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " это индекс в \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " это индекс в отношении с OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " это TOAST-таблица для \"%s.%s\""
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " это TOAST-таблица для отношения с OID %u"
+
+#: info.c:261
+#, c-format
+msgid ""
+"No match found in old cluster for new relation with OID %u in database "
+"\"%s\": %s"
+msgstr ""
+"В старом кластере не нашлось соответствия для нового отношения с OID %u в "
+"базе данных \"%s\": %s"
+
+#: info.c:264
+#, c-format
+msgid ""
+"No match found in new cluster for old relation with OID %u in database "
+"\"%s\": %s"
+msgstr ""
+"В новом кластере не нашлось соответствия для старого отношения с OID %u в "
+"базе данных \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"исходные базы данных:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"целевые базы данных:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "база template0 не найдена"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "База данных: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "имя_отношения: %s.%s: oid_отношения: %u табл_пространство: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: программу не должен запускать root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "неверный старый номер порта"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "неверный новый номер порта"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Для дополнительной информации попробуйте \"%s --help\".\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Программа запущена в режиме подробных сообщений"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "расположение исполняемых файлов старого кластера"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "расположение исполняемых файлов нового кластера"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "расположение данных старого кластера"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "расположение данных нового кластера"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "расположение сокетов"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "не удалось определить текущий каталог"
+
+#: option.c:259
+#, c-format
+msgid ""
+"cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr ""
+"в Windows нельзя запустить pg_upgrade внутри каталога данных нового кластера"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade обновляет кластер PostgreSQL до другой основной версии.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [ПАРАМЕТР]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Параметры:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr ""
+" -b, --old-bindir=КАТ_BIN каталог исполняемых файлов старого кластера\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=КАТ_BIN каталог исполняемых файлов нового кластера\n"
+" (по умолчанию каталог программы pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid ""
+" -c, --check check clusters only, don't change any data\n"
+msgstr ""
+" -c, --check только проверить кластеры, не меняя никакие "
+"данные\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=КАТ_DATA каталог данных старого кластера\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=КАТ_DATA каталог данных нового кластера\n"
+
+#: option.c:278
+#, c-format
+msgid ""
+" -j, --jobs=NUM number of simultaneous processes or threads "
+"to use\n"
+msgstr ""
+" -j, --jobs=ЧИСЛО число одновременно используемых процессов "
+"или\n"
+" потоков\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" -k, --link link instead of copying files to new "
+"cluster\n"
+msgstr ""
+" -k, --link устанавливать ссылки вместо копирования "
+"файлов\n"
+" в новый кластер\n"
+
+#: option.c:280
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely "
+"to disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на "
+"диске\n"
+
+#: option.c:281
+#, c-format
+msgid ""
+" -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr ""
+" -o, --old-options=ПАРАМЕТРЫ параметры старого кластера, передаваемые "
+"серверу\n"
+
+#: option.c:282
+#, c-format
+msgid ""
+" -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr ""
+" -O, --new-options=ПАРАМЕТРЫ параметры нового кластера, передаваемые "
+"серверу\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr ""
+" -p, --old-port=ПОРТ номер порта старого кластера (по умолчанию "
+"%d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr ""
+" -P, --new-port=ПОРТ номер порта нового кластера (по умолчанию "
+"%d)\n"
+
+#: option.c:285
+#, c-format
+msgid ""
+" -r, --retain retain SQL and log files after success\n"
+msgstr ""
+" -r, --retain сохранить файлы журналов и SQL в случае "
+"успеха\n"
+
+#: option.c:286
+#, c-format
+msgid ""
+" -s, --socketdir=DIR socket directory to use (default current "
+"dir.)\n"
+msgstr ""
+" -s, --socketdir=КАТАЛОГ каталог сокетов (по умолчанию текущий)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=ИМЯ суперпользователь кластера (по умолчанию "
+"\"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr ""
+" -v, --verbose включить вывод подробных внутренних "
+"сообщений\n"
+
+#: option.c:289
+#, c-format
+msgid ""
+" -V, --version display version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" --clone clone instead of copying files to new "
+"cluster\n"
+msgstr ""
+" --clone клонировать, а не копировать файлы в новый "
+"кластер\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr ""
+" --copy копировать файлы в новый кластер (по "
+"умолчанию)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"До запуска pg_upgrade вы должны:\n"
+" создать новый кластер баз данных (используя новую версию initdb)\n"
+" остановить процесс postmaster, обслуживающий старый кластер\n"
+" остановить процесс postmaster, обслуживающий новый кластер\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"Запуская pg_upgrade, вы должны указать:\n"
+" путь к каталогу данных старого кластера (-d КАТ_ДАННЫХ)\n"
+" путь к каталогу данных нового кластера (-D КАТ_ДАННЫХ)\n"
+" путь к каталогу \"bin\" старой версии (-b КАТ_BIN)\n"
+" путь к каталогу \"bin\" новой версии (-B КАТ_BIN)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B "
+"newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Например:\n"
+" pg_upgrade -d старый_кластер/data -D новый_кластер/data -b старый_кластер/"
+"bin -B новый_кластер/bin\n"
+"или\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=старый_кластер/data\n"
+" $ export PGDATANEW=новый_кластер/data\n"
+" $ export PGBINOLD=старый_кластер/bin\n"
+" $ export PGBINNEW=новый_кластер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=старый_кластер/data\n"
+" C:\\> set PGDATANEW=новый_кластер/data\n"
+" C:\\> set PGBINOLD=старый_кластер/bin\n"
+" C:\\> set PGBINNEW=новый_кластер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Об ошибках сообщайте по адресу <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Вы должны указать каталог, где находится %s.\n"
+"Воспользуйтесь для этого ключом командной строки %s или переменной окружения "
+"%s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Поиск фактического каталога данных для исходного кластера"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Поиск фактического каталога данных для целевого кластера"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "не удалось получить каталог данных, выполнив %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "не удалось прочитать строку %d из файла \"%s\": %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "заданный пользователем старый номер порта %hu изменён на %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "не удалось создать рабочий процесс: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "не удалось создать рабочий поток: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "ошибка в %s(): %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "дочерний процесс завершился нештатно с ошибкой %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "дочерний процесс завершился аварийно: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "не удалось считать права на каталог \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Выполнение обновления\n"
+"---------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Установка следующего OID для нового кластера"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Синхронизация каталога данных с ФС"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Обновление завершено\n"
+"--------------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "путь к каталогу данных нового кластера слишком длинный"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не удалось создать каталог \"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: не удалось найти свой исполняемый файл"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Видимо, запущен процесс postmaster, обслуживающий старый кластер.\n"
+"Остановите его и попробуйте ещё раз."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Видимо, запущен процесс postmaster, обслуживающий новый кластер.\n"
+"Остановите его и попробуйте ещё раз."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Установка локали и кодировки для нового кластера"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Анализ всех строк в новом кластере"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Замораживание всех строк в новом кластере"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Восстановление глобальных объектов в новом кластере"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Восстановление схем баз данных в новом кластере"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Удаление файлов из нового каталога %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "ошибка при удалении каталога \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копирование старого каталога %s на новый сервер"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Установка старейшего OID для нового кластера"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr ""
+"Установка следующего идентификатора транзакции и эпохи для нового кластера"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr ""
+"Установка следующего идентификатора и смещения мультитранзакции для нового "
+"кластера"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Установка старейшего идентификатора мультитранзакции в новом кластере"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Сброс архивов WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Установка счётчиков frozenxid и minmxid в новом кластере"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Установка счётчика minmxid в новом кластере"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Клонирование файлов пользовательских отношений"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Копирование файлов пользовательских отношений"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Подключение файлов пользовательских отношений ссылками"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "старая база данных \"%s\" не найдена в новом кластере"
+
+#: relfilenumber.c:218
+#, c-format
+msgid ""
+"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr ""
+"ошибка при проверке существования файла отношения \"%s.%s\" (перенос \"%s\" "
+"в \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "переписывание \"%s\" в \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "клонирование \"%s\" в \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "копирование \"%s\" в \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "создание ссылки на \"%s\" в \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Ошибка, выполняется выход\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "выполняется: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"Ошибка SQL-команды\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "не удалось открыть файл с версией \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "не удалось разобрать файл с версией \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"не удалось подключиться к главному процессу исходного сервера, запущенному "
+"командой:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"не удалось подключиться к главному процессу целевого сервера, запущенному "
+"командой:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr ""
+"программа pg_ctl не смогла запустить исходный сервер, либо к нему не удалось "
+"подключиться"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr ""
+"программа pg_ctl не смогла запустить целевой сервер, либо к нему не удалось "
+"подключиться"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "нехватка памяти"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr ""
+"в переменной окружения %s для libpq указан адрес не локального сервера: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Обновление в рамках одной версии системного каталога невозможно,\n"
+"если используются табличные пространства."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "каталог табличного пространства \"%s\" не существует"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr ""
+"не удалось получить информацию о каталоге табличного пространства \"%s\": %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "путь табличного пространства \"%s\" не указывает на каталог"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "ошибка доступа к каталогу \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ок"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Проверка несовместимого типа данных \"line\""
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных "
+"\"line\".\n"
+"В старом кластере внутренний формат и формат ввода/вывода этого типа "
+"отличается\n"
+"от нового, поэтому в настоящем состоянии обновить кластер невозможно. Вы "
+"можете\n"
+"удалить проблемные столбцы и перезапустить обновление. Список проблемных\n"
+"столбцов приведён в файле:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Проверка неправильных пользовательских столбцов типа \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных "
+"\"unknown\".\n"
+"Теперь использование этого типа данных в таблицах не допускается, поэтому\n"
+"в настоящем состоянии обновить кластер невозможно. Вы можете удалить "
+"проблемные\n"
+"столбцы и перезапустить обновление. Список проблемных столбцов приведён в "
+"файле:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Проверка хеш-индексов"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "предупреждение"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n"
+"внутренние форматы в старом и новом кластерах, поэтому их необходимо\n"
+"перестроить с помощью команды REINDEX. По завершении обновления вы получите\n"
+"инструкции по выполнению REINDEX."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"В вашей инсталляции используются хеш-индексы. Эти индексы имеют разные\n"
+"внутренние форматы в старом и новом кластерах, поэтому их необходимо\n"
+"перестроить с помощью команды REINDEX. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, пересоздаст все неправильные\n"
+"индексы; до этого никакие хеш-индексы не будут использоваться."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr ""
+"Проверка неправильных пользовательских столбцов типа \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"В вашей инсталляции пользовательские таблицы используют тип данных\n"
+"\"sql_identifier\". Формат хранения таких данных на диске поменялся,\n"
+"поэтому обновить данный кластер невозможно. Вы можете удалить проблемные\n"
+"столбцы и перезапустить обновление.\n"
+"Список проблемных столбцов приведён в файле:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Проверка обновлённых расширений"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "замечание"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"В вашей инсталляции есть расширения, которые надо обновить\n"
+"командой ALTER EXTENSION. Скрипт\n"
+" %s\n"
+"будучи выполненным администратором БД в psql, обновит все\n"
+"эти расширения."
+
+#, c-format
+#~ msgid ""
+#~ "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr ""
+#~ "кодировки в базе данных \"%s\" различаются: старая - \"%s\", новая - "
+#~ "\"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "lc_collate values for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "значения lc_collate в базе данных \"%s\" различаются: старое - \"%s\", "
+#~ "новое - \"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "lc_ctype values for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "значения lc_ctype в базе данных \"%s\" различаются: старое - \"%s\", "
+#~ "новое - \"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "locale providers for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "провайдеры локали в базе данных \"%s\" различаются: старый - \"%s\", "
+#~ "новый - \"%s\"\n"
+
+#, c-format
+#~ msgid ""
+#~ "ICU locale values for database \"%s\" do not match: old \"%s\", new "
+#~ "\"%s\"\n"
+#~ msgstr ""
+#~ "значения локали ICU для базы данных \"%s\" различаются: старое - \"%s\", "
+#~ "новое - \"%s\"\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "В исходном кластере есть роли, имена которых начинаются с \"pg_\"\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "В целевом кластере есть роли, имена которых начинаются с \"pg_\"\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "не удалось получить текущую локаль\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "не удалось получить системное имя локали для \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "не удалось восстановить старую локаль \"%s\"\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "Не удалось переименовать %s в %s.\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "программа \"%s\" не прошла проверку: это не обычный файл\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr ""
+#~ "программа \"%s\" не прошла проверку: ошибка выполнения (нет доступа)\n"
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#~ msgid ""
+#~ "When checking a pre-PG 9.1 live old server, you must specify the old "
+#~ "server's port number.\n"
+#~ msgstr ""
+#~ "Для проверки старого работающего сервера версии до 9.1 необходимо указать "
+#~ "номер порта этого сервера.\n"
+
+#~ msgid ""
+#~ "All non-template0 databases must allow connections, i.e. their "
+#~ "pg_database.datallowconn must be true\n"
+#~ msgstr ""
+#~ "Все базы, кроме template0, должны допускать подключения, то есть их "
+#~ "свойство pg_database.datallowconn должно быть true\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "The 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"
+#~ msgstr ""
+#~ "\n"
+#~ "В старом кластере имеется функция \"plpython_call_handler\",\n"
+#~ "определённая в схеме \"public\", представляющая собой копию функции,\n"
+#~ "определённой в схеме \"pg_catalog\". Вы можете убедиться в этом,\n"
+#~ "выполнив в psql:\n"
+#~ "\n"
+#~ " \\df *.plpython_call_handler\n"
+#~ "\n"
+#~ "Версия этой функции в схеме \"public\" была создана инсталляцией\n"
+#~ "plpython версии до 8.1 и должна быть удалена для завершения процедуры\n"
+#~ "pg_upgrade, так как она ссылается на ставший устаревшим\n"
+#~ "разделяемый объектный файл \"plpython\". Вы можете удалить версию этой "
+#~ "функции\n"
+#~ "из схемы \"public\", выполнив следующую команду:\n"
+#~ "\n"
+#~ " DROP FUNCTION public.plpython_call_handler()\n"
+#~ "\n"
+#~ "в каждой затронутой базе данных:\n"
+#~ "\n"
+
+#~ msgid " %s\n"
+#~ msgstr " %s\n"
+
+#~ msgid "Remove the problem functions from the old cluster to continue.\n"
+#~ msgstr "Удалите проблемные функции из старого кластера для продолжения.\n"
+
+#~ msgid "mappings for database \"%s\":\n"
+#~ msgstr "отображения для базы данных \"%s\":\n"
+
+#~ msgid "%s.%s: %u to %u\n"
+#~ msgstr "%s.%s: %u в %u\n"
+
+#~ msgid " "
+#~ msgstr " "
+
+#~ msgid "Checking for large objects"
+#~ msgstr "Проверка больших объектов"
+
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table. After upgrading, you will be\n"
+#~ "given a command to populate the pg_largeobject_metadata table with\n"
+#~ "default permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "В вашей инсталляции используются большие объекты. В новой базе данных\n"
+#~ "имеется дополнительная таблица с правами для больших объектов. После "
+#~ "обновления\n"
+#~ "вам будет представлена команда для наполнения таблицы прав\n"
+#~ "pg_largeobject_metadata правами по умолчанию.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Your installation contains large objects. The new database has an\n"
+#~ "additional large object permission table, so default permissions must be\n"
+#~ "defined for all large objects. The file\n"
+#~ " %s\n"
+#~ "when executed by psql by the database superuser will set the default\n"
+#~ "permissions.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "В вашей инсталляции используются большие объекты. В новой базе данных\n"
+#~ "имеется дополнительная таблица с правами для больших объектов, поэтому\n"
+#~ "для всех больших объектов должны определяться права по умолчанию. Скрипт\n"
+#~ " %s\n"
+#~ "будучи выполненным администратором БД в psql, установит нужные права\n"
+#~ "по умолчанию.\n"
+#~ "\n"
+
+#~ msgid "Creating script to analyze new cluster"
+#~ msgstr "Создание скрипта для анализа нового кластера"
+
+#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+#~ msgstr ""
+#~ "проверка файла \"%s\" не пройдена: не удаётся прочитать файл (нет "
+#~ "доступа)\n"
+
+#~ msgid "connection to database failed: %s"
+#~ msgstr "не удалось подключиться к базе: %s"
+
+#~ msgid ""
+#~ "\n"
+#~ "connection to database failed: %s"
+#~ msgstr ""
+#~ "\n"
+#~ "не удалось подключиться к базе: %s"
+
+#~ msgid ""
+#~ "Optimizer statistics and free space information are not transferred\n"
+#~ "by pg_upgrade so, once you start the new server, consider running:\n"
+#~ " %s\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Статистика оптимизатора и сведения о свободном месте утилитой pg_upgrade\n"
+#~ "не переносятся, поэтому, запустив новый сервер, имеет смысл выполнить:\n"
+#~ " %s\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
+
+#~ msgid "could not parse PG_VERSION file from %s\n"
+#~ msgstr "не удалось разобрать файл PG_VERSION из %s\n"
+
+#~ msgid ""
+#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n"
+#~ "because of backend API changes made during development.\n"
+#~ msgstr ""
+#~ "Эта утилита поддерживает обновление только до версии 9.0 после "
+#~ "2010-01-11,\n"
+#~ "так как в API серверной части были внесены изменения.\n"
+
+#~ msgid "Cannot open file %s: %m\n"
+#~ msgstr "Не удаётся открыть файл %s: %m\n"
+
+#~ msgid "Cannot read line %d from %s: %m\n"
+#~ msgstr "Не удалось прочитать строку %d из %s: %m\n"
+
+#~ msgid "------------------------------------------------\n"
+#~ msgstr "------------------------------------------------\n"
+
+#~ msgid "-----------------------------\n"
+#~ msgstr "-----------------------------\n"
+
+#~ msgid "------------------\n"
+#~ msgstr "------------------\n"
+
+#~ msgid "----------------\n"
+#~ msgstr "----------------\n"
diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po
new file mode 100644
index 0000000..89cfa95
--- /dev/null
+++ b/src/bin/pg_upgrade/po/sv.po
@@ -0,0 +1,1903 @@
+# Swedish message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Dennis Björklund <db@zigo.dhs.org>, 2017, 2018, 2019, 2020, 2021, 2022, 2023.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-08-25 07:19+0000\n"
+"PO-Revision-Date: 2023-08-27 10:30+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: check.c:69
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"Utför konsistenskontroller på gamla live-servern\n"
+"------------------------------------------------"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"Utför konsistenskontroller\n"
+"--------------------------"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*Klustren är kompatibla*"
+
+#: check.c:229
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"Om pg_upgrade misslyckas efter denna punkt så måste du\n"
+"köra om initdb på nya klustret innan du fortsätter."
+
+#: check.c:270
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"Optimeringsstatistik överförs inte av pg_upgrade.\n"
+"När du startar nya servern så vill du nog köra:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:276
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"När detta skript körs så raderas gamla klustrets datafiler:\n"
+" %s"
+
+#: check.c:281
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"Kunde inte skapa ett script som raderar gamla klustrets datafiler\n"
+"då användardefinierade tabellutrymmen eller nya klustrets datakatalog\n"
+"ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n"
+"måste raderas för hand."
+
+#: check.c:293
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Kontrollerar klustrets versioner"
+
+#: check.c:305
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Detta verktyg kan bara uppgradera från PostgreSQL version %s eller senare."
+
+#: check.c:310
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s."
+
+#: check.c:319
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL."
+
+#: check.c:324
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Gammal klusterdata och binära kataloger är från olika major-versioner."
+
+#: check.c:327
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Nya klusterdata och binära kataloger är från olika major-versioner."
+
+#: check.c:342
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Vid kontroll av en live-server så måste gamla och nya portnumren vara olika."
+
+#: check.c:362
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\""
+
+#: check.c:385
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Letar efter nya tablespace-kataloger i klustret"
+
+#: check.c:396
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "i klustret finns redan ny tablespace-katalog: \"%s\""
+
+#: check.c:429
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s"
+
+#: check.c:453
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"VARNING: användardefinierade tabellutrymmens plats skall inte vara i datakatalogen, dvs. %s"
+
+#: check.c:463
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Skapar skript för att radera gamla klustret"
+
+#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056
+#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "kunde inte öppna fil \"%s\": %s"
+
+#: check.c:517
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "kan inte sätta rättigheten \"körbar\" på filen \"%s\": %s"
+
+#: check.c:537
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Kontrollerar att databasanvändaren är installationsanvändaren"
+
+#: check.c:553
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "databasanvändare \"%s\" är inte installationsanvändaren"
+
+#: check.c:564
+#, c-format
+msgid "could not determine the number of users"
+msgstr "kunde inte bestämma antalet användare"
+
+#: check.c:572
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "Bara installationsanvändaren får finnas i nya klustret."
+
+#: check.c:601
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Kontrollerar databasens anslutningsinställningar"
+
+#: check.c:627
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 får inte tillåta anslutningar, dvs dess pg_database.datallowconn måste vara false"
+
+#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135
+#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394
+#: function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatalt"
+
+#: check.c:655
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Alla databaser förutom template0 måste tillåta anslutningar, dvs deras\n"
+"pg_database.datallowconn måste vara true. Din installation har andra\n"
+"databaser än template0 som har pg_database.datallowconn sat till false\n"
+"Överväg att tillåta anslutningar för alla databaser förutom template0\n"
+"eller släng de databaser som inte tillåter anslutningar. En lista med\n"
+"problemdatabaser finns i filen:\n"
+" %s"
+
+#: check.c:680
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Letar efter förberedda transaktioner"
+
+#: check.c:689
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Källklustret innehåller förberedda transaktioner"
+
+#: check.c:691
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Målklustret innehåller förberedda transaktioner"
+
+#: check.c:716
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Letar efter contrib/isn med bigint-anropsfel"
+
+#: check.c:776
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller \"contrib/isn\"-funktioner son beror på\n"
+"datatypen bigint. Ditt gamla och nya kluster skickar bigint-värden\n"
+"på olika sätt så detta kluster kan för närvarande inte uppgraderas. Du\n"
+"kan manuellt dumpa databaser i gamla klustret som använder \"contrib/isn\"-finesser,\n"
+"radera dessa databaser, utföra uppgraderingen och sedan återställa databaserna.\n"
+"En lista med problemfunktionerna finns i filen:\n"
+" %s"
+
+#: check.c:798
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Letar efter användardefinierade postfix-operatorer"
+
+#: check.c:874
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användardefinierade postfix-operatorer, vilket\n"
+"inte stöds längre. Överväg att ta bort postfix-operatorer och ersätt dem\n"
+"med prefix-operatorer eller funktionsanrrop.\n"
+"En lista med användardefinierade postfix-operatorer finns i filen:\n"
+" %s"
+
+#: check.c:898
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Letar efter inkompatibla polymorfa funktioner"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användardefinierade objekt som\n"
+"refererar till interna polymorfa funktioner med argument av\n"
+"typen \"anyarray\" eller \"anyelement\".\n"
+"Dessa användardefinierade objekt måste slängas innan uppgradering\n"
+"och kan återskapas efteråt efter att de ändrats till att referera till\n"
+"motsvarande nya funktioner med argument av typerna \"anycompatiblearray\"\n"
+"and \"anycompatible\".\n"
+"En lista med problemobjekten finns i filen:\n"
+" %s"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Letar efter tabeller med WITH OIDS"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller tabeller deklarerade med WITH OIDS som inte\n"
+"stöds längre. Överväg att ta bort oid-kolumnen med\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"En lista över tabeller med detta problem finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1105
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\""
+
+#: check.c:1136
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användartabeller med systemdefinierade typer\n"
+"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n"
+"PostgreSQL-versioner så detta kluster kan inte uppgraderas för tillfället.\n"
+"Du kan slänga problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1164
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Letar efter reg*-datatyper i användartabeller"
+
+#: check.c:1197
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation använder en av reg*-datatyperna i en användartabell.\n"
+"Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n"
+"så detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"problemkolumnerna och starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1218
+#, c-format
+msgid "Checking for incompatible \"aclitem\" data type in user tables"
+msgstr "Letar efter inkompatibel \"aclitem\"-datatyp i användartabeller"
+
+#: check.c:1225
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller \"aclitem\"-datatypen i användartabeller.\n"
+"Interna formatet för \"aclitem\" ändrades i PostgreSQL 16 så detta kluster\n"
+"kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n"
+"och starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+# FIXME: is this msgid correct?
+#: check.c:1246
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Letar efter inkompatibel \"jsonb\"-datatyp"
+
+#: check.c:1255
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller \"jsonb\"-datatypen i användartabeller.\n"
+"Interna formatet för \"jsonb\" ändrades under 9.4-betan så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n"
+"starta om uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: check.c:1282
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Letar efter roller som startar med \"pg_\""
+
+#: check.c:1314
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller roller som startar på \"pg_\".\n"
+"\"pg_\" är ett reserverat prefix för systemroller. Klustret\n"
+"kan inte uppgraderas innan dessa roller har bytt namn.\n"
+"En lista med rollerna som startar på \"pg_\" finns i denna fil:\n"
+" %s"
+
+#: check.c:1334
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Letar efter användardefinierade teckenkodkonverteringar"
+
+#: check.c:1395
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller användardefinierade teckenkodkonverteringar.\n"
+"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 så\n"
+"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n"
+"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n"
+"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "kunde inte hämta kontrolldata med %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: state-problem för databaskluster"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Källklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Målklustret stängdes ner när det var i återställningsläge. För att uppgradera så använd \"rsync\" enligt dokumentation eller stäng ner den som en primär."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Källklustret har inte stängts ner på ett korrekt sätt."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Målklustret har inte stängts ner på ett korrekt sätt."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "Källklustret saknar information om kluster-state:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "Målklustret saknar information om kluster-state:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal-problem"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: problem vid hämtning av kontrolldata"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "Källklustret saknar lite kontrolldata som krävs:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "Målklustret saknar lite kontrolldata som krävs:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " checkpoint nästa-XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " senaste checkpoint nästa-OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " senaster checkpoint nästa-MultiXactId"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " senaste checkpoint äldsta-MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " senaste checkpoint äldsta-XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " senaste checkpoint nästa-MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " första WAL-segmentet efter reset"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 argumentöverföringsmetod"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " maximal alignment"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " blockstorlek"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " stora relationers segmentstorlek"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL-blockstorlek"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL-segmentstorlek"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " maximal identifierarlängd"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " maximalt antal indexerade kolumner"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " maximal TOAST-chunkstorlek"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " stora-objekt chunkstorlek"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " datum/tid är heltal?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " datachecksumversion"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n"
+"Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximalt indexerade kolumner ogiltiga eller matchar inte"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "gamla klustret använder inte datachecksummor men nya gör det"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "gamla klustret använder datachecksummor men nya gör inte det"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Lägger till \".old\"-suffix till gamla global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"Om du vill starta gamla klustret så måste du ta bort\n"
+"\".old\"-suffixet från %s/global/pg_control.old.\n"
+"Detta då \"link\"-läge användes och gamla klustret kan inte\n"
+"startas på ett säkert sätt efter att nya klustret startats."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Skapar dump med globala objekt"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Skapar dump innehållande databasscheman"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "kunde inte läsa versionutdata för pg_ctl från %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "kommandot för långt"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "kunde inte öppna loggfil \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*misslyckande*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Det var problem med att köra \"%s\""
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Se de sista raderna i \"%s\" eller \"%s\" för\n"
+"en trolig orsak till misslyckandet."
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"Se de sista raderna i \"%s\" för\n"
+"en trolig orsak till misslyckandet."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "kunde inte skriva till loggfil \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "kunde inte öppna fil \"%s\" för läsning: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Du måste ha läs och skrivrättigheter till den aktuella katalogen."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "kontroll av \"%s\" misslyckades: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" är inte en katalog"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "kontroll av \"%s\" misslyckades: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "fel vid kloning av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte läsa filen \"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skriva filen \"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid kopiering av relation \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid skapande av länk för relation \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte göra stat på file \"%s\": %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "fel vid kopiering av relation \"%s.%s\": partiell sida hittad i fil \"%s\""
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "kunde inte klona fil mellan gamla och nya datakatalogen: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "kan inte skapa fil \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "filkloning stöds inte på denna plattform"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"kunde inte skapa hård länk mellan gamla och nya datakatalogerna: %s\n"
+"I länk-läge måste gamla och nya datakatalogerna vara i samma filsystem."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Kontrollerar att krävda länkbibliotek finns"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "kunde inte ladda länkbibliotek \"%s\": %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "I databas: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"Din installation refererar till laddbara bibliotek som saknas i nya\n"
+"installationen. Du kan lägga till dessa itll nya installationen eller\n"
+"ta bort funktionerna som använder dem i gamla installationen. En lista\n"
+"med problembiblioteken finns i filen:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " vilket är ett index för \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " vilket är ett index för OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " vilket är TOAST-tabellen för \"%s.%s\""
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " vilket är TOAST-tabellen för OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"källdatabaser:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"måldatabaser:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "hittade inte template0"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "Databas: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relnamn: %s.%s: reloid: %u reltblutrymme: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: kan inte köras som root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "ogiltigt gammalt portnummer"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "ogiltigt nytt portnummer"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Försök med \"%s --help\" för mer information.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Kör i utförligt läge"
+
+# FIXME: the source code need to be fixed here. it paste words together
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "gamla klusterbinärer är i"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "nya klusterbinärer är i"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "gamla klusterdatan är i"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "nya klusterdatan är i"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "uttag kommer skapas"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "kunde inte bestämma aktuell katalog"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "kan inte köra pg_upgrade inifrån nya klusterdatakatalogen i Windows"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade uppgraderar ett PostgreSQL-kluster till en annan major-version.\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [FLAGGA]...\n"
+"\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Flaggor:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINKAT gamla klustrets katalog för körbara filer\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINKAT nya klustrets katalog för körbara filer\n"
+" (standard är samma som för pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check testa klustren bara, ändra ingen data\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATAKAT gamla klustrets datakatalog\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATAKAT nya klustrets datakatalog\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM antal samtidiga processer eller trådar att använda\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link länka istället för att kopiera filer till nya klustret\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=FLAGGOR serverflaggor för gamla klustret\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=FLAGGOR serverflaggor för nya klustret\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT gamla klustrets portnummer (standard %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT nya klustrets portnummer (standard %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain behåll SQL och loggfiler efter lyckad uppgradering\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAMN klustrets superuser (standard \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose slå på utförligt intern loggning\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " -clone klona istället för att kopiera filer till nya klustret\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy kopiera filer till nya klustret (standard)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denns hjälp, avsluta sedan\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"Innan du kör pg_upgrade måste du:\n"
+" skapa ett nytt databaskluster (med nya versionens initdb)\n"
+" stänga ner den postmaster som hanterar gamla klustret\n"
+" stänga ner den postmaster som hanterar nya klustret\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"När du kör pg_upgrade måste du ange följande information:\n"
+" datakatalogen för gamla klustret (-d DATAKAT)\n"
+" datakatalogen för nya klustret (-D DATAKAT)\n"
+" \"bin\"-katalogen för gamla versionen (-b BINKAT)\n"
+" \"bin\"-katalogen för nya versionen (-B BINKAT)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Till exempel:\n"
+" pg_upgrade -d gammaltKluster/data -D nyttKluster/data -b gammaltKluster/bin -B nyttKluster/bin\n"
+"eller\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=gammaltKluster/data\n"
+" $ export PGDATANEW=nyttKluster/data\n"
+" $ export PGBINOLD=gammaltKluster/bin\n"
+" $ export PGBINNEW=nyttKluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=gammaltKluster/data\n"
+" C:\\> set PGDATANEW=nyttKluster/data\n"
+" C:\\> set PGBINOLD=gammaltKluster/bin\n"
+" C:\\> set PGBINNEW=nyttKluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"Rapportera fel till <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"Du måste identifiera katalogen där %s.\n"
+"Använd kommandoradsflaggan %s eller omgivningsvariabeln %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Letar efter den riktiga datakatalogen i källklustret"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Letar efter den riktiga datakatalogen för målklustret"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "kunde inte hämta datakatalogen med %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "kunde inte läsa rad %d från fil \"%s\": %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "kunde inte skapa arbetsprocess: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "kunde inte skapa arbetstråd: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() misslyckades: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "barnprocess avslutade felaktigt: status %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "barnprocess avslutade felaktigt: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "kunde inte läsa rättigheter på katalog \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"Utför uppgradering\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Sätter nästa OID för nya klustret"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Synkar datakatalog till disk"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"Uppgradering klar\n"
+"-----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "katalogsökväg för nytt kluster är för lång"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "kunde inte skapa katalog \"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: kunde inte hitta det egna programmets körbara fil"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar gamla klustret.\n"
+"Stänga ner den postmastern och försök igen."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"Det verkar vara en postmaster igång som hanterar nya klustret.\n"
+"Stänga ner den postmastern och försök igen."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Sätter lokal och teckenkodning för nya klustret"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Analyserar alla rader i nya klustret"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Fryser alla rader i nya klustret"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Återställer globala objekt i nya klustret"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Återställer databasscheman i nya klustret"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Raderar filer från ny %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "kunde inte ta bort katalog \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Kopierar gammal %s till ny server"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Sätter äldsta XID för nya klustret"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Sätter nästa multixact-ID och offset för nytt kluster"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Sätter äldsta multixact-ID i nytt kluster"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Resettar WAL-arkiv"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Sätter räknarenm minmxid för nytt kluster"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Klonar användarens relationsfiler"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Kopierar användarens relationsfiler"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Länkar användarens relationsfiler"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "skriver om \"%s\" till \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "klonar \"%s\" till \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "kopierar \"%s\" till \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "länkar \"%s\" till \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Misslyckades, avslutar\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "kör: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL-kommando misslyckades\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "kunde inte öppna versionsfil \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "kunde inte tolka versionsfil \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"kunde inte ansluta till käll-postmaster som startats med kommandot:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"kunde inte ansluta till mål-postmaster som startats med kommandot:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl misslyckades att start källservern eller så misslyckades anslutningen"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl misslyckades att start målservern eller så misslyckades anslutningen"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "slut på minne"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr ""
+"Kan inte uppgradera till/från samma systemkatalogversion när\n"
+"man använder tablespace."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "tablespace-katalogen \"%s\" finns inte"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "kunde inte göra stat på tablespace-katalog \"%s\": %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "tablespace-sökväg \"%s\" är inte en katalog"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "kunde inte komma åt katalog \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+# FIXME: is this msgid correct?
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Letar efter inkompatibel \"line\"-datatyp"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller datatypen \"line\" i användartabeller. Denna\n"
+"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n"
+"gamla och nya version så detta kluster kan för närvarande inte uppgraderas.\n"
+"Du kan radera problemkolumnerna och återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller datatypen \"unknown\" i användartabeller.\n"
+"Denna datatyp tillåts inte längre i tabeller så detta kluster kan\n"
+"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Letar efter hash-index"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "varning"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Efter uppgraderingen så kommer du få\n"
+"REINDEX-instruktioner."
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"Din installation innehåller hash-index. Dessa index har olika internt\n"
+"format i ditt gamla och nya kluster så de måste omindexeras med\n"
+"kommandot REINDEX. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer återskapa alla\n"
+"ogiltiga index; innan dess så kommer inget av dess index användas."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"Din installation innehåller datatypen \"sql_identifier\" i användartabeller.\n"
+"Formatet på disk för denna datatyp har ändrats så detta kluster kan för\n"
+"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n"
+"återstarta uppgraderingen.\n"
+"En lista med problemkolumner finns i filen:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Letar efter uppdatering av utökningar"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "notis"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"Din installation innehåller utökningar som skall updateras med kommandot\n"
+"ALTER EXTENSION. Filen\n"
+" %s\n"
+"kan köras med psql av databasens superuser och kommer uppdatera\n"
+"dessa utökningar."
+
+#, c-format
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+
+#, c-format
+#~ msgid "%-*s\n"
+#~ msgstr "%-*s\n"
+
+#, c-format
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#, c-format
+#~ msgid "%s() failed: %s\n"
+#~ msgstr "%s() misslyckades: %s\n"
+
+#, c-format
+#~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "inställning av ICU-lokal för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "The source cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "Källklustret innehåller roller som startar med \"pg_\"\n"
+
+#, c-format
+#~ msgid "The target cluster contains roles starting with \"pg_\"\n"
+#~ msgstr "Målklustret innehåller roller som startar med \"pg_\"\n"
+
+#, c-format
+#~ msgid "Unable to rename %s to %s.\n"
+#~ msgstr "Kan inte byta namn på %s till %s.\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+#~ msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera (rättighet saknas)\n"
+
+#, c-format
+#~ msgid "check for \"%s\" failed: not a regular file\n"
+#~ msgstr "kontroll av \"%s\" misslyckades: inte en vanlig fil\n"
+
+#, c-format
+#~ msgid "could not access directory \"%s\": %m\n"
+#~ msgstr "kunde inte komma åt katalog \"%s\": %m\n"
+
+#, c-format
+#~ msgid "could not create directory \"%s\": %m\n"
+#~ msgstr "kunde inte skapa katalog \"%s\": %m\n"
+
+#, c-format
+#~ msgid "could not open file \"%s\": %s\n"
+#~ msgstr "kan inte öppna fil \"%s\": %s\n"
+
+#, c-format
+#~ msgid "could not open log file \"%s\": %m\n"
+#~ msgstr "kunde inte öppna loggfil \"%s\": %m\n"
+
+#, c-format
+#~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "kodning för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to get system locale name for \"%s\"\n"
+#~ msgstr "misslyckades med att hämta systemlokalnamn för \"%s\"\n"
+
+#, c-format
+#~ msgid "failed to get the current locale\n"
+#~ msgstr "misslyckades med att hämta aktuell lokal\n"
+
+#, c-format
+#~ msgid "failed to restore old locale \"%s\"\n"
+#~ msgstr "misslyckades med att återställa gamla lokalen \"%s\"\n"
+
+#, c-format
+#~ msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "lc_collate-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "lc_ctype-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+#~ msgstr "localleverantörer för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n"
+
+#, c-format
+#~ msgid "out of memory\n"
+#~ msgstr "slut på minne\n"
+
+#, c-format
+#~ msgid "too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "för många kommandoradsargument (första är \"%s\")\n"
diff --git a/src/bin/pg_upgrade/po/tr.po b/src/bin/pg_upgrade/po/tr.po
new file mode 100644
index 0000000..f6b2798
--- /dev/null
+++ b/src/bin/pg_upgrade/po/tr.po
@@ -0,0 +1,1668 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2017 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Abdullah GÜLNER <agulner@gmail.com>, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 10\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n"
+"POT-Creation-Date: 2019-04-02 07:45+0000\n"
+"PO-Revision-Date: 2019-04-03 14:47+0300\n"
+"Last-Translator: Abdullah Gülner\n"
+"Language-Team: \n"
+"Language: tr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+
+#: check.c:66
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"Eski Canlı Sunucuda Tutarlılık Testleri Gerçekleştirliyor\n"
+"------------------------------------------------\n"
+
+#: check.c:72
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"Tutarlılık Testleri Gerçekleştiriliyor\n"
+"-----------------------------\n"
+
+#: check.c:166
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*Cluster'lar uyumlu*\n"
+
+#: check.c:172
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"Eğer pg_upgrade bu noktadan sonra başarısız olursa,\n"
+"devam etmeden önce yeni cluster'da tekrar initdb yapılmalıdır.\n"
+
+#: check.c:208
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade so,\n"
+"once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eniyileyici (optimizer) istatistikleri pg_upgrade tarafından aktarılmadığından\n"
+"yeni sunucuyu başlattığınızda, %s\n"
+"çalıştırmanız önerilir.\n"
+"\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"Optimizer statistics and free space information are not transferred\n"
+"by pg_upgrade so, once you start the new server, consider running:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eniyileyici (optimizer) istatistikleri ve boş alan bilgisi pg_upgrade\n"
+"tarafından aktarılmadığından, yeni sunucuyu başlattığınızda \n"
+"%s çalıştırmanız önerilir\n"
+"\n"
+
+#: check.c:220
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"Bu betiğin (script) çalıştırılması eski cluster'ın veri dosyalarını silecektir:\n"
+" %s\n"
+
+#: check.c:225
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"Eski kümenin (cluster) veri dosyalarını silecek betik (script) oluşturulamadı;\n"
+"çünkü eski kümenin dizininde kullanıcı-tanımlı tablespace'ler veya \n"
+"yeni kümenin veri dizini bulunuyor. Eski kümeye ait içerikler\n"
+"elle silinmeli.\n"
+
+#: check.c:235
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Cluster sürümleri kontrol ediliyor"
+
+#: check.c:247
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "Bu uygulama sadece PostgreSQL 8.4 ve sonraki sürümlerden yükseltme yapabilir.\n"
+
+#: check.c:251
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "Bu uygulama sadece PostgreSQL'in %s sürümüne yükseltme yapabilir.\n"
+
+#: check.c:260
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "pg-upgrade uygulaması daha eski ana PostgreSQL sürümlerine geçiş için kullanılamaz.\n"
+
+#: check.c:265
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "Eski kümenin (cluster) veri ve ikili (binary) dizinleri farklı ana sürümlerden.\n"
+
+#: check.c:268
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "Yeni küme (cluster) veri ve ikili (binary) dizinleri farklı ana (major) sürümlerden.\n"
+
+#: check.c:285
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "PG 9.1 öncesi eski bir canlı sunucu kontrol edildiğinde, eski sunucunun port numarasını belirtmelisiniz.\n"
+
+#: check.c:289
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "Canlı bir sunucu kontrol edilirken, eski ve yeni port numaraları farklı olmalı.\n"
+
+#: check.c:304
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için dil kodlaması eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:309
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için lc_collate değerleri eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:312
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "\"%s\" veritabanı için lc_ctype değerleri eşleşmiyor: eskisi \"%s\", yenisi \"%s\"\n"
+
+#: check.c:385
+#, c-format
+msgid "New cluster database \"%s\" is not empty\n"
+msgstr "Yeni cluster veritabanı \"%s\" boş değil\n"
+
+#: check.c:432
+#, c-format
+msgid "Creating script to analyze new cluster"
+msgstr "Yeni kümeyi (cluster) analiz etmek için betik (script) oluşturuluyor "
+
+#: check.c:446 check.c:574 check.c:838 check.c:949 check.c:1040 function.c:253
+#: option.c:480 version.c:57 version.c:156 version.c:257 version.c:339
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "\"%s\" dosyası açılamadı: %s\n"
+
+#: check.c:501 check.c:630
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "\"%s\" dosyasına çalıştırma (execute) izni eklenemedi: %s\n"
+
+#: check.c:537
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"UYARI: yeni veri dizini eski veri dizini içinde olmamalı, örn. %s\n"
+
+#: check.c:561
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"UYARI: kullanıcı-tanımlı tablespace lokasyonları veri dizini içinde olmamalıdır, örn. %s\n"
+
+#: check.c:571
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Eski kümeyi (cluster) silmek için betik (script) oluşturuluyor."
+
+#: check.c:650
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Veritabanı kullanıcısının kurulum kullanıcısı olup olmadığı kontrol ediliyor"
+
+#: check.c:666
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "Veritabanı kullanıcısı \"%s\" kurulum kullanıcısı değil\n"
+
+#: check.c:677
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "kullanıcı sayısı belirlenemedi\n"
+
+#: check.c:685
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "Yeni kümede (cluster) sadece kurulum kullanıcısı tanımlanabilir\n"
+
+#: check.c:705
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Veritabanı bağlantı ayarları kontrol ediliyor"
+
+#: check.c:727
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0 bağlantıya izin vermemeli, yani pg_database.datallowconn değeri \"false\" olmalı\n"
+
+#: check.c:737
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "template0 dışındaki tüm veritabanları bağlantıya izin vermeli, yani pg_database.datallowconn değerleri \"true\" olmalı\n"
+
+#: check.c:762
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Hazırlanmış işlemler (prepared transaction) için kontrol gerçekleştiriliyor"
+
+#: check.c:771
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "Kaynak küme (cluster) hazırlanmış işlemler (prepared transaction) içeriyor\n"
+
+#: check.c:773
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "Hedef küme(cluster) hazırlanmış işlemler içeriyor\n"
+
+#: check.c:799
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "bigint-geçirme uyuşmazlığı olan contrib/isn için denetim gerçekleştiriliyor"
+
+#: check.c:860 check.c:972 check.c:1063 function.c:268 version.c:179
+#: version.c:280
+#, c-format
+msgid "fatal\n"
+msgstr "ölümcül (fatal)\n"
+
+#: check.c:861
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually upgrade databases that use \"contrib/isn\" facilities and remove\n"
+"\"contrib/isn\" from the old cluster and restart the upgrade. A list of\n"
+"the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz bigint veri tipine dayalı \"contrib/isn\" fonksiyonları\n"
+"içeriyor. Eski ve yeni kümeleriniz (cluster) bigint değerlerini farklı\n"
+"geçirdiğinden bu küme şu anda yükseltilemiyor. \"contrib/isn\" imkanlarını\n"
+"kullanan veritabanlarını \"contrib/isn\" yi eski kümeden çıkartarak\n"
+" elle yükseltebilir ve yükseltmeyi tekrar başlatabilirsiniz.\n"
+"Problemli fonksiyonların bir listesi aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+
+#: check.c:893
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Kullanıcı tablolarındaki reg* veri tipleri için kontrol yapılıyor"
+
+#: check.c:973
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz kullanıcı tablolarında reg* veri tiplerinden birini kullanıyor.\n"
+"Bu veri tipleri pg_upgrade tarafından korunmayan sistem OID'lerine referans\n"
+"veriyor, dolayısıyla bu küme şu anda yükseltilemiyor. Sorunlu tabloları\n"
+"çıkartıp yükseltmeyi yeniden başlatabilirsiniz. Sorunlu sütunların listesi\n"
+"aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+
+#: check.c:998
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Uyumlu olmayan (incompatible) \"jsonb\" veri tipi için kontrol gerçekleştiriliyor"
+
+#: check.c:1064
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade. A list\n"
+"of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kullanıcı tablolarınızda \"jsonb\" veri tipi içeren alanlar bulunmaktadır.\n"
+"9.4 beta ile birlikte \"jsonb\" iç formatı değiştiğinden bu küme (cluster) şu anda\n"
+"yükseltilemiyor. Sorunlu tabloları çıkartarak (remove) yükseltmeyi tekrar \n"
+"başlatabilirsiniz. Problemli sütunların bir listesini şu dosyada bulabilirsiniz:\n"
+"%s\n"
+
+#: check.c:1085
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "\"pg_\" ie başlayan roller için kontrol gerçekleştiriliyor"
+
+#: check.c:1095
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "Kaynak küme (cluster) \"pg_\" ile başlayan roller içeriyor\n"
+
+#: check.c:1097
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "Hedef küme (cluster) \"pg_\" ile başlayan roller içeriyor\n"
+
+#: check.c:1123
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "geçerli yerel ayarları (locale) almakta başarısız olundu\n"
+
+#: check.c:1132
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "\"%s\" için sistem yerel ayarlarını (locale) almakta başarısız olundu\n"
+
+#: check.c:1138
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "Eski \"%s\" yerel ayarlarını (locale) geri yüklemekte başarısız olundu\n"
+
+#: controldata.c:128 controldata.c:195
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "%s kullanılarak kontrol verisi alınamadı: %s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: veritabanı kümesini durumu ile ilgili sorun\n"
+
+#: controldata.c:156
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Kaynak küme kurtarma (recovery) modunda iken kapatıldı. Yükseltmek için, belgelerde açıklandığı gibi \"rsync\" kullanın ya da birincil (primary) sunucu olarak kapatın.\n"
+
+#: controldata.c:158
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "Hedef küme kurtarma (recovery) modunda iken kapatıldı. Yükseltmek için, belgelerde açıklandığı gibi \"rsync\" kullanın ya da birincil (primary) sunucu olarak kapatın.\n"
+
+#: controldata.c:163
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "Kaynak küme düzgün bir şekilde kapatılmamış.\n"
+
+#: controldata.c:165
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "Hedef küme düzgün bir şekilde kapatılmamış.\n"
+
+#: controldata.c:176
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "Kaynak kümede (cluster) küme durumu bilgisi eksik:\n"
+
+#: controldata.c:178
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "Hedef kümede (cluster) küme durumu bilgisi eksik:\n"
+
+#: controldata.c:208 dump.c:51 pg_upgrade.c:333 pg_upgrade.c:370
+#: relfilenode.c:244 util.c:80
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:215
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal sorunu\n"
+
+#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257
+#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309
+#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345
+#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382
+#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426
+#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470
+#: controldata.c:481
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: controldata alma (retrieval) sorunu\n"
+
+#: controldata.c:546
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "Kaynak kümede (cluster) bazı gerekli kontrol bilgileri eksik:\n"
+
+#: controldata.c:549
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "Hedef kümede (cluster) bazı gerekli kontrol bilgileri eksik:\n"
+
+#: controldata.c:552
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " sonraki XID kontrol noktası (checkpoint)\n"
+
+#: controldata.c:555
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " sonraki OID en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:558
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " sonraki MultiXactId en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:562
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " En eski MultiXactId en son kontrol noktası (checkpoint)\n"
+
+#: controldata.c:565
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " sonraki MultiXactOffset en son kontrol noktası\n"
+
+#: controldata.c:568
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " sıfırlama (reset) sonrası ilk WAL kesimi (segment)\n"
+
+#: controldata.c:571
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8 argumanı geçirme yöntemi\n"
+
+#: controldata.c:574
+#, c-format
+msgid " maximum alignment\n"
+msgstr " azami hizalanma (max alignment)\n"
+
+#: controldata.c:577
+#, c-format
+msgid " block size\n"
+msgstr " blok boyutu (block size)\n"
+
+#: controldata.c:580
+#, c-format
+msgid " large relation segment size\n"
+msgstr " büyük ilişki (relation) kesimi (segment) boyutu\n"
+
+#: controldata.c:583
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL blok boyutu (block size)\n"
+
+#: controldata.c:586
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL kesim boyutu (segment size)\n"
+
+#: controldata.c:589
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " azami tanımlayıcı (identifier) uzunluğu\n"
+
+#: controldata.c:592
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " azami indeksli sütun sayısı\n"
+
+#: controldata.c:595
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " azami TOAST yığın (chunk) boyutu\n"
+
+#: controldata.c:599
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " büyük-nesne yığın (chunk) boyutu\n"
+
+#: controldata.c:602
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " tarih/saat değerleri tamsayı mı?\n"
+
+#: controldata.c:606
+#, c-format
+msgid " data checksum version\n"
+msgstr " veri sağlama (checksum) sürümü\n"
+
+#: controldata.c:608
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "Gerekli kontrol bilgisi olmadan devam edilemez, sonlandırılıyor\n"
+
+#: controldata.c:623
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"eski ve yeni pg_controldata hizalamaları (alignment) ya geçersiz ya da eşleşmiyor\n"
+"Muhtemelen bir küme 32-bit diğeri 64-bit kurulumları\n"
+
+#: controldata.c:627
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata hizalamaları (alignment) ya geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:630
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami ilişki (relation) kesim (segment) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:633
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata WAL blok boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:636
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata WAL kesim (segment) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:639
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami tanımlayıcı uzunlukları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:642
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami indeksli sütunları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:645
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata azami TOAST yığın (chunk) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:650
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "eski ve yeni pg_controldata büyük-nesne (large-obj.) yığın (chunk) boyutları geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:653
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "eski ve yeni pg_controldata tarih/saat saklama tipleri geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:666
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "eski küme veri sağlamaları (checksum) kullanmıyorken yenisi kullanıyor\n"
+
+#: controldata.c:669
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "eski küme veri sağlamaları (checksum) kullanıyorken yenisi kullanmıyor\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "eski ve yeni küme (cluster) pg_controldata sağlama sürümleri geçersiz ya da eşleşmiyor\n"
+
+#: controldata.c:682
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "eski global/pg_control'e \".old\" soneki ekleniyor"
+
+#: controldata.c:687
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "%s ismi %s'ye değiştirilemiyor.\n"
+
+#: controldata.c:690
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"Eski kümeyi (cluster) başlatmak istiyorsanız, \".old\" sonekini\n"
+"%s/global/pg_control.old 'dan çıkartmanız gerekecektir.\n"
+"\"link\" kipi (mode) kullanıldığından, bir kere yeni küme başlatıldığında\n"
+"eski küme güvenle başlatılamaz.\n"
+"\n"
+
+#: dump.c:22
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Global nesnelerin dökümü (dump) oluşturuluyor"
+
+#: dump.c:33
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "Veritabanı şemalarının dökümü (dump) oluşturuluyor\n"
+
+#: exec.c:44
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "%s kullanılarak pg_ctl sürüm verisi alınamadı: %s\n"
+
+#: exec.c:50
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "%s den pg_ctl sürüm çıktısı alınamadı\n"
+
+#: exec.c:104 exec.c:108
+#, c-format
+msgid "command too long\n"
+msgstr "çok uzun komut\n"
+
+#: exec.c:110 util.c:38 util.c:226
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:149 exec.c:204 option.c:101 option.c:217
+#, c-format
+msgid "could not write to log file \"%s\"\n"
+msgstr "\"%s\" günlük (log) dosyasına yazılamadı\n"
+
+#: exec.c:178
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*hata*"
+
+#: exec.c:181
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "\"%s\"nin çalıştırılmasında sorunlar oluştu\n"
+
+#: exec.c:184
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Hatanın muhtemel sebebi için \"%s\" veya \n"
+"\"%s\"nin son bir kaç satırına bakınız.\n"
+
+#: exec.c:189
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr ""
+"Hatanın muhtemel sebebi için \"%s\" nin\n"
+"son bir kaç satırına bakınız.\n"
+
+#: exec.c:230
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "\"%s\" dosyası okuma için açılamadı: %s\n"
+
+#: exec.c:257
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "Geçerli dizinde okuma ve yazma erişiminiz olmalı.\n"
+
+#: exec.c:310 exec.c:372 exec.c:427
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "\"%s\" kontrolü aksadı: %s\n"
+
+#: exec.c:313 exec.c:375
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\" bir dizin değil\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr ""
+"\"%s\" kontrolü hata verdi: normal bir dosya değil\n"
+" \n"
+
+#: exec.c:442
+#, c-format
+msgid "check for \"%s\" failed: cannot read file (permission denied)\n"
+msgstr "\"%s\" kontrolü hata verdi: dosya okunamıyor (izin yok)\n"
+
+#: exec.c:450
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "\"%s\" kontrolü hata verdi: çalıştırılamıyor (izin yok)\n"
+
+#: file.c:44 file.c:147
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası açılamadı: %s\n"
+
+#: file.c:49 file.c:156
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası oluşturulamadı: %s\n"
+
+#: file.c:63 file.c:180
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyası okunamadı: %s\n"
+
+#: file.c:75 file.c:258
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasına yazılamadı: %s\n"
+
+#: file.c:89
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu (\"%s\" \"%s\"ye): %s\n"
+
+#: file.c:108
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "\"%s.%s\" ilişkisi için bağlantı oluşturulurken hata oluştu (\"%s\" \"%s\"ye): %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasının durumu görüntülenemiyor (stat) : %s\n"
+
+#: file.c:183
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "\"%s.%s\" ilişkisi (relation) kopyalanırken hata oluştu: \"%s\" dosyasında kısmi (partial) sayfa (page) bulundu\n"
+
+#: file.c:284
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"eski ve yeni veri dizinleri arasında sabit bağlantı (hard link) oluşturulamadı: %s\n"
+"Bağlantı kipinde eski ve yeni veri dizinleri aynı dosya sisteminde olmalı.\n"
+
+#: function.c:110
+#, c-format
+msgid ""
+"\n"
+"The 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"
+msgstr ""
+"\n"
+"Eski kümenin \"public\" şemasında tanımlı bir \"plpython_call_handler\"\n"
+"fonksiyonu var ki bunun bir kopyası da \"pg_catalog\" şemasında da tanımlı.\n"
+"Bunu teyit etmek için psql'de şunu çalıştırabilirsiniz:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"Bu fonksiyonun \"public\" şemasındaki sürümü plpython'un 8.1 öncesi bir\n"
+"kurulumu tarafından oluşturulmuş, ve eski \"plpython\" paylaşımlı nesne \n"
+"dosyasına referans verdiği için pg_upgrade'in tamamlanması için \n"
+"kaldırılmalıdır. Bu fonksiyonun \"public\" şemasınaki sürümünü etkilenen\n"
+"bütün veritabanlarında aşağıdaki komutu çalıştırarak kaldırabilirsiniz:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+
+#: function.c:128
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:138
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "Devam etmek için problemli fonksiyonları çıkartınız (remove).\n"
+
+#: function.c:211
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Gereken kütüphanelerin varlığı kontrol ediliyor"
+
+#: function.c:255
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "\"%s\" kütüphanesi yüklenemedi: %s"
+
+#: function.c:269
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Eski kurulumunuz yenisinde eksik olan yüklenebilir kütüphanelere referans\n"
+"veriyor. Bu kütüphaneleri yeni kuruluma ekleyebilir, ya da bunları kullanan\n"
+"fonksiyonları eski kurulumdan çıkarabilirsiniz. Sorunlu kütüphanelerin bir\n"
+"listesi aşağıdaki dosyadadır:\n"
+" %s\n"
+"\n"
+" \n"
+
+#: info.c:133
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "%u OID'si için \"%s\" veritabanındaki ilişki isimleri eşleşmiyor: eski isim \"%s.%s\", yeni isim \"%s.%s\"\n"
+
+#: info.c:153
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "\"%s\" veritabanında eski ve yeni tabloların eşleştirilmesi başarısız oldu\n"
+
+#: info.c:242
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " \"%s.%s\" üzerinde bir indeks "
+
+#: info.c:252
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " %u OID'li nesne üzerinde bir indeks"
+
+#: info.c:264
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " \"%s.%s\" için TOAST tablosu"
+
+#: info.c:272
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " %u OID'li nesne için TOAST tablosu"
+
+#: info.c:276
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "%u OID li yeni ilişki (relation) için eski kümede (cluster) karşılık bulunamadı (veritabanı: \"%s): %s\n"
+
+#: info.c:279
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "%u OID li eski ilişki (relation) için yeni kümede (cluster) karşılık bulunamadı (veritabanı: \"%s): %s\n"
+
+#: info.c:291
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "\"%s\" veritabanı için eşleştrimeler:\n"
+
+#: info.c:294
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u yu %uya\n"
+
+#: info.c:299 info.c:638
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"kaynak veritabanları:\n"
+
+#: info.c:326
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"hedef veritabanları:\n"
+
+#: info.c:636
+#, c-format
+msgid "Database: %s\n"
+msgstr "Veritabanı: %s\n"
+
+#: info.c:649
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:98
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: root kullanıcısyla çalıştırılamaz\n"
+
+#: option.c:172
+#, c-format
+msgid "invalid old port number\n"
+msgstr "geçersiz eski port numarası\n"
+
+#: option.c:180
+#, c-format
+msgid "invalid new port number\n"
+msgstr "geçersiz yeni port numarası\n"
+
+#: option.c:202
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "Verbose kipte çalışıyor\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Daha fazla bilgi için \"%s --help\" yazın\n"
+
+#: option.c:242
+msgid "old cluster binaries reside"
+msgstr "eski küme ikili dosyaları bulunmakta"
+
+#: option.c:244
+msgid "new cluster binaries reside"
+msgstr "yeni küme ikili dosyaları bulunmakta"
+
+#: option.c:246
+msgid "old cluster data resides"
+msgstr "eski küme verisi bulunmakta"
+
+#: option.c:248
+msgid "new cluster data resides"
+msgstr "yeni küme verisi bulunmakta"
+
+#: option.c:265 option.c:462
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "geçerli dizin belirlenemedi\n"
+
+#: option.c:268
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "pg_upgrade, Windows üzerindeki yeni küme (cluster) veri dizini içerisinden çalıştırılamıyor\n"
+
+#: option.c:277
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade bir PostgreSQL kümesini (cluster) farklı bir ana sürüme yükseltir.\n"
+"\n"
+
+#: option.c:278
+#, c-format
+msgid "Usage:\n"
+msgstr "Kullanımı:\n"
+
+#: option.c:279
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [SEÇENEK]...\n"
+"\n"
+
+#: option.c:280
+#, c-format
+msgid "Options:\n"
+msgstr "Seçenekler:\n"
+
+#: option.c:281
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR eski küme (cluster) için çalıştırılabilir (executable) dizini\n"
+
+#: option.c:282
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory\n"
+msgstr " -B, --new-bindir=BINDIR yeni küme (cluster) çalıştırılabilir (executable) dizini\n"
+
+#: option.c:283
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check sadece kümeleri (cluster) kontrol et, veri değişikliği yapma\n"
+
+#: option.c:284
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR eski küme (cluster) veri dizini\n"
+
+#: option.c:285
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR yeni küme (cluster) veri dizini\n"
+
+#: option.c:286
+#, c-format
+msgid " -j, --jobs number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs kullanılacak eşzamanlı süreç veya iş parçacığı (thread) sayısı\n"
+
+#: option.c:287
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link dosyaları yeni kümeye (cluster) kopyalama yerine bağlantılandır\n"
+
+#: option.c:288
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS sunucuya geçirilecek eski küme (cluster) seçenekleri\n"
+
+#: option.c:289
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --ne-options=OPTIONS sunucuya geçirilecek yeni küme (cluster) seçenekleri\n"
+
+#: option.c:290
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT eski küme port numarası (varsayılan %d)\n"
+
+#: option.c:291
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT yeni küme port numarası (varsayılan %d)\n"
+
+#: option.c:292
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain başarılı işlem sonrası SQL ve log dosyalarını tut\n"
+
+#: option.c:293
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr ""
+" -U, --username=NAME küme (cluster) superuser'ı (varsayılan \"%s\")\n"
+" \n"
+
+#: option.c:294
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose açıklamalı (verbose) dahili loglamayı etkinleştir\n"
+
+#: option.c:295
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version sürüm bilgisini görüntüle, sonrasında çık\n"
+
+#: option.c:296
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help bu yardımı göster, sonrasında çık\n"
+
+#: option.c:297
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"pg_upgrade 'i çalıştırmadan önce yapılması gerekenler:\n"
+" (initdb'nin yeni sürümünü kullanarak) yeni bir veritabanı kümesi (cluster) oluşturmak\n"
+" eski kümeye hizmet veren postmaster'ı kapatmak\n"
+" yeni kümeye hizmet veren postmaster'ı kapatmak\n"
+
+#: option.c:302
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"pg_upgrade çalıştırdığınızda, aşağıdaki bilgileri sağlamalısınız:\n"
+" eski küme için veri dizini (-d DATADIR)\n"
+" yeni küme için veri dizini (-D DATADIR)\n"
+" eski sürüm için \"bin\" dizini (-b BINDIR)\n"
+" yeni sürüm için \"bin\" dizini (-B BINDIR)\n"
+
+#: option.c:308
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"Örnek:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"veya\n"
+"\n"
+"\n"
+
+#: option.c:313
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:319
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:325
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <pgsql-bugs@postgresql.org>.\n"
+msgstr ""
+"\n"
+"Hataları <pgsql-bugs@postgresql.org> adresine bildirebilirsiniz.\n"
+
+#: option.c:358
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"%s'nin olduğu dizini belirtmelisiniz.\n"
+"Lütfen %s komut-satırı seçeneğini ya da %s ortam değişkenini kullanınız.\n"
+
+#: option.c:409
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Kaynak küme (cluster) için gerçek veri dizini bulunuyor"
+
+#: option.c:411
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Hedef küme (cluster) için gerçek veri dizini bulunuyor"
+
+#: option.c:423
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "%s kullanılarak veri dizini alınamadı: %s\n"
+
+#: option.c:488
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "%d satırı, \"%s\" dosyasından okunamadı: %s\n"
+
+#: option.c:506
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "kullanıcı tarafından sağlanan eski port numarası%hu %hu olarak düzeltildi\n"
+
+#: parallel.c:128 parallel.c:241
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "işçi süreci yaratılamadı: %s\n"
+
+#: parallel.c:147 parallel.c:262
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "işçi threadi yaratılamadı: %s\n"
+
+#: parallel.c:305
+#, c-format
+msgid "waitpid() failed: %s\n"
+msgstr "waitpid() başarısız oldu: %s\n"
+
+#: parallel.c:309
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "alt süreç (child process) olağan dışı olarak sonlandı: durum %d\n"
+
+#: parallel.c:324
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "Alt işçi (child worker) olağan dışı olarak sonlandı: %s\n"
+
+#: pg_upgrade.c:106
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "\"%s\" dizininin erişim hakları okunamıyor: %s\n"
+
+#: pg_upgrade.c:123
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"Yükseltme (upgrade) gerçekleştiriliyor\n"
+"----------------------------------\n"
+
+#: pg_upgrade.c:166
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Yeni küme (cluster) için sonraki OID belirleniyor"
+
+#: pg_upgrade.c:173
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Veri dizinini diske eşzamanla (sync)"
+
+#: pg_upgrade.c:185
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"Yükseltme (upgrade) tamamlandı\n"
+"----------------------------\n"
+
+#: pg_upgrade.c:231
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Eski kümeye (cluster) hizmet veren bir postmaster var görünüyor.\n"
+"Lütfen o postmaster'ı kapatıp tekrar deneyin.\n"
+
+#: pg_upgrade.c:244
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"Yeni kümeye (cluster) hizmet veren bir postmaster var görünüyor.\n"
+"Lütfen o postmaster'ı kapatıp tekrar deneyin.\n"
+
+#: pg_upgrade.c:250
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: çalıştırılabilir dosya bulunamadı\n"
+
+#: pg_upgrade.c:267
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Yeni cluster daki tüm satırlar (row) analiz ediliyor."
+
+#: pg_upgrade.c:280
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Yeni cluster daki tüm satırlar donduruluyor."
+
+#: pg_upgrade.c:300
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Yeni kümede (cluster) global objeler geri yükleniyor (restore)"
+
+#: pg_upgrade.c:315
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "Yeni kümede (cluster) veritabanı şemaları geri yükleniyor\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "yeni %s deki dosyalar siliniyor"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "%s dizini silinemedi\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Eski %s yeni sunucuya kopyalanıyor"
+
+#: pg_upgrade.c:471
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Yeni küme (cluster) için sonraki işlem (transaction) ID ve dönem değeri belirleniyor."
+
+#: pg_upgrade.c:501
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Yeni kümede (cluster) sonraki multixact ID değeri ve göreli konum değeri (offset) belirleniyor"
+
+#: pg_upgrade.c:525
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Yeni kümede (cluster) en eski multixact ID değeri belirleniyor"
+
+#: pg_upgrade.c:545
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "WAL arşivleri sıfırlanıyor (reset)"
+
+#: pg_upgrade.c:588
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Yeni kümede (cluster) frozenxid ve minmxid sayaçları belirleniyor"
+
+#: pg_upgrade.c:590
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Yeni kümede (cluster) minmxid sayacı belirleniyor"
+
+#: relfilenode.c:34
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "Kullanıcı ilişki dosyaları bağlantılanıyor\n"
+
+#: relfilenode.c:36
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "Kullanıcı ilişki dosyaları kopyalanıyor\n"
+
+#: relfilenode.c:110
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "eski veritabanı \"%s\" yeni kümede (cluster) bulunmuyor\n"
+
+#: relfilenode.c:231
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "dosya varlığını kontrol sırasında hata oluştu \"%s.%s\" (\"%s\"yi \"%s\"ye): %s\n"
+
+#: relfilenode.c:249
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\"ye yeniden yazılıyor\n"
+
+#: relfilenode.c:255
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\"ye kopyalanıyor\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "\"%s\", \"%s\" ye bağlantılanıyor\n"
+
+#: server.c:34
+#, c-format
+msgid "connection to database failed: %s"
+msgstr "veritabanına bağlantı başarısız oldu: %s"
+
+#: server.c:40 server.c:142 util.c:136 util.c:166
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Başarısız, çıkılıyor\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "çalıştırılıyor: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL komutu çalıştırılamadı\n"
+"%s\n"
+"%s"
+
+#: server.c:168
+#, c-format
+msgid "could not open version file: %s\n"
+msgstr "sürüm dosyası açılamadı: %s\n"
+
+#: server.c:172
+#, c-format
+msgid "could not parse PG_VERSION file from %s\n"
+msgstr "PG_VERSION dosyası %s den ayrıştırılamadı (parse)\n"
+
+#: server.c:295
+#, c-format
+msgid ""
+"\n"
+"connection to database failed: %s"
+msgstr ""
+"\n"
+"veritabanına bağlantı başarısız oldu: %s"
+
+#: server.c:300
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"aşağıdaki komutla başlatılan kaynak postmaster'a bağlanılamadı:\n"
+"%s\n"
+
+#: server.c:304
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"aşağıdaki komutla başlatılan hedef postmaster'a bağlanılamadı:\n"
+"%s\n"
+
+#: server.c:318
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl kaynak sunucuyu başlatmakta başarısız oldu, ya da bağlantı başarısız\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl hedef sunucuyu başlatmakta başarısız oldu, ya da bağlantı başarısız\n"
+
+#: server.c:365
+#, c-format
+msgid "out of memory\n"
+msgstr "bellek yetersiz\n"
+
+#: server.c:378
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "%s libpq ortam değişkeni yerel olmayan (non-local) bir sunucu değerine sahip: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"Tablespace'ler kullanıldığında aynı sistem katalog sürümüne/sürümünden\n"
+"yükseltme yapılamaz.\n"
+
+#: tablespace.c:87
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "tablespace için \"%s\" dizini mevcut değil\n"
+
+#: tablespace.c:91
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "\"%s\" tablesapace dizininin durumu görüntülenemedi (stat): %s\n"
+
+#: tablespace.c:96
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "tablespace için verilen \"%s\" yolu bir dizin değil\n"
+
+#: util.c:50
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:83
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:175
+#, c-format
+msgid "ok"
+msgstr "tamam"
+
+#: version.c:32
+#, c-format
+msgid "Checking for large objects"
+msgstr "Büyük nesneler (large objects) için kontrol yapılıyor"
+
+#: version.c:80 version.c:382
+#, c-format
+msgid "warning"
+msgstr "uyarı"
+
+#: version.c:82
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda büyük nesneler mevcut. Yeni veritabanının\n"
+"ilave bir büyük nesne yetkilendirme tablosu var. Yükseltme sonrası,\n"
+"size pg_largeobjet_metadata tablosunu varsayılan yetkilerle\n"
+" doldurmak için bir komut verilecek.\n"
+"\n"
+" \n"
+
+#: version.c:88
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda büyük nesneler mevcut. Yeni veritabanının\n"
+"ilave bir büyük nesne yetkilendirme tablosu var, yani bütün büyük\n"
+"nesneler için varsayılan yetkiler tanımlanmalı. Aşağıdaki dosya:\n"
+" %s\n"
+"psql'de veritabanı superuser'ı tarafından çalıştırıldığında varsayılan yetkileri ayarlayacak.\n"
+"\n"
+"\n"
+"\n"
+
+#: version.c:118
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Uyumlu olmayan \"line\" veri tipi için kontrol yapılıyor"
+
+#: version.c:180
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables. This\n"
+"data type changed its internal and input/output format between your old\n"
+"and new clusters so this cluster cannot currently be upgraded. You can\n"
+"remove the problem tables and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuzda kullanıcı tablolarında \"line\" veri tipi mevcut. Bu \n"
+"veri tipi, girdi/çıktı formatı eski ve yeni sürümler arasında değişiklik\n"
+"gösterdiği için bu küme şu anda yükseltilemiyor. Sorunlu tabloları\n"
+"çıkartıp yükseltmeyi tekrar başlatabilirsiniz. Problemli sütunları \n"
+"aşağıdaki dosyada bulabilirsiniz:\n"
+" %s\n"
+"\n"
+"\n"
+
+#: version.c:215
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Geçersiz \"bilinmeyen\" kullanıcı sütunları için kontrol yapılıyor"
+
+#: version.c:281
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables. This\n"
+"data type is no longer allowed in tables, so this cluster cannot currently\n"
+"be upgraded. You can remove the problem tables and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"Kurulumunuz kullanıcı tablolarında \"unknown\" veri tipini içeriyor. Bu veri tipi\n"
+"tablolarda artık kullanılamadığından, bu küme (cluster) şu anda yüksletilemez\n"
+"Problemli tabloları çıkartarak (remove) yükseltmeyi tekrar başlatabilirsiniz.\n"
+"Problemli alanların bir listesini şu dosya içinde bulabilirsiniz:\n"
+" %s\n"
+"\n"
+
+#: version.c:304
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Hash indeksler kontrol ediliyor"
+
+#: version.c:384
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda hash indeksler mevcut. Bu indeksler eski ve yeni \n"
+"kümelerinizde farklı dahili formatlara sahip, bu yüzden REINDEX \n"
+"komutuyla tekrar indekslemelisiniz. Yükseltme sonrası size \n"
+"REINDEX talimatları verilecek.\n"
+"\n"
+"\n"
+
+#: version.c:390
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"Kurulumunuzda hash indeksler mevcut. Bu indeksler eski ve yeni \n"
+"kümelerinizde farklı dahili formatlara sahip, bu yüzden REINDEX \n"
+"komutuyla tekrar indekslemelisiniz. Aşağıdaki dosya:\n"
+" %s\n"
+"psql'de veritabanı superuser'ı tarafından çalıştırıldığında bütün geçersiz\n"
+"indeksleri yeniden oluşturacak; o zamana kadar bu indeksler kullanılmayacak.\n"
+"\n"
diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po
new file mode 100644
index 0000000..07c0119
--- /dev/null
+++ b/src/bin/pg_upgrade/po/uk.po
@@ -0,0 +1,1698 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-12-17 22:18+0000\n"
+"PO-Revision-Date: 2023-12-20 11:53\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_16_STABLE/pg_upgrade.pot\n"
+"X-Crowdin-File-ID: 963\n"
+
+#: check.c:72
+#, c-format
+msgid "Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr "Перевірка цілістності на старому працюючому сервері\n"
+"------------------------------------------------"
+
+#: check.c:78
+#, c-format
+msgid "Performing Consistency Checks\n"
+"-----------------------------"
+msgstr "Проведення перевірок цілістності\n"
+"-----------------------------"
+
+#: check.c:234
+#, c-format
+msgid "\n"
+"*Clusters are compatible*"
+msgstr "\n"
+"*Кластери сумісні*"
+
+#: check.c:242
+#, c-format
+msgid "\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr "\n"
+"Якщо робота pg_upgrade після цієї точки перерветься, вам потрібно буде заново виконати initdb \n"
+"для нового кластера, перед продовженням."
+
+#: check.c:283
+#, c-format
+msgid "Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr "Статистика оптимізатора не передається за допомогою pg_upgrade.\n"
+"Після запуску нового серверу розгляньте можливість запуску:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:289
+#, c-format
+msgid "Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr "При запуску цього скрипту файли даних старого кластера будуть видалені:\n"
+" %s"
+
+#: check.c:294
+#, c-format
+msgid "Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr "Не вдалося створити скрипт для видалення файлів даних старого кластеру,\n"
+"тому що каталог даних старого кластера містить користувацькі табличні\n"
+"простори або каталог даних нового кластера. Вміст старого кластера\n"
+"треба буде видалити вручну."
+
+#: check.c:306
+#, c-format
+msgid "Checking cluster versions"
+msgstr "Перевірка версій кластерів"
+
+#: check.c:318
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "Ця утиліта може виконувати оновлення тільки з версії PostgreSQL %s і новіше."
+
+#: check.c:323
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "Ця утиліта може тільки підвищувати версію PostgreSQL до версії %s."
+
+#: check.c:332
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "Ця утиліта не може використовуватись для пониження версії до більш старих основних версій PostgreSQL."
+
+#: check.c:337
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "Каталог даних і двійковий каталог старого кластера з різних основних версій."
+
+#: check.c:340
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "Каталог даних нового кластера і двійковий каталог з різних основних версій."
+
+#: check.c:355
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "Для перевірки працюючого сервера, старий і новий номер порта повинні бути різними."
+
+#: check.c:375
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "Новий кластер бази даних \"%s\" не порожній: знайдено відношення \"%s.%s\""
+
+#: check.c:398
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "Перевірка каталогів табличних просторів кластера"
+
+#: check.c:409
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "каталог нового кластерного табличного простору вже існує: \"%s\""
+
+#: check.c:442
+#, c-format
+msgid "\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr "\n"
+"ПОПЕРЕДЖЕННЯ: новий каталог даних не повинен бути всередині старого каталогу даних, наприклад %s"
+
+#: check.c:466
+#, c-format
+msgid "\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr "\n"
+"ПОПЕРЕДЖЕННЯ: користувацькі розташування табличних просторів не повинні бути всередині каталогу даних, наприклад %s"
+
+#: check.c:476
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "Створення скрипту для видалення старого кластеру"
+
+#: check.c:479 check.c:652 check.c:768 check.c:863 check.c:992 check.c:1069
+#: check.c:1348 check.c:1422 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "не вдалося відкрити файл \"%s\": %s"
+
+#: check.c:530
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "не вдалося додати право виконання для файлу \"%s\": %s"
+
+#: check.c:550
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "Перевірка, чи є користувач бази даних стартовим користувачем"
+
+#: check.c:566
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "користувач бази даних \"%s\" не є стартовим користувачем"
+
+#: check.c:577
+#, c-format
+msgid "could not determine the number of users"
+msgstr "не вдалося визначити кількість користувачів"
+
+#: check.c:585
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "В новому кластері може бути визначеним тільки стартовий користувач."
+
+#: check.c:614
+#, c-format
+msgid "Checking database connection settings"
+msgstr "Перевірка параметрів підключення до бази даних"
+
+#: check.c:640
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 не повинна дозволяти підключення, тобто pg_database.datallowconn повинно бути false"
+
+#: check.c:667 check.c:788 check.c:886 check.c:1012 check.c:1089 check.c:1148
+#: check.c:1209 check.c:1238 check.c:1272 check.c:1303 check.c:1362
+#: check.c:1443 function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "збій"
+
+#: check.c:668
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr "Всі бази даних, окрім template0, повинні дозволяти підключення, тобто\n"
+"pg_database.datallowconn повинно бути true. Ваша інсталяція містить\n"
+"бази даних окрім template0 значення pg_database.datallowconn яких дорівнює \n"
+"false. Розгляньте можливість надати дозвіл на з’єднання для всіх баз даних, \n"
+"які не є шаблоном, або видалити баз даних, які не дозволяють з’єднання. \n"
+"Список баз даних з проблемою знаходиться у файлі:\n"
+" %s"
+
+#: check.c:693
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "Перевірка підготовлених транзакцій"
+
+#: check.c:702
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "Початковий кластер містить підготовлені транзакції"
+
+#: check.c:704
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "Цільовий кластер містить підготовлені транзакції"
+
+#: check.c:729
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "Перевірка невідповідності при передаванні bigint в contrib/isn"
+
+#: check.c:789
+#, c-format
+msgid "Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить функції \"contrib/isn\", що використовують тип даних bigint. Старі та нові кластери передають значення bigint по-різному, тому цей кластер наразі неможливо оновити. Ви можете вручну вивантажити бази даних зі старого кластеру, що використовує засоби \"contrib/isn\", видалити їх, виконати оновлення, а потім відновити їх. Список проблемних функцій подано у файлі:\n"
+" %s"
+
+#: check.c:811
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "Перевірка постфіксних операторів визначених користувачем"
+
+#: check.c:887
+#, c-format
+msgid "Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить користувацькі постфіксні оператори, що більше не підтримуються.\n"
+"Розгляньте можливість видалення постфіксних операторів та заміни їх на префіксні оператори або виклики функцій.\n"
+"Список користувацьких постфіксних операторів знаходиться у файлі:\n"
+" %s"
+
+#: check.c:911
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "Перевірка несумісних поліморфних функцій"
+
+#: check.c:1013
+#, c-format
+msgid "Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr "У вашій інсталяції містяться користувацькі об'єкти, які посилаються на внутрішні\n"
+"поліморфні функції з аргументами типу \"anyarray\" або \"anyelement\".\n"
+"Ці користувацькі об'єкти повинні бути видалені перед оновленням і відновлені\n"
+"після цього, змінивши їх посилання на нові відповідні функції з\n"
+"аргументами типу \"anycompatiblearray\" і \"anycompatible\".\n"
+"Список проблемних об'єктів знаходиться у файлі:\n"
+" %s"
+
+#: check.c:1037
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "Перевірка таблиць WITH OIDS"
+
+#: check.c:1090
+#, c-format
+msgid "Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить таблиці, створені як WITH OIDS, що більше не підтримуються. Розгляньте видалення стовпців, що містять oid за допомогою\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"Список проблемних таблиць подано у файлі:\n"
+" %s"
+
+#: check.c:1118
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "Перевірка складених типів визначених системою у таблицях користувача"
+
+#: check.c:1149
+#, c-format
+msgid "Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить складені типи визначені системою у таблицях користувача.\n"
+"Ці типи OID не стабільні між версіями PostgreSQL, тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "Перевірка типів даних reg* в користувацьких таблицях"
+
+#: check.c:1210
+#, c-format
+msgid "Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить один з типів даних reg* у таблицях користувача.\n"
+"Ці типи даних посилаються на OID системи, які не зберігаються за допомогою pg_upgrade, тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: check.c:1231
+#, c-format
+msgid "Checking for incompatible \"%s\" data type in user tables"
+msgstr "Перевірка несумісного типу даних \"%s\" в користувацьких таблицях"
+
+#: check.c:1239
+#, c-format
+msgid "Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить тип даних \"aclitem\" у таблицях користувача.\n"
+"Внутрішній формат \"aclitem\" змінено під час версії 16,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: check.c:1263
+#, c-format
+msgid "Checking for removed \"%s\" data type in user tables"
+msgstr "Перевірка видаленого типу даних \"%s\" в користувацьких таблицях"
+
+#: check.c:1273
+#, c-format
+msgid "Your installation contains the \"%s\" data type in user tables.\n"
+"The \"%s\" type has been removed in PostgreSQL version %s,\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns, or change them to another data type, and restart\n"
+"the upgrade. A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Користувацькі таблиці у вашій інсталяції містять тип даних \"%s\".\n"
+"Тип \"%s\" був видалений з версії PostgreSQL %s, тому цей кластер \n"
+"наразі не може бути оновлений. Ви можете видалите проблемні \n"
+"стовпці або змінити їх на інший тип даних, і перезапустити\n"
+"оновлення. Список проблемних стовпців є у файлі:\n"
+" %s"
+
+#: check.c:1295
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "Перевірка несумісного типу даних \"jsonb\""
+
+#: check.c:1304
+#, c-format
+msgid "Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить тип даних \"jsonb\" у таблицях користувача.\n"
+"Внутрішній формат \"jsonb\" змінено під час версії 9.4 beta,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: check.c:1331
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "Перевірка ролей, які починаються з \"pg_\""
+
+#: check.c:1363
+#, c-format
+msgid "Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить ролі, які починаються з \"pg_\".\n"
+"\"pg_\" є зарезервованим префіксом для системних ролей. Кластер\n"
+"не може бути оновлений, поки ці ролі не будуть перейменовані.\n"
+"Список ролей, які починаються з \"pg_\" у файлі:\n"
+" %s"
+
+#: check.c:1383
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "Перевірка користувацьких перетворення кодувань"
+
+#: check.c:1444
+#, c-format
+msgid "Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить користувацькі перетворення кодувань.\n"
+"Параметри функції перетворення змінено у версії PostgreSQL 14,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити перетворення кодувань в старому кластері та перезапустити оновлення.\n"
+"Список перетворень кодувань знаходиться у файлі:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "не вдалося отримати контрольні дані за допомогою %s: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: неприпустимий стан кластера баз даних"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Початковий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного серверу."
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "Цільовий кластер завершив роботу в режимі відновлення. Щоб виконати оновлення, використайте документований спосіб з \"rsync\" або вимкніть його в режимі головного серверу."
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "Початковий кластер завершив роботу некоректно."
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "Цільовий кластер завершив роботу некоректно."
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "В початковому кластері відсутня інформація про стан кластера:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "В цільовому кластері відсутня інформація про стан кластера:"
+
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: проблема pg_resetwal"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: проблема з отриманням контрольних даних"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "У початковому кластері відсутня необхідна контрольна інформація:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "У цільовому кластері відсутня необхідна контрольна інформація:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " наступний XID контрольної точки"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " наступний OID останньої контрольної точки"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " наступний MultiXactId останньої контрольної точки"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " найстарший MultiXactId останньої контрольної точки"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " найстарший oldestXID останньої контрольної точки"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " наступний MultiXactOffset останньої контрольної точки"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " перший сегмет WAL після скидання"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " метод передачі аргументу float8"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " максимальне вирівнювання"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " розмір блоку"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " розмір сегменту великого відношення"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " розмір блоку WAL"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " розмір сегменту WAL"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " максимальна довжина ідентифікатора"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " максимальна кількість індексованих стовпців"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " максимальний розмір порції TOAST"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " розмір порції великого об'єкту"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " дата/час представлені цілими числами?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " версія контрольних сум даних"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "Не можна продовжити без необхідної контрольної інформації, завершення"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr "старе і нове вирівнювання в pg_controldata неприпустимі або не збігаються\n"
+"Ймовірно, один кластер встановлений у 32-бітній системі, а інший - у 64-бітній"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "старий і новий розмір блоків в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "старий і новий максимальний розмір сегментів відношень в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "старий і новий розмір блоків WAL в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "старий і новий розмір сегментів WAL в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "стара і нова максимальна довжина ідентифікаторів в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "стара і нова максимальна кількість індексованих стовпців в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "старий і новий максимальний розмір порції TOAST в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "старий і новий розмір порції великого об'єкту в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "старий і новий тип сховища дати/часу в pg_controldata неприпустимі або не збігаються"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "старий кластер не використовує контрольні суми даних, але новий використовує"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "старий кластер використовує контрольні суми даних, але новий не використовує"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "стара і нова версія контрольних сум кластера в pg_controldata не збігаються"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "Додавання суфікса \".old\" до старого файла global/pg_control"
+
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "не вдалося перейменувати файл \"%s\" на \"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid "\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr "\n"
+"Якщо ви хочете запустити старий кластер, вам необхідно видалити\n"
+"суфікс \".old\" з файлу %s/global/pg_control.old. Через використання\n"
+"режиму \"link\" робота старого кластера після запуску нового може бути\n"
+"небезпечна."
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "Створення вивантаження глобальних об'єктів"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "Створення дампу схем бази даних"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "не вдалося отримати дані версії pg_ctl, виконавши %s: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "не вдалося отримати версію pg_ctl з результату %s"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "команда занадто довга"
+
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "не вдалося відкрити файл журналу \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid "\n"
+"*failure*"
+msgstr "\n"
+"*неполадка*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "Під час виконання \"%s\" виникли проблеми"
+
+#: exec.c:199
+#, c-format
+msgid "Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n"
+"файлу \"%s\" або \"%s\"."
+
+#: exec.c:204
+#, c-format
+msgid "Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr "Щоб зрозуміти причину неполадки, зверніться до декількох останніх рядків\n"
+"файлу \"%s\"."
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "не вдалося записати до файлу журналу \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "не вдалося відкрити файл \"%s\" для читання: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "Ви повинні мати права на читання і запис в поточному каталозі."
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "перевірка \"%s\" провалена: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" не є каталогом"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "перевірка \"%s\" провалена: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "помилка перевірки \"%s\": не можна виконати"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "помилка перевірки \"%s\": неправильна версія: знайдено \"%s\", очікувалось \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка при клонуванні відношення \"%s.%s\" (\"%s\" до \"%s\"): %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "помилка при клонуванні відношення \"%s.%s\": не вдалося відкрити файл \"%s\": %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "помилка при клонуванні відношення \"%s.%s\": не вдалося створити файл \"%s\": %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося відкрити файл \"%s\": %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося створити файл \"%s\": %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося прочитати файл \"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося записати до файлу \"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка під час копіювання відношення \"%s.%s\" ( з \"%s\" в \"%s\"): %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка під час створення посилання для відношення \"%s.%s\" ( з \"%s\" в \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "помилка під час копіювання відношення \"%s.%s\": не вдалося отримати стан файлу \"%s\": %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "помилка під час копіювання відношення \"%s.%s\": у файлі \"%s\" знайдена часткова сторінка"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "не вдалося клонувати файл між старим і новим каталогами даних: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "не вдалося створити файл \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "клонування файлів не підтримується на цій платформі"
+
+#: file.c:372
+#, c-format
+msgid "could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr "не вдалося створити жорстке посилання між старим і новим каталогами даних: %s\n"
+"В режимі посилань старий і новий каталоги даних повинні знаходитись в одній файловій системі."
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "Перевірка наявності необхідних бібліотек"
+
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "не вдалося завантажити бібліотеку \"%s\": %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "У базі даних: %s\n"
+
+#: function.c:186
+#, c-format
+msgid "Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr "У вашій інсталяції є посилання на завантажувані бібліотеки, що \n"
+"відсутні в новій інсталяції. Ви можете додати ці бібліотеки до нової інсталяції\n"
+"або видалити функції, які використовують їх зі старої інсталяції. Список\n"
+"проблемних бібліотек подано у файлі:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "Імена відношень з OID %u в базі даних \"%s\" не збігаються: старе ім'я \"%s.%s\", нове ім'я \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "Не вдалося зіставити старі таблиці з новими в базі даних \"%s\""
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " це індекс в \"%s.%s\""
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " це індекс у відношенні з OID %u"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " це TOAST-таблиця для \"%s.%s\""
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " це TOAST-таблиця для відношення з OID %u"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "У старому кластері не знайдено відповідності для нового відношення з OID %u в базі даних %s\": %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "У новому кластері не знайдено відповідності для старого відношення з OID %u в базі даних \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid "\n"
+"source databases:"
+msgstr "\n"
+"вихідні бази даних:"
+
+#: info.c:291
+#, c-format
+msgid "\n"
+"target databases:"
+msgstr "\n"
+"цільові бази даних:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "template0 не знайдено"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "База даних: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "ім'я_відношення: %s.%s: oid_відношення: %u табл_простір: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: не можна запустити як root"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "неприпустимий старий номер порту"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "неприпустимий новий номер порту"
+
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "Спробуйте \"%s --help\" для додаткової інформації.\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "Виконується в детальному режимі"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "розташування двійкових даних старого кластера"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "розташування двійкових даних нового кластера"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "розташування даних старого кластера"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "розташування даних нового кластера"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "сокети будуть створені"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "не вдалося визначити поточний каталог"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "у Windows не можна виконати pg_upgrade всередині каталогу даних нового кластера"
+
+#: option.c:268
+#, c-format
+msgid "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n"
+msgstr "pg_upgrade оновлює кластер PostgreSQL до іншої основної версії.\n\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: option.c:270
+#, c-format
+msgid " pg_upgrade [OPTION]...\n\n"
+msgstr " pg_upgrade [OPTION]...\n\n"
+
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "Параметри:\n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR каталог виконуваних файлів старого кластера\n"
+
+#: option.c:273
+#, c-format
+msgid " -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr " -B, --new-bindir=BINDIR каталог виконуваних файлів нового кластера (за замовчуванням\n"
+" той самий каталог, що і pg_upgrade)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check тільки перевірити кластери, не змінювати ніякі дані\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR каталог даних старого кластера\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR каталог даних нового кластера\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM число одночасних процесів або потоків для використання\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link встановлювати посилання замість копіювання файлів до нового кластера\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати завершення збереження змін на диску\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS параметри старого кластера, які передаються серверу\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS параметри нового кластера, які передаються серверу\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT номер порту старого кластера (за замовчуванням %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT номер порту нового кластера (за замовчуванням %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain зберегти файли журналів і SQL після успішного завершення\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR директорія сокету для використання (за замовчування поточна директорія)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME суперкористувач кластера (за замовчуванням \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose активувати виведення детальних внутрішніх повідомлень\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version відобразити інформацію про версію, потім вийти\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone клонувати замість копіювання файлів до нового кластера\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy копіювати файли до нового кластеру (за замовчуванням)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: option.c:293
+#, c-format
+msgid "\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr "\n"
+"До виконання pg_upgrade ви повинні:\n"
+" створити новий кластер баз даних (використовуючи нову версію initdb)\n"
+" завершити процес postmaster, який обслуговує старий кластер\n"
+" завершити процес postmaster, який обслуговує новий кластер\n"
+
+#: option.c:298
+#, c-format
+msgid "\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr "\n"
+"Коли ви виконуєте pg_upgrade, ви повинні надати наступну інформацію:\n"
+" каталог даних старого кластера (-d DATADIR)\n"
+" каталог даних нового кластера (-D DATADIR)\n"
+" каталог \"bin\" старого кластера (-b BINDIR)\n"
+" каталог \"bin\" нового кластера (-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid "\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr "\n"
+"Наприклад:\n"
+" pg_upgrade -d старий_кластер/data -D новий_кластер/data -b старий_кластер/bin -B новий_кластер/bin\n"
+"або\n"
+
+#: option.c:309
+#, c-format
+msgid " $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr " $ export PGDATAOLD=старий_кластер/data\n"
+" $ export PGDATANEW=новий_кластер/data\n"
+" $ export PGBINOLD=старий_кластер/bin\n"
+" $ export PGBINNEW=новий_кластер/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid " C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr " C:\\> set PGDATAOLD=старий_кластер/data\n"
+" C:\\> set PGDATANEW=новий_кластер/data\n"
+" C:\\> set PGBINOLD=старий_кластер/bin\n"
+" C:\\> set PGBINNEW=новий_кластер/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid "\n"
+"Report bugs to <%s>.\n"
+msgstr "\n"
+"Повідомляти про помилки на <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid "You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr "Ви повинні визначити каталог, де знаходиться %s.\n"
+"Будь ласка, використайте параметр командного рядка %s або змінну середовища %s."
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "Пошук дійсного каталогу даних для початкового кластера"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "Пошук дійсного каталогу даних для цільового кластера"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "не вдалося отримати каталог даних, виконавши %s: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "не вдалося прочитати рядок %d з файлу \"%s\": %s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "вказаний користувачем старий номер порту %hu змінений на %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "не вдалося створити робочий процес: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "не вдалося створити робочий потік: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() помилка: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "дочірній процес завершився ненормально: статус %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "дочірній процес завершився аварійно: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "не вдалося прочитати права на каталог \"%s\": %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid "\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr "\n"
+"Виконання оновлення\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "Встановлення наступного OID для нового кластера"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "Синхронізація каталогу даних на диск"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid "\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr "\n"
+"Оновлення завершено\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "шлях каталогу для нового кластеру занадто довгий"
+
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "не вдалося створити каталог \"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: не вдалося знайти файл виконання власної програми"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid "There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr "Мабуть, запущений процес postmaster, який обслуговує старий кластер.\n"
+"Будь ласка, завершіть роботу процесу і спробуйте знову."
+
+#: pg_upgrade.c:366
+#, c-format
+msgid "There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr "Мабуть, запущений процес postmaster, який обслуговує новий кластер.\n"
+"Будь ласка, завершіть роботу процесу і спробуйте знову."
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "Установка локалі та кодування для нового кластеру"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "Аналіз всіх рядків у новому кластері"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "Закріплення всіх рядків у новому кластері"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "Відновлення глобальних об'єктів у новому кластері"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "Відновлення схем баз даних у новому кластері"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "Видалення файлів з нового %s"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "не вдалося видалити каталог \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "Копіювання старого %s до нового серверу"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "Встановлення найстарішого XID для нового кластеру"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "Установка наступного ID транзакції й епохи для нового кластера"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "Установка наступного ID і зсуву мультитранзакції для нового кластера"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "Установка найстаршого ID мультитранзакції в новому кластері"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "Скидання архівів WAL"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "Установка лічильників frozenxid і minmxid у новому кластері"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "Установка лічильника minmxid у новому кластері"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Клонування файлів користувацьких відношень"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "Копіювання файлів користувацьких відношень"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "Приєднання файлів користувацьких відношень"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "стара база даних \"%s\" не знайдена в новому кластері"
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "помилка під час перевірки існування файлу \"%s.%s\" (з \"%s\" в \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "переписування \"%s\" на \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "клонування \"%s\" до \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "копіювання \"%s\" в \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "створення посилання на \"%s\" в \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "Помилка, вихід\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "виконується: %s"
+
+#: server.c:139
+#, c-format
+msgid "SQL command failed\n"
+"%s\n"
+"%s"
+msgstr "Помилка SQL-команди\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "не вдалося відкрити файл версії \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "не вдалося проаналізувати файл версії \"%s\""
+
+#: server.c:288
+#, c-format
+msgid "\n"
+"%s"
+msgstr "\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid "could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr "не вдалося підключитися до початкового процесу postmaster, запущеного командою:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid "could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr "не вдалося підключитися до цільового процесу postmaster, запущеного командою:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl не зміг запустити початковий сервер або сталася помилка підключення"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl не зміг запустити цільовий сервер або сталася помилка підключення"
+
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "недостатньо пам'яті"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "у змінній середовища для libpq %s задано не локальне значення: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid "Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr "Оновлення в межах однієї версії системного каталогу неможливе,\n"
+"якщо використовуються табличні простори."
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "каталог табличного простору \"%s\" не існує"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "не вдалося отримати стан каталогу табличного простору \"%s\": %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "шлях табличного простору \"%s\" не вказує на каталог"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "немає доступу до каталогу \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "Перевірка несумісного типу даних \"line\""
+
+#: version.c:193
+#, c-format
+msgid "Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить тип даних \"line\" в таблицях користувача.\n"
+"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою старою та новими версіями,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "Перевірка неприпустимих користувацьких стовпців \"unknown\""
+
+#: version.c:233
+#, c-format
+msgid "Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить \"unknown\" тип даних у таблицях користувача.\n"
+"Цей тип даних більше не допускається в таблицях,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "Перевірка геш-індексів"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "попередження"
+
+#: version.c:337
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr "\n"
+"Ваша інсталяція містить геш-індекси. Ці індекси мають різні внутрішні\n"
+"формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n"
+"за допомогою команди REINDEX. Після оновлення вам буде надано інструкції REINDEX."
+
+#: version.c:343
+#, c-format
+msgid "\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr "\n"
+"Ваша інсталяція містить геш-індекси. Ці індекси мають різні внутрішні\n"
+"формати в старому і новому кластерах, тож їх потрібно повторно індексувати\n"
+"за допомогою команди REINDEX. Файл\n"
+" %s\n"
+"після виконання суперкористувачем бази даних в psql, повторно створить\n"
+"всі неприпустимі індекси; до цього ніякі геш-індекси не будуть використовуватись."
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "Перевірка неприпустимих користувацьких стовпців \"sql_identifier\""
+
+#: version.c:379
+#, c-format
+msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr "Ваша інсталяція містить \"sql_identifier\" тип даних у таблицях користувача.\n"
+"Формат зберігання для цього типу даних змінено,\n"
+"тому цей кластер наразі не може бути оновлений.\n"
+"Ви можете видалити проблемні стовпці та перезапустити оновлення.\n"
+"Список проблемних стовпців знаходиться у файлі:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "Перевірка оновлень розширення"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "повідомлення"
+
+#: version.c:451
+#, c-format
+msgid "\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr "\n"
+"Ваша інсталяція містить розширення, які потрібно оновити\n"
+"командою ALTER EXTENSION. Файл\n"
+" %s,\n"
+"коли виконується суперкористувачем бази даних за допомогою\n"
+"psql, оновить ці розширення."
+
diff --git a/src/bin/pg_upgrade/po/zh_CN.po b/src/bin/pg_upgrade/po/zh_CN.po
new file mode 100644
index 0000000..4ab61a5
--- /dev/null
+++ b/src/bin/pg_upgrade/po/zh_CN.po
@@ -0,0 +1,1850 @@
+# LANGUAGE message translation file for pg_upgrade
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+# FIRST AUTHOR <zhangjie2@fujitsu.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 14\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2021-08-14 05:46+0000\n"
+"PO-Revision-Date: 2021-08-15 18:40+0800\n"
+"Last-Translator: Jie Zhang <zhangjie2@fujitsu.com>\n"
+"Language-Team: Chinese (Simplified) <zhangjie2@fujitsu.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: check.c:70
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------\n"
+msgstr ""
+"在旧的活动的服务器上执行一致性检查\n"
+"------------------------------------------------\n"
+
+#: check.c:76
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------\n"
+msgstr ""
+"正在执行一致性检查\n"
+"-----------------------------\n"
+
+#: check.c:213
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*\n"
+msgstr ""
+"\n"
+"*群集是兼容的*\n"
+
+#: check.c:219
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing.\n"
+msgstr ""
+"\n"
+"如果pg_upgrade在这一点之后失败,在继续之前必须重新初始化新集群.\n"
+
+#: check.c:264
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+msgstr ""
+"优化器统计数据不会通过pg_upgrade传输。\n"
+"启动新服务器后,考虑运行:\n"
+" %s/vacuumdb %s--all --analyze-in-stages\n"
+"\n"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s\n"
+msgstr ""
+"运行此脚本将删除旧群集的数据文件:\n"
+" %s\n"
+
+#: check.c:275
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually.\n"
+msgstr ""
+"无法创建删除旧群集数据文件的脚本.\n"
+"因为用户定义的表空间或新集群的数据目录存在于旧集群目录中.\n"
+"必须手动删除旧群集的内容.\n"
+
+#: check.c:287
+#, c-format
+msgid "Checking cluster versions"
+msgstr "正在检查群集版本"
+
+#: check.c:299
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n"
+msgstr "此实用程序只能从PostgreSQL 8.4及更高版本升级.\n"
+
+#: check.c:303
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s.\n"
+msgstr "此实用程序只能升级到PostgreSQL版本%s.\n"
+
+#: check.c:312
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n"
+msgstr "此实用程序不能用于降级到旧的主PostgreSQL版本.\n"
+
+#: check.c:317
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions.\n"
+msgstr "旧的集群数据和二进制目录来自不同的主版本.\n"
+
+#: check.c:320
+#, c-format
+msgid "New cluster data and binary directories are from different major versions.\n"
+msgstr "新的集群数据和二进制目录来自不同的主版本.\n"
+
+#: check.c:337
+#, c-format
+msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n"
+msgstr "在检查pre-PG 9.1之前的活动旧服务器时,必须指定旧服务器的端口号.\n"
+
+#: check.c:341
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different.\n"
+msgstr "检查活动服务器时,新端口号和旧端口号必须不同.\n"
+
+#: check.c:356
+#, c-format
+msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的编码不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:361
+#, c-format
+msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的lc_collate不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:364
+#, c-format
+msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n"
+msgstr "数据库\"%s\"的lc_ctype不匹配: 旧的 \"%s\", 新的 \"%s\"\n"
+
+#: check.c:437
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n"
+msgstr "新群集数据库\"%s\"不是空的:找到关系\"%s.%s\"\n"
+
+#: check.c:494
+msgid "Checking for new cluster tablespace directories"
+msgstr "正在检查新的群集表空间目录"
+
+#: check.c:505
+msgid "new cluster tablespace directory already exists: \"%s\"\n"
+msgstr "新的群集表空间目录已存在: \"%s\"\n"
+
+#: check.c:538
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:新数据目录不应位于旧数据目录中,例如 %s\n"
+
+#: check.c:562
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n"
+msgstr ""
+"\n"
+"警告:用户定义的表空间位置不应在数据目录中,例如 %s\n"
+
+#: check.c:572
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "正在创建删除旧群集的脚本"
+
+#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336
+#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376
+#: version.c:511
+#, c-format
+msgid "could not open file \"%s\": %s\n"
+msgstr "无法打开文件 \"%s\": %s\n"
+
+#: check.c:631
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s\n"
+msgstr "无法向文件\"%s\"添加执行权限: %s\n"
+
+#: check.c:651
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "正在检查数据库用户是否为安装用户"
+
+#: check.c:667
+#, c-format
+msgid "database user \"%s\" is not the install user\n"
+msgstr "数据库用户\"%s\"不是安装用户\n"
+
+#: check.c:678
+#, c-format
+msgid "could not determine the number of users\n"
+msgstr "无法确定用户数\n"
+
+#: check.c:686
+#, c-format
+msgid "Only the install user can be defined in the new cluster.\n"
+msgstr "只能在新群集中定义安装用户.\n"
+
+#: check.c:706
+#, c-format
+msgid "Checking database connection settings"
+msgstr "正在检查数据库连接设置"
+
+#: check.c:728
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n"
+msgstr "template0不能允许连接,即,其pg_database.datallowconn必须为false\n"
+
+#: check.c:738
+#, c-format
+msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n"
+msgstr "所有非template0数据库必须允许连接,即,它们的pg_database.dataallowconn必须为true\n"
+
+#: check.c:763
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "正在检查准备的交易记录"
+
+#: check.c:772
+#, c-format
+msgid "The source cluster contains prepared transactions\n"
+msgstr "源群集包含准备好的事务\n"
+
+#: check.c:774
+#, c-format
+msgid "The target cluster contains prepared transactions\n"
+msgstr "目标集群包含准备好的事务\n"
+
+#: check.c:800
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "正在检查contrib/isn和bigint-passing是否不匹配"
+
+#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183
+#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460
+#, c-format
+msgid "fatal\n"
+msgstr "致命的\n"
+
+#: check.c:862
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含\"contrib/isn\"函数,这些函数依赖于bigint数据类型\n"
+"旧群集和新群集传递的bigint值不同,因此当前无法升级此群集\n"
+"您可以手动的在旧集群中转储数据库,\n"
+"使用 \"contrib/isn\"\n"
+"删除它们,执行升级,然后恢复它们。\n"
+"文件中有问题函数的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:885
+msgid "Checking for user-defined postfix operators"
+msgstr "正在检查用户定义的后缀运算符"
+
+#: check.c:963
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户定义的后缀运算符,它们\n"
+"不再支持了。考虑删除后缀运算符并用前缀运算符或函数调用替换它们\n"
+"函数调用替换它们.\n"
+"以下的文件中有用户定义的后缀运算符列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:984
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "正在检查带有OIDS的表"
+
+#: check.c:1039
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用OID声明的表,这不再受支持\n"
+"考虑使用以下的SQL移除OID列\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"有问题的表在以下的文件中:\n"
+" %s\n"
+"\n"
+
+#: check.c:1067
+msgid "Checking for system-defined composite types in user tables"
+msgstr "在用户表中检查系统定义的复合类型"
+
+#: check.c:1096
+msgid ""
+"Your installation contains system-defined composite type(s) in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的系统定义的复合类型。\n"
+"这些类型OID在PostgreSQL版本中不稳定。\n"
+"因此,当前无法升级此群集。\n"
+"你可以删除有问题的列并重新启动升级。\n"
+"以下的文件中有问题列的列表\n"
+" %s\n"
+"\n"
+
+#: check.c:1124
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "正在检查用户表中的reg*数据类型"
+
+#: check.c:1155
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的某个reg*数据类型.\n"
+"这些数据类型引用了pg_upgrade不保留的系统OID, \n"
+"因此当前无法升级此群集 . You can\n"
+"您可以删除问题表并重新启动升级.\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1177
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "正在检查不兼容的\"jsonb\"数据类型"
+
+#: check.c:1184
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"jsonb\"数据类型.\n"
+"\"jsonb\"的内部格式在9.4测试版期间发生了更改,\n"
+"因此当前无法升级该集群。\n"
+"您可以删除问题表并重新启动升级. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1206
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "正在检查以\"pg_\"开头的角色"
+
+#: check.c:1216
+#, c-format
+msgid "The source cluster contains roles starting with \"pg_\"\n"
+msgstr "源集群包含以\"pg_\"开头的角色\n"
+
+#: check.c:1218
+#, c-format
+msgid "The target cluster contains roles starting with \"pg_\"\n"
+msgstr "目标集群包含以\"pg_\"开头的角色\n"
+
+#: check.c:1239
+msgid "Checking for user-defined encoding conversions"
+msgstr "正在检查用户定义的编码转换"
+
+#: check.c:1302
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户定义的编码转换。\n"
+"转换函数参数在PostgreSQL版本14中已更改。\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级. \n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: check.c:1329
+#, c-format
+msgid "failed to get the current locale\n"
+msgstr "无法获取当前区域设置\n"
+
+#: check.c:1338
+#, c-format
+msgid "failed to get system locale name for \"%s\"\n"
+msgstr "无法获取\"%s\"的系统区域设置名称\n"
+
+#: check.c:1344
+#, c-format
+msgid "failed to restore old locale \"%s\"\n"
+msgstr "还原旧区域\"%s\"失败\n"
+
+#: controldata.c:128 controldata.c:196
+#, c-format
+msgid "could not get control data using %s: %s\n"
+msgstr "无法使用%s获取控制数据:%s\n"
+
+#: controldata.c:139
+#, c-format
+msgid "%d: database cluster state problem\n"
+msgstr "%d: 数据库集群状态问题\n"
+
+#: controldata.c:157
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "在恢复模式下,源群集已关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n"
+
+#: controldata.c:159
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n"
+msgstr "目标群集在恢复模式下关闭。要升级,请使用文档中的\"rsync\",或将其作为主服务器关闭。\n"
+
+#: controldata.c:164
+#, c-format
+msgid "The source cluster was not shut down cleanly.\n"
+msgstr "源群集未完全关闭。\n"
+
+#: controldata.c:166
+#, c-format
+msgid "The target cluster was not shut down cleanly.\n"
+msgstr "目标群集未完全关闭。\n"
+
+#: controldata.c:177
+#, c-format
+msgid "The source cluster lacks cluster state information:\n"
+msgstr "源集群缺少集群状态信息:\n"
+
+#: controldata.c:179
+#, c-format
+msgid "The target cluster lacks cluster state information:\n"
+msgstr "目标集群缺少集群状态信息:\n"
+
+#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371
+#: relfilenode.c:243 server.c:33 util.c:79
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:216
+#, c-format
+msgid "%d: pg_resetwal problem\n"
+msgstr "%d: pg_resetwal问题\n"
+
+#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258
+#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310
+#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354
+#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383
+#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427
+#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471
+#: controldata.c:482 controldata.c:493
+#, c-format
+msgid "%d: controldata retrieval problem\n"
+msgstr "%d: 控制数据检索问题\n"
+
+#: controldata.c:572
+#, c-format
+msgid "The source cluster lacks some required control information:\n"
+msgstr "源集群缺少一些必需的控制信息:\n"
+
+#: controldata.c:575
+#, c-format
+msgid "The target cluster lacks some required control information:\n"
+msgstr "目标集群缺少一些必需的控制信息:\n"
+
+#: controldata.c:578
+#, c-format
+msgid " checkpoint next XID\n"
+msgstr " 下一个XID检查点\n"
+
+#: controldata.c:581
+#, c-format
+msgid " latest checkpoint next OID\n"
+msgstr " 最新检查点下一个OID\n"
+
+#: controldata.c:584
+#, c-format
+msgid " latest checkpoint next MultiXactId\n"
+msgstr " 最新检查点下一个MultiXactId\n"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint oldest MultiXactId\n"
+msgstr " 最新检查点最旧的MultiXactId\n"
+
+#: controldata.c:591
+msgid " latest checkpoint oldestXID\n"
+msgstr " 最新检查点的最旧XID\n"
+
+#: controldata.c:594
+#, c-format
+msgid " latest checkpoint next MultiXactOffset\n"
+msgstr " 最新检查点下一个MultiXactOffset\n"
+
+#: controldata.c:597
+#, c-format
+msgid " first WAL segment after reset\n"
+msgstr " 重置后的第一个WAL段\n"
+
+#: controldata.c:600
+#, c-format
+msgid " float8 argument passing method\n"
+msgstr " float8参数传递方法\n"
+
+#: controldata.c:603
+#, c-format
+msgid " maximum alignment\n"
+msgstr " 最大对齐方式\n"
+
+#: controldata.c:606
+#, c-format
+msgid " block size\n"
+msgstr " 块大小\n"
+
+#: controldata.c:609
+#, c-format
+msgid " large relation segment size\n"
+msgstr " 大关系段大小\n"
+
+#: controldata.c:612
+#, c-format
+msgid " WAL block size\n"
+msgstr " WAL块大小\n"
+
+#: controldata.c:615
+#, c-format
+msgid " WAL segment size\n"
+msgstr " WAL段大小\n"
+
+#: controldata.c:618
+#, c-format
+msgid " maximum identifier length\n"
+msgstr " 最大标识符长度\n"
+
+#: controldata.c:621
+#, c-format
+msgid " maximum number of indexed columns\n"
+msgstr " 最大索引列数\n"
+
+#: controldata.c:624
+#, c-format
+msgid " maximum TOAST chunk size\n"
+msgstr " 最大TOAST块大小\n"
+
+#: controldata.c:628
+#, c-format
+msgid " large-object chunk size\n"
+msgstr " 大对象块大小\n"
+
+#: controldata.c:631
+#, c-format
+msgid " dates/times are integers?\n"
+msgstr " 日期/时间是整数?\n"
+
+#: controldata.c:635
+#, c-format
+msgid " data checksum version\n"
+msgstr " 数据校验和版本\n"
+
+#: controldata.c:637
+#, c-format
+msgid "Cannot continue without required control information, terminating\n"
+msgstr "没有所需的控制信息,无法继续,正在终止\n"
+
+#: controldata.c:652
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match\n"
+"Likely one cluster is a 32-bit install, the other 64-bit\n"
+msgstr ""
+"新旧pg_controldata对齐无效或不匹配\n"
+"可能一个集群是32位安装,另一个是64位安装\n"
+
+#: controldata.c:656
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata块大小无效或不匹配\n"
+
+#: controldata.c:659
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n"
+msgstr "新旧pg controldata最大关系段大小无效或不匹配\n"
+
+#: controldata.c:662
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata WAL块大小无效或不匹配\n"
+
+#: controldata.c:665
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata WAL段大小无效或不匹配\n"
+
+#: controldata.c:668
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n"
+msgstr "新旧pg_controldata最大标识符长度无效或不匹配\n"
+
+#: controldata.c:671
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n"
+msgstr "新旧pg_controldata最大索引列无效或不匹配\n"
+
+#: controldata.c:674
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n"
+msgstr "新旧pg_controldata最大TOAST块大小无效或不匹配\n"
+
+#: controldata.c:679
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n"
+msgstr "旧的和新的pg_controldata大对象块大小无效或不匹配\n"
+
+#: controldata.c:682
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match\n"
+msgstr "新的和旧的pg_controldata日期/时间存储类型不匹配\n"
+
+#: controldata.c:695
+#, c-format
+msgid "old cluster does not use data checksums but the new one does\n"
+msgstr "旧群集不使用数据校验和,但新群集使用数据校验和\n"
+
+#: controldata.c:698
+#, c-format
+msgid "old cluster uses data checksums but the new one does not\n"
+msgstr "旧群集使用数据校验和,但新群集不使用\n"
+
+#: controldata.c:700
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match\n"
+msgstr "旧群集和新群集pg_controldata校验和版本不匹配\n"
+
+#: controldata.c:711
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "向旧的global/pg_control添加\".old\"后缀"
+
+#: controldata.c:716
+#, c-format
+msgid "Unable to rename %s to %s.\n"
+msgstr "无法将%s重命名为%s。\n"
+
+#: controldata.c:719
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started.\n"
+"\n"
+msgstr ""
+"\n"
+"如果要启动旧群集,则需要从%s/global/pg_control.old中\n"
+"删除\".old\"后缀。\n"
+"由于使用了\"link\"模式,一旦新群集启动,\n"
+"旧群集就无法安全启动。\n"
+"\n"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "正在创建全局对象的转储"
+
+#: dump.c:31
+#, c-format
+msgid "Creating dump of database schemas\n"
+msgstr "正在创建数据库schemas的转储\n"
+
+#: exec.c:45
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s\n"
+msgstr "无法使用using %s获取pg_ctl的版本数据: %s\n"
+
+#: exec.c:51
+#, c-format
+msgid "could not get pg_ctl version output from %s\n"
+msgstr "无法从%s获取pg_ctl版本输出\n"
+
+#: exec.c:105 exec.c:109
+#, c-format
+msgid "command too long\n"
+msgstr "命令太长了\n"
+
+#: exec.c:111 util.c:37 util.c:225
+#, c-format
+msgid "%s\n"
+msgstr "%s\n"
+
+#: exec.c:150 option.c:217
+msgid "could not open log file \"%s\": %m\n"
+msgstr "无法打开日志文件\"%s\": %m\n"
+
+#: exec.c:179
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失败*"
+
+#: exec.c:182
+#, c-format
+msgid "There were problems executing \"%s\"\n"
+msgstr "执行\"%s\"时出现问题\n"
+
+#: exec.c:185
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的可能原因,请查阅\"%s\"或 \"%s\"的最后几行。\n"
+
+#: exec.c:190
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure.\n"
+msgstr "有关故障的可能原因,请查阅\"%s\"的最后几行。\n"
+
+#: exec.c:205 option.c:226
+msgid "could not write to log file \"%s\": %m\n"
+msgstr "不能写到日志文件\"%s\": %m\n"
+
+#: exec.c:231
+#, c-format
+msgid "could not open file \"%s\" for reading: %s\n"
+msgstr "无法打开文件\"%s\"用于读取: %s\n"
+
+#: exec.c:258
+#, c-format
+msgid "You must have read and write access in the current directory.\n"
+msgstr "您必须具有当前目录中的读写权限。\n"
+
+#: exec.c:311 exec.c:377
+#, c-format
+msgid "check for \"%s\" failed: %s\n"
+msgstr "检查\"%s\"失败: %s\n"
+
+#: exec.c:314 exec.c:380
+#, c-format
+msgid "\"%s\" is not a directory\n"
+msgstr "\"%s\"不是一个目录\n"
+
+#: exec.c:430
+#, c-format
+msgid "check for \"%s\" failed: not a regular file\n"
+msgstr "检查\"%s\"失败:不是常规文件\n"
+
+#: exec.c:433
+#, c-format
+msgid "check for \"%s\" failed: cannot execute (permission denied)\n"
+msgstr "检查\"%s\"失败:无法执行(权限被拒绝)\n"
+
+#: exec.c:439
+msgid "check for \"%s\" failed: cannot execute\n"
+msgstr "检查\"%s\"失败:无法执行\n"
+
+#: exec.c:449
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n"
+msgstr "检查\"%s\"失败:版本不正确:找到\"%s\",应为\"%s\"\n"
+
+#: file.c:43 file.c:61
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "克隆关系\"%s.%s\"时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "克隆关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:87 file.c:190
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法打开文件\"%s\": %s\n"
+
+#: file.c:92 file.c:199
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法创建文件\"%s\": %s\n"
+
+#: file.c:106 file.c:223
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法读取文件\"%s\": %s\n"
+
+#: file.c:118 file.c:301
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法写入文件 \"%s\": %s\n"
+
+#: file.c:132
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "将关系\"%s.%s\"(\"%s\"复制到\"%s\")时出错: %s\n"
+
+#: file.c:151
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "为关系\"%s.%s\"创建链接时出错(从\"%s\"到\"%s\"): %s\n"
+
+#: file.c:194
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n"
+msgstr "复制关系\"%s.%s\"时出错:无法统计文件\"%s\": %s\n"
+
+#: file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n"
+msgstr "复制关系\"%s.%s\"时出错:在文件\"%s\"中找到部分页\n"
+
+#: file.c:328 file.c:345
+#, c-format
+msgid "could not clone file between old and new data directories: %s\n"
+msgstr "无法在新旧数据目录之间克隆文件: %s\n"
+
+#: file.c:341
+#, c-format
+msgid "could not create file \"%s\": %s\n"
+msgstr "无法创建文件 \"%s\": %s\n"
+
+#: file.c:352
+#, c-format
+msgid "file cloning not supported on this platform\n"
+msgstr "此平台不支持文件克隆\n"
+
+#: file.c:369
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system.\n"
+msgstr ""
+"无法在新旧数据目录之间创建硬链接: %s\n"
+"在链接模式下,旧的和新的数据目录必须在同一文件系统上。\n"
+
+#: function.c:114
+#, c-format
+msgid ""
+"\n"
+"The 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"
+msgstr ""
+"\n"
+"旧集群在\"public\"模式中定义了一个\"plpython_call_handler\"函数,\n"
+"这是\"pg_catalog\"模式中定义的函数的副本。\n"
+" 您可以通过执行\n"
+"在 psql中:\n"
+"\n"
+" \\df *.plpython_call_handler\n"
+"\n"
+"这个函数的\"public\"模式版本是由plpython的8.1之前的安装创建的, \n"
+"必须删除才能完成pg_upgrade\n"
+"因为它引用了一个现在已经过时的\"plpython\"共享对象文件。\n"
+"通过运行以下命令,可以删除此函数的\"public\"模式版本:\n"
+"\n"
+" DROP FUNCTION public.plpython_call_handler()\n"
+"\n"
+"在每个受影响的数据库中:\n"
+"\n"
+
+#: function.c:132
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: function.c:142
+#, c-format
+msgid "Remove the problem functions from the old cluster to continue.\n"
+msgstr "从旧群集中删除问题函数以继续。\n"
+
+#: function.c:189
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "正在检查是否存在所需的库"
+
+#: function.c:242
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "无法加载库 \"%s\": %s"
+
+#: function.c:253
+msgid "In database: %s\n"
+msgstr "在数据库: %s\n"
+
+#: function.c:263
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装引用了新安装中缺少的可加载库。\n"
+"您可以将这些库添加到新安装中,或者从旧安装中删除使用它们的函数。\n"
+"文件中有问题库列表:\n"
+" %s\n"
+"\n"
+
+#: info.c:131
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n"
+msgstr "数据库\"%2$s\"中OID %1$u的关系名称不匹配:旧名称 \"%3$s.%4$s\",新名称\"%5$s.%6$s\"\n"
+
+#: info.c:151
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\"\n"
+msgstr "未能匹配数据库\"%s\"中的新旧表\n"
+
+#: info.c:240
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 这是\"%s.%s\"上的索引"
+
+#: info.c:250
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 哪一个OID %u上的索引"
+
+#: info.c:262
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " 哪一个是\"%s.%s\"的TOAST表"
+
+#: info.c:270
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 哪一个是OID %u的TOAST表"
+
+#: info.c:274
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n"
+msgstr "在旧群集中找不到与数据库\"%2$s\"中OID %1$u的新关系的匹配项: %3$s\n"
+
+#: info.c:277
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n"
+msgstr "在新群集中找不到与数据库\"%2$s\"中OID %1$u的旧关系的匹配项:%3$s\n"
+
+#: info.c:289
+#, c-format
+msgid "mappings for database \"%s\":\n"
+msgstr "映射为数据库\"%s\":\n"
+
+#: info.c:292
+#, c-format
+msgid "%s.%s: %u to %u\n"
+msgstr "%s.%s: %u到%u\n"
+
+#: info.c:297 info.c:633
+#, c-format
+msgid ""
+"\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+
+#: info.c:322
+#, c-format
+msgid ""
+"\n"
+"source databases:\n"
+msgstr ""
+"\n"
+"源数据库:\n"
+
+#: info.c:324
+#, c-format
+msgid ""
+"\n"
+"target databases:\n"
+msgstr ""
+"\n"
+"目标数据库:\n"
+
+#: info.c:631
+#, c-format
+msgid "Database: %s\n"
+msgstr "数据库: %s\n"
+
+#: info.c:644
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s\n"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n"
+
+#: option.c:102
+#, c-format
+msgid "%s: cannot be run as root\n"
+msgstr "%s: 不能使用root用户运行\n"
+
+#: option.c:170
+#, c-format
+msgid "invalid old port number\n"
+msgstr "旧端口号无效\n"
+
+#: option.c:175
+#, c-format
+msgid "invalid new port number\n"
+msgstr "新端口号无效\n"
+
+#: option.c:207
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "请用 \"%s --help\" 获取更多的信息.\n"
+
+#: option.c:214
+msgid "too many command-line arguments (first is \"%s\")\n"
+msgstr "命令行参数太多 (第一个是 \"%s\")\n"
+
+#: option.c:220
+#, c-format
+msgid "Running in verbose mode\n"
+msgstr "以详细模式运行\n"
+
+#: option.c:251
+msgid "old cluster binaries reside"
+msgstr "旧群集二进制文件驻留"
+
+#: option.c:253
+msgid "new cluster binaries reside"
+msgstr "新群集二进制文件驻留"
+
+#: option.c:255
+msgid "old cluster data resides"
+msgstr "旧群集数据驻留"
+
+#: option.c:257
+msgid "new cluster data resides"
+msgstr "新群集数据驻留"
+
+#: option.c:259
+msgid "sockets will be created"
+msgstr "将创建套接字"
+
+#: option.c:276 option.c:374
+#, c-format
+msgid "could not determine current directory\n"
+msgstr "无法确定当前目录\n"
+
+#: option.c:279
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n"
+msgstr "无法从Windows上的新群集数据目录内运行pg_upgrade\n"
+
+#: option.c:288
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade将PostgreSQL集群升级到其他主版本。\n"
+"\n"
+
+#: option.c:289
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: option.c:290
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [选项]...\n"
+"\n"
+
+#: option.c:291
+#, c-format
+msgid "Options:\n"
+msgstr "选项:\n"
+
+#: option.c:292
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 旧群集可执行目录\n"
+
+#: option.c:293
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr ""
+" -B, --new-bindir=BINDIR 新群集可执行目录\n"
+" (默认目录与pg_upgrade相同)\n"
+
+#: option.c:295
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 仅检查群集,不更改任何数据\n"
+
+#: option.c:296
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 旧群集数据目录\n"
+
+#: option.c:297
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新群集数据目录\n"
+
+#: option.c:298
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM 要同时使用的进程或线程数\n"
+
+#: option.c:299
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link 使用硬链接来代替将文件拷贝到新群集\n"
+
+#: option.c:300
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS 要传递到服务器的旧群集选项\n"
+
+#: option.c:301
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS 要传递到服务器的新群集选项\n"
+
+#: option.c:302
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 旧群集端口号(默认值为%d)\n"
+
+#: option.c:303
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新群集端口号(默认值为%d)\n"
+
+#: option.c:304
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain 成功后保留SQL和日志文件\n"
+
+#: option.c:305
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR 要使用的套接字目录(默认值为当前路径)\n"
+
+#: option.c:306
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME 集群超级用户(默认值为\"%s\")\n"
+
+#: option.c:307
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 启用详细的内部日志\n"
+
+#: option.c:308
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version 显示版本信息,然后退出\n"
+
+#: option.c:309
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone 克隆而不是将文件复制到新群集\n"
+
+#: option.c:310
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 显示此帮助,然后退出\n"
+
+#: option.c:311
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"在运行pg_upgrade之前,您必须 :\n"
+" 创建一个新的数据库群集 (使用新版本的initdb)\n"
+" 关闭旧群集的postmaster服务\n"
+" 关闭新群集的postmaster服务\n"
+
+#: option.c:316
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"运行pg_upgrade时,必须提供以下信息:\n"
+" 旧群集的数据目录 (-d DATADIR)\n"
+" 新群集的数据目录 (-D DATADIR)\n"
+" 旧版本的\"bin\"目录 (-b BINDIR)\n"
+" 新版本的\"bin\"目录 (-B BINDIR)\n"
+
+#: option.c:322
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"例如:\n"
+" pg_upgrade -d 旧集群/data -D 新集群/data -b 旧集群/bin -B 新集群/bin\n"
+"或者\n"
+
+#: option.c:327
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=旧集群/data\n"
+" $ export PGDATANEW=新集群/data\n"
+" $ export PGBINOLD=旧集群/bin\n"
+" $ export PGBINNEW=新集群/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:333
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=旧集群/data\n"
+" C:\\> set PGDATANEW=新集群/data\n"
+" C:\\> set PGBINOLD=旧集群/bin\n"
+" C:\\> set PGBINNEW=新集群/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:339
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"臭虫报告至<%s>.\n"
+
+#: option.c:340
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 主页: <%s>\n"
+
+#: option.c:380
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable.\n"
+msgstr ""
+"必须标识%s所在的目录。\n"
+"请使用%s命令行选项或%s环境变量。\n"
+
+#: option.c:432
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "正在查找源群集的实际数据目录"
+
+#: option.c:434
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "正在查找目标群集的实际数据目录"
+
+#: option.c:446
+#, c-format
+msgid "could not get data directory using %s: %s\n"
+msgstr "无法使用%s获取数据目录: %s\n"
+
+#: option.c:505
+#, c-format
+msgid "could not read line %d from file \"%s\": %s\n"
+msgstr "无法从文件\"%2$s\"读取第%1$d行: %3$s\n"
+
+#: option.c:522
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu\n"
+msgstr "用户提供的旧端口号%hu已更正为%hu\n"
+
+#: parallel.c:127 parallel.c:238
+#, c-format
+msgid "could not create worker process: %s\n"
+msgstr "无法创建工作进程: %s\n"
+
+#: parallel.c:146 parallel.c:259
+#, c-format
+msgid "could not create worker thread: %s\n"
+msgstr "无法创建工作线程: %s\n"
+
+#: parallel.c:300
+msgid "%s() failed: %s\n"
+msgstr "%s()失败: %s\n"
+
+#: parallel.c:304
+#, c-format
+msgid "child process exited abnormally: status %d\n"
+msgstr "子进程异常退出:状态 %d\n"
+
+#: parallel.c:319
+#, c-format
+msgid "child worker exited abnormally: %s\n"
+msgstr "子工作线程异常退出: %s\n"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s\n"
+msgstr "无法读取目录\"%s\"的权限: %s\n"
+
+#: pg_upgrade.c:122
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------\n"
+msgstr ""
+"\n"
+"正在执行升级\n"
+"------------------\n"
+
+#: pg_upgrade.c:165
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "为新群集设置下一个OID"
+
+#: pg_upgrade.c:172
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "将数据目录同步到磁盘"
+
+#: pg_upgrade.c:183
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------\n"
+msgstr ""
+"\n"
+"升级完成\n"
+"----------------\n"
+
+#: pg_upgrade.c:216
+#, c-format
+msgid "%s: could not find own program executable\n"
+msgstr "%s: 无法找到执行文件\n"
+
+#: pg_upgrade.c:242
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好像有一个postmaster正在为旧群集服务。\n"
+"请关闭那个postmaster,然后再试一次。\n"
+
+#: pg_upgrade.c:255
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again.\n"
+msgstr ""
+"好像有一个postmaster正在为新群集服务。\n"
+"请关闭那个postmaster,然后再试一次。\n"
+
+#: pg_upgrade.c:269
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "正在分析新群集中的所有行"
+
+#: pg_upgrade.c:282
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "正在冻结新群集中的所有行"
+
+#: pg_upgrade.c:302
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "正在在新群集中还原全局对象"
+
+#: pg_upgrade.c:317
+#, c-format
+msgid "Restoring database schemas in the new cluster\n"
+msgstr "在新群集中还原数据库schemas\n"
+
+#: pg_upgrade.c:421
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "正在从新%s中删除文件"
+
+#: pg_upgrade.c:425
+#, c-format
+msgid "could not delete directory \"%s\"\n"
+msgstr "无法删除目录\"%s\"\n"
+
+#: pg_upgrade.c:444
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "正在将旧的 %s复制到新服务中"
+
+#: pg_upgrade.c:470
+msgid "Setting oldest XID for new cluster"
+msgstr "为新群集设置最旧的XID"
+
+#: pg_upgrade.c:478
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "正在为新集群设置下一个事务ID和epoch"
+
+#: pg_upgrade.c:508
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "正在为新集群设置下一个多事务ID和偏移量"
+
+#: pg_upgrade.c:532
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "在新集群中设置最旧的多事务ID"
+
+#: pg_upgrade.c:552
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "正在重置WAL归档"
+
+#: pg_upgrade.c:595
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "正在在新集群中设置frozenxid和minmxid计数器"
+
+#: pg_upgrade.c:597
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "正在在新群集中设置minmxid计数器"
+
+#: relfilenode.c:35
+#, c-format
+msgid "Cloning user relation files\n"
+msgstr "正在克隆用户关系文件\n"
+
+#: relfilenode.c:38
+#, c-format
+msgid "Copying user relation files\n"
+msgstr "正在复制用户关系文件\n"
+
+#: relfilenode.c:41
+#, c-format
+msgid "Linking user relation files\n"
+msgstr "正在链接用户关系文件\n"
+
+#: relfilenode.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster\n"
+msgstr "在新群集中找不到旧数据库\"%s\"\n"
+
+#: relfilenode.c:230
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n"
+msgstr "检查文件是否存在\"%s.%s\"时出错 (\"%s\" 到 \"%s\"): %s\n"
+
+#: relfilenode.c:248
+#, c-format
+msgid "rewriting \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"重写为\"%s\"\n"
+
+#: relfilenode.c:256
+#, c-format
+msgid "cloning \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"克隆到\"%s\"\n"
+
+#: relfilenode.c:261
+#, c-format
+msgid "copying \"%s\" to \"%s\"\n"
+msgstr "正在将 \"%s\"复制到\"%s\"\n"
+
+#: relfilenode.c:266
+#, c-format
+msgid "linking \"%s\" to \"%s\"\n"
+msgstr "正在将\"%s\"链接到\"%s\"\n"
+
+#: server.c:38 server.c:142 util.c:135 util.c:165
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "故障,退出\n"
+
+#: server.c:132
+#, c-format
+msgid "executing: %s\n"
+msgstr "正在执行: %s\n"
+
+#: server.c:138
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL命令失败 \n"
+"%s\n"
+"%s"
+
+#: server.c:168
+msgid "could not open version file \"%s\": %m\n"
+msgstr "无法打开版本文件\"%s\": %m\n"
+
+#: server.c:172
+msgid "could not parse version file \"%s\"\n"
+msgstr "无法解析版本文件\"%s\"\n"
+
+#: server.c:298
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:302
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令启动的源postmaster :\n"
+"%s\n"
+
+#: server.c:306
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s\n"
+msgstr ""
+"无法连接到用命令启动的目标postmaster :\n"
+"%s\n"
+
+#: server.c:320
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed\n"
+msgstr "pg_ctl无法启动源服务器,或者连接失败\n"
+
+#: server.c:322
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed\n"
+msgstr "pg_ctl无法启动目标服务器,或连接失败\n"
+
+#: server.c:367
+#, c-format
+msgid "out of memory\n"
+msgstr "内存不足\n"
+
+#: server.c:380
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s\n"
+msgstr "libpq环境变量%s具有非本地服务器值: %s\n"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces.\n"
+msgstr ""
+"使用表空间时无法升级到相同的系统目录版本。\n"
+"或者,使用表空间时无法从同一系统目录版本升级。\n"
+
+#: tablespace.c:86
+#, c-format
+msgid "tablespace directory \"%s\" does not exist\n"
+msgstr "表空间目录\"%s\"不存在\n"
+
+#: tablespace.c:90
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s\n"
+msgstr "无法统计表空间目录\"%s\": %s\n"
+
+#: tablespace.c:95
+#, c-format
+msgid "tablespace path \"%s\" is not a directory\n"
+msgstr "表空间路径\"%s\"不是目录\n"
+
+#: util.c:49
+#, c-format
+msgid " "
+msgstr " "
+
+#: util.c:82
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+#: util.c:174
+#, c-format
+msgid "ok"
+msgstr "成功"
+
+#: version.c:29
+#, c-format
+msgid "Checking for large objects"
+msgstr "正在检查大对象"
+
+#: version.c:77 version.c:419
+#, c-format
+msgid "warning"
+msgstr "警告"
+
+#: version.c:79
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table. After upgrading, you will be\n"
+"given a command to populate the pg_largeobject_metadata table with\n"
+"default permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含大对象。新数据库有一个附加的大对象权限表。\n"
+"升级后,将向您提供一个命令,以使用默认权限填充\n"
+"pg_largeobject_metadata表。\n"
+"\n"
+
+#: version.c:85
+#, c-format
+msgid ""
+"\n"
+"Your installation contains large objects. The new database has an\n"
+"additional large object permission table, so default permissions must be\n"
+"defined for all large objects. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will set the default\n"
+"permissions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含大对象。 新数据库有一个附加的大对象权限表,\n"
+"因此必须为所有大对象定义默认权限。文件\n"
+" %s\n"
+"当数据库由psql执行时,超级用户将设置默认权限。\n"
+"\n"
+
+#: version.c:272
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "正在检查不兼容的\"line\"数据类型"
+
+#: version.c:279
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"line\"数据类型。\n"
+"此数据类型更改了旧群集和新群集之间的\n"
+"内部格式和输入/输出格式,\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表:\n"
+" %s\n"
+"\n"
+
+#: version.c:310
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "正在检查无效的\"unknown\"用户列"
+
+#: version.c:317
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"unknown\"数据类型。\n"
+"表中不再允许此数据类型,\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:341
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "正在检查哈希索引"
+
+#: version.c:421
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含哈希索引。\n"
+"这些索引在旧集群和新集群之间具有不同的内部格式,因此必须\n"
+"使用REINDEX命令重新索引它们。\n"
+"升级后,您将得到REINDEX指令。\n"
+"\n"
+
+#: version.c:427
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含哈希索引. These indexes have different\n"
+"这些索引在旧集群和新集群之间具有不同的内部格式,\n"
+"因此必须使用REINDEX命令重新索引它们。 文件\n"
+" %s\n"
+"当数据库超级用户通过psql执行时,将重新创建所有无效的索引;\n"
+"在此之前,不会使用这些索引。\n"
+"\n"
+
+#: version.c:453
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "正在检查无效的\"sql_identifier\"用户列"
+
+#: version.c:461
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s\n"
+"\n"
+msgstr ""
+"您的安装包含用户表中的\"sql_identifier\"数据类型。\n"
+"此数据类型的磁盘格式已更改。\n"
+"因此当前无法升级此群集。\n"
+"您可以删除问题表并重新启动升级。\n"
+"文件中有问题列的列表 :\n"
+" %s\n"
+"\n"
+
+#: version.c:485
+msgid "Checking for extension updates"
+msgstr "正在检查扩展更新"
+
+#: version.c:537
+#, c-format
+msgid "notice"
+msgstr "通知"
+
+#: version.c:538
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions.\n"
+"\n"
+msgstr ""
+"\n"
+"您的安装包含应使用\n"
+"ALTER EXTENSION命令更新的扩展。 文件\n"
+" %s\n"
+"当数据库超级用户通过psql执行时,\n"
+"将更新这些扩展。\n"
+"\n"
+
diff --git a/src/bin/pg_upgrade/po/zh_TW.po b/src/bin/pg_upgrade/po/zh_TW.po
new file mode 100644
index 0000000..872dec7
--- /dev/null
+++ b/src/bin/pg_upgrade/po/zh_TW.po
@@ -0,0 +1,1805 @@
+# Traditional Chinese message translation file for pg_upgrade
+# Copyright (C) 2023 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_upgrade (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-09-08 21:49+0000\n"
+"PO-Revision-Date: 2023-11-06 08:50+0800\n"
+"Last-Translator: Zhenbang Wei <znbang@gmail.com>\n"
+"Language-Team: \n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.1\n"
+
+#: check.c:69
+#, c-format
+msgid ""
+"Performing Consistency Checks on Old Live Server\n"
+"------------------------------------------------"
+msgstr ""
+"在舊的伺服器上執行一致性檢查\n"
+"------------------------------------------------"
+
+#: check.c:75
+#, c-format
+msgid ""
+"Performing Consistency Checks\n"
+"-----------------------------"
+msgstr ""
+"執行一致性檢查\n"
+"-----------------------------"
+
+#: check.c:221
+#, c-format
+msgid ""
+"\n"
+"*Clusters are compatible*"
+msgstr ""
+"\n"
+"*叢集相容*"
+
+#: check.c:229
+#, c-format
+msgid ""
+"\n"
+"If pg_upgrade fails after this point, you must re-initdb the\n"
+"new cluster before continuing."
+msgstr ""
+"\n"
+"如果 pg_upgrade 在這個階段後失敗,您必須執行 initdb 再次\n"
+"建立新叢集才能繼續。"
+
+#: check.c:270
+#, c-format
+msgid ""
+"Optimizer statistics are not transferred by pg_upgrade.\n"
+"Once you start the new server, consider running:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+msgstr ""
+"pg_upgrade 不會轉移優化器統計資料。\n"
+"啟動新伺服器之後請考慮執行:\n"
+" %s/vacuumdb %s--all --analyze-in-stages"
+
+#: check.c:276
+#, c-format
+msgid ""
+"Running this script will delete the old cluster's data files:\n"
+" %s"
+msgstr ""
+"執行此腳本將刪除舊叢集的資料檔:\n"
+" %s"
+
+#: check.c:281
+#, c-format
+msgid ""
+"Could not create a script to delete the old cluster's data files\n"
+"because user-defined tablespaces or the new cluster's data directory\n"
+"exist in the old cluster directory. The old cluster's contents must\n"
+"be deleted manually."
+msgstr ""
+"無法建立用來刪除舊叢集資料檔的腳本。\n"
+"因為在舊叢集目錄中存在使用者定義的表空間或新叢集的資料目錄。\n"
+"必須手動刪除舊叢集的內容。"
+
+#: check.c:293
+#, c-format
+msgid "Checking cluster versions"
+msgstr "檢查叢集版本"
+
+#: check.c:305
+#, c-format
+msgid "This utility can only upgrade from PostgreSQL version %s and later."
+msgstr "本工具只能從 PostgreSQL 版本 %s 及更新的版本升級。"
+
+#: check.c:310
+#, c-format
+msgid "This utility can only upgrade to PostgreSQL version %s."
+msgstr "本工具只能升級至 PostgreSQL 版本 %s。"
+
+#: check.c:319
+#, c-format
+msgid "This utility cannot be used to downgrade to older major PostgreSQL versions."
+msgstr "本工具無法用於降級至較舊的主要 PostgreSQL 版本。"
+
+#: check.c:324
+#, c-format
+msgid "Old cluster data and binary directories are from different major versions."
+msgstr "舊叢集的資料和執行檔目錄來自不同的主要版本。"
+
+#: check.c:327
+#, c-format
+msgid "New cluster data and binary directories are from different major versions."
+msgstr "新叢集的資料和執行檔目錄來自不同的主要版本。"
+
+#: check.c:342
+#, c-format
+msgid "When checking a live server, the old and new port numbers must be different."
+msgstr "檢查伺服器時,新舊連接埠必須不同。"
+
+#: check.c:362
+#, c-format
+msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\""
+msgstr "新叢集資料庫 \"%s\" 不是空的: 找到 relation \"%s.%s\""
+
+#: check.c:385
+#, c-format
+msgid "Checking for new cluster tablespace directories"
+msgstr "檢查新叢集的表空間目錄"
+
+#: check.c:396
+#, c-format
+msgid "new cluster tablespace directory already exists: \"%s\""
+msgstr "新叢集的表空間目錄已存在: \"%s\""
+
+#: check.c:429
+#, c-format
+msgid ""
+"\n"
+"WARNING: new data directory should not be inside the old data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: 新的資料目錄不應該位於舊的資料目錄內,即 %s"
+
+#: check.c:453
+#, c-format
+msgid ""
+"\n"
+"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s"
+msgstr ""
+"\n"
+"警告: 使用者定義的表空間位置不應該位於資料目錄內,即 %s"
+
+#: check.c:463
+#, c-format
+msgid "Creating script to delete old cluster"
+msgstr "建立刪除舊叢集的腳本"
+
+# fe-lobj.c:410
+# fe-lobj.c:495
+#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056
+#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476
+#: version.c:116 version.c:292 version.c:426
+#, c-format
+msgid "could not open file \"%s\": %s"
+msgstr "無法開啟檔案 \"%s\":%s"
+
+#: check.c:517
+#, c-format
+msgid "could not add execute permission to file \"%s\": %s"
+msgstr "無法將執行權限加到檔案 \"%s\": %s"
+
+#: check.c:537
+#, c-format
+msgid "Checking database user is the install user"
+msgstr "檢查資料庫使用者是否為安裝使用者"
+
+#: check.c:553
+#, c-format
+msgid "database user \"%s\" is not the install user"
+msgstr "資料庫使用者 \"%s\" 不是安裝使用者"
+
+#: check.c:564
+#, c-format
+msgid "could not determine the number of users"
+msgstr "無法確定使用者數量"
+
+#: check.c:572
+#, c-format
+msgid "Only the install user can be defined in the new cluster."
+msgstr "只有安裝使用者能在新叢集中被定義。"
+
+#: check.c:601
+#, c-format
+msgid "Checking database connection settings"
+msgstr "檢查資料庫連線設定"
+
+#: check.c:627
+#, c-format
+msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false"
+msgstr "template0 不允許連線,即其 pg_database.datallowconn 必須為 false"
+
+#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135
+#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394
+#: function.c:185 version.c:192 version.c:232 version.c:378
+#, c-format
+msgid "fatal"
+msgstr "fatal"
+
+#: check.c:655
+#, c-format
+msgid ""
+"All non-template0 databases must allow connections, i.e. their\n"
+"pg_database.datallowconn must be true. Your installation contains\n"
+"non-template0 databases with their pg_database.datallowconn set to\n"
+"false. Consider allowing connection for all non-template0 databases\n"
+"or drop the databases which do not allow connections. A list of\n"
+"databases with the problem is in the file:\n"
+" %s"
+msgstr ""
+"所有非 template0 的資料庫必須允許連線,即它們的\n"
+"pg_database.datallowconn 必須為 true。您的安裝中包含了設定為 false 的\n"
+"非 template0 資料庫。請考慮允許所有非 template0 資料庫的連線,或刪除\n"
+"不允許連線的資料庫。異常資料庫的清單在下列檔案中:\n"
+" %s"
+
+#: check.c:680
+#, c-format
+msgid "Checking for prepared transactions"
+msgstr "檢查已預備的交易"
+
+#: check.c:689
+#, c-format
+msgid "The source cluster contains prepared transactions"
+msgstr "來源叢集包含已預備的交易"
+
+#: check.c:691
+#, c-format
+msgid "The target cluster contains prepared transactions"
+msgstr "目標叢集包含已預備的交易"
+
+#: check.c:716
+#, c-format
+msgid "Checking for contrib/isn with bigint-passing mismatch"
+msgstr "檢查 contrib/isn 傳遞 bigint 方式不一致"
+
+#: check.c:776
+#, c-format
+msgid ""
+"Your installation contains \"contrib/isn\" functions which rely on the\n"
+"bigint data type. Your old and new clusters pass bigint values\n"
+"differently so this cluster cannot currently be upgraded. You can\n"
+"manually dump databases in the old cluster that use \"contrib/isn\"\n"
+"facilities, drop them, perform the upgrade, and then restore them. A\n"
+"list of the problem functions is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含依賴於 bigint 資料型別的 \"contrib/isn\" 函數。由於您的\n"
+"新、舊叢集以不同方式傳遞 bigint 值,因此目前無法升級此叢集。您\n"
+"可以手動備份並刪除舊叢集中使用 \"contrib/isn\" 功能的資料庫,進行\n"
+"升級,然後還原它們。問題函數的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:798
+#, c-format
+msgid "Checking for user-defined postfix operators"
+msgstr "檢查使用者定義的後綴運算符"
+
+#: check.c:874
+#, c-format
+msgid ""
+"Your installation contains user-defined postfix operators, which are not\n"
+"supported anymore. Consider dropping the postfix operators and replacing\n"
+"them with prefix operators or function calls.\n"
+"A list of user-defined postfix operators is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含不再支援的使用者定義後綴運算符,請考慮刪除後綴運算符\n"
+"並替換為前綴運算符或函數呼叫。\n"
+"使用者定義後綴運算符的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:898
+#, c-format
+msgid "Checking for incompatible polymorphic functions"
+msgstr "檢查不相容的多型函數"
+
+#: check.c:1000
+#, c-format
+msgid ""
+"Your installation contains user-defined objects that refer to internal\n"
+"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n"
+"These user-defined objects must be dropped before upgrading and restored\n"
+"afterwards, changing them to refer to the new corresponding functions with\n"
+"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n"
+"A list of the problematic objects is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含參考內部多型函數的使用者定義物件,其引數類型為\n"
+"\"anyarray\" 或 \"anyelement\"。這些使用者定義物件必須在升級之前\n"
+"刪除,升級之後再還原,並將它們改為參考新的對應函數,其引數類\n"
+"型為 \"anycompatiblearray\" 和 \"anycompatible\"。\n"
+"問題物件的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:1024
+#, c-format
+msgid "Checking for tables WITH OIDS"
+msgstr "檢查資料表 WITH OIDS"
+
+#: check.c:1077
+#, c-format
+msgid ""
+"Your installation contains tables declared WITH OIDS, which is not\n"
+"supported anymore. Consider removing the oid column using\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"A list of tables with the problem is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含宣告 WITH OIDS 的資料表,但這已不再受支援。請考慮\n"
+"使用以下方法移除 oid 欄位\n"
+" ALTER TABLE ... SET WITHOUT OIDS;\n"
+"問題資料表的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:1105
+#, c-format
+msgid "Checking for system-defined composite types in user tables"
+msgstr "檢查使用者資料表中的系統定義複合型別"
+
+#: check.c:1136
+#, c-format
+msgid ""
+"Your installation contains system-defined composite types in user tables.\n"
+"These type OIDs are not stable across PostgreSQL versions,\n"
+"so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝中包含使用者資料表中的系統定義複合型別。這些型別的 OID 在\n"
+"不同的 PostgreSQL 版本中不穩定,因此目前無法升級此叢集。您可以刪除\n"
+"有問題的欄位,然後重新開始升級。\n"
+"問題欄位的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:1164
+#, c-format
+msgid "Checking for reg* data types in user tables"
+msgstr "檢查使用者資料表中有無 reg* 資料型別"
+
+#: check.c:1197
+#, c-format
+msgid ""
+"Your installation contains one of the reg* data types in user tables.\n"
+"These data types reference system OIDs that are not preserved by\n"
+"pg_upgrade, so this cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝中在使用者資料表中包含了 reg* 資料型別,這些資料型別\n"
+"參照了系統 OID,而這些 OID 並不會被 pg_upgrade 保留,因此目\n"
+"前無法升級此叢集。您可以刪除有問題的欄位並重新進行升級。\n"
+"問題欄位的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:1218
+#, c-format
+msgid "Checking for incompatible \"aclitem\" data type in user tables"
+msgstr "檢查使用者資料表中有無不相容的 \"aclitem\" 資料型別"
+
+#: check.c:1225
+#, c-format
+msgid ""
+"Your installation contains the \"aclitem\" data type in user tables.\n"
+"The internal format of \"aclitem\" changed in PostgreSQL version 16\n"
+"so this cluster cannot currently be upgraded. You can drop the\n"
+"problem columns and restart the upgrade. A list of the problem\n"
+"columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝中在使用者資料表中包含了 \"aclitem\" 資料型別。由於\n"
+"PostgreSQL 版本 16 中 \"aclitem\" 的內部格式已更改,因此目前無法\n"
+"升級此叢集。您可以刪除問題欄位,然後重新進行升級。\n"
+"問題欄位的清單位於以下檔案中:\n"
+" %s"
+
+#: check.c:1246
+#, c-format
+msgid "Checking for incompatible \"jsonb\" data type"
+msgstr "檢查不相容的 \"jsonb\" 資料型別"
+
+#: check.c:1255
+#, c-format
+msgid ""
+"Your installation contains the \"jsonb\" data type in user tables.\n"
+"The internal format of \"jsonb\" changed during 9.4 beta so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝中在使用者表格中包含了 \"jsonb\" 資料型別。\n"
+"\"jsonb\" 的內部格式在 9.4 beta 期間有所更改,因此目前無法\n"
+"升級此叢集。您可以刪除有問題的欄位,然後重新進行升級。\n"
+"問題欄位的清單在以下檔案中:\n"
+" %s"
+
+#: check.c:1282
+#, c-format
+msgid "Checking for roles starting with \"pg_\""
+msgstr "檢查以 \"pg_\" 開頭的角色"
+
+#: check.c:1314
+#, c-format
+msgid ""
+"Your installation contains roles starting with \"pg_\".\n"
+"\"pg_\" is a reserved prefix for system roles. The cluster\n"
+"cannot be upgraded until these roles are renamed.\n"
+"A list of roles starting with \"pg_\" is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含以 \"pg_\" 開頭的角色,\"pg_\" 是系統角色的\n"
+"保留字首,在這些角色被重新命名之前,無法升級此叢集。\n"
+"以 \"pg_\" 開頭的角色列表位於以下檔案中:\n"
+" %s"
+
+#: check.c:1334
+#, c-format
+msgid "Checking for user-defined encoding conversions"
+msgstr "檢查使用者自訂的編碼轉換"
+
+#: check.c:1395
+#, c-format
+msgid ""
+"Your installation contains user-defined encoding conversions.\n"
+"The conversion function parameters changed in PostgreSQL version 14\n"
+"so this cluster cannot currently be upgraded. You can remove the\n"
+"encoding conversions in the old cluster and restart the upgrade.\n"
+"A list of user-defined encoding conversions is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含了使用者自定義的編碼轉換,由於轉換函數的參數在\n"
+"PostgreSQL 版本 14 中有所更改,因此目前無法升級此叢集。您可以\n"
+"移除舊叢集中的編碼轉換,然後重新進行升級。\n"
+"使用者自定義的編碼轉換列表位於以下檔案中:\n"
+" %s"
+
+#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508
+#, c-format
+msgid "could not get control data using %s: %s"
+msgstr "無法用 %s 取得控制資料: %s"
+
+#: controldata.c:140
+#, c-format
+msgid "%d: database cluster state problem"
+msgstr "%d: 資料庫叢集狀態問題"
+
+#: controldata.c:158
+#, c-format
+msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "來源叢集在復原模式下被關閉。若要進行升級,請依照文件使用 \"rsync\",或者將其作為主要模式關閉。"
+
+#: controldata.c:160
+#, c-format
+msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."
+msgstr "目標叢集在復原模式下被關閉。若要進行升級,請依照文件使用 \"rsync\",或者將其作為主要模式關閉。"
+
+#: controldata.c:165
+#, c-format
+msgid "The source cluster was not shut down cleanly."
+msgstr "來源叢集未乾淨地關閉。"
+
+#: controldata.c:167
+#, c-format
+msgid "The target cluster was not shut down cleanly."
+msgstr "目標叢集未乾淨地關閉。"
+
+#: controldata.c:181
+#, c-format
+msgid "The source cluster lacks cluster state information:"
+msgstr "來源叢集缺少叢集狀態資訊:"
+
+#: controldata.c:183
+#, c-format
+msgid "The target cluster lacks cluster state information:"
+msgstr "目標叢集缺少叢集狀態資訊:"
+
+# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770
+# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285
+#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554
+#: relfilenumber.c:231 server.c:34 util.c:337
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: controldata.c:221
+#, c-format
+msgid "%d: pg_resetwal problem"
+msgstr "%d: pg_resetwal 問題"
+
+#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263
+#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315
+#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359
+#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388
+#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432
+#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476
+#: controldata.c:487 controldata.c:498
+#, c-format
+msgid "%d: controldata retrieval problem"
+msgstr "%d: controldata 取得問題"
+
+#: controldata.c:579
+#, c-format
+msgid "The source cluster lacks some required control information:"
+msgstr "來源叢集缺少一些必要的控制資訊:"
+
+#: controldata.c:582
+#, c-format
+msgid "The target cluster lacks some required control information:"
+msgstr "目標叢集缺少一些必要的控制資訊:"
+
+#: controldata.c:585
+#, c-format
+msgid " checkpoint next XID"
+msgstr " 檢查點下一個 XID"
+
+#: controldata.c:588
+#, c-format
+msgid " latest checkpoint next OID"
+msgstr " 最新檢查點下一個 OID"
+
+#: controldata.c:591
+#, c-format
+msgid " latest checkpoint next MultiXactId"
+msgstr " 最新檢查點下一個 MultiXactID"
+
+#: controldata.c:595
+#, c-format
+msgid " latest checkpoint oldest MultiXactId"
+msgstr " 最新檢查點最早 MultiXactId"
+
+#: controldata.c:598
+#, c-format
+msgid " latest checkpoint oldestXID"
+msgstr " 最新檢查點最早 XID"
+
+#: controldata.c:601
+#, c-format
+msgid " latest checkpoint next MultiXactOffset"
+msgstr " 最新檢查點下一個 MultiXactOffset"
+
+#: controldata.c:604
+#, c-format
+msgid " first WAL segment after reset"
+msgstr " 重設後第一個 WAL 片段"
+
+#: controldata.c:607
+#, c-format
+msgid " float8 argument passing method"
+msgstr " float8 引數傳遞方式"
+
+#: controldata.c:610
+#, c-format
+msgid " maximum alignment"
+msgstr " 最大對齊值"
+
+#: controldata.c:613
+#, c-format
+msgid " block size"
+msgstr " 區塊大小"
+
+#: controldata.c:616
+#, c-format
+msgid " large relation segment size"
+msgstr " 大型 relation 片段大小"
+
+#: controldata.c:619
+#, c-format
+msgid " WAL block size"
+msgstr " WAL 區塊大小"
+
+#: controldata.c:622
+#, c-format
+msgid " WAL segment size"
+msgstr " WAL 片段大小"
+
+#: controldata.c:625
+#, c-format
+msgid " maximum identifier length"
+msgstr " 最大識別名稱長度"
+
+#: controldata.c:628
+#, c-format
+msgid " maximum number of indexed columns"
+msgstr " 最大索引欄位數"
+
+#: controldata.c:631
+#, c-format
+msgid " maximum TOAST chunk size"
+msgstr " TOAST 塊大小上限"
+
+#: controldata.c:635
+#, c-format
+msgid " large-object chunk size"
+msgstr " 大物件塊大小"
+
+#: controldata.c:638
+#, c-format
+msgid " dates/times are integers?"
+msgstr " 時間/日期是整數?"
+
+#: controldata.c:642
+#, c-format
+msgid " data checksum version"
+msgstr " 資料檢查碼版本"
+
+#: controldata.c:644
+#, c-format
+msgid "Cannot continue without required control information, terminating"
+msgstr "因必要的控制信息不足而無法繼續,終止中"
+
+#: controldata.c:659
+#, c-format
+msgid ""
+"old and new pg_controldata alignments are invalid or do not match.\n"
+"Likely one cluster is a 32-bit install, the other 64-bit"
+msgstr ""
+"新舊 pg_controldata 對齊方式無效或不一致。\n"
+"很可能其中一個叢集是 32 位元,而另一個是 64 位元"
+
+#: controldata.c:663
+#, c-format
+msgid "old and new pg_controldata block sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 區塊大小無效或不一致"
+
+#: controldata.c:666
+#, c-format
+msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 最大 relation 片段大小無效或不一致"
+
+#: controldata.c:669
+#, c-format
+msgid "old and new pg_controldata WAL block sizes are invalid or do not match"
+msgstr "新舊 pg_controldata WAL 區塊大小無效或不一致"
+
+#: controldata.c:672
+#, c-format
+msgid "old and new pg_controldata WAL segment sizes are invalid or do not match"
+msgstr "新舊 pg_controldata WAL 片段大小無效或不一致"
+
+#: controldata.c:675
+#, c-format
+msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match"
+msgstr "新舊 pg_controldata 最大識別名稱長度無效或不一致"
+
+#: controldata.c:678
+#, c-format
+msgid "old and new pg_controldata maximum indexed columns are invalid or do not match"
+msgstr "新舊 pg_controldata 最大索引欄位數無效或不一致"
+
+#: controldata.c:681
+#, c-format
+msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 最大 TOAST 塊大小無效或不一致"
+
+#: controldata.c:686
+#, c-format
+msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match"
+msgstr "新舊 pg_controldata 大物件塊大小無效或不一致"
+
+#: controldata.c:689
+#, c-format
+msgid "old and new pg_controldata date/time storage types do not match"
+msgstr "新舊 pg_controldata 日期/時間儲存類型不一致"
+
+#: controldata.c:702
+#, c-format
+msgid "old cluster does not use data checksums but the new one does"
+msgstr "舊的叢集不使用資料檢查碼,但新的叢集有用"
+
+#: controldata.c:705
+#, c-format
+msgid "old cluster uses data checksums but the new one does not"
+msgstr "舊的叢集使用資料檢查碼,但新的叢集不使用"
+
+#: controldata.c:707
+#, c-format
+msgid "old and new cluster pg_controldata checksum versions do not match"
+msgstr "新、舊叢集 pg_controldata 檢查碼版本不一致"
+
+#: controldata.c:718
+#, c-format
+msgid "Adding \".old\" suffix to old global/pg_control"
+msgstr "將 \".old\" 後綴加到 global/pg_control"
+
+# access/transam/xlog.c:3037 access/transam/xlog.c:3819
+# access/transam/xlog.c:3862 commands/user.c:282 commands/user.c:412
+# postmaster/pgarch.c:597
+#: controldata.c:723
+#, c-format
+msgid "could not rename file \"%s\" to \"%s\": %m"
+msgstr "無法將檔案\"%s\"重新命名為\"%s\": %m"
+
+#: controldata.c:727
+#, c-format
+msgid ""
+"\n"
+"If you want to start the old cluster, you will need to remove\n"
+"the \".old\" suffix from %s/global/pg_control.old.\n"
+"Because \"link\" mode was used, the old cluster cannot be safely\n"
+"started once the new cluster has been started."
+msgstr ""
+"\n"
+"如果您想啟動舊的叢集,您需要從 %s/global/pg_control.old 中\n"
+"刪除 \".old\" 後綴。因為使用了 \"link\" 模式,一旦新的叢集已經啟動,\n"
+"就不能安全地啟動舊的叢集。"
+
+#: dump.c:20
+#, c-format
+msgid "Creating dump of global objects"
+msgstr "建立全域物件的備份"
+
+#: dump.c:32
+#, c-format
+msgid "Creating dump of database schemas"
+msgstr "建立資料庫 schema 的備份"
+
+#: exec.c:47 exec.c:52
+#, c-format
+msgid "could not get pg_ctl version data using %s: %s"
+msgstr "無法用 %s 取得 pg_ctl 版本資料: %s"
+
+#: exec.c:56
+#, c-format
+msgid "could not get pg_ctl version output from %s"
+msgstr "無法從 %s 取得 pg_ctl 版本輸出"
+
+#: exec.c:113 exec.c:117
+#, c-format
+msgid "command too long"
+msgstr "命令太長"
+
+# utils/init/miscinit.c:533
+#: exec.c:161 pg_upgrade.c:286
+#, c-format
+msgid "could not open log file \"%s\": %m"
+msgstr "無法開啟日誌檔 \"%s\": %m"
+
+#: exec.c:193
+#, c-format
+msgid ""
+"\n"
+"*failure*"
+msgstr ""
+"\n"
+"*失敗*"
+
+#: exec.c:196
+#, c-format
+msgid "There were problems executing \"%s\""
+msgstr "執行 \"%s\" 時發生問題"
+
+#: exec.c:199
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" or \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"請查看 \"%s\" 或 \"%s\" 的最後幾行,尋找可能\n"
+"導致失敗的原因。"
+
+#: exec.c:204
+#, c-format
+msgid ""
+"Consult the last few lines of \"%s\" for\n"
+"the probable cause of the failure."
+msgstr ""
+"請查看 \"%s\" 最後幾行,尋找可能\n"
+"導致失敗的原因。"
+
+#: exec.c:219 pg_upgrade.c:296
+#, c-format
+msgid "could not write to log file \"%s\": %m"
+msgstr "無法寫入記錄檔 \"%s\": %m"
+
+#: exec.c:245
+#, c-format
+msgid "could not open file \"%s\" for reading: %s"
+msgstr "無法開啟檔案 \"%s\" 進行讀取: %s"
+
+#: exec.c:272
+#, c-format
+msgid "You must have read and write access in the current directory."
+msgstr "您必須有目前目錄的讀取和寫入權限。"
+
+#: exec.c:325 exec.c:391
+#, c-format
+msgid "check for \"%s\" failed: %s"
+msgstr "檢查 \"%s\" 失敗: %s"
+
+#: exec.c:328 exec.c:394
+#, c-format
+msgid "\"%s\" is not a directory"
+msgstr "\"%s\" 不是目錄"
+
+#: exec.c:441
+#, c-format
+msgid "check for \"%s\" failed: %m"
+msgstr "檢查 \"%s\" 失敗: %m"
+
+#: exec.c:446
+#, c-format
+msgid "check for \"%s\" failed: cannot execute"
+msgstr "檢查 \"%s\" 失敗: 無法執行"
+
+#: exec.c:456
+#, c-format
+msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\""
+msgstr "檢查 \"%s\" 失敗: 版本不正確: 找到 \"%s\",預期是 \"%s\""
+
+#: file.c:43 file.c:64
+#, c-format
+msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "clone relation \"%s.%s\"(\"%s\" 至 \"%s\")時發生錯誤: %s"
+
+#: file.c:50
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "clone relation \"%s.%s\" 時發生錯誤: 無法開啟檔案 \"%s\": %s"
+
+#: file.c:55
+#, c-format
+msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "clone relation \"%s.%s\" 時發生錯誤: 無法建立檔案 \"%s\": %s"
+
+#: file.c:90 file.c:193
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法開啟檔案 \"%s\": %s"
+
+#: file.c:95 file.c:202
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法建立檔案 \"%s\": %s"
+
+#: file.c:109 file.c:226
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法讀取檔案 \"%s\": %s"
+
+#: file.c:121 file.c:304
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s"
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 無法寫入檔案 \"%s\": %s"
+
+#: file.c:135
+#, c-format
+msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "複製 relation \"%s.%s\"(\"%s\" 至 \"%s\")時發生錯誤: %s"
+
+#: file.c:154
+#, c-format
+msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "建立 relation \"%s.%s\" 的連結時發生錯誤(\"%s\" 至 \"%s\"): %s"
+
+#: file.c:197
+#, c-format
+msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s"
+msgstr "複製關聯 \"%s.%s\" 時發生錯誤: 無法取得檔案 \"%s\" 的狀態: %s"
+
+#: file.c:229
+#, c-format
+msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\""
+msgstr "複製 relation \"%s.%s\" 時發生錯誤: 在檔案 \"%s\" 中找到部分頁面"
+
+#: file.c:331 file.c:348
+#, c-format
+msgid "could not clone file between old and new data directories: %s"
+msgstr "無法在舊和新的資料目錄之間 clone 檔案: %s"
+
+#: file.c:344
+#, c-format
+msgid "could not create file \"%s\": %s"
+msgstr "無法建立檔案 \"%s\": %s"
+
+#: file.c:355
+#, c-format
+msgid "file cloning not supported on this platform"
+msgstr "此平臺不支援 clone 檔案"
+
+#: file.c:372
+#, c-format
+msgid ""
+"could not create hard link between old and new data directories: %s\n"
+"In link mode the old and new data directories must be on the same file system."
+msgstr ""
+"無法在舊資料目錄和新資料目錄之間建立硬連結: %s\n"
+"在 link 模式,舊資料目錄和新資料目錄必須位於相同的檔案系統。"
+
+#: function.c:128
+#, c-format
+msgid "Checking for presence of required libraries"
+msgstr "檢查必要程式庫是否存在"
+
+# utils/fmgr/dfmgr.c:145
+#: function.c:165
+#, c-format
+msgid "could not load library \"%s\": %s"
+msgstr "無法載入程式庫\"%s\": %s"
+
+#: function.c:176
+#, c-format
+msgid "In database: %s\n"
+msgstr "在資料庫中: %s\n"
+
+#: function.c:186
+#, c-format
+msgid ""
+"Your installation references loadable libraries that are missing from the\n"
+"new installation. You can add these libraries to the new installation,\n"
+"or remove the functions using them from the old installation. A list of\n"
+"problem libraries is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝參考了在新安裝中沒有的可載入程式庫。您可以將這些程式庫新增至\n"
+"新安裝,或從舊安裝中刪除使用它們的函數。\n"
+"問題程式庫的清單位於以下檔案中:\n"
+" %s"
+
+#: info.c:126
+#, c-format
+msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\""
+msgstr "OID %u 的關聯名稱在資料庫 %s 中不一致: 舊名稱 \"%s.%s\",新名稱 \"%s.%s\""
+
+#: info.c:146
+#, c-format
+msgid "Failed to match up old and new tables in database \"%s\""
+msgstr "無法在資料庫 \"%s\" 中對應新、舊資料表"
+
+#: info.c:227
+#, c-format
+msgid " which is an index on \"%s.%s\""
+msgstr " 是 \"%s.%s\" 的索引"
+
+#: info.c:237
+#, c-format
+msgid " which is an index on OID %u"
+msgstr " 是 OID %u 的索引"
+
+#: info.c:249
+#, c-format
+msgid " which is the TOAST table for \"%s.%s\""
+msgstr " 是 \"%s.%s\" 的 TOAST 資料表"
+
+#: info.c:257
+#, c-format
+msgid " which is the TOAST table for OID %u"
+msgstr " 是 OID %u 的 TOAST 資料表"
+
+#: info.c:261
+#, c-format
+msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s"
+msgstr "無法在舊叢集中為 OID 為 %u 的新關聯找到對應,資料庫 \"%s\": %s"
+
+#: info.c:264
+#, c-format
+msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s"
+msgstr "無法在新叢集中為 OID 為 %u 的舊關聯找到對應,資料庫 \"%s\": %s"
+
+#: info.c:289
+#, c-format
+msgid ""
+"\n"
+"source databases:"
+msgstr ""
+"\n"
+"來源資料庫:"
+
+#: info.c:291
+#, c-format
+msgid ""
+"\n"
+"target databases:"
+msgstr ""
+"\n"
+"目標資料庫:"
+
+#: info.c:329
+#, c-format
+msgid "template0 not found"
+msgstr "找不到 template0"
+
+#: info.c:645
+#, c-format
+msgid "Database: %s"
+msgstr "資料庫: %s"
+
+#: info.c:657
+#, c-format
+msgid "relname: %s.%s: reloid: %u reltblspace: %s"
+msgstr "relname: %s.%s: reloid: %u reltblspace: %s"
+
+#: option.c:101
+#, c-format
+msgid "%s: cannot be run as root"
+msgstr "%s: 不能以 root 身份執行"
+
+#: option.c:168
+#, c-format
+msgid "invalid old port number"
+msgstr "舊連接埠無效"
+
+#: option.c:173
+#, c-format
+msgid "invalid new port number"
+msgstr "新連接埠無效"
+
+# postmaster/postmaster.c:512 postmaster/postmaster.c:525
+#: option.c:203
+#, c-format
+msgid "Try \"%s --help\" for more information.\n"
+msgstr "用 \"%s --help\" 取得更多資訊。\n"
+
+#: option.c:210
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "命令列參數過多(第一個個是 \"%s\")"
+
+#: option.c:213
+#, c-format
+msgid "Running in verbose mode"
+msgstr "以詳細模式執行"
+
+#: option.c:231
+msgid "old cluster binaries reside"
+msgstr "舊叢集執行檔所在"
+
+#: option.c:233
+msgid "new cluster binaries reside"
+msgstr "新叢集執行檔所在"
+
+#: option.c:235
+msgid "old cluster data resides"
+msgstr "舊叢集資料所在"
+
+#: option.c:237
+msgid "new cluster data resides"
+msgstr "新叢集資料所在"
+
+#: option.c:239
+msgid "sockets will be created"
+msgstr "將建立 socket"
+
+#: option.c:256 option.c:356
+#, c-format
+msgid "could not determine current directory"
+msgstr "無法確定目前目錄"
+
+#: option.c:259
+#, c-format
+msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows"
+msgstr "在 Windows 上無法在新叢集的資料目錄內執行 pg_upgrade"
+
+#: option.c:268
+#, c-format
+msgid ""
+"pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n"
+"\n"
+msgstr ""
+"pg_upgrade 將 PostgreSQL 叢集升級到不同的主要版本。\n"
+"\n"
+
+#: option.c:269
+#, c-format
+msgid "Usage:\n"
+msgstr "用法:\n"
+
+#: option.c:270
+#, c-format
+msgid ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+msgstr ""
+" pg_upgrade [OPTION]...\n"
+"\n"
+
+# postmaster/postmaster.c:1017 tcop/postgres.c:2115
+#: option.c:271
+#, c-format
+msgid "Options:\n"
+msgstr "選項: \n"
+
+#: option.c:272
+#, c-format
+msgid " -b, --old-bindir=BINDIR old cluster executable directory\n"
+msgstr " -b, --old-bindir=BINDIR 舊叢集執行檔目錄\n"
+
+#: option.c:273
+#, c-format
+msgid ""
+" -B, --new-bindir=BINDIR new cluster executable directory (default\n"
+" same directory as pg_upgrade)\n"
+msgstr " -B, --new-bindir=BINDIR 新叢集執行檔目錄(預設與 pg_upgrade 相同目錄)\n"
+
+#: option.c:275
+#, c-format
+msgid " -c, --check check clusters only, don't change any data\n"
+msgstr " -c, --check 只檢查叢集,不變更任何資料\n"
+
+#: option.c:276
+#, c-format
+msgid " -d, --old-datadir=DATADIR old cluster data directory\n"
+msgstr " -d, --old-datadir=DATADIR 舊叢集資料目錄\n"
+
+#: option.c:277
+#, c-format
+msgid " -D, --new-datadir=DATADIR new cluster data directory\n"
+msgstr " -D, --new-datadir=DATADIR 新叢集資料目錄\n"
+
+#: option.c:278
+#, c-format
+msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n"
+msgstr " -j, --jobs=NUM 同時使用的行程或執行緒數目\n"
+
+#: option.c:279
+#, c-format
+msgid " -k, --link link instead of copying files to new cluster\n"
+msgstr " -k, --link 連結檔案至新叢集,而非複製\n"
+
+#: option.c:280
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync 不等待變更安全寫入磁碟\n"
+
+#: option.c:281
+#, c-format
+msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n"
+msgstr " -o, --old-options=OPTIONS 傳遞給伺服器的舊叢集選項\n"
+
+#: option.c:282
+#, c-format
+msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n"
+msgstr " -O, --new-options=OPTIONS 傳遞給伺服器的新叢集選項\n"
+
+#: option.c:283
+#, c-format
+msgid " -p, --old-port=PORT old cluster port number (default %d)\n"
+msgstr " -p, --old-port=PORT 舊叢集連接埠(預設 %d)\n"
+
+#: option.c:284
+#, c-format
+msgid " -P, --new-port=PORT new cluster port number (default %d)\n"
+msgstr " -P, --new-port=PORT 新叢集連接埠(預設 %d)\n"
+
+#: option.c:285
+#, c-format
+msgid " -r, --retain retain SQL and log files after success\n"
+msgstr " -r, --retain 在成功後保留 SQL 和日誌檔案\n"
+
+#: option.c:286
+#, c-format
+msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n"
+msgstr " -s, --socketdir=DIR 使用的 socket 目錄(預設為目前目錄)\n"
+
+#: option.c:287
+#, c-format
+msgid " -U, --username=NAME cluster superuser (default \"%s\")\n"
+msgstr " -U, --username=NAME 叢集超級使用者(預設為 \"%s\")\n"
+
+#: option.c:288
+#, c-format
+msgid " -v, --verbose enable verbose internal logging\n"
+msgstr " -v, --verbose 啟動詳細的內部記錄\n"
+
+#: option.c:289
+#, c-format
+msgid " -V, --version display version information, then exit\n"
+msgstr " -V, --version 顯示版本,然後結束\n"
+
+#: option.c:290
+#, c-format
+msgid " --clone clone instead of copying files to new cluster\n"
+msgstr " --clone clone 檔案至新叢集而非複製\n"
+
+#: option.c:291
+#, c-format
+msgid " --copy copy files to new cluster (default)\n"
+msgstr " --copy 複製檔案至新叢集(預設)\n"
+
+#: option.c:292
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 顯示說明,然後結束\n"
+
+#: option.c:293
+#, c-format
+msgid ""
+"\n"
+"Before running pg_upgrade you must:\n"
+" create a new database cluster (using the new version of initdb)\n"
+" shutdown the postmaster servicing the old cluster\n"
+" shutdown the postmaster servicing the new cluster\n"
+msgstr ""
+"\n"
+"在執行 pg_upgrade 之前,您必須:\n"
+" 建立一個新的資料庫叢集(使用新版本的 initdb)\n"
+" 關閉舊叢集的 postmaster\n"
+" 關閉新叢集的 postmaster\n"
+
+#: option.c:298
+#, c-format
+msgid ""
+"\n"
+"When you run pg_upgrade, you must provide the following information:\n"
+" the data directory for the old cluster (-d DATADIR)\n"
+" the data directory for the new cluster (-D DATADIR)\n"
+" the \"bin\" directory for the old version (-b BINDIR)\n"
+" the \"bin\" directory for the new version (-B BINDIR)\n"
+msgstr ""
+"\n"
+"當您執行 pg_upgrade 時,必須提供以下資訊:\n"
+" 舊叢集的資料目錄(-d DATADIR)\n"
+" 新叢集的資料目錄(-D DATADIR)\n"
+" 舊版本的 \"bin\" 目錄(-b BINDIR)\n"
+" 新版本的 \"bin\" 目錄(-B BINDIR)\n"
+
+#: option.c:304
+#, c-format
+msgid ""
+"\n"
+"For example:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"or\n"
+msgstr ""
+"\n"
+"例如:\n"
+" pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n"
+"或\n"
+
+#: option.c:309
+#, c-format
+msgid ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+msgstr ""
+" $ export PGDATAOLD=oldCluster/data\n"
+" $ export PGDATANEW=newCluster/data\n"
+" $ export PGBINOLD=oldCluster/bin\n"
+" $ export PGBINNEW=newCluster/bin\n"
+" $ pg_upgrade\n"
+
+#: option.c:315
+#, c-format
+msgid ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+msgstr ""
+" C:\\> set PGDATAOLD=oldCluster/data\n"
+" C:\\> set PGDATANEW=newCluster/data\n"
+" C:\\> set PGBINOLD=oldCluster/bin\n"
+" C:\\> set PGBINNEW=newCluster/bin\n"
+" C:\\> pg_upgrade\n"
+
+#: option.c:321
+#, c-format
+msgid ""
+"\n"
+"Report bugs to <%s>.\n"
+msgstr ""
+"\n"
+"回報錯誤至 <%s>.\n"
+
+#: option.c:322
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 網頁: <%s>\n"
+
+#: option.c:362
+#, c-format
+msgid ""
+"You must identify the directory where the %s.\n"
+"Please use the %s command-line option or the %s environment variable."
+msgstr ""
+"您必須確認%s的目錄位置。\n"
+"請使用 %s 命令列選項或環境變數 %s。"
+
+#: option.c:415
+#, c-format
+msgid "Finding the real data directory for the source cluster"
+msgstr "尋找來源叢集的實際資料目錄"
+
+#: option.c:417
+#, c-format
+msgid "Finding the real data directory for the target cluster"
+msgstr "尋找目標叢集的實際資料目錄"
+
+#: option.c:430 option.c:435
+#, c-format
+msgid "could not get data directory using %s: %s"
+msgstr "無法用 %s 取得資料目錄: %s"
+
+#: option.c:484
+#, c-format
+msgid "could not read line %d from file \"%s\": %s"
+msgstr "無法從文件 \"%2$s\" 讀取第 %1$d 行內容: %3$s"
+
+#: option.c:501
+#, c-format
+msgid "user-supplied old port number %hu corrected to %hu"
+msgstr "使用者提供的舊埠號 %hu 已更正為 %hu"
+
+#: parallel.c:127 parallel.c:235
+#, c-format
+msgid "could not create worker process: %s"
+msgstr "無法建立工作行程: %s"
+
+#: parallel.c:143 parallel.c:253
+#, c-format
+msgid "could not create worker thread: %s"
+msgstr "無法建立工作執行緒: %s"
+
+#: parallel.c:294
+#, c-format
+msgid "%s() failed: %s"
+msgstr "%s() 失敗: %s"
+
+#: parallel.c:298
+#, c-format
+msgid "child process exited abnormally: status %d"
+msgstr "子行程異常結束: 狀態 %d"
+
+#: parallel.c:313
+#, c-format
+msgid "child worker exited abnormally: %s"
+msgstr "工作子行程異常結束: %s"
+
+#: pg_upgrade.c:107
+#, c-format
+msgid "could not read permissions of directory \"%s\": %s"
+msgstr "無法讀取目錄 \"%s\" 的權限: %s"
+
+#: pg_upgrade.c:139
+#, c-format
+msgid ""
+"\n"
+"Performing Upgrade\n"
+"------------------"
+msgstr ""
+"\n"
+"進行升級\n"
+"------------------"
+
+#: pg_upgrade.c:184
+#, c-format
+msgid "Setting next OID for new cluster"
+msgstr "設定新叢集的下一個 OID"
+
+#: pg_upgrade.c:193
+#, c-format
+msgid "Sync data directory to disk"
+msgstr "同步資料目錄至磁碟"
+
+#: pg_upgrade.c:205
+#, c-format
+msgid ""
+"\n"
+"Upgrade Complete\n"
+"----------------"
+msgstr ""
+"\n"
+"升級完成\n"
+"----------------"
+
+#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265
+#: pg_upgrade.c:283 pg_upgrade.c:294
+#, c-format
+msgid "directory path for new cluster is too long"
+msgstr "新叢集的目錄路徑太長"
+
+# commands/tablespace.c:154 commands/tablespace.c:162
+# commands/tablespace.c:168
+#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278
+#, c-format
+msgid "could not create directory \"%s\": %m"
+msgstr "無法建立目錄\"%s\": %m"
+
+#: pg_upgrade.c:327
+#, c-format
+msgid "%s: could not find own program executable"
+msgstr "%s: 找不到自身程式的執行檔"
+
+#: pg_upgrade.c:353
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the old cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"似乎有 postmaster 正在使用舊叢集。\n"
+"請關閉該 postmaster 然後重試。"
+
+#: pg_upgrade.c:366
+#, c-format
+msgid ""
+"There seems to be a postmaster servicing the new cluster.\n"
+"Please shutdown that postmaster and try again."
+msgstr ""
+"似乎有 postmaster 正在使用新叢集。\n"
+"請關閉該 postmaster 然後重試。"
+
+#: pg_upgrade.c:388
+#, c-format
+msgid "Setting locale and encoding for new cluster"
+msgstr "設定新叢集的區域和編碼"
+
+#: pg_upgrade.c:450
+#, c-format
+msgid "Analyzing all rows in the new cluster"
+msgstr "分析新叢集中的所有資料列"
+
+#: pg_upgrade.c:463
+#, c-format
+msgid "Freezing all rows in the new cluster"
+msgstr "凍結新叢集中的所有資料列"
+
+#: pg_upgrade.c:483
+#, c-format
+msgid "Restoring global objects in the new cluster"
+msgstr "還原新叢集中的全域物件"
+
+#: pg_upgrade.c:499
+#, c-format
+msgid "Restoring database schemas in the new cluster"
+msgstr "還原新叢集中的資料庫 schema"
+
+#: pg_upgrade.c:605
+#, c-format
+msgid "Deleting files from new %s"
+msgstr "從新的 %s 刪除檔案"
+
+#: pg_upgrade.c:609
+#, c-format
+msgid "could not delete directory \"%s\""
+msgstr "無法刪除目錄 \"%s\""
+
+#: pg_upgrade.c:628
+#, c-format
+msgid "Copying old %s to new server"
+msgstr "將舊的 %s 複製到新伺服器"
+
+#: pg_upgrade.c:654
+#, c-format
+msgid "Setting oldest XID for new cluster"
+msgstr "為新叢集設定最早的 XID"
+
+#: pg_upgrade.c:662
+#, c-format
+msgid "Setting next transaction ID and epoch for new cluster"
+msgstr "為新叢集設定下一個交易 ID 和 epoch"
+
+#: pg_upgrade.c:692
+#, c-format
+msgid "Setting next multixact ID and offset for new cluster"
+msgstr "為新叢集設定下一個 multixact ID 和 offset"
+
+#: pg_upgrade.c:716
+#, c-format
+msgid "Setting oldest multixact ID in new cluster"
+msgstr "為新叢集設定最早的 multixact ID"
+
+#: pg_upgrade.c:736
+#, c-format
+msgid "Resetting WAL archives"
+msgstr "重設 WAL 封存檔"
+
+#: pg_upgrade.c:779
+#, c-format
+msgid "Setting frozenxid and minmxid counters in new cluster"
+msgstr "在新叢集中設定 frozenxid 和 minmxid 計數器"
+
+#: pg_upgrade.c:781
+#, c-format
+msgid "Setting minmxid counter in new cluster"
+msgstr "在新叢集中設定 minmxid 計數器"
+
+#: relfilenumber.c:35
+#, c-format
+msgid "Cloning user relation files"
+msgstr "Clone 使用者 relation 檔"
+
+#: relfilenumber.c:38
+#, c-format
+msgid "Copying user relation files"
+msgstr "複製使用者 relation 檔"
+
+#: relfilenumber.c:41
+#, c-format
+msgid "Linking user relation files"
+msgstr "連結使用者 relation 檔"
+
+#: relfilenumber.c:115
+#, c-format
+msgid "old database \"%s\" not found in the new cluster"
+msgstr "在新叢集中找不到舊資料庫 \"%s\""
+
+#: relfilenumber.c:218
+#, c-format
+msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s"
+msgstr "檢查檔案存在性時發生錯誤 \"%s.%s\"(\"%s\" 至 \"%s\"): %s"
+
+#: relfilenumber.c:236
+#, c-format
+msgid "rewriting \"%s\" to \"%s\""
+msgstr "將 \"%s\" 重寫為 \"%s\""
+
+#: relfilenumber.c:244
+#, c-format
+msgid "cloning \"%s\" to \"%s\""
+msgstr "clone \"%s\" 至 \"%s\""
+
+#: relfilenumber.c:249
+#, c-format
+msgid "copying \"%s\" to \"%s\""
+msgstr "複製 \"%s\" 至 \"%s\""
+
+#: relfilenumber.c:254
+#, c-format
+msgid "linking \"%s\" to \"%s\""
+msgstr "連結 \"%s\" 至 \"%s\""
+
+#: server.c:39 server.c:143 util.c:248 util.c:278
+#, c-format
+msgid "Failure, exiting\n"
+msgstr "失敗,結束\n"
+
+#: server.c:133
+#, c-format
+msgid "executing: %s"
+msgstr "執行: %s"
+
+#: server.c:139
+#, c-format
+msgid ""
+"SQL command failed\n"
+"%s\n"
+"%s"
+msgstr ""
+"SQL 命令失敗\n"
+"%s\n"
+"%s"
+
+#: server.c:169
+#, c-format
+msgid "could not open version file \"%s\": %m"
+msgstr "無法開啟版本檔 \"%s\": %m"
+
+#: server.c:173
+#, c-format
+msgid "could not parse version file \"%s\""
+msgstr "無法解析版本檔 \"%s\""
+
+#: server.c:288
+#, c-format
+msgid ""
+"\n"
+"%s"
+msgstr ""
+"\n"
+"%s"
+
+#: server.c:292
+#, c-format
+msgid ""
+"could not connect to source postmaster started with the command:\n"
+"%s"
+msgstr ""
+"無法連線到用以下命令啟動的來源 postmaster:\n"
+"%s"
+
+#: server.c:296
+#, c-format
+msgid ""
+"could not connect to target postmaster started with the command:\n"
+"%s"
+msgstr ""
+"無法連線到用以下命令啟動的目標 postmaster:\n"
+"%s"
+
+#: server.c:310
+#, c-format
+msgid "pg_ctl failed to start the source server, or connection failed"
+msgstr "pg_ctl 啟動來源伺服器失敗或連線失敗"
+
+#: server.c:312
+#, c-format
+msgid "pg_ctl failed to start the target server, or connection failed"
+msgstr "pg_ctl 啟動目標伺服器失敗或連線失敗"
+
+# commands/sequence.c:798 executor/execGrouping.c:328
+# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43
+# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006
+# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527
+# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623
+# postmaster/postmaster.c:755 postmaster/postmaster.c:1625
+# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139
+# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766
+# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138
+# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297
+# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73
+# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191
+# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164
+# utils/cache/relcache.c:178 utils/cache/relcache.c:1130
+# utils/cache/typcache.c:165 utils/cache/typcache.c:487
+# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532
+# utils/init/miscinit.c:213 utils/init/miscinit.c:234
+# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911
+# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503
+# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75
+#: server.c:357
+#, c-format
+msgid "out of memory"
+msgstr "記憶體用盡"
+
+#: server.c:370
+#, c-format
+msgid "libpq environment variable %s has a non-local server value: %s"
+msgstr "libpq 環境變數 %s 具有非本地伺服器值: %s"
+
+#: tablespace.c:28
+#, c-format
+msgid ""
+"Cannot upgrade to/from the same system catalog version when\n"
+"using tablespaces."
+msgstr "使用表空間時,無法升級到/從相同的系統目錄版本。"
+
+#: tablespace.c:83
+#, c-format
+msgid "tablespace directory \"%s\" does not exist"
+msgstr "表空間目錄 \"%s\" 不存在"
+
+#: tablespace.c:87
+#, c-format
+msgid "could not stat tablespace directory \"%s\": %s"
+msgstr "無法取得表格空間目錄 \"%s\" 的狀態: %s"
+
+#: tablespace.c:92
+#, c-format
+msgid "tablespace path \"%s\" is not a directory"
+msgstr "表空間路徑 \"%s\" 不是目錄"
+
+#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172
+#, c-format
+msgid "%-*s"
+msgstr "%-*s"
+
+# utils/init/postinit.c:283
+#: util.c:107
+#, c-format
+msgid "could not access directory \"%s\": %m"
+msgstr "無法存取目錄 \"%s\": %m"
+
+#: util.c:287
+#, c-format
+msgid "ok"
+msgstr "ok"
+
+#: version.c:184
+#, c-format
+msgid "Checking for incompatible \"line\" data type"
+msgstr "檢查不相容的 \"line\" 資料型別"
+
+#: version.c:193
+#, c-format
+msgid ""
+"Your installation contains the \"line\" data type in user tables.\n"
+"This data type changed its internal and input/output format\n"
+"between your old and new versions so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含使用者表格中的 \"line\" 資料型別,這個資料型別\n"
+"在您的舊版本和新版本之間改變了其內部和輸入/輸出格式,\n"
+"所以目前無法升級此叢集。您可以刪除問題的欄位,然後重\n"
+"新進行升級。問題欄位的清單位於以下檔案中:\n"
+" %s"
+
+#: version.c:224
+#, c-format
+msgid "Checking for invalid \"unknown\" user columns"
+msgstr "檢查無效的 \"unknown\" 使用者欄位"
+
+#: version.c:233
+#, c-format
+msgid ""
+"Your installation contains the \"unknown\" data type in user tables.\n"
+"This data type is no longer allowed in tables, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含使用者表格中的 \"unknown\" 資料型別。此資料型別不再\n"
+"允許在表格中使用,所以目前無法升級此叢集。您可以刪除問題的欄位,\n"
+"然後重新進行升級。問題欄位的清單位於以下檔案中:\n"
+" %s"
+
+#: version.c:257
+#, c-format
+msgid "Checking for hash indexes"
+msgstr "檢查雜湊索引"
+
+#: version.c:335
+#, c-format
+msgid "warning"
+msgstr "warning"
+
+#: version.c:337
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. After upgrading, you will be given\n"
+"REINDEX instructions."
+msgstr ""
+"\n"
+"您的安裝包含雜湊索引。這些索引在您的舊叢集和新叢集之間具有不同的\n"
+"內部格式,因此必須使用 REINDEX 命令重新索引它們。升級完成後,您\n"
+"將收到重新索引的指示。"
+
+#: version.c:343
+#, c-format
+msgid ""
+"\n"
+"Your installation contains hash indexes. These indexes have different\n"
+"internal formats between your old and new clusters, so they must be\n"
+"reindexed with the REINDEX command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will recreate all invalid\n"
+"indexes; until then, none of these indexes will be used."
+msgstr ""
+"\n"
+"您的安裝包含雜湊索引。這些索引在您的舊叢集和新叢集之間具有不同的\n"
+"內部格式,因此必須使用 REINDEX 命令重新索引它們。當檔案\n"
+" %s\n"
+"被資料庫超級使用者用 psql 執行時,將重建所有無效的索引。在此之前,\n"
+"這些索引將不會被使用。"
+
+#: version.c:369
+#, c-format
+msgid "Checking for invalid \"sql_identifier\" user columns"
+msgstr "檢查無效的 \"sql_identifier\" 使用者欄位"
+
+#: version.c:379
+#, c-format
+msgid ""
+"Your installation contains the \"sql_identifier\" data type in user tables.\n"
+"The on-disk format for this data type has changed, so this\n"
+"cluster cannot currently be upgraded. You can\n"
+"drop the problem columns and restart the upgrade.\n"
+"A list of the problem columns is in the file:\n"
+" %s"
+msgstr ""
+"您的安裝包含使用者表格中的 \"sql_identifier\" 資料型別。這個資料型別的\n"
+"磁碟格式已經改變,所以目前無法升級此叢集。您可以刪除問題的欄位,\n"
+"然後重新啟動升級。問題欄位的清單位於檔案中:\n"
+" %s"
+
+#: version.c:402
+#, c-format
+msgid "Checking for extension updates"
+msgstr "檢查擴充模組更新"
+
+#: version.c:450
+#, c-format
+msgid "notice"
+msgstr "notice"
+
+#: version.c:451
+#, c-format
+msgid ""
+"\n"
+"Your installation contains extensions that should be updated\n"
+"with the ALTER EXTENSION command. The file\n"
+" %s\n"
+"when executed by psql by the database superuser will update\n"
+"these extensions."
+msgstr ""
+"\n"
+"您的安裝包含應該使用 ALTER EXTENSION 命令更新的擴充模組。\n"
+"當檔案\n"
+" %s\n"
+"被資料庫超級使用者用 psql 執行時,會更新這些擴充模組。"
diff --git a/src/bin/pg_upgrade/relfilenumber.c b/src/bin/pg_upgrade/relfilenumber.c
new file mode 100644
index 0000000..34bc9c1
--- /dev/null
+++ b/src/bin/pg_upgrade/relfilenumber.c
@@ -0,0 +1,259 @@
+/*
+ * relfilenumber.c
+ *
+ * relfilenumber functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/relfilenumber.c
+ */
+
+#include "postgres_fe.h"
+
+#include <sys/stat.h>
+
+#include "access/transam.h"
+#include "catalog/pg_class_d.h"
+#include "pg_upgrade.h"
+
+static void transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace);
+static void transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit);
+
+
+/*
+ * transfer_all_new_tablespaces()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata)
+{
+ switch (user_opts.transfer_mode)
+ {
+ case TRANSFER_MODE_CLONE:
+ prep_status_progress("Cloning user relation files");
+ break;
+ case TRANSFER_MODE_COPY:
+ prep_status_progress("Copying user relation files");
+ break;
+ case TRANSFER_MODE_LINK:
+ prep_status_progress("Linking user relation files");
+ break;
+ }
+
+ /*
+ * Transferring files by tablespace is tricky because a single database
+ * can use multiple tablespaces. For non-parallel mode, we just pass a
+ * NULL tablespace path, which matches all tablespaces. In parallel mode,
+ * we pass the default tablespace and all user-created tablespaces and let
+ * those operations happen in parallel.
+ */
+ if (user_opts.jobs <= 1)
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, NULL);
+ else
+ {
+ int tblnum;
+
+ /* transfer default tablespace */
+ parallel_transfer_all_new_dbs(old_db_arr, new_db_arr, old_pgdata,
+ new_pgdata, old_pgdata);
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ parallel_transfer_all_new_dbs(old_db_arr,
+ new_db_arr,
+ old_pgdata,
+ new_pgdata,
+ os_info.old_tablespaces[tblnum]);
+ /* reap all children */
+ while (reap_child(true) == true)
+ ;
+ }
+
+ end_progress_output();
+ check_ok();
+}
+
+
+/*
+ * transfer_all_new_dbs()
+ *
+ * Responsible for upgrading all database. invokes routines to generate mappings and then
+ * physically link the databases.
+ */
+void
+transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr,
+ char *old_pgdata, char *new_pgdata, char *old_tablespace)
+{
+ int old_dbnum,
+ new_dbnum;
+
+ /* Scan the old cluster databases and transfer their files */
+ for (old_dbnum = new_dbnum = 0;
+ old_dbnum < old_db_arr->ndbs;
+ old_dbnum++, new_dbnum++)
+ {
+ DbInfo *old_db = &old_db_arr->dbs[old_dbnum],
+ *new_db = NULL;
+ FileNameMap *mappings;
+ int n_maps;
+
+ /*
+ * Advance past any databases that exist in the new cluster but not in
+ * the old, e.g. "postgres". (The user might have removed the
+ * 'postgres' database from the old cluster.)
+ */
+ for (; new_dbnum < new_db_arr->ndbs; new_dbnum++)
+ {
+ new_db = &new_db_arr->dbs[new_dbnum];
+ if (strcmp(old_db->db_name, new_db->db_name) == 0)
+ break;
+ }
+
+ if (new_dbnum >= new_db_arr->ndbs)
+ pg_fatal("old database \"%s\" not found in the new cluster",
+ old_db->db_name);
+
+ mappings = gen_db_file_maps(old_db, new_db, &n_maps, old_pgdata,
+ new_pgdata);
+ if (n_maps)
+ {
+ transfer_single_new_db(mappings, n_maps, old_tablespace);
+ }
+ /* We allocate something even for n_maps == 0 */
+ pg_free(mappings);
+ }
+}
+
+/*
+ * transfer_single_new_db()
+ *
+ * create links for mappings stored in "maps" array.
+ */
+static void
+transfer_single_new_db(FileNameMap *maps, int size, char *old_tablespace)
+{
+ int mapnum;
+ bool vm_must_add_frozenbit = false;
+
+ /*
+ * Do we need to rewrite visibilitymap?
+ */
+ if (old_cluster.controldata.cat_ver < VISIBILITY_MAP_FROZEN_BIT_CAT_VER &&
+ new_cluster.controldata.cat_ver >= VISIBILITY_MAP_FROZEN_BIT_CAT_VER)
+ vm_must_add_frozenbit = true;
+
+ for (mapnum = 0; mapnum < size; mapnum++)
+ {
+ if (old_tablespace == NULL ||
+ strcmp(maps[mapnum].old_tablespace, old_tablespace) == 0)
+ {
+ /* transfer primary file */
+ transfer_relfile(&maps[mapnum], "", vm_must_add_frozenbit);
+
+ /*
+ * Copy/link any fsm and vm files, if they exist
+ */
+ transfer_relfile(&maps[mapnum], "_fsm", vm_must_add_frozenbit);
+ transfer_relfile(&maps[mapnum], "_vm", vm_must_add_frozenbit);
+ }
+ }
+}
+
+
+/*
+ * transfer_relfile()
+ *
+ * Copy or link file from old cluster to new one. If vm_must_add_frozenbit
+ * is true, visibility map forks are converted and rewritten, even in link
+ * mode.
+ */
+static void
+transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_frozenbit)
+{
+ char old_file[MAXPGPATH];
+ char new_file[MAXPGPATH];
+ int segno;
+ char extent_suffix[65];
+ struct stat statbuf;
+
+ /*
+ * Now copy/link any related segments as well. Remember, PG breaks large
+ * files into 1GB segments, the first segment has no extension, subsequent
+ * segments are named relfilenumber.1, relfilenumber.2, relfilenumber.3.
+ */
+ for (segno = 0;; segno++)
+ {
+ if (segno == 0)
+ extent_suffix[0] = '\0';
+ else
+ snprintf(extent_suffix, sizeof(extent_suffix), ".%d", segno);
+
+ snprintf(old_file, sizeof(old_file), "%s%s/%u/%u%s%s",
+ map->old_tablespace,
+ map->old_tablespace_suffix,
+ map->db_oid,
+ map->relfilenumber,
+ type_suffix,
+ extent_suffix);
+ snprintf(new_file, sizeof(new_file), "%s%s/%u/%u%s%s",
+ map->new_tablespace,
+ map->new_tablespace_suffix,
+ map->db_oid,
+ map->relfilenumber,
+ type_suffix,
+ extent_suffix);
+
+ /* Is it an extent, fsm, or vm file? */
+ if (type_suffix[0] != '\0' || segno != 0)
+ {
+ /* Did file open fail? */
+ if (stat(old_file, &statbuf) != 0)
+ {
+ /* File does not exist? That's OK, just return */
+ if (errno == ENOENT)
+ return;
+ else
+ pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s",
+ map->nspname, map->relname, old_file, new_file,
+ strerror(errno));
+ }
+
+ /* If file is empty, just return */
+ if (statbuf.st_size == 0)
+ return;
+ }
+
+ unlink(new_file);
+
+ /* Copying files might take some time, so give feedback. */
+ pg_log(PG_STATUS, "%s", old_file);
+
+ if (vm_must_add_frozenbit && strcmp(type_suffix, "_vm") == 0)
+ {
+ /* Need to rewrite visibility map format */
+ pg_log(PG_VERBOSE, "rewriting \"%s\" to \"%s\"",
+ old_file, new_file);
+ rewriteVisibilityMap(old_file, new_file, map->nspname, map->relname);
+ }
+ else
+ 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_LINK:
+ pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"",
+ old_file, new_file);
+ linkFile(old_file, new_file, map->nspname, map->relname);
+ }
+ }
+}
diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c
new file mode 100644
index 0000000..0bc3d28
--- /dev/null
+++ b/src/bin/pg_upgrade/server.c
@@ -0,0 +1,377 @@
+/*
+ * server.c
+ *
+ * database server functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/server.c
+ */
+
+#include "postgres_fe.h"
+
+#include "common/connect.h"
+#include "fe_utils/string_utils.h"
+#include "libpq/pqcomm.h"
+#include "pg_upgrade.h"
+
+static PGconn *get_db_conn(ClusterInfo *cluster, const char *db_name);
+
+
+/*
+ * connectToServer()
+ *
+ * Connects to the desired database on the designated server.
+ * If the connection attempt fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGconn *
+connectToServer(ClusterInfo *cluster, const char *db_name)
+{
+ PGconn *conn = get_db_conn(cluster, db_name);
+
+ if (conn == NULL || PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "%s", PQerrorMessage(conn));
+
+ if (conn)
+ PQfinish(conn);
+
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+
+ PQclear(executeQueryOrDie(conn, ALWAYS_SECURE_SEARCH_PATH_SQL));
+
+ return conn;
+}
+
+
+/*
+ * get_db_conn()
+ *
+ * get database connection, using named database + standard params for cluster
+ *
+ * Caller must check for connection failure!
+ */
+static PGconn *
+get_db_conn(ClusterInfo *cluster, const char *db_name)
+{
+ PQExpBufferData conn_opts;
+ PGconn *conn;
+
+ /* Build connection string with proper quoting */
+ initPQExpBuffer(&conn_opts);
+ appendPQExpBufferStr(&conn_opts, "dbname=");
+ appendConnStrVal(&conn_opts, db_name);
+ appendPQExpBufferStr(&conn_opts, " user=");
+ appendConnStrVal(&conn_opts, os_info.user);
+ appendPQExpBuffer(&conn_opts, " port=%d", cluster->port);
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(&conn_opts, " host=");
+ appendConnStrVal(&conn_opts, cluster->sockdir);
+ }
+
+ conn = PQconnectdb(conn_opts.data);
+ termPQExpBuffer(&conn_opts);
+ return conn;
+}
+
+
+/*
+ * cluster_conn_opts()
+ *
+ * Return standard command-line options for connecting to this cluster when
+ * using psql, pg_dump, etc. Ideally this would match what get_db_conn()
+ * sets, but the utilities we need aren't very consistent about the treatment
+ * of database name options, so we leave that out.
+ *
+ * Result is valid until the next call to this function.
+ */
+char *
+cluster_conn_opts(ClusterInfo *cluster)
+{
+ static PQExpBuffer buf;
+
+ if (buf == NULL)
+ buf = createPQExpBuffer();
+ else
+ resetPQExpBuffer(buf);
+
+ if (cluster->sockdir)
+ {
+ appendPQExpBufferStr(buf, "--host ");
+ appendShellString(buf, cluster->sockdir);
+ appendPQExpBufferChar(buf, ' ');
+ }
+ appendPQExpBuffer(buf, "--port %d --username ", cluster->port);
+ appendShellString(buf, os_info.user);
+
+ return buf->data;
+}
+
+
+/*
+ * executeQueryOrDie()
+ *
+ * Formats a query string from the given arguments and executes the
+ * resulting query. If the query fails, this function logs an error
+ * message and calls exit() to kill the program.
+ */
+PGresult *
+executeQueryOrDie(PGconn *conn, const char *fmt,...)
+{
+ static char query[QUERY_ALLOC];
+ va_list args;
+ PGresult *result;
+ ExecStatusType status;
+
+ va_start(args, fmt);
+ vsnprintf(query, sizeof(query), fmt, args);
+ va_end(args);
+
+ pg_log(PG_VERBOSE, "executing: %s", query);
+ result = PQexec(conn, query);
+ status = PQresultStatus(result);
+
+ if ((status != PGRES_TUPLES_OK) && (status != PGRES_COMMAND_OK))
+ {
+ pg_log(PG_REPORT, "SQL command failed\n%s\n%s", query,
+ PQerrorMessage(conn));
+ PQclear(result);
+ PQfinish(conn);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ }
+ else
+ return result;
+}
+
+
+/*
+ * get_major_server_version()
+ *
+ * gets the version (in unsigned int form) for the given datadir. Assumes
+ * that datadir is an absolute path to a valid pgdata directory. The version
+ * is retrieved by reading the PG_VERSION file.
+ */
+uint32
+get_major_server_version(ClusterInfo *cluster)
+{
+ FILE *version_fd;
+ char ver_filename[MAXPGPATH];
+ int v1 = 0,
+ v2 = 0;
+
+ snprintf(ver_filename, sizeof(ver_filename), "%s/PG_VERSION",
+ cluster->pgdata);
+ if ((version_fd = fopen(ver_filename, "r")) == NULL)
+ pg_fatal("could not open version file \"%s\": %m", ver_filename);
+
+ if (fscanf(version_fd, "%63s", cluster->major_version_str) == 0 ||
+ sscanf(cluster->major_version_str, "%d.%d", &v1, &v2) < 1)
+ pg_fatal("could not parse version file \"%s\"", ver_filename);
+
+ fclose(version_fd);
+
+ if (v1 < 10)
+ {
+ /* old style, e.g. 9.6.1 */
+ return v1 * 10000 + v2 * 100;
+ }
+ else
+ {
+ /* new style, e.g. 10.1 */
+ return v1 * 10000;
+ }
+}
+
+
+static void
+stop_postmaster_atexit(void)
+{
+ stop_postmaster(true);
+}
+
+
+bool
+start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
+{
+ char cmd[MAXPGPATH * 4 + 1000];
+ PGconn *conn;
+ bool pg_ctl_return = false;
+ char socket_string[MAXPGPATH + 200];
+
+ static bool exit_hook_registered = false;
+
+ if (!exit_hook_registered)
+ {
+ atexit(stop_postmaster_atexit);
+ exit_hook_registered = true;
+ }
+
+ socket_string[0] = '\0';
+
+#if !defined(WIN32)
+ /* prevent TCP/IP connections, restrict socket access */
+ strcat(socket_string,
+ " -c listen_addresses='' -c unix_socket_permissions=0700");
+
+ /* Have a sockdir? Tell the postmaster. */
+ if (cluster->sockdir)
+ snprintf(socket_string + strlen(socket_string),
+ sizeof(socket_string) - strlen(socket_string),
+ " -c %s='%s'",
+ (GET_MAJOR_VERSION(cluster->major_version) <= 902) ?
+ "unix_socket_directory" : "unix_socket_directories",
+ cluster->sockdir);
+#endif
+
+ /*
+ * Use -b to disable autovacuum.
+ *
+ * Turn off durability requirements to improve object creation speed, and
+ * we only modify the new cluster, so only use it there. If there is a
+ * crash, the new cluster has to be recreated anyway. fsync=off is a big
+ * win on ext4.
+ */
+ snprintf(cmd, sizeof(cmd),
+ "\"%s/pg_ctl\" -w -l \"%s/%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start",
+ cluster->bindir,
+ log_opts.logdir,
+ SERVER_LOG_FILE, cluster->pgconfig, cluster->port,
+ (cluster == &new_cluster) ?
+ " -c synchronous_commit=off -c fsync=off -c full_page_writes=off" : "",
+ cluster->pgopts ? cluster->pgopts : "", socket_string);
+
+ /*
+ * Don't throw an error right away, let connecting throw the error because
+ * it might supply a reason for the failure.
+ */
+ pg_ctl_return = exec_prog(SERVER_START_LOG_FILE,
+ /* pass both file names if they differ */
+ (strcmp(SERVER_LOG_FILE,
+ SERVER_START_LOG_FILE) != 0) ?
+ SERVER_LOG_FILE : NULL,
+ report_and_exit_on_error, false,
+ "%s", cmd);
+
+ /* Did it fail and we are just testing if the server could be started? */
+ if (!pg_ctl_return && !report_and_exit_on_error)
+ return false;
+
+ /*
+ * We set this here to make sure atexit() shuts down the server, but only
+ * if we started the server successfully. We do it before checking for
+ * connectivity in case the server started but there is a connectivity
+ * failure. If pg_ctl did not return success, we will exit below.
+ *
+ * Pre-9.1 servers do not have PQping(), so we could be leaving the server
+ * running if authentication was misconfigured, so someday we might went
+ * to be more aggressive about doing server shutdowns even if pg_ctl
+ * fails, but now (2013-08-14) it seems prudent to be cautious. We don't
+ * want to shutdown a server that might have been accidentally started
+ * during the upgrade.
+ */
+ if (pg_ctl_return)
+ os_info.running_cluster = cluster;
+
+ /*
+ * pg_ctl -w might have failed because the server couldn't be started, or
+ * there might have been a connection problem in _checking_ if the server
+ * has started. Therefore, even if pg_ctl failed, we continue and test
+ * for connectivity in case we get a connection reason for the failure.
+ */
+ if ((conn = get_db_conn(cluster, "template1")) == NULL ||
+ PQstatus(conn) != CONNECTION_OK)
+ {
+ pg_log(PG_REPORT, "\n%s", PQerrorMessage(conn));
+ if (conn)
+ PQfinish(conn);
+ if (cluster == &old_cluster)
+ pg_fatal("could not connect to source postmaster started with the command:\n"
+ "%s",
+ cmd);
+ else
+ pg_fatal("could not connect to target postmaster started with the command:\n"
+ "%s",
+ cmd);
+ }
+ PQfinish(conn);
+
+ /*
+ * If pg_ctl failed, and the connection didn't fail, and
+ * report_and_exit_on_error is enabled, fail now. This could happen if
+ * the server was already running.
+ */
+ if (!pg_ctl_return)
+ {
+ if (cluster == &old_cluster)
+ pg_fatal("pg_ctl failed to start the source server, or connection failed");
+ else
+ pg_fatal("pg_ctl failed to start the target server, or connection failed");
+ }
+
+ return true;
+}
+
+
+void
+stop_postmaster(bool in_atexit)
+{
+ ClusterInfo *cluster;
+
+ if (os_info.running_cluster == &old_cluster)
+ cluster = &old_cluster;
+ else if (os_info.running_cluster == &new_cluster)
+ cluster = &new_cluster;
+ else
+ return; /* no cluster running */
+
+ exec_prog(SERVER_STOP_LOG_FILE, NULL, !in_atexit, !in_atexit,
+ "\"%s/pg_ctl\" -w -D \"%s\" -o \"%s\" %s stop",
+ cluster->bindir, cluster->pgconfig,
+ cluster->pgopts ? cluster->pgopts : "",
+ in_atexit ? "-m fast" : "-m smart");
+
+ os_info.running_cluster = NULL;
+}
+
+
+/*
+ * check_pghost_envvar()
+ *
+ * Tests that PGHOST does not point to a non-local server
+ */
+void
+check_pghost_envvar(void)
+{
+ PQconninfoOption *option;
+ PQconninfoOption *start;
+
+ /* Get valid libpq env vars from the PQconndefaults function */
+
+ start = PQconndefaults();
+
+ if (!start)
+ pg_fatal("out of memory");
+
+ for (option = start; option->keyword != NULL; option++)
+ {
+ if (option->envvar && (strcmp(option->envvar, "PGHOST") == 0 ||
+ strcmp(option->envvar, "PGHOSTADDR") == 0))
+ {
+ const char *value = getenv(option->envvar);
+
+ if (value && strlen(value) > 0 &&
+ /* check for 'local' host values */
+ (strcmp(value, "localhost") != 0 && strcmp(value, "127.0.0.1") != 0 &&
+ strcmp(value, "::1") != 0 && !is_unixsock_path(value)))
+ pg_fatal("libpq environment variable %s has a non-local server value: %s",
+ option->envvar, value);
+ }
+ }
+
+ /* Free the memory that libpq allocated on our behalf */
+ PQconninfoFree(start);
+}
diff --git a/src/bin/pg_upgrade/t/001_basic.pl b/src/bin/pg_upgrade/t/001_basic.pl
new file mode 100644
index 0000000..ceac4e0
--- /dev/null
+++ b/src/bin/pg_upgrade/t/001_basic.pl
@@ -0,0 +1,13 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_upgrade');
+program_version_ok('pg_upgrade');
+program_options_handling_ok('pg_upgrade');
+
+done_testing();
diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
new file mode 100644
index 0000000..e5f57e5
--- /dev/null
+++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl
@@ -0,0 +1,461 @@
+# Copyright (c) 2022-2023, PostgreSQL Global Development Group
+
+# Set of tests for pg_upgrade, including cross-version checks.
+use strict;
+use warnings;
+
+use Cwd qw(abs_path);
+use File::Basename qw(dirname);
+use File::Compare;
+use File::Find qw(find);
+use File::Path qw(rmtree);
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use PostgreSQL::Test::AdjustUpgrade;
+use Test::More;
+
+# Can be changed to test the other modes.
+my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy';
+
+# Generate a database with a name made of a range of ASCII characters.
+sub generate_db
+{
+ my ($node, $prefix, $from_char, $to_char, $suffix) = @_;
+
+ my $dbname = $prefix;
+ for my $i ($from_char .. $to_char)
+ {
+ next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR
+ $dbname = $dbname . sprintf('%c', $i);
+ }
+
+ $dbname .= $suffix;
+ $node->command_ok(
+ [ 'createdb', $dbname ],
+ "created database with ASCII characters from $from_char to $to_char");
+}
+
+# Filter the contents of a dump before its use in a content comparison.
+# This returns the path to the filtered dump.
+sub filter_dump
+{
+ my ($is_old, $old_version, $dump_file) = @_;
+ my $dump_contents = slurp_file($dump_file);
+
+ if ($is_old)
+ {
+ $dump_contents = adjust_old_dumpfile($old_version, $dump_contents);
+ }
+ else
+ {
+ $dump_contents = adjust_new_dumpfile($old_version, $dump_contents);
+ }
+
+ my $dump_file_filtered = "${dump_file}_filtered";
+ open(my $dh, '>', $dump_file_filtered)
+ || die "opening $dump_file_filtered";
+ print $dh $dump_contents;
+ close($dh);
+
+ return $dump_file_filtered;
+}
+
+# The test of pg_upgrade requires two clusters, an old one and a new one
+# that gets upgraded. Before running the upgrade, a logical dump of the
+# old cluster is taken, and a second logical dump of the new one is taken
+# after the upgrade. The upgrade test passes if there are no differences
+# (after filtering) in these two dumps.
+
+# Testing upgrades with an older version of PostgreSQL requires setting up
+# two environment variables, as of:
+# - "olddump", to point to a dump file that will be used to set up the old
+# instance to upgrade from.
+# - "oldinstall", to point to the installation path of the old cluster.
+if ( (defined($ENV{olddump}) && !defined($ENV{oldinstall}))
+ || (!defined($ENV{olddump}) && defined($ENV{oldinstall})))
+{
+ # Not all variables are defined, so leave and die if test is
+ # done with an older installation.
+ die "olddump or oldinstall is undefined";
+}
+
+# Paths to the dumps taken during the tests.
+my $tempdir = PostgreSQL::Test::Utils::tempdir;
+my $dump1_file = "$tempdir/dump1.sql";
+my $dump2_file = "$tempdir/dump2.sql";
+
+note "testing using transfer mode $mode";
+
+# Initialize node to upgrade
+my $oldnode =
+ PostgreSQL::Test::Cluster->new('old_node',
+ install_path => $ENV{oldinstall});
+
+my %node_params = ();
+
+# To increase coverage of non-standard segment size and group access without
+# increasing test runtime, run these tests with a custom setting.
+# --allow-group-access and --wal-segsize have been added in v11.
+my @custom_opts = ();
+if ($oldnode->pg_version >= 11)
+{
+ push @custom_opts, ('--wal-segsize', '1');
+ push @custom_opts, '--allow-group-access';
+}
+
+# Set up the locale settings for the original cluster, so that we
+# can test that pg_upgrade copies the locale settings of template0
+# from the old to the new cluster.
+
+my $original_encoding = "6"; # UTF-8
+my $original_provider = "c";
+my $original_locale = "C";
+my $original_iculocale = "";
+my $provider_field = "'c' AS datlocprovider";
+my $iculocale_field = "NULL AS daticulocale";
+if ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes')
+{
+ $provider_field = "datlocprovider";
+ $iculocale_field = "daticulocale";
+ $original_provider = "i";
+ $original_iculocale = "fr-CA";
+}
+
+my @initdb_params = @custom_opts;
+
+push @initdb_params, ('--encoding', 'UTF-8');
+push @initdb_params, ('--locale', $original_locale);
+if ($original_provider eq "i")
+{
+ push @initdb_params, ('--locale-provider', 'icu');
+ push @initdb_params, ('--icu-locale', 'fr-CA');
+}
+
+$node_params{extra} = \@initdb_params;
+$oldnode->init(%node_params);
+$oldnode->start;
+
+my $result;
+$result = $oldnode->safe_psql(
+ 'postgres',
+ "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field
+ FROM pg_database WHERE datname='template0'");
+is( $result,
+ "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale",
+ "check locales in original cluster");
+
+# The default location of the source code is the root of this directory.
+my $srcdir = abs_path("../../..");
+
+# Set up the data of the old instance with a dump or pg_regress.
+if (defined($ENV{olddump}))
+{
+ # Use the dump specified.
+ my $olddumpfile = $ENV{olddump};
+ die "no dump file found!" unless -e $olddumpfile;
+
+ # Load the dump using the "postgres" database as "regression" does
+ # not exist yet, and we are done here.
+ $oldnode->command_ok([ 'psql', '-X', '-f', $olddumpfile, 'postgres' ],
+ 'loaded old dump file');
+}
+else
+{
+ # Default is to use pg_regress to set up the old instance.
+
+ # Create databases with names covering most ASCII bytes. The
+ # first name exercises backslashes adjacent to double quotes, a
+ # Windows special case.
+ generate_db($oldnode, 'regression\\"\\', 1, 45, '\\\\"\\\\\\');
+ generate_db($oldnode, 'regression', 46, 90, '');
+ generate_db($oldnode, 'regression', 91, 127, '');
+
+ # Grab any regression options that may be passed down by caller.
+ my $extra_opts = $ENV{EXTRA_REGRESS_OPTS} || "";
+
+ # --dlpath is needed to be able to find the location of regress.so
+ # and any libraries the regression tests require.
+ my $dlpath = dirname($ENV{REGRESS_SHLIB});
+
+ # --outputdir points to the path where to place the output files.
+ my $outputdir = $PostgreSQL::Test::Utils::tmp_check;
+
+ # --inputdir points to the path of the input files.
+ my $inputdir = "$srcdir/src/test/regress";
+
+ note 'running regression tests in old instance';
+ my $rc =
+ system($ENV{PG_REGRESS}
+ . " $extra_opts "
+ . "--dlpath=\"$dlpath\" "
+ . "--bindir= "
+ . "--host="
+ . $oldnode->host . " "
+ . "--port="
+ . $oldnode->port . " "
+ . "--schedule=$srcdir/src/test/regress/parallel_schedule "
+ . "--max-concurrent-tests=20 "
+ . "--inputdir=\"$inputdir\" "
+ . "--outputdir=\"$outputdir\"");
+ if ($rc != 0)
+ {
+ # Dump out the regression diffs file, if there is one
+ my $diffs = "$outputdir/regression.diffs";
+ if (-e $diffs)
+ {
+ print "=== dumping $diffs ===\n";
+ print slurp_file($diffs);
+ print "=== EOF ===\n";
+ }
+ }
+ is($rc, 0, 'regression tests pass');
+}
+
+# Initialize a new node for the upgrade.
+my $newnode = PostgreSQL::Test::Cluster->new('new_node');
+
+# Reset to original parameters.
+@initdb_params = @custom_opts;
+
+# The new cluster will be initialized with different locale settings,
+# but these settings will be overwritten with those of the original
+# cluster.
+push @initdb_params, ('--encoding', 'SQL_ASCII');
+push @initdb_params, ('--locale-provider', 'libc');
+
+$node_params{extra} = \@initdb_params;
+$newnode->init(%node_params);
+
+my $newbindir = $newnode->config_data('--bindir');
+my $oldbindir = $oldnode->config_data('--bindir');
+
+# Before dumping, get rid of objects not existing or not supported in later
+# versions. This depends on the version of the old server used, and matters
+# only if different major versions are used for the dump.
+if (defined($ENV{oldinstall}))
+{
+ # Consult AdjustUpgrade to find out what we need to do.
+ my $dbnames =
+ $oldnode->safe_psql('postgres', qq(SELECT datname FROM pg_database));
+ my %dbnames;
+ do { $dbnames{$_} = 1; }
+ foreach split /\s+/s, $dbnames;
+ my $adjust_cmds =
+ adjust_database_contents($oldnode->pg_version, %dbnames);
+
+ foreach my $updb (keys %$adjust_cmds)
+ {
+ my $upcmds = join(";\n", @{ $adjust_cmds->{$updb} });
+
+ # For simplicity, use the newer version's psql to issue the commands.
+ $newnode->command_ok(
+ [
+ 'psql', '-X',
+ '-v', 'ON_ERROR_STOP=1',
+ '-c', $upcmds,
+ '-d', $oldnode->connstr($updb),
+ ],
+ "ran version adaptation commands for database $updb");
+ }
+}
+
+# Take a dump before performing the upgrade as a base comparison. Note
+# that we need to use pg_dumpall from the new node here.
+my @dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $oldnode->connstr('postgres'),
+ '-f', $dump1_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump before running pg_upgrade');
+
+# After dumping, update references to the old source tree's regress.so
+# to point to the new tree.
+if (defined($ENV{oldinstall}))
+{
+ # First, fetch all the references to libraries that are not part
+ # of the default path $libdir.
+ my $output = $oldnode->safe_psql('regression',
+ "SELECT DISTINCT probin::text FROM pg_proc WHERE probin NOT LIKE '\$libdir%';"
+ );
+ chomp($output);
+ my @libpaths = split("\n", $output);
+
+ my $dump_data = slurp_file($dump1_file);
+
+ my $newregresssrc = dirname($ENV{REGRESS_SHLIB});
+ foreach (@libpaths)
+ {
+ my $libpath = $_;
+ $libpath = dirname($libpath);
+ $dump_data =~ s/$libpath/$newregresssrc/g;
+ }
+
+ open my $fh, ">", $dump1_file or die "could not open dump file";
+ print $fh $dump_data;
+ close $fh;
+
+ # This replaces any references to the old tree's regress.so
+ # the new tree's regress.so. Any references that do *not*
+ # match $libdir are switched so as this request does not
+ # depend on the path of the old source tree. This is useful
+ # when using an old dump. Do the operation on all the databases
+ # that allow connections so as this includes the regression
+ # database and anything the user has set up.
+ $output = $oldnode->safe_psql('postgres',
+ "SELECT datname FROM pg_database WHERE datallowconn;");
+ chomp($output);
+ my @datnames = split("\n", $output);
+ foreach (@datnames)
+ {
+ my $datname = $_;
+ $oldnode->safe_psql(
+ $datname, "UPDATE pg_proc SET probin =
+ regexp_replace(probin, '.*/', '$newregresssrc/')
+ WHERE probin NOT LIKE '\$libdir/%'");
+ }
+}
+
+# Create an invalid database, will be deleted below
+$oldnode->safe_psql('postgres', qq(
+ CREATE DATABASE regression_invalid;
+ UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid';
+));
+
+# In a VPATH build, we'll be started in the source directory, but we want
+# to run pg_upgrade in the build directory so that any files generated finish
+# in it, like delete_old_cluster.{sh,bat}.
+chdir ${PostgreSQL::Test::Utils::tmp_check};
+
+# Upgrade the instance.
+$oldnode->stop;
+
+# Cause a failure at the start of pg_upgrade, this should create the logging
+# directory pg_upgrade_output.d but leave it around. Keep --check for an
+# early exit.
+command_fails(
+ [
+ 'pg_upgrade', '--no-sync',
+ '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir,
+ '-b', $oldbindir . '/does/not/exist/',
+ '-B', $newbindir,
+ '-s', $newnode->host,
+ '-p', $oldnode->port,
+ '-P', $newnode->port,
+ $mode, '--check',
+ ],
+ 'run of pg_upgrade --check for new instance with incorrect binary path');
+ok(-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ not removed after pg_upgrade failure");
+rmtree($newnode->data_dir . "/pg_upgrade_output.d");
+
+# Check that pg_upgrade aborts when encountering an invalid database
+command_checks_all(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ $mode, '--check',
+ ],
+ 1,
+ [qr/invalid/], # pg_upgrade prints errors on stdout :(
+ [qr//],
+ 'invalid database causes failure');
+rmtree($newnode->data_dir . "/pg_upgrade_output.d");
+
+# And drop it, so we can continue
+$oldnode->start;
+$oldnode->safe_psql('postgres', 'DROP DATABASE regression_invalid');
+$oldnode->stop;
+
+# --check command works here, cleans up pg_upgrade_output.d.
+command_ok(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ $mode, '--check',
+ ],
+ 'run of pg_upgrade --check for new instance');
+ok(!-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ removed after pg_upgrade --check success");
+
+# Actual run, pg_upgrade_output.d is removed at the end.
+command_ok(
+ [
+ 'pg_upgrade', '--no-sync', '-d', $oldnode->data_dir,
+ '-D', $newnode->data_dir, '-b', $oldbindir,
+ '-B', $newbindir, '-s', $newnode->host,
+ '-p', $oldnode->port, '-P', $newnode->port,
+ $mode,
+ ],
+ 'run of pg_upgrade for new instance');
+ok( !-d $newnode->data_dir . "/pg_upgrade_output.d",
+ "pg_upgrade_output.d/ removed after pg_upgrade success");
+
+$newnode->start;
+
+# Check if there are any logs coming from pg_upgrade, that would only be
+# retained on failure.
+my $log_path = $newnode->data_dir . "/pg_upgrade_output.d";
+if (-d $log_path)
+{
+ my @log_files;
+ find(
+ sub {
+ push @log_files, $File::Find::name
+ if $File::Find::name =~ m/.*\.log/;
+ },
+ $newnode->data_dir . "/pg_upgrade_output.d");
+ foreach my $log (@log_files)
+ {
+ note "=== contents of $log ===\n";
+ print slurp_file($log);
+ print "=== EOF ===\n";
+ }
+}
+
+# Test that upgraded cluster has original locale settings.
+$result = $newnode->safe_psql(
+ 'postgres',
+ "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field
+ FROM pg_database WHERE datname='template0'");
+is( $result,
+ "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale",
+ "check that locales in new cluster match original cluster");
+
+# Second dump from the upgraded instance.
+@dump_command = (
+ 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'),
+ '-f', $dump2_file);
+# --extra-float-digits is needed when upgrading from a version older than 11.
+push(@dump_command, '--extra-float-digits', '0')
+ if ($oldnode->pg_version < 12);
+$newnode->command_ok(\@dump_command, 'dump after running pg_upgrade');
+
+# Filter the contents of the dumps.
+my $dump1_filtered = filter_dump(1, $oldnode->pg_version, $dump1_file);
+my $dump2_filtered = filter_dump(0, $oldnode->pg_version, $dump2_file);
+
+# Compare the two dumps, there should be no differences.
+my $compare_res = compare($dump1_filtered, $dump2_filtered);
+is($compare_res, 0, 'old and new dumps match after pg_upgrade');
+
+# Provide more context if the dumps do not match.
+if ($compare_res != 0)
+{
+ my ($stdout, $stderr) =
+ run_command([ 'diff', '-u', $dump1_filtered, $dump2_filtered ]);
+ print "=== diff of $dump1_filtered and $dump2_filtered\n";
+ print "=== stdout ===\n";
+ print $stdout;
+ print "=== stderr ===\n";
+ print $stderr;
+ print "=== EOF ===\n";
+}
+
+done_testing();
diff --git a/src/bin/pg_upgrade/tablespace.c b/src/bin/pg_upgrade/tablespace.c
new file mode 100644
index 0000000..69cef7f
--- /dev/null
+++ b/src/bin/pg_upgrade/tablespace.c
@@ -0,0 +1,111 @@
+/*
+ * tablespace.c
+ *
+ * tablespace functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/tablespace.c
+ */
+
+#include "postgres_fe.h"
+
+#include "pg_upgrade.h"
+
+static void get_tablespace_paths(void);
+static void set_tablespace_directory_suffix(ClusterInfo *cluster);
+
+
+void
+init_tablespaces(void)
+{
+ get_tablespace_paths();
+
+ set_tablespace_directory_suffix(&old_cluster);
+ set_tablespace_directory_suffix(&new_cluster);
+
+ if (os_info.num_old_tablespaces > 0 &&
+ strcmp(old_cluster.tablespace_suffix, new_cluster.tablespace_suffix) == 0)
+ pg_fatal("Cannot upgrade to/from the same system catalog version when\n"
+ "using tablespaces.");
+}
+
+
+/*
+ * get_tablespace_paths()
+ *
+ * Scans pg_tablespace and returns a malloc'ed array of all tablespace
+ * paths. It's the caller's responsibility to free the array.
+ */
+static void
+get_tablespace_paths(void)
+{
+ PGconn *conn = connectToServer(&old_cluster, "template1");
+ PGresult *res;
+ int tblnum;
+ int i_spclocation;
+ char query[QUERY_ALLOC];
+
+ snprintf(query, sizeof(query),
+ "SELECT pg_catalog.pg_tablespace_location(oid) AS spclocation "
+ "FROM pg_catalog.pg_tablespace "
+ "WHERE spcname != 'pg_default' AND "
+ " spcname != 'pg_global'");
+
+ res = executeQueryOrDie(conn, "%s", query);
+
+ if ((os_info.num_old_tablespaces = PQntuples(res)) != 0)
+ os_info.old_tablespaces =
+ (char **) pg_malloc(os_info.num_old_tablespaces * sizeof(char *));
+ else
+ os_info.old_tablespaces = NULL;
+
+ i_spclocation = PQfnumber(res, "spclocation");
+
+ for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
+ {
+ struct stat statBuf;
+
+ os_info.old_tablespaces[tblnum] = pg_strdup(PQgetvalue(res, tblnum, i_spclocation));
+
+ /*
+ * Check that the tablespace path exists and is a directory.
+ * Effectively, this is checking only for tables/indexes in
+ * non-existent tablespace directories. Databases located in
+ * non-existent tablespaces already throw a backend error.
+ * Non-existent tablespace directories can occur when a data directory
+ * that contains user tablespaces is moved as part of pg_upgrade
+ * preparation and the symbolic links are not updated.
+ */
+ if (stat(os_info.old_tablespaces[tblnum], &statBuf) != 0)
+ {
+ if (errno == ENOENT)
+ report_status(PG_FATAL,
+ "tablespace directory \"%s\" does not exist",
+ os_info.old_tablespaces[tblnum]);
+ else
+ report_status(PG_FATAL,
+ "could not stat tablespace directory \"%s\": %s",
+ os_info.old_tablespaces[tblnum], strerror(errno));
+ }
+ if (!S_ISDIR(statBuf.st_mode))
+ report_status(PG_FATAL,
+ "tablespace path \"%s\" is not a directory",
+ os_info.old_tablespaces[tblnum]);
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+}
+
+
+static void
+set_tablespace_directory_suffix(ClusterInfo *cluster)
+{
+ /* This cluster has a version-specific subdirectory */
+
+ /* The leading slash is needed to start a new directory. */
+ cluster->tablespace_suffix = psprintf("/PG_%s_%d",
+ cluster->major_version_str,
+ cluster->controldata.cat_ver);
+}
diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c
new file mode 100644
index 0000000..21ba4c8
--- /dev/null
+++ b/src/bin/pg_upgrade/util.c
@@ -0,0 +1,355 @@
+/*
+ * util.c
+ *
+ * utility functions
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/util.c
+ */
+
+#include "postgres_fe.h"
+
+#include <signal.h>
+
+#include "common/username.h"
+#include "pg_upgrade.h"
+
+LogOpts log_opts;
+
+static void pg_log_v(eLogType type, const char *fmt, va_list ap) pg_attribute_printf(2, 0);
+
+
+/*
+ * report_status()
+ *
+ * Displays the result of an operation (ok, failed, error message,...)
+ *
+ * This is no longer functionally different from pg_log(), but we keep
+ * it around to maintain a notational distinction between operation
+ * results and other messages.
+ */
+void
+report_status(eLogType type, const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(type, fmt, args);
+ va_end(args);
+}
+
+
+void
+end_progress_output(void)
+{
+ /*
+ * For output to a tty, erase prior contents of progress line. When either
+ * tty or verbose, indent so that report_status() output will align
+ * nicely.
+ */
+ if (log_opts.isatty)
+ {
+ printf("\r");
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, "");
+ }
+ else if (log_opts.verbose)
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, "");
+}
+
+/*
+ * Remove any logs generated internally. To be used once when exiting.
+ */
+void
+cleanup_output_dirs(void)
+{
+ fclose(log_opts.internal);
+
+ /* Remove dump and log files? */
+ if (log_opts.retain)
+ return;
+
+ /*
+ * Try twice. The second time might wait for files to finish being
+ * unlinked, on Windows.
+ */
+ if (!rmtree(log_opts.basedir, true))
+ rmtree(log_opts.basedir, true);
+
+ /* Remove pg_upgrade_output.d only if empty */
+ switch (pg_check_dir(log_opts.rootdir))
+ {
+ case 0: /* non-existent */
+ case 3: /* exists and contains a mount point */
+ Assert(false);
+ break;
+
+ case 1: /* exists and empty */
+ case 2: /* exists and contains only dot files */
+
+ /*
+ * Try twice. The second time might wait for files to finish
+ * being unlinked, on Windows.
+ */
+ if (!rmtree(log_opts.rootdir, true))
+ rmtree(log_opts.rootdir, true);
+ break;
+
+ case 4: /* exists */
+
+ /*
+ * Keep the root directory as this includes some past log
+ * activity.
+ */
+ break;
+
+ default:
+ /* different failure, just report it */
+ pg_log(PG_WARNING, "could not access directory \"%s\": %m",
+ log_opts.rootdir);
+ break;
+ }
+}
+
+/*
+ * prep_status
+ *
+ * Displays a message that describes an operation we are about to begin.
+ * We pad the message out to MESSAGE_WIDTH characters so that all of the
+ * "ok" and "failed" indicators line up nicely. (Overlength messages
+ * will be truncated, so don't get too verbose.)
+ *
+ * A typical sequence would look like this:
+ * prep_status("about to flarb the next %d files", fileCount);
+ * if ((message = flarbFiles(fileCount)) == NULL)
+ * report_status(PG_REPORT, "ok");
+ * else
+ * pg_log(PG_FATAL, "failed: %s", message);
+ */
+void
+prep_status(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ /* trim strings */
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, message);
+}
+
+/*
+ * prep_status_progress
+ *
+ * Like prep_status(), but for potentially longer running operations.
+ * Details about what item is currently being processed can be displayed
+ * with pg_log(PG_STATUS, ...). A typical sequence would look like this:
+ *
+ * prep_status_progress("copying files");
+ * for (...)
+ * pg_log(PG_STATUS, "%s", filename);
+ * end_progress_output();
+ * report_status(PG_REPORT, "ok");
+ */
+void
+prep_status_progress(const char *fmt,...)
+{
+ va_list args;
+ char message[MAX_STRING];
+
+ va_start(args, fmt);
+ vsnprintf(message, sizeof(message), fmt, args);
+ va_end(args);
+
+ /*
+ * If outputting to a tty or in verbose, append newline. pg_log_v() will
+ * put the individual progress items onto the next line.
+ */
+ if (log_opts.isatty || log_opts.verbose)
+ pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message);
+ else
+ pg_log(PG_REPORT_NONL, "%-*s", MESSAGE_WIDTH, message);
+}
+
+static void
+pg_log_v(eLogType type, const char *fmt, va_list ap)
+{
+ char message[QUERY_ALLOC];
+
+ /* No incoming message should end in newline; we add that here. */
+ Assert(fmt);
+ Assert(fmt[0] == '\0' || fmt[strlen(fmt) - 1] != '\n');
+
+ vsnprintf(message, sizeof(message), _(fmt), ap);
+
+ /* PG_VERBOSE and PG_STATUS are only output in verbose mode */
+ /* fopen() on log_opts.internal might have failed, so check it */
+ if (((type != PG_VERBOSE && type != PG_STATUS) || log_opts.verbose) &&
+ log_opts.internal != NULL)
+ {
+ if (type == PG_STATUS)
+ /* status messages get two leading spaces, see below */
+ fprintf(log_opts.internal, " %s\n", message);
+ else if (type == PG_REPORT_NONL)
+ fprintf(log_opts.internal, "%s", message);
+ else
+ fprintf(log_opts.internal, "%s\n", message);
+ fflush(log_opts.internal);
+ }
+
+ switch (type)
+ {
+ case PG_VERBOSE:
+ if (log_opts.verbose)
+ printf("%s\n", message);
+ break;
+
+ case PG_STATUS:
+
+ /*
+ * For output to a terminal, we add two leading spaces and no
+ * newline; instead append \r so that the next message is output
+ * on the same line. Truncate on the left to fit into
+ * MESSAGE_WIDTH (counting the spaces as part of that).
+ *
+ * If going to non-interactive output, only display progress if
+ * verbose is enabled. Otherwise the output gets unreasonably
+ * large by default.
+ */
+ if (log_opts.isatty)
+ {
+ bool itfits = (strlen(message) <= MESSAGE_WIDTH - 2);
+
+ /* prefix with "..." if we do leading truncation */
+ printf(" %s%-*.*s\r",
+ itfits ? "" : "...",
+ MESSAGE_WIDTH - 2, MESSAGE_WIDTH - 2,
+ itfits ? message :
+ message + strlen(message) - MESSAGE_WIDTH + 3 + 2);
+ }
+ else if (log_opts.verbose)
+ printf(" %s\n", message);
+ break;
+
+ case PG_REPORT_NONL:
+ /* This option is for use by prep_status and friends */
+ printf("%s", message);
+ break;
+
+ case PG_REPORT:
+ case PG_WARNING:
+ printf("%s\n", message);
+ break;
+
+ case PG_FATAL:
+ /* Extra newline in case we're interrupting status output */
+ printf("\n%s\n", message);
+ printf(_("Failure, exiting\n"));
+ exit(1);
+ break;
+
+ /* No default:, we want a warning for omitted cases */
+ }
+ fflush(stdout);
+}
+
+
+void
+pg_log(eLogType type, const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(type, fmt, args);
+ va_end(args);
+}
+
+
+void
+pg_fatal(const char *fmt,...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ pg_log_v(PG_FATAL, fmt, args);
+ va_end(args);
+ /* NOTREACHED */
+ printf(_("Failure, exiting\n"));
+ exit(1);
+}
+
+
+void
+check_ok(void)
+{
+ /* all seems well */
+ report_status(PG_REPORT, "ok");
+}
+
+
+/*
+ * quote_identifier()
+ * Properly double-quote a SQL identifier.
+ *
+ * The result should be pg_free'd, but most callers don't bother because
+ * memory leakage is not a big deal in this program.
+ */
+char *
+quote_identifier(const char *s)
+{
+ char *result = pg_malloc(strlen(s) * 2 + 3);
+ char *r = result;
+
+ *r++ = '"';
+ while (*s)
+ {
+ if (*s == '"')
+ *r++ = *s;
+ *r++ = *s;
+ s++;
+ }
+ *r++ = '"';
+ *r++ = '\0';
+
+ return result;
+}
+
+
+/*
+ * get_user_info()
+ */
+int
+get_user_info(char **user_name_p)
+{
+ int user_id;
+ const char *user_name;
+ char *errstr;
+
+#ifndef WIN32
+ user_id = geteuid();
+#else
+ user_id = 1;
+#endif
+
+ user_name = get_user_name(&errstr);
+ if (!user_name)
+ pg_fatal("%s", errstr);
+
+ /* make a copy */
+ *user_name_p = pg_strdup(user_name);
+
+ return user_id;
+}
+
+
+/*
+ * str2uint()
+ *
+ * convert string to oid
+ */
+unsigned int
+str2uint(const char *str)
+{
+ return strtoul(str, NULL, 10);
+}
diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c
new file mode 100644
index 0000000..403a6d7
--- /dev/null
+++ b/src/bin/pg_upgrade/version.c
@@ -0,0 +1,461 @@
+/*
+ * version.c
+ *
+ * Postgres-version-specific routines
+ *
+ * Copyright (c) 2010-2023, PostgreSQL Global Development Group
+ * src/bin/pg_upgrade/version.c
+ */
+
+#include "postgres_fe.h"
+
+#include "catalog/pg_class_d.h"
+#include "fe_utils/string_utils.h"
+#include "pg_upgrade.h"
+
+
+/*
+ * check_for_data_types_usage()
+ * Detect whether there are any stored columns depending on given type(s)
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * base_query should be a SELECT yielding a single column named "oid",
+ * containing the pg_type OIDs of one or more types that are known to have
+ * inconsistent on-disk representations across server versions.
+ *
+ * We check for the type(s) in tables, matviews, and indexes, but not views;
+ * there's no storage involved in a view.
+ */
+bool
+check_for_data_types_usage(ClusterInfo *cluster,
+ const char *base_query,
+ const char *output_path)
+{
+ bool found = false;
+ FILE *script = NULL;
+ int dbnum;
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+ PQExpBufferData querybuf;
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname,
+ i_attname;
+
+ /*
+ * The type(s) of interest might be wrapped in a domain, array,
+ * composite, or range, and these container types can be nested (to
+ * varying extents depending on server version, but that's not of
+ * concern here). To handle all these cases we need a recursive CTE.
+ */
+ initPQExpBuffer(&querybuf);
+ appendPQExpBuffer(&querybuf,
+ "WITH RECURSIVE oids AS ( "
+ /* start with the type(s) returned by base_query */
+ " %s "
+ " UNION ALL "
+ " SELECT * FROM ( "
+ /* inner WITH because we can only reference the CTE once */
+ " WITH x AS (SELECT oid FROM oids) "
+ /* domains on any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' "
+ " UNION ALL "
+ /* arrays over any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' "
+ " UNION ALL "
+ /* composite types containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x "
+ " WHERE t.typtype = 'c' AND "
+ " t.oid = c.reltype AND "
+ " c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid = x.oid "
+ " UNION ALL "
+ /* ranges containing any type selected so far */
+ " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x "
+ " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid"
+ " ) foo "
+ ") "
+ /* now look for stored columns of any such type */
+ "SELECT n.nspname, c.relname, a.attname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_namespace n, "
+ " pg_catalog.pg_attribute a "
+ "WHERE c.oid = a.attrelid AND "
+ " NOT a.attisdropped AND "
+ " a.atttypid IN (SELECT oid FROM oids) AND "
+ " c.relkind IN ("
+ CppAsString2(RELKIND_RELATION) ", "
+ CppAsString2(RELKIND_MATVIEW) ", "
+ CppAsString2(RELKIND_INDEX) ") AND "
+ " c.relnamespace = n.oid AND "
+ /* exclude possible orphaned temp tables */
+ " n.nspname !~ '^pg_temp_' AND "
+ " n.nspname !~ '^pg_toast_temp_' AND "
+ /* exclude system catalogs, too */
+ " n.nspname NOT IN ('pg_catalog', 'information_schema')",
+ base_query);
+
+ res = executeQueryOrDie(conn, "%s", querybuf.data);
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ i_attname = PQfnumber(res, "attname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ fprintf(script, "In database: %s\n", active_db->db_name);
+ db_used = true;
+ }
+ fprintf(script, " %s.%s.%s\n",
+ PQgetvalue(res, rowno, i_nspname),
+ PQgetvalue(res, rowno, i_relname),
+ PQgetvalue(res, rowno, i_attname));
+ }
+
+ PQclear(res);
+
+ termPQExpBuffer(&querybuf);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ return found;
+}
+
+/*
+ * check_for_data_type_usage()
+ * Detect whether there are any stored columns depending on the given type
+ *
+ * If so, write a report to the given file name, and return true.
+ *
+ * type_name should be a fully qualified type name. This is just a
+ * trivial wrapper around check_for_data_types_usage() to convert a
+ * type name into a base query.
+ */
+bool
+check_for_data_type_usage(ClusterInfo *cluster,
+ const char *type_name,
+ const char *output_path)
+{
+ bool found;
+ char *base_query;
+
+ base_query = psprintf("SELECT '%s'::pg_catalog.regtype AS oid",
+ type_name);
+
+ found = check_for_data_types_usage(cluster, base_query, output_path);
+
+ free(base_query);
+
+ return found;
+}
+
+
+/*
+ * old_9_3_check_for_line_data_type_usage()
+ * 9.3 -> 9.4
+ * Fully implement the 'line' data type in 9.4, which previously returned
+ * "not enabled" by default and was only functionally enabled with a
+ * compile-time switch; as of 9.4 "line" has a different on-disk
+ * representation format.
+ */
+void
+old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for incompatible \"line\" data type");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_line.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.line", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"line\" data type in user tables.\n"
+ "This data type changed its internal and input/output format\n"
+ "between your old and new versions so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * old_9_6_check_for_unknown_data_type_usage()
+ * 9.6 -> 10
+ * It's no longer allowed to create tables or views with "unknown"-type
+ * columns. We do not complain about views with such columns, because
+ * they should get silently converted to "text" columns during the DDL
+ * dump and reload; it seems unlikely to be worth making users do that
+ * by hand. However, if there's a table with such a column, the DDL
+ * reload will fail, so we should pre-detect that rather than failing
+ * mid-upgrade. Worse, if there's a matview with such a column, the
+ * DDL reload will silently change it to "text" which won't match the
+ * on-disk storage (which is like "cstring"). So we *must* reject that.
+ */
+void
+old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"unknown\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_unknown.txt");
+
+ if (check_for_data_type_usage(cluster, "pg_catalog.unknown", output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"unknown\" data type in user tables.\n"
+ "This data type is no longer allowed in tables, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_9_6_invalidate_hash_indexes()
+ * 9.6 -> 10
+ * Hash index binary format has changed from 9.6->10.0
+ */
+void
+old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode)
+{
+ int dbnum;
+ FILE *script = NULL;
+ bool found = false;
+ char *output_path = "reindex_hash.sql";
+
+ prep_status("Checking for hash indexes");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_nspname,
+ i_relname;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find hash indexes */
+ res = executeQueryOrDie(conn,
+ "SELECT n.nspname, c.relname "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_index i, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"
+ );
+
+ ntups = PQntuples(res);
+ i_nspname = PQfnumber(res, "nspname");
+ i_relname = PQfnumber(res, "relname");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ found = true;
+ if (!check_mode)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "REINDEX INDEX %s.%s;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_nspname)),
+ quote_identifier(PQgetvalue(res, rowno, i_relname)));
+ }
+ }
+
+ PQclear(res);
+
+ if (!check_mode && db_used)
+ {
+ /* mark hash indexes as invalid */
+ PQclear(executeQueryOrDie(conn,
+ "UPDATE pg_catalog.pg_index i "
+ "SET indisvalid = false "
+ "FROM pg_catalog.pg_class c, "
+ " pg_catalog.pg_am a, "
+ " pg_catalog.pg_namespace n "
+ "WHERE i.indexrelid = c.oid AND "
+ " c.relam = a.oid AND "
+ " c.relnamespace = n.oid AND "
+ " a.amname = 'hash'"));
+ }
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ fclose(script);
+
+ if (found)
+ {
+ report_status(PG_WARNING, "warning");
+ if (check_mode)
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. After upgrading, you will be given\n"
+ "REINDEX instructions.");
+ else
+ pg_log(PG_WARNING, "\n"
+ "Your installation contains hash indexes. These indexes have different\n"
+ "internal formats between your old and new clusters, so they must be\n"
+ "reindexed with the REINDEX command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will recreate all invalid\n"
+ "indexes; until then, none of these indexes will be used.",
+ output_path);
+ }
+ else
+ check_ok();
+}
+
+/*
+ * old_11_check_for_sql_identifier_data_type_usage()
+ * 11 -> 12
+ * In 12, the sql_identifier data type was switched from name to varchar,
+ * which does affect the storage (name is by-ref, but not varlena). This
+ * means user tables using sql_identifier for columns are broken because
+ * the on-disk format is different.
+ */
+void
+old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster)
+{
+ char output_path[MAXPGPATH];
+
+ prep_status("Checking for invalid \"sql_identifier\" user columns");
+
+ snprintf(output_path, sizeof(output_path), "%s/%s",
+ log_opts.basedir,
+ "tables_using_sql_identifier.txt");
+
+ if (check_for_data_type_usage(cluster, "information_schema.sql_identifier",
+ output_path))
+ {
+ pg_log(PG_REPORT, "fatal");
+ pg_fatal("Your installation contains the \"sql_identifier\" data type in user tables.\n"
+ "The on-disk format for this data type has changed, so this\n"
+ "cluster cannot currently be upgraded. You can\n"
+ "drop the problem columns and restart the upgrade.\n"
+ "A list of the problem columns is in the file:\n"
+ " %s", output_path);
+ }
+ else
+ check_ok();
+}
+
+
+/*
+ * report_extension_updates()
+ * Report extensions that should be updated.
+ */
+void
+report_extension_updates(ClusterInfo *cluster)
+{
+ int dbnum;
+ FILE *script = NULL;
+ char *output_path = "update_extensions.sql";
+
+ prep_status("Checking for extension updates");
+
+ for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++)
+ {
+ PGresult *res;
+ bool db_used = false;
+ int ntups;
+ int rowno;
+ int i_name;
+ DbInfo *active_db = &cluster->dbarr.dbs[dbnum];
+ PGconn *conn = connectToServer(cluster, active_db->db_name);
+
+ /* find extensions needing updates */
+ res = executeQueryOrDie(conn,
+ "SELECT name "
+ "FROM pg_available_extensions "
+ "WHERE installed_version != default_version"
+ );
+
+ ntups = PQntuples(res);
+ i_name = PQfnumber(res, "name");
+ for (rowno = 0; rowno < ntups; rowno++)
+ {
+ if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL)
+ pg_fatal("could not open file \"%s\": %s", output_path,
+ strerror(errno));
+ if (!db_used)
+ {
+ PQExpBufferData connectbuf;
+
+ initPQExpBuffer(&connectbuf);
+ appendPsqlMetaConnect(&connectbuf, active_db->db_name);
+ fputs(connectbuf.data, script);
+ termPQExpBuffer(&connectbuf);
+ db_used = true;
+ }
+ fprintf(script, "ALTER EXTENSION %s UPDATE;\n",
+ quote_identifier(PQgetvalue(res, rowno, i_name)));
+ }
+
+ PQclear(res);
+
+ PQfinish(conn);
+ }
+
+ if (script)
+ {
+ fclose(script);
+ report_status(PG_REPORT, "notice");
+ pg_log(PG_REPORT, "\n"
+ "Your installation contains extensions that should be updated\n"
+ "with the ALTER EXTENSION command. The file\n"
+ " %s\n"
+ "when executed by psql by the database superuser will update\n"
+ "these extensions.",
+ output_path);
+ }
+ else
+ check_ok();
+}