13-го марта состоялся корректирующий выпуск 3.51.3 компактной встраиваемой СУБД SQLite. Код проекта написан на языке C и распространяется как общественное достояние (public domain).
В связи с проблемами обратной совместимости, связанными с некоторыми новыми функциями, версия 3.52.0 (вышедшая 6-го марта) была отозвана.
Список изменений версии 3.51.3:
- 3-го марта один из разработчиков SQLite (Dan) обнаружил и устранил ошибку, которая в редких случаях могла приводить к повреждению базы данных и названная «WAL-reset bug»:
- Эта ошибка возникает только в базах данных, работающих в режиме WAL, если к одному и тому же файлу открыто два и более подключения в разных потоках или процессах, и если эти два подключения пытаются выполнить запись или создать контрольную точку одновременно.
- Ошибка связана с конфликтом доступа к данным при жёстких временных ограничениях. В обычных условиях эксплуатации она возникает крайне редко. Разработчикам так и не удалось воспроизвести эту ошибку в естественных условиях, и им пришлось добавить в SQLite специальную логику тестирования, которая намеренно создает условия для возникновения ошибки, чтобы убедиться в том, что проблема устранена.
- Ошибка возникает, когда:
- Одно соединение выполняет проверку контрольной точки. Эта первая проверка должна быть завершена. Другими словами, в ходе проверки необходимо успешно скопировать всё содержимое файла WAL обратно в базу данных и привести файл WAL в состояние, при котором его можно будет сбросить.
- Сразу после завершения работы первой контрольной точки запускается вторая.
- Пока запускается вторая контрольная точка из шага 2, другое подключение к базе данных фиксирует транзакцию, которая сбрасывает файл WAL и записывает новое содержимое в начало файла WAL.
- Из-за конфликта доступа к данным вторая контрольная точка из шага 2 не учитывает, что файл WAL был сброшен в результате фиксации транзакции на шаге 3. Вторая контрольная точка устанавливает неверное значение для одного из полей в заголовке индекса WAL. Это поле указывает, что часть файла WAL уже была зафиксирована в контрольной точке, хотя на самом деле это не так.
- Фиксация дополнительных транзакций приводит к увеличению количества страниц в файле WAL, которое превышает количество страниц, существовавшее на момент первой контрольной точки из шага 1.
- Позже, когда возникает третья контрольная точка, она пропускает всю или часть транзакции, записанной на этапе 3. Таким образом, части транзакции с этапа 3 так и не попадают в файл базы данных, в результате чего файл базы данных повреждается.
- Ошибка, вероятно, присутствует во всех версиях SQLite, начиная с 3.7.0 (21.07.2010) и заканчивая 3.51.2. Также выпущены исправления для некоторых более ранних версий: 3.44.6 и 3.50.7.
- Другие незначительные исправления.




