E.40. Выпуск 13.11
Дата выпуска: 2023-05-11
В этот выпуск вошли различные исправления, внесённые после версии 13.10. За информацией о нововведениях версии 13 обратитесь к Разделу E.51.
E.40.1. Миграция на версию 13.11
Если используется версия 13.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 13.7, см. также Раздел E.44.
E.40.2. Изменения
- Устранение уязвимости команды - CREATE SCHEMAпри внесении изменений в- search_path(Александр Лахин) § §- В команде - CREATE SCHEMAобъекты в текущем- search_path, а также объекты в новой схеме были видны даже внутри вызываемой функции или скрипта, пытающихся задать безопасный- search_path. Это потенциально позволяло любому пользователю, имеющему разрешение на создание схемы, перехватить права функции, определяющей контекст безопасности, или скрипта расширения.- Проект PostgreSQL благодарит Александра Лахина за сообщение об этой проблеме. (CVE-2023-2454) 
- Исправление применения политик защиты на уровне строк после встраивания функции, возвращающей множества (Стивен Фрост, Том Лейн) § - Если функция языка SQL, возвращающая множество, обращалась к таблице с политиками защиты на уровне строк и могла быть встроена в вызывающий запрос, эти политики защиты не применялись должным образом в некоторых случаях переиспользования кешированного плана другой ролью. При этом пользователь мог видеть или изменять строки, которые должны были быть невидимыми. - Проект PostgreSQL благодарит Вольфганга Вальтера за сообщение об этой проблеме. (CVE-2023-2455) 
- Предотвращение сбоев при выполнении - CREATE SCHEMAбез указания имени новой схемы (Микаэль Пакье) §- В соответствии со стандартом SQL допускается написание - CREATE SCHEMA AUTHORIZATION, при этом именем схемы становится- имя_владельца- имя_владельца. Однако в некоторых местах кода требовалось наличие имени схемы, что приводило к сбою.
- Исправление включения/отключения «клонированных» триггеров в секционированных таблицах (Том Лейн) - Команда - ALTER TABLE ... ENABLE/DISABLE TRIGGER USERпропускала «клонированные» триггеры, ошибочно принимая их за системные. В других вариантах- ENABLE/DISABLE TRIGGERэти триггеры обрабатывались, но только после ненужной проверки наличия прав суперпользователя.
- Запрет изменения составных типов, хранящихся в индексах (Том Лейн) - В команде - ALTER TYPEзапрещено использовать несовместимые на двоичном уровне изменения составных типов, хранящихся в каких-либо столбцах таблицы. (Возможно, когда-нибудь это будет разрешено, но пока этого не произошло; последствия блокировок перезаписи множества таблиц пугают.) Ранее не была замечена возможность, что индекс может содержать составной тип, которого нет в таблице этого индекса.
- Запрет использования системных столбцов как элементов внешних ключей (Том Лейн) § - С тех пор, как системный столбец OID был удалён, использование системных столбцов в качестве элементов внешних ключей не предполагается и в разных местах кода не поддерживается. Поэтому теперь такое использование запрещается, чтобы не исправлять поведение для всех случаев. 
- Запрет копирования строк дочерних таблиц при выполнении команды - COPY TOдля таблицы с включённой защитой на уровне строк (Антонин Хоуска) §- В документации ясно указано, что - COPY TOкопирует строки только из указанной таблицы, а не её дочерних таблиц. Однако если для таблицы была включена защита на уровне строк, это не работало.
- Предотвращение возможных сбоев при передаче пустого массива функциям - array_position()и- array_positions()(Том Лейн)
- Исправление возможного чтения за пределами выборки данных функцией - to_char()(Том Лейн) §- В особом случае это могло приводить к краху сервера. 
- Исправление выхода за границу буфера в функции - translate()(Даниил Анисимов) §- При использовании возможности удаления функция могла читать из входной строки на один байт больше, чем нужно, что создавало небольшой риск сбоя. 
- Исправление объявления курсора для ошибок разбора в строковых константах JSON (Том Лейн) § - В большинстве случаев, когда в строковом литерале внутри значения JSON обнаруживалась синтаксическая ошибка, не удавалось правильно установить курсор ошибки. В результате выдавалось бесполезное сообщение об ошибке (указывающее на фрагмент перед строкой, а не на фактическую проблемную зону), а в версии 14 и выше даже мог происходить сбой. 
- Устранение повреждения данных, вызванного превышением значения переменной - vacuum_defer_cleanup_ageтекущего 64-битного XID (Андрес Фройнд) §- В версии 14 и выше при нестандартных значениях - vacuum_defer_cleanup_ageXID горизонта очистки мог оказаться слишком большим, что приводило к удалению ещё живых строк при очистке. В версиях 12 и 13 эта проблема затрагивала только индексы GiST, что могло приводить к досрочной перезаписи страниц индекса.
- Исправление ошибки анализатора запроса, из-за которой в особых случаях могли не обнаруживаться неправильно вложенные агрегатные функции (Том Лейн) § - В результате данного упущения мог возникать сбой исполнителя при запросах, которые должны были быть отклонены как недопустимые. 
- Устранение повреждения структуры данных при разборе параметров - SEQUENCE NAME(Дэвид Роули) §- Если событийный триггер перехватывал повреждённое дерево запроса, могли возникать проблемы. 
- Корректное обновление характеристик безопасности распараллеливания узлов плана при перемещении инициализирующих планов с одного узла на другой (Том Лейн) § - В результате данного упущения планировщик мог выдавать ошибки «subplan was not initialized» (подплан не был инициализирован). 
- Отключение оптимизации обратного перехода для оконных агрегатных функций, когда вызов содержит вложенные операторы SELECT (Дэвид Роули) § - Для данной оптимизации необходимо, чтобы выражения аргументов агрегатной функции возвращали повторяющиеся результаты, что может не выполняться для вложенного SELECT. 
- Исправление ошибок при выполнении вложенных конструкций - ARRAY[](Александр Лахин, Том Лейн) §- Теперь корректно выявляется переполнение общего объёма, необходимого для массива результатов, что позволяет устранить возможный сбой из-за выделения недостаточного объёма для вывода. Кроме того, обеспечивается обнуление любого дополняющего пробела в результирующем массиве; хотя оставлять в нём мусор, как правило, безвредно, позднее это могло приводить к непредсказуемому поведению. 
- Предотвращение сбоя при изменении поля в столбце массива доменного типа, созданного поверх составного типа (Дмитрий Долгов) § 
- Исправление логики отсечения секций для секционирования по логическим столбцам (Дэвид Роули) § - Отсечение с таким условием, как - boolcol IS NOT TRUE, выполнялось неправильно, что могло приводить к тому, что строки, в которых- boolcolравен NULL, не возвращались. Кроме того, обрабатывался неправильно довольно редкий случай секционирования при- NOT boolcol.
- Устранение условий гонки при очистке по порциям во время параллельного хеш-соединения (Томас Манро, Мелани Плейгман) § - При неудачном выборе времени и - parallel_leader_participation=- off(не являющимся значением по умолчанию) был возможен сбой.
- Повторное вычисление столбцов - GENERATEDпосле проверки EvalPlanQual (Том Лейн) §- В режиме изоляции - READ COMMITTEDмогло потребоваться повторное применение результатов изменения строки к её более новой версии, чем первоначально обнаруженная запросом. В таком случае любые столбцы- GENERATEDтеперь вычисляются повторно, если они зависят от столбцов, изменённых параллельно.
- Отключение балансировки задержки очистки по стоимости, если параметр - vacuum_cost_delayв таблице для каждого отношения равен нулю (Масахико Савада)- Балансировка задержки должна отключаться каждый раз, когда автоочистка обрабатывает таблицу с параметром - vacuum_cost_delay, заданным для каждого отношения, но это было реализовано только для положительных значений, не включая ноль.
- Устранение сбоев в особых случаях при добавлении столбцов в конец представления (Том Лейн) § 
- Исправление ошибки, редко возникавшей во вложенных планах MULTIEXPR_SUBLINK при изменении секционированных таблиц (Том Лейн) § - Использование синтаксиса - INSERT ... ON CONFLICT DO UPDATE SET (c1, ...) = (SELECT ...)с секционированной целевой таблицей могло приводить к ошибке, если какая-либо дочерняя таблица отличалась от родительской (например, имела другой физический порядок столбцов). Обычно это проявлялось как ошибка при проверке согласованности в исполнителе; но также был возможен сбой или некорректное изменение данных.
- Исправление обработки маркеров - DEFAULTв многострочном запросе- INSERT ... VALUESк представлению с правилом- DO ALSO INSERT ... SELECT(Дин Рашид) §- Такие случаи обычно заканчивались ошибками «unrecognized node type» (нераспознанный тип узла) или сбоями проверочных утверждений. 
- Поддержка ссылок на - OLDи- NEWв подзапросах внутри действий правил (Дин Рашид, Том Лейн) §- Такие ссылки на самом деле являются ссылками - LATERAL, но если подзапрос не был явно помечен как- LATERAL, это могло вызывать крах сервера. При необходимости это выполняется неявно.
- Обеспечение написания правильного псевдонима целевой таблицы при декомпиляции правила или тела SQL-функции, содержащего - INSERT/- UPDATE/- DELETEвнутри- WITH(Том Лейн) §
- Устранение ошибок в оптимизации - SERIALIZABLE READ ONLY(Томас Манро) § §- Транзакции, уже помеченные как «обречённые», запутывали оптимизацию безопасных снимков для транзакций - SERIALIZABLE READ ONLY. В некоторых случаях оптимизация необоснованно пропускалась. В других случаях происходил сбой проверочного утверждения (но в сборках без проверочных утверждений проблем не наблюдалось).
- Предотвращение утечки слотов обработчика кеша в модуле логического декодирования - pgoutput(Ши Юй) §- Несколько циклов запуска и отключения модуля в течение одного сеанса в конечном итоге могли приводить к ошибке «out of relcache_callback_list slots» (нет свободных слотов relcache_callback_list). 
- Исключение ненужных вызовов пользовательских функций проверки для параметров класса операторов индекса (Александр Коротков) § - Это изменение исправляет поведение в некоторых случаях, когда возникала непредвиденная ошибка. 
- Исправление обращения к недействительному указателю при построении индекса GiST с буферизацией (Александр Лахин) § - Эта ошибка должна быть безобидной в обычных сборках, поскольку получаемое значение не является критичным; но потенциально она могла приводить к краху сервера. 
- Игнорирование удалённых столбцов и генерируемых столбцов во время логической репликации действий изменения или удаления (Ондер Каладжи, Ши Юй) § § - Ранее репликация с параметром - REPLICA IDENTITY FULLзавершалась ошибкой, если таблица содержала такие столбцы.
- Исправление имени события ожидания в вводе-выводе буфера SLRU для времени фиксации транзакции (Александр Лахин) § - Это событие ожидания согласно документации называлось - CommitTsBuffer, но в коде оно было указано как- CommitTSBuffer. Код был изменён для соответствия документации, поскольку так он согласуется с именами других событий ожидания.
- Устранение возможного антипереполнения при расчёте количества сохраняемых сегментов WAL (Кётаро Хоригути) § - Это могло приводить к неправильному учёту - wal_keep_size.
- Поддержка сертификатов RSA-PSS со связыванием каналов SCRAM-SHA-256 (Джейкоб Чемпион, Хейкки Линнакангас) § - Для этой функциональности требуется сборка с OpenSSL 1.1.1 или выше. Она влияет как на сервер, так и на libpq. 
- Устранение условий гонки при отслеживании идентификатора процесса в Windows (Томас Манро) § § - Операционная система могла повторно использовать PID до того, как управляющий процесс postmaster обнаруживал, что этот дочерний процесс исчез. Это могло приводить к отслеживанию более чем одного дочернего процесса с одним и тем же PID, что вызывало путаницу. 
- Добавление недостающих кодов состояния в - SPI_result_code_string()(Дин Рашид) §
- Исправление ошибочных отметок Valgrind для - AllocSetRealloc()(Карина Лицкевич) §- В особом случае при уменьшении размера большого (>8КБ) непрерывного блока памяти, выделенного через palloc, сборка под контролем Valgrind могла неправильно отметить состояние памяти, освобождённой от порции, что могло приводить к неверным результатам во время тестирования Valgrind. 
- Предотвращение сбоя проверочного утверждения при декодировании сообщения логической репликации транзакций (Томаш Вондра) § 
- Недопущение зависимости от локали при обработке спецсимволов регулярных выражений (Джефф Дэвис) § - Использование обратной косой черты, за которой следовал символ не из кодировки ASCII, иногда могло приводить к сбою проверочного утверждения в зависимости от текущей локали. 
- Недопущение создания пустых записей WAL в - log_newpage_range(), когда последние несколько страниц в указанном диапазоне пусты (Маттиас ван де Меент) §- Не совсем ясно, возможно ли это на практике в выпущенных версиях, но если это так, то мог происходить сбой проверочного утверждения. 
- Устранение утечки памяти во время существования сеанса в блоках plpgsql - DO, в которых используются выражения приведения типа (Аджит Авекар, Том Лейн) §
- Уточнение проверки размерности массива при преобразовании структур списка Perl в многомерные массивы SQL (Том Лейн) § - plperl мог вести себя неправильно при несогласованной вложенности списков, когда данные представляли собой не прямоугольный массив значений. В таких случаях теперь возникает ошибка, но раньше они могли приводить к сбою или возвращался мусор. 
- Уточнение проверки размерности массива при преобразовании структур списка Python в многомерные массивы SQL (Том Лейн) § § - plpython мог вести себя неправильно при работе с пустыми вложенными списками или несогласованной вложенности таких списков, когда данные представляли собой не прямоугольный массив значений. В первом случае должен был выдаваться пустой массив, а во втором — ошибка. Однако в некоторых случаях происходил сбой, а в других выводился неожиданный результат. 
- Исправление раскрутки стека исключений в plpython (Син Го) § - В редких случаях ошибок очистка стека исключений PG_TRY могла не происходить, что могло приводить к сбою, если другая ошибка возникала до того, как поднимался следующий уровень стека. 
- Исправление непоследовательной обработки ошибок GSS-шифрования в функции - PQconnectPoll()расширения libpq (Микаэль Пакье)- Если для параметра - gssencmodeустановлено значение- require, соединение не помечалось как разорванное после сбоя инициализации GSS. Теперь работа немедленно прекращается, как это уже давно было сделано для аналогичного случая с шифрованием TLS.
- Предупреждение возможного повреждения данных в программах ecpg, собранных с параметром - -C ORACLE(Кётаро Хоригути)- При вызове функции - ecpg_get_data()с нулевым значением- varcharsizeона могла записать завершающий нулевой символ в последний байт предыдущего поля, усекая данные в этом поле.
- Внесение исправлений в код pg_dump для последующего успешного восстановления секционированных таблиц с хеш-секционированием по столбцу типа-перечисления (Том Лейн) § - Поскольку хеш-коды для значений типа-перечисления зависят от OID, присвоенных перечислению, они обычно отличаются после выгрузки и восстановления, а это означает, что строки часто оказываются не в той секции, где они были изначально. Пользователи могут изменить это поведение, указав параметр - --load-via-partition-root; но поскольку без него шансов на успех почти нет, pg_dump теперь автоматически применяет его к таким таблицам.- Кроме того, исправлено поведение pg_restore, чтобы исключить попытки выполнить команду - TRUNCATEдля целевых таблиц перед восстановлением данных в них при использовании- --load-via-partition-root. Это позволяет избежать взаимоблокировок и потери данных.
- Предотвращение сбоев в - contrib/hstore_plpython, если преобразуемое значение Python не является сопоставлением (Дмитрий Долгов, Том Лейн)- В таких случаях должна была возникать ошибка, но в Python 3 некоторые API изменились таким образом, что проверка работала неправильно и приводила к сбою. 
- Требование использования значений, кратных 4, для параметра - siglenиндекса GiST в столбце- ltree(Александр Коротков) §- Другие значения приводили к несогласованному обращению к содержимому индекса, что безвредно на оборудовании, совместимом с Intel, но могло приводить к сбою на некоторых других архитектурах. 
- Исправление неправильного поведения в - contrib/pg_trgmв случае, когда условие регулярного выражения не удовлетворяется (Том Лейн) §- Регулярное выражение, такое как - $foo, является допустимым, но невыполнимым; компилятор регулярных выражений распознаёт это и создаёт пустую диаграмму НКА. Попытка оптимизировать такую диаграмму для сканирования индекса GIN или GiST в pg_trgm приводила к выходу за границу рабочего массива, что могло вызывать сбои.
- Использование параметра - --strip-unneededпри удалении лишнего из статических библиотек GNU-совместимым расширением strip (Том Лейн)- Ранее процедура - make install-stripиспользовала в этом случае параметр- -x. Это изменение позволяет избежать неправильного поведения llvm-strip, а также немного сокращает вывод.
- Удаление рекомендаций выполнить автоматическую загрузку файлов DTD для сборки документации и полное отключение такой возможности (Александр Алексеев, Питер Эйзентраут, Том Лейн) § - Теперь нет возможности собирать документацию SGML, не установив файлы DTD DocBook локально. Раньше xsltproc мог загружать эти файлы на лету с sourceforge.net; но sourceforge.net сейчас разрешает доступ только по HTTPS, а ни одна версия xsltproc этого не поддерживает. Поэтому части документации, предполагающие, что это возможно или полезно, были удалены, и вместо этого в рецепты сборки был добавлен параметр xsltproc - --nonet.
- Использование подходящего расположения для временного каталога - portlockпри проведении TAP-тестов в сборках PGXS (Питер Эйзентраут)- Теперь этот каталог создаётся в - tmp_checkв каталоге сборки. Раньше сборки с PGXS пытались создавать его в каталоге установки, который не обязательно был доступен для записи.
- Обновление данных часовых поясов до версии tzdata 2023c, включающее изменение правил перехода на летнее время в Египте, Гренландии, Марокко и Палестине. § - Для обозначения московского времени в часовых поясах Europe/Kirov и Europe/Volgograd теперь вместо числовых аббревиатур используются аббревиатуры MSK/MSD для согласованности с другими часовыми поясами, использующими московское время. Кроме того, часовой пояс America/Yellowknife теперь идентичен America/Edmonton; это отражается на некоторых временных метках до 1948 года в данной зоне.