Вышла новая версия SQLite 3.53, в которой устранена ошибка, приводившая к повреждению базы данных при сбросе WAL, а также представлен широкий спектр обновлений для SQL, интерфейса командной строки, планировщика запросов и компонентов API.
Ключевым нововведением стал модуль форматирования результатов запросов, который теперь используется для форматирования результатов в интерфейсе командной строки. В примечаниях к выпуску говорится, что это расширяет возможности отображения, по умолчанию выравнивает числовые значения по правому краю в табличном выводе и меняет интерактивный вывод в интерфейсе командной строки на таблицы в формате Unicode для лучшей читаемости. В пакетном режиме для совместимости сохраняется устаревший формат вывода.
В SQLite 3.53 также расширена поддержка языка SQL. Теперь с помощью команды ALTER TABLE можно добавлять или удалять ограничения NOT NULL и CHECK. Новая команда REINDEX EXPRESSIONS позволяет перестраивать индексы выражений. В телах триггеров TEMP теперь можно запрашивать или изменять таблицы в основной схеме, а команда VACUUM INTO поддерживает установку размера резерва с помощью параметра URI filename. Также добавлены две новые функции SQL: json_array_insert() и jsonb_array_insert().
Для пользователей интерфейса командной строки команда .mode была значительно улучшена. Теперь игнорируются пустые точки с запятой в конце команд с точкой в конце. Устранены проблемы с .testcase и .check . Непустые .sql или .txt файлы, указанные в командной строке, теперь интерпретируются как SQL-скрипты или скрипты с командами в конце.
Среди дополнительных функций — однократный режим для .timer, новая опция тайм-аута для .progress и обновление .indexes таким образом, чтобы его шаблон соответствовал именам индексов, а не таблиц. Кроме того, была переработана функция преобразования чисел с плавающей запятой в текст для повышения производительности: теперь по умолчанию округляется до 17 значащих цифр, а не до 15.
Планировщик запросов также получил несколько обновлений. Теперь SQLite последовательно использует сортировку и слияние для операций EXCEPT, INTERSECT и UNION, поскольку этот подход в целом быстрее, чем обработка с использованием хэш-таблиц. В новой версии также улучшен выбор порядка объединения для больших объединений по схеме «звезда», расширена оптимизация EXISTS-to-JOIN, улучшена обработка исключений при объединении и расширены возможности оптимизации с использованием одного индекса в некоторых сценариях GROUP BY и ORDER BY.
Наконец, стоит отметить, что заметным нововведением стала функция самовосстановления индекса, которая решает проблему устаревших индексов выражений. Кроме того, в SQLite появилась команда REINDEX EXPRESSIONS для непосредственного перестроения индексов выражений по мере необходимости.
Подробнее см. в журнале изменений.
Выводы
Обновление SQLite 3.53 — это в первую очередь релиз, ориентированный на стабильность и безопасность данных. Главным событием стало устранение редкой, но потенциально критической ошибки в механизме WAL (Write-Ahead Logging), которая могла приводить к повреждению базы данных при определённых условиях.
Хотя вероятность проявления бага была крайне низкой и требовала специфического совпадения обстоятельств, сам факт его существования на протяжении многих лет делает исправление особенно значимым для всех систем, где SQLite используется в продакшене.
Помимо исправлений, версия 3.53 продолжает развитие функциональности:
- расширяются SQL-возможности;
- улучшается обработка запросов и оптимизация;
- повышается общая надёжность работы с транзакциями и структурой данных.
SQLite остаётся одной из самых стабильных и надёжных встраиваемых СУБД, а такие обновления подтверждают активную работу над качеством даже в зрелом продукте. Обновление до новой версии рекомендуется всем пользователям, особенно тем, кто использует WAL-режим или работает с критичными данными.