E.54. Выпуск 10.4
Дата выпуска: 2018-05-10
В этот выпуск вошли различные исправления, внесённые после версии 10.3. За информацией о нововведениях версии 10 обратитесь к Разделу E.58.
E.54.1. Миграция на версию 10.4
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Однако если вы используете расширение adminpack
, его нужно обновить, следуя указаниям в первой записи в списке изменений.
Кроме того, если вас касаются ошибки с пометкой функций, описанные во второй и третьей записи ниже, потребуются дополнительные действия для исправления каталогов баз данных.
Если вы обновляете сервер с более ранней версии, чем 10.3, см. также Раздел E.55.
E.54.2. Изменения
Лишение роли public права на выполнение функции
pg_logfile_rotate()
изcontrib/adminpack
(Стивен Фрост)Функция
pg_logfile_rotate()
является устаревшей оболочкой функции ядраpg_rotate_logfile()
. Когда в последней была удалена жёсткая проверка суперпользователя, чтобы доступ к этой функции ограничивался правами SQL, эти изменения следовало отразить и вpg_logfile_rotate()
, но это было упущено. Таким образом, с установленным расширениемadminpack
любой пользователь мог запросить прокрутку файла журнала, что можно считать некритичным нарушением безопасности.После установки этого обновления администраторы должны обновить
adminpack
, выполнивALTER EXTENSION adminpack UPDATE
в каждой базе данных, где установленadminpack
. (CVE-2018-1115)Исправление некорректных пометок изменчивости для нескольких встроенных функций (Томас Манро, Том Лейн)
Функции
query_to_xml
,cursor_to_xml
,cursor_to_xmlschema
,query_to_xmlschema
иquery_to_xml_and_xmlschema
должны были считаться изменчивыми, так как они выполняют пользовательские запросы, в которых могут быть изменчивые операции. Однако они не были помечены должным образом, что было чревато неправильной оптимизацией запросов. Это было исправлено для новых инсталляций в результате корректировки исходных данных каталога, но в существующих инсталляциях ошибочные пометки сохранятся. При практическом использовании этих функций риск кажется небольшим, но в случае необходимости их можно исправить, вручную изменив записи этих функций вpg_proc
. Например:ALTER FUNCTION pg_catalog.query_to_xml(text, boolean, boolean, text) VOLATILE
. (Заметьте, что это нужно будет проделать в каждой базе данных инсталляции.) Также вы можете обновить базу до версии с корректными исходными данными, воспользовавшись pg_upgrade.Исправление некорректных пометок параллельно-безопасности для нескольких встроенных функций (Thomas Munro, Tom Lane)
Функции
brin_summarize_new_values
,brin_summarize_range
,brin_desummarize_range
,gin_clean_pending_list
,cursor_to_xml
,cursor_to_xmlschema
,ts_rewrite
,ts_stat
,binary_upgrade_create_empty_extension
иpg_import_system_collations
должны были считаться параллельно-небезопасными, так как одни из них непосредственно модифицируют базу данных, а другие выполняют пользовательские запросы, которые могут это делать. Они были некорректно помечены как параллельно-безопасные, что могло приводить к неожиданным ошибкам запросов. Это было исправлено для новых инсталляций в результате корректировки исходных данных каталога, но в существующих инсталляциях ошибочные пометки сохранятся. При практическом использовании этих функций риск кажется небольшим, если только не включён режимforce_parallel_mode
, но в случае необходимости их можно исправить, вручную изменив записи этих функций вpg_proc
. Например:ALTER FUNCTION pg_catalog.brin_summarize_new_values(regclass) PARALLEL UNSAFE
. (Заметьте, что это нужно будет проделать в каждой базе данных инсталляции.) Также вы можете обновить базу до версии с корректными исходными данными, воспользовавшись pg_upgrade.Предотвращение повторного использования для TOAST идентификаторов OID, соответствующих уже неактуальным, но ещё не очищенным записям TOAST (Паван Деоласи)
После зацикливания счётчика OID имеется возможность использования для значения TOAST идентификатора OID, соответствующего ранее удалённой записи в той же таблице TOAST. Если запись не была очищена к тому времени, это приводило к ошибкам «unexpected chunk number 0 (expected 1) for toast value
nnnnn
» (неожиданный номер порции 0 (ожидался 1) для значения TOASTnnnnn
), которые сохранялись до удаления неактуальной записи командойVACUUM
. В качестве решения выбор таких OID при создании новых записей TOAST теперь исключается.Корректная проверка всех ограничений
CHECK
для отдельных секций при выполненииCOPY
в секционированную таблицу (Эцуро Фудзита)Ранее проверялись только ограничения, заданные для секционированной таблицы в целом.
Допущение значений
TRUE
иFALSE
в качестве границ секции (Амит Ланготе)Ранее для логического секционирующего столбца принимались только строковые литералы, но pg_dump выводит эти значения как
TRUE
/FALSE
, что приводило к ошибкам при выгрузке/загрузке данных.Исправление работы с памятью в функциях сравнения ключей секционирования (Альваро Эррера, Амит Ланготе)
Эта ошибка могла приводить к сбоям при использовании для ключей секционирования классов операторов, определённых пользователем.
Устранение возможности сбоя при добавлении запросом кортежей в несколько секций секционированной таблицы, когда эти секции имеют разные типы строк (Эцуро Фудзита, Амит Ланготе)
Изменение алгоритма
ANALYZE
в части модификацииpg_class
.reltuples
(Дэвид Гулд)Ранее плотность кортежей могла обновляться только для страниц, прошедших обработку
ANALYZE
, для остальных плотность считалась прежней. В большой таблице, гдеANALYZE
выбирает лишь небольшой процент страниц, это означает, что возможно лишь незначительное изменение общей оценки плотности кортежей, и поэтомуreltuples
будет меняться практически пропорционально изменениям физического размера таблицы (relpages
) вне зависимости от того, что фактически происходит в таблице. В результате может наблюдаться настолько большое увеличениеreltuples
по сравнению с реальностью, что автоматическая очистка практически отключается. Для исправления этой ошибки принимается, что выборкаANALYZE
является статистически несмещённой (какой она и должна быть), и наблюдаемая в ней плотность просто экстраполируется на всю таблицу.Включение объектов расширенной статистики в набор свойств таблицы, копируемых конструкцией
CREATE TABLE ... LIKE ... INCLUDING ALL
(Дэвид Роули)Также добавлено указание
INCLUDING STATISTICS
для явного управления включением этой информации.Исправление работы
CREATE TABLE ... LIKE
со столбцами идентификации типаbigint
(Питер Эйзентраут)На платформах, где
long
имеет размер 32 бита (что включает 64-битные Windows, а также большинство 32-битных систем), копируемые параметры последовательностей усекались до 32 бит.Предупреждение взаимоблокировок в параллельных командах
CREATE INDEX CONCURRENTLY
, выполняемых на уровнях изоляцииSERIALIZABLE
иREPEATABLE READ
(Том Лейн)Устранение возможности замедленного выполнения
REFRESH MATERIALIZED VIEW CONCURRENTLY
(Томас Манро)Устранение ошибки в
UPDATE/DELETE ... WHERE CURRENT OF
в случае, когда задействованный курсор использует план сканирования только индекса (Юго Нагата, Том Лейн)Исправление некорректного планирования, когда предложения соединения передавались в параметризованные пути (Эндрю Гирт, Том Лейн)
Эта ошибка могла привести к неправильной классификации условия как «фильтра соединения» для внешнего соединения, тогда как оно должно быть простым «фильтром», и в итоге мог получиться некорректный результат соединения.
Устранение возможности некорректного построения плана сканирования только индекса в случаях, когда один столбец таблицы фигурирует в нескольких индексах, но не во всех этих индексах используются классы операторов, которые могут выдать значение столбца (Кётаро Хоригути)
Исправление некорректной оптимизации ограничений
CHECK
с гарантированными NULL-подвыражениями в условиях верхнего уровняAND
/OR
(Том Лейн, Дин Рашид)В результате, например, ограничение-исключение могло исключить из запроса дочернюю таблицу, которая не должна быть исключена.
Предотвращение сбоя планировщика в случаях, когда запрос содержит несколько наборов
GROUPING SETS
, и ни один из них нельзя получить сортировкой (Эндрю Гирт)Устранение сбоя исполнителя в результате двойного освобождения памяти с некоторыми вариантами использования
GROUPING SET
(Питер Гейган)Исправление некорректного выполнения замкнутого соединения переходных таблиц (Томас Манро)
Предотвращение сбоя в случае, когда триггер события перезаписи таблицы добавляется одновременно с выполнением команды, которая может вызвать такой триггер (Альваро Эррера, Эндрю Гирт, Том Лейн)
Предотвращение ошибки при прерывании запроса или прекращении сеанса в момент фиксирования подготовленной транзакции (Стас Кельвич)
Ликвидация утечки памяти на время выполнения запроса в последовательно выполняемых соединениях по хешу (Том Лейн)
Устранение возможных утечек или двойного освобождения закреплений буферов карты видимости (Амит Капила)
Устранение неоправданной пометки страниц как полностью видимых (Дэн Вуд, Паван Деоласи, Альваро Эррера)
Это могло происходить при блокировании (но не удалении) некоторых кортежей. Хотя запросы будут продолжать выполняться корректно, процедура очистки обычно игнорирует такие страницы, вследствие чего кортежи на них никогда не будут замораживаться. В последних выпусках это в конце концов приведёт к появлению ошибок вида «found multixact
nnnnn
from before relminmxidnnnnn
» (найдена мультитранзакцияnnnnn
, предшествующая relminmxidnnnnn
).Исправление излишне строгой проверки в
heap_prepare_freeze_tuple
(Альваро Эррера)Это могло приводить к необоснованной ошибке «cannot freeze committed xmax» (не удаётся заморозить зафиксированный xmax) в базах данных, обновлённых с помощью pg_upgrade с версии 9.2 или старее.
Устранение потери указателя в случаях, когда написанный на С триггер, выполняемый до изменения строки, возвращает старый кортеж («old») (Рушаб Латиа)
Понижение уровня блокировки при планировании работы автоочистки (Джефф Джейнс)
Предыдущее поведение создавало значительные препятствия для параллельного выполнения рабочих процессов в базах, содержащих множество таблиц.
Обеспечение копирования имени клиентского компьютера при копировании данных
pg_stat_activity
в локальную память (Эдмунд Хорнер)Ранее предположительно локальный экземпляр содержал указатель на разделяемую память, вследствие чего содержимое поля с именем клиентского компьютера могло неожиданно измениться при отключении какого-либо сеанса.
Корректная обработка информации
pg_stat_activity
для вспомогательных процессов (Эдмунд Хорнер)Поля
application_name
,client_hostname
иquery
для таких процессов могли содержать неверные данные.Исправление некорректной обработки нескольких составных аффиксов в словарях
ispell
(Артур Закиров)Исправление поиска (то есть сканирования индекса с операторами неравенства), зависимого от правила сортировки, в индексах SP-GiST, построенных по текстовым столбцам (Том Лейн)
Такой поиск мог возвращать неправильный набор строк для большинства правил сортировки, отличных от C.
Предотвращение утечки памяти на время выполнения запроса в классах операторов SP-GiST, использующих переходящие значения (Антон Дигнос)
Корректировка вычисления количества кортежей в индексе при изначальном построении индекса SP-GiST (Томаш Вондра)
Ранее количество кортежей в индексе считалось равным количеству кортежей в нижележащей таблице, что неверно в случае частичного индекса.
Корректировка вычисления количества кортежей в индексе при очистке индекса GiST (Андрей Бородин)
Ранее оно считалось равным примерному количеству кортежей в куче, что провоцировало неточность и определённо было ошибочным в случае частичного индекса.
Исправление поведения в особом случае, когда ведомый реплицирующий сервер «застревал» на записи продолжения WAL (Кётаро Хоригути)
При логическом декодировании приняты меры во избежание двойной обработки данных WAL при перезапуске передатчика WAL (Крейг Рингер)
Исправление механизма логической репликации, чтобы он не полагался на совпадение OID типов между локальным и удалённым серверами (Масахико Савада)
Поддержка использования
scalarltsel
иscalargtsel
с расширенными типами данных (Томаш Вондра)Уменьшение потребления памяти libpq в случаях, когда сервер выдаёт ошибку после получения большого объёма результата запроса (Том Лейн)
Полученный ранее результат должен быть отброшен до, а не после обработки ошибки. На некоторых платформах, в частности в Linux это может влиять на то, сколько памяти будет занимать приложение.
Устранение сбоев в ecpg, вызванных двойным освобождением памяти (Патрик Крекер, Дживан Ладхе)
Исправление обработки переменных
long long int
в ecpg, собранном с использованием MSVC (Михаэль Мескес, Эндрю Гирт)Исправление некорректного заключения в кавычки значений для переменных GUC со списками при формировании дампа (Микаэль Пакье, Том Лейн)
Переменные
local_preload_libraries
,session_preload_libraries
,shared_preload_libraries
иtemp_tablespaces
не заключались в кавычки корректно в выводе pg_dump. Это могло приводить к проблемам, если эти переменным присваивались значения в конструкцияхCREATE FUNCTION ... SET
илиALTER DATABASE/ROLE ... SET
.Предотвращение отказа pg_recvlogical при подключении к серверам PostgreSQL до 10 версии (Микаэль Пакье)
В результате предыдущего исправления программа pg_recvlogical, не проверяя версию сервера, выдавала команду, которая должна предназначаться только серверам версии 10 и новее.
Исправление поведения pg_rewind, чтобы на целевом сервере удалялись файлы, которые могли быть удалены в процессе выполнения на исходном сервере (Такаюки Цунакава)
В противном случае на целевом сервере могла нарушаться согласованность данных, особенно если это был файл сегмента WAL.
Исправление в pg_rewind обработки таблиц в дополнительных табличных пространствах (Такаюки Цунакава)
Исправление обработки целочисленного переполнения в циклах
FOR
на языке PL/pgSQL (Том Лейн)Ранее с некоторыми компиляторами, отличными от gcc, переполнение переменной цикла не проверялось, в результате чего цикл оказывался бесконечным.
Исправление регрессионных тестов PL/Python для совместимости с Python 3.7 (Питер Эйзентраут)
Поддержка тестирования PL/Python и связанных модулей при сборке с использованием Python 3 и MSVC (Эндрю Дунстан)
Устранение ошибок при изначальном построении индексов
contrib/bloom
(Томаш Вондра, Том Лейн)Предотвращение возможного исчезновения последнего кортежа таблицы из индекса. Исправление подсчёта количества кортежей в частичных индексах.
Переименование функций
b64_encode
иb64_decode
во избежание конфликта со встроенными функциями Solaris 11.4 (Райнер Орт)Синхронизация нашей копии библиотеки timezone с выпущенной IANA версией 2018e (Том Лейн)
В этой версии усовершенствован компилятор данных часовых поясов zic для работы с отрицательными смещениями при переходе на летнее время. Хотя проект PostgreSQL в настоящее время не поставляет такие данные часовых поясов, zic может применяться с данными, полученными непосредственно от IANA, поэтому кажется разумным обновить zic сейчас.
Обновление данных часовых поясов до версии tzdata 2018d, включающее изменения правил перехода на летнее время в Палестине и Антарктиде (станция Кейси), плюс корректировку исторических данных для Португалии и её колоний, а также Уругвая и островов Эндербери, Ямайка, Теркс и Кайкос.