Eu discuti isso na lista de discussão do PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) e fui informado sobre o motivo do comportamento.
A resposta deles é que "..você tem que colocar aspas duplas nos relnames (ouvir "Test"). se você quiser que o servidor não os dobre. pg_notify pega uma string, não arelname, que usa regras diferentes." (Obrigado Merlin e Tom)
Isso significa que o seguinte funciona porque o canal é sempre forçado a usar letras minúsculas
LISTEN ERRORCHANNEL;
NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';
Se você adicionar aspas duplas ao redor do nome do canal, o caso será mantido.
Assim, com o seguinte, você receberia a primeira notificação, mas não a segunda:
LISTEN "ERRORCHANNEL";
NOTIFY "ERRORCHANNEL", 'something!';
NOTIFY "eRrorChanNel", 'something!';
Da mesma forma, o seguinte funcionará porque as aspas duplas forçam o caso de ERRORCHANNEL a ser mantido:
LISTEN "ERRORCHANNEL";
SELECT pg_notify('ERRORCHANNEL', 'something!');
Enquanto isso não funcionará:
LISTEN ERRORCHANNEL;
SELECT pg_notify('ERRORCHANNEL', 'something!');
Nesta situação, ERRORCHANNEL não está entre aspas duplas no comando LISTEN, então o PostgreSQL o força para letras minúsculas. O parâmetro channel é do tipo text em vez de relname, então o caso é deixado intocado na função pg_notify(). Juntos, os canais não coincidem (ERRORCHANNE !=errorchannel) então a notificação nunca é recebida.