E.2. Выпуск 18.2 #
Дата выпуска: 2026-02-12
В этот выпуск вошли различные исправления, внесённые после версии 18.1. За информацией о нововведениях версии 18 обратитесь к Разделу E.4.
E.2.1. Миграция на версию 18.2 #
Если используется версия 18.X, выгрузка/восстановление базы не требуется.
Однако если вы используете индексы по столбцам типа ltree, возможно, их потребуется переиндексировать после обновления. Обратитесь к шестому пункту в списке изменений ниже.
E.2.2. Изменения #
Предотвращение некорректного поведения, вызванного нетипичной размерностью массивов типов
oidvector/int2vector(Том Лейн) §Ранее предполагалось, что массивы этих типов могут быть только одномерными и не могут содержать значений NULL. Однако с помощью некоторых способов приведения типов можно было создать массив, не соответствующий этим требованиям. Теперь в ряде функций, рассчитанных на работу с такими массивами, добавлены дополнительные проверки: при передаче несоответствующего массива они больше не работают некорректно.
Проект PostgreSQL благодарит Алтана Бирлера за сообщение об этой проблеме. (CVE-2026-2003)
Ужесточение правил добавления функций оценки избирательности в операторы, которые принимают неожиданные типы данных (Том Лейн) § §
Ранее одна из функций оценки избирательности модуля
contrib/intarrayмогла быть использована для выполнения произвольного кода, поскольку не проверяла тип входных данных. Теперь все такие функции сторонних расширений должны быть защищены проверками, как функции модуля intarray. Поскольку изменение механизмов защиты потребует времени, теперь для добавления невстроенных функций оценки избирательности в операторы требуются права суперпользователя.Проект PostgreSQL благодарит Даниэля Фирера, участника zeroday.cloud, за сообщение об этой проблеме. (CVE-2026-2004)
Устранение переполнения буфера при вызове функций обратного защитного преобразования на базе PGP модуля
contrib/pgcrypto(Микаэль Пакье) §Обратное защитное преобразование сообщения со слишком длинным сеансовым ключом вызывало переполнение буфера, что могло допустить выполнение произвольного кода.
Проект PostgreSQL благодарит команду Xint Code, участников zeroday.cloud, за сообщение об этой проблеме. (CVE-2026-2005)
Корректировка проверки длин многобайтных последовательностей (Томан Манро, Ной Миш) § § § § § §
Ранее из-за разнообразных ошибок злоумышленник мог отправить сконструированный SQL-запрос, вызывавший переполнение строковых буферов, что допускало выполнение произвольного кода. После исправления этих ошибок при обработке строковыми функциями некорректного текста, сохранённого в базе данных, теперь могут выводиться ошибки «invalid byte sequence for encoding» (неверная последовательность байт для кодировки).
Проект PostgreSQL благодарит Пауля Гесте и Морица Занфта, участников zeroday.cloud, за сообщение об этой проблеме. (CVE-2026-2006)
Улучшение защиты модуля
contrib/pg_trgmпри переводе строк в нижний регистр (Хейкки Линнакангас) § §Устранён риск переполнения буферов по причине того, что в некоторых локалях при переводе строки в нижний регистр может увеличиваться количество символов (не байтов). Это поведение появилось в версии 18, поэтому и ошибка наблюдается только в этой версии.
Проект PostgreSQL благодарит Хейкки Линнакангаса за сообщение об этой проблеме. (CVE-2026-2007)
Исправление непоследовательного регистронезависимого сопоставления модуля
contrib/ltree(Джефф Девис) § §Подпрограммы модуля
ltree, связанные с индексами, и первичные операторы использовали разные механизмы преобразования регистров. Поведение совпадало, только когда провайдером основного правила сортировки был libc и кодировка была однобайтовой.Теперь всегда используется преобразование регистра основного правила сортировки базы данных. Если провайдер правил сортировки базы данных не libc и кодировка не однобайтовая, потребуется перестроение индексов по столбцам
ltree(вне зависимости от индексного метода доступа). Без переиндексации результаты поиска по индексам будут нерелевантны.Проверка обязательного совпадения имён ограничений при добавлении именованного ограничения NOT NULL командой
ALTER TABLE ... ADD CONSTRAINTдля столбца, у которого уже есть ограничение NOT NULL (Альваро Эррера, Шринатх Редди Садипиралла) §Запрет на определение семантического уровня агрегатных функций вложенными подзапросами
SELECTс CTE (Том Лейн) §Это изменение отменяет изменение, внесённое два корректирующих выпуска назад. Теперь выводится ошибка, если вложенный подзапрос
SELECTссылается на общее табличное выражение (CTE), семантический уровень которого ниже уровня, назначаемого агрегатной функции по стандартным правилам SQL на основе содержащихся в ней узлов агрегирования и ссылок на столбцы. Внесённое ранее изменение привело к новым ошибкам, что затруднило поиск оптимального решения проблемы. Поскольку в агрегатных функциях вложенные подзапросыSELECTне допускаются по стандарту SQL, теперь в таких случаях выводится ошибка.Исправление механизма перехвата переходной таблицы триггером в случае, если в запросе с CTE содержится команда
MERGE(Дин Рашид) §Ранее при изменении данных через запросы с CTE, содержащими
MERGEи другую DML-операцию для таблицы c триггерамиAFTERна уровне оператора, переходные таблицы, перехватываемые триггерами, включали только строки, изменяемые другими операциями, но не строки, изменённые командойMERGE.Устранение некорректной очистки меток строк, принадлежащих элементам списка отношений, которые не являются отношениями, таким как подзапросы (Дин Рашид) §
Такая очистка приводила к некорректным результатам, если при предполагаемом изменении строки требовалась корректировка в ходе перепроверки EvalPlanQual в случае параллельного изменения этой строки.
Устранение сбоя при отсечении всех потомков секционированной таблицы, для которой выполняется изменение или удаление (Амит Ланготе) §
Ранее в таких случаях исполнитель мог выводить ошибки «could not find junk ctid column» (не удалось обнаружить отбросовый столбец ctid), даже когда никакие действия не требовались.
Исправление ошибки при вычислении выражения для вложенного
SELECTв рамках индекса массива (Андрес Фройнд) §Исправление ошибки текстового поиска по подстрокам при использовании недетерминированных правил сортировки (Лауренц Альбе) §
Ранее при использовании недетерминированного правила сортировки не удавалось обнаружить совпадение, если оно располагалось в самом конце строки.
Устранение риска сбоя в работе планировщика, когда в рамках запроса одна оконная функция вызывается несколько раз (Мэн Чжан, Дэвид Роули) §
Путаница при исключении дубликатов могла приводить к ошибкам вида «WindowFunc with winref 2 assigned to WindowAgg with winref 1» (WindowFunc с идентификатором winref 2 назначен WindowFunc с идентификатором winref 1).
Исправление ошибок планировщика при обработке функций, возвращающих множества, и наборов группирования (Ричард Гуо) §
При формировании узла плана ProjectSet планировщику не удавалось обнаружить, что подвыражения, включающие выражения группирования, уже были вычислены на предыдущем этапе планирования. Это приводило к созданию неэффективных планов или ошибкам, таким как «variable not found in subplan target list» (переменная не найдена в целевом списке подплана).
Недопущение некорректных оптимизаций, когда в группирующем предложении подзапроса содержится изменчивая функция или возвращающая множество функция (Ричард Гуо) §
Ранее планировщик стремился вынести ограничения запросов, в которых давались ссылки на группирующий столбец, в подзапросы. Это приводило к некорректному поведению из-за многократного вычисления изменчивой функции или ошибок, вызванных добавлением возвращающей множество функции в предложения
WHERE/HAVINGподзапроса.Пропуск переменных-местозаполнителей в ходе поиска статистических данных по выражению (Ричард Гуо) §
Это изменение позволяет планировщику, а получить все необходимые статистические данные по выражениям, протянутым из подзапросов или использованных в предложениях
GROUP BY, а не использовать стандартные методы оценки. (Чтобы в полученных статистических данных учитывалась увеличенная вероятность значения NULL, могут потребоваться корректировки, однако они не выполняются и для простых переменных.) Игнорирование переменных-местозаполнителей при сборе статистики было типичным поведением, но поскольку в PostgreSQL версии 18 такие переменные встречаются чаще, ограничение было снято, чтобы избежать регрессий планов.Пропуск переменных-местозаполнителей, не меняющих смысл выражений, при сопоставлении выражений с индексами (Ричард Гуо) §
Поскольку в PostgreSQL версии 18 переменные-местозаполнители используются чаще, чем в предыдущих, некоторые запросы с использованием индексов могли не работать. Изменение устраняет эти негативные последствия.
Исправление преобразования предложений
ORв условия индексов ScalarArrayOp планировщиком (Тендер Ван, Том Лейн) §Ранее узлы RelabelType обрабатывались неверно, что могло приводить к созданию некорректных выражений или ошибкам в преобразовании.
Обеспечение сканирования частичных хешированных индексов, даже когда в предикате индекса подразумевается истинность условия WHERE (Том Лейн) §
Как правило, предложение WHERE, подразумеваемое в предикате, игнорируется, так как проверять такое предложение бессмысленно — оно истинно для всех элементов индекса. Однако если индекс требовал наличия предложения WHERE для ведущего ключа индекса, как например, в хеш-индексах, построить план сканирования было невозможно. Теперь при сканировании таких индексов подразумеваемые предложения не игнорируются.
Запрет на выдачу записи WAL для нежурналируемых индексов BRIN (Кирилл Решке) §
В редких случаях для индекса BRIN некорректно выдавалась запись WAL, даже если индекс был нежурналируемым. При попытке воспроизвести запись в ходе восстановления после сбоя выдавалась ошибка, что восстанавливаемый файл уже существует.
Использование корректной упорядочивающей функции при параллельном построении индексов GIN (Томаш Вондра) §
Ранее при параллельном построении индексов использовался упорядочивающий оператор по умолчанию (он определялся классом операторов btree, связанным с типом данных столбца). Это приводило к ошибке, если у типа данных не было класса операторов btree, или к некорректной индексации, если выбиралась упорядочивающая функция, которая не согласовывалась с классом операторов btree. Для корректной работы должна была использоваться упорядочивающая функция, определённая классом операторов GIN, при наличии.
Предотвращение опустошения буфера CLOG, который ещё требуется для обработки непрочитанных сообщений
NOTIFY(Джоэл Джейкобсон, Хейкки Линнакангас) § § §Это исправление позволяет избежать ошибок «could not access status of transaction» (не удалось получить статус транзакции), когда обслуживающий процесс задерживается с обработкой сообщений
NOTIFY.Повышение уровня важности ошибок, возникающих при обработке сообщений
NOTIFY, до FATAL, то есть требование закрытия соединения (Хейкки Линнакангас) §Ранее если в ходе обработки сообщения
NOTIFYвозникала ошибка, обслуживающий процесс игнорировал отсутствие уведомления, сообщал клиенту об ошибке и продолжал работу. Однако такое поведение имело негативные последствия. Самым значимым было то, что клиент не мог определить, что уведомление было потеряно, и узнать о его содержимом. В зависимости от логики работы, не получив уведомление, приложение могло, например, зависнуть в ожидании. Также прекращалась обработка остальных сообщений до тех пор, пока не было отправлено новое сообщениеNOTIFY.Кроме того, если соединение простаивает при получении
NOTIFY, любая ошибка уровня ERROR должна становиться FATAL по причинам, не связанным с данной проблемой. Для обеспечения согласованности и для чёткого информирования приложения о возможном отсутствии уведомлений описанное выше поведение стало применяться во всех случаях.Учёт выражений группирования при вычислении хеша идентификатора запроса (Цзянь Хи) §
Ранее два запроса, которые отличались только выражениями
GROUP BY, объединялись модулемcontrib/pg_stat_statementsили другими расширениями, использующими идентификаторы запросов.Исправление ошибок при подсчёте изменений командой
EXPLAIN ANALYZE MERGEв случае параллельных изменений (Дин Рашид) §Ранее в выводе
EXPLAINотображалось неверное количество пропущенных («skipped») кортежей или происходил сбой проверочного утверждения в сборках с поддержкой проверочных утверждений.Исправление ошибки, возникавшей при построении цепочки обновлений для блокировки версий кортежей (Джаспер Смит) §
При построении цепочки обновлений xmin первого нового кортежа не проверялся, что могло приводить к блокировке кортежа, не связанного с обновлениями, если процесс обновления прерывался, а сразу после этого дисковое пространство высвобождалось командой
VACUUMи использовалось повторно. В результате могли происходить непредвиденные задержки транзакций или взаимоблокировки. Также фиксировались ошибки, связанные с некорректным определением кортежа.Исправление некорректной обработки инкрементальных резервных копий больших таблиц (Роберт Хаас, Олег Ткаченко) §
Если размер таблицы превышал 1 ГБ (или ограничение размера сегмента) и происходило её усечение командой
VACUUMв промежутке между созданием базовой резервной копии и инкрементальной резервной копии, работа приложения pg_combinebackup могла завершиться ошибкой «truncation block length in excess of segment size» (длина отсечения в блоках превышает размер сегмента). Восстановить таблицу из инкрементальной резервной копии было невозможно.Устранение риска сбоя обслуживающего процесса на этапе завершения при попытке снять блокировку с сегмента разделяемой памяти, который уже был освобождён (Рахила Сьед) §
Устранение условий гонки при выполнении асинхронного ввода-вывода (Андрес Фройнд) §
Ранее результат операции ввода-вывода мог быть перезаписан до того, как получен.
Предотвращение некорректного усечения журнала мультитранзакций после сбоя (Хейкки Линнакангас) §
Предотвращение риска некорректной обработки результата функции
pg_stat_get_backend_activity()(Чао Ли) §Ранее буфер разделяемой памяти, содержащий строку активности сеанса, мог завершаться неполным многобайтным символом. Функции-обработчики должны отсекать такие неполные символы, однако в данном случае этого не происходило.
Предотвращение рекурсивной записи в журнал контекстов памяти (Фудзии Масао) §
Постоянный поток сигналов, запрашивающих запись контекстов памяти, мог приводить к рекурсивному выполнению кода записи в журнал. Это создавало риск переполнения стека.
Корректировка использования контекста памяти при переинициализации контекста параллельного выполнения (Якуб Вартак, Дживан Чок) §
Ранее из-за использования подчинённой структуры данных с более коротким сроком жизни по сравнению с контекстом параллельного выполнения мог произойти сбой. В ядре PostgreSQL проблема не наблюдалась, но возникала при работе с расширениями.
Определение смещения следующей мультитранзакции при создании новой мультитранзакции во избежание цикла ожидания в особых случаях (Андрей Бородин) § §
Ранее могло произойти зависание в ожидании изменения, которое никогда бы не было выполнено.
Предотвращение перезаписи CTE, изменяющих данные, более одного раза (Бернис Саути, Дин Рашид) §
Ранее при изменении автоматически обновляемого представления или отношения с правилами, если запрос содержал изменяющие данные CTE, они могли многократно перезаписываться по причине рекурсии. Такое поведение было неэффективным и могло приводить к ложным ошибкам, если CTE предполагало изменение генерируемого столбца.
Обеспечение возможности повторной попытки инициализации записи реестра DSM (Натан Боссарт) §
Теперь, если после начала инициализации записи динамически разделяемой памяти возникает ошибка, попытку инициализации этой записи можно повторить. Ранее запись оставалась в состоянии ошибки, которое нельзя было изменить.
Предотвращение сбоя представлений по статистике NUMA, если страница выгружалась в пространство подкачки (Томаш Вондра) §
Предотвращение возникновения ошибок «operation not permitted» (операция не разрешена) при запросе статуса страниц NUMA с использованием старых версий библиотеки libnuma (Томаш Вондра) §
Запрет на восстановление при отсутствии записей WAL от позиции наката изменений, соответствующей записи контрольной точки (Нитин Ядав) §
Перед началом восстановления добавлена явная проверка наличия REDO LSN во избежание негативных последствий с выводом сообщения об ошибке. Ранее в ходе восстановления мог произойти сбой или повреждение базы данных.
Предотвращение изменений в исходном дереве запроса при
ALTER PUBLICATION(Сунил С) §Ошибка проявлялась в том, что триггер событий, срабатывающий для запроса, видел только первый параметр
publish, даже если было определено несколько. Если такой запрос был настроен как подготовленный оператор, повторно он также выполнялся некорректно.Обеспечение передачи параметров подключения, указанных в команде
CREATE SUBSCRIPTION ... CONNECTION, процессу walsender публикующего сервера (Фудзии Масао) §Ранее параметр подключения
options(при его наличии) игнорировался, что, например, не позволяло настраивать пользовательские значения для параметров сервера в сеансе walsender. Изначально передача параметров предполагалась, однако в результате рефакторинга в PostgreSQL версии 15 механизм перестал работать. Это поведение было восстановлено.Предотвращение аннулирования слотов репликации, которые были только что созданы или синхронизированы (Хоу Чжицзе) § § §
Условие гонки с параллельно выполняемой контрольной точкой могло приводить к тому, что запись WAL, которая требовалась для слота репликации, удалялась. В результате слот репликации сразу помечался как аннулированный.
Устранение условия гонки при вычислении необходимого значения xmin для слота репликации (Хоу Чжицзе) §
При этом могла возникать ошибка «cannot build an initial slot snapshot as oldest safe xid follows snapshot's xmin» (не удаётся создать изначальный снимок слота, поскольку самый старый безопасный xid следует за xmin снимка).
Фиксирование добавления записи
pg_replication_originв ходе первоначальной синхронизации подписки логической репликации перед началом копирования данных (Хоу Чжицзе) §Ранее если копирование завершалось ошибкой, новая запись
pg_replication_originтерялась в результате отката транзакции. Это приводило к несогласованному состоянию в разделяемой памяти.Остановка логической репликации после сбоя параллельного рабочего процесса применения изменений (Хоу Чжицзе) §
Ранее подписчик мог терять транзакции.
Исправление рабочих процессов синхронизации слотов логической репликации для корректной обработки сигналов LOCK_TIMEOUT (Хоу Чжицзе) §
Ранее сигналы об истечении времени ожидания игнорировались.
Устранение риска ошибки «unexpected data beyond EOF» (неожиданные данные после EOF) при перезапуске сервера с потоковой репликацией (Антонин Боннефой) §
Исправление вывода сообщений об ошибках в случае несовпадения типов путей SQL/JSON (Цзянь Хи) §
Ранее могла выводиться ошибка «cache lookup failed for type 0» (ошибка поиска в кеше для типа 0) вместо необходимого сообщения, что выражение пути имеет неверный тип.
Исправление неверного определения положения столбца при разборе границ диапазонных секций (Чжэньмин Ян) §
Ранее, например, в сообщения об ошибке при приведении значений границ секций к типу данных столбца могло быть добавлено неверное имя столбца.
Исправление разнообразных незначительных несоответствий в сообщениях об ошибках (Ман Цзэн, Тяньчэнь Чжан) § § § §
Например, ранее в отчёте об ошибке при несоответствии номера линии времени в манифесте копии отображался номер начальной линии времени вместо конечной.
Исправление ошибки встраивания функций при JIT-компиляции с использованием LLVM версии 17 или выше (Антонин Боннефой) §
Модификация JIT-кода для работы с LLVM версии 21 (Холгер Хофштеттер) §
Ранее код не компилировался на устройствах с архитектурой AArch64.
Исправление кода для архитектуры AArch64 для работы со старыми системными заголовочными файлами (поколения RHEL7) (Том Лейн) § §
Исправление в configure проверки функции
io_uring_queue_init_mem()(Масахико Савада) §Было невозможно оптимизировать выделение буфера для асинхронных операций ввода-вывода в сборках с помощью Autotools. При этом в сборках с помощью meson проблем не возникало. Основным негативным последствием было медленное завершение обслуживающего процесса.
Добавление нового параметра сервера file_extend_method, чтобы контролировать использование функции
posix_fallocate()(Томас Манро) §В PostgreSQL версии 16 и выше для расширения файлов отношений используется функция
posix_fallocate(), если она предоставляется. При этом были зафиксированы случаи её неудачного взаимодействия с некоторыми файловыми системами: не работало сжатие BTRFS, и со старыми версиями ядер Linux система XFS могла выводить ложные ошибкиENOSPC. В качестве временного решения был добавлен новый серверный параметр. Если задать для параметраfile_extend_methodзначениеwrite_zeros, расширение файлов сервером будет производиться путём добавления блоков нулей.Учёт флага
O_CLOEXECфункцииopen()в системах Windows (Брайан Грин, Томас Манро) § § §Теперь флаг работает так же, как и на платформах POSIX, чтобы избежать утечки дескрипторов в дочерние процессы, такие как
COPY TO/FROM PROGRAM. Хотя такая утечка не вызывала значительные проблемы, она нежелательна.Исправление ошибки в ходе разбора длинных параметров командной строки в исполняемых файлах Solaris, собранных с помощью meson (Том Лейн) §
Поддержка изменений заголовков процессов в GNU/Hurd (Михаэль Банк) §
Исправление дополнения табуляцией в psql для значений параметров
VACUUM(Юго Нагата) §Запрет на вывод значения
%P(статус конвейера) в приглашениях, выдаваемых psql, при отсутствии соединения с сервером (Чао Ли) §Теперь поведение
%Pаналогично поведению других спецпоследовательностей из приглашений, значения которых зависят от активности соединения.Исправление поведения утилиты pg_dump при сборе значений последовательностей (Натан Боссарт) § §
Работа pg_dump завершалась ошибкой, когда последовательность удалялась параллельно с дампом, даже если она в него не входила. Также, если у вызывающего пользователя не было прав на чтение значения последовательности, утилита pg_dump выводила некорректные значения вместо ожидаемого отказа.
Устранение риска некорректного экранирования значений
oauth_validator_librariesутилитой pg_dump (ЧанАо Чэнь) §Утилита pg_dump применяла неправильное правило экранирования для выгрузки значения этого параметра.
Предотвращение сбоя проверочного утверждения в pg_dump в режиме обновления в двоичном формате (Вигнеш Си) §
Ошибка при обработке объектов отношений подписок в ходе сортировки вызывала сбой проверочного утверждения, хотя в производственных сборках не было значительных проблем.
Исправление обработки ошибок программой pgbench в случае с несколькими командами
\syncpipelineв конвейерном режиме (Юго Нагата) §Ранее, если после ошибки запроса выполнялось несколько команд
\syncpipeline, программа pgbench выводила ошибку «failed to exit pipeline mode» (не удалось выйти из конвейерного режима) или происходил сбой оценочного утверждения в сборке с поддержкой проверочных утверждений.Добавление в утилиту pg_resetwal вывода нового значения при изменении OldestXID (Хейкки Линнакангас) §
Изменяемые значения других переменных утилита уже выводила.
Возможность указать значение 0 для xid следующей мультитранзакции или значения UINT32_MAX для следующего смещения мультитранзакций для утилиты pg_resetwal (Максим Орлов) §
Эти значения допустимые, поэтому отклонять их было неправильно. В худшем случае, обновление с использованием pg_upgrade именно в момент зацикливания идентификаторов мультитранзакций прервётся с ошибкой.
Использование правильного снимка в модуле
contrib/amcheckпри проверках страниц индексов btree (Михаил Николаев) § §Ранее при проверке индексов, созданных с помощью команды
CREATE INDEX CONCURRENTLY, возникали ложные ошибки.Исправление поведения модуля
contrib/amcheckдля корректной обработки «наполовину неактуальных» страниц индекса btree (Хейкки Линнакангас) §Модуль
amcheckискал родительскую ссылку на эту страницу, хотя этой ссылки не существовало. В результате выводилось ложное сообщение об ошибке «mismatch between parent key and child high key» (несоответствие между родительским ключом и дочерним верхним ключом).Исправление поведения модуля
contrib/amcheckдля корректной обработки неполного разделения корневых страниц btree (Хейкки Линнакангас) §Модуль
amcheckмог выводить ложное сообщение об ошибке «block is not true root» (блок не является корневым объектом).Предотвращение чрезмерного выделения памяти при работе модуля
contrib/pg_buffercache(Дэвид Гейер) §Расширение выделяло в два раза больше памяти, чем было нужно для мониторинга статуса страниц NUMA.
Устранение целочисленного переполнения в особых случаях при оценке избирательности для оператора
@@модулемcontrib/intarray(Чао Ли) §При этом результаты оценки избирательности при использовании максимального целочисленного значения могли оказаться некорректными.
Устранение проблем с многобайтным защитным преобразованием в модуле
contrib/ltree(Джефф Девис) §Ранее в функцию
lower()могла передаваться неполная многобайтная последовательность, что могло приводить к некорректному поведению.Предотвращение сбоя в работе модуля
contrib/pg_stat_statements, когда списокINодновременно включает константные и неконстантные выражения (Сами Имсейх) §Обновление данных часовых поясов до версии tzdata 2025c (Том Лейн) §
Изменения затронули только метки времени до 1976 года в Нижней Калифорнии.