IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

Started by jian he5 months ago8 messageshackers
Jump to latest
#1jian he
jian.universality@gmail.com

hi.

src/backend/executor/execExpr.c

case T_JsonIsPredicate:
{
JsonIsPredicate *pred = (JsonIsPredicate *) node;
ExecInitExprRec((Expr *) pred->expr, state, resv, resnull);
scratch.opcode = EEOP_IS_JSON;
scratch.d.is_json.pred = pred;
ExprEvalPushStep(state, &scratch);
break;
}

gram.y:
a_expr IS json_predicate_type_constraint

the above shows the a_expr will be transformed and then evaluated.
The exprType type of a_expr as domain should work just fine.
The attached patch implements this, and it seems to be quite straightforward.
(extensive regress tests added)

CREATE DOMAIN jd1 AS JSON CHECK ((VALUE ->'a')::text <> '3');
CREATE DOMAIN jd2 AS JSONB CHECK ((VALUE ->'a') = '1'::jsonb);
CREATE DOMAIN jd4 AS bytea CHECK (VALUE <> '\x61');
SELECT NULL::jd1 IS JSON;
SELECT NULL::jd2 IS JSON;
SELECT NULL::jd4 IS JSON;

in the master, the above 3 IS JSON would return error,
with the attached patch, it will return NULL.

I checked the discussion links [1]https://git.postgresql.org/cgit/postgresql.git/commit/?id=6ee30209a6f161d0a267a33f090c70c579c87c00, but couldn’t find the reason domains aren’t
supported. I guess at that time, we didn't think about this issue.

[1]: https://git.postgresql.org/cgit/postgresql.git/commit/?id=6ee30209a6f161d0a267a33f090c70c579c87c00

--
jian
https://www.enterprisedb.com/

Attachments:

v1-0001-IS-JSON-predicate-work-with-domain-type.patchtext/x-patch; charset=US-ASCII; name=v1-0001-IS-JSON-predicate-work-with-domain-type.patchDownload+346-13
#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: jian he (#1)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

jian he <jian.universality@gmail.com> writes:

[ v1-0001-IS-JSON-predicate-work-with-domain-type.patch ]

This looks like a large patch with a small patch struggling to
get out of it. Why didn't you simply do

-	*exprtype = exprType(expr);
+	*exprtype = getBaseType(exprType(expr));

in transformJsonParseArg?

regards, tom lane

#3jian he
jian.universality@gmail.com
In reply to: Tom Lane (#2)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

On Wed, Nov 19, 2025 at 1:01 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:

jian he <jian.universality@gmail.com> writes:

[ v1-0001-IS-JSON-predicate-work-with-domain-type.patch ]

This looks like a large patch with a small patch struggling to
get out of it. Why didn't you simply do

-       *exprtype = exprType(expr);
+       *exprtype = getBaseType(exprType(expr));

in transformJsonParseArg?

yech.
While at it, I added parser_errposition to the transformJsonIsPredicate ereport.

errmsg("cannot use type %s in IS JSON predicate",
format_type_be(exprtype))
we don't need to worry about exprtype as InvalidOid, because
transformJsonParseArg (exprType(expr)) would fail already in that case.

--
jian
https://www.enterprisedb.com/

Attachments:

v2-0001-IS-JSON-predicate-work-with-domain-type.patchtext/x-patch; charset=US-ASCII; name=v2-0001-IS-JSON-predicate-work-with-domain-type.patchDownload+356-10
#4jian he
jian.universality@gmail.com
In reply to: jian he (#3)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

Hi.

The regression test was very verbose; I removed some of it.
Also polished function ExecEvalJsonIsPredicate a little bit.

--
jian
https://www.enterprisedb.com/

Attachments:

v3-0001-IS-JSON-predicate-work-with-domain-type.patchtext/x-patch; charset=US-ASCII; name=v3-0001-IS-JSON-predicate-work-with-domain-type.patchDownload+287-16
#5Andrew Dunstan
andrew@dunslane.net
In reply to: jian he (#4)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

On 2026-03-12 Th 11:55 PM, jian he wrote:

Hi.

The regression test was very verbose; I removed some of it.
Also polished function ExecEvalJsonIsPredicate a little bit.

Here's a v4. I changed resultBaseType to exprBaseType - I think it's
clearer. I also trimmed the tests a bit more, and dropped the new
objects after testing them. The  error message now shows the domain name
rather than the underlying base type. I think that's more useful.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

Attachments:

v4-0001-Allow-IS-JSON-predicate-to-work-with-domain-types.patchtext/x-patch; charset=UTF-8; name=v4-0001-Allow-IS-JSON-predicate-to-work-with-domain-types.patchDownload+105-18
#6Kirill Reshke
reshkekirill@gmail.com
In reply to: Andrew Dunstan (#5)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

On Fri, 13 Mar 2026 at 17:30, Andrew Dunstan <andrew@dunslane.net> wrote:

On 2026-03-12 Th 11:55 PM, jian he wrote:

Hi.

The regression test was very verbose; I removed some of it.
Also polished function ExecEvalJsonIsPredicate a little bit.

Here's a v4. I changed resultBaseType to exprBaseType - I think it's
clearer. I also trimmed the tests a bit more, and dropped the new
objects after testing them. The error message now shows the domain name
rather than the underlying base type. I think that's more useful.

Hi!
V4 looks good. The only thing that I cannot explain is removing the
`exprtype` variable inside ExecEvalJsonIsPredicate. We can just change
its declaration to

exprtype = pred->exprBaseType if i'm not mistaken?

Anyway, LGTM

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

--
Best regards,
Kirill Reshke

#7Andrew Dunstan
andrew@dunslane.net
In reply to: Kirill Reshke (#6)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

On 2026-03-13 Fr 9:16 AM, Kirill Reshke wrote:

On Fri, 13 Mar 2026 at 17:30, Andrew Dunstan <andrew@dunslane.net> wrote:

On 2026-03-12 Th 11:55 PM, jian he wrote:

Hi.

The regression test was very verbose; I removed some of it.
Also polished function ExecEvalJsonIsPredicate a little bit.

Here's a v4. I changed resultBaseType to exprBaseType - I think it's
clearer. I also trimmed the tests a bit more, and dropped the new
objects after testing them. The error message now shows the domain name
rather than the underlying base type. I think that's more useful.

Hi!
V4 looks good. The only thing that I cannot explain is removing the
`exprtype` variable inside ExecEvalJsonIsPredicate. We can just change
its declaration to

exprtype = pred->exprBaseType if i'm not mistaken?

Yeah, we can do that.

Anyway, LGTM

Thanks for reviewing.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com

#8Andrew Dunstan
andrew@dunslane.net
In reply to: Andrew Dunstan (#7)
Re: IS JSON predicate support for domain base type as JSON/JSONB/BYTEA/TEXT

On 2026-03-13 Fr 9:47 AM, Andrew Dunstan wrote:

On 2026-03-13 Fr 9:16 AM, Kirill Reshke wrote:

On Fri, 13 Mar 2026 at 17:30, Andrew Dunstan <andrew@dunslane.net>
wrote:

On 2026-03-12 Th 11:55 PM, jian he wrote:

Hi.

The regression test was very verbose; I removed some of it.
Also polished function ExecEvalJsonIsPredicate a little bit.

Here's a v4. I changed resultBaseType to exprBaseType - I think it's
clearer. I also trimmed the tests a bit more, and dropped the new
objects after testing them. The  error message now shows the domain
name
rather than the underlying base type. I think that's more useful.

Hi!
V4 looks good. The only thing that I cannot explain is removing the
`exprtype` variable inside ExecEvalJsonIsPredicate. We can just change
its declaration to

exprtype =  pred->exprBaseType if i'm not mistaken?

Yeah, we can do that.

Anyway, LGTM

Committed with that change.

cheers

andrew

--
Andrew Dunstan
EDB: https://www.enterprisedb.com