While exploring the jsonb code, I noticed that in datum_to_jsonb_internal, the tcategory checks compares against JSONTYPE_JSON twice. There's no reason for that, right?
... Ok, so, to try to answer my own question, I went looking at the history, and this comes from "Unify JSON categorize type API and export for external use" [0]. Specifically, the change was - (tcategory == JSONBTYPE_ARRAY || - tcategory == JSONBTYPE_COMPOSITE || - tcategory == JSONBTYPE_JSON || - tcategory == JSONBTYPE_JSONB || - tcategory == JSONBTYPE_JSONCAST)) + (tcategory == JSONTYPE_ARRAY || + tcategory == JSONTYPE_COMPOSITE || + tcategory == JSONTYPE_JSON || + tcategory == JSONTYPE_JSONB || + tcategory == JSONTYPE_JSON)) So "JSONBTYPE_JSONCAST" turned into "JSONTYPE_JSON". Should that have been "JSONTYPE_CAST" (that seems to be the corresponding value in the new enum) instead? Thanks, Maciek [0]: https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3c152a27b06313fe27bd47079658f928e291986b