Clarify the ra != rb case in compareJsonbContainers().
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Jul 2025 22:21:12 +0000 (18:21 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Jul 2025 22:21:12 +0000 (18:21 -0400)
It's impossible to reach this case with either ra or rb being
WJB_DONE, because our earlier checks that the structure and
length of the inputs match should guarantee that we reach their
ends simultaneously.  However, the comment completely fails to
explain this, and the Asserts don't cover it either.  The comment
is pretty obscure anyway, so rewrite it, and extend the Asserts
to reject WJB_DONE.

This is only cosmetic, so no need for back-patch.

Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: http://postgr.es/m/0c623e8a204187b87b4736792398eaf1@postgrespro.ru

src/backend/utils/adt/jsonb_util.c

index 136952861e14f8fbc0f927c0a399f83b20bb8b68..82b807d067a3417cf2cbc0c426746f6aa55f7c94 100644 (file)
@@ -277,19 +277,16 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b)
        else
        {
            /*
-            * If the two values were of the same container type, then there'd
-            * have been a chance to observe the variation in the number of
-            * elements/pairs (when processing WJB_BEGIN_OBJECT, say). They're
-            * either two heterogeneously-typed containers, or a container and
-            * some scalar type.
-            *
-            * We don't have to consider the WJB_END_ARRAY and WJB_END_OBJECT
-            * cases here, because we would have seen the corresponding
-            * WJB_BEGIN_ARRAY and WJB_BEGIN_OBJECT tokens first, and
-            * concluded that they don't match.
+            * It's not possible for one iterator to report end of array or
+            * object while the other one reports something else, because we
+            * would have detected a length mismatch when we processed the
+            * container-start tokens above.  Likewise we can't see WJB_DONE
+            * from one but not the other.  So we have two different-type
+            * containers, or a container and some scalar type, or two
+            * different scalar types.  Sort on the basis of the type code.
             */
-           Assert(ra != WJB_END_ARRAY && ra != WJB_END_OBJECT);
-           Assert(rb != WJB_END_ARRAY && rb != WJB_END_OBJECT);
+           Assert(ra != WJB_DONE && ra != WJB_END_ARRAY && ra != WJB_END_OBJECT);
+           Assert(rb != WJB_DONE && rb != WJB_END_ARRAY && rb != WJB_END_OBJECT);
 
            Assert(va.type != vb.type);
            Assert(va.type != jbvBinary);