@@ -13415,6 +13415,18 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
13415
13415
else
13416
13416
collctype = NULL;
13417
13417
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
+
13418
13430
if (!PQgetisnull(res, 0, i_colliculocale))
13419
13431
colliculocale = PQgetvalue(res, 0, i_colliculocale);
13420
13432
else
@@ -13446,35 +13458,60 @@ dumpCollation(Archive *fout, const CollInfo *collinfo)
13446
13458
if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0)
13447
13459
appendPQExpBufferStr(q, ", deterministic = false");
13448
13460
13449
- if (colliculocale != NULL )
13461
+ if (collprovider[0] == 'd' )
13450
13462
{
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 */
13453
13467
}
13454
- else
13468
+ else if (collprovider[0] == 'i')
13455
13469
{
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);
13458
13474
13459
- if (strcmp(collcollate, collctype) == 0)
13475
+ appendPQExpBufferStr(q, ", locale = ");
13476
+ appendStringLiteralAH(q, colliculocale ? colliculocale : "",
13477
+ fout);
13478
+ }
13479
+ else
13460
13480
{
13481
+ if (!collcollate || !collctype || colliculocale ||
13482
+ strcmp(collcollate, collctype) != 0)
13483
+ pg_log_warning("invalid collation \"%s\"", qcollname);
13484
+
13461
13485
appendPQExpBufferStr(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);
13463
13504
}
13464
13505
else
13465
13506
{
13466
13507
appendPQExpBufferStr(q, ", lc_collate = ");
13467
- appendStringLiteralAH(q, collcollate, fout);
13508
+ appendStringLiteralAH(q, collcollate ? collcollate : "" , fout);
13468
13509
appendPQExpBufferStr(q, ", lc_ctype = ");
13469
- appendStringLiteralAH(q, collctype, fout);
13510
+ appendStringLiteralAH(q, collctype ? collctype : "" , fout);
13470
13511
}
13471
13512
}
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]);
13478
13515
13479
13516
/*
13480
13517
* For binary upgrade, carry over the collation version. For normal
0 commit comments