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

