public inbox for [email protected]
help / color / mirror / Atom feedFrom: Dirkjan Bussink <[email protected]>
To: [email protected]
Subject: JSON_SERIALIZE for JSONB returns parts of the internal JSONB representation
Date: Tue, 3 Mar 2026 16:02:08 +0100
Message-ID: <[email protected]> (raw)
Hi,
When running a query like this (tested against PostgreSQL 18.3), it shows internals from the JSONB storage:
postgres=# select JSON_SERIALIZE('[1,2,4]'::jsonb);
json_serialize
----------------
\x03
(1 row)
I think this qualifies as a bug? I would expect JSON_SERIALIZE to either work with JSONB and here output the serialized text, so '[1,2,4]', or to error that JSONB is not supported for this function (or that this function can’t even be found for a JSONB argument).
What happens here is that json_out treats the internal bytes from the JSONB representation as a C string.
From src/include/utils/jsonb.h:
* ... For that purpose, both an array and an object begin with a uint32
* header field, which contains an JB_FOBJECT or JB_FARRAY flag.
This is part of the header:
typedef struct JsonbContainer
{
uint32 header; /* number of elements or key/value pairs, and
* flags */
JEntry children[FLEXIBLE_ARRAY_MEMBER];
/* the data for each child node follows. */
} JsonbContainer;
The rest of the header contains the number of elements, in this case a JSON array of 3 elements. So the total header looks like
uint32(JB_FARRAY | 3) == 0x40000003
So this also explains the \x03 output above. What is seen there is the first byte of the header there as little endian, since that is interpreted as a C string with the a 0 byte that happens to be after there.
--
Cheers,
Dirkjan
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected]
Subject: Re: JSON_SERIALIZE for JSONB returns parts of the internal JSONB representation
In-Reply-To: <[email protected]>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox