E.52. Выпуск 11.3
Дата выпуска: 2019-05-09
В этот выпуск вошли различные исправления, внесённые после версии 11.2. За информацией о нововведениях версии 11 обратитесь к Разделу E.55.
E.52.1. Миграция на версию 11.3
Если используется версия 11.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 11.1, см. также Раздел E.54.
E.52.2. Изменения
- Устранение возможности обойти политики защиты на уровне строк (RLS), используя оценки избирательности (Дин Рашид) - При вычислении оценок избирательности планировщик применяет пользовательские операторы к значениям, находящимся в - pg_statistic(то есть к самым частым значениям). Таким образом, негерметичный оператор может раскрыть некоторые данные в столбце таблицы, даже если пользователь не имеет доступа к этому столбцу. В CVE-2017-7484 мы добавили ограничения для предотвращения этой утечки, но не учли особенности защиты на уровне строк. Пользователь, которому в SQL дано право чтения столбца, но политикой RLS запрещён доступ к некоторым строкам, тем не менее мог получить некоторые сведения об их содержимом через негерметичный оператор. Это исправление усиливает ограничения, разрешая применение негерметичных операторов к статистическим данным только при отсутствии политики RLS. (CVE-2019-10130)
- Предотвращение доступа к ранее освобождённой памяти при формировании сообщения об ошибке размещения кортежа в секции (Микаэль Пакье) - Эта ошибка могла привести к отказу сервера; теоретически её можно было эксплуатировать для раскрытия содержимого памяти сервера. (CVE-2019-10129) 
- Предупреждение повреждения каталога при выполнении - ALTER TABLEс секционированной таблицей, в которой секционирующий индекс оказывался подходящим для повторного использования (Амит Ланготе, Том Лейн)- Это случается, например, когда при - ALTER COLUMN TYPEоказывается, что физическая перезапись таблицы не требуется.
- Предупреждение повреждения каталога при создании в транзакции, состоящей из одного оператора, и временной таблицы с - ON COMMIT DROP, и столбца идентификации (Питер Эйзентраут)- Возможность повреждения здесь была не замечена ранее ввиду бессмысленности такой транзакции, так как временная таблица в ней должна удаляться сразу после создания. 
- Устранение сбоя в - ALTER INDEX ... ATTACH PARTITIONпри наличии в секционированной таблице большего количества удалённых столбцов, чем в её секции (Альваро Эррера)
- Устранение проблемы, не позволяющей в некоторых случаях присоединить существующий индекс секции к только что созданному секционированному индексу (Амит Ланготе, Альваро Эррера) - Её следствием могли быть ошибки «index ... not found in partition» (индекс ... не найден в секции) при последующем выполнении операторов DDL, использующих этот секционированный индекс. 
- Предотвращение краха сервера при выполнении перепроверки EPQ для результирующего отношения запроса с секционированием (Амит Ланготе) - Он происходил, когда использовался уровень изоляции - READ COMMITTEDи в другом сеансе параллельно изменялись какие-либо целевые строки.
- Исправление перенаправления кортежей в многоуровневых секционированных таблицах, имеющих удалённые атрибуты (Амит Ланготе, Микаэль Пакье) 
- Устранение ошибки, возникавшей при выборе медленного пути начальной проверки ограничения внешнего ключа для секционированных таблиц (Хади Мошаеди, Том Лейн, Андрес Фройнд) - Она могла проявляться лишь в редких случаях, когда не удавалось использовать быстрый путь (например, из-за проблем с правами). 
- Исправление поведения - UPDATEи- DELETEпри работе с деревом наследования или секционированной таблицей, допускающими исключение всех таблиц (Амит Ланготе, Том Лейн)- Ранее в подобных условиях такие запросы не выдавали корректный набор выходных столбцов с предложением - RETURNING. Помимо этого, в этих запросах также не срабатывали никакие триггеры уровня операторов.
- В запросах, обращающихся к секции напрямую при установленном параметре - constraint_exclusion, для проверки ограничений-исключений теперь будут использоваться ограничения секции, а также все ограничения- CHECK(Амит Ланготе, Том Лейн)- Это изменение восстанавливает поведение, которое было в 10 версии. 
- Предупреждение краха сервера в случае ошибки при попытке продлить существование курсора после завершения транзакции (Том Лейн) - Если процедура пытается завершить транзакцию, и при этом есть открытый явный или неявный курсор (например, курсор цикла - FORв PL/pgSQL), нужно завершить его до конца и сохранить его результаты, прежде чем транзакцию можно будет зафиксировать. Ранее в случае ошибки в подобных обстоятельствах происходил сбой.
- Устранение выдаваемых при наличии публикации - FOR ALL TABLESнекорректных ошибок при внесении изменений во временные и нежурналируемые таблицы (Питер Эйзентраут)- Такие таблицы в контексте публикаций должны были полностью исключаться из рассмотрения, но исключались не везде. 
- Исправление обработки явных элементов - DEFAULTв команде- INSERT ... VALUESс несколькими строками- VALUES, целевым отношением для которой является обновляемое представление (Амит Ланготе, Дин Рашид)- Когда в обновляемом представлении для столбца не задано значение по умолчанию, но оно задано в нижележащей таблице, команда - INSERT ... VALUESс одной строкой вставит в столбец это значение по умолчанию. Однако при выполнении этой команды с несколькими строками вместо этого значения всегда вставлялся NULL. Теперь это исправлено, и такая команда выполняется так же, как и команда с одной строкой.
- Исправление - CREATE VIEW, позволяющее создавать представления с нулём столбцов (Ашутош Шарма)- Мы должны разрешить это для согласованности с возможностью создавать таблицы с нулём столбцов. Так как таблицу можно преобразовать в представление, ранее такое представление можно было получить даже при существовавшем ограничении, что приводило к сбоям при выгрузке/загрузке базы данных. 
- Добавление поддержки - CREATE TABLE IF NOT EXISTS ... AS EXECUTE ...(Андреас Карлссон)- Сочетание предложений - IF NOT EXISTSи- EXECUTEдолжно поддерживаться, но в грамматике отсутствовало соответствующее правило.
- Использование прав корректного пользователя при выполнении вложенных - SELECTв выражениях политик защиты на уровне строк (Дин Рашид)- Ранее при обращении через представление к таблице с политикой RLS такие проверки могли осуществляться от имени пользователя, выполняющего запрос к представлению, а не от имени владельца представления, как должно быть. 
- Теперь при значении - xmlпараметра- xmloptionXML-документы считаются допустимыми значениями типа- xmlсогласно требованию, появившемуся в стандарте SQL:2006 (Чепмен Флэк)- Ранее PostgreSQL следовал определению стандарта SQL:2003, в котором это не допускалось. Но это создавало серьёзную проблему при выгрузке/восстановлении данных: ни одно из значений - xmloptionне позволяло принять все допустимые XML-данные. В связи с этим решено перейти к определению 2006.- Также модифицирована утилита pg_dump, чтобы при восстановлении данных выполнялась команда - SET xmloption = content. Это гарантирует, что выгрузка/восстановление сработает, даже если в данных преобладает вариант- document.
- Улучшение выполняемых при запуске сервера проверок на предмет использования ранее созданного сегмента общей памяти (Ной Миш) - Теперь главный процесс (postmaster) будет более надёжно определять активные процессы, оставшиеся от предыдущего воплощения сервера, даже в случае удаления файла - postmaster.pid.
- Устранение возможности деления на ноль в логике очистки индекса-B-дерева (Пётр Стефаняк, Александр Коротков) - Это могло приводить к ошибочным решениям относительно необходимости очистки индекса. 
- Исключение транзакций параллельных исполнителей из числа отдельных транзакций. 
- Устранение несовместимости записей GIN-индекса в WAL (Александр Коротков) - Исправление, вошедшее в февральский корректирующий выпуск, не учитывало все тонкости обратной совместимости. Ведущий сервер этого выпуска формировал в WAL такие записи об удалении страниц GIN, которые не мог корректно воспринять ведомый более старой версии. 
- Устранение возможности сбоя при выполнении команды - SHOWчерез соединение репликации (Микаэль Пакье)
- Устранение утечки памяти сервера, проявлявшейся в случаях, когда строки выбираются из портала по одной (Том Лейн) 
- Устранение утечки памяти при пересоздании в кеше структур, связанных с секционированными отношениями (Амит Ланготе, Том Лейн) 
- Допущение кодов ошибок - EINVALи- ENOSYSв результатах функций- fsyncи- sync_file_rangeтам, где это приемлемо (Томас Манро, Джеймс Сьюэлл)- Предыдущее изменение, приводящее к панической остановке при ошибках файловой синхронизации, оказалось излишне параноидальным в ряде случаев, где сбой предсказуем и по сути означает «операция не поддерживается». 
- Вывод в представлении - pg_stat_activityправильного имени отношения при вычислении сводных данных BRIN в процессе автоочистки (Альваро Эррера)
- Предупреждение краха сервера при попытке планирования соединения с учётом секционирования, когда задействуется алгоритм GEQO (Том Лейн) 
- Устранение ошибок планировщика «failed to build any - N-way joins» (не удалось построить никакие- N-сторонние соединения) с подзапросами LATERAL снаружи полных внешних соединений (Том Лейн)
- Исправлено некорректное планирование запросов, в которых возвращающая множество функция применяется к заведомо пустому отношению (Том Лейн, Жюльен Руо) - В 10 версии следствием этого упущения могли быть только чуть менее эффективные планы, тогда как в 11 могли выдаваться ошибки «set-valued function called in context that cannot accept a set» (функция, возвращающая множество, вызвана в контексте, где ему нет места). 
- Проверка прав корректного пользователя при применении правил, позволяющих негерметичным операторам обращаться к данным - pg_statistic(Дин Рашид)- Когда пользователь обращается к нижележащей таблице через представление, решение о возможности применения негерметичных операторов к статистическим данным таблицы должно приниматься с учётом прав не этого пользователя, а владельца представления. Таким образом, правила планировщика по определению видимости данных приводятся в соответствие с правилами исполнителя, что позволит избежать неоправданно невыгодных планов. 
- Исправление оценки параллельно-безопасности для запросов с группировкой (Эцуро Фудзита) - Ранее работа по вычислению целевого списка, подходящая для распараллеливания, могла не распараллеливаться. 
- Исправление обработки «неключевых» столбцов индекса в логике планировщика, связанной с уникальными индексами (Том Лейн) - Вследствие ошибки планировщик мог не распознать, что уникальный индекс с неключевыми столбцами гарантирует уникальность результата запроса, и в итоге выдать неудачный план. 
- Исправление ошибочной проверки строгости для выражений с приведением массивов (Том Лейн) - В результате ошибки было возможно, например, некорректное встраивание строгой SQL-функции, следствием чего было бы нарушение условия строгости. 
- Ускорение планирования запросов со множеством условий равенства и множеством возможно связанных с ними ограничений внешнего ключа (Дэвид Роули) 
- Оптимизация неэффективных операций сложности O(N^2) при отмене транзакции, создавшей множество таблиц (Томаш Вондра) 
- Предупреждение краха сервера в особых случаях при выделении динамической общей памяти (Томас Манро, Роберт Хаас) 
- Устранение условий гонки при управлении динамической общей памятью (Томас Манро) - В этих условиях могли возникать ошибки «dsa_area could not attach to segment» (не удалось подключить dsa_area к сегменту) или «cannot unpin a segment that is not pinned» (нельзя открепить сегмент, который не закреплён). 
- Устранение условий гонки, при которых сервер горячего резерва мог не отключиться, получив запрос на постепенное отключение (Том Лейн) 
- Устранение возможности краха при получении в параметрах - pg_identify_object_as_address()неправильных данных (Альваро Эррера)
- Ликвидация возможности ошибок «could not access status of transaction» (не удалось получить статус транзакции) в - txid_status()(Томас Манро)
- Устранение ошибки проверки подлинности при использовании аутентификации SCRAM со смешанными версиями библиотек OpenSSL (Микаэль Пакье, Питер Эйзентраут) - Согласование механизма SASL осуществлялось некорректно, когда на стороне libpq использовалась библиотека OpenSSL 1.0.1 или старее, а на стороне сервера — OpenSSL 1.0.2 или новее. В результате выдавалась ошибка «channel binding not supported by this build» (связывание каналов не поддерживается этой сборкой). 
- Улучшение правил проверки паролей, зашифрованных алгоритмами SCRAM-SHA-256 и MD5 (Джонатан С. Кац) - Строка пароля с определёнными начальными символами могла по ошибке приниматься за строку, закодированную в формате SCRAM-SHA-256 или MD5. Такой пароль можно было установить, но нельзя было использовать. 
- Исправление обработки значений - lc_time, подразумевающих кодировку, отличающуюся от кодировки базы (Хуан Хосе Сантамария Флеча, Том Лейн)- С локализованными названиями дней или месяцев, включающими не ASCII-символы, в таких локалях ранее выдавались неожиданные ошибки или некорректные строки. 
- Файл - current_logfilesдолжен создаваться с теми же разрешениями, что и другие файлы в каталоге данных сервера (Харибабу Комми)- Ранее для него применялись разрешения, заданные параметром - log_file_mode, но это создавало проблемы для утилит резервного копирования.
- Исправление ошибочных проверок - operator_precedence_warningс унарным оператором «минус» (Рикард Фалькеборн)
- Недопущение - NaNв качестве значения серверных параметров, принимающих числа с плавающей точкой (Том Лейн)
- Реорганизация работы - REINDEXдля предотвращения сбоев проверочных утверждений при переиндексировании отдельных индексов- pg_class(Андрес Фройнд, Том Лейн)
- Исправление проверочных утверждений в планировщике при обработке параметризованных фиктивных путей (Том Лейн) 
- Добавление нужной функции проверки в результат, выдаваемый функцией - SnapBuildInitialSnapshot()(Антонин Хоуска)- Для кода ядра это не важно, но важно для некоторых расширений. 
- Устранение периодических ошибок «could not reattach to shared memory» (не удалось переподключиться к общей памяти) при запуске сеансов в Windows (Ной Миш) - Невыявленным ранее источником таких проблем было создание стеков потоков в пуле потоков по умолчанию. Теперь такие стеки размещаются в другой области памяти. 
- Исправлена обработка ошибок при сканировании каталога в Windows (Константин Книжник) - Такие ошибки, как отсутствие прав для чтения каталога, не обнаруживались и не выдавались корректно; вместо этого поведение кода было таким же, как и с пустым каталогом. 
- Исправление грамматических дефектов в ecpg (Том Лейн) - Из-за пропущенной точки с запятой конструкция - SET(но не- переменная= DEFAULT- SET) в программах ecpg обрабатывалась некорректно, и в результате получался синтаксически некорректный код, не воспринимаемый сервером. Кроме того, в командах- переменнаяTO DEFAULT- DROP TYPEи- DROP DOMAIN, в которых перечислялось несколько имён типов, фактически обрабатывалось только первое имя.
- Согласование синтаксиса - CREATE TABLE ASв ecpg с принятым на стороне сервера (Дайсукэ Хигути)
- Ликвидация возможности переполнения буфера при обработке в ecpg имён включаемых файлов (Лю Хуайлин, Фей Ву) 
- Устранение сбоя pg_rewind в случае ошибки при удалении некоторых промежуточных файлов в целевом каталоге данных (Микаэль Пакье) 
- Добавление в pg_verify_checksums проверки версии кластера в целевом каталоге (Микаэль Пакье) 
- Недопущение краха в - contrib/postgres_fdwпри наличии в запросе, использующем удалённую группировку или агрегирование, элемента списка- SELECT, не связанного с вложенным запросом, внешней ссылкой или символом параметра (Том Лейн)
- Расширение - contrib/postgres_fdwтеперь выдаёт ошибку, когда удалённая секция, выбранная для добавления строки, также является целевой для подплана- UPDATEи должна модифицироваться позже той же командой (Амит Ланготе, Эцуро Фудзита)- Ранее с такими запросами происходил крах сервера или получались некорректные результаты - UPDATE. Полноценное выполнение этих запросов может быть реализовано в будущем.
- Предупреждение в - contrib/pg_prewarmбесконечного перезапуска фоновых рабочих процессов в случае неудачи при попытке выполнить разогрев (Митхун Сай)
- Предупреждение краха в - contrib/vacuumloпри ошибке в- lo_unlink()(Том Лейн)
- Синхронизация нашей копии библиотеки timezone с выпущенной IANA версией 2019a (Том Лейн) - При этом устранён небольшой дефект в zic, в результате которого выдавались данные о некорректном переходе в 2440 г. для часового пояса - Africa/Casablanca, и добавлена поддержка нового параметра zic- -r.
- Обновление данных часовых поясов до версии tzdata 2019a, включающее изменение правил перехода на летнее время в Палестине и Метлакатле, а также корректировку исторических данных для Израиля. - Часовой пояс - Etc/UCTтеперь является ссылкой на- Etc/UTC(добавленной для обратной совместимости), а не отдельным поясом, генерирующем аббревиатуру- UCT, которая теперь, как правило, просто опечатка. PostgreSQL по-прежнему принимает на вход такую аббревиатуру, но уже не выдаёт её.