E.37. Выпуск 12.17

Дата выпуска: 2023-11-09

В этот выпуск вошли различные исправления, внесённые после версии 12.16. За информацией о нововведениях версии 12 обратитесь к Разделу E.54.

E.37.1. Миграция на версию 12.17

Если используется версия 12.X, выгрузка/восстановление базы не требуется.

Однако если вы используете индексы BRIN, может быть целесообразно их перестроить; прочитайте четвёртую запись в списке изменений.

Если вы обновляете сервер с более ранней версии, чем 12.16, см. также Раздел E.38.

E.37.2. Изменения

  • Исправление обработки аргументов неизвестного типа в агрегатных функциях DISTINCT "any" (Том Лейн). §

    Эта ошибка приводила к тому, что значение типа text интерпретировалось как значение типа unknown (то есть строка, завершающаяся нулевым символом), при этом во время выполнения могло раскрываться содержимое памяти сервера после значения text.

    Проект PostgreSQL благодарит Цзинчжоу Фу за сообщение об этой проблеме. (CVE-2023-5868)

  • Выявление целочисленного переполнения при вычислении новых размерностей массива (Том Лейн)

    При назначении новых элементов индексам массива, которые находятся за пределами границ текущего массива, в особых случаях могло происходить необнаруживаемое целочисленное переполнение. Потенциально были возможны манипуляции с памятью для выполнения произвольного кода, а также раскрытие содержимого памяти сервера.

    Проект PostgreSQL благодарит Педро Гальегоса за сообщение об этой проблеме. (CVE-2023-5869)

  • Запрет для роли pg_signal_backend отправлять сигналы обслуживающим процессам и процессам автоочистки (Ной Миш, Йелте Феннема-Нио) § §

    В документации сказано, что роль pg_signal_backend не может отправлять сигналы процессам, принадлежащим суперпользователям. Однако она могла отправлять сигналы обслуживающим процессам, поскольку OID роли у них равен нулю. Теперь такой OID считается указанием принадлежности суперпользователю. Отмена одного из этих типов процессов почти никак не влияет на безопасность с точки зрения основного кода (сразу запускается новый), но обслуживающие процессы расширений могли быть уязвимы.

    Также теперь гарантируется, что в таких процессах корректно задан параметр is_superuser. Конкретных примеров влияния этого упущения на безопасность не обнаружено, но для некоторых расширений оно могло оказаться существенным.

    Проект PostgreSQL благодарит Хеманта Сандрану и Махендракара Шринивасарао за сообщение об этой проблеме. (CVE-2023-5870)

  • Устранение некорректного поведения при рекурсивном разделении страницы в процессе построения индекса GiST (Хейкки Линнакангас) §

    Устранены случаи, когда положение ссылки вниз на странице отслеживалось неправильно, с помощью введения некоторой логики, позволяющей исправлять такие ошибки, а не продолжать работу, игнорируя их. Устранённая проблема могла приводить к неверным результатам при последующих поисках по индексу. После установки данного обновления может оказаться целесообразным перестроить все индексы GiST.

  • Исправление поэтапного создания секций и отсечения секций во время выполнения для таблиц, секционированных по хешу с несколькими ключами секционирования (Дэвид Роули) § §

    В некоторых случаях, связанных с условием IS NULL для одного из ключей секционирования, мог происходить сбой.

  • Исправление позиции индекса-B-дерева для предложений ScalarArrayOpExpr в особых случаях при обработке пометки/восстановления (Питер Гейган) §

    При восстановлении сканирования индекса с ранее помеченной позицией в коде могли пропускаться необходимые шаги настройки, если сканирование продвинулось точно до конца совпадений для предложения ScalarArrayOpExpr (то есть indexcol = ANY(ARRAY[])). Это могло приводить к потере некоторых строк, которые должны были быть включены в выборку при сканировании.

  • Устранение утечки памяти внутри запроса, когда функция, возвращающая множество, неоднократно не возвращала ни одной строки (Том Лейн) §

  • Устранение сбоя при применении функции cursor_to_xmlschema() к порталу, не возвращающему данные (Боюй Ян) §

  • Вывод корректного сообщения об ошибке, если pgrowlocks() применяется к секционированной таблице (Дэвид Роули) §

    Ранее выводилось неточное сообщение об ошибке «only heap AM is supported» (поддерживается только AM в куче).

  • Более корректная обработка нерабочих индексов специальными SQL-функциями (Ной Миш)

    Если одна из функций pgstatindex(), pgstatginindex(), pgstatashindex() или pgstattuple() применяется к нерабочему индексу, в журнал теперь выводится сообщение об ошибке. Если одна из функций brin_desummarize_range(), brin_summarize_new_values(), brin_summarize_range() или gin_clean_pending_list() применяется к нерабочему индексу, сообщение вносится в журнал в зависимости от уровня отладки. Раньше эти функции пытались обработать индекс и демонстрировали странное поведение в зависимости от результатов невыполненной команды CREATE INDEX.

  • Предотвращение сбоя из-за преждевременного выделения памяти при длинных входных данных в функции to_tsvector() (Том Лейн) §

  • Исключение выделения лишнего пространства на диске для созданного tsvector в функции tsvectorrecv() (Денис Ерохин) §

    Если входящий вектор включает данные о местоположении, в результате выполнения двоичной функции приёма использовалось лишнее пространство (примерно равное размеру данных о положении) в готовом tsvector. В особых случаях это могло приводить к сбою из-за ошибки «maximum total lexeme length exceeded» (превышена максимальная общая длина лексемы) для векторов, длина которых на момент создания была ниже ограничения. В любом случае это могло приводить к потере места на диске.

  • Исправление некорректного кода в функции gtsvector_picksplit() (Александр Лахин) §

    Ранее могли приниматься некорректные решения о разделении страниц в индексах GiST по столбцам tsvector.

  • Исправление работы команд COMMIT AND CHAIN/ROLLBACK AND CHAIN при наличии неосвобождённой точки сохранения (Лю Сян, Том Лейн) §

    Вместо свойств текущей транзакции ранее эти команды распространяли на новую транзакцию некоторые свойства предыдущей транзакции.

  • Предотвращение сбоя команды EXPLAIN в случаях, если параметр, помеченный как отображаемый в EXPLAIN, имеет значение NULL при старте системы (Син Го, Александр Алексеев, Том Лейн) §

    Ни один встроенный параметр не соответствует этому описанию, но такие параметры могут определяться в расширениях.

  • Обеспечение существования снимка при удалении временных таблиц условием ON COMMIT DROP (Том Лейн) §

    Это исправление предотвращает возможное неправильное поведение в случаях, когда какие-либо записи каталога для временных таблиц имеют достаточно длинные поля, требующие применения TOAST (например, очень сложное условие CHECK).

  • Предотвращение неправильной реакции дочерних процессов, только что созданных функцией system(), на сигналы завершения работы (Натан Боссарт) § §

    Это исправление позволяет избежать условий гонки, при которых дочерний процесс, выделенный функцией system(), но ещё не выполнивший намеченную дочернюю программу, может получить сигнал, предназначенный для процесса родительского сервера и завершить работу. Получение такого сигнала приводило к выполнению дублирующихся действий по очистке.

  • Устранение разрывов чтения pg_control в клиентских программах (Томас Манро) §

    В некоторых файловых системах чтение pg_control может не быть атомарным действием при одновременной записи этого файла сервером. Этот случай можно обнаружить по неверной контрольной сумме (CRC). Теперь попытка чтения повторяется несколько раз, чтобы проверить, станет ли файл допустимым, прежде чем выводится сообщение об ошибке.

  • Предотвращение разрывов чтения pg_control в соответствующих SQL-функциях (Томас Манро) §

    Перед чтением pg_control получается соответствующая блокировка для обеспечения согласованного представления этого файла.

  • Предотвращение целочисленного переполнения при вычислении размера массива строк активности обслуживающего процесса (Якуб Вартак) §

    На 64-разрядных машинах допускаются достаточно большие значения track_activity_query_size, чтобы вызвать 32-разрядное переполнение при умножении на разрешённое количество соединений. Однако в коде, фактически выделяющем локальный массив для каждого обслуживающего процесса, были упущения, и массив выделялся неправильно.

  • Отслеживание зависимостей кешированных операторов CALL и их перепланирование, если оно необходимо (Том Лейн) §

    Команды DDL, такие как замена функции, встроенной в аргумент CALL, могут вызвать необходимость перепланирования CALL, кешированного PL/pgSQL. Ранее перепланирование не выполнялось, что приводило к неправильному поведению или странным ошибкам, таким как «cache lookup failed» (не удалось выполнить поиск в кеше).

  • Правильное отслеживание глубины вложенности при проверке переменных типа RECORD на внешних уровнях запроса (Ричард Гуо) §

    Неправильное отслеживание могло приводить к сбоям проверочных утверждений, аварийным сбоям или ошибкам «bogus varno» (неприемлемое значение varno).

  • Предотвращение ошибки «record type has not been registered»(тип записи не зарегистрирован) при пересборке представления, содержащего ссылки на поля составных констант (Том Лейн) §

  • Возможность извлечения полей из выражения ROW() типа RECORD (Том Лейн) §

    Код SQL распознаёт названия полей f1, f2 и т. д. и может использовать эти имена для извлечения полей из выражения. Первоначально это изменение было внесено в версию 13 и теперь вносится в более старые ветки для поддержки тестов на наличие связанных с этим ошибок.

  • Исправление некорректной обработки ошибок в управлении кешем типа RECORD (Томас Манро) §

    Ошибка нехватки памяти, возникающая в неподходящее время, могла оставлять после себя несогласованное состояние, приводившее к зацикливанию.

  • Устранение сбоя проверочного утверждения при повторной попытке логического декодирования в том же сеансе после ошибки (Хоу Чжицзе) §

  • Обработка ошибок, связанных с нехваткой памяти при чтении WAL, как критических (Микаэль Пакье)

    Раньше они рассматривались как ошибки о неприемлемых данных, в результате чего делался вывод о достижении конца WAL, что было некорректно и могло приводить к несогласованному воспроизведению WAL.

  • Исправление возможного сбоя восстановления из-за попытки выделить память на основе неприемлемой длины записи WAL (Томас Манро, Микаэль Пакье) § §

  • Обеспечение сообщения об ошибке при обнаружении недопустимого заголовка страницы в случае восстановления WAL в режиме ожидания (Юго Нагата, Кётаро Хоригути) §

  • Предотвращение перепроверки кеша плана для служебных операторов, которые не требуют сложного разбора (Том Лейн) §

    Помимо экономии нескольких циклов, это улучшение предотвращает сбой после аннулирования кеша для операторов, которые не должны создавать снимок, таких как SET TRANSACTION ISOLATION LEVEL.

  • Сохранение передаваемых по ссылке значений attmissingval в долгосрочном контексте на время их использования (Эндрю Дунстан) §

    Это улучшение позволяет избежать возможного использования недействительных указателей, когда слот кортежа существует дольше дескриптора кортежа, с помощью которого было построено его значение.

  • Перерасчёт эффективного значения search_path после ALTER ROLE (Джефф Дэвис) § §

    Это улучшение гарантирует, что после переименования роли значение специальной строки $user будет переопределено.

  • Исправление порядка операций в GenericXLogFinish (Джефф Девис) §

    В коде были нарушены условия, необходимые для обеспечения безопасности данных при сбое, поскольку запись в WAL происходила перед тем, как изменённые буферы помечались как «грязные». В коде ядра эта функция не используется, но её используют расширения (например, contrib/bloom).

  • Удаление неверного проверочного утверждения при обработке исключений PL/Python (Александр Лахин) §

  • Исправление поведения утилиты pg_restore для включения в выборочное восстановление начальных прав доступа как на уровне таблицы, так и на уровне столбца для выбранных таблиц (Эйлер Тавейра, Том Лейн) §

    Ранее при наличии прав обоих уровней восстанавливались только права на уровне таблицы.

  • Добавление в программу pg_upgrade логики для проверки использования типов данных abstime, reltime и tinterval (Álvaro Herrera ) § §

    Эти устаревшие типы данных были удалены в PostgreSQL версии 12, поэтому добавлена проверка, чтобы убедиться в их отсутствии в старой базе данных перед выполнением её обновления.

  • Предотвращение создания недопустимых имён временных слотов в pg_basebackup (Йелте Феннема) §

    Проблема наблюдалась только при соединении с сервером через pgbouncer.

  • Предотвращение ложных ошибок «too many client connections» (слишком много клиентских подключений) при использовании программы pgbench в Windows (Ной Миш) §

  • Исключение сообщений о повреждении данных при прерванном удалении страницы в contrib/amcheck (Ной Миш) §

    Это исправление предотвращает выдачу несоответствующих сообщений об ошибках «the first child of leftmost target page is not leftmost of its level» (первый дочерний элемент крайней левой целевой страницы не является крайним левым на её уровне), «block NNNN is not leftmost» (блок NNNN не является крайним левым) или «left link/right link pair in index XXXX not in agreement» (пара левая ссылка/правая ссылка в индексе XXXX не согласуется). Эти сообщения появлялись, если модуль amcheck запускался после незавершённого удаления страницы индекса-B-дерева и до выполнения очистки VACUUM.

  • Исправление ошибки в индексах contrib/btree_gin по столбцам interval, проявлявшейся при сканировании индекса с использованием оператора < или <= (Дин Рашид)

    Ранее при таком сканировании выдавались не все элементы, которые должны были.

  • Добавление поддержки LLVM версий 16 и 17 (Томас Манро, Дмитрий Долгов) § § § §

  • Подавление различных предупреждений во время сборки в последней версии macOS (Том Лейн) § §

    В среде Xcode 15 (выпущенной вместе с macOS Sonoma) изменилось поведение компоновщика таким образом, что при сборке PostgreSQL появляется множество предупреждений о дублирующихся библиотеках. Они безвредны, но раздражают, поэтому повторное упоминание библиотек было удалено. Также исключено использование флага компоновщика -multiply_defined suppress, который долгое время не использовался и стал причиной множества жалоб пользователей.

  • Удаление PHOT (время на островах Феникс) из списка аббревиатур часовых поясов по умолчанию (Том Лейн) §

    Присутствие этой аббревиатуры в списке по умолчанию могло приводить к ошибкам в последних выпусках Debian и Ubuntu, поскольку в них больше не устанавливается базовая запись tzdb по умолчанию. Поскольку это аббревиатура для зоны с общим населением около двух десятков человек, от неё вполне можно отказаться. При необходимости её можно указать в пользовательском файле аббревиатур.

E.37. Release 12.17

Release date: 2023-11-09

This release contains a variety of fixes from 12.16. For information about new features in major release 12, see Section E.54.

E.37.1. Migration to Version 12.17

A dump/restore is not required for those running 12.X.

However, if you use GiST indexes, it may be advisable to reindex them; see the fourth changelog entry below.

Also, if you are upgrading from a version earlier than 12.16, see Section E.38.

E.37.2. Changes

  • Fix handling of unknown-type arguments in DISTINCT "any" aggregate functions (Tom Lane) §

    This error led to a text-type value being interpreted as an unknown-type value (that is, a zero-terminated string) at runtime. This could result in disclosure of server memory following the text value.

    The PostgreSQL Project thanks Jingzhou Fu for reporting this problem. (CVE-2023-5868)

  • Detect integer overflow while computing new array dimensions (Tom Lane) §

    When assigning new elements to array subscripts that are outside the current array bounds, an undetected integer overflow could occur in edge cases. Memory stomps that are potentially exploitable for arbitrary code execution are possible, and so is disclosure of server memory.

    The PostgreSQL Project thanks Pedro Gallegos for reporting this problem. (CVE-2023-5869)

  • Prevent the pg_signal_backend role from signalling background workers and autovacuum processes (Noah Misch, Jelte Fennema-Nio) § §

    The documentation says that pg_signal_backend cannot issue signals to superuser-owned processes. It was able to signal these background processes, though, because they advertise a role OID of zero. Treat that as indicating superuser ownership. The security implications of cancelling one of these process types are fairly small so far as the core code goes (we'll just start another one), but extensions might add background workers that are more vulnerable.

    Also ensure that the is_superuser parameter is set correctly in such processes. No specific security consequences are known for that oversight, but it might be significant for some extensions.

    The PostgreSQL Project thanks Hemanth Sandrana and Mahendrakar Srinivasarao for reporting this problem. (CVE-2023-5870)

  • Fix misbehavior during recursive page split in GiST index build (Heikki Linnakangas) §

    Fix a case where the location of a page downlink was incorrectly tracked, and introduce some logic to allow recovering from such situations rather than silently doing the wrong thing. This error could result in incorrect answers from subsequent index searches. It may be advisable to reindex all GiST indexes after installing this update.

  • Fix partition step generation and runtime partition pruning for hash-partitioned tables with multiple partition keys (David Rowley) § §

    Some cases involving an IS NULL condition on one of the partition keys could result in a crash.

  • Fix edge case in btree mark/restore processing of ScalarArrayOpExpr clauses (Peter Geoghegan) §

    When restoring an indexscan to a previously marked position, the code could miss required setup steps if the scan had advanced exactly to the end of the matches for a ScalarArrayOpExpr (that is, an indexcol = ANY(ARRAY[])) clause. This could result in missing some rows that should have been fetched.

  • Fix intra-query memory leak when a set-returning function repeatedly returns zero rows (Tom Lane) §

  • Don't crash if cursor_to_xmlschema() is applied to a non-data-returning Portal (Boyu Yang) §

  • Throw the intended error if pgrowlocks() is applied to a partitioned table (David Rowley) §

    Previously, a not-on-point complaint only heap AM is supported would be raised.

  • Handle invalid indexes more cleanly in assorted SQL functions (Noah Misch) §

    Report an error if pgstatindex(), pgstatginindex(), pgstathashindex(), or pgstattuple() is applied to an invalid index. If brin_desummarize_range(), brin_summarize_new_values(), brin_summarize_range(), or gin_clean_pending_list() is applied to an invalid index, do nothing except to report a debug-level message. Formerly these functions attempted to process the index, and might fail in strange ways depending on what the failed CREATE INDEX had left behind.

  • Avoid premature memory allocation failure with long inputs to to_tsvector() (Tom Lane) §

  • Fix over-allocation of the constructed tsvector in tsvectorrecv() (Denis Erokhin) §

    If the incoming vector includes position data, the binary receive function left wasted space (roughly equal to the size of the position data) in the finished tsvector. In extreme cases this could lead to maximum total lexeme length exceeded failures for vectors that were under the length limit when emitted. In any case it could lead to wasted space on-disk.

  • Fix incorrect coding in gtsvector_picksplit() (Alexander Lakhin) §

    This could lead to poor page-split decisions in GiST indexes on tsvector columns.

  • Fix COMMIT AND CHAIN/ROLLBACK AND CHAIN to work properly when there is an unreleased savepoint (Liu Xiang, Tom Lane) §

    Instead of propagating the current transaction's properties to the new transaction, they propagated some previous transaction's properties.

  • Avoid crash in EXPLAIN if a parameter marked to be displayed by EXPLAIN has a NULL boot-time value (Xing Guo, Aleksander Alekseev, Tom Lane) §

    No built-in parameter fits this description, but an extension could define such a parameter.

  • Ensure we have a snapshot while dropping ON COMMIT DROP temp tables (Tom Lane) §

    This prevents possible misbehavior if any catalog entries for the temp tables have fields wide enough to require toasting (such as a very complex CHECK condition).

  • Avoid improper response to shutdown signals in child processes just forked by system() (Nathan Bossart) § §

    This fix avoids a race condition in which a child process that has been forked off by system(), but hasn't yet exec'd the intended child program, might receive and act on a signal intended for the parent server process. That would lead to duplicate cleanup actions being performed, which will not end well.

  • Cope with torn reads of pg_control in frontend programs (Thomas Munro) §

    On some file systems, reading pg_control may not be an atomic action when the server concurrently writes that file. This is detectable via a bad CRC. Retry a few times to see if the file becomes valid before we report error.

  • Avoid torn reads of pg_control in relevant SQL functions (Thomas Munro) §

    Acquire the appropriate lock before reading pg_control, to ensure we get a consistent view of that file.

  • Avoid integer overflow when computing size of backend activity string array (Jakub Wartak) §

    On 64-bit machines we will allow values of track_activity_query_size large enough to cause 32-bit overflow when multiplied by the allowed number of connections. The code actually allocating the per-backend local array was careless about this though, and allocated the array incorrectly.

  • Track the dependencies of cached CALL statements, and re-plan them when needed (Tom Lane) §

    DDL commands, such as replacement of a function that has been inlined into a CALL argument, can create the need to re-plan a CALL that has been cached by PL/pgSQL. That was not happening, leading to misbehavior or strange errors such as cache lookup failed.

  • Track nesting depth correctly when inspecting RECORD-type Vars from outer query levels (Richard Guo) §

    This oversight could lead to assertion failures, core dumps, or bogus varno errors.

  • Avoid record type has not been registered failure when deparsing a view that contains references to fields of composite constants (Tom Lane) §

  • Allow extracting fields from a RECORD-type ROW() expression (Tom Lane) §

    SQL code that knows that we name such fields f1, f2, etc can use those names to extract fields from the expression. This change was originally made in version 13, and is now being back-patched into older branches to support tests for a related bug.

  • Fix error-handling bug in RECORD type cache management (Thomas Munro) §

    An out-of-memory error occurring at just the wrong point could leave behind inconsistent state that would lead to an infinite loop.

  • Fix assertion failure when logical decoding is retried in the same session after an error (Hou Zhijie) §

  • Treat out-of-memory failures as fatal while reading WAL (Michael Paquier) §

    Previously this would be treated as a bogus-data condition, leading to the conclusion that we'd reached the end of WAL, which is incorrect and could lead to inconsistent WAL replay.

  • Fix possible recovery failure due to trying to allocate memory based on a bogus WAL record length field (Thomas Munro, Michael Paquier) § §

  • Ensure that standby-mode WAL recovery reports an error when an invalid page header is found (Yugo Nagata, Kyotaro Horiguchi) §

  • Avoid doing plan cache revalidation of utility statements that do not receive interesting processing during parse analysis (Tom Lane) §

    Aside from saving a few cycles, this prevents failure after a cache invalidation for statements that must not set a snapshot, such as SET TRANSACTION ISOLATION LEVEL.

  • Keep by-reference attmissingval values in a long-lived context while they are being used (Andrew Dunstan) §

    This avoids possible use of dangling pointers when a tuple slot outlives the tuple descriptor with which its value was constructed.

  • Recalculate the effective value of search_path after ALTER ROLE (Jeff Davis) § §

    This ensures that after renaming a role, the meaning of the special string $user is re-determined.

  • Fix order of operations in GenericXLogFinish (Jeff Davis) §

    This code violated the conditions required for crash safety by writing WAL before marking changed buffers dirty. No core code uses this function, but extensions do (contrib/bloom does, for example).

  • Remove incorrect assertion in PL/Python exception handling (Alexander Lakhin) §

  • Fix pg_restore so that selective restores will include both table-level and column-level ACLs for selected tables (Euler Taveira, Tom Lane) §

    Formerly, only the table-level ACL would get restored if both types were present.

  • Add logic to pg_upgrade to check for use of abstime, reltime, and tinterval data types (Álvaro Herrera) § §

    These obsolete data types were removed in PostgreSQL version 12, so check to make sure they aren't present in an older database before claiming it can be upgraded.

  • Avoid generating invalid temporary slot names in pg_basebackup (Jelte Fennema) §

    This has only been seen to occur when the server connection runs through pgbouncer.

  • Avoid false too many client connections errors in pgbench on Windows (Noah Misch) §

  • In contrib/amcheck, do not report interrupted page deletion as corruption (Noah Misch) §

    This fix prevents false-positive reports of the first child of leftmost target page is not leftmost of its level, block NNNN is not leftmost or left link/right link pair in index XXXX not in agreement. They appeared if amcheck ran after an unfinished btree index page deletion and before VACUUM had cleaned things up.

  • Fix failure of contrib/btree_gin indexes on interval columns, when an indexscan using the < or <= operator is performed (Dean Rasheed) §

    Such an indexscan failed to return all the entries it should.

  • Add support for LLVM 16 and 17 (Thomas Munro, Dmitry Dolgov) § § § §

  • Suppress assorted build-time warnings on recent macOS (Tom Lane) § §

    Xcode 15 (released with macOS Sonoma) changed the linker's behavior in a way that causes many duplicate-library warnings while building PostgreSQL. These were harmless, but they're annoying so avoid citing the same libraries twice. Also remove use of the -multiply_defined suppress linker switch, which apparently has been a no-op for a long time, and is now actively complained of.

  • Remove PHOT (Phoenix Islands Time) from the default timezone abbreviations list (Tom Lane) §

    Presence of this abbreviation in the default list can cause failures on recent Debian and Ubuntu releases, as they no longer install the underlying tzdb entry by default. Since this is a made-up abbreviation for a zone with a total human population of about two dozen, it seems unlikely that anyone will miss it. If someone does, they can put it back via a custom abbreviations file.

FAQ