Интересная Особенность Вычисления Логических Выражений В Plpgsql.

Возникла проблема построения полнотекстового индекса.

В индексированной таблице создано поле fts типа ts_vector. При вставке и обновлении триггер должен при необходимости обновить поле fts. Чтобы предотвратить обновление полнотекстового индекса при обновлении полей, не связанных с ним, было установлено следующее условие:



IF (TG_OP = 'UPDATE') AND (NEW."name" = OLD."name") THEN RETURN NEW; END IF;

Те.

если имя не обновилось, ничего не трогаем и просто завершаем выполнение триггера.

Но во время обновления этот триггер вылетел с ошибкой «запись «старая» еще не назначена».

Однако при такой конструкции ошибка не возникает:

IF (TG_OP = 'UPDATE') THEN IF (NEW."name" = OLD."name") THEN RETURN NEW; END IF; END IF;

Поэтому при вычислении логического выражения оценивается каждый его компонент. И даже если TG_OP != 'UPDATE' (что означает выполнение INSERT), проверяется второе условие, где OLD не определено.

Вот здесь и возникает ошибка.

Теги: #postgresql #plpgsql #postgresql

Вместе с данным постом часто просматривают: