CREATE USER user_name PASSWORD (SELECT random_string((SELECT random_int_between(5,15))));
Не думаю, что такое извращение возможно. По крайнер мере
документация по CREATE ROLE явно допуская только PASSWORD NULL или PASSWORD 'qwerty', без выражений или тем более SQL запросов.
Далее
Non-optimizable SQL commands (also called utility commands) are not capable of accepting query parameters. So automatic substitution of PL/pgSQL variables does not work in such commands. To include non-constant text in a utility command executed from PL/pgSQL, you must build the utility command as a string and then EXECUTE it, as discussed in Section 43.5.4.
https://www.postgresql.org/docs/current/plpgsql-st...
Т.е. вы не можете в команду CREATE USER вставить переменную plpgsql. Ваша команда просто интерпетируется как будто вы хотите создать юзера с именем user_name. Аналогично ведет себя GRANT.
Пароль лучше сгенерить в переменную, а эти команды надо выполнять через EXECUTE, примерно так:
SELECT random_string(SELECT random_int_between(5,15)) INTO pass;
EXECUTE format('CREATE USER %I PASSWORD %L', user_name, pass);
EXECUTE format('GRANT %I TO %I', role_name, user_name);