>
>
> 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

Reply via email to