Возникла задача построения полнотекстового индекса. В индексируемой таблице было создано поле fts типа ts_vector. При вставке и обновлении триггер, при необходимости, должен обновлять поле fts. Чтобы полнотекстовый индекс не обновлялся при обновлении полей не связанных с ним было установлено условие:
IF (TG_OP = 'UPDATE') AND (NEW."name" = OLD."name")
THEN RETURN NEW;
END IF;
Т.е. если имя не обновилось мы ничего не трогаем и просто завершаем выполнение триггера. Но при обновлении данный триггер сваливался с ошибкой «record „old“ is not assigned yet». Однако ошибки не возникает при такой конструкции:
IF (TG_OP = 'UPDATE') THEN
IF (NEW."name" = OLD."name") THEN
RETURN NEW;
END IF;
END IF;
Следовательно, при вычисленнии логического выражения, вычисляется каждая его составляющая. И даже если TG_OP != 'UPDATE' (а это значит выполняется INSERT ) проверяется второе условие где OLD не определён. Отсюда и возникает ошибка.