E.19. Выпуск 10.5
Дата выпуска: 2018-08-09
В этот выпуск вошли различные исправления, внесённые после версии 10.4. За информацией о нововведениях версии 10 обратитесь к Разделу E.24.
E.19.1. Миграция на версию 10.5
Если используется версия 10.X, выгрузка/восстановление базы не требуется.
Если вы обновляете сервер с более ранней версии, чем 10.4, см. также Раздел E.20.
E.19.2. Изменения
Осуществление полного сброса состояния libpq между попытками соединения (Том Лейн)
Непривилегированный пользователь
dblinkилиpostgres_fdwмог обойти проверки, предназначенные для предотвращения использования учётных данных на стороне сервера, например, файла~/.pgpass, принадлежащего пользователю ОС, от имени которого работает сервер. В частности, уязвимость затрагивает серверы, принимающие локальные подключения с методом peer. Возможны были и другие атаки, например, SQL-инъекции в сеансеpostgres_fdw. Для атаки наpostgres_fdwчерез эту уязвимость пользователь должен был иметь возможность создавать объект стороннего сервера с нужными параметрами подключения, но атаку наdblinkмог произвести любой пользователь, имеющий к нему доступ. Вообще любой пользователь, имеющий возможность менять параметры подключения для приложения на базе libpq, мог производить непредусмотренные действия, но другие эффективные сценарии эксплуатации этого сложно придумать. Мы благодарим Андрея Красичкова за сообщение о данном дефекте. (CVE-2018-10915)Исправление поведения
INSERT ... ON CONFLICT UPDATEс более сложным представлением, чем простоSELECT * FROM ...(Дин Рашид, Амит Ланготе)Ошибочное развёртывание изменяемого представления могло приводить к сбоям или ошибкам «attribute ... has the wrong type» (атрибут ... имеет неверный тип), если список
SELECTпредставления не соответствовал в точности списку столбцов нижележащей таблицы. Более того, развив атаку через эту уязвимость, злоумышленник мог изменять столбцы, не имея для них праваUPDATE, но имея праваINSERTиUPDATEдля некоторых других столбцов в таблице. Любой пользователь также мог эксплуатировать её для раскрытия содержимого памяти сервера. (CVE-2018-10925)Обеспечение своевременного изменения полей
relfrozenxidиrelminmxidв «зафиксированных» системных каталогах (Андрес Фройнд)Из-за чрезмерно оптимистичного кеширования эти изменения могли оказаться невидимыми для других сеансов, что приводило к случайным ошибкам и/или разрушению данных. Для общих каталогов, таких как
pg_authid, проблема была ещё острее, так как устаревшие кешированные данные могли попадать в новые сеансы и оставаться в существующих.Исправление поведения в ситуации, когда недавно повышенный сервер аварийно завершается до окончания обработки первой контрольной точки после восстановления (Микаэль Пакье, Кётаро Хоригути, Паван Деоласи, Альваро Эррера)
В такой ситуации сервер не считал, что при последующем воспроизведении WAL было достигнуто согласованное состояние базы данных, и это препятствовало его перезапуску.
Исключение выдачи фантомной записи WAL при переработке полностью нулевой страницы индекса btree (Амит Капила)
Эта ошибка проявлялась в сбоях проверочных утверждений и могла приводить к неоправданным отменам запросов на серверах горячего резерва.
При воспроизведении WAL добавлена защита от некорректной длины записи, превышающей 1 ГБ (Микаэль Пакье)
Подобные данные должны считаться некорректными. Ранее код пытался выделить такой объём и получал критическую ошибку, что делало восстановление невозможным.
При завершении восстановления запись в файл истории линии времени должна откладываться, насколько это возможно (Хейкки Линнакангас)
Это позволяет избежать ситуаций с несогласованностью состояния линии времени на диске, возникавших при сбое в процессе очистки после восстановления (например, при проблеме с файлом двухфазного состояния).
Увеличение скорости воспроизведения WAL для транзакций, удаляющих множество отношений (Фудзии Масао)
В результате этого изменения уменьшается число сканирований общих буферов, поэтому эффект от данного изменения тем больше, чем больше значение shared_buffers.
Увеличение скорости освобождения блокировки при воспроизведении WAL ведомым сервером (Томас Манро)
Обеспечение согласованной передачи состояния логической трансляции передатчиками WAL (Саймон Риггс, Савада Масахико)
Ранее код не мог правильно определить, удалось ли нагнать вышестоящий сервер.
Обеспечение наличия снимка при выполнении функций ввода типа данных в подписчиках логической репликации (Мин-Цюань Тран, Альваро Эррера)
Отсутствие снимка в некоторых случаях приводило к сбоям, например, при вводе доменов с ограничениями, определяемыми функциями на языке SQL.
Устранение дефектов в процедуре обработки снимков при логическом декодировании, приводивших к ошибкам декодирования в редких случаях (Арсений Шер, Альваро Эррера)
Добавление обработки подтранзакций в рабочих процессах синхронизации таблиц при логической репликации (Амит Хандекар, Роберт Хаас)
Ранее синхронизация таблицы могла выполняться некорректно в случае отката подтранзакций после модификации синхронизируемой таблицы.
Обеспечение корректного сброса кешированного списка индексов таблицы после сбоя при создания индекса (Питер Гейган)
Ранее в этом списке могли оставаться OID нерабочих индексов, что могло приводить к проблемам в том же сеансе.
Исправление некорректной обработки пустых несжатых страниц списка идентификаторов в индексах GIN (Шивасубраманьян Рамасубраманьян, Александр Коротков)
Это могло привести к сбою проверочного утверждения после выполнения pg_upgrade для индексов GIN версии до 9.4 (в 9.4 и последующих версиях такие страницы не создаются).
Выравнивание массивов безымянных семафоров POSIX для уменьшения разделения линий кеша (Томас Манро)
Это снижает конкуренцию в многопроцессорных системах и устраняет падение производительности (наблюдаемое в сравнении с предыдущими выпусками) в Linux и FreeBSD.
Обеспечение реакции на сигналы в процессе, производящем параллельное сканирование индекса (Амит Капила)
Ранее параллельные исполнители могли «зависать», ожидая блокировки страницы индекса, и не замечать сигналы прерывания запроса.
Обеспечение реакции на сигналы в процессе
VACUUMв цикле удаления страниц B-дерева (Андрес Фройнд)С испорченными индексами btree цикл мог оказаться бесконечным, и прервать его можно было только аварийно отключив сервер.
Исправление ошибки с оценкой стоимости соединения по хешу при оптимизации inner_unique (Дэвид Роули)
Это могло приводить к выбору неудачного плана запроса, когда применялась эта оптимизация.
Исправление некорректной оптимизации классов эквивалентности со столбцами составного типа (Том Лейн)
Вследствие данной ошибки сервер не понимал, что индекс по составному столбцу может обеспечить порядок сортировки, необходимый для соединения слиянием с данным столбцом.
Исправление планировщика с целью устранения ошибок «ORDER/GROUP BY expression not found in targetlist» (выражение ORDER/GROUP BY не найдено в целевом списке) при выполнении некоторых запросов с функциями, возвращающими множества (Том Лейн)
Исправление обработки ключей секционирования с типами данных, которые используют полиморфный класс операторов btree; например, это касается массивов (Амит Ланготе, Альваро Эррера)
Исправление синтаксиса конструкции SQL-стандарта
FETCH FIRST, чтобы она принимала ($), как того требует стандарт (Эндрю Гирт)nУдаление недокументированного ограничения, не допускающего дублирования столбцов в ключах разбиения (Юго Нагата)
Недопущение использования временных таблиц в качестве секций не временных, а обычных таблиц (Амит Ланготе, Микаэль Пакье)
Ранее такое использование разрешалось, но работало ненадёжно.
Исправление в
EXPLAINучёта использования ресурсов, в частности, обращений к буферам (Амит Капила, Томас Манро)Исправление поведения
SHOW ALL, чтобы эта команда показывала все параметры членам ролиpg_read_all_settingsи позволяла этим пользователям видеть имя файла и номер строки в представленииpg_settings(Лоренц Альбе, Альваро Эррера)Корректное добавление схемы к именам ряда объектов в выводе
getObjectDescriptionиgetObjectIdentity(Кётаро Хоригути, Том Лейн)Имена правил сортировки, преобразований, объектов текстового поиска, отношений публикаций и объектов расширенной статистики не дополнялись схемой, тогда как должны были.
Исправление проверки типа
CREATE AGGREGATEс тем, чтобы к агрегатам с переменными аргументами можно было присоединять функции поддержки распараллеливания (Алексей Баштанов)Расширение счётчика строк в команде
COPY FROMс 32 до 64 бит (Дэвид Роули)Тем самым были решены две проблемы с входными данными, содержащими более 4G строк:
COPY FROM WITH HEADERтерял одну строку на каждые 4G строк (не только первую), а в сообщениях об ошибках выводилось неверное количество строк.Восстановление возможности удаления слотов репликации в однопользовательском режиме (Альваро Эррера)
Она была непреднамеренно утрачена в выпуске 10.0.
Исправление некорректных результатов функции
variance(int4)и связанных агрегатов при работе в параллельном режиме агрегирования (Дэвид Роули)Внесение корректив в обработку узлов
TEXTиCDATAв выражениях столбцовxmltable()(Маркус Винанд)Защита от возможной ошибки в функции OpenSSL
RAND_bytes()(Дин Рашид, Микаэль Пакье)При редких обстоятельствах это упущение могло приводить к отказам с сообщением «could not generate random cancel key» (не удалось сгенерировать случайный ключ отмены), устранить которые можно было, только перезапустив главный процесс.
Исправление поведения libpq в некоторых случаях, когда задаётся
hostaddr(Хари Бабу, Том Лейн, Роберт Хаас)Функция
PQhost()в некоторых случаях выдавала некорректные или вводящие в заблуждение результаты. Теперь она единообразно возвращает имя узла (если оно указано), или адрес узла (если указан только он), или имя узла по умолчанию (обычно/tmpлибоlocalhost, если опущены оба параметра).Также при проверке сертификата SSL с именем сервера могло сравниваться неправильное значение.
Кроме того, поле с именем узла в
~/.pgpassмогло сравниваться с неправильным значением. Теперь это поле сравнивается с именем сервера (если оно указано), либо с его адресом (если указан только он), либо сlocalhost(если опущены оба параметра).Помимо этого, когда значение
hostaddrнельзя было разобрать, выдавалось неправильное сообщение об ошибке.А когда параметры
host,hostaddrилиportсодержат списки через запятую, libpq теперь аккуратнее обрабатывает пустые элементы списков (воспринимая их как значения по умолчанию).Добавление в библиотеку ecpg
pgtypesфункции освобождения строк для исключения проблем с управлением памятью в разных модулях (Такаюки Цунакава)В Windows могут происходить сбои, если вызов
freeдля некоторого блока памяти производится не из той DLL, которая выделила память (с помощьюmalloc). Библиотекаpgtypesиногда возвращает строки, которые должен освободить вызывающий код, и сделать это корректно оказывается невозможно. Добавленная функцияPGTYPESchar_free()является просто обёрткойfree, позволяющей приложениям произвести освобождение по правилам.Исправление поддержки в ecpg переменных
long longв Windows, а также на других платформах, гдеstrtoll/strtoullобъявлены нестандартно или не объявлены вовсе (Хыонг Дангминь, Том Лейн)Исправление ошибки с определением типа SQL-оператора в PL/pgSQL, когда изменение правила приводило к изменению семантики оператора в рамках сеанса (Том Лейн)
Эта ошибка приводила к сбоям проверочных утверждений или, в редких случаях, к тому, что указание
INTO STRICTне работало должным образом.Исправление запроса пароля в клиентских программах, чтобы отображение корректно отключалось в Windows, когда
stdin— не терминал (Мэтью Стикни)Доработка исправления некорректного заключения в кавычки значений для переменных GUC со списками при формировании дампа (Том Лейн)
Предыдущее исправление для заключения в кавычки значения
search_pathи других переменных со списками в выводе pg_dump, как оказалось, привело к ошибкам со списками с пустыми элементами и риску потери части длинных файловых путей.В pg_dump устранено упущение, когда свойства
REPLICA IDENTITYдля индексов ограничений не выгружались (Том Лейн)Уникальные индексы, созданные вручную, помечались корректно, а индексы, созданные ограничениями
UNIQUEилиPRIMARY KEY— нет.В pg_upgrade теперь правильно проверяется, что старый сервер был выключен штатно (Брюс Момджян)
Ранее проверка могла сработать некорректно при выключении сервера в незамедлительном режиме.
Исправление в
contrib/hstore_plperlпросмотра скалярных ссылок Perl и предотвращение сбоя в случае, если не удаётся найти хеш-ссылку там, где она ожидается (Том Лейн)Устранение сбоя в функции модуля
contrib/ltreeпри получении на вход пустого массива (Пьер Дюкроке)Исправление обработки ошибок в ряде мест, где мог выдаваться некорректный код ошибки (Микаэль Пакье, Том Лейн, Магнус Хагандер)
Переоформление скриптов Makefile для обеспечения компоновки программ с собранными в том же дереве библиотеками (например,
libpq.so), а не с теми, что могут уже находиться в системных каталогах библиотек (Том Лейн)Это позволяет избежать проблем при сборке на платформах, где представлены старые версии библиотек PostgreSQL.
Обновление данных часовых поясов до версии tzdata 2018e, включающее изменение правил перехода на летнее время в Северной Корее, а также корректировку исторических данных для Чехословакии.
В это обновление вошло переопределение «летнего времени», которое действует в Ирландии, а также действовало в прошлом в Намибии и в Чехословакии. В этих юрисдикциях стандартное время действует летом, а время для экономии света — зимой, поэтому при переходе на это время сдвиг производится на час назад, а не на час вперёд. Это не влияет ни на фактическое смещение от UTC, ни на используемое сокращение часового пояса; эта особенность проявляется лишь в том, что в таких случаях столбец
is_dstв представленииpg_timezone_namesбудет содержать true для зимнего периода, и false для летнего.
E.19. Release 10.5
Release date: 2018-08-09
This release contains a variety of fixes from 10.4. For information about new features in major release 10, see Section E.24.
E.19.1. Migration to Version 10.5
A dump/restore is not required for those running 10.X.
However, if you are upgrading from a version earlier than 10.4, see Section E.20.
E.19.2. Changes
Fix failure to reset libpq's state fully between connection attempts (Tom Lane)
An unprivileged user of
dblinkorpostgres_fdwcould bypass the checks intended to prevent use of server-side credentials, such as a~/.pgpassfile owned by the operating-system user running the server. Servers allowing peer authentication on local connections are particularly vulnerable. Other attacks such as SQL injection into apostgres_fdwsession are also possible. Attackingpostgres_fdwin this way requires the ability to create a foreign server object with selected connection parameters, but any user with access todblinkcould exploit the problem. In general, an attacker with the ability to select the connection parameters for a libpq-using application could cause mischief, though other plausible attack scenarios are harder to think of. Our thanks to Andrew Krasichkov for reporting this issue. (CVE-2018-10915)Fix
INSERT ... ON CONFLICT UPDATEthrough a view that isn't justSELECT * FROM ...(Dean Rasheed, Amit Langote)Erroneous expansion of an updatable view could lead to crashes or “attribute ... has the wrong type” errors, if the view's
SELECTlist doesn't match one-to-one with the underlying table's columns. Furthermore, this bug could be leveraged to allow updates of columns that an attacking user lacksUPDATEprivilege for, if that user hasINSERTandUPDATEprivileges for some other column(s) of the table. Any user could also use it for disclosure of server memory. (CVE-2018-10925)Ensure that updates to the
relfrozenxidandrelminmxidvalues for “nailed” system catalogs are processed in a timely fashion (Andres Freund)Overoptimistic caching rules could prevent these updates from being seen by other sessions, leading to spurious errors and/or data corruption. The problem was significantly worse for shared catalogs, such as
pg_authid, because the stale cache data could persist into new sessions as well as existing ones.Fix case where a freshly-promoted standby crashes before having completed its first post-recovery checkpoint (Michael Paquier, Kyotaro Horiguchi, Pavan Deolasee, Álvaro Herrera)
This led to a situation where the server did not think it had reached a consistent database state during subsequent WAL replay, preventing restart.
Avoid emitting a bogus WAL record when recycling an all-zero btree page (Amit Kapila)
This mistake has been seen to cause assertion failures, and potentially it could result in unnecessary query cancellations on hot standby servers.
During WAL replay, guard against corrupted record lengths exceeding 1GB (Michael Paquier)
Treat such a case as corrupt data. Previously, the code would try to allocate space and get a hard error, making recovery impossible.
When ending recovery, delay writing the timeline history file as long as possible (Heikki Linnakangas)
This avoids some situations where a failure during recovery cleanup (such as a problem with a two-phase state file) led to inconsistent timeline state on-disk.
Improve performance of WAL replay for transactions that drop many relations (Fujii Masao)
This change reduces the number of times that shared buffers are scanned, so that it is of most benefit when that setting is large.
Improve performance of lock releasing in standby server WAL replay (Thomas Munro)
Make logical WAL senders report streaming state correctly (Simon Riggs, Sawada Masahiko)
The code previously mis-detected whether or not it had caught up with the upstream server.
Ensure that a snapshot is provided when executing data type input functions in logical replication subscribers (Minh-Quan Tran, Álvaro Herrera)
This omission led to failures in some cases, such as domains with constraints using SQL-language functions.
Fix bugs in snapshot handling during logical decoding, allowing wrong decoding results in rare cases (Arseny Sher, Álvaro Herrera)
Add subtransaction handling in logical-replication table synchronization workers (Amit Khandekar, Robert Haas)
Previously, table synchronization could misbehave if any subtransactions were aborted after modifying a table being synchronized.
Ensure a table's cached index list is correctly rebuilt after an index creation fails partway through (Peter Geoghegan)
Previously, the failed index's OID could remain in the list, causing problems later in the same session.
Fix mishandling of empty uncompressed posting list pages in GIN indexes (Sivasubramanian Ramasubramanian, Alexander Korotkov)
This could result in an assertion failure after pg_upgrade of a pre-9.4 GIN index (9.4 and later will not create such pages).
Pad arrays of unnamed POSIX semaphores to reduce cache line sharing (Thomas Munro)
This reduces contention on many-CPU systems, fixing a performance regression (compared to previous releases) on Linux and FreeBSD.
Ensure that a process doing a parallel index scan will respond to signals (Amit Kapila)
Previously, parallel workers could get stuck waiting for a lock on an index page, and not notice requests to abort the query.
Ensure that
VACUUMwill respond to signals within btree page deletion loops (Andres Freund)Corrupted btree indexes could result in an infinite loop here, and that previously wasn't interruptible without forcing a crash.
Fix hash-join costing mistake introduced with inner_unique optimization (David Rowley)
This could lead to bad plan choices in situations where that optimization was applicable.
Fix misoptimization of equivalence classes involving composite-type columns (Tom Lane)
This resulted in failure to recognize that an index on a composite column could provide the sort order needed for a mergejoin on that column.
Fix planner to avoid “ORDER/GROUP BY expression not found in targetlist” errors in some queries with set-returning functions (Tom Lane)
Fix handling of partition keys whose data type uses a polymorphic btree operator class, such as arrays (Amit Langote, Álvaro Herrera)
Fix SQL-standard
FETCH FIRSTsyntax to allow parameters ($), as the standard expects (Andrew Gierth)nRemove undocumented restriction against duplicate partition key columns (Yugo Nagata)
Disallow temporary tables from being partitions of non-temporary tables (Amit Langote, Michael Paquier)
While previously allowed, this case didn't work reliably.
Fix
EXPLAIN's accounting for resource usage, particularly buffer accesses, in parallel workers (Amit Kapila, Robert Haas)Fix
SHOW ALLto show all settings to roles that are members ofpg_read_all_settings, and also allow such roles to see source filename and line number in thepg_settingsview (Laurenz Albe, Álvaro Herrera)Fix failure to schema-qualify some object names in
getObjectDescriptionandgetObjectIdentityoutput (Kyotaro Horiguchi, Tom Lane)Names of collations, conversions, text search objects, publication relations, and extended statistics objects were not schema-qualified when they should be.
Fix
CREATE AGGREGATEtype checking so that parallelism support functions can be attached to variadic aggregates (Alexey Bashtanov)Widen
COPY FROM's current-line-number counter from 32 to 64 bits (David Rowley)This avoids two problems with input exceeding 4G lines:
COPY FROM WITH HEADERwould drop a line every 4G lines, not only the first line, and error reports could show a wrong line number.Allow replication slots to be dropped in single-user mode (Álvaro Herrera)
This use-case was accidentally broken in release 10.0.
Fix incorrect results from
variance(int4)and related aggregates when run in parallel aggregation mode (David Rowley)Process
TEXTandCDATAnodes correctly inxmltable()column expressions (Markus Winand)Cope with possible failure of OpenSSL's
RAND_bytes()function (Dean Rasheed, Michael Paquier)Under rare circumstances, this oversight could result in “could not generate random cancel key” failures that could only be resolved by restarting the postmaster.
Fix libpq's handling of some cases where
hostaddris specified (Hari Babu, Tom Lane, Robert Haas)PQhost()gave misleading or incorrect results in some cases. Now, it uniformly returns the host name if specified, or the host address if only that is specified, or the default host name (typically/tmporlocalhost) if both parameters are omitted.Also, the wrong value might be compared to the server name when verifying an SSL certificate.
Also, the wrong value might be compared to the host name field in
~/.pgpass. Now, that field is compared to the host name if specified, or the host address if only that is specified, orlocalhostif both parameters are omitted.Also, an incorrect error message was reported for an unparseable
hostaddrvalue.Also, when the
host,hostaddr, orportparameters contain comma-separated lists, libpq is now more careful to treat empty elements of a list as selecting the default behavior.Add a string freeing function to ecpg's
pgtypeslibrary, so that cross-module memory management problems can be avoided on Windows (Takayuki Tsunakawa)On Windows, crashes can ensue if the
freecall for a given chunk of memory is not made from the same DLL thatmalloc'ed the memory. Thepgtypeslibrary sometimes returns strings that it expects the caller to free, making it impossible to follow this rule. Add aPGTYPESchar_free()function that just wrapsfree, allowing applications to follow this rule.Fix ecpg's support for
long longvariables on Windows, as well as other platforms that declarestrtoll/strtoullnonstandardly or not at all (Dang Minh Huong, Tom Lane)Fix misidentification of SQL statement type in PL/pgSQL, when a rule change causes a change in the semantics of a statement intra-session (Tom Lane)
This error led to assertion failures, or in rare cases, failure to enforce the
INTO STRICToption as expected.Fix password prompting in client programs so that echo is properly disabled on Windows when
stdinis not the terminal (Matthew Stickney)Further fix mis-quoting of values for list-valued GUC variables in dumps (Tom Lane)
The previous fix for quoting of
search_pathand other list-valued variables in pg_dump output turned out to misbehave for empty-string list elements, and it risked truncation of long file paths.Fix pg_dump's failure to dump
REPLICA IDENTITYproperties for constraint indexes (Tom Lane)Manually created unique indexes were properly marked, but not those created by declaring
UNIQUEorPRIMARY KEYconstraints.Make pg_upgrade check that the old server was shut down cleanly (Bruce Momjian)
The previous check could be fooled by an immediate-mode shutdown.
Fix
contrib/hstore_plperlto look through Perl scalar references, and to not crash if it doesn't find a hash reference where it expects one (Tom Lane)Fix crash in
contrib/ltree'slca()function when the input array is empty (Pierre Ducroquet)Fix various error-handling code paths in which an incorrect error code might be reported (Michael Paquier, Tom Lane, Magnus Hagander)
Rearrange makefiles to ensure that programs link to freshly-built libraries (such as
libpq.so) rather than ones that might exist in the system library directories (Tom Lane)This avoids problems when building on platforms that supply old copies of PostgreSQL libraries.
Update time zone data files to tzdata release 2018e for DST law changes in North Korea, plus historical corrections for Czechoslovakia.
This update includes a redefinition of “daylight savings” in Ireland, as well as for some past years in Namibia and Czechoslovakia. In those jurisdictions, legally standard time is observed in summer, and daylight savings time in winter, so that the daylight savings offset is one hour behind standard time not one hour ahead. This does not affect either the actual UTC offset or the timezone abbreviations in use; the only known effect is that the
is_dstcolumn in thepg_timezone_namesview will now be true in winter and false in summer in these cases.