|
22 | 22 | #include "catalog/namespace.h"
|
23 | 23 | #include "catalog/objectaccess.h"
|
24 | 24 | #include "catalog/pg_collation.h"
|
| 25 | +#include "catalog/pg_database.h" |
25 | 26 | #include "commands/alter.h"
|
26 | 27 | #include "commands/collationcmds.h"
|
27 | 28 | #include "commands/comment.h"
|
@@ -425,33 +426,61 @@ AlterCollation(AlterCollationStmt *stmt)
|
425 | 426 | Datum
|
426 | 427 | pg_collation_actual_version(PG_FUNCTION_ARGS)
|
427 | 428 | {
|
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 */ |
434 | 439 |
|
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))); |
440 | 445 |
|
441 |
| - collprovider = ((Form_pg_collation) GETSTRUCT(tp))->collprovider; |
| 446 | + provider = ((Form_pg_database) GETSTRUCT(dbtup))->datlocprovider; |
442 | 447 |
|
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); |
446 | 452 | 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); |
449 | 458 | }
|
450 | 459 | 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"); |
452 | 477 |
|
453 |
| - ReleaseSysCache(tp); |
| 478 | + locale = TextDatumGetCString(datum); |
| 479 | + |
| 480 | + ReleaseSysCache(colltp); |
| 481 | + } |
454 | 482 |
|
| 483 | + version = get_collation_actual_version(provider, locale); |
455 | 484 | if (version)
|
456 | 485 | PG_RETURN_TEXT_P(cstring_to_text(version));
|
457 | 486 | else
|
|
0 commit comments