9-го апреля состоялся выпуск 3.53.0 компактной кроссплатформенной встраиваемой СУБД SQLite. Код проекта написан на языке C и распространяется как общественное достояние (public domain).
Изменения:
- Исправлена ошибка WAL-reset database corruption bug. См. предыдущую новость SQLite 3.51.3 с исправлением возможного повреждения базы данных в режиме WAL.
- Добавлена библиотека форматирования результатов SQL-запросов Query Result Formatter (QRF) для обеспечения удобства чтения на экране с шрифтом фиксированной ширины.
- Добавлен метод format к интерфейсу TCL для доступа к QRF из TCL.
- QRF теперь используется в консольной утилите sqlite для форматирования результатов запросов, что улучшило их отображение.
- Новые возможности языка SQL:
- Улучшены возможности команды ALTER TABLE для обеспечения возможности добавления и удаления ограничений NOT NULL и CHECK.
- Оператор REINDEX EXPRESSIONS выполняет переиндексацию индексов выражений. Полезно для восстановления устаревших индексов выражений.
- Теперь триггеры TEMP могут изменять и/или запрашивать данные из таблиц основной схемы.
- Улучшена команда VACUUM INTO: в случае использования в качестве адреса назначения имени файла в формате URI, содержащего параметр запроса reserve=N (где N — число от 0 до 255), объем резервирования для создаваемой копии базы данных устанавливается равным N.
- Добавлены новые функции SQL:
- Обновления в консольной утилите:
- Значительные улучшения команды .mode.
- Благодаря расширению QRF улучшено форматирование результатов. Например, числа теперь выравниваются вправо по умолчанию в режиме табличного вывода.
- По умолчанию QRF теперь используется при интерактивном использовании консольной утилиты для отображения результатов запросов в блоках, сформированных с помощью символов Unicode рисования блоков, что повысило читаемость. Устаревший формат вывода используется при пакетном выполнении команд для обеспечения совместимости.
- Одиночные (не заключенные в кавычки) точки с запятой в конце команд с точкой игнорируются без предупреждения. Это возможная несовместимость!
- Исправлены команды .testcase и .check. Теперь они действительно работают и используются в скриптах, входящих в стандартный набор тестов SQLite, входящих в исходные коды.
- Аргументы командной строки, которые соответствуют шаблонам *.sql или *.txt и представляют собой имена непустых файлов, считываются и интерпретируются как скрипты, содержащие SQL-операторы и/или [команды с точкой]((https://sqlite.org/cli.html#dotcmd).
- Теперь в качестве аргумента команды .timer можно указать once для срабатывания таймера только при выполнении следующего SQL-запроса.
- Новый параметр —timeout S команды .progress приводит к прерыванию выполнения SQL-запросов по истечении S секунд.
- Команда .indexes изменена так, что аргумент PATTERN теперь сопоставляется с именем индекса, а не с именем индексируемой таблицы (благодаря чему аргумент PATTERN стал действительно полезным). Кроме того, в команду .indexes было добавлено несколько новых опций.
- Улучшения в C API:
- sqlite3_str_truncate()
- sqlite3_str_free()
- sqlite3_carray_bind_v2()
- В функцию sqlite3_prepare_v3() добавлена опция SQLITE_PREPARE_FROM_DDL, которая позволяет реализациям виртуальных таблиц безопасно подготавливать SQL-операторы, полученные из схемы базы данных.
- Добавлена константа SQLITE_UTF8_ZT, которую можно использовать в качестве параметра кодировки в функциях sqlite3_result_text64() или sqlite3_bind_text64() для указания, что значение закодировано в UTF-8 и завершается нулем.
- В функцию sqlite3_limit() добавлена опция SQLITE_LIMIT_PARSER_DEPTH.
- В функцию sqlite3_db_config() добавлена опция SQLITE_DBCONFIG_FP_DIGITS. Также см. там пункт 9b ниже.
- Улучшения планировщика запросов:
- Для EXCEPT, INTERSECT и UNION всегда используется алгоритм сортировки и слияния, так как он почти всегда работает быстрее, чем использование хеш-таблиц.
- Улучшения в механизме выбора порядка join при выполнении больших многосторонних соединений в звездообразной схеме.
- Усовершенствована оптимизация преобразования EXISTS в JOIN так, чтобы вставляемые условия JOIN не обязательно находились во внутренних циклах, при условии, что все зависимости для циклов преобразования EXISTS в JOIN находятся во внешних циклах.
- Усовершенствована оптимизация omit-noop-join так, что она может опускать цепочку соединений, не влияющих на результат.
- Оптимизация запросов, использующих GROUP BY e1 ORDER BY e2, где e1 и e2 идентичны, за исключением порядка сортировки ASC/DESC, с помощью одного индекса.
- Оптимизация оператора DISTINCT в виртуальных таблицах в тех случаях, когда набор результатов запроса не полностью соответствует условию ORDER BY.
- В расширение сеанса добавлены новые интерфейсы, позволяющие приложению добавлять изменения по одному в объект sqlite3_changegroup:
- Улучшения в преобразовании чисел с плавающей запятой ↔ текст.
- Код полностью переписан для улучшения производительности.
- Теперь по умолчанию округление производится до 17 значащих цифр вместо 15, как это было во всех предыдущих версиях. При необходимости это значение можно изменить с помощью функции sqlite3_db_config с опцией SQLITE_DBCONFIG_FP_DIGITS (см. там пункт 6g выше).
- Добавлена возможность самовосстановления индекса для решения проблемы устаревших индексов выражений.
- В консольную утилиту sqlite3_rsync добавлена опция -p|—port.
- Прекращена поддержка Windows RT.
- JavaScript/WASM
- Добавлена VFS opfs-wl, функционально идентичная opfs, но использующая для блокировок Web Locks, что позволяет обеспечить более справедливое распределение блокировок, чем в протоколе opfs. opfs-wl требует наличия функции Atomics.waitAsync(), поэтому для его работы требуются более новые версии браузеров, чем для opfs.
Источник: linux.org.ru
