Ne ho discusso sulla mailing list di PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) e sono stato informato sul ragionamento del comportamento.
La loro risposta è che "..devi citare due volte i relnames (ascolta "Test"). se vuoi che il server non li pieghi tra maiuscole e minuscole. pg_notify prende una stringa, non arelname, che usa regole diverse." (Grazie Merlino e Tom)
Ciò significa che quanto segue funziona perché il canale è sempre forzato in minuscolo
LISTEN ERRORCHANNEL;
NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';
Se dovessi aggiungere virgolette intorno al nome del canale, il caso verrebbe mantenuto.
Quindi, con quanto segue, riceverai la prima notifica ma non la seconda:
LISTEN "ERRORCHANNEL";
NOTIFY "ERRORCHANNEL", 'something!';
NOTIFY "eRrorChanNel", 'something!';
Allo stesso modo, quanto segue funzionerà perché le doppie virgolette obbligano a mantenere il caso di ERRORCHANNEL:
LISTEN "ERRORCHANNEL";
SELECT pg_notify('ERRORCHANNEL', 'something!');
Anche se questo non funzionerà:
LISTEN ERRORCHANNEL;
SELECT pg_notify('ERRORCHANNEL', 'something!');
In questa situazione ERRORCHANNEL non è tra virgolette nel comando LISTEN, quindi PostgreSQL lo costringe a lettere minuscole. Il parametro del canale è di tipo text anziché relname, quindi il caso non viene toccato nella funzione pg_notify(). Insieme i canali non corrispondono (ERRORCHANNE !=errorchannel) quindi la notifica non viene mai ricevuta.