'Postgres Citus, immutable date conversion
Trying to update some dates programmatically on Citus I always get
[0A000] ERROR: STABLE functions used in UPDATE queries cannot be called with column references
From a query like
UPDATE date_container SET json_value = json_value::jsonb - 'created_time' || CONCAT('{"created_time":"',
rtrim(replace(to_timestamp(((json_value->>'created_time')::numeric/1000000))::text,' ','T'), '-05'),'"}')::jsonb
In theory all methods are immutable
, but for some reasons it says that some part of it is not.
I tried also all methods below: PostgreSQL: how to convert from Unix epoch to date?
Solution 1:[1]
The CONCAT
function is stable
instead of immutable
, this is often the case for functions that take any
/anyelement
as an argument.
select proname, pronamespace::regnamespace, provolatile
from pg_proc
where proname = 'concat';
proname ? pronamespace ? provolatile
??????????????????????????????????????
concat ? pg_catalog ? s
Instead you should be able to use the string concatenation operator ||
, but be sure to cast all items to text, otherwise you might get the same problem with it using a anyelement version of the ||
operator.
So I think this query should work:
UPDATE date_container SET json_value = json_value::jsonb - 'created_time' ||
(
'{"created_time":"'::text
|| rtrim(replace(to_timestamp(((json_value->>'created_time')::numeric/1000000))::text,' ','T'), '-05')::text
|| '"}'::text
)::jsonb
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | JelteF |