E.40. Выпуск 12.14

Дата выпуска: 2023-02-09

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

E.40.1. Миграция на версию 12.14

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

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

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

  • Устранение утечки содержимого памяти после сбоя инициализации шифрования трафика GSSAPI в библиотеке libpq (Джейкоб Чемпион) §

    Модифицированный сервер или неаутентифицированный посредник мог отправить во время настройки шифрования трафика GSSAPI (Kerberos) сообщение об ошибке без завершающего нулевого байта. Затем libpq копировал эту строку, а также все последующие байты в памяти приложения вплоть до следующего нулевого байта в свой отчёт об ошибке. В зависимости от того, как вызывающее приложение использовало отчёт об ошибке, содержимое памяти приложения могло быть раскрыто. Также существовала небольшая вероятность сбоя из-за чтения за пределами памяти. Теперь сообщение сервера верно завершается нулевым байтом. (CVE-2022-41862)

  • Возможность назначения пометки REPLICA IDENTITY нерабочему (пока) индексу (Том Лейн) §

    Когда программа pg_dump выгружает секционированный индекс с пометкой REPLICA IDENTITY, создаётся последовательность команд, в которой REPLICA IDENTITY применяется до того, как секционированный индекс помечается рабочим, что приводит к сбою восстановления. Кажется, нет веской причины запрещать такой порядок действий, так что данная возможность допускается. REPLICA IDENTITY в любом случае не будет действовать, пока индекс не будет рабочим.

  • Исправление обработки маркеров DEFAULT в правилах, выполняющих INSERT из многострочного списка VALUES (Дин Рашид) §

    В некоторых случаях маркер DEFAULT не заменялся правильным выражением со стандартным значением, что приводило к ошибке «unrecognized node type» (нераспознанный тип узла).

  • Запрет использования неопределённых переменных в проверках существования jsonpath (Александр Коротков, Дэвид Дж. Джонстон) §

    В то время как операторы сопоставления jsonpath выдавали ошибку при обнаружении неопределённой переменной в шаблоне пути, операторы существования рассматривали её как соответствующую.

  • Устранение повреждения данных в особых случаях при параллельных соединениях по хешу (Дмитрий Астапов)

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

  • Учёт нестандартных значений checkpoint_completion_target (Бхарат Рупиредди) §

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

  • Запись в журнал правильной отметки времени окончания при восстановлении до recovery_target_xid (Том Лейн) §

    При завершении восстановления до recovery_target_xid при recovery_target_inclusive = off в сообщение журнала записывалась неверная отметка времени (всегда 2000-01-01) «recovery stopping before ... transaction» (остановка восстановления перед транзакцией ...).

  • Предотвращение ошибки «wrong tuple length» (неверная длина кортежа) в конце выполнения команды VACUUM (Ашвин Агравал, Цзюньфэн Ян) §

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

  • Недопущение немедленной фиксации после выполнения команды ANALYZE в расширенном протоколе запросов, если используется конвейерный режим (Том Лейн) §

    Если не было явной команды BEGIN TRANSACTION, команда ANALYZE выполняла фиксацию, чего не должно происходить при выполнении команд в конвейере.

  • Отклонение пакетов запроса на отмену, имеющих неправильную длину (Андрей Бородин)

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

  • Добавление защиты от рекурсии и зацикливания при «подтягивании» подзапросов (Том Лейн) §

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

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

    Раньше могли возникать ошибки вида «could not devise a query plan for the given query» (не удалось выработать план для данного запроса).

  • Ограничение объёма работ по очистке, выполняемых функцией get_actual_variable_range (Саймон Риггс) §

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

  • Обеспечение возможности отмены выполнения запросов полнотекстового поиска во время проверки соответствия фраз (Том Лейн) §

  • Устранение утечки памяти при вычислении хеша строк с недетерминированными правилами сортировки (Джефф Дэвис) §

  • Очистка объекта подключения libpq после неудачной попытки подключения для репликации (Андрес Фройнд) §

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

  • Уменьшение на серверах горячего резерва количества операций по поиску транзакций, активных на ведущем сервере (Саймон Риггс, Михаил Николаев) §

    Недостаточно агрессивная очистка массива KnownAssignedXids могла приводить к снижению производительности, особенно если для параметра max_connections установлено большое значение на резервном сервере.

  • Исправление использования неинициализированной памяти при логическом декодировании (Масахико Савада)

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

  • Предотвращение редкой ошибки критического уровня «failed to acquire cleanup lock» (не удалось получить блокировку для очистки) во время воспроизведения из WAL операций разделения страницы хеш-индекса (Роберт Хаас) §

  • Увеличение LSN страницы кучи при установке бита полной видимости во время воспроизведения WAL (Джефф Дэвис) §

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

  • Предотвращение небезопасного использования указателя rd_smgr элемента кеша отношений (Амул Сул) §

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

  • Устранение скрытой проблемы переполнения буфера в логике WaitEventSet (Томас Манро) §

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

  • Исключение номинально неопределённого поведения при доступе к общей памяти в 32-разрядных сборках (Андрес Фройнд) §

    Санитайзер неопределённого поведения компилятора clang сообщал об использовании недостаточно выровненного указателя. Это вряд ли могло вызывать проблемы не в отладочных сборках, но было исправлено в целях тестирования.

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

  • Исправление ошибок копирования и вставки в сообщениях об ошибках поиска в кеше для проверок ACL (Джастин Призби) §

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

  • Исключение вызова небезопасных серверных функций в pg_dump до установления блокировки для проверяемых таблиц (Том Лейн, Жиль Даролд) § §

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

  • Исправление дополнения табуляцией команды ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA (Дин Рашид) §

  • Исправление ошибочного утверждения истинности в contrib/postgres_fdw (Эцуро Фудзита) §

  • Исправление ошибки, из-за которой модуль contrib/seg вызывал сбой или выводил мусор, если вводилось число, содержащее более 127 цифр (Том Лейн) §

  • Устранение предупреждений в модуле contrib/sepgsql о том, что устарела версия libselinux (Микаэль Пакье) §

  • Исправление сборки на Microsoft Visual Studio 2013 (Том Лейн) §

    В предыдущем патче предполагалось, что на всех нужных платформах есть функция snprintf(), но на MSVC 2013 её пока нет. На этой платформе следует использовать функцию sprintf().

  • Устранение ошибки компиляции при сборке PL/Perl с MSVC с использованием Strawberry Perl (Эндрю Дунстан) §

  • Устранение несоответствия сборки PL/Perl с MSVC библиотеке Perl, собранной с gcc (Эндрю Дунстан) §

    Такие комбинации ранее могли завершаться ошибкой «loadable library and perl binaries are mismatched» (несоответствие загружаемой библиотеки сборке perl).

  • Подавление предупреждений компилятора о конструкциях в заголовочных файлах Perl (Андрес Фройнд) §

    При использовании предпочтительных параметров компилятора выдаются предупреждения о конструкциях, появляющихся в последних версиях заголовочных файлов Perl. При использовании gcc эти предупреждения можно подавить с помощью указаний pragma.

  • Внесение исправлений в код pg_waldump, чтобы он собирался компиляторами, которые не отбрасывают неиспользуемые функции static inline (Том Лейн) §

  • Обновление данных часовых поясов до версии tzdata 2022g, включающее изменение правил перехода на летнее время в Гренландии и Мексике, а также корректировку исторических данных для северной Канады, Колумбии и Сингапура.

    Кроме того, новый часовой пояс America/Ciudad_Juarez был отделён от America/Ojinaga.

E.40. Release 12.14

Release date: 2023-02-09

This release contains a variety of fixes from 12.13. For information about new features in major release 12, see Section E.54.

E.40.1. Migration to Version 12.14

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

However, if you are upgrading from a version earlier than 12.10, see Section E.44.

E.40.2. Changes

  • libpq can leak memory contents after GSSAPI transport encryption initiation fails (Jacob Champion) §

    A modified server, or an unauthenticated man-in-the-middle, can send a not-zero-terminated error message during setup of GSSAPI (Kerberos) transport encryption. libpq will then copy that string, as well as following bytes in application memory up to the next zero byte, to its error report. Depending on what the calling application does with the error report, this could result in disclosure of application memory contents. There is also a small probability of a crash due to reading beyond the end of memory. Fix by properly zero-terminating the server message. (CVE-2022-41862)

  • Allow REPLICA IDENTITY to be set on an index that's not (yet) valid (Tom Lane) §

    When pg_dump dumps a partitioned index that's marked REPLICA IDENTITY, it generates a command sequence that applies REPLICA IDENTITY before the partitioned index has been marked valid, causing restore to fail. There seems no very good reason to prohibit doing it in that order, so allow it. The marking will have no effect anyway until the index becomes valid.

  • Fix handling of DEFAULT markers in rules that perform an INSERT from a multi-row VALUES list (Dean Rasheed) §

    In some cases a DEFAULT marker would not get replaced with the proper default-value expression, leading to an unrecognized node type error.

  • Reject uses of undefined variables in jsonpath existence checks (Alexander Korotkov, David G. Johnston) §

    While jsonpath match operators threw an error for an undefined variable in the path pattern, the existence operators silently treated it as a match.

  • Fix edge-case data corruption in parallel hash joins (Dmitry Astapov) §

    If the final chunk of a large tuple being written out to a temporary file was exactly 32760 bytes, it would be corrupted due to a fencepost bug. The query would typically fail later with corrupted-data symptoms.

  • Honor non-default settings of checkpoint_completion_target (Bharath Rupireddy) §

    Internal state was not updated after a change in checkpoint_completion_target, possibly resulting in performing checkpoint I/O faster or slower than desired, especially if that setting was changed on-the-fly.

  • Log the correct ending timestamp in recovery_target_xid mode (Tom Lane) §

    When ending recovery based on the recovery_target_xid setting with recovery_target_inclusive = off, we printed an incorrect timestamp (always 2000-01-01) in the recovery stopping before ... transaction log message.

  • Prevent wrong tuple length failure at the end of VACUUM (Ashwin Agrawal, Junfeng Yang) §

    This occurred if VACUUM needed to update the current database's datfrozenxid value and the database has so many granted privileges that its datacl value has been pushed out-of-line.

  • In extended query protocol, avoid an immediate commit after ANALYZE if we're running a pipeline (Tom Lane) §

    If there's not been an explicit BEGIN TRANSACTION, ANALYZE would take it on itself to commit, which should not happen within a pipelined series of commands.

  • Reject cancel request packets having the wrong length (Andrey Borodin) §

    The server would process a cancel request even if its length word was too small. This led to reading beyond the end of the allocated buffer. In theory that could cause a segfault, but it seems quite unlikely to happen in practice, since the buffer would have to be very close to the end of memory. The more likely outcome was a bogus log message about wrong backend PID or cancel code. Complain about the wrong length, instead.

  • Add recursion and looping defenses in subquery pullup (Tom Lane) §

    A contrived query can result in deep recursion and unreasonable amounts of time spent trying to flatten subqueries. A proper fix for that seems unduly invasive for a back-patch, but we can at least add stack depth checks and an interrupt check to allow the query to be cancelled.

  • Fix partitionwise-join code to tolerate failure to produce a plan for each partition (Tom Lane) §

    This could result in could not devise a query plan for the given query errors.

  • Limit the amount of cleanup work done by get_actual_variable_range (Simon Riggs) §

    Planner runs occurring just after deletion of a large number of tuples appearing at the end of an index could expend significant amounts of work setting the killed bits for those index entries. Limit the amount of work done in any one query by giving up on this process after examining 100 heap pages. All the cleanup will still happen eventually, but without so large a performance hiccup.

  • Ensure that execution of full-text-search queries can be cancelled while they are performing phrase matches (Tom Lane) §

  • Fix memory leak in hashing strings with nondeterministic collations (Jeff Davis) §

  • Clean up the libpq connection object after a failed replication connection attempt (Andres Freund) §

    The previous coding leaked the connection object. In background code paths that's pretty harmless because the calling process will give up and exit. But in commands such as CREATE SUBSCRIPTION, such a failure resulted in a small session-lifespan memory leak.

  • In hot-standby servers, reduce processing effort for tracking XIDs known to be active on the primary (Simon Riggs, Michail Nikolaev) §

    Insufficiently-aggressive cleanup of the KnownAssignedXids array could lead to poor performance, particularly when max_connections is set to a large value on the standby.

  • Fix uninitialized-memory usage in logical decoding (Masahiko Sawada) §

    In certain cases, resumption of logical decoding could try to re-use XID data that had already been freed, leading to unpredictable behavior.

  • Avoid rare failed to acquire cleanup lock panic during WAL replay of hash-index page split operations (Robert Haas) §

  • Advance a heap page's LSN when setting its all-visible bit during WAL replay (Jeff Davis) §

    Failure to do this left the page possibly different on standby servers than the primary, and violated some other expectations about when the LSN changes. This seems only a theoretical hazard so far as PostgreSQL itself is concerned, but it could upset third-party tools.

  • Prevent unsafe usage of a relation cache entry's rd_smgr pointer (Amul Sul) §

    Remove various assumptions that rd_smgr would stay valid over a series of operations, by wrapping all uses of it in a function that will recompute it if needed. This prevents bugs occurring when an unexpected cache flush occurs partway through such a series.

  • Fix latent buffer-overrun problem in WaitEventSet logic (Thomas Munro) §

    The epoll-based and kqueue-based implementations could ask the kernel for too many events if the size of their internal buffer was different from the size of the caller's output buffer. That case is not known to occur in released PostgreSQL versions, but this error is a hazard for external modules and future bug fixes.

  • Avoid nominally-undefined behavior when accessing shared memory in 32-bit builds (Andres Freund) §

    clang's undefined-behavior sanitizer complained about use of a pointer that was less aligned than it should be. It's very unlikely that this would cause a problem in non-debug builds, but it's worth fixing for testing purposes.

  • Remove faulty assertion in useless-RESULT-RTE optimization logic (Tom Lane) §

  • Fix copy-and-paste errors in cache-lookup-failure messages for ACL checks (Justin Pryzby) §

    In principle these errors should never be reached. But if they are, some of them reported the wrong type of object.

  • In pg_dump, avoid calling unsafe server functions before we have locks on the tables to be examined (Tom Lane, Gilles Darold) § §

    pg_dump uses certain server functions that can fail if examining a table that gets dropped concurrently. Avoid this type of failure by ensuring that we obtain access share lock before inquiring too deeply into a table's properties, and that we don't apply such functions to tables we don't intend to dump at all.

  • Fix tab completion of ALTER FUNCTION/PROCEDURE/ROUTINE ... SET SCHEMA (Dean Rasheed) §

  • Fix faulty assertion in contrib/postgres_fdw (Etsuro Fujita) §

  • Fix contrib/seg to not crash or print garbage if an input number has more than 127 digits (Tom Lane) §

  • In contrib/sepgsql, avoid deprecation warnings with recent libselinux (Michael Paquier) §

  • Fix build on Microsoft Visual Studio 2013 (Tom Lane) §

    A previous patch supposed that all platforms of interest have snprintf(), but MSVC 2013 isn't quite there yet. Revert to using sprintf() on that platform.

  • Fix compile failure in building PL/Perl with MSVC when using Strawberry Perl (Andrew Dunstan) §

  • Fix mismatch of PL/Perl built with MSVC versus a Perl library built with gcc (Andrew Dunstan) §

    Such combinations could previously fail with loadable library and perl binaries are mismatched errors.

  • Suppress compiler warnings from Perl's header files (Andres Freund) §

    Our preferred compiler options provoke warnings about constructs appearing in recent versions of Perl's header files. When using gcc, we can suppress these warnings with a pragma.

  • Fix pg_waldump to build on compilers that don't discard unused static-inline functions (Tom Lane) §

  • Update time zone data files to tzdata release 2022g for DST law changes in Greenland and Mexico, plus historical corrections for northern Canada, Colombia, and Singapore. (Tom Lane) §

    Notably, a new timezone America/Ciudad_Juarez has been split off from America/Ojinaga.

FAQ