Разработчики: | Ричард Хипп |
Дата последнего релиза: | 2022/11/21 |
Технологии: | СУБД |
Содержание |
О продукте
SQLite — облегченная встраиваемая реляционная база данных. Исходный код библиотеки передан в общественное достояние. В 2005 году проект получил награду Google-O’Reilly Open Source Awards.
SQLite не использует парадигму клиент-сервер, то есть движок SQLite не является отдельно работающим процессом, с которым взаимодействует программа, а предоставляет библиотеку, с которой программа компонуется и движок становится составной частью программы. Таким образом, в качестве протокола обмена используются вызовы функций (API) библиотеки SQLite. Такой подход уменьшает накладные расходы, время отклика и упрощает программу. SQLite хранит всю базу данных (включая определения, таблицы, индексы и данные) в единственном стандартном файле на том компьютере, на котором исполняется программа. Простота реализации достигается за счёт того, что перед началом исполнения транзакции записи весь файл, хранящий базу данных, блокируется; ACID-функции достигаются в том числе за счёт создания файла журнала.
Несколько процессов или потоков могут одновременно без каких-либо проблем читать данные из одной базы. Запись в базу можно осуществить только в том случае, если никаких других запросов в данный момент не обслуживается; в противном случае попытка записи оканчивается неудачей, и в программу возвращается код ошибки. Другим вариантом развития событий является автоматическое повторение попыток записи в течение заданного интервала времени.
В комплекте поставки идёт также функциональная клиентская часть в виде исполняемого файла sqlite3, с помощью которого демонстрируется реализация функций основной библиотеки. Клиентская часть работает из командной строки, позволяет обращаться к файлу БД на основе типовых функций ОС.
Благодаря архитектуре движка возможно использовать SQLite как на встраиваемых системах, так и на выделенных машинах с гигабайтными массивами данных.
2022: SQLite 3.40
21 ноября 2022 года стало известно о том, что опубликован релиз SQLite 3.40, легковесной СУБД, оформленной в виде подключаемой библиотеки. Код SQLite распространяется как общественное достояние (public domain), т.е. может использоваться без ограничений и безвозмездно в любых целях. Финансовую поддержку разработчиков SQLite осуществляет специально созданный консорциум, в который входят такие компании, как Adobe, Oracle, Mozilla, Bentley и Bloomberg.
Основные изменения:
- Реализована экспериментальная возможность компиляции SQLite в промежуточный код WebAssembly, способный запускаться в web-браузере и пригодный для организации работы с БД из web-приложений на языке JavaScript. Web-разработчикам предоставляется высокоуровневый объектно-ориентированный интерфейс для работы с данными в стиле sql.js или Node.js, обвязка над низкоуровневым C API и API на базе механизма Web Worker, позволяющий создавать асинхронные обработчики, выполняемые в отдельных потоках. Данные, которые web-приложения сохраняют в WASM-версии SQLite, могут быть сохранены на стороне клиента при помощи OPFS (Origin-Private FileSystem) или API window.localStorage.
- Добавлено расширение recovery, предназначенное для восстановления данных из повреждённых файлов с БД. В интерфейсе командной строки для восстановления используется команда ".recover".
- Улучшена работа планировщика запросов. Убраны ограничения при использовании индексов с таблицами, насчитывающими более 63 столбцов (ранее при операциях со столбцами, порядковый номер которых превышает 63, индексация не применялась). Улучшена индексация значений, используемых в выражениях. Прекращена загрузка с диска больших строк и блобов при обработке операторов NOT NULL и IS NULL. Исключена материализация представлений для которых полное сканирование выполняется только один раз.
- В кодовой базе вместо типа "char *" для представления имён файлов задействован отдельный тип sqlite3_filename.
- Добавлена внутренняя функция sqlite3_value_encoding().
- Добавлен режим SQLITE_DBCONFIG_DEFENSIVE, запрещающий изменение версии схемы хранения данных.
- В реализацию параметра "PRAGMA integrity_check" добавлены дополнительные проверки. Например, в таблицы без признака STRICT не должны содержать числовых значений в столбцах с типом TEXT и строковых значений с числами в столбцах с типом NUMERIC. Также добавлена проверка корректности порядка следования строк в таблицах с признаком "WITHOUT ROWID".
- В выражении "VACUUM INTO" учтены настройки "PRAGMA synchronous".
- Добавлена сборочная опция SQLITE_MAX_ALLOCATION_SIZE, позволяющая ограничить размер блоков при распределении памяти.
- Встроенный в SQLite алгоритм генерации псевдослучайных чисел переведён с использования потокового шифра RC4 на Chacha20.
- Разрешено использование в разных схемах данных индексов с одинаковыми именами.
- Внесены оптимизации производительности, позволившие снизить нагрузку на CPU примерно на 1% при типовой активности[1].
2019: Возможность взлома iPhone через уязвимости в SQLite
16 августа 2019 года стало известно, что специалисты компании Check Point продемонстрировали, как можно взломать iPhone через ядро базы данных, которое использует iOS — SQLite. В этом случае хакеры смогут получить права администратора над устройством.
SQLite — распространенные базы данных. Они доступны в любой операционной системе, персональном компьютере и на мобильном телефоне. Пользователи SQLite — Windows 10, MacOS, iOS, Chrome, Safari, Firefox и Android. Контакты на вашем iPhone, некоторые из сохраненных паролей на вашем ноутбуке — вся эта информация c большой вероятностью хранится в базе данных SQLite.Дмитрий Пенязь, OpenYard: Мы живем во времена бэби-бума на российском ИТ-рынке
Специалисты Check Point нашли несколько уязвимостей и изобрели способ их эксплуатации. Проще говоря, теперь стало возможным получение контроля над всем, что обращается к базам данных SQLite.
Так как SQLite является одним из наиболее широко распространенных компонентов программного обеспечения, подобные уязвимости можно применять бесконечное количество раз.
Исследователи Check Point продемонстрировали эти уязвимости двумя способами. В первом случае инженеры перехватили злоумышленника, который заразил тестируемое устройство популярным вредоносным ПО, известным как «похититель паролей». Когда вредоносная программа забирает сохраненный пароль с зараженного компьютера и отправляет его своему оператору, мы получаем контроль над самим оператором.
Вторая демонстрация была на iPhone, на операционной системе iOS. Специалистам удалось обойти доверенный механизм безопасной загрузки Apple и получить права администратора на последнем iPhone.
SQLite практически встроен практически в любую платформу, поэтому можно сказать, что эксперты едва поцарапали верхушку айсберга, если говорить о потенциале эксплуатации уязвимостей.
Компания Check Point надеется, что данное исследование подтолкнет мировое сообщество по кибербезопасности работать дальше над этими уязвимостями.
2016: SQLite 3.14.0
9 августа 2016 года стал доступен релиз SQLite 3.14.0.
Добавленные возможности и функции [2]:
- Возможность создавать виртуальные таблицы без идентификаторов строк (режим "WITHOUT ROWID");
- В планировщик запросов внесены изменения, позволившие задействовать оптимизации выражения "OR" в виртуальных таблицах при наличии нескольких операторов LIKE, GLOB, REGEXP и MATCH;
- Добавлена виртуальная таблица CSV для упрощения импорта файлов в формате CSV;
- Добавлена функция carray();
- Добавлено загружаемое расширение vfsstat.c с VFS-прослойкой для сбора статистики о параметрах ввода/вывода;
- Улучшен алгоритм выполнения запросов, содержащих выражения "ORDER BY" и "LIMIT";
- Добавлен VFS "win32-none", который аналогичен "win32" за исключением того, что не использует блокировку файла;
- Добавлена новая утилита командной строки dbhash для вычисления хэша SHA1 для схемы данных и содержимого БД;
- Добавлена SQL-функция json_quote().
2015
SQLite 3.10.0
6 января 2015 года состоялся релиз SQLite 3.10.0, оформленной в виде подключаемой библиотеки[3].
Основные изменения
- Обеспечена возможность использования операторов LIKE, GLOB и REGEXP с виртуальными таблицами;
- В утилиту sqldiff добавлена опция "--transaction";
- Реализованы новые интерфейсы sqlite3_db_cacheflush() и sqlite3_strlike();
- При открытии символической ссылки на БД, обеспечивающие журналирование файлы теперь создаются в привязке к реальному имени файла, а не имени символической ссылки;
- При использовании ввода/вывода с применением отображения в память (memory-mapped I/O), отображение теперь производится в режиме только на чтение, что не даёт возможности случайно изменить БД в случае переполнения буфера в приложении или проблем с указателями;
- В расширение для работы с форматом JSON добавлены новые SQL-функции json_group_array() и json_group_object();
- Добавлена сборочная опция SQLITE_LIKE_DOESNT_MATCH_BLOBS;
- Внесена оптимизация производительности, ускорившая работу с БД на 2-3%;
- В интерфейс командной строки добавлены новые команды ".changes ON|OFF" и ".vfsinfo".
SQLite 3.8.11
30 июля 2015 года стало известно о публикации релиза SQLite 3.8.11[4].
Вслед за ним вышел корректирующий релиз 3.8.11.1 для легковесной системы управления базами данных, оформленной в виде подключаемой библиотеки.
Тестирование нагрузки SQLite на ЦП, 2015
В новом релизе:
- Добавлено экспериментальное расширение RBU (Resumable Bulk Update), предназначенное для организации быстрых инкрементальных обновлений больших наборов данных;
- Добавлено экспериментальное расширение FTS5 с новой реализацией системы полнотекстового поиска;
- В расширение spellfix1 добавлена поддержка выражения "ON CONFLICT";
- В операторе "IS" реализована возможность использования индексов;
- Улучшена работа планировщика запросов в плане автоматической индексации подзапросов, заданных в блоке FROM;
- Добавлена команда "PRAGMA cell_size_check" для выявления повреждения файла БД на ранней стадии;
- В полнотекстовом движке FTS3 в функции matchinfo() появился новый флаг сопоставления "b";
- Добавлена программа fuzzcheck для качественного fuzz-тестирования БД. Программа автоматически вызывается при выполнении "make test";
- Увеличена эффективность работы страничного кэша и реализовано предварительное выделение памяти для кэша. В тестах изменение позволило поднять производительность на 5% при типовых применения СУБД. Внесены разнообразные микрооптимизации, которые позволили выполнить на 22.3% больше работы в рамках тех же циклов CPU. В сумме, по производительности выпуск 3.8.11 в два раза быстрее 3.8.0 и в три раза быстрее 3.3.9 (при тестировании cachegrind и speedtest1.c в Ubuntu 14.04 x64 при сборке в gcc 4.8.2 с флагом -Os).
2012
SQLite 3.7.0
Изменения:
- Для корректной работы в системах без ftruncate () размер БД сохраняется в заголовке.
- Дерективы GROUP BY и ORDER BY не будут принимать значение (noop) при указании друг на друга.
- Функция sqlite3_db_status (), код возврата SQLITE_DBSTATUS_CACHE_USED
- Ускорена обработка запросов к базе данных, включена поддержка логирования.
- Существенно сокрашено время на обработку запроса на построение индексов в базе данных благодаря использованию фонового построения.
SQLite 3.7.10
Осуществлен переход на использование по умолчанию 4 версии формата схемы данных, что подразумевает также включение по умолчанию более нового формата убывающих индексов и нарушение совместимости с БД SQLite версии ниже 3.3.0 (выпущенных до 2006 года).
Некоторые другие изменения:
- Объявлена устаревшей структура sqlite3_pcache_methods, а также опции конфигурации SQLITE_CONFIG_PCACHE и SQLITE_CONFIG_GETPCACHE, вместо которых следует использовать sqlite3_pcache_methods2, SQLITE_CONFIG_PCACHE2 и SQLITE_CONFIG_GETPCACHE2;
- В VFS-интерфейс добавлена поддержка режима защиты от потери данных в случае неожиданного отключения питания, который включается через опцию на этапе сборки SQLITE_POWERSAFE_OVERWRITE и через параметр "psow=BOOLEAN" в URI. Дополнительно исправлена недоработка, которая могла теоретически привести к повреждению базы при экстренном отключении питания;
- Добавлены новые интерфейсы: sqlite3_db_release_memory(), sqlite3_db_filename(), sqlite3_stmt_busy(), sqlite3_uri_boolean() и sqlite3_uri_int64();
- Возможность указания отрицательных значений в PRAGMA cache_size, которые будут указывать на необходимость уменьшения размера кэша на -1024*N байт относительно размера страницы памяти;
- Улучшена используемая по умолчанию система распределения памяти;
- Планировщик запросов улучшен в направлении задействования индексов при запросе диапазонов значений для rowid, обработке "UNION ALL" и в некоторых других ситуациях;
- Улучшена реализация блокировок для "unix-dotfile" VFS (вместо open()/unlink() теперь используется mkdir()/rmdir());
- Различные улучшения в реализации unix и windows VFS.
Языки программирования
- С, C++, Java, C#, VB.NET, Python, Perl, PHP, Tcl (средства для работы с Tcl включены в комплект поставки SQLite), Ruby, Haskell, Scheme, Smalltalk, Lua и Parser.
Примечания
Подрядчики-лидеры по количеству проектов
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
Распределение вендоров по количеству проектов внедрений (систем, проектов) с учётом партнёров
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
Распределение систем по количеству проектов, не включая партнерские решения
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)
![](/skins/ta/img/0.gif)