E.39. Выпуск 11.16

Дата выпуска: 2022-05-12

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

E.39.1. Миграция на версию 11.16

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

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

E.39.2. Изменения

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

    В коде автоочистки, CLUSTER, CREATE INDEX, REINDEX, REFRESH MATERIALIZED VIEW и pg_amcheck защитный механизм, обеспечивающий безопасное выполнение операции, включался слишком поздно или не включался вовсе при некоторых условиях. Пользователь, имеющий права для создания невременных объектов в базе данных, мог создать такой объект, который позволил бы выполнить произвольный SQL-код с правами суперпользователя при следующей обработке этого объекта процессом автоочистки или одной из перечисленных команд, запущенной суперпользователем.

    Проект PostgreSQL благодарит Александра Лахина за сообщение об этой проблеме. (CVE-2022-1552)

  • Прекращение обработки заданных в запросе псевдонимов столбцов в переменных «вся строка», ссылающихся на простые таблицы (Том Лейн)

    Столбцы в кортежах, образованных переменными «вся строка» (например, tbl.* во всех контекстах, кроме верхнего уровня списка SELECT), теперь всегда получают имена от соответствующего составного типа, если он имеется. Ранее мы пытались отслеживать все псевдонимы столбцов, заданные в элементе FROM, на который ссылается переменная. Но это сомнительно с точки зрения семантики, так как содержимое переменной при этом фактически вообще не соответствует составному типу, который она в принципе должна представлять. Предыдущие попытки устранить эту несогласованность имели плохие последствия, вплоть до сохранения нечитаемых данных на диске, поэтому было решено отказаться от этой идеи.

    В случаях, когда требуется переименовать такие столбцы, это можно сделать, добавив дополнительный уровень вложенности SELECT, чтобы переменная «вся строка» ссылалась на результат внутреннего SELECT, а не на исходную таблицу. Тогда переменная типа record будет получена из неё, что даст желаемый результат.

  • Исправление некорректного вывода для типов timestamptz и timetz в table_to_xmlschema() и родственных функциях (Ренан Соарес Лопес)

    Выводимая xml-схема для этих типов включала неправильные регулярные выражения.

  • Предотвращение аварийного сбоя в анализаторе при обработке предложения VALUES с нулём столбцов (Том Лейн)

  • Исправление ошибок планировщика при обработке конструкций GROUPING(), обращающихся к внешним уровням запроса (Ричард Гуо, Том Лейн)

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

    Предыдущая реализация могла попытаться выдать в дополнение к возвращаемым столбцам невозвращаемые, что по большому счёту было безвредно, так как выдаваемые фиктивные значения фактически никуда не попадали. Однако после недавнего добавления проверки, отвергающей такой план, это стало неприемлемым.

  • Ликвидация утечки памяти на протяжении запроса в узле IndexScan, производящем пересортировку (Александр Каленик)

  • Обеспечение в ALTER FUNCTION поддержки изменения в одной команде и свойства параллельности функции, и списка назначаемых для неё переменных (Том Лейн)

    Ранее изменение свойства параллельности терялось, если в той же команде для функции менялось предложение SET.

  • Исправление ошибочной сортировки строк таблицы при выполнении CLUSTER по индексу, ведущим ключом которого является выражение (Питер Гейган, Томас Манро)

    Таблица перестраивалась с корректными данными, но порядок сортировки никак не соответствовал порядку индекса.

  • Исключение риска взаимоблокировки при удалении секционированного индекса (Джимми Йи, Гаураб Дей, Том Лейн)

    Теперь требующиеся блокировки таблиц и индексов будут устанавливаться в стандартном порядке (родители, затем потомки; таблицы, затем индексы). В предыдущей реализации DROP INDEX блокировки устанавливались по-другому, что могло привести к взаимоблокировке при одновременном выполнении запросов, устанавливающих блокировки в стандартном порядке.

  • Устранение условий гонки между DROP TABLESPACE и процессом контрольных точек (Натан Боссарт)

    Процедура контрольной точки, выполняемая принудительно командой DROP TABLESPACE, иногда могла не удалить все ставшие ненужными файлы из каталога табличного пространства, вследствие чего выдавалась ошибка «tablespace is not empty» (табличное пространство не пусто).

  • Исключение возможной проблемы при восстановлении после сбоя, которому предшествовало выполнение команды TRUNCATE, наложившееся на контрольную точку (Кётаро Хоригути, Хейкки Линнакангас, Роберт Хаас)

    Процедура TRUNCATE должна задерживать завершение контрольной точки, пока файл таблицы на диске не будет обрезан. В противном случае при воспроизведении журнала с этой контрольной точки в предположительно освобождённых страницах могут обнаружиться лишние данные, что может вызвать ошибку воспроизведения.

  • Исправление небезопасного обращения к данным TOAST во время очистки временных объектов (Андрес Фройнд)

    Процедура удаления временных объектов при завершении серверного процесса могла прерываться ошибкой «FATAL: cannot fetch toast data without an active snapshot» (ВАЖНО: прочитать данные TOAST без активного снимка нельзя). Обычно это не было проблемой, так как при следующем использовании этой временной схемы она должна была очиститься успешно.

  • Устранение сбоя с сообщением «PANIC: xlog flush request is not satisfied» (ПАНИКА: запрос на сброс xlog не выполнен) при повышении ведомого сервера после того, как на нём была пропущена отсутствующая запись продолжения WAL (Сами Имсейх)

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

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

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

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

  • Внесение в WAL значений столбцов, образующих ключ идентификации реплики, которые не были изменены при изменении строки, но хранятся вне кортежа (Дилип Кумар, Амит Капила)

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

  • Улучшение сообщения об ошибке на стороне подписчика логической репликации при обращении к отношению неподдерживаемого типа (Том Лейн)

    Серверы версии 13 и новее поддерживают секционированные таблицы, тогда как серверы старых версий подписаться на такие таблицы не позволяют. При попытке сделать это ранее выдавалось вводящее в заблуждение сообщение «table XYZ not found on publisher» (таблица XYZ не найдена на сервере публикации). Теперь сообщение будет более осмысленным.

  • Недопущение выполнения функций SPI во время компиляции функции на PL/Perl (Том Лейн)

    Perl позволяет выполнять определённый пользователем код во время компиляции функции на PL/Perl. Однако такому коду нельзя позволять выполнять операции SQL через SPI. В противном случае либо произойдёт сбой, либо возникнет угроза безопасности, так как мы на самом деле не ожидаем, что код будет выполняться во время проверки функции. Теперь во избежание этого добавлена проверка с понятным сообщением об ошибке.

  • Обеспечение в libpq возможности принимать файлы закрытых ключей SSL, принадлежащие root (Дэвид Стил)

    Это изменение уравнивает действующие в libpq правила безопасного владения и разрешений для файлов ключей SSL с правилами, принятыми на стороне сервера, начиная с версии 9.6. А именно, к текущим правилам добавлен случай, когда файлом ключа владеет root и для этого файла заданы разрешения rw-r----- или более строгие. Это облегчает управление файлами ключей на уровне системы.

  • Добавление в pg_ctl перепроверки существования процесса postmaster во время ожидания действий stop/restart/promote (Том Лейн)

    Ранее утилита pg_ctl проверяла, работает ли postmaster, попутно с тем, как передавала ему сигнал stop или promote, но затем она просто наивно ждала, пока не изменится состояние на диске. Если процесс postmaster завершался нештатно, не удалив свой файл PID или не отразив состояние в управляющем файле, ожидание pg_ctl завершалось только по тайм-ауту. Теперь pg_ctl будет постоянно перепроверять, не исчез ли процесс postmaster.

  • Исправление обработки ошибок в pg_waldump (Кётаро Хоригути, Андрес Фройнд)

    При попытке прочитать файл WAL, чтобы определить размер сегмента WAL, утилита pg_waldump ранее выдавала некорректную ошибку, если файл был слишком мал. Кроме того, вместо имени файла в этом и связанных сообщениях об ошибке мог выводиться мусор.

  • Обеспечение в функциях модуля contrib/pageinspect корректной обработки полностью нулевых страниц (Микаэль Пакье)

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

  • Добавление в contrib/pageinspect защиты от некорректного содержимого «специальной области» страниц, усиление проверок размера страниц и добавление недостающих проверок соответствия типа индекса ожидаемому (Микаэль Пакье, Джастин Призби, Жюльен Руо)

    После этих изменений вызвать падение модуля, передав ему плохие данные, будет не так просто.

  • Добавление в contrib/postgres_fdw проверки возможности безопасного удалённого выполнения предложения ORDER BY до передачи запроса с удалённой сортировкой, а также дополнение этого предложения указанием USING, когда оно необходимо (Ронан Данклау)

    До этого удалённый сервер мог выполнять сортировку не в том порядке, в котором ожидалось. Хотя в каких-то случаях это не имело большого значения, в других могли выдаваться совершенно неверные результаты, если удалённые данные поступали на вход локальной процедуре соединения слиянием.

  • Обновление кода JIT для совместимости с LLVM 14 (Томас Манро)

  • Устранение разнообразных дефектов, выявленных проверками clang -fsanitize=undefined (Том Лейн, Андрес Фройнд, Чжихун Юй)

    Большинство дефектов исправлено только ради формального соответствия букве языка C и стандартов POSIX, вряд ли они могли как-то проявляться в производственных сборках.

  • Внесение исправлений в код PL/Perl, чтобы он собирался компиляторами C, не поддерживающими вложение операторов в выражения (Том Лейн)

  • Устранение потенциальной ошибки сборки pg_dumpall в Windows при использовании для сборки не MSVC (Андрес Фройнд)

  • Смена применяемой в сборках для Windows программы, создающей файлы DEF, с pexports на gendef (Эндрю Дунстан)

    Таким образом обеспечена совместимость процесса сборки с последней версией инструментария MSys.

  • Предотвращение дополнительного разворачивания шаблонов оболочки в программах, собираемых в MinGW (Эндрю Дунстан)

    По какой-то причине библиотека C, представленная в MinGW, по умолчанию разворачивает символы подстановки, полученные в командной строке программы. Такое поведение вызывает вопросы, как минимум потому что с библиотекой MSVC этого не происходит, поэтому оно отключено.

  • Обновление данных часовых поясов до версии tzdata 2022a, включающее изменение правил перехода на летнее время в Палестине, а также корректировку исторических данных для Чили и Украины.

E.39. Release 11.16

Release date: 2022-05-12

This release contains a variety of fixes from 11.15. For information about new features in major release 11, see Section E.55.

E.39.1. Migration to Version 11.16

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

However, if you are upgrading from a version earlier than 11.14, see Section E.41.

E.39.2. Changes

  • Confine additional operations within security restricted operation sandboxes (Sergey Shinderuk, Noah Misch)

    Autovacuum, CLUSTER, CREATE INDEX, REINDEX, REFRESH MATERIALIZED VIEW, and pg_amcheck activated the security restricted operation protection mechanism too late, or even not at all in some code paths. A user having permission to create non-temporary objects within a database could define an object that would execute arbitrary SQL code with superuser permissions the next time that autovacuum processed the object, or that some superuser ran one of the affected commands against it.

    The PostgreSQL Project thanks Alexander Lakhin for reporting this problem. (CVE-2022-1552)

  • Stop using query-provided column aliases for the columns of whole-row variables that refer to plain tables (Tom Lane)

    The column names in tuples produced by a whole-row variable (such as tbl.* in contexts other than the top level of a SELECT list) are now always those of the associated named composite type, if there is one. We'd previously attempted to make them track any column aliases that had been applied to the FROM entry the variable refers to. But that's semantically dubious, because really then the output of the variable is not at all of the composite type it claims to be. Previous attempts to deal with that inconsistency had bad results up to and including storing unreadable data on disk, so just give up on the whole idea.

    In cases where it's important to be able to relabel such columns, a workaround is to introduce an extra level of sub-SELECT, so that the whole-row variable is referring to the sub-SELECT's output and not to a plain table. Then the variable is of type record to begin with and there's no issue.

  • Fix incorrect output for types timestamptz and timetz in table_to_xmlschema() and allied functions (Renan Soares Lopes)

    The xmlschema output for these types included a malformed regular expression.

  • Avoid core dump in parser for a VALUES clause with zero columns (Tom Lane)

  • Fix planner errors for GROUPING() constructs that reference outer query levels (Richard Guo, Tom Lane)

  • Fix plan generation for index-only scans on indexes with both returnable and non-returnable columns (Tom Lane)

    The previous coding could try to read non-returnable columns in addition to the returnable ones. This was fairly harmless because it didn't actually do anything with the bogus values, but it fell foul of a recently-added error check that rejected such a plan.

  • Fix query-lifespan memory leak in an IndexScan node that is performing reordering (Aliaksandr Kalenik)

  • Fix ALTER FUNCTION to support changing a function's parallelism property and its SET-variable list in the same command (Tom Lane)

    The parallelism property change was lost if the same command also updated the function's SET clause.

  • Fix mis-sorting of table rows when CLUSTERing using an index whose leading key is an expression (Peter Geoghegan, Thomas Munro)

    The table would be rebuilt with the correct data, but in an order having little to do with the index order.

  • Fix risk of deadlock failures while dropping a partitioned index (Jimmy Yih, Gaurab Dey, Tom Lane)

    Ensure that the required table and index locks are taken in the standard order (parents before children, tables before indexes). The previous coding for DROP INDEX did it differently, and so could deadlock against concurrent queries taking these locks in the standard order.

  • Fix race condition between DROP TABLESPACE and checkpointing (Nathan Bossart)

    The checkpoint forced by DROP TABLESPACE could sometimes fail to remove all dead files from the tablespace's directory, leading to a bogus tablespace is not empty error.

  • Fix possible trouble in crash recovery after a TRUNCATE command that overlaps a checkpoint (Kyotaro Horiguchi, Heikki Linnakangas, Robert Haas)

    TRUNCATE must ensure that the table's disk file is truncated before the checkpoint is allowed to complete. Otherwise, replay starting from that checkpoint might find unexpected data in the supposedly-removed pages, possibly causing replay failure.

  • Fix unsafe toast-data accesses during temporary object cleanup (Andres Freund)

    Temporary-object deletion during server process exit could fail with FATAL: cannot fetch toast data without an active snapshot. This was usually harmless since the next use of that temporary schema would clean up successfully.

  • Fix PANIC: xlog flush request is not satisfied failure during standby promotion when there is a missing WAL continuation record (Sami Imseih)

  • Fix possibility of self-deadlock in hot standby conflict handling (Andres Freund)

    With unlucky timing, the WAL-applying process could get stuck while waiting for some other process to release a buffer lock.

  • Ensure that logical replication apply workers can be restarted even when we're up against the max_sync_workers_per_subscription limit (Amit Kapila)

    Faulty coding of the limit check caused a restarted worker to exit immediately, leaving fewer workers than there should be.

  • Include unchanged replica identity key columns in the WAL log for an update, if they are stored out-of-line (Dilip Kumar, Amit Kapila)

    Otherwise subscribers cannot see the values and will fail to replicate the update.

  • Improve logical replication subscriber's error message for an unsupported relation kind (Tom Lane)

    v13 and later servers support publishing partitioned tables. Older server versions cannot handle subscribing to such a table, and they gave a very misleading error message: table XYZ not found on publisher. Arrange to deliver a more on-point message.

  • Disallow execution of SPI functions during PL/Perl function compilation (Tom Lane)

    Perl can be convinced to execute user-defined code during compilation of a PL/Perl function. However, it's not okay for such code to try to invoke SQL operations via SPI. That results in a crash, and if it didn't crash it would be a security hazard, because we really don't want code execution during function validation. Put in a check to give a friendlier error message instead.

  • Make libpq accept root-owned SSL private key files (David Steele)

    This change synchronizes libpq's rules for safe ownership and permissions of SSL key files with the rules the server has used since release 9.6. Namely, in addition to the current rules, allow the case where the key file is owned by root and has permissions rw-r----- or less. This is helpful for system-wide management of key files.

  • Make pg_ctl recheck postmaster aliveness while waiting for stop/restart/promote actions (Tom Lane)

    pg_ctl would verify that the postmaster is alive as a side-effect of sending the stop or promote signal, but then it just naively waited to see the on-disk state change. If the postmaster died uncleanly without having removed its PID file or updated the control file, pg_ctl would wait until timeout. Instead make it recheck every so often that the postmaster process is still there.

  • Fix error handling in pg_waldump (Kyotaro Horiguchi, Andres Freund)

    While trying to read a WAL file to determine the WAL segment size, pg_waldump would report an incorrect error for the case of a too-short file. In addition, the file name reported in this and related error messages could be garbage.

  • Ensure that contrib/pageinspect functions cope with all-zero pages (Michael Paquier)

    This is a legitimate edge case, but the module was mostly unprepared for it. Arrange to return nulls, or no rows, as appropriate; that seems more useful than raising an error.

  • In contrib/pageinspect, add defenses against incorrect page special space contents, tighten checks for correct page size, and add some missing checks that an index is of the expected type (Michael Paquier, Justin Pryzby, Julien Rouhaud)

    These changes make it less likely that the module will crash on bad data.

  • In contrib/postgres_fdw, verify that ORDER BY clauses are safe to ship before requesting a remotely-ordered query, and include a USING clause if necessary (Ronan Dunklau)

    This fix prevents situations where the remote server might sort in a different order than we intend. While sometimes that would be only cosmetic, it could produce thoroughly wrong results if the remote data is used as input for a locally-performed merge join.

  • Update JIT code to work with LLVM 14 (Thomas Munro)

  • Clean up assorted failures under clang's -fsanitize=undefined checks (Tom Lane, Andres Freund, Zhihong Yu)

    Most of these changes are just for pro-forma compliance with the letter of the C and POSIX standards, and are unlikely to have any effect on production builds.

  • Fix PL/Perl so it builds on C compilers that don't support statements nested within expressions (Tom Lane)

  • Fix possible build failure of pg_dumpall on Windows, when not using MSVC to build (Andres Freund)

  • In Windows builds, use gendef instead of pexports to build DEF files (Andrew Dunstan)

    This adapts the build process to work on recent MSys tool chains.

  • Prevent extra expansion of shell wildcard patterns in programs built under MinGW (Andrew Dunstan)

    For some reason the C library provided by MinGW will expand shell wildcard characters in a program's command-line arguments by default. This is confusing, not least because it doesn't happen under MSVC, so turn it off.

  • Update time zone data files to tzdata release 2022a for DST law changes in Palestine, plus historical corrections for Chile and Ukraine.

FAQ