E.48. Выпуск 9.6.9

Дата выпуска: 2018-05-10

В этот выпуск вошли различные исправления, внесённые после версии 9.6.8. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.

E.48.1. Миграция на версию 9.6.9

Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.

Однако если вы используете расширение adminpack, его нужно обновить, следуя указаниям в первой записи в списке изменений.

Кроме того, если вас касаются ошибки с пометкой функций, описанные во второй и третьей записи ниже, потребуются дополнительные действия для исправления каталогов баз данных.

Если вы обновляете сервер с более ранней версии, чем 9.6.8, см. также Раздел E.49.

E.48.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, gin_clean_pending_list, cursor_to_xml, cursor_to_xmlschema, ts_rewrite, ts_stat и binary_upgrade_create_empty_extension должны были считаться параллельно-небезопасными, так как одни из них непосредственно модифицируют базу данных, а другие выполняют пользовательские запросы, которые могут это делать. Они были некорректно помечены как параллельно-безопасные, что могло приводить к неожиданным ошибкам запросов. Это было исправлено для новых инсталляций в результате корректировки исходных данных каталога, но в существующих инсталляциях ошибочные пометки сохранятся. При практическом использовании этих функций риск кажется небольшим, если только не включён режим 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) для значения TOAST nnnnn), которые сохранялись до удаления неактуальной записи командой VACUUM. В качестве решения выбор таких OID при создании новых записей TOAST теперь исключается.

  • Изменение алгоритма ANALYZE в части модификации pg_class.reltuples (Дэвид Гулд)

    Ранее плотность кортежей могла обновляться только для страниц, прошедших обработку ANALYZE, для остальных плотность считалась прежней. В большой таблице, где ANALYZE выбирает лишь небольшой процент страниц, это означает, что возможно лишь незначительное изменение общей оценки плотности кортежей, и поэтому reltuples будет меняться практически пропорционально изменениям физического размера таблицы (relpages) вне зависимости от того, что фактически происходит в таблице. В результате может наблюдаться настолько большое увеличение reltuples по сравнению с реальностью, что автоматическая очистка практически отключается. Для исправления этой ошибки принимается, что выборка ANALYZE является статистически несмещённой (какой она и должна быть), и наблюдаемая в ней плотность просто экстраполируется на всю таблицу.

  • Предупреждение взаимоблокировок в параллельных командах CREATE INDEX CONCURRENTLY, выполняемых на уровнях изоляции SERIALIZABLE и REPEATABLE READ (Том Лейн)

  • Устранение возможности замедленного выполнения REFRESH MATERIALIZED VIEW CONCURRENTLY (Томас Манро)

  • Устранение ошибки в UPDATE/DELETE ... WHERE CURRENT OF в случае, когда задействованный курсор использует план сканирования только индекса (Юго Нагата, Том Лейн)

  • Исправление некорректного планирования, когда предложения соединения передавались в параметризованные пути (Эндрю Гирт, Том Лейн)

    Эта ошибка могла привести к неправильной классификации условия как «фильтра соединения» для внешнего соединения, тогда как оно должно быть простым «фильтром», и в итоге мог получиться некорректный результат соединения.

  • Устранение возможности некорректного построения плана сканирования только индекса в случаях, когда один столбец таблицы фигурирует в нескольких индексах, но не во всех этих индексах используются классы операторов, которые могут выдать значение столбца (Кётаро Хоригути)

  • Исправление некорректной оптимизации ограничений CHECK с гарантированными NULL-подвыражениями в условиях верхнего уровня AND/OR (Том Лейн, Дин Рашид)

    В результате, например, ограничение-исключение могло исключить из запроса дочернюю таблицу, которая не должна быть исключена.

  • Устранение сбоя исполнителя в результате двойного освобождения памяти с некоторыми вариантами использования GROUPING SETS (Питер Гейган)

  • Предотвращение сбоя в случае, когда триггер события перезаписи таблицы добавляется одновременно с выполнением команды, которая может вызвать такой триггер (Альваро Эррера, Эндрю Гирт, Том Лейн)

  • Предотвращение ошибки при прерывании запроса или прекращении сеанса в момент фиксирования подготовленной транзакции (Стас Кельвич)

  • Ликвидация утечки памяти на время выполнения запроса в последовательно выполняемых соединениях по хешу (Том Лейн)

  • Устранение возможных утечек или двойного освобождения закреплений буферов карты видимости (Амит Капила)

  • Устранение неоправданной пометки страниц как полностью видимых (Дэн Вуд, Паван Деоласи, Альваро Эррера)

    Это могло происходить при блокировании (но не удалении) некоторых кортежей. Хотя запросы будут продолжать выполняться корректно, процедура очистки обычно игнорирует такие страницы, вследствие чего кортежи на них никогда не будут замораживаться. В последних выпусках это в конце концов приведёт к появлению ошибок вида «found multixact nnnnn from before relminmxid nnnnn» (найдена мультитранзакция nnnnn, предшествующая relminmxid nnnnn).

  • Исправление излишне строгой проверки в heap_prepare_freeze_tuple (Альваро Эррера)

    Это могло приводить к необоснованной ошибке «cannot freeze committed xmax» (не удаётся заморозить зафиксированный xmax) в базах данных, обновлённых с помощью pg_upgrade с версии 9.2 или старее.

  • Устранение потери указателя в случаях, когда написанный на С триггер, выполняемый до изменения строки, возвращает старый кортеж («old») (Рушаб Латиа)

  • Понижение уровня блокировки при планировании работы автоочистки (Джефф Джейнс)

    Предыдущее поведение создавало значительные препятствия для параллельного выполнения рабочих процессов в базах, содержащих множество таблиц.

  • Обеспечение копирования имени клиентского компьютера при копировании данных pg_stat_activity в локальную память (Эдмунд Хорнер)

    Ранее предположительно локальный экземпляр содержал указатель на разделяемую память, вследствие чего содержимое поля с именем клиентского компьютера могло неожиданно измениться при отключении какого-либо сеанса.

  • Исправление некорректной обработки нескольких составных аффиксов в словарях ispell (Артур Закиров)

  • Исправление поиска (то есть сканирования индекса с операторами неравенства), зависимого от правила сортировки, в индексах SP-GiST, построенных по текстовым столбцам (Том Лейн)

    Такой поиск мог возвращать неправильный набор строк для большинства правил сортировки, отличных от C.

  • Предотвращение утечки памяти на время выполнения запроса в классах операторов SP-GiST, использующих переходящие значения (Антон Дигнос)

  • Корректировка вычисления количества кортежей в индексе при изначальном построении индекса SP-GiST (Томаш Вондра)

    Ранее количество кортежей в индексе считалось равным количеству кортежей в нижележащей таблице, что неверно в случае частичного индекса.

  • Корректировка вычисления количества кортежей в индексе при очистке индекса GiST (Андрей Бородин)

    Ранее оно считалось равным примерному количеству кортежей в куче, что провоцировало неточность и определённо было ошибочным в случае частичного индекса.

  • Исправление поведения в особом случае, когда ведомый реплицирующий сервер «застревал» на записи продолжения WAL (Кётаро Хоригути)

  • При логическом декодировании приняты меры во избежание двойной обработки данных WAL при перезапуске передатчика WAL (Крейг Рингер)

  • Поддержка использования 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 (Том Лейн)

    Исправление обработки целочисленного переполнения в циклах FOR на языке PL/pgSQL (Том Лейн)

  • Исправление регрессионных тестов PL/Python для совместимости с Python 3.7 (Питер Эйзентраут)

  • Исправление регрессионных тестов PL/Python для совместимости с Python 3.7 (Питер Эйзентраут)

  • Устранение ошибок при изначальном построении индексов contrib/bloom (Томаш Вондра, Том Лейн)

    Предотвращение возможного исчезновения последнего кортежа таблицы из индекса. Исправление подсчёта количества кортежей в частичных индексах.

  • Переименование функций b64_encode и b64_decode во избежание конфликта со встроенными функциями Solaris 11.4 (Райнер Орт)

  • Синхронизация нашей копии библиотеки timezone с выпущенной IANA версией 2018e (Том Лейн)

    В этой версии усовершенствован компилятор данных часовых поясов zic для работы с отрицательными смещениями при переходе на летнее время. Хотя проект PostgreSQL в настоящее время не поставляет такие данные часовых поясов, zic может применяться с данными, полученными непосредственно от IANA, поэтому кажется разумным обновить zic сейчас.

  • Обновление данных часовых поясов до версии tzdata 2018d, включающее изменения правил перехода на летнее время в Палестине и Антарктиде (станция Кейси), плюс корректировку исторических данных для Португалии и её колоний, а также Уругвая и островов Эндербери, Ямайка, Теркс и Кайкос.

E.48. Release 9.6.9

Release date: 2018-05-10

This release contains a variety of fixes from 9.6.8. For information about new features in the 9.6 major release, see Section E.57.

E.48.1. Migration to Version 9.6.9

A dump/restore is not required for those running 9.6.X.

However, if you use the adminpack extension, you should update it as per the first changelog entry below.

Also, if the function marking mistakes mentioned in the second and third changelog entries below affect you, you will want to take steps to correct your database catalogs.

Also, if you are upgrading from a version earlier than 9.6.8, see Section E.49.

E.48.2. Changes

  • Remove public execute privilege from contrib/adminpack's pg_logfile_rotate() function (Stephen Frost)

    pg_logfile_rotate() is a deprecated wrapper for the core function pg_rotate_logfile(). When that function was changed to rely on SQL privileges for access control rather than a hard-coded superuser check, pg_logfile_rotate() should have been updated as well, but the need for this was missed. Hence, if adminpack is installed, any user could request a logfile rotation, creating a minor security issue.

    After installing this update, administrators should update adminpack by performing ALTER EXTENSION adminpack UPDATE in each database in which adminpack is installed. (CVE-2018-1115)

  • Fix incorrect volatility markings on a few built-in functions (Thomas Munro, Tom Lane)

    The functions query_to_xml, cursor_to_xml, cursor_to_xmlschema, query_to_xmlschema, and query_to_xml_and_xmlschema should be marked volatile because they execute user-supplied queries that might contain volatile operations. They were not, leading to a risk of incorrect query optimization. This has been repaired for new installations by correcting the initial catalog data, but existing installations will continue to contain the incorrect markings. Practical use of these functions seems to pose little hazard, but in case of trouble, it can be fixed by manually updating these functions' pg_proc entries, for example ALTER FUNCTION pg_catalog.query_to_xml(text, boolean, boolean, text) VOLATILE. (Note that that will need to be done in each database of the installation.) Another option is to pg_upgrade the database to a version containing the corrected initial data.

  • Fix incorrect parallel-safety markings on a few built-in functions (Thomas Munro, Tom Lane)

    The functions brin_summarize_new_values, gin_clean_pending_list, cursor_to_xml, cursor_to_xmlschema, ts_rewrite, ts_stat, and binary_upgrade_create_empty_extension should be marked parallel-unsafe; some because they perform database modifications directly, and others because they execute user-supplied queries that might do so. They were marked parallel-restricted instead, leading to a risk of unexpected query errors. This has been repaired for new installations by correcting the initial catalog data, but existing installations will continue to contain the incorrect markings. Practical use of these functions seems to pose little hazard unless force_parallel_mode is turned on. In case of trouble, it can be fixed by manually updating these functions' pg_proc entries, for example ALTER FUNCTION pg_catalog.brin_summarize_new_values(regclass) PARALLEL UNSAFE. (Note that that will need to be done in each database of the installation.) Another option is to pg_upgrade the database to a version containing the corrected initial data.

  • Avoid re-using TOAST value OIDs that match dead-but-not-yet-vacuumed TOAST entries (Pavan Deolasee)

    Once the OID counter has wrapped around, it's possible to assign a TOAST value whose OID matches a previously deleted entry in the same TOAST table. If that entry were not yet vacuumed away, this resulted in unexpected chunk number 0 (expected 1) for toast value nnnnn errors, which would persist until the dead entry was removed by VACUUM. Fix by not selecting such OIDs when creating a new TOAST entry.

  • Change ANALYZE's algorithm for updating pg_class.reltuples (David Gould)

    Previously, pages not actually scanned by ANALYZE were assumed to retain their old tuple density. In a large table where ANALYZE samples only a small fraction of the pages, this meant that the overall tuple density estimate could not change very much, so that reltuples would change nearly proportionally to changes in the table's physical size (relpages) regardless of what was actually happening in the table. This has been observed to result in reltuples becoming so much larger than reality as to effectively shut off autovacuuming. To fix, assume that ANALYZE's sample is a statistically unbiased sample of the table (as it should be), and just extrapolate the density observed within those pages to the whole table.

  • Avoid deadlocks in concurrent CREATE INDEX CONCURRENTLY commands that are run under SERIALIZABLE or REPEATABLE READ transaction isolation (Tom Lane)

  • Fix possible slow execution of REFRESH MATERIALIZED VIEW CONCURRENTLY (Thomas Munro)

  • Fix UPDATE/DELETE ... WHERE CURRENT OF to not fail when the referenced cursor uses an index-only-scan plan (Yugo Nagata, Tom Lane)

  • Fix incorrect planning of join clauses pushed into parameterized paths (Andrew Gierth, Tom Lane)

    This error could result in misclassifying a condition as a join filter for an outer join when it should be a plain filter condition, leading to incorrect join output.

  • Fix possibly incorrect generation of an index-only-scan plan when the same table column appears in multiple index columns, and only some of those index columns use operator classes that can return the column value (Kyotaro Horiguchi)

  • Fix misoptimization of CHECK constraints having provably-NULL subclauses of top-level AND/OR conditions (Tom Lane, Dean Rasheed)

    This could, for example, allow constraint exclusion to exclude a child table that should not be excluded from a query.

  • Fix executor crash due to double free in some GROUPING SET usages (Peter Geoghegan)

  • Avoid crash if a table rewrite event trigger is added concurrently with a command that could call such a trigger (Álvaro Herrera, Andrew Gierth, Tom Lane)

  • Avoid failure if a query-cancel or session-termination interrupt occurs while committing a prepared transaction (Stas Kelvich)

  • Fix query-lifespan memory leakage in repeatedly executed hash joins (Tom Lane)

  • Fix possible leak or double free of visibility map buffer pins (Amit Kapila)

  • Avoid spuriously marking pages as all-visible (Dan Wood, Pavan Deolasee, Álvaro Herrera)

    This could happen if some tuples were locked (but not deleted). While queries would still function correctly, vacuum would normally ignore such pages, with the long-term effect that the tuples were never frozen. In recent releases this would eventually result in errors such as found multixact nnnnn from before relminmxid nnnnn.

  • Fix overly strict sanity check in heap_prepare_freeze_tuple (Álvaro Herrera)

    This could result in incorrect cannot freeze committed xmax failures in databases that have been pg_upgrade'd from 9.2 or earlier.

  • Prevent dangling-pointer dereference when a C-coded before-update row trigger returns the old tuple (Rushabh Lathia)

  • Reduce locking during autovacuum worker scheduling (Jeff Janes)

    The previous behavior caused drastic loss of potential worker concurrency in databases with many tables.

  • Ensure client hostname is copied while copying pg_stat_activity data to local memory (Edmund Horner)

    Previously the supposedly-local snapshot contained a pointer into shared memory, allowing the client hostname column to change unexpectedly if any existing session disconnected.

  • Fix incorrect processing of multiple compound affixes in ispell dictionaries (Arthur Zakirov)

  • Fix collation-aware searches (that is, indexscans using inequality operators) in SP-GiST indexes on text columns (Tom Lane)

    Such searches would return the wrong set of rows in most non-C locales.

  • Prevent query-lifespan memory leakage with SP-GiST operator classes that use traversal values (Anton Dignös)

  • Count the number of index tuples correctly during initial build of an SP-GiST index (Tomas Vondra)

    Previously, the tuple count was reported to be the same as that of the underlying table, which is wrong if the index is partial.

  • Count the number of index tuples correctly during vacuuming of a GiST index (Andrey Borodin)

    Previously it reported the estimated number of heap tuples, which might be inaccurate, and is certainly wrong if the index is partial.

  • Fix a corner case where a streaming standby gets stuck at a WAL continuation record (Kyotaro Horiguchi)

  • In logical decoding, avoid possible double processing of WAL data when a walsender restarts (Craig Ringer)

  • Allow scalarltsel and scalargtsel to be used on non-core datatypes (Tomas Vondra)

  • Reduce libpq's memory consumption when a server error is reported after a large amount of query output has been collected (Tom Lane)

    Discard the previous output before, not after, processing the error message. On some platforms, notably Linux, this can make a difference in the application's subsequent memory footprint.

  • Fix double-free crashes in ecpg (Patrick Krecker, Jeevan Ladhe)

  • Fix ecpg to handle long long int variables correctly in MSVC builds (Michael Meskes, Andrew Gierth)

  • Fix mis-quoting of values for list-valued GUC variables in dumps (Michael Paquier, Tom Lane)

    The local_preload_libraries, session_preload_libraries, shared_preload_libraries, and temp_tablespaces variables were not correctly quoted in pg_dump output. This would cause problems if settings for these variables appeared in CREATE FUNCTION ... SET or ALTER DATABASE/ROLE ... SET clauses.

  • Fix pg_recvlogical to not fail against pre-v10 PostgreSQL servers (Michael Paquier)

    A previous fix caused pg_recvlogical to issue a command regardless of server version, but it should only be issued to v10 and later servers.

  • Ensure that pg_rewind deletes files on the target server if they are deleted from the source server during the run (Takayuki Tsunakawa)

    Failure to do this could result in data inconsistency on the target, particularly if the file in question is a WAL segment.

  • Fix pg_rewind to handle tables in non-default tablespaces correctly (Takayuki Tsunakawa)

  • Fix overflow handling in PL/pgSQL integer FOR loops (Tom Lane)

    The previous coding failed to detect overflow of the loop variable on some non-gcc compilers, leading to an infinite loop.

  • Adjust PL/Python regression tests to pass under Python 3.7 (Peter Eisentraut)

  • Support testing PL/Python and related modules when building with Python 3 and MSVC (Andrew Dunstan)

  • Fix errors in initial build of contrib/bloom indexes (Tomas Vondra, Tom Lane)

    Fix possible omission of the table's last tuple from the index. Count the number of index tuples correctly, in case it is a partial index.

  • Rename internal b64_encode and b64_decode functions to avoid conflict with Solaris 11.4 built-in functions (Rainer Orth)

  • Sync our copy of the timezone library with IANA tzcode release 2018e (Tom Lane)

    This fixes the zic timezone data compiler to cope with negative daylight-savings offsets. While the PostgreSQL project will not immediately ship such timezone data, zic might be used with timezone data obtained directly from IANA, so it seems prudent to update zic now.

  • Update time zone data files to tzdata release 2018d for DST law changes in Palestine and Antarctica (Casey Station), plus historical corrections for Portugal and its colonies, as well as Enderbury, Jamaica, Turks & Caicos Islands, and Uruguay.

FAQ