Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 10932ed

Browse files
committed
Enable pg_collation_actual_version() to work on the default collation.
Previously, it would simply return NULL, which was less useful. Discussion: https://postgr.es/m/51fb77507cafd43fc1a2e733c23045873d93ae60.camel%40j-davis.com Reviewed-by: Thomas Munro
1 parent 6e10631 commit 10932ed

File tree

1 file changed

+48
-19
lines changed

1 file changed

+48
-19
lines changed

src/backend/commands/collationcmds.c

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "catalog/namespace.h"
2323
#include "catalog/objectaccess.h"
2424
#include "catalog/pg_collation.h"
25+
#include "catalog/pg_database.h"
2526
#include "commands/alter.h"
2627
#include "commands/collationcmds.h"
2728
#include "commands/comment.h"
@@ -425,33 +426,61 @@ AlterCollation(AlterCollationStmt *stmt)
425426
Datum
426427
pg_collation_actual_version(PG_FUNCTION_ARGS)
427428
{
428-
Oid collid = PG_GETARG_OID(0);
429-
HeapTuple tp;
430-
char collprovider;
431-
Datum datum;
432-
bool isnull;
433-
char *version;
429+
Oid collid = PG_GETARG_OID(0);
430+
char provider;
431+
char *locale;
432+
char *version;
433+
Datum datum;
434+
bool isnull;
435+
436+
if (collid == DEFAULT_COLLATION_OID)
437+
{
438+
/* retrieve from pg_database */
434439

435-
tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid));
436-
if (!HeapTupleIsValid(tp))
437-
ereport(ERROR,
438-
(errcode(ERRCODE_UNDEFINED_OBJECT),
439-
errmsg("collation with OID %u does not exist", collid)));
440+
HeapTuple dbtup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId));
441+
if (!HeapTupleIsValid(dbtup))
442+
ereport(ERROR,
443+
(errcode(ERRCODE_UNDEFINED_OBJECT),
444+
errmsg("database with OID %u does not exist", MyDatabaseId)));
440445

441-
collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider;
446+
provider = ((Form_pg_database) GETSTRUCT(dbtup))->datlocprovider;
442447

443-
if (collprovider != COLLPROVIDER_DEFAULT)
444-
{
445-
datum = SysCacheGetAttr(COLLOID, tp, collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate, &isnull);
448+
datum = SysCacheGetAttr(DATABASEOID, dbtup,
449+
provider == COLLPROVIDER_ICU ?
450+
Anum_pg_database_daticulocale : Anum_pg_database_datcollate,
451+
&isnull);
446452
if (isnull)
447-
elog(ERROR, "unexpected null in pg_collation");
448-
version = get_collation_actual_version(collprovider, TextDatumGetCString(datum));
453+
elog(ERROR, "unexpected null in pg_database");
454+
455+
locale = TextDatumGetCString(datum);
456+
457+
ReleaseSysCache(dbtup);
449458
}
450459
else
451-
version = NULL;
460+
{
461+
/* retrieve from pg_collation */
462+
463+
HeapTuple colltp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid));
464+
if (!HeapTupleIsValid(colltp))
465+
ereport(ERROR,
466+
(errcode(ERRCODE_UNDEFINED_OBJECT),
467+
errmsg("collation with OID %u does not exist", collid)));
468+
469+
provider = ((Form_pg_collation) GETSTRUCT(colltp))->collprovider;
470+
Assert(provider != COLLPROVIDER_DEFAULT);
471+
datum = SysCacheGetAttr(COLLOID, colltp,
472+
provider == COLLPROVIDER_ICU ?
473+
Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate,
474+
&isnull);
475+
if (isnull)
476+
elog(ERROR, "unexpected null in pg_collation");
452477

453-
ReleaseSysCache(tp);
478+
locale = TextDatumGetCString(datum);
479+
480+
ReleaseSysCache(colltp);
481+
}
454482

483+
version = get_collation_actual_version(provider, locale);
455484
if (version)
456485
PG_RETURN_TEXT_P(cstring_to_text(version));
457486
else

0 commit comments

Comments
 (0)