E.50. Выпуск 9.6.7
Дата выпуска: 2018-02-08
В этот выпуск вошли различные исправления, внесённые после версии 9.6.6. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
E.50.1. Миграция на версию 9.6.7
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы используете оператор ~> расширения contrib/cube, прочитайте ниже запись о нём.
Также, если вы обновляете сервер с версии, более ранней, чем 9.6.6, см. Раздел E.51.
E.50.2. Изменения
Временные файлы, создаваемые программой pg_upgrade, должны быть недоступны для чтения всеми пользователями (Том Лейн, Ной Миш)
Программа pg_upgrade обычно ограничивает доступ к своим временным файлам, чтобы их мог читать и записывать только запускающий её пользователь. Но временные файлы, содержащие вывод
pg_dumpall -gмогли быть доступны для чтения группе или всем пользователям, а возможно и для записи, если это допускало значениеumaskэтого пользователя. При типичном использовании в многопользовательских системахumaskи/или разрешения в рабочем каталоге достаточно жёсткие и эта проблема неактуальна; но pg_upgrade может использоваться и в сценариях, где это упущение могло привести, например, к утечке паролей баз данных. (CVE-2018-1053)Исправление очистки кортежей, которые были изменены при установленной блокировке разделяемого ключа (Андрес Фройнд, Альваро Эррера)
В некоторых случаях операция
VACUUMне удаляла такие кортежи, даже когда они теряли актуальность, что приводило к различным сценариям повреждения данных.Осуществление очистки очереди добавлений индекса GIN при выполнении VACUUM (Масахико Савада)
Это необходимо для гарантированного удаления неактуальных записей индекса. Прежний код делал это в другом порядке, позволяя операции VACUUM пропускать очистку, если какие-то другие процессы производили очистку параллельно. Однако при этом в индексе могли оставаться некорректные записи.
Исправление неправильной блокировки буфера при некоторых чтениях LSN (Якоб Чемпион, Асим Правин, Ашвин Агравал)
Эти ошибки могли приводит к некорректному поведению при многопоточной нагрузке. Потенциальные последствия не были характеризованы полностью.
Исправление некорректных результатов запросов в случаях, когда происходило упрощение подзапросов, результаты которых использовались в
GROUPING SETS(Хейкки Линнакангас)Исключение неоправданной ошибки в запросе с деревом наследования, который выполнялся одновременно с тем, как некоторая дочерняя таблица удалялась из этого дерева командой
ALTER TABLE NO INHERIT(Том Лейн)Устранение разнообразных ошибок взаимоблокировки при выполнении в нескольких сеансах команды
CREATE INDEX CONCURRENTLY(Джефф Джейнс)Устранение ошибок в ситуациях, когда дерево наследования содержит дочерние сторонние таблицы (Эцуро Фудзита)
Комбинация обычных и сторонних таблиц в дереве наследования провоцировала построение некорректных планов в запросах
UPDATEиDELETE. Это приводило к видимым ошибкам в некоторых случаях, особенно когда в дочерней сторонней таблице присутствовали триггеры уровня строк.Исправление дефекта со связанным подзапросом
SELECTвнутриVALUESв подзапросеLATERAL(Том Лейн)Устранение ошибки планировщика «could not devise a query plan for the given query» (не удалось выработать план для данного запроса) в некоторых случаях, включая вложенные
UNION ALLв подзапросе LATERAL (Том Лейн)Исправление логического декодирования, чтобы файлы на диске корректно очищались от данных сбойных транзакций (Атсуши Торикоши)
Процедура логического декодирования может выносить записи WAL на диск, если транзакции генерируют много записей WAL. Обычно эти файлы очищаются после фиксирования транзакции или поступления записи о её прерывании; но в отсутствие таких записей код очистки работал неправильно.
Исправление тайм-аута в процессе walsender и реакции на прерывания при обработке большой транзакции (Петр Желинек)
Добавление в
has_sequence_privilege()поддержки проверокWITH GRANT OPTION, как это сделано в других функциях проверки прав (Джо Конвей)В базах данных с кодировкой UTF8 любые XML-объявления, выбирающие другую кодировку, должны игнорироваться (Павел Стехуле, Ной Миш)
Мы всегда храним документы XML в кодировке базы данных, так что позволяя libxml обрабатывать объявления с другой кодировкой, мы получим ошибочные результаты. Если кодировка базы — не UTF8, мы в любом случае не обещали поддерживать XML-данные с не ASCII-кодировкой, так что предыдущее поведение сохранено для совместимости ошибок. Это изменение затрагивает только
xpath()и связанные функции; другой код и ранее работал так.Обеспечение прямой совместимости с будущими изменениями младших версий протокола (Роберт Хаас, Бадрул Чоудхури)
Ранее серверы PostgreSQL просто отклоняли запросы на использование версий протокола новее 3.0, так что никакого функционального отличия старших номеров от младших не было. Теперь клиенты могут запрашивать версии 3.x и получать в ответ не отказ, а сообщение, говорящее, что сервер поддерживает только версию 3.0. В данный момент от этого ничего не меняется, но перенос этого изменения в предыдущие версии должен ускорить внедрение небольших усовершенствований протокола в будущем.
Исправление реакции на сбой при запуске параллельного рабочего процесса (Амит Капила, Роберт Хаас)
Ранее параллельный запрос мог зависнуть на неопределённое время, если не удавалось запустить рабочий процесс, вследствие ошибки в
fork()или других редких проблем.Исправление сбора статистики
EXPLAIN, получаемой от параллельных исполнителей (Амит Капила, Томас Манро)Устранение небезопасного предположения о выравнивании при работе с типом
__int128(Том Лейн)Обычно компиляторы полагают, что переменные
__int128выравниваются по 16-байтовым границам, но наша инфраструктура выделения памяти не готова гарантировать это, а увеличение MAXALIGN кажется неподходящим по множеству причин. В качестве решения код был изменён так, чтобы тип__int128можно было использовать только когда мы можем сказать компилятору, что предполагается не такое крупное выравнивание. Единственный замеченный симптом этой проблемы — сбои в некоторых параллельных запросах с агрегированием.Предотвращение сбоев с переполнением стека при планировании операций со множествами с крайне большой вложенностью (
UNION/INTERSECT/EXCEPT) (Том Лейн)Ликвидация обращений по нулевому указателю для некоторых типов адресов LDAP, задаваемых в файле
pg_hba.conf(Томас Манро)Исправление демонстрационных функций
INSTR()в документации по PL/pgSQL (Юго Нагата, Том Лейн)В документации утверждалось, что эти функции совместимы с Oracle®, но это было не совсем так. В частности, по-разному интерпретировалось отрицательное значение третьего параметра: Oracle воспринимает это значение как последнюю позицию, с которой может начинаться целевая подстрока, а наши функции считали, что это последняя позиция, где строка может заканчиваться. Также Oracle выдаёт ошибку в случае нулевого или отрицательного четвёртого параметра, тогда как наши функции возвращали ноль.
Код этого примера был изменён для большего соответствия поведению Oracle. Пользователям, которые скопировали этот код в свои приложения, возможно, имеет смысл обновить свои копии.
Исправление поведения pg_dump, чтобы ACL (разрешения), комментарии и метки безопасности можно было надёжно идентифицировать в архивных выходных форматах (Том Лейн)
Компонент «метка» записи ACL в архиве обычно представлял собой просто имя целевого объекта. В его начало теперь добавляется тип объекта, чтобы записи ACL соответствовали соглашениям, уже принятым для записей комментариев и меток безопасности. Кроме того, обозначения комментариев и меток безопасности, заданных для собственно базы данных, теперь должны начинаться с
DATABASE, чтобы они соответствовали тому же соглашению. Это предупреждает ложные срабатывания в коде, который пытается найти записи больших объектов по строкам, начинающимся со словLARGE OBJECT. Прежнее поведение могло приводить к неправильной классификации записей как данные и нежелательным результатам при восстановлении выгруженной только схемы или только данных.Заметьте, что следствием этого стало изменение видимого пользователями вывода
pg_restore --list.Переименование функции
copy_file_rangeв pg_rewind во избежание конфликта с новым системным вызовом Linux с таким же именем (Андрес Фройнд)Это изменение предотвращает ошибки при сборке с новыми версиями glibc.
В ecpg добавлено выявление массивов индикаторов с неправильной длиной и сообщение об ошибке (Дэвид Рейдер)
Изменение поведения оператора
cube~>intв расширенииcontrib/cubeдля обеспечения его совместимости с поиском kNN (Александр Коротков)Смысл второго аргумента (выбирающего размерность) был изменён, чтобы можно было определённо сказать, какое именно значение выбирается в кубах переменных размерностей.
Это изменение нарушает совместимость, но так как этот оператор предназначался для поисков kNN, в прежнем виде он был бесполезен. После установки этого обновления все материализованные представления или индексы с выражениями, использующими этот оператор, необходимо обновить/перестроить.
Предотвращение срабатывания проверки истинности внутри libc в расширении
contrib/hstoreиз-за использованияmemcpy()с равными указателями источника и получателя (Томаш Вондра)Исправление некорректного отображения битовых карт NULL для кортежей в
contrib/pageinspect(Максим Милютин)В расширении
contrib/postgres_fdwликвидирована ошибка планировщика «outer pathkeys do not match mergeclauses» (внешние ключи пути не соответствуют предложениям слияния) при построении плана, включающего удалённое соединение (Роберт Хаас)Добавление современных примеров настройки автозапуска Postgres в macOS (Том Лейн)
Скрипты в
contrib/start-scripts/osxиспользуют инфраструктуру, которая устарела десять лет назад, и абсолютно неработоспособны во всех версиях macOS, выпущенных в последние два года. Добавлен новый подкаталогcontrib/start-scripts/macosсо скриптами, использующими новую инфраструктуру launchd.Исправление некорректного выбора зависящих от конфигурации библиотек OpenSSL в Windows (Эндрю Дунстан)
Поддержка компоновки с версиями libperl, собранными компилятором MinGW (Ной Миш)
Это позволяет собирать PL/Perl с некоторыми распространёнными дистрибутивами Perl для Windows.
Исправление в сборке MSVC проверки, требуется ли 32-битной libperl определение
-D_USE_32BIT_TIME_T(Ной Миш)Имеющиеся дистрибутивы Perl ожидают разного, и при этом нет никакой возможности надёжно проверить это, поэтому пришлось добавить проверку фактического поведения используемой библиотеки во время компиляции.
В Windows обработчик аварийного завершения должен устанавливаться на более раннем этапе запуска главного процесса (Такаюки Цунакава)
Это поможет получить дамп памяти при ошибках в те моменты в начале запуска, в которые раньше дамп не записывался.
В Windows устранены сбои, связанные с преобразованием кодировок при выводе сообщений на самых ранних стадиях запуска процесса postmaster (Такаюки Цунакава)
Использование нашего ранее написанного кода циклических блокировок для Motorola 68K во OpenBSD, а также в NetBSD (Давид Карлье)
Добавление поддержки циклических блокировок для Motorola 88K (Давид Карлье)
Обновление данных часовых поясов до версии tzdata 2018c, включающее изменения правил перехода на летнее время в Бразилии, в Сан-Томе и Принсипи, а также корректировки исторических данных для Боливии, Японии и Южного Судана. Был удалён часовой пояс
US/Pacific-New(это был просто псевдоним для поясаAmerica/Los_Angeles).
E.50. Release 9.6.7
Release date: 2018-02-08
This release contains a variety of fixes from 9.6.6. For information about new features in the 9.6 major release, see Section E.57.
E.50.1. Migration to Version 9.6.7
A dump/restore is not required for those running 9.6.X.
However, if you use contrib/cube's ~> operator, see the entry below about that.
Also, if you are upgrading from a version earlier than 9.6.6, see Section E.51.
E.50.2. Changes
Ensure that all temporary files made by pg_upgrade are non-world-readable (Tom Lane, Noah Misch)
pg_upgrade normally restricts its temporary files to be readable and writable only by the calling user. But the temporary file containing
pg_dumpall -goutput would be group- or world-readable, or even writable, if the user'sumasksetting allows. In typical usage on multi-user machines, theumaskand/or the working directory's permissions would be tight enough to prevent problems; but there may be people using pg_upgrade in scenarios where this oversight would permit disclosure of database passwords to unfriendly eyes. (CVE-2018-1053)Fix vacuuming of tuples that were updated while key-share locked (Andres Freund, Álvaro Herrera)
In some cases
VACUUMwould fail to remove such tuples even though they are now dead, leading to assorted data corruption scenarios.Ensure that vacuum will always clean up the pending-insertions list of a GIN index (Masahiko Sawada)
This is necessary to ensure that dead index entries get removed. The old code got it backwards, allowing vacuum to skip the cleanup if some other process were running cleanup concurrently, thus risking invalid entries being left behind in the index.
Fix inadequate buffer locking in some LSN fetches (Jacob Champion, Asim Praveen, Ashwin Agrawal)
These errors could result in misbehavior under concurrent load. The potential consequences have not been characterized fully.
Fix incorrect query results from cases involving flattening of subqueries whose outputs are used in
GROUPING SETS(Heikki Linnakangas)Avoid unnecessary failure in a query on an inheritance tree that occurs concurrently with some child table being removed from the tree by
ALTER TABLE NO INHERIT(Tom Lane)Fix spurious deadlock failures when multiple sessions are running
CREATE INDEX CONCURRENTLY(Jeff Janes)Fix failures when an inheritance tree contains foreign child tables (Etsuro Fujita)
A mix of regular and foreign tables in an inheritance tree resulted in creation of incorrect plans for
UPDATEandDELETEqueries. This led to visible failures in some cases, notably when there are row-level triggers on a foreign child table.Repair failure with correlated sub-
SELECTinsideVALUESinside aLATERALsubquery (Tom Lane)Fix “could not devise a query plan for the given query” planner failure for some cases involving nested
UNION ALLinside a lateral subquery (Tom Lane)Fix logical decoding to correctly clean up disk files for crashed transactions (Atsushi Torikoshi)
Logical decoding may spill WAL records to disk for transactions generating many WAL records. Normally these files are cleaned up after the transaction's commit or abort record arrives; but if no such record is ever seen, the removal code misbehaved.
Fix walsender timeout failure and failure to respond to interrupts when processing a large transaction (Petr Jelinek)
Fix
has_sequence_privilege()to supportWITH GRANT OPTIONtests, as other privilege-testing functions do (Joe Conway)In databases using UTF8 encoding, ignore any XML declaration that asserts a different encoding (Pavel Stehule, Noah Misch)
We always store XML strings in the database encoding, so allowing libxml to act on a declaration of another encoding gave wrong results. In encodings other than UTF8, we don't promise to support non-ASCII XML data anyway, so retain the previous behavior for bug compatibility. This change affects only
xpath()and related functions; other XML code paths already acted this way.Provide for forward compatibility with future minor protocol versions (Robert Haas, Badrul Chowdhury)
Up to now, PostgreSQL servers simply rejected requests to use protocol versions newer than 3.0, so that there was no functional difference between the major and minor parts of the protocol version number. Allow clients to request versions 3.x without failing, sending back a message showing that the server only understands 3.0. This makes no difference at the moment, but back-patching this change should allow speedier introduction of future minor protocol upgrades.
Cope with failure to start a parallel worker process (Amit Kapila, Robert Haas)
Parallel query previously tended to hang indefinitely if a worker could not be started, as the result of
fork()failure or other low-probability problems.Fix collection of
EXPLAINstatistics from parallel workers (Amit Kapila, Thomas Munro)Avoid unsafe alignment assumptions when working with
__int128(Tom Lane)Typically, compilers assume that
__int128variables are aligned on 16-byte boundaries, but our memory allocation infrastructure isn't prepared to guarantee that, and increasing the setting of MAXALIGN seems infeasible for multiple reasons. Adjust the code to allow use of__int128only when we can tell the compiler to assume lesser alignment. The only known symptom of this problem so far is crashes in some parallel aggregation queries.Prevent stack-overflow crashes when planning extremely deeply nested set operations (
UNION/INTERSECT/EXCEPT) (Tom Lane)Fix null-pointer crashes for some types of LDAP URLs appearing in
pg_hba.conf(Thomas Munro)Fix sample
INSTR()functions in the PL/pgSQL documentation (Yugo Nagata, Tom Lane)These functions are stated to be Oracle® compatible, but they weren't exactly. In particular, there was a discrepancy in the interpretation of a negative third parameter: Oracle thinks that a negative value indicates the last place where the target substring can begin, whereas our functions took it as the last place where the target can end. Also, Oracle throws an error for a zero or negative fourth parameter, whereas our functions returned zero.
The sample code has been adjusted to match Oracle's behavior more precisely. Users who have copied this code into their applications may wish to update their copies.
Fix pg_dump to make ACL (permissions), comment, and security label entries reliably identifiable in archive output formats (Tom Lane)
The “tag” portion of an ACL archive entry was usually just the name of the associated object. Make it start with the object type instead, bringing ACLs into line with the convention already used for comment and security label archive entries. Also, fix the comment and security label entries for the whole database, if present, to make their tags start with
DATABASEso that they also follow this convention. This prevents false matches in code that tries to identify large-object-related entries by seeing if the tag starts withLARGE OBJECT. That could have resulted in misclassifying entries as data rather than schema, with undesirable results in a schema-only or data-only dump.Note that this change has user-visible results in the output of
pg_restore --list.Rename pg_rewind's
copy_file_rangefunction to avoid conflict with new Linux system call of that name (Andres Freund)This change prevents build failures with newer glibc versions.
In ecpg, detect indicator arrays that do not have the correct length and report an error (David Rader)
Change the behavior of
contrib/cube'scube~>intoperator to make it compatible with KNN search (Alexander Korotkov)The meaning of the second argument (the dimension selector) has been changed to make it predictable which value is selected even when dealing with cubes of varying dimensionalities.
This is an incompatible change, but since the point of the operator was to be used in KNN searches, it seems rather useless as-is. After installing this update, any expression indexes or materialized views using this operator will need to be reindexed/refreshed.
Avoid triggering a libc assertion in
contrib/hstore, due to use ofmemcpy()with equal source and destination pointers (Tomas Vondra)Fix incorrect display of tuples' null bitmaps in
contrib/pageinspect(Maksim Milyutin)In
contrib/postgres_fdw, avoid “outer pathkeys do not match mergeclauses” planner error when constructing a plan involving a remote join (Robert Haas)Provide modern examples of how to auto-start Postgres on macOS (Tom Lane)
The scripts in
contrib/start-scripts/osxuse infrastructure that's been deprecated for over a decade, and which no longer works at all in macOS releases of the last couple of years. Add a new subdirectorycontrib/start-scripts/macoscontaining scripts that use the newer launchd infrastructure.Fix incorrect selection of configuration-specific libraries for OpenSSL on Windows (Andrew Dunstan)
Support linking to MinGW-built versions of libperl (Noah Misch)
This allows building PL/Perl with some common Perl distributions for Windows.
Fix MSVC build to test whether 32-bit libperl needs
-D_USE_32BIT_TIME_T(Noah Misch)Available Perl distributions are inconsistent about what they expect, and lack any reliable means of reporting it, so resort to a build-time test on what the library being used actually does.
On Windows, install the crash dump handler earlier in postmaster startup (Takayuki Tsunakawa)
This may allow collection of a core dump for some early-startup failures that did not produce a dump before.
On Windows, avoid encoding-conversion-related crashes when emitting messages very early in postmaster startup (Takayuki Tsunakawa)
Use our existing Motorola 68K spinlock code on OpenBSD as well as NetBSD (David Carlier)
Add support for spinlocks on Motorola 88K (David Carlier)
Update time zone data files to tzdata release 2018c for DST law changes in Brazil, Sao Tome and Principe, plus historical corrections for Bolivia, Japan, and South Sudan. The
US/Pacific-Newzone has been removed (it was only an alias forAmerica/Los_Angelesanyway).