E.10. Выпуск 12.1

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

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

E.10.1. Миграция на версию 12.1

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

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

  • Устранение сбоя при выполнении команды ALTER TABLE, добавляющей столбец без значения по умолчанию, одновременно с другими изменениями, требующими перезаписи таблицы (Андрес Фройнд)

  • Исправление обработки блокировок в REINDEX CONCURRENTLY (Микаэль Пакье)

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

  • Устранение сбоя, возникавшего в условиях гонки при передаче информации о прогрессе команды CREATE INDEX CONCURRENTLY или REINDEX CONCURRENTLY (Альваро Эррера)

  • Ликвидация ошибки, приводившей к дублированию записей о зависимостях при выполнении REINDEX CONCURRENTLY (Микаэль Пакье)

    Из-за этой ошибки замусоривался каталог pg_depend; никаких более серьёзных последствий она не имела.

  • Исключение попыток заморозить в ходе VACUUM идентификатор старой мультитранзакции, включающей всё ещё выполняющуюся транзакцию (Натан Боссарт, Джереми Шнайдер)

    В подобной ситуации выполнение VACUUM прерывалась ошибкой, пока не завершалась старая транзакция.

  • Устранение ошибки «wrong type of slot» (неправильный тип слота), возникавшей при попытке выполнить CLUSTER для индекса по выражению (Андрес Фройнд)

  • Устранение ошибки при выполнении SET CONSTRAINTS ... DEFERRED с секционированными таблицами, сопровождаемой некорректным сообщением об отсутствии триггеров (Альваро Эррера)

  • Ликвидация ошибки, возникавшей при создании индексов секции в случае наличия в родительской таблице удалённых столбцов (Микаэль Пакье)

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

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

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

    В случае неудачи флаг pg_class.relispartition оставался в некорректном состоянии, в результате чего последующая операция DROP INDEX не могла выполниться.

  • Исправление обработки членов класса эквивалентности для соединений с учётом секционирования (Амит Ланготе)

    В результате дефекта либо не использовался подходящий план соединения с учётом секционирования, либо возникала ошибка планировщика «could not find pathkey item to sort» (не удалось найти элемент ключа пути для сортировки).

  • Реализация должной обработки выражений смещения в предложениях WINDOW при манипуляциях с выражениями запросов (Эндрю Гирт)

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

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

  • Ликвидация сбоя, происходившего при перепроверке EvalPlanQual для таблицы с триггером BEFORE UPDATE (Андрес Фройнд)

  • Устранение ошибки «unexpected relkind» (неожиданный вид отношения) при попытке обращения запроса к таблице TOAST (Джон Сюй, Микаэль Пакье, Том Лейн)

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

  • Передача ожидаемого контекста ошибки в случае возникновения ошибки при изменении параметров GUC в ходе запуска параллельного исполнителя (Томас Манро)

  • Осуществление вызова fsync() только для тех файлов, которые открываются для чтения/записи (Андрес Фройнд, Микаэль Пакье)

    В некоторых местах кода были попытки вызывать эту функцию и для файлов, открываемых только для чтения, но на некоторых платформах при этом возникают ошибки вида «bad file descriptor» (плохой дескриптор файла).

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

    Ранее существовало жёсткое ограничение размера входной строки в 0.25 ГБ, но сейчас преобразование будет успешным, если результат преобразования умещается в 1 ГБ.

  • Выбор по возможности более компактных хранилищ кортежей для оконных функций (Эндрю Гирт)

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

  • Возможность освобождения памяти функцией repalloc() при значительном уменьшении размера большого блока (Том Лейн)

  • Обеспечение удаления временных файлов WAL и истории по завершении восстановления архива (Савада Масахико)

  • Устранение ошибки, не позволяющей восстановить архив при включении параметра recovery_min_apply_delay (Масао Фудзии)

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

  • Исключение обработки параметров restore_command, recovery_end_command и recovery_min_apply_delay при восстановлении после сбоя (Фудзии Масао)

    Теперь эти параметры могут задаваться в postgresql.conf, и во время восстановления после сбоя они могут иметь непустые значения, однако учитываться эти значения не должны. Таким образом, в процессе восстановления после сбоя перечисленные параметры должны игнорироваться.

  • Устранение ошибки при логической репликации, когда публикующий сервер и подписчик имеют разные представления о столбцах идентификации реплики (Жеан-Гийом де Рорте, Питер Эйзентраут)

    Если на подписчике частью ключа идентификации реплики объявлялся столбец, вовсе отсутствующий на публикующем сервере, при репликации выдавались ошибки «negative bitmapset member not allowed» (отрицательный элемент в битовой карте не допускается).

  • Недопущение нежелательной задержки при отключении процесса walsender, участвующего в логической репликации (Крейг Рингер, Альваро Эррера)

  • Исправление обработки тайм-аута в процессах walreceiver, участвующих в логической репликации (Жюльен Руо)

    Ошибочная логика препятствовала использованию wal_receiver_timeout при логической репликации.

  • Исправление передачи меток времени в сообщениях репликации для логического декодирования (Джефф Джейнс)

    В частности, в результате допущенной ошибки поле pg_stat_subscription.last_msg_send_time обычно содержало NULL.

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

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

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

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

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

    Если в ваших таблицах могли сохраниться некорректные данные в результате выполнения bitshiftright(), их можно исправить примерно так:

    UPDATE mytab SET bitcol = ~(~bitcol) WHERE bitcol != ~(~bitcol);
  • Исправление результата текстовой функции position() (имеющей также псевдоним strpos()) для пустой искомой строки (Том Лейн)

    Ранее с таким аргументом возвращалось 1 (и это поведение соответствует стандарту SQL), но в 12.0 стал возвращаться ноль.

  • Исправление проверки целочисленного переполнения при умножении интервалов в особых случаях (Юя Ватари)

  • Устранение сбоев при обработке некорректных данных аффиксов в словарях текстового поиска ispell (Артур Закиров)

  • Ликвидация утечки памяти при очистке индекса GiST (Дилип Кумар)

  • Поддержка ещё одного варианта названия локали норвежского букмола «Norwegian (Bokmål)» в Windows (Том Лейн)

  • Исправление в libpq обработки строковых значений целочисленных параметров, содержащих замыкающие пробелы (Микаэль Пакье)

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

  • Передача корректного состояния соединения (CONNECTION_BAD) в libpq при обнаружении синтаксической ошибки в значении параметра connect_timeout (Ларс Канис)

  • Устранение ошибки компиляции клиентского кода ECPG, включающего заголовочный файл ecpglib.h, при определённом макросе ENABLE_NLS (Том Лейн)

    Этот дефект стал следствием некорректного размещения объявления функции ecpg_gettext() — она не должна быть видна в клиентском коде.

  • Исправление планирования параллельного восстановления ограничения внешнего ключа в секционированной таблице (Альваро Эррера)

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

  • Обеспечение ожидаемого порядка в выводе pg_dump одинаково названных триггеров и объектов политики защиты на уровне строк (Бенджи Гиллам)

    Ранее, если два триггера разных таблиц назывались одинаково, они сортировались по OID, тогда как предпочтительнее была бы сортировка по имени таблицы. То же наблюдалось и с политиками RLS.

  • Реализация в pg_upgrade жёсткого отказа от обработки таблиц со столбцами типа sql_identifier, так как его представление поменялось в 12 версии (Томаш Вондра)

  • Улучшение в pg_upgrade проверок использования типа данных, представление которого изменилось, например line (Томаш Вондра)

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

  • Предотвращение изменения pg_control при запуске pg_rewind с ключом --dry-run (Алексей Кондратов)

    Прежнее поведение могло приводить к сбоям при последующих вызовах pg_rewind.

  • Исправление ошибки при работе pg_waldump с ключом -s, когда запись продолжения WAL заканчивается ровно на границе страницы (Андрей Лепихов)

  • Устранение ненужного перевода строк в выводе pg_waldump с ключом --bkp-details при описании WAL-записей, отражающих запись полных страниц (Андрес Фройнд)

  • Устранение небольшой утечки памяти в pg_waldump (Андрес Фройнд)

  • Возвращение функции pqsignal() в число экспортируемых символов libpq (Том Лейн)

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

  • Исправление в configure проверки наличия libperl для совместимости с последними выпусками Red Hat (Том Лейн)

    Ранее проверка могла не работать, когда пользователь устанавливал в CFLAGS значение -O0.

  • Обеспечение корректной генерации кода циклических блокировок (spinlock) на PowerPC (Ной Миш)

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

  • Отказ от использования ключа компилятора -qsrcmsg в AIX (Ной Миш)

    Таким образом удалось обойти внутреннюю ошибку компилятора xlc v16.1.0, и это повлияло лишь на формат выдаваемых компилятором сообщений об ошибках.

  • Исправление процедуры сборки MSVC для корректной обработки пробелов в пути к OpenSSL (Эндрю Дунстан)