PostgreSQL 17: изменения в ядре
В этом разделе представлены изменения ядра PostgreSQL 17, включенные в СУБД Pangolin версии 7.1.0.
Миграция на версию 17
Версия 17 содержит ряд изменений, способных нарушить совместимость с предыдущими релизами. Ниже перечислены ключевые аспекты, на которые следует обратить внимание:
Изменение | Описание |
Использование функциями безопасного пути поиска (search_path ) во время операций обслуживания (Джефф Девис) § § | Это изменение помогает предотвратить небезопасный доступ при выполнении операций по обслуживанию базы данных: ANALYZE , CLUSTER , CREATE INDEX , CREATE MATERIALIZED VIEW , REFRESH MATERIALIZED VIEW , REINDEX или VACUUM . Если функции, используемые в индексах по выражениям или в материализованных представлениях, обращаются к объектам, которые находятся в нестандартных схемах, то теперь при создании таких функций необходимо явно указывать путь поиска |
Ограничение использования ago — теперь только в конце значений типа interval (Джозеф Кошаков) § § | Кроме того, теперь запрещается многократное использование пустых единиц измерения в значениях типа interval |
Удаление серверной переменной old_snapshot_threshold (Томас Манро) § | Эта переменная позволяла процессу VACUUM удалять строки, которые потенциально были видимыми для выполняющихся транзакций, и если транзакции пытались получить к ним доступ, возникали ошибки типа «snapshot too old» (снимок слишком стар). Если найдется более удачная реализация, функциональность может быть добавлена обратно в PostgreSQL в будущем |
Изменение обработки статуса суперпользователя для начального пользователя сеанса командой SET SESSION AUTHORIZATION (Джозеф Кошаков) § | Теперь поведение команды зависит от наличия статуса суперпользователя у пользователя в момент выполнения команды SET SESSION AUTHORIZATION , а не на момент подключения к базе данных |
Удаление функциональности симуляции поддержки пользователей на уровне отдельных БД (Натан Боссарт) § | Эта функциональность (db_user_namespace ) использовалась редко |
Удаление дополнительного модуля adminpack (Даниэль Густафссон) § | Ранее этот модуль использовался инструментом pgAdmin III, поддержка которого закончилась |
Удаление значения fsync_writethrough для wal_sync_method в Windows (Томас Манро) § | Это значение было эквивалентно fsync в Windows |
Изменение в обработке границ файлов двумя функциями, связанными с именами файлов WAL (Кетаро Хоригути, Андрес Фройнд, Брюс Момджян) § | Раньше функции pg_walfile_name() и pg_walfile_name_offset() возвращали номер предыдущего сегмента LSN, когда LSN был на границе сегмента файла, теперь они возвращают текущий сегмент LSN |
Удаление ставшей ненужной серверной переменной trace_recovery_messages (Бхарат Рупиредди) § | |
Удаление столбца element_types.domain_default из информационной схемы (Питер Эйзентраут) § | |
Изменение меток для вывода режимов блокирования в модуле pgrowlocks (Брюс Момджян) § | |
Удаление buffers_backend и buffers_backend_fsync из pg_stat_bgwriter (Бхарат Рупиредди) § | Эти столбцы считаются избыточными по отношению к аналогичным столбцам в представлении pg_stat_io |
Переименование столбцов статистики времени ввода-вывода, связанного с чтением и записью блоков данных, в представлении pg_stat_statements (Назир Билал Явуз) § | Столбец blk_read_time теперь называется shared_blk_read_time , а blk_write_time — shared_blk_write_time |
Отображение цели сбора статистики по умолчанию как NULL в столбцах pg_attribute.attstattarget и pg_statistic_ext.stxstattarget (Питер Эйзентраут) § § | |
Переименование pg_collation.colliculocale в colllocale и pg_database.daticulocale в datlocale (Джефф Девис) § | |
Переименование столбцов max_dead_tuples в max_dead_tuple_bytes , num_dead_tuples в num_dead_item_ids и добавление dead_tuple_bytes в представление pg_stat_progress_vacuum (Масахико Савада) § § | |
Переименование столбцов SLRU в системном представлении pg_stat_slru (Альваро Эррера) § | Кроме того, изменились и имена столбцов, которые принимает функция pg_stat_reset_slru() |
Изменения в версии 17
Оптимизатор
Изменение | Описание |
Возможность для оптимизатора улучшать планы с CTE с учетом статистики и порядка сортировки столбцов, из которых выводятся строки в ранних частях запроса (Цзянь Гуо, Ричард Гуо, Том Лейн) § § | |
Улучшение оптимизации запросов с условиями IS NOT NULL и IS NULL (Дэвид Роули, Ричард Гуо, Энди Фан) § § | Теперь оптимизатор удаляет ограничение IS NOT NULL для запросов по столбцам NOT NULL и исключает сканирование по столбцам NOT NULL при использовании условия IS NULL |
Возможность отсекать секции при использовании условий IS [NOT] UNKNOWN для логических столбцов (Дэвид Роули) § | |
Улучшение оптимизации запросов с использованием операторов включения в диапазон <@ и @> (Ким Йохан Андерссон, Цзянь Хи) § | |
Возможность преобразования коррелирующих подзапросов IN в JOIN (Энди Фан, Том Лейн) § | |
Улучшение оптимизации запросов с предложением LIMIT для секционированных таблиц, таблиц с наследованием и для UNION ALL (Энди Фан, Дэвид Роули) § | |
Увеличение числа случаев, в которых можно запускать узлы запросов в параллельном режиме (Том Лейн) § | |
Возможность упорядочивать столбцы GROUP BY , чтобы порядок совпадал с ORDER BY (Андрей Лепихов, Федор Сигаев) § | Это поведение отключается серверной переменной enable_group_by_reordering |
Возможность запросов с UNION (без ALL ) использовать MergeAppend (Дэвид Роули) § | |
Корректировка вычисления количества сортируемых строк в планах MergeAppend (Александр Кузьменков) § | |
Использование индексов GiST и SP-GiST для инкрементальной сортировки (Мирослав Бендик) § | Это улучшение особенно полезно в запросах с ORDER BY , когда первый столбец имеет индекс GiST или SP-GiST, а остальные — нет |
Добавление столбцов в представление pg_stats для вывода информации о гистограммах для диапазонных типов данных (Егор Рогов, Соумйадип Чакраборти) § |
Индексы
Изменение | Описание |
Более эффективная обработка индексами B-tree запросов множества значений, таких как значения, указанные в предложениях IN с использованием констант (Питер Гейган, Маттиас ван де Меент) § | |
Создание индексов BRIN с использованием параллельных исполнителей (Томаш Вондра, Маттиас ван де Меент) § |
Общая производительность
Изменение | Описание |
Более эффективное удаление и заморозка кортежей в процессе VACUUM (Мелани Плейгман, Хейкки Линнакангас) § | Теперь в процессе очистки генерируется меньше трафика WAL |
Более эффективное хранение ссылок на кортежи процессом очистки (Масахико Савада, Джон Нейлор) § § § § | Кроме того, для процесса очистки удалено скрытое ограничение памяти в 1 ГБ, ранее действовавшее даже при повышенных значениях maintenance_work_mem или autovacuum_work_mem |
Оптимизация очистки отношений без индексов (Мелани Плейгман) § | |
Увеличение значения по умолчанию до 2 МБ для vacuum_buffer_usage_limit (Томас Манро) § | |
Улучшение производительности при проверке ролей с членством во множестве ролей (Натан Боссарт) § | |
Улучшение производительности записи в WAL в условиях высокой конкуренции за ресурсы (Бхарат Рупиредди) § | |
Улучшение производительности при передаче клиенту больших блоков данных (Мелих Мутлу) § | |
Возможность объединять операции чтения данных файловой системы с помощью io_combine_limit (Томас Манро, Андрес Фройнд, Мелани Плейгман, Назир Билал Явуз) § § § |
Мониторинг
Изменение | Описание |
Новое системное представление pg_stat_checkpointer (Бхарат Рупиредди, Антон Мельников, Александр Коротков) § § § | В это представление были перенесены некоторые столбцы из pg_stat_bgwriter |
Улучшение управления сбросом статистики (Атсуши Торикоши, Бхарат Рупиредди) § § § | Теперь функции pg_stat_reset_shared() (без аргументов) и pg_stat_reset_shared(NULL) могут сбрасывать всю общую статистику, а функции pg_stat_reset_shared('slru') и pg_stat_reset_slru() (без аргументов) — сбрасывать статистику SLRU-кеша, что было возможно и ранее с помощью pg_stat_reset_slru(NULL) |
Добавление в журнал сообщений, связанных с восстановлением WAL из резервных копий (Андрес Фройнд) § | |
Добавление строки журнала log_connections для подключений по методу trust (Джейкоб Чемпион) § | |
Добавление сообщений журнала о получении и освобождении слотов репликации процессами walsender (Бхарат Рупиредди) § | Чтобы включить запись таких сообщений, используется серверная переменная log_replication_commands |
Добавление системного представления pg_wait_events , выводящего информацию о типах событий ожидания (Бертран Друво) § | Оно предоставляет описание событий ожидания, которые отображаются в pg_stat_activity |
Добавление событий ожидания для задержек контрольных точек (Томас Манро) § | |
Возможность отслеживать обработку индексов в процессе очистки (Сами Имсейх) § | Эту информацию можно найти в столбцах indexes_total и indexes_processed системного представления pg_stat_progress_vacuum |
Права
Изменение | Описание |
Предоставление права на выполнение операций по обслуживанию БД (Натан Боссарт) § | Для этого можно выдать право MAINTAIN на уровне таблицы или предоставить членство в предопределенной роли pg_maintain , в результате чего будут доступны следующие операции: VACUUM , ANALYZE , REINDEX , REFRESH MATERIALIZED VIEW , CLUSTER и LOCK TABLE |
Возможность для ролей с членством в роли pg_monitor выполнять pg_current_logfile() (Павло Голуб, Натан Боссарт) § |
Конфигурация
Изменение | Описание |
Добавление системной переменной allow_alter_system для отключения возможности использовать ALTER SYSTEM (Йелте Феннема-Нио, Габриэль Бартолини) § | |
Возможность использовать ALTER SYSTEM для установки нераспознанных пользовательских серверных переменных (Том Лейн) § | Это также можно делать с помощью GRANT ON PARAMETER |
Добавление серверной переменной transaction_timeout , ограничивающей длительность транзакций (Андрей Бородин, Япинь Ли, Цзюньван Жао, Александр Коротков) § § § | |
Добавление платформонезависимого провайдера правил сортировки builtin (Джефф Девис) § § § § | Провайдер поддерживает правила сортировки C и C.UTF-8 |
Добавление серверной переменной huge_pages_status , выводящей информацию об использовании огромных страниц (Джастин Призби) § | Используется, когда для huge_pages задано значение try |
Добавление серверной переменной, отключающей событийные триггеры (Даниэль Густафссон) § | Переменная event_triggers позволяет временно отключать событийные триггеры для отладки |
Возможность регулировать размеры SLRU-кешей (Андрей Бородин, Дилип Кумар, Альваро Эррера) § | Добавлены серверные переменные commit_timestamp_buffers , multixact_member_buffers , multixact_offset_buffers , notify_buffers , serializable_buffers , subtransaction_buffers и transaction_buffers . commit_timestamp_buffers , transaction_buffers и subtransaction_buffers автоматически масштабируются в зависимости от значения shared_buffers |
Потоковая репликация и восстановление
Изменение | Описание |
Поддержка инкрементального резервного копирования файловой системы (Роберт Хаас, Якуб Вартак, Томаш Вондра) § § | Для создания инкрементальных резервных копий используется новый ключ pg_basebackup , --incremental . Новое приложение pg_combinebackup позволяет работать с базовыми и инкрементальными резервными копиями системы |
Возможность создания файлов сводок WAL (Роберт Хаас, Натан Боссарт, Хуберт Любачевски) § § § § | Эти файлы содержат информацию о номерах блоков, измененных в определенном диапазоне LSN, которые используются при инкрементальном резервном копировании. Для настройки функциональности добавлены серверные переменные summarize_wal и wal_summary_keep_time , а для просмотра информации о файлах — функции pg_available_wal_summaries() , pg_wal_summary_contents() и pg_get_wal_summarizer_state() . |
Добавление системного идентификатора в файлы манифестов копий файловой системы (Амул Сул) § | Это полезно для обнаружения попыток использования неверных журналов WAL |
Указание значения параметра строки подключения dbname при записи информации о подключении в файл postgresql.auto.conf программой pg_basebackup (Вигнеш Си, Хайато Курода) § | |
Добавление столбца pg_replication_slots.invalidation_reason для отображения причины аннулирования слотов (Швета Малик, Бхарат Рупиредди) § § | |
Добавление столбца pg_replication_slots.inactive_since для отображения время неактивности слотов (Бхарат Рупиредди) § § § | |
Добавление функции pg_sync_replication_slots() для синхронизации слотов логической репликации (Хоу Чжицзе, Швета Малик, Аджин Чериан, Питер Эйзентраут) § § | |
Добавление свойства failover в протокол репликации (Хоу Чжицзе, Швета Малик) § |
Логическая репликация
Изменение | Описание |
Добавление приложения pg_createsubscriber для создания логической реплики из резервного сервера физической репликации (Эйлер Тавейра) § | |
Возможность миграции рабочих слотов и подписок логической репликации pg_upgrade (Хайато Курода, Хоу Чжицзе, Вигнеш Си, Жюльен Руо, Шлок Кьял) § § | Теперь репликация может продолжаться сразу после миграции. Поддерживается для кластеров PostgreSQL, начиная с версии 17 |
Автоматическое переключение слотов логической репликации при обработке отказа (Хоу Чжицзе, Швета Малик, Аджин Чериан) § | Для включения функциональности предназначен необязательный пятый аргумент функции pg_create_logical_replication_slot() |
Добавление серверной переменной sync_replication_slots , включающей синхронизацию слотов логической репликации при автоматическом переключении для отработки отказа (Швета Малик, Хоу Чжицзе, Питер Смит) § § | |
Возможность управления поведением при обработке отказа логической репликации в командах CREATE/ALTER SUBSCRIPTION (Швета Малик, Хоу Чжицзе, Аджин Чериан) § § | |
Возможность использования хеш-индексов на стороне подписчика для применения изменений логической репликации (Хайато Курода) § | Ранее для этой цели могли использоваться только индексы B-tree |
Улучшение производительности логического декодирования для случаев с множеством подтранзакций (Масахико Савада) § | |
Реализация перезапуска рабочих процессов, применяющих изменения логической репликации, если у владельца подписки отозваны права суперпользователя (Вигнеш Си) § | При этом требуется повторная аутентификация |
Добавление параметра flush в функцию pg_logical_emit_message() (Микаэль Пакье) § | С этим параметром сообщения гарантированно сохраняются |
Указание физических резервных серверов, которые должны быть синхронизированы перед тем, как данные станут видимыми для подписчиков (Хоу Чжицзе, Швета Малик) § § | Серверы указываются в новой переменной synchronized_standby_slots |
Добавление столбца с типом рабочего процесса в pg_stat_subscription (Питер Смит) § |
Служебные команды
Изменение | Описание |
Добавление нового параметра ON_ERROR ignore в COPY , позволяющего игнорировать строки с ошибками (Дамир Белялов, Атсуши Торикоши, Александр Шульгин, Цзянь Хи, Юго Нагата) § § § § | По умолчанию поведение осталось прежним: ON_ERROR stop |
Добавление нового параметра LOG_VERBOSITY в COPY для вывода игнорируемых строк с ошибками COPY FROM (Бхарат Рупиредди) § | |
Вывод количества пропущенных строк при обработке командой COPY FROM (Атсуши Торикоши) § | Эта информация выводится в столбце системного представления pg_stat_progress_copy.tuples_skipped |
Возможность указывать, что все значения в столбцах в команде COPY FROM должны быть принудительно установлены в NULL или NOT NULL (Чжан Минли) § | |
Поддержка столбцов идентификации для секционированных таблиц (Ашутош Бапат) § | |
Поддержка ограничений-исключений для секционированных таблиц (Пол А. Юнгвирт) § | Чтобы ограничения-исключения работали корректно для секционированных таблиц, они должны сравнивать части ключей секционирования на равенство, при этом другие столбцы могут использовать специфичные для ограничений-исключений сравнения |
Добавление более понятного метода использования ALTER TABLE для указания столбца ориентира статистики по умолчанию (Питер Эйзентраут) § | Добавлен синтаксисALTER TABLE ... SET STATISTICS DEFAULT; устаревший синтаксис SET STATISTICS -1 все еще поддерживается |
Возможность изменять выражение для генерируемых столбцов с помощью ALTER TABLE (Амул Сул) § | Для этого используется команда ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION |
Возможность указывать метод доступа для секционированных таблиц (Джастин Призби, Соумйадип Чакраборти, Микаэль Пакье) § § | |
Добавление значения DEFAULT для ALTER TABLE .. SET ACCESS METHOD (Микаэль Пакье) § | |
Поддержка событийных триггеров, срабатывающих при установлении соединения с БД (Константин Книжник, Михаил Грибков) § | |
Поддержка событийных триггеров для REINDEX (Гаррет Торнбург, Цзянь Хи)§ | |
Поддержка использования синтаксиса в скобках для параметров CLUSTER , если имя таблицы не указано (Натан Боссарт) § |
EXPLAIN
Изменение | Описание |
Возможность выводить информацию об использовании памяти оптимизатором в EXPLAIN (Ашутош Бапат) § | Вывести эту информацию можно при помощи параметра MEMORY |
Добавление в EXPLAIN параметра SERIALIZE для вывода стоимости преобразования данных для передачи по сети (Степан Руц, Маттиас ван де Меент) § | |
Возможность для EXPLAIN отображать статистику времени чтения и записи локальных блоков в выводе с параметром BUFFERS (Назир Билал Явуз) § | |
Улучшение отображения узлов SubPlan и выходных параметров в EXPLAIN (Том Лейн, Дин Рашид) § | |
Отображение информации deform_counter при использовании JIT-компиляции в выводе EXPLAIN (Дмитрий Долгов) § |
Типы данных
Изменение | Описание |
Поддержка значений +/-infinity в типе данных interval (Джозеф Кошаков, Цзянь Хи, Ашутош Бапат) § | |
Возможность использовать тип ENUM, добавленный посредством ALTER TYPE , если тип был создан в той же транзакции (Том Лейн) § | Ранее такой сценарий не допускался |
MERGE
Изменение | Описание |
Возможность модифицировать изменяемые представления командой MERGE (Дин Рашид) § | |
Добавление WHEN NOT MATCHED BY SOURCE в MERGE (Дин Рашид) § | Условие WHEN NOT MATCHED и ранее поддерживалось для целевых строк |
Возможность использовать предложение RETURNING в MERGE (Дин Рашид) § | Новая функция merge_action() в RETURNING позволяет получить информацию о DML-операции для каждой строки |
Функции
Изменение | Описание |
Добавление функции JSON_TABLE() для преобразования данных типа JSON в табличное представление (Никита Глухов, Федор Сигаев, Олег Бартунов, Александр Коротков, Эндрю Дунстан, Амит Ланготе, Цзянь Хи) § § | Эта функция может использоваться в предложении FROM запросов SELECT в качестве источника кортежей |
Добавление функций-конструкторов SQL/JSON: JSON() , JSON_SCALAR() и JSON_SERIALIZE() (Никита Глухов, Федор Сигаев, Олег Бартунов, Александр Коротков, Эндрю Дунстан, Амит Ланготе) § | |
Добавление функций запросов SQL/JSON: JSON_EXISTS() , JSON_QUERY() и JSON_VALUE() (Никита Глухов, Федор Сигаев, Олег Бартунов, Александр Коротков, Эндрю Дунстан, Амит Ланготе, Питер Эйзентраут, Цзянь Хи) § § § § § | |
Добавление методов jsonpath для преобразования значений типа JSON в другие типы JSON (Дживан Чок) § | Добавлены следующие методы jsonpath : .bigint() , .boolean() , .date() , .decimal([precision [, scale]]) , .integer() , .number() , .string() , .time() , .time_tz() , .timestamp() и .timestamp_tz() |
Добавление спецификаторов формата часового пояса для to_timestamp() (Том Лейн) § | TZ принимает аббревиатуры часовых поясов или числовые смещения, а OF принимает только числовые смещения |
Возможность указывать часовой пояс сеанса как AS LOCAL (Вик Фиринг) § | Это полезно для преобразования временных меток с добавлением или удалением информации о часовом поясе, без явного указания часового пояса в формате строки |
Добавление функций uuid_extract_timestamp() и uuid_extract_version() для работы с UUID (Андрей Бородин) § | |
Добавление функций, генерирующих случайные числа в заданном диапазоне (Дин Рашид) § | Добавлены функции random(min, max) , принимающие значения integer , bigint и numeric |
Добавление функций для преобразования целых чисел в строковые представления в двоичной и восьмеричной системах (Эрик Радман, Натан Боссарт) § | Добавлены функции to_bin() и to_oct() |
Добавление функций, связанных с информацией о Unicode (Джефф Девис) § | Функция unicode_version() возвращает версию Unicode, icu_unicode_version() возвращает версию ICU, а unicode_assigned() проверяет, назначены ли символам коды Unicode |
Добавление функции xmltext() , преобразующей текст в отдельный текстовый узел XML (Джим Джонс) § | |
Добавление функции to_regtypemod() , возвращающей модификатор типа для указанной спецификации типа (Дэвид Уилер, Эрик Винхольд) § | |
Добавление функции pg_basetype() , возвращающей базовый тип домена (Стив Чавес) § | |
Добавление функции pg_column_toast_chunk_id() , возвращающей идентификатор TOAST для значения (Юго Нагата) § | Если значение хранится не в виде TOAST, функция возвращает NULL |
PL/PGSQL
Изменение | Описание |
Возможность в PL/pgSQL использовать спецификации %TYPE и %ROWTYPE для представления массивов типов, которые не являются массивами (Цюань Цзунлян, Павел Стехуле) § | |
Возможность в PL/pgSQL использовать спецификацию %TYPE для ссылок на столбцы составного типа (Том Лейн) § |
libpq
Изменение | Описание |
Добавление функции для изменения паролей ролям в libpq (Джо Конвей) § | Добавлена функция PQchangePassword() , которая хеширует новый пароль перед отправкой на сервер |
Добавление функций закрытия порталов и подготовленных операторов (Йелте Феннема-Нио) § | Добавлены следующие функции: PQclosePrepared() , PQclosePortal() , PQsendClosePrepared() и PQsendClosePortal() |
Добавление в libpq API, который позволяет отправлять как блокирующие, так и неблокирующие запросы на отмену с возможностью шифрования, если оно уже используется в соединении (Йелте Феннема-Нио) § | Ранее поддерживались только блокирующие запросы на отмену без засекречивания |
Добавление в libpq функции PQsocketPoll() , предназначенной для опроса состояния сетевого сокета (Тристан Партин, Том Лейн) § § | |
Добавление в libpq функции PQsendPipelineSync() , предназначенной для отправки точки синхронизации в режиме конвейера (Антон Кирилов) § | Эта функция подобна PQpipelineSync() , но она позволяет отложить передачу данных на сервер до достижения лимита размера выходного буфера |
Добавление в libpq функции PQsetChunkedRowsMode() для получения результатов запроса порциями (Даниэль Верите) § | |
Возможность устанавливать TLS-соединения без предварительного согласования (Грег Старк, Хейкки Линнакангас, Питер Эйзентраут, Микаэль Пакье, Даниэль Густафссон) § § § § § § § § | Чтобы включить эту функциональность, используется параметр sslnegotiation=direct на стороне клиента, при этом требуется поддержка ALPN. Поддерживается только для серверов PostgreSQL, начиная с версии 17 |
psql
Изменение | Описание |
Более наглядное отображение пустых прав и прав по умолчанию в выводе psql (Эрик Винхольд, Лауренц Альбе) § | Команда dp теперь выводит (none ) для пустых прав, права по умолчанию по-прежнему отображаются как пустые |
Корректная обработка указания pset null командами с обратной косой чертой (Эрик Винхольд, Лауренц Альбе) § | Ранее в таких командах указание pset null игнорировалось |
Возможность остановить команду psql watch после получения минимального количества строк (Грег Сабино Маллейн) § | Для этого используется параметр min_rows |
Возможность прерывать попытки подключения psql через CTRL+C (Тристан Партин) § | |
Поддержка FETCH_COUNT для команд, отличных от SELECT , в psql (Даниэль Верите) § | |
Улучшение дополнения табуляцией в psql (Дагфинн Ильмари Маннсакер, Жиль Даролд, Кристоф Хейсс, Стив Чавес, Вигнеш Си, Павел Борисов, Цзянь Хи) § § § § § § § § |
Серверные приложения
Изменение | Описание |
Добавление приложения pg_walsummary для выгрузки файлов сводок WAL (Роберт Хаас) § | |
Возможность восстанавливать большие объекты pg_dump порциями (Том Лейн) § | Если в базе данных много больших объектов, это нововведение поможет избежать ограничения на размер транзакции. Кроме того, восстановление можно выполнять параллельно |
Добавление в pg_dump ключа --exclude-extension (Аюш Ватса) § | |
Поддержка включения/исключения объектов через файл приложениями pg_dump , pg_dumpall и pg_restore (Павел Стехуле, Даниэль Густафссон) § | Для этого используется ключ --filter |
Добавление ключа --sync-method в несколько клиентских приложений (Джастин Призби, Натан Боссарт) § | Параметр добавлен в следующие приложения: initdb , pg_basebackup , pg_checksums , pg_dump , pg_rewind и pg_upgrade |
Добавление в pg_restore ключа --transaction-size для восстановления объекта в нескольких транзакциях (Том Лейн) § | Это нововведение позволяет сохранить преимущества работы с порциями транзакций, одновременно предотвращая проблемы, связанные с большими блоками транзакций |
Изменение параметра режима отладки в pgbench с -d на --debug (Грег Сабино Маллейн) § | Ключ -d теперь используется для указания имени базы данных, для этого же предназначен и новый ключ --dbname |
Добавление в pgbench ключа --exit-on-abort для завершения работы при прерывании работы любого клиента (Юго Нагата) § | |
Добавление в pgbench команды syncpipeline , позволяющей отправлять сообщения синхронизации (Антонин Боннефой) § | |
Поддержка удаления файлов истории резервного копирования для pg_archivecleanup (Атсуши Торикоши) § | Для этого используется ключ --clean-backup-history |
Добавление нескольких длинных ключей в pg_archivecleanup (Атсуши Торикоши) § | Добавлены следующие ключи: --debug , --dry-run и --strip-extension |
Возможность для pg_basebackup и pg_receivewal использовать имя базы данных в спецификации подключения (Йелте Феннема-Нио) § | Это нововведение особенно полезно для пулов соединений, учитывающих имена баз данных |
Добавление в pg_upgrade ключа --copy-file-range (Томас Манро) § | Ключ поддерживается в ОС Linux и FreeBSD |
Возможность для reindexdb с ключом --index параллельно обрабатывать индексы разных таблиц (Максим Орлов, Светлана Деревянко, Александр Коротков) § | |
Возможность для reindexdb , vacuumdb и clusterdb обрабатывать объекты, соответствующие шаблону, во всех базах данных (Натан Боссарт) § § § | Для этого предназначен новый ключ --all |
Исходный код
Изменение | Описание |
Прекращение поддержки OpenSSL 1.0.1 (Микаэль Пакье) § | |
Прохождение тестов в режиме OpenSSL FIPS (Питер Эйзентраут) § § | |
Использование инструкций CPU AVX-512 для подсчета битов (Пол Амонсон, Натан Боссарт, Антс Аасма) § § | |
Требование версии LLVM 10 или выше (Томас Манро) § | |
Использование внутренних инструкций CRC для 64-битных процессоров LoongArch (Сюйдун Ян) § | |
Прекращение поддержки AIX (Хейкки Линнакангас) § | |
Удаление параметра сборки PostgreSQL, специфичного для Microsoft Visual Studio (Микаэль Пакье) § | Теперь в среде Visual Studio возможна сборка только с Meson |
Удаление параметра configure --disable-thread-safety (Томас Манро, Хейкки Линнакангас) § § | Предполагается, что на всех платформах есть необходимая поддержка потоков |
Удаление параметра configure --with-CC (Хейкки Линнакангас) § | Теперь указать компилятор можно только в переменной среды CC |
Исключение получения данных с завершающим нулем функциями для пользовательских типов данных (Дэвид Роули) § | |
Добавление инкрементального анализатора JSON для работы с огромными документами JSON (Эндрю Дунстан) § | |
Преобразование верхнеуровневого файла README в формат Markdown (Натан Боссарт) § | |
Удаление ставшего ненужным верхнеуровневого файла INSTALL (Том Лейн) § | |
Удаление параметра make distprep (Питер Эйзентраут) § | |
Добавление поддержки make для разделяемых библиотек Android (Питер Эйзентраут) § | |
Добавление внутренней поддержки точек внедрения (Микаэль Пакье) § § § § | Точки внедрения используются для отладки сервера. Их поддержка должна быть включена во время компиляции |
Добавление реестра сегментов динамической разделяемой памяти (Натан Боссарт) § | Теперь разделяемые библиотеки, не загруженные при запуске сервера, могут координировать использование динамической разделяемой памяти |
Исправление emit_log_hook так, чтобы этот обработчик использовал то же значение времени, что и другие записи журнала для того же запроса (Камбам Винай, Микаэль Пакье) § | |
Улучшение документации по использованию jsonpath для проверок предикатов (Дэвид Уилер) § |
Дополнительные модули
Изменение | Описание |
Возможность проталкивать запросы JOIN с условиями, не связанными с объединением, на сторонние серверы и на нестандартное сканирование (Ричард Гуо, Эцуро Фудзита) § | Обертки сторонних данных и методы нестандартного сканирования необходимо адаптировать для поддержки этого изменения |
Возможность проталкивать подзапросы EXISTS и IN на сторонние серверы postgres_fdw (Александр Пыхалов) § | |
Увеличение значения по умолчанию для стоимости кортежей от оберток сторонних данных (Дэвид Роули, Умайр Шахид) § § | Это значение используется оптимизатором |
Возможность прерывать операции, выполняемые с помощью dblink (Ной Миш) § | |
Возможность создания хеш-индексов по столбцам ltree (Томми Павличек) § | Теперь также возможно соединение и агрегирование по хешу по столбцам ltree |
Возможность включать пробелы и кавычки в правила преобразования символов в unaccent (Микаэль Пакье) § | Изменен синтаксис файла unaccent.rules |
Возможность для amcheck проверять нарушения уникальных ограничений с помощью нового ключа --checkunique (Анастасия Лубенникова, Павел Борисов, Максим Орлов) § | |
Прохождение тестов citext в режиме OpenSSL FIPS (Питер Эйзентраут) § | |
Прохождение тестов pgcrypto в режиме OpenSSL FIPS (Питер Эйзентраут) § | |
Удаление некоторых неиспользуемых макросов SPI (Бхарат Рупиредди) § | |
Возможность для ALTER OPERATOR изменять дополнительные атрибуты оптимизации (Томми Павличек) § | Эта возможность была добавлена для postgres_fdw и dblink |
Добавление в pg_buffercache функции pg_buffercache_evict() , позволяющей вытеснять страницы из общих буферов (Палак Чатурведи, Томас Манро) § | Это полезно при тестировании |
pg_stat_statements
Изменение | Описание |
Замена параметров CALL в pg_stat_statements местозаполнителями (Сами Имсейх) § | |
Замена имен точек сохранения, хранящихся в pg_stat_statements , местозаполнителями (Грег Сабино Маллейн) § | Это значительно сокращает объем данных, записываемых командами SAVEPOINT , RELEASE SAVEPOINT и ROLLBACK TO SAVEPOINT |
Замена GID двухфазной фиксации, хранящихся в pg_stat_statements , местозаполнителями (Микаэль Пакье) § | Это значительно сокращает объем данных, записываемых командами PREPARE TRANSACTION , COMMIT PREPARED и ROLLBACK PREPARED |
Отслеживание команды DEALLOCATE в pg_stat_statements (Дагфинн Ильмари Маннсакер, Микаэль Пакье) § | Имена, используемые в DEALLOCATE , хранятся в pg_stat_statements в виде местозаполнителей |
Добавление в pg_stat_statements столбцов со статистикой времени чтения и записи локальных блоков (Назир Билал Явуз) § § | Добавлены столбцы local_blk_read_time и local_blk_write_time |
Добавление информации deform_counter при использовании JIT-компиляции в pg_stat_statements (Дмитрий Долгов) § | |
Добавление необязательного четвертого аргумента (minmax_only ) в функцию pg_stat_statements_reset() , который позволяет сбросить только статистику максимальных/минимальных значений (Андрей Зубков) § | По умолчанию значение этого аргумента — false |
Добавление в pg_stat_statements столбцов stats_since и minmax_stats_since , в которых отслеживается время создания записи и время последнего сброса минимальных/максимальных значений (Андрей Зубков) § |
Изменения в версии 17.1
Изменение | Описание |
Пометка кешированных планов как зависимых от выполняющих их ролей, когда защита на уровне строк (RLS) применяется для ссылки на таблицу не на верхнем уровне (Натан Боссарт) § | Если общее табличное выражение (CTE), подзапрос, подссылка, представление с контекстом безопасности вызывающего или проекция приведения в запросе ссылались на таблицу с политикой защиты на уровне строк, результирующий план не помечался как потенциально зависимый от выполняющей его роли. Это могло приводить к тому, что последующие запросы в том же сеансе выполнялись с некорректным планом, а скрытые строки возвращались или возвращаемые скрывались |
Библиотека libpq теперь игнорирует сообщения об ошибках, получаемые во время согласования протоколов SSL или GSS (Джейкоб Чемпион) § | Злоумышленники могут подменять реальное выходное сообщение сервера об ошибке, получаемое до того, как завершено согласование криптографического протокола. Это может приводить к различным угрозам безопасности, например, злоумышленник может подменить результат запроса, а невнимательный пользователь спутает его с реальным результатом. Лучше всего игнорировать такие сообщения об ошибках и доверять только сообщениям libpq о сбое соединения |
Запрет на изменение переменных окружения доверенным кодом PL/Perl (Эндрю Дунстан, Ной Миш) § § § | Возможность изменять переменные окружения процессов, такие как PATH , позволяет злоумышленнику выполнять произвольный код. Поэтому теперь это запрещено для «доверенных» процедурных языков. Чтобы исправить проблему с plperl, замените %ENV на связанный хеш, который запрещает вносить изменения с выводом предупреждения. Недоверенный язык plperlu сохраняет возможность изменять переменные окружения |
Исправление обновлений состояния каталога для ограничений внешнего ключа при присоединении или отсоединении секций таблицы (Жеан-Гийом де Рорте, Альваро Эррера) § § | Если целевая таблица секционирована, для ссылающейся таблицы, которая является отдельной, а не секцией, необходимы другие записи каталога. Команды Это можно исправить, выполнив команду Используйте запрос ниже, чтобы выявить нарушенные ограничения и подготовить команды для создания таких ограничений заново:
Поскольку один или несколько этапов выполнения команды ADD CONSTRAINT могут завершиться ошибкой, сохраните вывод запроса в файл и попробуйте заново повторить каждый этап |
Исправление теста для локали C , когда значения переменных LC_COLLATE и LC_CTYPE отличаются (Джефф Девис) § | При использовании libc как провайдера локали по умолчанию, тест, проверяющий использование локали C для сравнения, ранее некорректно проверял значение LC_CTYPE , а не LC_COLLATE . Это не влияло на обычный сценарий работы, когда значения совпадали или оба отличались от C (или псевдонима POSIX ). Однако, если LC_CTYPE имела значение C , а в LC_COLLATE была указана другая локаль, запросы могли выполняться некорректно и было возможно повреждение индексов, построенных по строкам. После установки этого обновления пользователям БД с такими значениями переменных следует перестроить затронутые проблемой индексы. Обратный случай, когда LC_COLLATE принимала значение C , а в LC_CTYPE указана другая локаль, приводил к снижению производительности, но не к ошибкам |
Запрет использования соединений или группировки с учетом секционирования, если сортировка в запросе для столбца ключа не соответствует сортировке ключа секционирования (Цзянь Хи, Веббо Хан) § § | Такие планы ранее могли приводить к некорректным результатам |
Предотвращение сбоя планировщика после преобразования теста IS NULL для столбца NOT NULL в константу FALSE (Ричард Гуо) § | Эта проблема обычно вызывала такие ошибки, как «variable not found in subplan target lists» (переменная не найдена в целевых списках подплана) |
Предотвращение возможного сбоя планировщика во время встраивания SQL-функции, аргументы которой содержат определенные связанные с массивами конструкции (Том Лейн, Натан Боссарт) § | |
Исправление возможных некорректных выводов или ошибки планировщика «wrong varnullingrels» (неправильные varnullingrels) для операций MERGE ... WHEN NOT MATCHED BY SOURCE (Дин Рашид) § § | |
Исправление возможной ошибки «could not find pathkey item to sort» (не удалось найти элемент ключей пути для сортировки), когда необходима сортировка вывода запроса с оператором UNION ALL , а столбец сортировки является выражением (Андрей Лепихов, Том Лейн) § | |
Исправление сканирования индекса-B-tree для ScalarArrayOp в особых случаях (Питер Гейган) § | Вывод мог быть некорректным, когда прокручиваемые курсоры с планом такого вида прокручивались до начальной точки и снова прокручивались вперед |
Исправление сбоя проверочного утверждения или сбивающего с толку сообщения об ошибке выполнения команды COPY (запрос) TO ... , когда запрос переписывается правилом DO INSTEAD NOTIFY (Тендер Ван, Том Лейн) § | |
Исправление проверки параметров FORCE_NOT_NULL и FORCE_NULL команды COPY (Джоэл Джейкобсон) § | Некоторые некорректные варианты использования теперь запрещены, как и должно было быть |
Исправление сбоя сервера в случаях, когда вызов json_objectagg() содержит изменчивую функцию (Амит Ланготе) § | |
Исправление выявления асимметричных данных во время параллельного соединения по хешу (Томас Манро) § | После пересекционирования внутренней стороны соединения по хешу из-за слишком большого количества накопленных кортежей в одной секции проверялось, что все кортежи секции попадали в одну и ту же дочернюю секцию. Так предполагалось, что у всех кортежей одно хеш-значение и последующее пересекционирование не может привнести улучшений. В некоторых случаях эта проверка не работала, из-за чего выполнялось бессмысленное многократное пересекционирование, что в итоге приводило к ошибке исчерпания ресурсов |
Предотвращение сбоев, когда командой ALTER DATABASE SET задается серверный параметр, для которого поиск выполняется на основе пути, например default_text_search_config (Джефф Девис) § | |
Предотвращение повторных поисков классов операторов и сравнений во время создания нового индекса для секционированной таблицы (Том Лейн) § | Исправление вызвано главным образом тем, что иногда поиск выполнялся с ограничением search_path , что вызывало непредвиденные сбои, когда команда CREATE INDEX ссылалась на объекты за пределами схемы pg_catalog . Кроме того, благодаря этому исправлению комментарии к родительскому секционированному индексу больше не копируются в дочерние индексы |
Добавление недостающей зависимости указанного в CREATE TABLE ... USING невстроенного метода доступа от секционированной таблицы (Микаэль Пакье) § | Удаление метода доступа должно было быть запрещено при существовании зависимой от него таблицы, но было возможно, что вызывало странное поведение. Обратите внимание, что это исправление решает проблему только для секционированных таблиц, созданных после обновления |
Запрет использования имен локалей, содержащих не ASCII-символы (Томас Манро) § | Проблема возникала только в Windows, поскольку такие имена локалей больше нигде не используются. Основная сложность заключается в том, что неясно в какой кодировке они представлены (так как используемая кодировка определена в самой локали). Из-за этого недоразумения в последних выпусках PostgreSQL в библиотеке времени выполнения могли случаться прерывания операций. При появлении нового сообщения об ошибке следует либо создать новую локаль с именем только из набора ASCII при помощи программы Locale Builder в Windows, либо использовать имена локалей, соответствующие языковому тегу BCP 47, например, tr-TR |
Устранение условий гонки при фиксации сериализуемой транзакции (Хейкки Линнакангас) § | Некорректная обработка недавно зафиксированной транзакции могла приводить к сбою проверочного утверждения или ошибке «could not access status of transaction» (не удалось получить состояние транзакции) |
Устранение условий гонки при выполнении команды COMMIT PREPARED , которые приводили к наличию потерянных файлов двухфазной фиксации (2PC) (У Чэнвэнь) § | Параллельное выполнение нескольких команд PREPARE TRANSACTION могло приводить к тому, что команда COMMIT PREPARED не удаляла файл состояния двухфазной фиксации на диске для завершенной транзакции. Мгновенно к негативным последствиям это не приводило, однако при последующем восстановлении после сбоя могла возникать ошибка «could not access status of transaction» (не удалось получить состояние транзакции), что требовало ручного удаления потерянного файла для восстановления службы |
Предотвращение некорректного обращения к памяти после пропуска нерабочего индекса TOAST во время выполнения команды VACUUM FULL (Тендер Ван) § | Список, отслеживающий подлежащие перестройке индексы, некорректно обновлялся в этом месте кода, что могло приводить сбоям проверочных утверждений или отказам в будущем |
Исправление возможных потерь обновлений каталога «на месте» (Ной Миш) § § § § § § § | При обычном обновлении строк новая версия строки записывается, чтобы сохранить возможность отката транзакции. Однако при обновлении некоторых системных каталогов транзакции намеренно не затрагиваются, и в таком случае строка обновляется на месте. Данное исправление устраняет условия гонки, которые могли приводить к потере обновлений на месте. Одним из примеров была потеря того, что для pg_class .relhasindex задано значение true , что приводило к невозможности обновления нового индекса и, следовательно, его повреждению |
Сброс кеша каталогов в конце процесса восстановления (Ной Миш) § | Таким образом предотвращаются сценарии, при которых обновления каталога на месте могли быть потеряны из-за использования устаревших данных из кеша каталога |
Предотвращение параллельного выполнения запросов при сдерживании прерываний (Франческо Деграсси, Ной Миш, Том Лейн) § § | С этой ситуацией невозможно было столкнуться во время обычной работы, но можно было воспроизвести при помощи тестовых сценариев, например использовав SQL-функцию в качестве опорной для B-tree (что слишком медленно для промышленной эксплуатации). При успешном воспроизведении возникала ситуация бесконечного ожидания |
Игнорирование еще не определенных порталов в представлении pg_cursors (Том Лейн) § | Определенный пользователем код, исследующий это представление, мог вызываться при настройке нового курсора. Если это случалось, происходило обращение по нулевому указателю. Проблема решена определением представления так, чтобы исключать курсоры, которые еще не полностью настроены |
Предотвращение ошибки «unexpected table_index_fetch_tuple call during logical decoding» (непредвиденный вызов table_index_fetch_tuple во время логического декодирования) при декодировании транзакции, содержащей вставку значения столбца по умолчанию (Такэси Идэриха, Хоу Чжицзе) § § | |
Уменьшение потребления памяти при логическом декодировании (Масахико Савада) § | Теперь используется блок по умолчанию меньшего размера для хранения данных кортежей, получаемых во время логического декодирования. Таким образом снижается потеря памяти, которая, как сообщается, была существенной, возникала во время длительных транзакций и даже приводила к сбоям из-за нехватки памяти |
Исправление поведения стабильных функций, вызываемых из списка аргументов оператора CALL , где CALL находится в блоке EXCEPTION PL/pgSQL (Том Лейн) § | Как и до исправления в предыдущем квартальном выпуске, таким функциям ранее передавался неправильный снимок, в результате чего они получали устаревшие значения строк, которые уже изменились с момента начала внешней транзакции |
Разбор параметра подключения keepalives в libpq так же, как и других целочисленных параметров (Юто Сасаки) § | В используемом коде запрещались завершающие пробелы в значении параметра, в отличие от других случаев. Это оказалось проблемой, например, в использовании ecpg |
Исправление чтения за пределами выборки при разборе некорректных даты и времени в ecpglib (Брюс Момджян, Павел Некрасов) § | Ранее было возможно попытаться считать расположение непосредственно перед началом константного массива. Однако практические следствия этой ошибки незначительны |
Исправление команд описания psql для поддержки серверов версий до 9.4 (Том Лейн) § | Выполнение команд, при которых отображается список управления доступом (ACL), завершалось ошибкой на очень старых версиях сервера PostgreSQL из-за использования функции, отсутствующей в этих версиях |
Предотвращение зависания в psql , если в команде watch указан интервал менее 1 мс (Андрей Бородин, Микаэль Пакье) § | Вместо этого такой интервал будет обрабатываться как равный нулю (без задержки между выполнениями) |
Устранение неспособности найти пароль репликации в ~/.pgpass (Том Лейн) § | Утилитам pg_basebackup и pg_receivewal не удавалось сопоставить вхождение в ~/.pgpass , для которого в поле имени БД содержалось значение replication , если не были указаны параметры -d или --dbname . Такое поведение приводило к непредвиденному запросу пароля |
Отображение ошибки в pg_combinebackup , если файл инкрементальной резервной копии находится в каталоге, где должна содержаться полная копия (Роберт Хаас) § | |
Запрет на создание имен файлов с двумя косыми чертами в pg_combinebackup (Роберт Хаас) § | Проблем в работе это не вызывало, однако в сообщениях об ошибках дублировались косые черты, что могло сбивать с толку |
Предотвращение попытки перестройки индексов временных таблиц, индексов в vacuumdb и при параллельной перестройке индексов с помощью reindexdb (Вайбхав С, Микаэль Пакье, Фудзии Масао, Натан Боссарт) § § § | Перестройка индексов временных таблиц других сеансов невозможна, но проверка на пропуск отсутствовала в некоторых местах кода, что вело к нежелательным сбоям |
Исправление некорректного кода, генерируемого LLVM, на платформах ARM64 (Томас Манро, Антонин Боннефой) § | При использовании JIT-компиляции на платформах ARM генерируемый код не поддерживал расстояния перемещения больше 32 бит, из-за чего он мог размещаться неудачно и вызывать сбои сервера в системах с большим объемом памяти |
Исправление нескольких случаев, в которых допускалось, что время начала процесса (представленное time_t ) уместится в значение типа long (Макс Джонсон, Натан Боссарт) § | На платформах, где тип long вмещает 32 бита (особенно на Windows), после 2038 года произойдет сбой. В основном он проявит себя косметически, но в особенности зависнет команда pg_ctl start |
Обновление данных часовых поясов до версии tzdata 2024b (Том Лейн) § § | В этом выпуске tzdata изменяются старые имена часовых поясов, совместимые с System V, теперь они дублируют соответствующие географические зоны. Например, PST8PDT теперь является псевдонимом для America/Los_Angeles . Единственное видимое последствие заключается в том, что для временных отметок до введения стандартизированных часовых поясов часовой пояс будет означать среднее солнечное время для заданного места. Например, в PST8PDT ввод с типом данных timestamptz , такой как 1801-01-01 00:00 , раньше отображался как 1801-01-01 00:00:00-08 , а теперь — как 1801-01-01 00:00:00-07:52:58 . Кроме того, выполнены корректировки исторических данных для Мексики, Монголии и Португалии. Часовой пояс Asia/Choibalsan теперь является псевдонимом для Asia/Ulaanbaatar , а не отдельным часовым поясом, в основном потому что разница между ними, как оказалось, основана на недостоверных данных. |
Изменения в версии 17.2
Изменение | Описание |
Устранение сбоя ABI для расширений, работающих со структурой ResultRelInfo (Том Лейн) § | Предыдущие корректирующие выпуски непреднамеренно нарушили бинарную совместимость с timescaledb и несколькими другими расширениями. Восстановите затронутую структуру до ее предыдущего размера, чтобы такие расширения не пришлось перестраивать |
Восстановление функциональности команды ALTER {ROLE|DATABASE} SET role (Том Лейн, Ной Миш) § | Исправление для CVE-2024-10978 случайно привело к тому, что параметры для role не применялись, если поступали из неинтерактивных источников, включая предыдущие команды ALTER {ROLE|DATABASE} и переменную среды PGOPTIONS |
Устранение случаев, в которых значение restart_lsn слота логической репликации могло уменьшаться (Масахико Савада) § | Ранее перезапуск логической репликации иногда мог приводить к повторному вычислению точки перезапуска слота как более старого значения, чем было объявлено ранее в pg_replication_slots . Из-за этого файлы WAL могли быть удалены на основе более позднего значения restart_lsn , и в этом случае репликация не могла перезапуститься |
Предотвращение удаления нужных файлов WAL во время выполнения pg_rewind (Полина Бунгина, Александр Кукушкин) § | Раньше в некоторых случаях утилита pg_rewind могла удалить важные файлы WAL из восстановленного пониженного ведущего узла. В частности, это происходило, если эти файлы были помечены для архивации (то есть для них были созданы файлы .ready ), но еще не были заархивированы. Затем эти файлы перерабатывались и не появлялись на повышенном узле, но они могли понадобиться для восстановления на пониженном узле. Если pg_rewind удаляла их, восстановление было уже невозможно |
Устранение условий гонки, связанных с удалением записей общих статистик (Кетаро Хоригути, Микаэль Пакье) § | Эти условия могли приводить к потере статистических данных, сбоям проверочных утверждений или ошибкам вида «can only drop stats once» (статистику можно удалить только один раз) |
Подсчет количества сканирований индексов contrib/bloom в представлениях статистики, таких как счетчик pg_stat_user_indexes.idx_scan (Масахиро Икеда) § | |
Устранение сбоя при проверке изменений параметров классов операторов индекса (Александр Коротков) § | Некоторые формы ALTER TABLE завершались ошибкой, если у таблицы был индекс с параметрами классов операторов, отличными от значений по умолчанию |
Предотвращение сбоев проверочных утверждений, вызванных отключенными подграфами NFA при разборе регулярных выражений (Том Лейн) § | Эта ошибка не имела видимых последствий в сборках без проверочных утверждений |
Изменения в версии 17.3
Изменение | Описание |
Усиление PQescapeString и родственных функций для защиты от некорректно закодированных входных строк (Андрес Фройнд, Ной Миш) § § § § § § | Функции с обработкой экранирования, предоставляемые libpq, теперь полностью проверяют допустимость кодировки входных данных. При обнаружении недопустимых символов выдается ошибка, если это возможно. Для функций, не возвращающих ошибки, выходная строка корректируется, чтобы гарантировать, что сервер распознает недопустимую кодировку, и при промежуточной обработке ошибочный байт не будут принят за одинарную кавычку, обратную косую черту и так далее Цель этого изменения — защита от возможных атак методом SQL-инъекций, если одна из этих функций используется для экранирования специально сконструированного входного значения. Если полученная строка отправляется напрямую на сервер PostgreSQL (который в любом случае проверит ее кодировку), опасности нет. Однако риск возникает, если строка проходит через psql или другой код на стороне клиента. Ранее такой код не проверял кодировку достаточно тщательно, и во многих случаях оставалось неясно, как следовало бы реагировать на обнаруженные ошибки. Это исправление эффективно только в том случае, если функция с обработкой экранирования, сервер и любые промежуточные процессы используют одну и ту же кодировку. Особенно важно следить за использованием одной кодировки приложениям, которые вставляют недоверенные входные данные в SQL-запросы. Приложения и драйверы, экранирующие недоверенные входные данные без использования функций libpq, могут столкнуться с подобными проблемами. Сначала им следует проверять, что входные данные соответствуют ожидаемой сервером кодировке. Проект PostgreSQL благодарит Стивена Фьюэра за сообщение об этой проблеме. (CVE-2025-1094) |
Восстановление автоматического усечения имен баз данных и пользователей в запросах на подключение (Натан Боссарт) § | Это отменяет изменение версии 17, которое вызывало проблемы у некоторых пользователей. Имена, превышающие допустимую длину, должны усекаться с учетом кодировки, но на данный момент было возвращено прежнее поведение слепого усечения на NAMEDATALEN-1 байт |
Исключение параллельных рабочих процессов из проверок и ограничений прав подключения (Том Лейн) § | Теперь при запуске параллельного рабочего процесса не проверяются привилегии datalowconn , rolcanlogin и ACL_CONNECT . Предполагается, что достаточно ведущему процессу пройти аналогичные проверки. Это позволяет избежать, например, неожиданных завершений параллельных запросов с ошибкой, если ведущий процесс выполнялся от имени роли без права входа. Кроме того, ограничения ReservedConnections , datconnlimit и rolconnlimit теперь применяются только к обычным обслуживающим процессам, и только они учитываются при подсчете количества подключений. Эти ограничения предназначены для предотвращения чрезмерного потребления слотов подключений для обычных процессов, но у параллельных рабочих процессов и других специальных процессов есть собственные пулы слотов с собственными проверками ограничений |
Удаление суффикса «Lock» из имен событий ожидания LWLock (Бертран Друво) § | В результате реорганизации кода имена событий, связанных с блокировкой, непреднамеренно стали отображаться в представлении pg_stat_activity с суффиксом «Lock», что, помимо прочего, привело к проблемам при соединении с pg_wait_events |
Устранение возможной ошибки при сканировании индекса B-tree с условием ScalarArrayOp (= ANY ), при которой возвращались не все соответствующие условию кортежи (Питер Гейган) § | |
Исправление возможной проблемы с повторным использованием устаревших результатов в оконных агрегатных функциях (Дэвид Роули) § | Оконная агрегатная функция с ограничивающим условием выполнения и результатом типа, передаваемого по ссылке, могла ошибочно возвращать результат из предыдущей секции вместо выполнения нового вычисления |
Поддержка синхронизации TransactionXmin с MyProc->xmin (Хейкки Линнакангас) § | Ранее процесс мог попытаться получить доступ к уже удаленным данным. Одним из известных последствий являлись временные ошибки типа «could not access status of transaction» (не удалось получить состояние транзакции) |
Устранение условий гонки, которые могли привести к ошибке при добавлении новой записи каталога в список кеша каталога (Хейкки Линнакангас) § | Это могло приводить, например, к тому, что в текущем сеансе не могла использоваться только что созданная функция |
Предотвращение возможного повреждения каталога при очистке системного каталога одновременно с его изменением (Ной Миш) § § | |
Устранение повреждения данных при возникновении ошибки во время усечения отношений (Томас Манро) § § § | Файловые операции, необходимые для усечения отношений, могли завершиться ошибкой, оставив несогласованное состояние на диске (например, фактически восстанавливая удаленные данные). Это невозможно предотвратить полностью, но теперь ошибки такого рода получили уровень PANIC , так что после их появления можно запустить восстановление согласованности данных путем повторного воспроизведения WAL до момента, непосредственно предшествующего попытке усечения. Это не лучшее решение, но такие ошибки возникают достаточно редко, чтобы считать такой подход приемлемым |
Предотвращение запуска контрольных точек во время усечения отношений (Роберт Хаас) § | Это позволяет избежать условий гонки, при которых измененный файл мог не сохраниться на диске до завершения контрольной точки, что создавало риск повреждения данных, если вскоре после этого происходил сбой операционной системы |
Исключение возможной потери изменений pg_database.datfrozenxid в случае выполнения VACUUM одновременно с командой REASSIGN OWNED , которая изменяет владельца этой базы данных (Кирилл Решке) § | |
Исправление передачи некорректных значений tg_updatedcols триггерам AFTER UPDATE (Том Лейн) § | В некоторых случаях битовая карта tg_updatedcols могла описывать набор столбцов, измененных предшествующей командой в той же транзакции, что заставляло неверно срабатывать триггер. Кроме того, предотвращено увеличение используемого объема памяти, вызванное созданием слишком большого количества копий битовой карты tg_updatedcols |
Исключение отсоединения секции, если у нее есть собственное ограничение внешнего ключа, ссылающееся на секционированную таблицу (Амул Сул) § | В обычных случаях внешние ключи определяются на верхнем уровне секционированной таблицы. Ранее, если один из ключей определялся на уровне секции и ссылался на секционированную таблицу, при отсоединении такой секции соответствующие записи pg_constraint изменялись некорректно. Это приводило к ошибкам вида «could not find ON INSERT check triggers of foreign key constraint» (не удалось найти триггеры проверки ON INSERT ограничения внешнего ключа) |
Исправление функции pg_get_constraintdef для корректной поддержки ограничений NOT NULL доменов (Альваро Эррера) § | |
Исправление обработки кодов формата FFn функцией to_timestamp (Том Лейн) § | Ранее, если непосредственно перед FFn находился код целочисленного формата, могли использоваться все доступные цифры, оставляя FFn без значений |
Реализация проверки заключения имен переменных в двойные кавычки при разборе предложения PASSING в функции запроса SQL/JSON (Дин Рашид) § | |
Реализация проверки заключения имен пространств имен XML в двойные кавычки при разборе выражения XMLTABLE() (Дин Рашид) § | |
Добавление параметра ldapscheme в вывод функции pg_hba_file_rules() (Лауренц Альбе) § § | |
Исправление планирования предварительно отсортированных операций UNION в случаях, когда не все типы данных входных столбцов совпадают (Дэвид Роули) § | Эта ошибка могла приводить к сортировке данных с использованием неправильного оператора сортировки, что могло иметь различные последствия: от отсутствия видимых проблем до аварийных сбоев |
Исключение объединения операций UNION , если их правила сортировки столбцов не согласованы (Том Лейн) § | Ранее правила сортировки игнорировались при принятии решения о том, безопасно ли объединять шаги UNION в одну многократную операцию UNION . Это могло быть допустимо до введения недетерминированных правил сортировки, но теперь ситуация изменилась, поскольку используемая сортировка может влиять на определение уникальности |
Предотвращение ошибок планировщика вида «wrong varnullingrels» (неправильные varnullingrel) после «подтягивания» подзапроса, который находится под внешним соединением (Том Лейн) § § | |
Игнорирование маркировки отношений для обнуления при поиске статистики (Ричард Гуо) § | Это упущение могло приводить к невозможности использования соответствующей статистики по выражениям или к ошибкам вида «corrupt MVNDistinct entry» (поврежденная запись MVNDistinct) |
Исправление обработки пропущенных выражений в логике отсечения секций (Том Лейн) § | Это упущение могло приводить к ошибкам вида «unrecognized node type» (нераспознанный тип узла) и потенциально к другим проблемам при выполнении запросов к секционированным таблицам |
Выделение собственного слота для рабочего процесса slotsync (Том Лейн, Хоу Чжицзе) § | Это было упущено при добавлении рабочего процесса slotsync , в результате чего слот фактически выделялся из пула, предназначенного для обычных внутренних процессов, что в свою очередь могло привести к сбою запуска рабочего процесса или к последующим сбоям запросов на подключение, которые должны были успешно выполняться в соответствии с настроенными параметрами, если количество обычных внутренних процессов приближалось к max_connections |
Снятие ограничения размера таблиц dshash в 1 ГБ (Маттиас ван де Меент) § | Это позволяет избежать ошибок типа «invalid DSA memory alloc request size» (недопустимый запрошенный размер разделяемой памяти DSA). Такая ситуация могла возникнуть, например, в транзакциях, обрабатывающих несколько миллионов таблиц |
Предотвращение возможного целочисленного переполнения в функции bringetbitmap() (Джеймс Хантер, Евгений Горбанев) § | Поскольку результат используется только в статистических целях, последствия этой ошибки были в основном косметическими |
Исправление вычисления количества сегментов SLRU (Юрий Соколов) § | Ошибка приводила к использованию меньшего количества сегментов, чем предполагалось, что увеличивало конкуренцию, но не вызывало функциональные сбои |
Исключение поведения, при котором уже установленная блокировка процесса мешала процессу postmaster обрабатывать события сокета (Томас Манро) § | Чрезвычайно большая нагрузка на серверы, запускающие и завершающие работу процессов, могла помешать процессу postmaster своевременно реагировать на входящие клиентские подключения |
Предотвращение зацикливания резервных серверов потоковой репликации при чтении записей WAL, переходящих на другую страницу (Кетаро Хоригути, Александр Кукушкин) § | Это могло произойти, если запись продолжалась на странице, которую необходимо было прочитать из другого источника WAL |
Устранение непреднамеренного повышения уровня ошибок FATAL до PANIC в начале запуска процессов (Ной Миш) § | Это исключает некоторые маловероятные случаи, которые могли привести к ошибкам вида «PANIC : proc_exit() called in child process» (PANIC : в дочернем процессе вызван proc_exit() ) |
Исключение случаев, в которых оператор семейства операторов или опорная процедура могли стать недействительными (Том Лейн) § § | В некоторых случаях тип данных мог быть удален, а ссылки на его OID по-прежнему оставались в pg_amop или pg_amproc . Это могло приводить к проблемам в будущем, так как попытка удалить владеющее оператором семейство завершалась ошибкой, и pg_dump генерировал некорректный вывод при выгрузке семейства операторов. В указанном исправлении при создании и изменении семейств/классов операторов добавляются необходимые зависимости, так что при удалении типа данных также удаляются любые зависимые элементы семейства операторов. Однако на уже существующие семейства операторов это исправление не распространяется, поэтому в DROP OPERATOR FAMILY также было добавлено временное решение, чтобы предотвратить сбой при удалении семейства, в котором есть недействительные члены |
Устранение множественных утечек памяти в выводе логического декодирования (Вигнеш Си, Масахико Савада, Боюй Янг) § § § | |
Устранение небольшой утечки памяти при изменении параметра application_name или cluster_name (Тофиг Алиев) § | |
Предотвращение сбоя в случаях, когда фоновый процесс пытается проверить новое значение synchronized_standby_slots (Альваро Эррера) § | |
Предотвращение целочисленного переполнения при проверке условия wal_skip_threshold (Том Лейн) § | Транзакция, которая создавала очень большое отношение, могла по ошибке решить обеспечить надежность путем копирования отношения в WAL вместо того, чтобы синхронизировать его с помощью fsync , тем самым лишая смысла wal_skip_threshold . Это имеет значение только в случае, когда для wal_level установлено значение minimal , в противном случае все равно требуется копия WAL |
Исключение небезопасного порядка операций во время поиска в кеше (Ной Миш) § | Единственным известным последствием такого порядка было обычно безобидное предупреждение «you don't own a lock of type ExclusiveLock» (нет блокировки типа ExclusiveLock ) при вызове команды GRANT TABLESPACE |
Предотвращение потенциального использования освобожденной памяти при параллельной очистке (Валлимахараджан Г, Джон Нейлор) § | Эта ошибка не имела последствий в стандартных сборках, но теоретически представляла опасность |
Устранение возможных ошибок вида «failed to resolve name» (не удалось разрешить имя) при использовании JIT на старых платформах ARM (Томас Манро) § | Они могли появляться из-за несоответствия значения по умолчанию для -moutline-atomics между компиляторами gcc и clang. В Debian и Ubuntu поставляются компиляторы gcc и clang, ориентированные на armv8-a, но обработка атомарных операций по умолчанию различается |
Устранение сбоев проверочных утверждений в запросах WITH RECURSIVE ... UNION (Дэвид Роули) § | |
Предотвращение сбоев проверочных утверждений при разборе правил в случаях, когда конечный запрос содержит операции с множествами (Ман Цзэн, Том Лейн) § | |
Предотвращение сбоев проверочных утверждений в особых случаях при запуске параллельных запросов (Том Лейн) § | |
Устранение сбоев проверочных утверждений во время завершения работы при записи файла статистики (Микаэль Пакье) § | |
Устранение предупреждений valgrind, связанных с кодом хеширования строк (Джон Нейлор) § | |
Предотвращение в функции NULLIF() передачи указателя на развернутый объект для чтения и записи в функцию равенства для типа данных (Том Лейн) § | Если функция равенства изменяла или удаляла объект, для которого передан указатель на чтение-запись, могли возникать ошибки, если функция NULLIF() возвращала этот объект. Встроенные функции равенства не вызывали проблем, но в функциях на PL/pgSQL происходил сбой |
Обеспечение применения предварительной обработки выражения к значению по умолчанию NULL в INSERT (Том Лейн) § | Если целевой столбец типа домен, планировщик должен добавлять шаг приведения к типу домен, а не просто константу NULL . Ранее для этого выражения пропускались некоторые требуемые шаги обработки. Для доменов, основанных на встроенных типах данных, о последствиях не сообщалось, но теоретически могла возникнуть ошибка с доменами, основанными на типах из расширений |
Предотвращение потери данных при начале массовой записи в слой отношений, который уже содержит данные (Маттиас ван де Меент) § | Любые существующие данные обнулялись. В PostgreSQL это не представляло проблемы, но могло проявляться в некоторых расширениях |
Предотвращение сбоя в случаях, когда серверный процесс пытался выполнить перебор по общему префиксному дереву, которое он не создавал (Масахико Савада) § | В ядре PostgreSQL нет кода, вызывавшего такой сбой, однако он мог оказаться в расширениях |
Устранение утечек памяти в PL/Python (Мэт Арье, Том Лейн) § | Многократное использование PLyPlan.execute или plpy.cursor приводило к утечке памяти во время вызова функции PL/Python |
Исправление PL/Tcl для корректной компиляции с Tcl 9 (Питер Эйзентраут) § | |
Исключение в препроцессоре ecpg возможной некорректной обработки курсоров, ссылающихся на переменные вне текущей области (Том Лейн) § | |
Корректная выдача предупреждений в ecpg об отсутствии поддержки COPY ... FROM STDIN (Ре Канбаяши) § | Ранее предупреждение не выдавалось из-за опечатки |
Обеспечение корректной обработки имен путей к файлам, закодированных в SJIS, в psql (Том Лейн) § | У некоторых двухбайтовых символов в SJIS второй байт равнозначен обратному слешу в ASCII (``). Эти символы повреждались при нормализации имени пути, из-за чего файлы с такими символами в именах становились недоступны |
Добавление в psql дополнения табуляцией для COPY (MERGE INTO ) (Цзянь Хи) § | |
Исключение использования неправильной версии pqsignal() в pgbench и psql (Фудзии Масао, Том Лейн) § | Эта ошибка могла приводить к неправильному поведению при использовании параметра -T в pgbench или команды watch в psql из-за того, что прерванные системные вызовы не возобновлялись должным образом |
Исправление некорректного выполнения некоторых вложенных конструкций if в pgbench (Михаил Николаев) § | Команда if в не той (не выполнявшейся) ветви if ошибочно обрабатывалась так же, как elif |
Исправление возможного некорректного отображения сообщений о прогрессе выполнения во время инициализации таблицы в pgbench (Юси Огивара, Тацуо Исии, Фудзии Масао) § § | |
Повышение устойчивости pg_controldata к поврежденным файлам pg_control (Ян Ильясов, Антон Волошин) § | Поскольку pg_controldata пытается выводить содержимое pg_control , даже если не пройдена проверка CRC, должно быть предусмотрено корректное поведение при недопустимых значениях полей. Это исправление исключает некоторые проблемы, вызываемые недопустимыми метками времени и отрицательными размерами сегментов WAL |
Устранение возможного сбоя в pg_dump из-за последовательностей идентификаторов, которые связаны с таблицами, принадлежащими расширениям (Том Лейн) § | |
Устранение утечки памяти в pg_restore при работе с данными, сжатыми с использованием zstd (Том Лейн) § | Утечка происходила во время каждой операции распаковки, поэтому она была наиболее заметна в выгрузках, содержащих много таблиц или больших объектов |
Исправление pg_basebackup для корректной обработки файлов pg_wal.tar , размер которых превышает 2 ГБ в Windows (Давиндер Сингх, Томас Манро) § | |
Использование соответствующих SQL-стандарту тел функций в объявлениях SQL-функций расширения contrib/earthdistance (Том Лейн, Ронан Данклау) § | Это изменение позволяет разрешать ссылки на contrib/cube во время создания расширения, что снижает риск связанных с путями поиска сбоев и возможных атак. В частности, это восстанавливает удобство использования этих функций в контекстах сгенерированных столбцов, для которых PostgreSQL версии 17 ограничивает путь поиска по соображениям безопасности. Были получены сообщения о неудачных попытках обновления баз данных до версии 17 из-за этой проблемы. Это исправление было включено в версию 16 для предоставления обходного решения: предварительное обновление расширения earthdistance до этой версии должно позволить успешно выполнить обновление. |
Обнаружение несоответствия версий между SQL-объявлениями contrib/pageinspect и соответствующей общей библиотекой (Томаш Вондра) § | Ранее такое несоответствие могло привести к сбою при вызове brin_page_items() . Теперь вместо этого выдается ошибка с рекомендацией обновить расширение |
Многократное повторение запроса на отмену удаленного запроса в contrib/postgres_fdw , если первый запрос мог выполниться неуспешно (Том Лейн) § | Это изменение устраняет условия гонки, при которых попытка отменить только что отправленный запрос происходила до того, как удаленный сервер начинал его обработку, в результате чего первоначальный запрос на отмену игнорировался |
Изменение проверок конфигурации, определяющих переключатели компилятора, необходимые для доступа к инструкциям ARM CRC (Том Лейн) § | На платформах ARM, где базовый процессор не поддерживает инструкции CRC, необходимо использовать переключатель -march , чтобы заставить компилятор скомпилировать такие инструкции. В последних версиях gcc отклоняет ранее используемое значение, что приводило к возврату к программному CRC без уведомления об этом |
Исправление системы сборки meson для поддержки старых библиотек OpenSSL в Windows (Дарек Слюсарчик) § | Добавление поддержки имен устаревших библиотек ssleay32 и libeay32 |
Обеспечение экспорта всех функций libcommon и libpgport в сборках Windows с использованием meson (Владлен Пополитов, Хейкки Линнакангас) § § | Это исправляет ошибки сборки вида «unresolved external symbol» (неразрешенный внешний символ) для расширений |
Исправление процесса конфигурации meson для корректного определения заголовочного файла OSSP uuid.h в MSVC (Эндрю Дунстан) § | |
Установка pgevent в pkglibdir , а не в bindir при сборке с помощью meson (Питер Эйзентраут) § | Это соответствует поведению системы сборки на основе make и старой системы сборки MSVC |
Установка sepgsql.sql в share/contrib/ , а не в share/extension/ при сборке с помощью meson (Питер Эйзентраут) § | Это соответствует поведению системы сборки на основе make |
Обновление данных часовых поясов до версии tzdata 2025a, включающее изменение правил перехода на летнее время в Парагвае, а также корректировку исторических данных для Филиппин (Том Лейн) § |
Изменения в версии 17.4
Изменение | Описание |
Улучшение поведения функций с обработкой экранирования libpq (Андрес Фройнд, Том Лейн) § § § | Изменения, внесенные для CVE-2025-1094, имели одно серьезное упущение: функции PQescapeLiteral() и PQescapeIdentifier() не учитывали параметр длины строк и вместо этого всегда выполняли чтение до завершающего нулевого символа входной строки. Это приводило к включению нежелательного текста в вывод при усечении строки вызывающим кодом через параметр длины, а в некоторых особенно неудачных случаях могло вызывать сбои из-за считывания за пределами памяти. Кроме того, все функции с обработкой экранирования были изменены так, чтобы при обнаружении недопустимой кодировки недопустимая последовательность заменялась только на первый байт предполагаемого символа, а не на весь символ. Это снижает риск возникновения проблем, если вызывающее приложение выполняет дополнительную обработку строки с экранированием |
Устранение небольшой утечки памяти в pg_createsubscriber (Ранье Вилела) § | |
Исправление системы сборки meson для корректного определения доступности системного заголовка bsd_auth.h (Назир Билал Явуз) § |
Изменения в версии 17.5
Изменение | Описание |
Исправление некорректной обработки приведений типов в ключах выражений конструкторов JSON (Амит Ланготе) § | |
Исправление ошибочных выводов об ограничениях столбцов NOT NULL при внешних соединениях (Ричард Гуо) § | В некоторых случаях планировщик отбрасывал условие запроса IS NOT NULL , хотя оно применялось после внешнего соединения и поэтому не являлось избыточным |
Недопущение некорректных оптимизаций на основе проверок IS [NOT] NULL , применяющихся к составным значениям (Брюс Момджян) § | |
Исправление некорректной оценки размера таблицы с низким фактором заполнения (Томаш Вондра) § | Когда планировщик оценивал количество строк в таблице, которая еще никогда не анализировалась, он учитывал значение фактора заполнения, но не гарантировал как минимум одну строку на страницу. Поэтому низкое значение фактора заполнения могло приводить к необоснованно низкой оценке |
Исправление обработки возможных изменений параметра io_combine_limit внутри запроса (Томас Манро) § | |
Исправление чрезмерного выделения памяти для структур SpecialJoinInfo на этапе планирования запроса (Ричард Гуо) § | Это приводило к сбоям во время планирования запроса при включенной возможности соединения таблиц с учетом секционирования |
Устранение сбоя при логической репликации, если для секционированной таблицы подписчика создан индекс BRIN (Том Лейн) § | |
Исправление порядка операций в функции smgropen() (Андрес Фройнд) § | Теперь гарантируется, что перед вызовом обработчика smgr_open объект SMgrRelation полностью инициализирован. Так он может быть корректно очищен, если при вызове обработчика возникнет сбой |
Предотвращение сбоя проверочного утверждения во время параллельной очистки, если для параметра конфигурации maintenance_work_mem установлено очень небольшое значение (Масахико Савада) § | |
Исправление планирования параллельного перестроения индексов утилитой reindexdb (Александр Коротков) § | Предыдущая реализация не позволяла достичь ожидаемого уровня параллельности |
Запрет подтягивать условия ограничений из подзапросов в модуле contrib/postgres_fdw (Александр Пыхалов) § | Это исправление позволяет предотвратить возникавшую в редких случаях ошибку «unexpected expression in subquery output» (непредвиденное выражение в результате подзапроса) |
Исправление ошибки сборки, возникавшей при наличии старой версии файла libpq_fe.h в системных каталогах include (Том Лейн) § | |
Исправление маркировки данных отдельных буферов потоков чтения для Valgrind (Томас Манро) § | Это исправление не влияет на код ядра выпущенных версий PostgreSQL, однако расширения, использующие данные отдельных буферов, могли сталкиваться с ложными ошибками во время тестирования под Valgrind |
Устранение предупреждений Valgrind, связанных с кодом хеширования строк (Джон Нейлор) § |