Diskutoval jsem o tom na PostgreSQL mailing listu (http://archives.postgresql.org/pgsql-bugs/2011-03/msg00041.php) a byl jsem informován o zdůvodnění tohoto chování.
Jejich odpověď je, že "..musíte uvozovat relnames (poslouchejte "Test"). pokud chcete, aby je server neskládal. pg_notify bere řetězec, nikoli arelname, který používá jiná pravidla." (Díky Merlinovi a Tomovi)
To znamená, že následující funguje, protože kanál je vždy nucen používat malá písmena
LISTEN ERRORCHANNEL;
NOTIFY ERRORCHANNEL, 'something!';
NOTIFY eRrorChanNel, 'something!';
Pokud byste kolem názvu kanálu přidali dvojité uvozovky, velikost písmen by zůstala zachována.
Takže s následujícím upozorněním byste obdrželi první oznámení, ale ne druhé:
LISTEN "ERRORCHANNEL";
NOTIFY "ERRORCHANNEL", 'something!';
NOTIFY "eRrorChanNel", 'something!';
Podobně bude fungovat následující, protože dvojité uvozovky vynucují zachování velikosti písmen ERRORCHANNEL:
LISTEN "ERRORCHANNEL";
SELECT pg_notify('ERRORCHANNEL', 'something!');
I když to nebude fungovat:
LISTEN ERRORCHANNEL;
SELECT pg_notify('ERRORCHANNEL', 'something!');
V této situaci není ERRORCHANNEL v příkazu LISTEN v dvojitých uvozovkách, takže PostgreSQL vynutí, aby byl zadán malými písmeny. Parametr kanálu je typu text spíše než relname, takže velikost písmen je ve funkci pg_notify() ponechána nedotčená. Kanály se dohromady neshodují (ERRORCHANNE !=errorchannel), takže oznámení není nikdy přijato.