E.35. Выпуск 13.6

Дата выпуска: 2022-02-10

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

E.35.1. Миграция на версию 13.6

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

Если вы выполняли операцию REINDEX CONCURRENTLY с индексами TOAST-таблиц или наблюдаете ошибки при обращении к данным TOAST, обратите внимание на первый пункт в списке изменений.

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

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

  • Реализация стандартного протокола блокировок при изменении данных в таблицах TOAST для предотвращения проблем при REINDEX CONCURRENTLY (Микаэль Пакье)

    При обработке TOAST-таблицы или индекса TOAST-таблицы операция REINDEX CONCURRENTLY могла повредить индекс. Причиной тому было то, что сеансы, изменяющие записи TOAST, освобождали свои блокировки ROW EXCLUSIVE немедленно, а не удерживали их до фиксации транзакции, как происходит при любых других изменениях. Теперь код изменения TOAST будет удерживать блокировки таблицы по обычным правилам. Все существующие повреждённые индексы можно исправить, перестроив их.

  • Исключение обращения по нулевому указателю при выполнении ALTER STATISTICS в случае одновременного удаления объекта статистики (Томаш Вондра)

  • Устранение ошибки при построении плана для узлов Append с параллельным выполнением, но с единственным потомком (Дэвид Роули)

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

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

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

  • Представление операции приведения к типу с неопределённым идентификатором в виде узла RelabelType вместо вызова функции с приведением длины (Том Лейн)

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

  • Исправление проверки совпадения типов из семейства anycompatible (Том Лейн)

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

  • Исправление сбоя при воспроизведении WAL в случае, когда состояние согласованности достигается точно на границе страницы WAL (Альваро Эррера)

  • Исправление запуска физической репликации в ситуации, когда произошло зацикливание идентификаторов транзакций (Абхиджит Менон-Сен, Томаш Вондра)

    При запуске реплицирующего сервера в момент, когда последовательность активных транзакций на ведущем пересекает границу зацикливания транзакций (так что у некоторых последних транзакций значения XID оказываются меньше, чем у предшествующих), процесс репликации прерывался с ошибкой «out-of-order XID insertion in KnownAssignedXids» (нарушение порядка при добавлении XID в KnownAssignedXids). Затем процесс репликации перезапускался, но не мог продвинуться дальше этой ошибки.

  • Исключение двойной передачи данных дочерней таблицы при логической репликации (Хоу Чжицзе)

    Если публикация включает и дочернюю, и родительскую таблицу, при этом для публикации установлено свойство publish_via_partition_root, подписчики напрасно проводили синхронизацию обеих таблиц. Теперь в таких случаях будет синхронизироваться только родительская таблица.

  • Устранение лексических ограничений для SQL-команд, выполняемых через подключение логической репликации (Том Лейн)

    Процесс walsender выдавал ошибку при передаче SQL-команд: содержащих точку с запятой без кавычек; содержащих константы в долларах с нечётным количеством апострофов или кавычек; начинающихся с комментария. Более того, в результате дефектной обработки ошибок и последующие команды могли не выполняться из-за неожиданных ошибок.

  • Предотвращение потери времени фиксирования последней подтранзакции для транзакции (Алекс Кингсборо, Кётаро Хоригути)

  • Обеспечение синхронизации с ФС (fsync) подкаталога pg_logical/mappings во время контрольных точек (Натан Боссарт)

    В некоторых файловых системах из-за отсутствия синхронизации файлы состояния логической перезаписи могли потеряться при сбое системы.

  • Построение расширенной статистики для секционированных таблиц (Джастин Призби)

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

  • Исключение расширенной статистики из рассмотрения при обработке деревьев наследования (Джастин Призби)

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

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

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

  • Недопущение операции ALTER TABLE ... DROP NOT NULL со столбцом, включённым в индекс, который используется для идентификации реплики (Хайин Тан, Хоу Чжицзе)

    Тот же запрет существовал ранее для индексов первичных ключей.

  • Обеспечение корректного обновления кешируемого состояния таблицы при ALTER TABLE ADD PRIMARY KEY USING INDEX (Хоу Чжицзе)

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

  • Обеспечение корректного обновления кешируемого состояния таблицы при переключении индекса, используемого для идентификации реплики (Хайин Тан, Хоу Чжицзе)

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

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

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

  • Устранение утечек памяти при выполнении операций REASSIGN OWNED BY, меняющих владельца для множества объектов (Джастин Призби)

  • Увеличение производительности процессов walsender, передающих логические изменения, за счёт оптимизации обращений к кешу (Хоу Чжицзе)

  • Исправление отображения параметров для метода аутентификации cert в представлении pg_hba_file_rules (Магнус Хагандер)

    Метод аутентификации cert подразумевает параметр clientcert=verify-full, но в представлении pg_hba_file_rules выводилось clientcert=verify-ca.

  • Исправление представления переменных, указывающих на всю строку, в правилах INSERT ... VALUES (Том Лейн)

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

  • Устранение выхода за границы буфера на один байт при выполнении нормализации Unicode для пустой строки (Микаэль Пакье)

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

  • Исправление и удаление ряда некорректных проверочных утверждений (Саймон Риггс, Микаэль Пакье, Александр Лахин)

    Устранённые недочёты проявлялись только в отладочных сборках.

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

  • Ликвидация вызова strerror в функции libpq PQcancel (Том Лейн)

    Функция PQcancel должна быть безопасной для вызова из обработчика сигнала, но использованная в ней функция strerror безопасной не является. Такое небезопасное использование могло иметь последствия только в маловероятном случае ошибки при передаче сообщения отмены серверу, что может объяснить отсутствие жалоб на эту проблему со стороны пользователей.

  • Выбор для команды psql \password в качестве целевого пользователя по умолчанию пользователя CURRENT_USER, а не пользователя, изначально установившего подключение (Том Лейн)

    Это соответствует документированному поведению и позволяет исключить проблему отсутствия прав в случае выполнения SET ROLE или SET SESSION AUTHORIZATION после установления подключения. Во избежание путаницы теперь в приглашении для смены пароля выводится имя целевого пользователя.

  • Исправление в запросе, реализующем в psql команду \d, вывода унаследованных от родителя триггеров (Джастин Призби)

    Ранее в случае, когда в таблице-секции имелись триггеры и при этом одноимённые несвязанные триггеры уровня операторов имелись и в родительской таблице этой секции, выдавалась ошибка «more than one row returned by a subquery used as an expression» (подзапрос в выражении вернул больше одной строки).

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

  • Недопущение вызова gettext() в обработчиках сигнала Control-C в psql и некоторых других клиентских программах (Том Лейн)

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

  • Предоставление возможности отменить начальный запрос пароля в pg_receivewal и pg_recvlogical (Том Лейн, Натан Боссарт)

    Ранее эти программы нельзя было прервать сигналом Control-C, когда они запрашивали пароль.

  • Исправление в pg_dump порядка выгрузки определённых пользователем приведений (Том Лейн)

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

  • Исправление в режимах pg_dump --inserts и --column-inserts обработки таблиц, содержащих одновременно и генерируемые, и удалённые столбцы (Том Лейн)

  • Исправление диагностики и обработки ошибок в pg_dump и pg_basebackup (Том Лейн)

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

  • Корректировка результатов сканирования только индекса при использовании индексов contrib/btree_gist, построенных по столбцам char(N) (Том Лейн)

    Ранее при сканировании только индекса значения столбцов выдавались без конечных пробелов, что не является ожидаемым поведением, но именно так данные хранились в этих индексах. В результате исправления код будет сохранять значения char(N) с нужным количеством дополняющих пробелов. Поведение такого индекса не изменится сразу само, если вы не переиндексируете его, однако и без переиндексации значения без конечных пробелов постепенно заменятся полными в процессе изменения данных. На запросы, в которых не использовались планы со сканированием только индекса, это не влияет в любом случае.

  • Смена используемого в configure модуля Python, помогающего определить параметры сборки PL/Python, с устаревшего distutils на sysconfig (Питер Эйзентраут, Том Лейн, Андрес Фройнд)

    Благодаря этому, теперь с Python 3.10 при выполнении configure не выдаются предупреждения о том, что модуль distutils устарел и его планируется удалить в Python 3.12. С выходом 3.12 прежняя реализация configure --with-python предположительно просто не будет работать. Эта подготовка к будущему имеет и обратную сторону: модуль sysconfig появился только в Python 2.7 и в Python 3.2 (в линейке Python 3), поэтому теперь собрать PL/Python с очень старыми версиями Python будет невозможно.

  • Устранение проблемы компиляции PL/Perl в Windows при использовании Perl 5.28 и новее (Виктор Вагнер)

  • Устранение проблемы компиляции PL/Python при использовании Python 3.11 и новее (Питер Эйзентраут)

  • Обеспечение поддержки компиляции с использованием Visual Studio 2022 (Ханс Бушман)

  • Реализация возможности вызывать скрипты-обёртки .bat в нашей сборочной среде MSVC, не переходя в содержащий их каталог (Антон Волошин, Эндрю Дунстан)