@@ -13415,6 +13415,18 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
1341513415else
1341613416collctype = NULL;
1341713417
13418+ /*
13419+ * Before version 15, collcollate and collctype were of type NAME and
13420+ * non-nullable. Treat empty strings as NULL for consistency.
13421+ */
13422+ if (fout->remoteVersion < 150000)
13423+ {
13424+ if (collcollate[0] == '\0')
13425+ collcollate = NULL;
13426+ if (collctype[0] == '\0')
13427+ collctype = NULL;
13428+ }
13429+
1341813430if (!PQgetisnull(res, 0, i_colliculocale))
1341913431colliculocale = PQgetvalue(res, 0, i_colliculocale);
1342013432else
@@ -13446,35 +13458,60 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
1344613458if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0)
1344713459appendPQExpBufferStr(q, ", deterministic = false");
1344813460
13449- if (colliculocale != NULL )
13461+ if (collprovider[0] == 'd' )
1345013462{
13451- appendPQExpBufferStr(q, ", locale = ");
13452- appendStringLiteralAH(q, colliculocale, fout);
13463+ if (collcollate || collctype || colliculocale || collicurules)
13464+ pg_log_warning("invalid collation \"%s\"", qcollname);
13465+
13466+ /* no locale -- the default collation cannot be reloaded anyway */
1345313467}
13454- else
13468+ else if (collprovider[0] == 'i')
1345513469{
13456- Assert(collcollate != NULL);
13457- Assert(collctype != NULL);
13470+ if (fout->remoteVersion >= 150000)
13471+ {
13472+ if (collcollate || collctype || !colliculocale)
13473+ pg_log_warning("invalid collation \"%s\"", qcollname);
1345813474
13459- if (strcmp(collcollate, collctype) == 0)
13475+ appendPQExpBufferStr(q, ", locale = ");
13476+ appendStringLiteralAH(q, colliculocale ? colliculocale : "",
13477+ fout);
13478+ }
13479+ else
1346013480{
13481+ if (!collcollate || !collctype || colliculocale ||
13482+ strcmp(collcollate, collctype) != 0)
13483+ pg_log_warning("invalid collation \"%s\"", qcollname);
13484+
1346113485appendPQExpBufferStr(q, ", locale = ");
13462- appendStringLiteralAH(q, collcollate, fout);
13486+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
13487+ }
13488+
13489+ if (collicurules)
13490+ {
13491+ appendPQExpBufferStr(q, ", rules = ");
13492+ appendStringLiteralAH(q, collicurules ? collicurules : "", fout);
13493+ }
13494+ }
13495+ else if (collprovider[0] == 'c')
13496+ {
13497+ if (colliculocale || collicurules || !collcollate || !collctype)
13498+ pg_log_warning("invalid collation \"%s\"", qcollname);
13499+
13500+ if (collcollate && collctype && strcmp(collcollate, collctype) == 0)
13501+ {
13502+ appendPQExpBufferStr(q, ", locale = ");
13503+ appendStringLiteralAH(q, collcollate ? collcollate : "", fout);
1346313504}
1346413505else
1346513506{
1346613507appendPQExpBufferStr(q, ", lc_collate = ");
13467- appendStringLiteralAH(q, collcollate, fout);
13508+ appendStringLiteralAH(q, collcollate ? collcollate : "" , fout);
1346813509appendPQExpBufferStr(q, ", lc_ctype = ");
13469- appendStringLiteralAH(q, collctype, fout);
13510+ appendStringLiteralAH(q, collctype ? collctype : "" , fout);
1347013511}
1347113512}
13472-
13473- if (collicurules)
13474- {
13475- appendPQExpBufferStr(q, ", rules = ");
13476- appendStringLiteralAH(q, collicurules, fout);
13477- }
13513+ else
13514+ pg_fatal("unrecognized collation provider '%c'", collprovider[0]);
1347813515
1347913516/*
1348013517 * For binary upgrade, carry over the collation version. For normal