@ -117,7 +117,7 @@ static bool get_db_info(const char *name, LOCKMODE lockmode,
Oid * dbIdP , Oid * ownerIdP ,
Oid * dbIdP , Oid * ownerIdP ,
int * encodingP , bool * dbIsTemplateP , bool * dbAllowConnP , bool * dbHasLoginEvtP ,
int * encodingP , bool * dbIsTemplateP , bool * dbAllowConnP , bool * dbHasLoginEvtP ,
TransactionId * dbFrozenXidP , MultiXactId * dbMinMultiP ,
TransactionId * dbFrozenXidP , MultiXactId * dbMinMultiP ,
Oid * dbTablespace , char * * dbCollate , char * * dbCtype , char * * dbIcul ocale ,
Oid * dbTablespace , char * * dbCollate , char * * dbCtype , char * * dbL ocale ,
char * * dbIcurules ,
char * * dbIcurules ,
char * dbLocProvider ,
char * dbLocProvider ,
char * * dbCollversion ) ;
char * * dbCollversion ) ;
@ -674,7 +674,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
int src_encoding = - 1 ;
int src_encoding = - 1 ;
char * src_collate = NULL ;
char * src_collate = NULL ;
char * src_ctype = NULL ;
char * src_ctype = NULL ;
char * src_icu locale = NULL ;
char * src_locale = NULL ;
char * src_icurules = NULL ;
char * src_icurules = NULL ;
char src_locprovider = ' \0 ' ;
char src_locprovider = ' \0 ' ;
char * src_collversion = NULL ;
char * src_collversion = NULL ;
@ -712,7 +712,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
const char * dbtemplate = NULL ;
const char * dbtemplate = NULL ;
char * dbcollate = NULL ;
char * dbcollate = NULL ;
char * dbctype = NULL ;
char * dbctype = NULL ;
char * dbicu locale = NULL ;
char * dblocale = NULL ;
char * dbicurules = NULL ;
char * dbicurules = NULL ;
char dblocprovider = ' \0 ' ;
char dblocprovider = ' \0 ' ;
char * canonname ;
char * canonname ;
@ -902,7 +902,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
if ( dctype & & dctype - > arg )
if ( dctype & & dctype - > arg )
dbctype = defGetString ( dctype ) ;
dbctype = defGetString ( dctype ) ;
if ( diculocale & & diculocale - > arg )
if ( diculocale & & diculocale - > arg )
dbicu locale = defGetString ( diculocale ) ;
dblocale = defGetString ( diculocale ) ;
if ( dicurules & & dicurules - > arg )
if ( dicurules & & dicurules - > arg )
dbicurules = defGetString ( dicurules ) ;
dbicurules = defGetString ( dicurules ) ;
if ( dlocprovider & & dlocprovider - > arg )
if ( dlocprovider & & dlocprovider - > arg )
@ -970,7 +970,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
& src_dboid , & src_owner , & src_encoding ,
& src_dboid , & src_owner , & src_encoding ,
& src_istemplate , & src_allowconn , & src_hasloginevt ,
& src_istemplate , & src_allowconn , & src_hasloginevt ,
& src_frozenxid , & src_minmxid , & src_deftablespace ,
& src_frozenxid , & src_minmxid , & src_deftablespace ,
& src_collate , & src_ctype , & src_icu locale , & src_icurules , & src_locprovider ,
& src_collate , & src_ctype , & src_locale , & src_icurules , & src_locprovider ,
& src_collversion ) )
& src_collversion ) )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_UNDEFINED_DATABASE ) ,
( errcode ( ERRCODE_UNDEFINED_DATABASE ) ,
@ -1026,12 +1026,12 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
dbctype = src_ctype ;
dbctype = src_ctype ;
if ( dblocprovider = = ' \0 ' )
if ( dblocprovider = = ' \0 ' )
dblocprovider = src_locprovider ;
dblocprovider = src_locprovider ;
if ( dbicu locale = = NULL & & dblocprovider = = COLLPROVIDER_ICU )
if ( dblocale = = NULL & & dblocprovider = = COLLPROVIDER_ICU )
{
{
if ( dlocale & & dlocale - > arg )
if ( dlocale & & dlocale - > arg )
dbicu locale = defGetString ( dlocale ) ;
dblocale = defGetString ( dlocale ) ;
else
else
dbicu locale = src_icu locale ;
dblocale = src_locale ;
}
}
if ( dbicurules = = NULL & & dblocprovider = = COLLPROVIDER_ICU )
if ( dbicurules = = NULL & & dblocprovider = = COLLPROVIDER_ICU )
dbicurules = src_icurules ;
dbicurules = src_icurules ;
@ -1070,7 +1070,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
* This would happen if template0 uses the libc provider but the new
* This would happen if template0 uses the libc provider but the new
* database uses icu .
* database uses icu .
*/
*/
if ( ! dbicu locale )
if ( ! dblocale )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " LOCALE or ICU_LOCALE must be specified " ) ) ) ;
errmsg ( " LOCALE or ICU_LOCALE must be specified " ) ) ) ;
@ -1080,26 +1080,26 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
* database , preserve locale string . Otherwise , canonicalize to a
* database , preserve locale string . Otherwise , canonicalize to a
* language tag .
* language tag .
*/
*/
if ( ! IsBinaryUpgrade & & dbicu locale ! = src_icu locale )
if ( ! IsBinaryUpgrade & & dblocale ! = src_locale )
{
{
char * langtag = icu_language_tag ( dbicu locale ,
char * langtag = icu_language_tag ( dblocale ,
icu_validation_level ) ;
icu_validation_level ) ;
if ( langtag & & strcmp ( dbicu locale , langtag ) ! = 0 )
if ( langtag & & strcmp ( dblocale , langtag ) ! = 0 )
{
{
ereport ( NOTICE ,
ereport ( NOTICE ,
( errmsg ( " using standard form \" %s \" for ICU locale \" %s \" " ,
( errmsg ( " using standard form \" %s \" for ICU locale \" %s \" " ,
langtag , dbicu locale ) ) ) ;
langtag , dblocale ) ) ) ;
dbicu locale = langtag ;
dblocale = langtag ;
}
}
}
}
icu_validate_locale ( dbicu locale ) ;
icu_validate_locale ( dblocale ) ;
}
}
else
else
{
{
if ( dbicu locale )
if ( dblocale )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_OBJECT_DEFINITION ) ,
( errcode ( ERRCODE_INVALID_OBJECT_DEFINITION ) ,
errmsg ( " ICU locale cannot be specified unless locale provider is ICU " ) ) ) ;
errmsg ( " ICU locale cannot be specified unless locale provider is ICU " ) ) ) ;
@ -1156,13 +1156,13 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
char * val1 ;
char * val1 ;
char * val2 ;
char * val2 ;
Assert ( dbicu locale ) ;
Assert ( dblocale ) ;
Assert ( src_icu locale ) ;
Assert ( src_locale ) ;
if ( strcmp ( dbicu locale , src_icu locale ) ! = 0 )
if ( strcmp ( dblocale , src_locale ) ! = 0 )
ereport ( ERROR ,
ereport ( ERROR ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
( errcode ( ERRCODE_INVALID_PARAMETER_VALUE ) ,
errmsg ( " new ICU locale (%s) is incompatible with the ICU locale of the template database (%s) " ,
errmsg ( " new ICU locale (%s) is incompatible with the ICU locale of the template database (%s) " ,
dbicu locale , src_icu locale ) ,
dblocale , src_locale ) ,
errhint ( " Use the same ICU locale as in the template database, or use template0 as template. " ) ) ) ;
errhint ( " Use the same ICU locale as in the template database, or use template0 as template. " ) ) ) ;
val1 = dbicurules ;
val1 = dbicurules ;
@ -1196,7 +1196,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
{
{
char * actual_versionstr ;
char * actual_versionstr ;
actual_versionstr = get_collation_actual_version ( dblocprovider , dblocprovider = = COLLPROVIDER_ICU ? dbicu locale : dbcollate ) ;
actual_versionstr = get_collation_actual_version ( dblocprovider , dblocprovider = = COLLPROVIDER_ICU ? dblocale : dbcollate ) ;
if ( ! actual_versionstr )
if ( ! actual_versionstr )
ereport ( ERROR ,
ereport ( ERROR ,
( errmsg ( " template database \" %s \" has a collation version, but no actual collation version could be determined " ,
( errmsg ( " template database \" %s \" has a collation version, but no actual collation version could be determined " ,
@ -1224,7 +1224,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
* collation version , which is normally only the case for template0 .
* collation version , which is normally only the case for template0 .
*/
*/
if ( dbcollversion = = NULL )
if ( dbcollversion = = NULL )
dbcollversion = get_collation_actual_version ( dblocprovider , dblocprovider = = COLLPROVIDER_ICU ? dbicu locale : dbcollate ) ;
dbcollversion = get_collation_actual_version ( dblocprovider , dblocprovider = = COLLPROVIDER_ICU ? dblocale : dbcollate ) ;
/* Resolve default tablespace for new database */
/* Resolve default tablespace for new database */
if ( dtablespacename & & dtablespacename - > arg )
if ( dtablespacename & & dtablespacename - > arg )
@ -1363,8 +1363,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
* block on the unique index , and fail after we commit ) .
* block on the unique index , and fail after we commit ) .
*/
*/
Assert ( ( dblocprovider = = COLLPROVIDER_ICU & & dbicu locale ) | |
Assert ( ( dblocprovider = = COLLPROVIDER_ICU & & dblocale ) | |
( dblocprovider ! = COLLPROVIDER_ICU & & ! dbicu locale ) ) ;
( dblocprovider ! = COLLPROVIDER_ICU & & ! dblocale ) ) ;
/* Form tuple */
/* Form tuple */
new_record [ Anum_pg_database_oid - 1 ] = ObjectIdGetDatum ( dboid ) ;
new_record [ Anum_pg_database_oid - 1 ] = ObjectIdGetDatum ( dboid ) ;
@ -1382,10 +1382,10 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt)
new_record [ Anum_pg_database_dattablespace - 1 ] = ObjectIdGetDatum ( dst_deftablespace ) ;
new_record [ Anum_pg_database_dattablespace - 1 ] = ObjectIdGetDatum ( dst_deftablespace ) ;
new_record [ Anum_pg_database_datcollate - 1 ] = CStringGetTextDatum ( dbcollate ) ;
new_record [ Anum_pg_database_datcollate - 1 ] = CStringGetTextDatum ( dbcollate ) ;
new_record [ Anum_pg_database_datctype - 1 ] = CStringGetTextDatum ( dbctype ) ;
new_record [ Anum_pg_database_datctype - 1 ] = CStringGetTextDatum ( dbctype ) ;
if ( dbicu locale )
if ( dblocale )
new_record [ Anum_pg_database_daticu locale - 1 ] = CStringGetTextDatum ( dbicu locale ) ;
new_record [ Anum_pg_database_datlocale - 1 ] = CStringGetTextDatum ( dblocale ) ;
else
else
new_record_nulls [ Anum_pg_database_daticu locale - 1 ] = true ;
new_record_nulls [ Anum_pg_database_datlocale - 1 ] = true ;
if ( dbicurules )
if ( dbicurules )
new_record [ Anum_pg_database_daticurules - 1 ] = CStringGetTextDatum ( dbicurules ) ;
new_record [ Anum_pg_database_daticurules - 1 ] = CStringGetTextDatum ( dbicurules ) ;
else
else
@ -2471,7 +2471,7 @@ AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt)
datum = heap_getattr ( tuple , Anum_pg_database_datcollversion , RelationGetDescr ( rel ) , & isnull ) ;
datum = heap_getattr ( tuple , Anum_pg_database_datcollversion , RelationGetDescr ( rel ) , & isnull ) ;
oldversion = isnull ? NULL : TextDatumGetCString ( datum ) ;
oldversion = isnull ? NULL : TextDatumGetCString ( datum ) ;
datum = heap_getattr ( tuple , datForm - > datlocprovider = = COLLPROVIDER_ICU ? Anum_pg_database_daticu locale : Anum_pg_database_datcollate , RelationGetDescr ( rel ) , & isnull ) ;
datum = heap_getattr ( tuple , datForm - > datlocprovider = = COLLPROVIDER_ICU ? Anum_pg_database_datlocale : Anum_pg_database_datcollate , RelationGetDescr ( rel ) , & isnull ) ;
if ( isnull )
if ( isnull )
elog ( ERROR , " unexpected null in pg_database " ) ;
elog ( ERROR , " unexpected null in pg_database " ) ;
newversion = get_collation_actual_version ( datForm - > datlocprovider , TextDatumGetCString ( datum ) ) ;
newversion = get_collation_actual_version ( datForm - > datlocprovider , TextDatumGetCString ( datum ) ) ;
@ -2669,7 +2669,7 @@ pg_database_collation_actual_version(PG_FUNCTION_ARGS)
datlocprovider = ( ( Form_pg_database ) GETSTRUCT ( tp ) ) - > datlocprovider ;
datlocprovider = ( ( Form_pg_database ) GETSTRUCT ( tp ) ) - > datlocprovider ;
datum = SysCacheGetAttrNotNull ( DATABASEOID , tp , datlocprovider = = COLLPROVIDER_ICU ? Anum_pg_database_daticu locale : Anum_pg_database_datcollate ) ;
datum = SysCacheGetAttrNotNull ( DATABASEOID , tp , datlocprovider = = COLLPROVIDER_ICU ? Anum_pg_database_datlocale : Anum_pg_database_datcollate ) ;
version = get_collation_actual_version ( datlocprovider , TextDatumGetCString ( datum ) ) ;
version = get_collation_actual_version ( datlocprovider , TextDatumGetCString ( datum ) ) ;
ReleaseSysCache ( tp ) ;
ReleaseSysCache ( tp ) ;
@ -2696,7 +2696,7 @@ get_db_info(const char *name, LOCKMODE lockmode,
Oid * dbIdP , Oid * ownerIdP ,
Oid * dbIdP , Oid * ownerIdP ,
int * encodingP , bool * dbIsTemplateP , bool * dbAllowConnP , bool * dbHasLoginEvtP ,
int * encodingP , bool * dbIsTemplateP , bool * dbAllowConnP , bool * dbHasLoginEvtP ,
TransactionId * dbFrozenXidP , MultiXactId * dbMinMultiP ,
TransactionId * dbFrozenXidP , MultiXactId * dbMinMultiP ,
Oid * dbTablespace , char * * dbCollate , char * * dbCtype , char * * dbIcul ocale ,
Oid * dbTablespace , char * * dbCollate , char * * dbCtype , char * * dbL ocale ,
char * * dbIcurules ,
char * * dbIcurules ,
char * dbLocProvider ,
char * dbLocProvider ,
char * * dbCollversion )
char * * dbCollversion )
@ -2807,13 +2807,13 @@ get_db_info(const char *name, LOCKMODE lockmode,
datum = SysCacheGetAttrNotNull ( DATABASEOID , tuple , Anum_pg_database_datctype ) ;
datum = SysCacheGetAttrNotNull ( DATABASEOID , tuple , Anum_pg_database_datctype ) ;
* dbCtype = TextDatumGetCString ( datum ) ;
* dbCtype = TextDatumGetCString ( datum ) ;
}
}
if ( dbIcul ocale )
if ( dbL ocale )
{
{
datum = SysCacheGetAttr ( DATABASEOID , tuple , Anum_pg_database_daticu locale , & isnull ) ;
datum = SysCacheGetAttr ( DATABASEOID , tuple , Anum_pg_database_datlocale , & isnull ) ;
if ( isnull )
if ( isnull )
* dbIcul ocale = NULL ;
* dbL ocale = NULL ;
else
else
* dbIcul ocale = TextDatumGetCString ( datum ) ;
* dbL ocale = TextDatumGetCString ( datum ) ;
}
}
if ( dbIcurules )
if ( dbIcurules )
{
{