Now, I am testing subscribing on the jsonb feature, and I found one issue, that is not supported by parser.
When the target is scalar, then all is ok. But we can have a plpgsql array of jsonb values.
postgres=# do $$ declare j jsonb[]; begin j[1] = '{"b":"Ahoj"}'; raise notice '%', j; raise notice '%', (j[1])['b']; end $$; NOTICE: {"{\"b\": \"Ahoj\"}"} NOTICE: "Ahoj" DO
Parenthesis work well in expressions, but are not supported on the left side of assignment.
postgres=# do $$ declare j jsonb[]; begin (j[1])['b'] = '"Ahoj"'; raise notice '%', j; raise notice '%', j[1]['b']; end $$; ERROR: syntax error at or near "(" LINE 4: (j[1])['b'] = '"Ahoj"'; ^
Assignment for nesting composite types is working better - although there is some inconsistency too:
create type t_inner as (x int, y int);
create type t_outer as (a t_inner, b t_inner);
do $$ declare v t_outer; begin v.a.x := 10; -- parenthesis not allowed here, but not required raise notice '%', v; raise notice '%', (v).a.x; -- parenthesis are required here end; $$;