E.45. Выпуск 9.6.12
Дата выпуска: 2019-02-14
В этот выпуск вошли различные исправления, внесённые после версии 9.6.11. За информацией о нововведениях версии 9.6 обратитесь к Разделу E.57.
E.45.1. Миграция на версию 9.6.12
Если используется версия 9.6.X, выгрузка/восстановление базы не требуется.
Однако если вы обновляете сервер с более ранней версии, чем 9.6.9, см. Раздел E.48.
E.45.2. Изменения
Во избежание повреждения данных вместо повторения вызова
fsync()при ошибке теперь выполняется аварийный останов (Крейг Рингер, Томас Манро)В ряде популярных операционных систем ядро сбрасывает буферы данных, не имея возможности сохранить их на диске, и выдаёт ошибку в
fsync(). При этом повторный вызовfsync()будет успешным, но на самом деле данные уже потеряны, так что продолжение работы сервера чревато повреждением базы. В случае же аварийного останова мы можем воспроизвести данные из WAL, где в такой ситуации может остаться единственная копия данных. Хотя это, определённо, неэффективное и не очень красивое поведение, других вариантов нет, а подобные ситуации, к счастью, крайне редки.Для управления этим поведением был добавлен новый параметр сервера data_sync_retry; если вы уверены, что ядро вашей ОС не теряет незаписанные буферы данных при описанном сценарии, вы можете задать для
data_sync_retryзначениеonи восстановить прежнее поведение.Отныне в документацию каждой версии включаются только замечания к выпускам, относящимся к данной основной версии, а не к выпускам данной и всех предшествующих версий, как было раньше (Том Лейн)
Дублирование информации, присущее прежней схеме, вышло за допустимые рамки. Теперь мы не дублируем замечания к выпускам в каждой версии, но планируем поддерживать их полный архив на сайте нашего проекта.
Предупреждение возможных взаимоблокировок при попытке блокирования множества страниц в буфере (Нишант Фну)
Недопущение взаимоблокировки запросов на сервере горячего резерва с воспроизведением операций удаления страниц индекса GIN (Александр Коротков)
Устранение возможности сбоев при логической репликации в случае использования индексов с выражениями или предикатами (Питер Эйзентраут)
Исключение бесполезного и дорогостоящего логического декодирования данных TOAST при перезаписи таблицы (Томаш Вондра)
Исправление логики остановки подмножества передатчиков WAL при включении синхронной репликации (Пол Гуо, Микаэль Пакье)
Устранение возможности сохранения некорректного значения идентификатора реплики в записи WAL об удалении кортежа (Стас Кельвич)
Повышение приоритета файлов истории WAL по отношению к другим файлам данных WAL при выборе архиватором очередных файлов для архивации (Дэвид Стил)
Устранение возможности сбоя в
UPDATEс множественнымSETи вложеннымSELECTв качестве источника данных (Том Лейн)Устранение сбоя в случае, когда libxml2 возвращает null вместо сообщения об ошибке (Серхио Конде Гомес)
Устранение ложных ошибок разбора, связанных с группировкой, которые были вызваны несогласованной обработкой присваиваний с правилами сортировки (Эндрю Гирт)
В некоторых случаях выражения, которые должны были считаться совместными, не считались таковыми, если они включали операции с типами данных, поддерживающими правила сортировки.
Вместо презумпции герметичности функции сравнения, которую вызывают функции
LEAST()илиGREATEST(), реализована соответствующая проверка (Том Лейн)Собственно утечку информации из функций сравнения btree обычно сложно организовать, но в принципе это возможно.
Исправление некорректного планирования запросов с вложенными циклами над и под узлом Gather в плане (Том Лейн)
Если на обоих уровнях вложенного цикла требовалось передать одну и ту же переменную в правую сторону, мог быть построен некорректный план.
Исправлено некорректное планирование запросов, в которых подзапрос LATERAL должен выполняться при сканировании сторонней таблицы (Том Лейн)
Исправлена ошибка при оценке стоимости соединения слиянием, проявляющаяся в особом случае (Том Лейн)
Планировщик мог предпочесть соединение слиянием, когда диапазон внешнего ключа был намного меньше диапазона внутреннего ключа, даже при наличии множества повторяющихся ключей с внутренней стороны, а это плохой выбор.
Предотвращение увеличения времени планирования порядка O(N^2) с запросами, содержащими тысячи индексируемых выражений (Том Лейн)
Улучшение обработки параллельно изменяемых строк в ходе
ANALYZE(Джефф Джейнс, Том Лейн)Ранее строки, удаляемые текущими транзакциями, исключались из выборки операции
ANALYZE, но обнаружилось, что это нарушает согласованность в большей степени, чем их включение. Теперь выборка по сути соответствует снимку MVCC на момент запускаANALYZE.Операция
TRUNCATEтеперь игнорирует дочерние таблицы, являющиеся временными таблицами других сеансов (Амит Ланготе, Микаэль Пакье)Таким образом поведение
TRUNCATEтеперь соответствует поведению других команд. Ранее в таких случаях обычно происходил сбой.Исправление обновления счётчиков статистики в ходе
TRUNCATEдля нужной таблицы (Том Лейн)Если с опустошаемой таблицей была связана таблица TOAST, по ошибке сбрасывались счётчики последней.
Корректная обработка
ALTER TABLE ONLY ADD COLUMN IF NOT EXISTS(Грег Старк)Поддержка команды
UNLISTENв режиме горячего резерва (Шэй Роджански)Эта команда не должна ничего делать, так как
LISTENне допускается в режиме горячего резерва, но возможность выполнения этой пустой операции упрощает логику сброса состояния для клиентов.Исправление зависимостей ролей в списках прав для схем и типов данных (Том Лейн)
В некоторых случаях имелась возможность удалить роль, которой были назначены права. Эта проблема не проявлялась сразу, но при выгрузке/восстановлении или обновлении могли возникнуть ошибки, в частности выражающиеся в неудачных попытках назначить права ролям с числовыми именами.
Обеспечение корректного сброса кеша отношений после добавления или удаления ограничений внешнего ключа (Альваро Эррера)
В результате устранённого теперь упущения в существующих сеансах могло не действовать только что созданное ограничение или продолжало действовать удалённое.
Обеспечение должного обновления кешей отношений после переименования ограничений (Амит Ланготе)
Приложение дополнительных усилий для удаления потерянных временных таблиц в процессе автоочистки, а также при выполнении
DISCARD TEMP(Альваро Эррера)В результате будут аккуратнее вычищаться следы деятельности прерванных сеансов.
Исправление воспроизведения операций микроочистки индекса GiST, устраняющее возможность получения несогласованного состояния в параллельных запросах на серверах горячего резерва (Александр Коротков)
Недопущение досрочной утилизации пустых страниц индекса GIN, чреватой ошибками при параллельном поиске по индексу (Андрей Бородин, Александр Коротков)
Исправление проявляющихся в граничных случаях ошибок преобразования чисел с плавающей точкой в целые (Эндрю Гирт)
Значения, ненамного превышающие максимально возможное целое, могли приниматься, а затем, в результате переполнения, превращаться в минимально возможное целое. Кроме того, могли ошибочно не допускаться значения, которые при округлении должны были преобразовываться в минимальное или максимальное допустимое целое.
В запросе аутентификации PAM значение
PAM_RHOSTне должно задаваться для соединений, установленных через сокет Unix (Томас Манро)Ранее эта переменная принимала значение
[local], которое как минимум было бесполезным, так как в ней ожидается имя узла.Недопущение в
client_min_messagesболее высоких уровней, чемERROR(Джона Харрис, Том Лейн)Ранее в этой переменной можно было установить уровень
FATALилиPANIC, в результате чего подавлялась передача клиенту обычных сообщений об ошибках. Однако это противоречит гарантиям, заложенным в протоколе обмена данными PostgreSQL, и некоторые клиенты могут этого не понять. В уже выпущенных версиях исправление заключается в неявной подмене таких уровней значениемERROR, а начиная с версии 12, они просто не будут приниматься.Переход в ecpglib к использованию функции
uselocale()или_configthreadlocale()вместоsetlocale()(Михаэль Мескес, Том Лейн)Так как функция
setlocale()не является внутрипотоковой и может быть даже непотокобезопасной, предыдущая реализация вызывала проблемы в многопоточных приложениях на базе ecpg.Исправление ошибочных результатов при получении числовых данных через область дескриптора SQLDA ecpg (Дайсукэ Хигути)
Ранее значения с ведущими нулями копировались некорректно.
Исправление метакоманды psql
\gназначениедля операцииCOPY TO STDOUT(Даниэль Верите)Ранее параметр
назначениеигнорировался, и копируемые данные всегда попадали в текущий поток вывода.Исправление обработки специальных символов для вывода psql в формате LaTeX (Том Лейн)
Ранее обратная косая черта и некоторые другие знаки препинания из ASCII выводились некорректно, следствием чего были ошибки синтаксиса в документе или отображение некорректных символов.
Исправление обработки программой pg_dump материализованных представлений с неявными зависимостями от первичных ключей (Том Лейн)
В результате этой ошибки могли неправильно помечаться записи таких представлений в архиве, что приводило к безобидным предупреждениям «archive items not in correct section order» (в последовательности элементов архива нарушен порядок разделов); и, что более значимо, могли некорректно работать варианты избирательного восстановления, например с указанием таких меток в
--section.Устранение сбоя, имевшего место на некоторых платформах при обращении по нулевому указателю, когда pg_dump или pg_restore пытались вывести ошибку (Том Лейн)
Исправление в
contrib/hstoreвычисления хеша для пустых значенийhstore, созданных в версии 8.4 или более ранней (Эндрю Гирт)В предыдущей реализации хеш для этих значений вычислялся не так, как для пустых значений
hstore, созданных более поздней версией, вследствие чего соединения или агрегирования по хешу могли выполняться неправильно. Поэтому имеет смысл переиндексировать все хеш-индексы, построенные по столбцамhstore, если таблицы могут содержать данные, которые были внесены ещё в версии 8.4 или раньше и с тех пор никогда не проходили через выгрузку/восстановление.Устранение сбоев и ускорение операций при обработке данных большого объёма операторами класса
gist__int_opsмодуляcontrib/intarray(Эндрю Гирт)Добавление поддержки новых переменных
PG_CFLAGS,PG_CXXFLAGSиPG_LDFLAGSв Makefile для pgxs (Кристоф Берг)Это упрощает организацию нестандартных процессов сборки расширений.
Исправление написанных на Perl скриптов сборки, чтобы они не полагались на присутствие элемента «
.» в пути поиска, так как в последних версиях Perl он отсутствует (Эндрю Дунстан)Устранение проблем с разбором параметров командной строки в OpenBSD (Том Лейн)
Перемещение вызова
set_rel_pathlist_hook, чтобы расширения могли использовать его для передачи частичных путей при выполнении параллельных запросов (КайГай Кохэй)Ожидается, что это никак не повлияет на существующие сценарии использования.
Обновление данных часовых поясов до версии tzdata 2018i, включающее изменения правил перехода на летнее время в Казахстане, Метлакатле и на Сан-Томе и Принсипи. Часовой пояс Кызылорды в Казахстане разделился на два, при этом появился новый пояс Asia/Qostanay (Азия/Костанай), а в некоторых областях смещение UTC не изменилось. Также скорректированы исторические данные для Гонконга и многочисленных тихоокеанских островов.
E.45. Release 9.6.12
Release date: 2019-02-14
This release contains a variety of fixes from 9.6.11. For information about new features in the 9.6 major release, see Section E.57.
E.45.1. Migration to Version 9.6.12
A dump/restore is not required for those running 9.6.X.
However, if you are upgrading from a version earlier than 9.6.9, see Section E.48.
E.45.2. Changes
By default, panic instead of retrying after
fsync()failure, to avoid possible data corruption (Craig Ringer, Thomas Munro)Some popular operating systems discard kernel data buffers when unable to write them out, reporting this as
fsync()failure. If we reissue thefsync()request it will succeed, but in fact the data has been lost, so continuing risks database corruption. By raising a panic condition instead, we can replay from WAL, which may contain the only remaining copy of the data in such a situation. While this is surely ugly and inefficient, there are few alternatives, and fortunately the case happens very rarely.A new server parameter data_sync_retry has been added to control this; if you are certain that your kernel does not discard dirty data buffers in such scenarios, you can set
data_sync_retrytoonto restore the old behavior.Include each major release branch's release notes in the documentation for only that branch, rather than that branch and all later ones (Tom Lane)
The duplication induced by the previous policy was getting out of hand. Our plan is to provide a full archive of release notes on the project's web site, but not duplicate it within each release.
Avoid possible deadlock when acquiring multiple buffer locks (Nishant Fnu)
Avoid deadlock between hot-standby queries and replay of GIN index page deletion (Alexander Korotkov)
Fix possible crashes in logical replication when index expressions or predicates are in use (Peter Eisentraut)
Avoid useless and expensive logical decoding of TOAST data during a table rewrite (Tomas Vondra)
Fix logic for stopping a subset of WAL senders when synchronous replication is enabled (Paul Guo, Michael Paquier)
Avoid possibly writing an incorrect replica identity field in a tuple deletion WAL record (Stas Kelvich)
Make the archiver prioritize WAL history files over WAL data files while choosing which file to archive next (David Steele)
Fix possible crash in
UPDATEwith a multipleSETclause using a sub-SELECTas source (Tom Lane)Avoid crash if libxml2 returns a null error message (Sergio Conde Gómez)
Fix spurious grouping-related parser errors caused by inconsistent handling of collation assignment (Andrew Gierth)
In some cases, expressions that should be considered to match were not seen as matching, if they included operations on collatable data types.
Check whether the comparison function underlying
LEAST()orGREATEST()is leakproof, rather than just assuming it is (Tom Lane)Actual information leaks from btree comparison functions are typically hard to provoke, but in principle they could happen.
Fix incorrect planning of queries involving nested loops both above and below a Gather plan node (Tom Lane)
If both levels of nestloop needed to pass the same variable into their right-hand sides, an incorrect plan would be generated.
Fix incorrect planning of queries in which a lateral reference must be evaluated at a foreign table scan (Tom Lane)
Fix corner-case underestimation of the cost of a merge join (Tom Lane)
The planner could prefer a merge join when the outer key range is much smaller than the inner key range, even if there are so many duplicate keys on the inner side that this is a poor choice.
Avoid O(N^2) planning time growth when a query contains many thousand indexable clauses (Tom Lane)
Improve
ANALYZE's handling of concurrently-updated rows (Jeff Janes, Tom Lane)Previously, rows deleted by an in-progress transaction were omitted from
ANALYZE's sample, but this has been found to lead to more inconsistency than including them would do. In effect, the sample now corresponds to an MVCC snapshot as ofANALYZE's start time.Make
TRUNCATEignore inheritance child tables that are temporary tables of other sessions (Amit Langote, Michael Paquier)This brings
TRUNCATEinto line with the behavior of other commands. Previously, such cases usually ended in failure.Fix
TRUNCATEto update the statistics counters for the right table (Tom Lane)If the truncated table had a TOAST table, that table's counters were reset instead.
Process
ALTER TABLE ONLY ADD COLUMN IF NOT EXISTScorrectly (Greg Stark)Allow
UNLISTENin hot-standby mode (Shay Rojansky)This is necessarily a no-op, because
LISTENisn't allowed in hot-standby mode; but allowing the dummy operation simplifies session-state-reset logic in clients.Fix missing role dependencies in some schema and data type permissions lists (Tom Lane)
In some cases it was possible to drop a role to which permissions had been granted. This caused no immediate problem, but a subsequent dump/reload or upgrade would fail, with symptoms involving attempts to grant privileges to all-numeric role names.
Ensure relation caches are updated properly after adding or removing foreign key constraints (Álvaro Herrera)
This oversight could result in existing sessions failing to enforce a newly-created constraint, or continuing to enforce a dropped one.
Ensure relation caches are updated properly after renaming constraints (Amit Langote)
Make autovacuum more aggressive about removing leftover temporary tables, and also remove leftover temporary tables during
DISCARD TEMP(Álvaro Herrera)This helps ensure that remnants from a crashed session are cleaned up more promptly.
Fix replay of GiST index micro-vacuum operations so that concurrent hot-standby queries do not see inconsistent state (Alexander Korotkov)
Prevent empty GIN index pages from being reclaimed too quickly, causing failures of concurrent searches (Andrey Borodin, Alexander Korotkov)
Fix edge-case failures in float-to-integer coercions (Andrew Gierth, Tom Lane)
Values very slightly above the maximum valid integer value might not be rejected, and then would overflow, producing the minimum valid integer instead. Also, values that should round to the minimum or maximum integer value might be incorrectly rejected.
When making a PAM authentication request, don't set the
PAM_RHOSTvariable if the connection is via a Unix socket (Thomas Munro)Previously that variable would be set to
[local], which is at best unhelpful, since it's supposed to be a host name.Disallow setting
client_min_messageshigher thanERROR(Jonah Harris, Tom Lane)Previously, it was possible to set this variable to
FATALorPANIC, which had the effect of suppressing transmission of ordinary error messages to the client. However, that's contrary to guarantees that are given in the PostgreSQL wire protocol specification, and it caused some clients to become very confused. In released branches, fix this by silently treating such settings as meaningERRORinstead. Version 12 and later will reject those alternatives altogether.Fix ecpglib to use
uselocale()or_configthreadlocale()in preference tosetlocale()(Michael Meskes, Tom Lane)Since
setlocale()is not thread-local, and might not even be thread-safe, the previous coding caused problems in multi-threaded ecpg applications.Fix incorrect results for numeric data passed through an ecpg SQLDA (SQL Descriptor Area) (Daisuke Higuchi)
Values with leading zeroes were not copied correctly.
Fix psql's
\gtargetmeta-command to work withCOPY TO STDOUT(Daniel Vérité)Previously, the
targetoption was ignored, so that the copy data always went to the current query output target.Make psql's LaTeX output formats render special characters properly (Tom Lane)
Backslash and some other ASCII punctuation characters were not rendered correctly, leading to document syntax errors or wrong characters in the output.
Fix pg_dump's handling of materialized views with indirect dependencies on primary keys (Tom Lane)
This led to mis-labeling of such views' dump archive entries, causing harmless warnings about “archive items not in correct section order”; less harmlessly, selective-restore options depending on those labels, such as
--section, might misbehave.Avoid null-pointer-dereference crash on some platforms when pg_dump or pg_restore tries to report an error (Tom Lane)
Fix
contrib/hstoreto calculate correct hash values for emptyhstorevalues that were created in version 8.4 or before (Andrew Gierth)The previous coding did not give the same result as for an empty
hstorevalue created by a newer version, thus potentially causing wrong results in hash joins or hash aggregation. It is advisable to reindex any hash indexes built onhstorecolumns, if the table might contain data that was originally stored as far back as 8.4 and was never dumped/reloaded since then.Avoid crashes and excessive runtime with large inputs to
contrib/intarray'sgist__int_opsindex support (Andrew Gierth)Support new Makefile variables
PG_CFLAGS,PG_CXXFLAGS, andPG_LDFLAGSin pgxs builds (Christoph Berg)This simplifies customization of extension build processes.
Fix Perl-coded build scripts to not assume “
.” is in the search path, since recent Perl versions don't include that (Andrew Dunstan)Fix server command-line option parsing problems on OpenBSD (Tom Lane)
Relocate call of
set_rel_pathlist_hookso that extensions can use it to supply partial paths for parallel queries (KaiGai Kohei)This is not expected to affect existing use-cases.
Update time zone data files to tzdata release 2018i for DST law changes in Kazakhstan, Metlakatla, and Sao Tome and Principe. Kazakhstan's Qyzylorda zone is split in two, creating a new zone Asia/Qostanay, as some areas did not change UTC offset. Historical corrections for Hong Kong and numerous Pacific islands.