Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1c461a8

Browse files
committed
Refactor: make default_locale internal to pg_locale.c.
Discussion:https://postgr.es/m/2228884bb1f1a02614b39f71a90c94d2cc8a3a2f.camel@j-davis.comReviewed-by: Peter Eisentraut, Andreas Karlsson
1 parent005c6b8 commit1c461a8

File tree

3 files changed

+72
-43
lines changed

3 files changed

+72
-43
lines changed

‎src/backend/utils/adt/pg_locale.c

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656

5757
#include"access/htup_details.h"
5858
#include"catalog/pg_collation.h"
59+
#include"catalog/pg_database.h"
5960
#include"common/hashfn.h"
6061
#include"mb/pg_wchar.h"
6162
#include"miscadmin.h"
@@ -116,6 +117,8 @@ char *localized_full_months[12 + 1];
116117
/* is the databases's LC_CTYPE the C locale? */
117118
booldatabase_ctype_is_c= false;
118119

120+
staticstructpg_locale_structdefault_locale;
121+
119122
/* indicates whether locale information cache is valid */
120123
staticboolCurrentLocaleConvValid= false;
121124
staticboolCurrentLCTimeValid= false;
@@ -1458,8 +1461,6 @@ lc_ctype_is_c(Oid collation)
14581461
return (lookup_collation_cache(collation, true))->ctype_is_c;
14591462
}
14601463

1461-
structpg_locale_structdefault_locale;
1462-
14631464
void
14641465
make_icu_collator(constchar*iculocstr,
14651466
constchar*icurules,
@@ -1554,7 +1555,69 @@ pg_locale_deterministic(pg_locale_t locale)
15541555
}
15551556

15561557
/*
1557-
* Create a locale_t from a collation OID. Results are cached for the
1558+
* Initialize default_locale with database locale settings.
1559+
*/
1560+
void
1561+
init_database_collation(void)
1562+
{
1563+
HeapTupletup;
1564+
Form_pg_databasedbform;
1565+
Datumdatum;
1566+
boolisnull;
1567+
1568+
/* Fetch our pg_database row normally, via syscache */
1569+
tup=SearchSysCache1(DATABASEOID,ObjectIdGetDatum(MyDatabaseId));
1570+
if (!HeapTupleIsValid(tup))
1571+
elog(ERROR,"cache lookup failed for database %u",MyDatabaseId);
1572+
dbform= (Form_pg_database)GETSTRUCT(tup);
1573+
1574+
if (dbform->datlocprovider==COLLPROVIDER_BUILTIN)
1575+
{
1576+
char*datlocale;
1577+
1578+
datum=SysCacheGetAttrNotNull(DATABASEOID,tup,Anum_pg_database_datlocale);
1579+
datlocale=TextDatumGetCString(datum);
1580+
1581+
builtin_validate_locale(dbform->encoding,datlocale);
1582+
1583+
default_locale.info.builtin.locale=MemoryContextStrdup(
1584+
TopMemoryContext,datlocale);
1585+
}
1586+
elseif (dbform->datlocprovider==COLLPROVIDER_ICU)
1587+
{
1588+
char*datlocale;
1589+
char*icurules;
1590+
1591+
datum=SysCacheGetAttrNotNull(DATABASEOID,tup,Anum_pg_database_datlocale);
1592+
datlocale=TextDatumGetCString(datum);
1593+
1594+
datum=SysCacheGetAttr(DATABASEOID,tup,Anum_pg_database_daticurules,&isnull);
1595+
if (!isnull)
1596+
icurules=TextDatumGetCString(datum);
1597+
else
1598+
icurules=NULL;
1599+
1600+
make_icu_collator(datlocale,icurules,&default_locale);
1601+
}
1602+
else
1603+
{
1604+
Assert(dbform->datlocprovider==COLLPROVIDER_LIBC);
1605+
}
1606+
1607+
default_locale.provider=dbform->datlocprovider;
1608+
1609+
/*
1610+
* Default locale is currently always deterministic. Nondeterministic
1611+
* locales currently don't support pattern matching, which would break a
1612+
* lot of things if applied globally.
1613+
*/
1614+
default_locale.deterministic= true;
1615+
1616+
ReleaseSysCache(tup);
1617+
}
1618+
1619+
/*
1620+
* Create a pg_locale_t from a collation OID. Results are cached for the
15581621
* lifetime of the backend. Thus, do not free the result with freelocale().
15591622
*
15601623
* As a special optimization, the default/database collation returns 0.

‎src/backend/utils/init/postinit.c

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
318318
boolisnull;
319319
char*collate;
320320
char*ctype;
321-
char*datlocale;
322321

323322
/* Fetch our pg_database row normally, via syscache */
324323
tup=SearchSysCache1(DATABASEOID,ObjectIdGetDatum(MyDatabaseId));
@@ -423,42 +422,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
423422
strcmp(ctype,"POSIX")==0)
424423
database_ctype_is_c= true;
425424

426-
if (dbform->datlocprovider==COLLPROVIDER_BUILTIN)
427-
{
428-
datum=SysCacheGetAttrNotNull(DATABASEOID,tup,Anum_pg_database_datlocale);
429-
datlocale=TextDatumGetCString(datum);
430-
431-
builtin_validate_locale(dbform->encoding,datlocale);
432-
433-
default_locale.info.builtin.locale=MemoryContextStrdup(
434-
TopMemoryContext,datlocale);
435-
}
436-
elseif (dbform->datlocprovider==COLLPROVIDER_ICU)
437-
{
438-
char*icurules;
439-
440-
datum=SysCacheGetAttrNotNull(DATABASEOID,tup,Anum_pg_database_datlocale);
441-
datlocale=TextDatumGetCString(datum);
442-
443-
datum=SysCacheGetAttr(DATABASEOID,tup,Anum_pg_database_daticurules,&isnull);
444-
if (!isnull)
445-
icurules=TextDatumGetCString(datum);
446-
else
447-
icurules=NULL;
448-
449-
make_icu_collator(datlocale,icurules,&default_locale);
450-
}
451-
else
452-
datlocale=NULL;
453-
454-
default_locale.provider=dbform->datlocprovider;
455-
456-
/*
457-
* Default locale is currently always deterministic. Nondeterministic
458-
* locales currently don't support pattern matching, which would break a
459-
* lot of things if applied globally.
460-
*/
461-
default_locale.deterministic= true;
425+
init_database_collation();
462426

463427
/*
464428
* Check collation version. See similar code in
@@ -478,7 +442,10 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect
478442
if (dbform->datlocprovider==COLLPROVIDER_LIBC)
479443
locale=collate;
480444
else
481-
locale=datlocale;
445+
{
446+
datum=SysCacheGetAttrNotNull(DATABASEOID,tup,Anum_pg_database_datlocale);
447+
locale=TextDatumGetCString(datum);
448+
}
482449

483450
actual_versionstr=get_collation_actual_version(dbform->datlocprovider,locale);
484451
if (!actual_versionstr)

‎src/include/utils/pg_locale.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,12 @@ struct pg_locale_struct
9393

9494
typedefstructpg_locale_struct*pg_locale_t;
9595

96-
externPGDLLIMPORTstructpg_locale_structdefault_locale;
97-
9896
externvoidmake_icu_collator(constchar*iculocstr,
9997
constchar*icurules,
10098
structpg_locale_struct*resultp);
10199

102100
externboolpg_locale_deterministic(pg_locale_tlocale);
101+
externvoidinit_database_collation(void);
103102
externpg_locale_tpg_newlocale_from_collation(Oidcollid);
104103

105104
externchar*get_collation_actual_version(charcollprovider,constchar*collcollate);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp