s
И да, насчёт блокировок, гонок и этого вот всего - на свете есть погромисты, которые умеют не косячить в таких задачах. А ещё на свете давно уже есть немало языков, которые многие потенциально проблемные места выявляют ещё на этапе сборки.
Size: a a a
s
s
s
AS
AS
2_
KK
2_
create or replace function common.sum_value_transition(
state common.sum_value_state,
val numeric,
unit integer,
id integer
)returns common.sum_value_state AS $$
declare
i integer;
accum numeric;
BEGIN
FOREACH i in array state.ids
LOOP
IF i = id THEN
RETURN ROW(state.ids, state.accum);
end if;
END LOOP;
IF jsonb_exists(state.accum, unit::text) THEN
accum = jsonb_extract_path(state.accum, unit::text)::numeric + val;
ELSE
accum = val;
end if;
RETURN ROW(id || state.ids, state.accum || jsonb_build_object(unit::text, accum))::common.sum_value_state;
END;
$$ LANGUAGE plpgsql;KK
TS
2_
YS
TS
2_
TS
KK
2_
AS
YS
YS