|
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 |
| -Oidcollid=PG_GETARG_OID(0); |
429 |
| -HeapTupletp; |
430 |
| -charcollprovider; |
431 |
| -Datumdatum; |
432 |
| -boolisnull; |
433 |
| -char*version; |
| 429 | +Oidcollid=PG_GETARG_OID(0); |
| 430 | +charprovider; |
| 431 | +char*locale; |
| 432 | +char*version; |
| 433 | +Datumdatum; |
| 434 | +boolisnull; |
| 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 | +HeapTupledbtup=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 | +HeapTuplecolltp=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
|
|