Myslím, že problém je v tom, že hstore, který máte, je null a null NEBO nějaký hstore je null.
Nejlepší řešení, které mám, což pravděpodobně není nejlepší řešení, je vytvořit tabulku s výchozím prázdným hstore, nikoli povolit null. Potom vaše příklady fungují, jak byste chtěli:
postgres=# create table htest (t text, h hstore default hstore(array[]::varchar[]));
CREATE TABLE
postgres=# insert into htest (t) values ('key');
INSERT 0 1
postgres=# update htest set h = h || ('foo'=>'bar') where t='key';
UPDATE 1
postgres=# select * from htest;
t | h
-----+--------------
key | "foo"=>"bar"
(1 row)
Bohužel nevidím čistší způsob, jak vytvořit prázdný hstore než hstore(array[]::varchar[])
ale to neznamená, že neexistuje lepší způsob. Můžete to začlenit do své aktualizace hstore z dřívějška takto:
update htest set h = coalesce(h, hstore(array[]::varchar[])) || ('foo'=>'bar') where t='key';
Tímto způsobem nemusíte znovu vytvářet stůl. I když mi to přijde docela hnusné. Doufám, že to pomůže.