aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/pg_dump.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2023-03-08 16:35:42 +0100
committerPeter Eisentraut <peter@eisentraut.org>2023-03-08 16:56:37 +0100
commit30a53b792959b36f07200dae246067b3adbcc0b9 (patch)
treeabaa763d759b931b2202bea85ec4800592b31624 /src/bin/pg_dump/pg_dump.c
parentb1534ed99dc35878e1f9300759e4f10893a32d45 (diff)
downloadpostgresql-30a53b792959b36f07200dae246067b3adbcc0b9.tar.gz
postgresql-30a53b792959b36f07200dae246067b3adbcc0b9.zip
Allow tailoring of ICU locales with custom rules
This exposes the ICU facility to add custom collation rules to a standard collation. New options are added to CREATE COLLATION, CREATE DATABASE, createdb, and initdb to set the rules. Reviewed-by: Laurenz Albe <laurenz.albe@cybertec.at> Reviewed-by: Daniel Verite <daniel@manitou-mail.org> Discussion: https://www.postgresql.org/message-id/flat/821c71a4-6ef0-d366-9acf-bb8e367f739f@enterprisedb.com
Diffstat (limited to 'src/bin/pg_dump/pg_dump.c')
-rw-r--r--src/bin/pg_dump/pg_dump.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 74d806c77ba..4217908f84a 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2843,6 +2843,7 @@ dumpDatabase(Archive *fout)
i_collate,
i_ctype,
i_daticulocale,
+ i_daticurules,
i_frozenxid,
i_minmxid,
i_datacl,
@@ -2861,6 +2862,7 @@ dumpDatabase(Archive *fout)
*collate,
*ctype,
*iculocale,
+ *icurules,
*datistemplate,
*datconnlimit,
*tablespace;
@@ -2887,6 +2889,10 @@ dumpDatabase(Archive *fout)
appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale, datcollversion, ");
else
appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, ");
+ if (fout->remoteVersion >= 160000)
+ appendPQExpBufferStr(dbQry, "daticurules, ");
+ else
+ appendPQExpBufferStr(dbQry, "NULL AS daticurules, ");
appendPQExpBufferStr(dbQry,
"(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
"shobj_description(oid, 'pg_database') AS description "
@@ -2904,6 +2910,7 @@ dumpDatabase(Archive *fout)
i_collate = PQfnumber(res, "datcollate");
i_ctype = PQfnumber(res, "datctype");
i_daticulocale = PQfnumber(res, "daticulocale");
+ i_daticurules = PQfnumber(res, "daticurules");
i_frozenxid = PQfnumber(res, "datfrozenxid");
i_minmxid = PQfnumber(res, "datminmxid");
i_datacl = PQfnumber(res, "datacl");
@@ -2925,6 +2932,10 @@ dumpDatabase(Archive *fout)
iculocale = PQgetvalue(res, 0, i_daticulocale);
else
iculocale = NULL;
+ if (!PQgetisnull(res, 0, i_daticurules))
+ icurules = PQgetvalue(res, 0, i_daticurules);
+ else
+ icurules = NULL;
frozenxid = atooid(PQgetvalue(res, 0, i_frozenxid));
minmxid = atooid(PQgetvalue(res, 0, i_minmxid));
dbdacl.acl = PQgetvalue(res, 0, i_datacl);
@@ -2990,6 +3001,11 @@ dumpDatabase(Archive *fout)
appendPQExpBufferStr(creaQry, " ICU_LOCALE = ");
appendStringLiteralAH(creaQry, iculocale, fout);
}
+ if (icurules)
+ {
+ appendPQExpBufferStr(creaQry, " ICU_RULES = ");
+ appendStringLiteralAH(creaQry, icurules, fout);
+ }
/*
* For binary upgrade, carry over the collation version. For normal
@@ -13153,10 +13169,12 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
int i_collcollate;
int i_collctype;
int i_colliculocale;
+ int i_collicurules;
const char *collprovider;
const char *collcollate;
const char *collctype;
const char *colliculocale;
+ const char *collicurules;
/* Do nothing in data-only dump */
if (dopt->dataOnly)
@@ -13194,6 +13212,13 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
appendPQExpBufferStr(query,
"NULL AS colliculocale, ");
+ if (fout->remoteVersion >= 160000)
+ appendPQExpBufferStr(query,
+ "collicurules, ");
+ else
+ appendPQExpBufferStr(query,
+ "NULL AS collicurules, ");
+
appendPQExpBuffer(query,
"collcollate, "
"collctype "
@@ -13208,6 +13233,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
i_collcollate = PQfnumber(res, "collcollate");
i_collctype = PQfnumber(res, "collctype");
i_colliculocale = PQfnumber(res, "colliculocale");
+ i_collicurules = PQfnumber(res, "collicurules");
collprovider = PQgetvalue(res, 0, i_collprovider);
@@ -13226,6 +13252,11 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
else
colliculocale = NULL;
+ if (!PQgetisnull(res, 0, i_collicurules))
+ collicurules = PQgetvalue(res, 0, i_collicurules);
+ else
+ collicurules = NULL;
+
appendPQExpBuffer(delq, "DROP COLLATION %s;\n",
fmtQualifiedDumpable(collinfo));
@@ -13271,6 +13302,12 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
}
}
+ if (collicurules)
+ {
+ appendPQExpBufferStr(q, ", rules = ");
+ appendStringLiteralAH(q, collicurules, fout);
+ }
+
/*
* For binary upgrade, carry over the collation version. For normal
* dump/restore, omit the version, so that it is computed upon restore.