From a97a2107bf0f86eddf7afc24b09b7f6a51e2ff98 Mon Sep 17 00:00:00 2001
From: "Chao Li (Evan)" <lic@highgo.com>
Date: Tue, 26 Aug 2025 13:14:18 +0800
Subject: [PATCH v2] jsonb: Optimize JsonbContainerTypeName by reordering type
 checks

The JsonbContainerTypeName() function currently checks for the less
common scalar container type before checking for objects and arrays.

This commit reorders the checks to prioritize the most common cases. The
macros JsonContainerIsArray() and JsonContainerIsObject() are
simple bit checks and are now evaluated first. This avoids the
overhead of calling the JsonbExtractScalar() function in the vast
majority of use cases.

Author: Chao Li <lic@highgo.com>
---
 src/backend/utils/adt/jsonb.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c
index da94d424d61..311b0558bfc 100644
--- a/src/backend/utils/adt/jsonb.c
+++ b/src/backend/utils/adt/jsonb.c
@@ -160,12 +160,12 @@ JsonbContainerTypeName(JsonbContainer *jbc)
 {
 	JsonbValue	scalar;
 
-	if (JsonbExtractScalar(jbc, &scalar))
-		return JsonbTypeName(&scalar);
-	else if (JsonContainerIsArray(jbc))
-		return "array";
-	else if (JsonContainerIsObject(jbc))
+	if (JsonContainerIsObject(jbc))
 		return "object";
+	else if (!JsonContainerIsScalar(jbc) && JsonContainerIsArray(jbc))
+		return "array";
+	else if (JsonbExtractScalar(jbc, &scalar))
+		return JsonbTypeName(&scalar);
 	else
 	{
 		elog(ERROR, "invalid jsonb container type: 0x%08x", jbc->header);
-- 
2.39.5 (Apple Git-154)

