From 9c2da9e477c2f178da8257a3b0e6e503070171ef Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Tue, 26 Aug 2025 13:14:18 +0800 Subject: [PATCH] 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 --- 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 9399cdb491ad..b826d1c0b339 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -161,12 +161,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);