v19-0002-Add-pg_type.typarray-to-the-typcache-s-collectio.patch
text/x-diff
Filename: v19-0002-Add-pg_type.typarray-to-the-typcache-s-collectio.patch
Type: text/x-diff
Part: 1
Message:
Re: general purpose array_sort
Patch
Format: format-patch
Series: patch v19-0002
Subject: Add pg_type.typarray to the typcache's collection of fields.
| File | + | − |
|---|---|---|
| src/backend/utils/adt/array_userfuncs.c | 6 | 11 |
| src/backend/utils/cache/typcache.c | 2 | 0 |
| src/include/utils/typcache.h | 1 | 0 |
From 8992f94b68b4aa6205b222c8e221b0a8c0306c47 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 31 Mar 2025 13:06:40 -0400
Subject: [PATCH v19 2/2] Add pg_type.typarray to the typcache's collection of
fields.
This was not done in bc8036fc6 which added the typarray column,
but I think that was simply an oversight. We generally are
willing to cache simple columns of pg_type in the typcache.
Add it now to simplify array_sort().
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAEG8a3J41a4dpw_-F94fF-JPRXYxw-GfsgoGotKcjs9LVfEEvw@mail.gmail.com
---
src/backend/utils/adt/array_userfuncs.c | 17 ++++++-----------
src/backend/utils/cache/typcache.c | 2 ++
src/include/utils/typcache.h | 1 +
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c
index 2a8ea974029..8eb342e3382 100644
--- a/src/backend/utils/adt/array_userfuncs.c
+++ b/src/backend/utils/adt/array_userfuncs.c
@@ -1930,8 +1930,7 @@ array_sort_internal(ArrayType *array, bool descending, bool nulls_first,
cache_info->array_meta.typalign = typentry->typalign;
cache_info->elem_lt_opr = typentry->lt_opr;
cache_info->elem_gt_opr = typentry->gt_opr;
- /* For some reason the typcache doesn't track array type */
- cache_info->array_type = InvalidOid;
+ cache_info->array_type = typentry->typarray;
}
/* Identify the sort operator to use */
@@ -1944,16 +1943,12 @@ array_sort_internal(ArrayType *array, bool descending, bool nulls_first,
else
{
/* Otherwise we're sorting arrays */
- if (!OidIsValid(cache_info->array_type))
- {
- cache_info->array_type = get_array_type(elmtyp);
- if (!OidIsValid(cache_info->array_type))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("could not find array type for data type %s",
- format_type_be(elmtyp))));
- }
sort_typ = cache_info->array_type;
+ if (!OidIsValid(sort_typ))
+ ereport(ERROR,
+ (errcode(ERRCODE_UNDEFINED_OBJECT),
+ errmsg("could not find array type for data type %s",
+ format_type_be(elmtyp))));
/* We know what operators to use for arrays */
sort_opr = (descending ? ARRAY_GT_OP : ARRAY_LT_OP);
}
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index 5a3b3788d02..ae65a1cce06 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -499,6 +499,7 @@ lookup_type_cache(Oid type_id, int flags)
typentry->typrelid = typtup->typrelid;
typentry->typsubscript = typtup->typsubscript;
typentry->typelem = typtup->typelem;
+ typentry->typarray = typtup->typarray;
typentry->typcollation = typtup->typcollation;
typentry->flags |= TCFLAGS_HAVE_PG_TYPE_DATA;
@@ -544,6 +545,7 @@ lookup_type_cache(Oid type_id, int flags)
typentry->typrelid = typtup->typrelid;
typentry->typsubscript = typtup->typsubscript;
typentry->typelem = typtup->typelem;
+ typentry->typarray = typtup->typarray;
typentry->typcollation = typtup->typcollation;
typentry->flags |= TCFLAGS_HAVE_PG_TYPE_DATA;
diff --git a/src/include/utils/typcache.h b/src/include/utils/typcache.h
index 562a581333a..1cb30f1818c 100644
--- a/src/include/utils/typcache.h
+++ b/src/include/utils/typcache.h
@@ -44,6 +44,7 @@ typedef struct TypeCacheEntry
Oid typrelid;
Oid typsubscript;
Oid typelem;
+ Oid typarray;
Oid typcollation;
/*
--
2.43.5