summaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
authorJeff Davis <jdavis@postgresql.org>2025-11-04 16:28:07 -0800
committerJeff Davis <jdavis@postgresql.org>2025-11-04 16:48:16 -0800
commitd115de9d89164e87269d73d4f0f1368f06ebdd5e (patch)
tree9769fb4572102ece03db044d1f07d7535f708b56 /src/backend/utils
parent8ae0f6a0c3da4b1568b753906eb8ea34d41da251 (diff)
Special case C_COLLATION_OID in pg_newlocale_from_collation().
Allow pg_newlocale_from_collation(C_COLLATION_OID) to work even if there's no catalog access, which some extensions expect. Not known to be a bug without extensions involved, but backport to 18. Also corrects an issue in master with dummy_c_locale (introduced in commit 5a38104b36) where deterministic was not set. That wasn't a bug, but could have been if that structure was used more widely. Reported-by: Alexander Kukushkin <cyberdemn@gmail.com> Reviewed-by: Alexander Kukushkin <cyberdemn@gmail.com> Discussion: https://postgr.es/m/CAFh8B=nj966ECv5vi_u3RYij12v0j-7NPZCXLYzNwOQp9AcPWQ@mail.gmail.com Backpatch-through: 18
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/adt/pg_locale.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index 67299c55ed8..b14c7837938 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -106,6 +106,12 @@ static pg_locale_t default_locale = NULL;
static bool CurrentLocaleConvValid = false;
static bool CurrentLCTimeValid = false;
+static struct pg_locale_struct c_locale = {
+ .deterministic = true,
+ .collate_is_c = true,
+ .ctype_is_c = true,
+};
+
/* Cache for collation-related knowledge */
typedef struct
@@ -1185,6 +1191,13 @@ pg_newlocale_from_collation(Oid collid)
if (collid == DEFAULT_COLLATION_OID)
return default_locale;
+ /*
+ * Some callers expect C_COLLATION_OID to succeed even without catalog
+ * access.
+ */
+ if (collid == C_COLLATION_OID)
+ return &c_locale;
+
if (!OidIsValid(collid))
elog(ERROR, "cache lookup failed for collation %u", collid);