Omówiłem to na liście dyskusyjnej PostgreSQL (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) i zostałem poinformowany o przyczynach takiego zachowania.
Ich odpowiedź brzmi:"..musisz podwójnie cytować nazwy relname (posłuchaj "Test"), jeśli chcesz, aby serwer nie łamał ich wielkością liter. pg_notify pobiera ciąg znaków, a nie arelname, który używa innych reguł." (Dzięki Merlin i Tom)
Oznacza to, że poniższe działania działają, ponieważ kanał zawsze musi pisać małymi literami
LISTEN ERRORCHANNEL;
NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';
Jeśli dodasz podwójne cudzysłowy wokół nazwy kanału, wielkość liter zostanie zachowana.
W związku z powyższym otrzymasz pierwsze powiadomienie, ale nie drugie:
LISTEN "ERRORCHANNEL";
NOTIFY "ERRORCHANNEL", 'something!';
NOTIFY "eRrorChanNel", 'something!';
Podobnie zadziała poniższe, ponieważ podwójne cudzysłowy wymuszają zachowanie przypadku ERRORCHANNEL:
LISTEN "ERRORCHANNEL";
SELECT pg_notify('ERRORCHANNEL', 'something!');
Chociaż to nie zadziała:
LISTEN ERRORCHANNEL;
SELECT pg_notify('ERRORCHANNEL', 'something!');
W tej sytuacji ERRORCHANNEL nie jest ujęty w cudzysłów w poleceniu LISTEN, więc PostgreSQL wymusza zapisanie go małymi literami. Parametr channel jest typu text, a nie relname, więc wielkość liter pozostaje niezmieniona w funkcji pg_notify(). Kanały razem nie pasują do siebie (ERRORCHANNE !=errorchannel), więc powiadomienie nigdy nie jest odbierane.