E.13. Выпуск 17.1 #

Дата выпуска: 2024-11-14

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

E.13.1. Миграция на версию 17.1 #

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

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

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

E.13.2. Изменения #

  • Пометка кешированных планов как зависимых от выполняющих их ролей, когда защита на уровне строк (RLS) применяется для ссылки на таблицу не на верхнем уровне (Натан Боссарт) §

    Если общее табличное выражение (CTE), подзапрос, подссылка, представление с контекстом безопасности вызывающего или проекция приведения в запросе ссылались на таблицу с политикой защиты на уровне строк, результирующий план не помечался как потенциально зависимый от выполняющей его роли. Это могло приводить к тому, что последующие запросы в том же сеансе выполнялись с некорректным планом, а скрытые строки возвращались или возвращаемые скрывались.

    Проект PostgreSQL благодарит Вольфганга Вальтера за сообщение об этой проблеме. (CVE-2024-10976)

  • Библиотека libpq теперь игнорирует сообщения об ошибках, получаемые во время согласования протоколов SSL или GSS (Джейкоб Чемпион) §

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

    Проект PostgreSQL благодарит Джейкоба Чемпиона за сообщение об этой проблеме. (CVE-2024-10977)

  • Исправление нежелательного взаимодействия команд SET SESSION AUTHORIZATION и SET ROLE (Том Лейн) § §

    Согласно стандарту SQL, команда SET SESSION AUTHORIZATION имеет побочный эффект в виде выполнения команды SET ROLE NONE. Это было реализовано некорректно, что приводило к дополнительному нежелательному взаимодействию между двумя командами. В частности, откат транзакции, в которой была выполнена команда SET SESSION AUTHORIZATION, приводил к откату ROLE до NONE, даже если ранее было другое значение, и действующий идентификатор пользователя мог отличаться от идентификатора до выполнения транзакции. Временное включение session_authorization в предложении SET функции приводило к тому же результату. Дополнительная ошибка заключалась в том, что при исследовании current_setting('role') параллельным рабочим процессом он видел none, даже если должен был видеть иное значение.

    Проект PostgreSQL благодарит Тома Лейна за сообщение об этой проблеме. (CVE-2024-10978)

  • Запрет на изменение переменных окружения доверенным кодом PL/Perl (Эндрю Дунстан, Ной Миш) § § §

    Возможность изменять переменные окружения процессов, такие как PATH, позволяет злоумышленнику выполнять произвольный код. Поэтому теперь это запрещено для «доверенных» процедурных языков. Чтобы исправить проблему с plperl, замените %ENV на связанный хеш, который запрещает вносить изменения с выводом предупреждения. Недоверенный язык plperlu сохраняет возможность изменять переменные окружения.

    Проект PostgreSQL благодарит Коби Абрамса за сообщение об этой проблеме. (CVE-2024-10979)

  • Исправление обновлений состояния каталога для ограничений внешнего ключа при присоединении или отсоединении секций таблицы (Жеан-Гийом де Рорте, Альваро Эррера) § §

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

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

    Используйте запрос ниже, чтобы выявить нарушенные ограничения и подготовить команды для создания таких ограничений заново:

    SELECT conrelid::pg_catalog.regclass AS "constrained table",
           conname AS constraint,
           confrelid::pg_catalog.regclass AS "references",
           pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;',
                             conrelid::pg_catalog.regclass, conname) AS "drop",
           pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;',
                             conrelid::pg_catalog.regclass, conname,
                             pg_catalog.pg_get_constraintdef(oid)) AS "add"
    FROM pg_catalog.pg_constraint c
    WHERE contype = 'f' AND conparentid = 0 AND
       (SELECT count(*) FROM pg_catalog.pg_constraint c2
        WHERE c2.conparentid = c.oid) <>
       ((SELECT count(*) FROM pg_catalog.pg_inherits i
        WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND
          EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table
                  WHERE partrelid = i.inhparent)) +
        CASE WHEN pg_catalog.pg_partition_root(conrelid) = confrelid THEN
                  (SELECT count(*) FROM pg_catalog.pg_partition_tree(confrelid)
                    WHERE level = 1)
             ELSE 0 END);

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

  • Исправление теста для локали C, когда значения переменных LC_COLLATE и LC_CTYPE отличаются (Джефф Девис) §

    При использовании libc как провайдера локали по умолчанию, тест, проверяющий использование локали C для сравнения, ранее некорректно проверял значение LC_CTYPE, а не LC_COLLATE. Это не влияло на обычный сценарий работы, когда значения совпадали или оба отличались от C (или псевдонима POSIX). Однако, если LC_CTYPE имела значение C, а в LC_COLLATE была указана другая локаль, запросы могли выполняться некорректно и было возможно повреждение индексов, построенных по строкам. После установки этого обновления пользователям БД с такими значениями переменных следует перестроить затронутые проблемой индексы. Обратный случай, когда LC_COLLATE принимала значение C, а в LC_CTYPE указана другая локаль, приводил к снижению производительности, но не к ошибкам.

  • Запрет использования соединений или группировки с учётом секционирования, если сортировка в запросе для столбца ключа не соответствует сортировке ключа секционирования (Цзянь Хи, Веббо Хан) § §

    Такие планы ранее могли приводить к некорректным результатам.

  • Предотвращение сбоя планировщика после преобразования теста IS NULL для столбца NOT NULL в константу FALSE (Ричард Гуо) §

    Эта проблема обычно вызывала такие ошибки, как «variable not found in subplan target lists» (переменная не найдена в целевых списках подплана).

  • Предотвращение возможного сбоя планировщика во время встраивания SQL-функции, аргументы которой содержат определённые связанные с массивами конструкции (Том Лейн, Натан Боссарт) §

  • Исправление возможных некорректных выводов или ошибки планировщика «wrong varnullingrels» (неправильные varnullingrels) для операций MERGE ... WHEN NOT MATCHED BY SOURCE (Дин Рашид) § §

  • Исправление возможной ошибки «could not find pathkey item to sort» (не удалось найти элемент ключей пути для сортировки), когда необходима сортировка вывода запроса с оператором UNION ALL, а столбец сортировки является выражением (Андрей Лепихов, Том Лейн)

  • Исправление сканирования индекса-B-дерева для ScalarArrayOp в особых случаях (Питер Гейган) §

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

  • Исправление сбоя проверочного утверждения или сбивающего с толку сообщения об ошибке выполнения команды COPY (запрос) TO ..., когда запрос переписывается правилом DO INSTEAD NOTIFY (Тендер Ван, Том Лейн) §

  • Исправление проверки параметров FORCE_NOT_NULL и FORCE_NULL команды COPY (Джоэл Джейкобсон) §

    Некоторые некорректные варианты использования теперь запрещены, как и должно было быть.

  • Исправление сбоя сервера в случаях, когда вызов json_objectagg() содержит изменчивую функцию (Амит Ланготе) §

  • Исправление выявления асимметричных данных во время параллельного соединения по хешу (Томас Манро)

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

  • Предотвращение сбоев, когда командой ALTER DATABASE SET задаётся серверный параметр, для которого поиск выполняется на основе пути, например default_text_search_config (Джефф Девис) §

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

    Исправление вызвано главным образом тем, что иногда поиск выполнялся с ограничением search_path, что вызывало непредвиденные сбои, когда команда CREATE INDEX ссылалась на объекты за пределами схемы pg_catalog.

    Кроме того, благодаря этому исправлению комментарии к родительскому секционированному индексу больше не копируются в дочерние индексы.

  • Добавление недостающей зависимости указанного в CREATE TABLE ... USING невстроенного метода доступа от секционированной таблицы (Микаэль Пакье) §

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

  • Запрет использования имён локалей, содержащих не ASCII-символы (Томас Манро)

    Проблема возникала только в Windows, поскольку такие имена локалей больше нигде не используются. Основная сложность заключается в том, что неясно в какой кодировке они представлены (так как используемая кодировка определена в самой локали). Из-за этого недоразумения в последних выпусках PostgreSQL в библиотеке времени выполнения могли случаться прерывания операций.

    При появлении нового сообщения об ошибке следует либо создать новую локаль с именем только из набора ASCII при помощи программы Locale Builder в Windows, либо использовать имена локалей, соответствующие языковому тегу BCP 47, например, tr-TR.

  • Устранение условий гонки при фиксации сериализуемой транзакции (Хейкки Линнакангас) §

    Некорректная обработка недавно зафиксированной транзакции могла приводить к сбою проверочного утверждения или ошибке «could not access status of transaction» (не удалось получить состояние транзакции).

  • Устранение условий гонки при выполнении команды COMMIT PREPARED, которые приводили к наличию потерянных файлов двухфазной фиксации (2PC) (У Чэнвэнь) §

    Параллельное выполнение нескольких команд PREPARE TRANSACTION могло приводить к тому, что команда COMMIT PREPARED не удаляла файл состояния двухфазной фиксации на диске для завершённой транзакции. Мгновенно к негативным последствиям это не приводило, однако при последующем восстановлении после сбоя могла возникать ошибка «could not access status of transaction» (не удалось получить состояние транзакции), что требовало ручного удаления потерянного файла для восстановления службы.

  • Предотвращение некорректного обращения к памяти после пропуска нерабочего индекса TOAST во время выполнения команды VACUUM FULL (Тендер Ван) §

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

  • Исправление возможных потерь обновлений каталога «на месте» (Ной Миш) § § § § § § §

    При обычном обновлении строк новая версия строки записывается, чтобы сохранить возможность отката транзакции. Однако при обновлении некоторых системных каталогов транзакции намеренно не затрагиваются, и в таком случае строка обновляется на месте. Данное исправление устраняет условия гонки, которые могли приводить к потере обновлений на месте. Одним из примеров была потеря того, что для pg_class.relhasindex задано значение true, что приводило к невозможности обновления нового индекса и, следовательно, его повреждению.

  • Сброс кеша каталогов в конце процесса восстановления (Ной Миш) §

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

  • Предотвращение параллельного выполнения запросов при сдерживании прерываний (Франческо Деграсси, Ной Миш, Том Лейн) § §

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

  • Игнорирование ещё не определённых порталов в представлении pg_cursors (Том Лейн) §

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

  • Предотвращение ошибки «unexpected table_index_fetch_tuple call during logical decoding» (непредвиденный вызов table_index_fetch_tuple во время логического декодирования) при декодировании транзакции, содержащей вставку значения столбца по умолчанию (Такэси Идэриха, Хоу Чжицзе) § §

  • Уменьшение потребления памяти при логическом декодировании (Масахико Савада) §

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

  • Исправление поведения стабильных функций, вызываемых из списка аргументов оператора CALL, где CALL находится в блоке EXCEPTION PL/pgSQL (Том Лейн) §

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

  • Разбор параметра подключения keepalives в libpq так же, как и других целочисленных параметров (Юто Сасаки) §

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

  • Исправление чтения за пределами выборки при разборе некорректных даты и времени в ecpglib (Брюс Момджян, Павел Некрасов) §

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

  • Исправление команд описания psql для поддержки серверов версий до 9.4 (Том Лейн) §

    Выполнение команд, при которых отображается список управления доступом (ACL), завершалось ошибкой на очень старых версиях сервера PostgreSQL из-за использования функции, отсутствующей в этих версиях.

  • Предотвращение зависания в psql, если в команде \watch указан интервал менее 1 мс (Андрей Бородин, Микаэль Пакье) §

    Вместо этого такой интервал будет обрабатываться как равный нулю (без задержки между выполнениями).

  • Устранение неспособности найти пароль репликации в ~/.pgpass (Том Лейн) §

    Утилитам pg_basebackup и pg_receivewal не удавалось сопоставить вхождение в ~/.pgpass, для которого в поле имени БД содержалось значение replication, если не были указаны параметры -d или --dbname. Такое поведение приводило к непредвиденному запросу пароля.

  • Отображение ошибки в pg_combinebackup, если файл инкрементальной резервной копии находится в каталоге, где должна содержаться полная копия (Роберт Хаас) §

  • Запрет на создание имён файлов с двумя косыми чертами в pg_combinebackup (Роберт Хаас) §

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

  • Предотвращение попытки перестройки индексов временных таблиц, индексов в vacuumdb и при параллельной перестройке индексов с помощью reindexdb (Вайбхав С, Микаэль Пакье, Фудзии Масао, Натан Боссарт) § § §

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

  • Исправление некорректного кода, генерируемого LLVM, на платформах ARM64 (Томас Манро, Антонин Боннефой) §

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

  • Исправление нескольких случаев, в которых допускалось, что время начала процесса (представленное time_t) уместится в значение типа long (Макс Джонсон, Натан Боссарт) §

    На платформах, где тип long вмещает 32 бита (особенно на Windows), после 2038 года произойдёт сбой. В основном он проявит себя косметически, но в особенности зависнет команда pg_ctl start.

  • Обновление данных часовых поясов до версии tzdata 2024b (Том Лейн) § §

    В этом выпуске tzdata изменяются старые имена часовых поясов, совместимые с System V, теперь они дублируют соответствующие географические зоны. Например, PST8PDT теперь является псевдонимом для America/Los_Angeles. Единственное видимое последствие заключается в том, что для временных отметок до введения стандартизированных часовых поясов часовой пояс будет означать среднее солнечное время для заданного места. Например, в PST8PDT ввод с типом данных timestamptz, такой как 1801-01-01 00:00, раньше отображался как 1801-01-01 00:00:00-08, а теперь — как 1801-01-01 00:00:00-07:52:58.

    Кроме того, выполнены корректировки исторических данных для Мексики, Монголии и Португалии. Часовой пояс Asia/Choibalsan теперь является псевдонимом для Asia/Ulaanbaatar, а не отдельным часовым поясом, в основном потому что разница между ними, как оказалось, основана на недостоверных данных.

E.13. Release 17.1 #

Release date: 2024-11-14

This release contains a variety of fixes from 17.0. For information about new features in major release 17, see Section E.14.

E.13.1. Migration to Version 17.1 #

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

However, if you have ever detached a partition from a partitioned table that has a foreign-key reference to another partitioned table, and not dropped the former partition, then you may have catalog and/or data corruption to repair, as detailed in the fifth changelog entry below.

Also, in the uncommon case that a database's LC_CTYPE setting is C while its LC_COLLATE setting is some other locale, indexes on textual columns should be reindexed, as described in the sixth changelog entry below.

E.13.2. Changes #

  • Ensure cached plans are marked as dependent on the calling role when RLS applies to a non-top-level table reference (Nathan Bossart) §

    If a CTE, subquery, sublink, security invoker view, or coercion projection in a query references a table with row-level security policies, we neglected to mark the resulting plan as potentially dependent on which role is executing it. This could lead to later query executions in the same session using the wrong plan, and then returning or hiding rows that should have been hidden or returned instead.

    The PostgreSQL Project thanks Wolfgang Walther for reporting this problem. (CVE-2024-10976)

  • Make libpq discard error messages received during SSL or GSS protocol negotiation (Jacob Champion) §

    An error message received before encryption negotiation is completed might have been injected by a man-in-the-middle, rather than being real server output. Reporting it opens the door to various security hazards; for example, the message might spoof a query result that a careless user could mistake for correct output. The best answer seems to be to discard such data and rely only on libpq's own report of the connection failure.

    The PostgreSQL Project thanks Jacob Champion for reporting this problem. (CVE-2024-10977)

  • Fix unintended interactions between SET SESSION AUTHORIZATION and SET ROLE (Tom Lane) § §

    The SQL standard mandates that SET SESSION AUTHORIZATION have a side-effect of doing SET ROLE NONE. Our implementation of that was flawed, creating more interaction between the two settings than intended. Notably, rolling back a transaction that had done SET SESSION AUTHORIZATION would revert ROLE to NONE even if that had not been the previous state, so that the effective user ID might now be different from what it had been before the transaction. Transiently setting session_authorization in a function SET clause had a similar effect. A related bug was that if a parallel worker inspected current_setting('role'), it saw none even when it should see something else.

    The PostgreSQL Project thanks Tom Lane for reporting this problem. (CVE-2024-10978)

  • Prevent trusted PL/Perl code from changing environment variables (Andrew Dunstan, Noah Misch) § § §

    The ability to manipulate process environment variables such as PATH gives an attacker opportunities to execute arbitrary code. Therefore, trusted PLs must not offer the ability to do that. To fix plperl, replace %ENV with a tied hash that rejects any modification attempt with a warning. Untrusted plperlu retains the ability to change the environment.

    The PostgreSQL Project thanks Coby Abrams for reporting this problem. (CVE-2024-10979)

  • Fix updates of catalog state for foreign-key constraints when attaching or detaching table partitions (Jehan-Guillaume de Rorthais, Tender Wang, Álvaro Herrera) § §

    If the referenced table is partitioned, then different catalog entries are needed for a referencing table that is stand-alone versus one that is a partition. ATTACH/DETACH PARTITION commands failed to perform this conversion correctly. In particular, after DETACH the now stand-alone table would be missing foreign-key enforcement triggers, which could result in the table later containing rows that fail the foreign-key constraint. A subsequent re-ATTACH could fail with surprising errors, too.

    The way to fix this is to do ALTER TABLE DROP CONSTRAINT on the now stand-alone table for each faulty constraint, and then re-add the constraint. If re-adding the constraint fails, then some erroneous data has crept in. You will need to manually re-establish consistency between the referencing and referenced tables, then re-add the constraint.

    This query can be used to identify broken constraints and construct the commands needed to recreate them:

    SELECT conrelid::pg_catalog.regclass AS "constrained table",
           conname AS constraint,
           confrelid::pg_catalog.regclass AS "references",
           pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;',
                             conrelid::pg_catalog.regclass, conname) AS "drop",
           pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;',
                             conrelid::pg_catalog.regclass, conname,
                             pg_catalog.pg_get_constraintdef(oid)) AS "add"
    FROM pg_catalog.pg_constraint c
    WHERE contype = 'f' AND conparentid = 0 AND
       (SELECT count(*) FROM pg_catalog.pg_constraint c2
        WHERE c2.conparentid = c.oid) <>
       ((SELECT count(*) FROM pg_catalog.pg_inherits i
        WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND
          EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table
                  WHERE partrelid = i.inhparent)) +
        CASE WHEN pg_catalog.pg_partition_root(conrelid) = confrelid THEN
                  (SELECT count(*) FROM pg_catalog.pg_partition_tree(confrelid)
                    WHERE level = 1)
             ELSE 0 END);
    

    Since it is possible that one or more of the ADD CONSTRAINT steps will fail, you should save the query's output in a file and then attempt to perform each step.

  • Fix test for C locale when LC_COLLATE is different from LC_CTYPE (Jeff Davis) §

    When using libc as the default collation provider, the test to see if C locale is in use for collation accidentally checked LC_CTYPE not LC_COLLATE. This has no impact in the typical case where those settings are the same, nor if both are not C (nor its alias POSIX). However, if LC_CTYPE is C while LC_COLLATE is some other locale, wrong query answers could ensue, and corruption of indexes on strings was possible. Users of databases with such settings should reindex affected indexes after installing this update. The converse case with LC_COLLATE being C while LC_CTYPE is some other locale would cause performance degradation, but no actual errors.

  • Don't use partitionwise joins or grouping if the query's collation for the key column doesn't match the partition key's collation (Jian He, Webbo Han) § §

    Such plans could produce incorrect results.

  • Avoid planner failure after converting an IS NULL test on a NOT NULL column to constant FALSE (Richard Guo) §

    This bug typically led to errors such as variable not found in subplan target lists.

  • Avoid possible planner crash while inlining a SQL function whose arguments contain certain array-related constructs (Tom Lane, Nathan Bossart) §

  • Fix possible wrong answers or wrong varnullingrels planner errors for MERGE ... WHEN NOT MATCHED BY SOURCE actions (Dean Rasheed) § §

  • Fix possible could not find pathkey item to sort error when the output of a UNION ALL member query needs to be sorted, and the sort column is an expression (Andrei Lepikhov, Tom Lane) §

  • Fix edge case in B-tree ScalarArrayOp index scans (Peter Geoghegan) §

    When a scrollable cursor with a plan of this kind was backed up to its starting point and then run forward again, wrong answers were possible.

  • Fix assertion failure or confusing error message for COPY (query) TO ..., when the query is rewritten by a DO INSTEAD NOTIFY rule (Tender Wang, Tom Lane) §

  • Fix validation of COPY's FORCE_NOT_NULL and FORCE_NULL options (Joel Jacobson) §

    Some incorrect usages are now rejected as they should be.

  • Fix server crash when a json_objectagg() call contains a volatile function (Amit Langote) §

  • Fix detection of skewed data during parallel hash join (Thomas Munro) §

    After repartitioning the inner side of a hash join because one partition has accumulated too many tuples, we check to see if all the partition's tuples went into the same child partition, which suggests that they all have the same hash value and further repartitioning cannot improve matters. This check malfunctioned in some cases, allowing repeated futile repartitioning which would eventually end in a resource-exhaustion error.

  • Avoid crash when ALTER DATABASE SET is used to set a server parameter that requires search-path-based lookup, such as default_text_search_config (Jeff Davis) §

  • Avoid repeated lookups of opclasses and collations while creating a new index on a partitioned table (Tom Lane) §

    This was problematic mainly because some of the lookups would be done with a restricted search_path, leading to unexpected failures if the CREATE INDEX command referenced objects outside pg_catalog.

    This fix also prevents comments on the parent partitioned index from being copied to child indexes.

  • Add missing dependency from a partitioned table to a non-built-in access method specified in CREATE TABLE ... USING (Michael Paquier) §

    Dropping the access method should be blocked when a table exists that depends on it, but it was not, allowing subsequent odd behavior. Note that this fix only prevents problems for partitioned tables created after this update.

  • Disallow locale names containing non-ASCII characters (Thomas Munro) §

    This is only an issue on Windows, as such locale names are not used elsewhere. They are problematic because it's quite unclear what encoding such names are represented in (since the locale itself defines the encoding to use). In recent PostgreSQL releases, an abort in the Windows runtime library could occur because of confusion about that.

    Anyone who encounters the new error message should either create a new duplicated locale with an ASCII-only name using Windows Locale Builder, or consider using BCP 47-compliant locale names like tr-TR.

  • Fix race condition in committing a serializable transaction (Heikki Linnakangas) §

    Mis-processing of a recently committed transaction could lead to an assertion failure or a could not access status of transaction error.

  • Fix race condition in COMMIT PREPARED that resulted in orphaned 2PC files (wuchengwen) §

    A concurrent PREPARE TRANSACTION could cause COMMIT PREPARED to not remove the on-disk two-phase state file for the completed transaction. There was no immediate ill effect, but a subsequent crash-and-recovery could fail with could not access status of transaction, requiring manual removal of the orphaned file to restore service.

  • Avoid invalid memory accesses after skipping an invalid toast index during VACUUM FULL (Tender Wang) §

    A list tracking yet-to-be-rebuilt indexes was not properly updated in this code path, risking assertion failures or crashes later on.

  • Fix ways in which an in place catalog update could be lost (Noah Misch) § § § § § § §

    Normal row updates write a new version of the row to preserve rollback-ability of the transaction. However, certain system catalog updates are intentionally non-transactional and are done with an in-place update of the row. These patches fix race conditions that could cause the effects of an in-place update to be lost. As an example, it was possible to forget having set pg_class.relhasindex to true, preventing updates of the new index and thus causing index corruption.

  • Reset catalog caches at end of recovery (Noah Misch) §

    This prevents scenarios wherein an in-place catalog update could be lost due to using stale data from a catalog cache.

  • Avoid using parallel query while holding off interrupts (Francesco Degrassi, Noah Misch, Tom Lane) § §

    This situation cannot arise normally, but it can be reached with test scenarios such as using a SQL-language function as B-tree support (which would be far too slow for production usage). If it did occur it would result in an indefinite wait.

  • Ignore not-yet-defined Portals in the pg_cursors view (Tom Lane) §

    It is possible for user-defined code that inspects this view to be called while a new cursor is being set up, and if that happens a null pointer dereference would ensue. Avoid the problem by defining the view to exclude incompletely-set-up cursors.

  • Avoid unexpected table_index_fetch_tuple call during logical decoding error while decoding a transaction involving insertion of a column default value (Takeshi Ideriha, Hou Zhijie) § §

  • Reduce memory consumption of logical decoding (Masahiko Sawada) §

    Use a smaller default block size to store tuple data received during logical replication. This reduces memory wastage, which has been reported to be severe while processing long-running transactions, even leading to out-of-memory failures.

  • Fix behavior of stable functions called from a CALL statement's argument list, when the CALL is within a PL/pgSQL EXCEPTION block (Tom Lane) §

    As with a similar fix in our previous quarterly releases, this case allowed such functions to be passed the wrong snapshot, causing them to see stale values of rows modified since the start of the outer transaction.

  • Parse libpq's keepalives connection option in the same way as other integer-valued options (Yuto Sasaki) §

    The coding used here rejected trailing whitespace in the option value, unlike other cases. This turns out to be problematic in ecpg's usage, for example.

  • In ecpglib, fix out-of-bounds read when parsing incorrect datetime input (Bruce Momjian, Pavel Nekrasov) §

    It was possible to try to read the location just before the start of a constant array. Real-world consequences seem minimal, though.

  • Fix psql's describe commands to again work with pre-9.4 servers (Tom Lane) §

    Commands involving display of an ACL (permissions) column failed with very old PostgreSQL servers, due to use of a function not present in those versions.

  • Avoid hanging if an interval less than 1ms is specified in psql's \watch command (Andrey Borodin, Michael Paquier) §

    Instead, treat this the same as an interval of zero (no wait between executions).

  • Fix failure to find replication password in ~/.pgpass (Tom Lane) §

    pg_basebackup and pg_receivewal failed to match an entry in ~/.pgpass that had replication in the database name field, if no -d or --dbname switch was supplied. This resulted in an unexpected prompt for password.

  • In pg_combinebackup, throw an error if an incremental backup file is present in a directory that is supposed to contain a full backup (Robert Haas) §

  • In pg_combinebackup, don't construct filenames containing double slashes (Robert Haas) §

    This caused no functional problems, but the duplicate slashes were visible in error messages, which could create confusion.

  • Avoid trying to reindex temporary tables and indexes in vacuumdb and in parallel reindexdb (VaibhaveS, Michael Paquier, Fujii Masao, Nathan Bossart) § § §

    Reindexing other sessions' temporary tables cannot work, but the check to skip them was missing in some code paths, leading to unwanted failures.

  • Fix incorrect LLVM-generated code on ARM64 platforms (Thomas Munro, Anthonin Bonnefoy) §

    When using JIT compilation on ARM platforms, the generated code could not support relocation distances exceeding 32 bits, allowing unlucky placement of generated code to cause server crashes on large-memory systems.

  • Fix a few places that assumed that process start time (represented as a time_t) will fit into a long value (Max Johnson, Nathan Bossart) §

    On platforms where long is 32 bits (notably Windows), this coding would fail after Y2038. Most of the failures appear only cosmetic, but notably pg_ctl start would hang.

  • Update time zone data files to tzdata release 2024b (Tom Lane) § §

    This tzdata release changes the old System-V-compatibility zone names to duplicate the corresponding geographic zones; for example PST8PDT is now an alias for America/Los_Angeles. The main visible consequence is that for timestamps before the introduction of standardized time zones, the zone is considered to represent local mean solar time for the named location. For example, in PST8PDT, timestamptz input such as 1801-01-01 00:00 would previously have been rendered as 1801-01-01 00:00:00-08, but now it is rendered as 1801-01-01 00:00:00-07:52:58.

    Also, historical corrections for Mexico, Mongolia, and Portugal. Notably, Asia/Choibalsan is now an alias for Asia/Ulaanbaatar rather than being a separate zone, mainly because the differences between those zones were found to be based on untrustworthy data.

FAQ