diff options
author | Jeff Davis <jdavis@postgresql.org> | 2024-12-02 23:20:32 -0800 |
---|---|---|
committer | Jeff Davis <jdavis@postgresql.org> | 2024-12-02 23:24:35 -0800 |
commit | 1ba0782ce90cb4261098de59b49ae5cb2326566b (patch) | |
tree | af0b1a9d72bb582f0871a1171428a0635b434636 /src/backend/utils/adt/pg_locale_builtin.c | |
parent | 8817e8d3a4e5f00a5583e56a17f5d49a4e21dafd (diff) | |
download | postgresql-1ba0782ce90cb4261098de59b49ae5cb2326566b.tar.gz postgresql-1ba0782ce90cb4261098de59b49ae5cb2326566b.zip |
Perform provider-specific initialization in new functions.
Reviewed-by: Andreas Karlsson
Discussion: https://postgr.es/m/4548a168-62cd-457b-8d06-9ba7b985c477@proxel.se
Diffstat (limited to 'src/backend/utils/adt/pg_locale_builtin.c')
-rw-r--r-- | src/backend/utils/adt/pg_locale_builtin.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/backend/utils/adt/pg_locale_builtin.c b/src/backend/utils/adt/pg_locale_builtin.c new file mode 100644 index 00000000000..4246971a4d8 --- /dev/null +++ b/src/backend/utils/adt/pg_locale_builtin.c @@ -0,0 +1,70 @@ +/*----------------------------------------------------------------------- + * + * PostgreSQL locale utilities for builtin provider + * + * Portions Copyright (c) 2002-2024, PostgreSQL Global Development Group + * + * src/backend/utils/adt/pg_locale_builtin.c + * + *----------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "catalog/pg_database.h" +#include "catalog/pg_collation.h" +#include "mb/pg_wchar.h" +#include "miscadmin.h" +#include "utils/builtins.h" +#include "utils/memutils.h" +#include "utils/pg_locale.h" +#include "utils/syscache.h" + +extern pg_locale_t create_pg_locale_builtin(Oid collid, + MemoryContext context); + +pg_locale_t +create_pg_locale_builtin(Oid collid, MemoryContext context) +{ + const char *locstr; + pg_locale_t result; + + if (collid == DEFAULT_COLLATION_OID) + { + HeapTuple tp; + Datum datum; + + tp = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for database %u", MyDatabaseId); + datum = SysCacheGetAttrNotNull(DATABASEOID, tp, + Anum_pg_database_datlocale); + locstr = TextDatumGetCString(datum); + ReleaseSysCache(tp); + } + else + { + HeapTuple tp; + Datum datum; + + tp = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for collation %u", collid); + datum = SysCacheGetAttrNotNull(COLLOID, tp, + Anum_pg_collation_colllocale); + locstr = TextDatumGetCString(datum); + ReleaseSysCache(tp); + } + + builtin_validate_locale(GetDatabaseEncoding(), locstr); + + result = MemoryContextAllocZero(context, sizeof(struct pg_locale_struct)); + + result->info.builtin.locale = MemoryContextStrdup(context, locstr); + result->provider = COLLPROVIDER_BUILTIN; + result->deterministic = true; + result->collate_is_c = true; + result->ctype_is_c = (strcmp(locstr, "C") == 0); + + return result; +} |