= IMMUTABLE_FUNC(a, b, c).a,
b = IMMUTABLE_FUNC(a, b, c).b,
c = IMMUTABLE_FUNC(a, b, c).c;
IMMUTABLE функция IMMUTABLE_FUNC будет вычислена единожды в рамках обновления одной строки?
Нет.
Скорее наоборот, CSE (common subexpression elimination) тут не в почёте в цэлом.
Известны ли вам методы, как заставить PostgreSQL вычислять некую IMMUTABLE функцию единожды, при условии, что она зависит от нескольких аргументов (кои являются столбцами очередной строки, а также постоянными в рамках одной строки) и используется далее в нескольких местах запроса? На ум приходит только CURSOR FOR UPDATE, но что-то это мне не нравится.
Можэте попробовать сунуть это вычисление в cte. 100% гарантии нет, но есть большые шансы, что если будет только один вызов -- то его результат применят несколько раз.
Если я верно помню, то в CTE при UPDATE я не смогу пропихнуть значения из "текущей обновляемой строки". Или же ошибаюсь?
Ну, так, относительно. Если есть primary key -- то можно это через него связать. Насчёт lateral: можэт сработать, да, но не пробовал (вдруг запрещено).
Обсуждают сегодня