Другой вариант, без необходимости функции
update points set country = t1.country from
(
select points.oid, countries.name as country from
countries INNER JOIN points on st_contains(countries.wkb_geometry,points.wkb_geometry)
) t1
where t1.oid = points.oid
Я подозреваю (хотя я не проверял), что это будет быстрее, чем использование вложенной функции, как в вашем примере.
Мой вывод из бега объяснить (надеюсь, ваша внешность похожа). Если вы получили больше результатов Seq Scan, то на это стоит обратить внимание, возможно, индексы настроены не совсем правильно.
Update on points (cost=1.18..29.40 rows=121 width=129)"
-> Nested Loop (cost=1.18..29.40 rows=121 width=129)"
Join Filter: _st_contains(countries.geometry, public.points.geometry)"
-> Hash Join (cost=1.18..2.37 rows=28 width=220)"
Hash Cond: (public.points.oid = public.points.oid)"
-> Seq Scan on points (cost=0.00..1.08 rows=28 width=114)"
-> Hash (cost=1.08..1.08 rows=28 width=110)"
-> Seq Scan on points (cost=0.00..1.08 rows=28 width=110)"
-> Index Scan using "countries_Idx" on countries (cost=0.00..0.91 rows=1 width=414)"
Index Cond: (geometry && public.points.geometry)"