Следующие правила определяют видимость изменений данных в функциях, использующих SPI (или любую другую функцию на языке C):
Во время выполнения SQL-команды любые изменения данных, внесенные этой командой, невидимы для самой команды. Например, в:
INSERT INTO a SELECT * FROM a;
вставленные строки не видны SELECT
части.
Изменения, внесенные командой C, видны всем командам, запускаемым после C, независимо от того, инициированы ли они внутри C (во время выполнения C) или после завершения C.
Команды, выполняемые через SPI внутри функции, вызываемой SQL-командой (будь то обычная функция или триггер), подчиняются одному из вышеизложенных правил в зависимости от флага чтения/записи, переданного SPI. Команды, выполняемые в режиме «только чтение», следуют первому правилу: они не видят изменений вызывающей команды. Команды, выполняемые в режиме чтения-записи, следуют второму правилу: они видят все изменения, сделанные к текущему моменту.
Все стандартные процедурные языки устанавливают режим чтения-записи SPI в зависимости от категории изменчивости функции. Команды
STABLE и IMMUTABLE функции выполняются в режиме «только чтение», в то время как команды VOLATILE функции выполняются в режиме чтения-записи. Хотя авторы функций на языке C могут нарушить это соглашение, вряд ли это будет хорошей идеей.
В следующем разделе приведён пример, иллюстрирующий применение этих правил.