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