Re: Extract numeric filed in JSONB more effectively

Andy Fan <zhihui.fan1213@gmail.com>

From: Andy Fan <zhihui.fan1213@gmail.com>
To: Chapman Flack <chap@anastigmatix.net>
Cc: jian he <jian.universality@gmail.com>, Pavel Stehule <pavel.stehule@gmail.com>, Tom Lane <tgl@sss.pgh.pa.us>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2023-08-21T10:58:05Z
Lists: pgsql-hackers
>
>
> Interestingly, when I relabel both places, like this:
>
>      Oid   targetOid = fexpr->funcresulttype;
>      Const *target  = makeConst(
>        OIDOID, -1, InvalidOid, sizeof(Oid),
>        ObjectIdGetDatum(targetOid), false, true);
>      RelabelType *rTarget = makeRelabelType((Expr *)target,
>        INTERNALOID, -1, InvalidOid, COERCE_IMPLICIT_CAST);
>      fexpr->funcid = new_func_id;
>      fexpr->args = opexpr->args;
>      fexpr->args = list_insert_nth(fexpr->args, 0, rTarget);
>      expr = (Expr *)makeRelabelType((Expr *)fexpr,
>        targetOid, -1, InvalidOid, COERCE_IMPLICIT_CAST);
>    }
>    PG_RETURN_POINTER(expr);
>
> EXPLAIN looks like this:
>
>   Seq Scan on pg_temp.test_jsonb
>     Output: jsonb_array_element_type(('23'::oid)::internal, test_json,
> 0), (test_json -> 0)
>     Filter: (test_jsonb.json_type = 'scalarint'::text)
>
> With COERCE_IMPLICIT_CAST both places, the relabeling of the
> function result is invisible, but the relabeling of the argument
> is visible.
>
>
I think this is because get_rule_expr's showimplicit is always
true for args in this case, checking the implementation of
get_rule_expr, I found PG behavior like this in many places.

-- 
Best Regards
Andy Fan

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Add trailing commas to enum definitions