E.38. Выпуск 10.20

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

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

Сообщество PostgreSQL прекратит выпуск обновлений серии 10.X в ноябре 2022 г. Поэтому пользователям не следует медлить с переходом на более новую основную версию.

E.38.1. Миграция на версию 10.20

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Исправление диагностики и обработки ошибок в 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, не переходя в содержащий их каталог (Антон Волошин, Эндрю Дунстан)