diff options
| author | Peter Eisentraut <peter@eisentraut.org> | 2022-02-14 08:09:04 +0100 |
|---|---|---|
| committer | Peter Eisentraut <peter@eisentraut.org> | 2022-02-14 08:27:26 +0100 |
| commit | 37851a8b83d3d57ca48736093b10aa5f3bc0c177 (patch) | |
| tree | 5da6f597063d9579937e80aaf66d92c50ef73029 /src/bin/pg_dump/pg_dump.c | |
| parent | 9898c5e03c40c133a9a01d8b2b36cb7c990b30d5 (diff) | |
| download | postgresql-37851a8b83d3d57ca48736093b10aa5f3bc0c177.tar.gz | |
Database-level collation version tracking
This adds to database objects the same version tracking that collation
objects have. There is a new pg_database column datcollversion that
stores the version, a new function
pg_database_collation_actual_version() to get the version from the
operating system, and a new subcommand ALTER DATABASE ... REFRESH
COLLATION VERSION.
This was not originally added together with pg_collation.collversion,
since originally version tracking was only supported for ICU, and ICU
on a database-level is not currently supported. But we now have
version tracking for glibc (since PG13), FreeBSD (since PG14), and
Windows (since PG13), so this is useful to have now.
Reviewed-by: Julien Rouhaud <rjuju123@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/f0ff3190-29a3-5b39-a179-fa32eee57db6%40enterprisedb.com
Diffstat (limited to 'src/bin/pg_dump/pg_dump.c')
| -rw-r--r-- | src/bin/pg_dump/pg_dump.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 3b4b63d897..4485ea83b1 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -2761,6 +2761,7 @@ dumpDatabase(Archive *fout) i_acldefault, i_datistemplate, i_datconnlimit, + i_datcollversion, i_tablespace; CatalogId dbCatId; DumpId dbDumpId; @@ -2792,6 +2793,10 @@ dumpDatabase(Archive *fout) appendPQExpBuffer(dbQry, "datminmxid, "); else appendPQExpBuffer(dbQry, "0 AS datminmxid, "); + if (fout->remoteVersion >= 150000) + appendPQExpBuffer(dbQry, "datcollversion, "); + else + appendPQExpBuffer(dbQry, "NULL AS datcollversion, "); appendPQExpBuffer(dbQry, "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, " "shobj_description(oid, 'pg_database') AS description " @@ -2813,6 +2818,7 @@ dumpDatabase(Archive *fout) i_acldefault = PQfnumber(res, "acldefault"); i_datistemplate = PQfnumber(res, "datistemplate"); i_datconnlimit = PQfnumber(res, "datconnlimit"); + i_datcollversion = PQfnumber(res, "datcollversion"); i_tablespace = PQfnumber(res, "tablespace"); dbCatId.tableoid = atooid(PQgetvalue(res, 0, i_tableoid)); @@ -2873,6 +2879,21 @@ dumpDatabase(Archive *fout) } /* + * For binary upgrade, carry over the collation version. For normal + * dump/restore, omit the version, so that it is computed upon restore. + */ + if (dopt->binary_upgrade) + { + if (!PQgetisnull(res, 0, i_datcollversion)) + { + appendPQExpBufferStr(creaQry, " COLLATION_VERSION = "); + appendStringLiteralAH(creaQry, + PQgetvalue(res, 0, i_datcollversion), + fout); + } + } + + /* * Note: looking at dopt->outputNoTablespaces here is completely the wrong * thing; the decision whether to specify a tablespace should be left till * pg_restore, so that pg_restore --no-tablespaces applies. Ideally we'd |
