SQLite 3.54 ускорила тестовый прогон и оставила Windows XP за бортом
Опубликован выпуск SQLite 3.54. Это компактная СУБД, которую встраивают в программу как подключаемую библиотеку. Исходный код остаётся в общественном достоянии: его разрешено использовать безвозмездно и без ограничений в любых целях.
Финансирование авторов идёт через консорциум, специально созданный для поддержки разработки. Главный измеримый сдвиг — оптимизации, из-за которых тест speedtest1 проходит примерно на 4% быстрее, чем в предыдущей версии, и на 7.5% быстрее, чем в выпуске 3.51 годичной давности. Авторы сразу оговаривают, что цифра не универсальна: итог зависит от вида нагрузки, сборочных опций, процессора, компилятора и операционной системы.

Для встроенной базы такой прирост складывается на длинном прогоне, а не обещает одинаковый выигрыш на каждом отдельном запросе. В утилите командной строки sqlite приглашение можно собирать из escape-последовательностей и показывать в нём состояние сеанса. Последовательность «/x» сообщает об открытой транзакции, «/r» — что база открыта только для чтения, «/m» — что данные держатся лишь в оперативной памяти, «/f» подставляет имя файла базы, «/v» — версию SQLite.
Через «/:» и «/;» строятся условные выражения, а «/u» и «/h» вставляют имя пользователя и имя хоста. Шаблон приглашения задаётся переменными окружения SQLITE_PS1 и SQLITE_PS2, так что оформление строки не нужно задавать заново при каждом запуске. Команда «.mode» получила параметры «--ifmt», «--rowcount on» и «--titles always»: первая настраивает формат чисел с плавающей запятой, вторая включает счётчик строк, третья заставляет всегда показывать заголовок.
Обработчик команды «.diskused» заменён. Если запрос не вернул ни одной строки, заголовок с именами столбцов теперь остаётся по умолчанию. На Unix-системах при выводе blob-значений отключена чистка нулевых байтов: двоичное содержимое уходит наружу без этой прежней обработки.
Для тех, кто смотрит сырые значения из командной строки, это меняет не скорость, а точность того, что видно на экране. Планировщик запросов ускорил UPDATE в случаях, когда есть индексы по выражениям, но индексируемое значение не меняется. Отдельно оптимизировано исполнение конструкций «expr OR TRUE» и «expr OR FALSE».
Выражение DISTINCT игнорируется в SELECT-подзапросах, указанных справа от оператора IN. Эти правки касаются выбора плана для уже знакомого SQL, а не новых команд. Обработка UNION-запросов с выражением «LIMIT 1» стала быстрее и требует меньше памяти.
Команда ALTER TABLE теперь выдаёт ошибку на любую попытку добавить, удалить или переименовать столбец с зарезервированными именами «ROWID», «_ROWID_» и «OID». Служебные идентификаторы строки нельзя задеть обычным изменением схемы. Для оценки места, которое таблицы и индексы занимают на накопителе, добавлена SQL-функция diskused().
В printf() и format() появились подстановки «%J» и «%j», через которые значение выводится в формате JSON. Отчёт или журнал можно собрать средствами самого SQL, не вынося форматирование во внешний скрипт. В функции работы с датами и временем добавлены модификаторы «weekday -N» и «end of».
На системах, где open() поддерживает флаг O_TMPFILE, этот режим задействован при создании временных файлов. Поддержка старых Windows прекращена: в список больше не входят Windows CE и Windows XP, минимальной версией объявлена Windows Vista. Сообщение о релизе опубликовано на OpenNet.