E.3. Выпуск 14.2

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

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

E.3.1. Миграция на версию 14.2

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

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

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

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

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

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

  • Устранение повреждения цепочек HOT при переходе кортежа из состояния RECENTLY_DEAD (недавно ставший «мёртвым») в состояние DEAD (окончательно «мёртвый») во время очистки страницы (Андрес Фройнд)

    Ранее операция VACUUM могла удалить кортеж, недавно ставшим «мёртвым», оставив указывающую на него запись перенаправления. Затем, когда место этого кортежа занимал какой-то другой кортеж, он мог оказаться видимым в существующей цепочке HOT, что проявлялось в повреждении индекса. Если это произошло, переиндексирование таблицы должно устранить проблему. Однако это крайне маловероятное событие, поэтому мы не рекомендуем переиндексировать всё просто потому что подобное повреждение возможно.

  • Устранение сбоя при перепроверке в EvalPlanQual для секционированных таблиц, в которых смешиваются локальные и сторонние секции (Эцуро Фудзита)

  • Исправление дефекта с указателями в COPY TO (Бхарат Рупиредди)

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

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

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

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

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

    В результате предотвращаются возникавшие в некоторых случаях ошибки «could not identify a hash function for type record» (не удалось найти функцию хеширования для типа record).

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

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

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

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

  • Исправление в узлах Memoize обработки подпланов, использующих параметры, которые поступают из узла, стоящего над Memoize (Дэвид Роули)

  • Корректировка в узлах плана Memoize обработки нехешируемых операторов соединения (Дэвид Роули)

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

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

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

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

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

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

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

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

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

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

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

  • Корректировка установки времени источника при декодировании реплицируемой операции ROLLBACK PREPARED (Масахико Савада)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Индекс должен работать в таких случаях, но вместо этого выдавалась ошибка «compress method must be defined when leaf type is different from input type» (метод сжатия должен быть определён, когда тип листьев отличается от входного типа).

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

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

  • Устранение утечки памяти при изменении индексов по выражениям (Питер Гейган)

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

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

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

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

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

  • Ограничение назначения вывода pg_log_backend_memory_contexts(), выдаваемого для заданного сеанса, журналом сервера (Фудзии Масао)

    Ранее при достаточно высоком значении client_min_messages выдаваемое в журнал сообщение могло также передаваться подключённому клиенту. Так как клиент его не запрашивал, это могло вызвать недоумение (и, возможно, нарушить протокол передачи данных).

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

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

  • Корректировка вывода параметров функции в конструкции INSERT ... SELECT при формировании определения функции в стиле SQL (Том Лейн)

    Ранее параметры выводились в виде $N, даже если эти параметры имели имена.

  • Устранение выхода за границы буфера на один байт при выполнении нормализации 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 \d сортировки объектов расширенной статистики таблицы по имени, а не по OID (Джастин Призби)

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

  • Устранение ошибок, возникавших в Windows при использовании терминала в качестве источника или получателя данных (Дмитрий Коваль, Хуан Хосе Сантамария Флеча, Микаэль Пакье)

    В результате исправлено поведение команды psql \copy, а также pg_recvlogical с ключом -f -.

  • Недопущение вызова 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) с нужным количеством дополняющих пробелов. Поведение такого индекса не изменится сразу само, если вы не переиндексируете его, однако и без переиндексации значения без конечных пробелов постепенно заменятся полными в процессе изменения данных. На запросы, в которых не использовались планы со сканированием только индекса, это не влияет в любом случае.

  • Исправление в postgres_fdw обработки асинхронных запросов в особых случаях (Эцуро Фудзита)

    Следствием устранённых теперь дефектов могли быть сбои или некорректные результаты при попытке произвести параллельное сканирование сторонних таблиц.

  • Смена используемого в 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 будет невозможно.

  • Возвращение возможности кросс-компиляции без использования OpenSSL (Том Лейн)

    Скрипт configure должен был просто рассчитывать на то, что устройство /dev/urandom будет присутствовать в целевой системе, но вместо этого он выдавал ошибку.

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

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

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

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