Коды результатов и ошибок
Содержание
Обзор
Многие процедуры интерфейса SQLite на языке C возвращают числовые коды результатов, указывающие на успех или неудачу, а в случае неудачи дающие некоторое представление о её причине. В этом документе объясняется значение каждого из этих числовых кодов результатов.
1. Коды результатов и коды ошибок
«Коды ошибок» — это подмножество «кодов результатов», указывающих на то, что что-то пошло не так. Существует лишь несколько кодов результатов, не являющихся кодами ошибок: SQLITE_OK, SQLITE_ROW и SQLITE_DONE. Термин «код ошибки» означает любой код результата, кроме этих трёх.
2. Основные коды результатов и расширенные коды результатов
Коды результатов — это знаковые 32-разрядные целые числа. Наименее значащие 8 бит кода результата определяют общую категорию и называются «основным кодом результата». Более значащие биты предоставляют более подробную информацию об ошибке и называются «расширенным кодом результата».
Обратите внимание, что основной код результата всегда является частью расширенного кода результата. Имея полный 32-разрядный расширенный код результата, приложение всегда может получить соответствующий основной код результата, просто извлекая наименее значащие 8 бит расширенного кода результата.
Все расширенные коды результатов также являются кодами ошибок. Поэтому термины «расширенный код результата» и «расширенный код ошибки» взаимозаменяемы.
Для обеспечения исторической совместимости интерфейсы языка C по умолчанию возвращают основные коды результатов. Расширенный код результата последней ошибки можно получить с помощью интерфейса sqlite3_extended_errcode(). Интерфейс sqlite3_extended_result_codes() можно использовать, чтобы перевести подключение к базе данных в режим, в котором оно возвращает расширенные коды результатов вместо основных.
3. Определения
Все коды результатов — целые числа. Символические имена всех кодов результатов создаются с помощью макросов «#define» в заголовочном файле sqlite3.h. В заголовочном файле sqlite3.h имеются отдельные разделы для определений кодов результатов и определений расширенных кодов результатов.
Символические имена основных кодов результатов имеют вид «SQLITE_XXXXXX», где XXXXXX — последовательность заглавных букв. Имена расширенных кодов результатов имеют вид «SQLITE_XXXXXX_YYYYYYY», где часть XXXXXX соответствует основному коду результата, а YYYYYYY — это расширение, дополнительно классифицирующее код результата.
Имена и числовые значения существующих кодов результатов фиксированы и не меняются. Однако в будущих выпусках SQLite могут появиться новые коды результатов, особенно новые расширенные коды результатов.
4. Список основных кодов результатов
31 код результата определён в sqlite3.h и перечислен ниже в алфавитном порядке:
- SQLITE_ABORT (4)
- SQLITE_AUTH (23)
- SQLITE_BUSY (5)
- SQLITE_CANTOPEN (14)
- SQLITE_CONSTRAINT (19)
- SQLITE_CORRUPT (11)
- SQLITE_DONE (101)
- SQLITE_EMPTY (16)
- SQLITE_ERROR (1)
- SQLITE_FORMAT (24)
- SQLITE_FULL (13)
- SQLITE_INTERNAL (2)
- SQLITE_INTERRUPT (9)
- SQLITE_IOERR (10)
- SQLITE_LOCKED (6)
- SQLITE_MISMATCH (20)
- SQLITE_MISUSE (21)
- SQLITE_NOLFS (22)
- SQLITE_NOMEM (7)
- SQLITE_NOTADB (26)
- SQLITE_NOTFOUND (12)
- SQLITE_NOTICE (27)
- SQLITE_OK (0)
- SQLITE_PERM (3)
- SQLITE_PROTOCOL (15)
- SQLITE_RANGE (25)
- SQLITE_READONLY (8)
- SQLITE_ROW (100)
- SQLITE_SCHEMA (17)
- SQLITE_TOOBIG (18)
- SQLITE_WARNING (28)
5. Список расширенных кодов результатов
74 расширенных кода результата определены в sqlite3.h и перечислены ниже в алфавитном порядке:
- SQLITE_ABORT_ROLLBACK (516)
- SQLITE_AUTH_USER (279)
- SQLITE_BUSY_RECOVERY (261)
- SQLITE_BUSY_SNAPSHOT (517)
- SQLITE_BUSY_TIMEOUT (773)
- SQLITE_CANTOPEN_CONVPATH (1038)
- SQLITE_CANTOPEN_DIRTYWAL (1294)
- SQLITE_CANTOPEN_FULLPATH (782)
- SQLITE_CANTOPEN_ISDIR (526)
- SQLITE_CANTOPEN_NOTEMPDIR (270)
- SQLITE_CANTOPEN_SYMLINK (1550)
- SQLITE_CONSTRAINT_CHECK (275)
- SQLITE_CONSTRAINT_COMMITHOOK (531)
- SQLITE_CONSTRAINT_DATATYPE (3091)
- SQLITE_CONSTRAINT_FOREIGNKEY (787)
- SQLITE_CONSTRAINT_FUNCTION (1043)
- SQLITE_CONSTRAINT_NOTNULL (1299)
- SQLITE_CONSTRAINT_PINNED (2835)
- SQLITE_CONSTRAINT_PRIMARYKEY (1555)
- SQLITE_CONSTRAINT_ROWID (2579)
- SQLITE_CONSTRAINT_TRIGGER (1811)
- SQLITE_CONSTRAINT_UNIQUE (2067)
- SQLITE_CONSTRAINT_VTAB (2323)
- SQLITE_CORRUPT_INDEX (779)
- SQLITE_CORRUPT_SEQUENCE (523)
- SQLITE_CORRUPT_VTAB (267)
- SQLITE_ERROR_MISSING_COLLSEQ (257)
- SQLITE_ERROR_RETRY (513)
- SQLITE_ERROR_SNAPSHOT (769)
- SQLITE_IOERR_ACCESS (3338)
- SQLITE_IOERR_AUTH (7178)
- SQLITE_IOERR_BEGIN_ATOMIC (7434)
- SQLITE_IOERR_BLOCKED (2826)
- SQLITE_IOERR_CHECKRESERVEDLOCK (3594)
- SQLITE_IOERR_CLOSE (4106)
- SQLITE_IOERR_COMMIT_ATOMIC (7690)
- SQLITE_IOERR_CONVPATH (6666)
- SQLITE_IOERR_CORRUPTFS (8458)
- SQLITE_IOERR_DATA (8202)
- SQLITE_IOERR_DELETE (2570)
- SQLITE_IOERR_DELETE_NOENT (5898)
- SQLITE_IOERR_DIR_CLOSE (4362)
- SQLITE_IOERR_DIR_FSYNC (1290)
- SQLITE_IOERR_FSTAT (1802)
- SQLITE_IOERR_FSYNC (1034)
- SQLITE_IOERR_GETTEMPPATH (6410)
- SQLITE_IOERR_LOCK (3850)
- SQLITE_IOERR_MMAP (6154)
- SQLITE_IOERR_NOMEM (3082)
- SQLITE_IOERR_RDLOCK (2314)
- SQLITE_IOERR_READ (266)
- SQLITE_IOERR_ROLLBACK_ATOMIC (7946)
- SQLITE_IOERR_SEEK (5642)
- SQLITE_IOERR_SHMLOCK (5130)
- SQLITE_IOERR_SHMMAP (5386)
- SQLITE_IOERR_SHMOPEN (4618)
- SQLITE_IOERR_SHMSIZE (4874)
- SQLITE_IOERR_SHORT_READ (522)
- SQLITE_IOERR_TRUNCATE (1546)
- SQLITE_IOERR_UNLOCK (2058)
- SQLITE_IOERR_VNODE (6922)
- SQLITE_IOERR_WRITE (778)
- SQLITE_LOCKED_SHAREDCACHE (262)
- SQLITE_LOCKED_VTAB (518)
- SQLITE_NOTICE_RECOVER_ROLLBACK (539)
- SQLITE_NOTICE_RECOVER_WAL (283)
- SQLITE_OK_LOAD_PERMANENTLY (256)
- SQLITE_READONLY_CANTINIT (1288)
- SQLITE_READONLY_CANTLOCK (520)
- SQLITE_READONLY_DBMOVED (1032)
- SQLITE_READONLY_DIRECTORY (1544)
- SQLITE_READONLY_RECOVERY (264)
- SQLITE_READONLY_ROLLBACK (776)
- SQLITE_WARNING_AUTOINDEX (284)
6. Значения кодов результатов
Ниже приведены значения всех 105 кодов результатов в числовом порядке.
(0) SQLITE_OK
Код результата SQLITE_OK означает, что операция выполнена успешно и ошибок не возникло. Большинство других кодов результатов указывают на ошибку.
(1) SQLITE_ERROR
Код результата SQLITE_ERROR — это общий код ошибки, используемый, когда нет другого, более конкретного кода ошибки.
(2) SQLITE_INTERNAL
Код результата SQLITE_INTERNAL указывает на внутренний сбой. В работающей версии SQLite приложение никогда не должно получать этот код результата. Если приложение всё же получает этот код, значит, в ядре базы данных есть ошибка.
Этот код результата может быть вызван ошибкой в SQLite. Однако этот код также могут возвращать определённые приложением функции SQL, виртуальные таблицы, VFS и другие расширения, поэтому проблема может быть не связана с ядром SQLite.
(3) SQLITE_PERM
Код результата SQLITE_PERM указывает, что запрошенный режим доступа для вновь созданной базы данных не может быть предоставлен.
(4) SQLITE_ABORT
Код результата SQLITE_ABORT указывает, что операция была прервана до завершения, обычно по запросу приложения. См. также: SQLITE_INTERRUPT.
Если функция обратного вызова для sqlite3_exec() возвращает ненулевое значение, sqlite3_exec() вернёт SQLITE_ABORT.
Если операция ROLLBACK выполняется для того же подключения к базе данных, в котором ожидается чтение или запись, ожидающая операция чтения или записи может завершиться ошибкой SQLITE_ABORT или SQLITE_ABORT_ROLLBACK.
Помимо того, что SQLITE_ABORT является кодом результата, это значение также используется как режим разрешения конфликтов, возвращаемый интерфейсом sqlite3_vtab_on_conflict().
(5) SQLITE_BUSY
Код результата SQLITE_BUSY указывает, что в файл базы данных не удалось выполнить запись (а в некоторых случаях — чтение) из-за одновременной активности другого подключения к базе данных, обычно подключения из отдельного процесса.
Например, если процесс A выполняет крупную транзакцию записи и в это же время процесс B пытается начать новую транзакцию записи, процесс B получит SQLITE_BUSY, поскольку SQLite поддерживает только одного писателя одновременно. Процессу B придётся дождаться завершения транзакции процесса A, прежде чем начинать новую транзакцию. Для обработки ошибок SQLITE_BUSY процесс B может использовать интерфейсы sqlite3_busy_timeout() и sqlite3_busy_handler(), а также прагму busy_timeout.
Ошибка SQLITE_BUSY может возникнуть в любой момент транзакции: при её запуске, во время операций записи или обновления, а также при фиксации транзакции. Чтобы избежать ошибок SQLITE_BUSY в середине транзакции, приложение может использовать BEGIN IMMEDIATE вместо обычной команды BEGIN для начала транзакции. Команда BEGIN IMMEDIATE сама может вернуть SQLITE_BUSY, но если она выполнится успешно, SQLite гарантирует, что последующие операции с той же базой данных до следующей команды COMMIT не вернут SQLITE_BUSY.
См. также: SQLITE_BUSY_RECOVERY и SQLITE_BUSY_SNAPSHOT.
Код результата SQLITE_BUSY отличается от SQLITE_LOCKED: SQLITE_BUSY указывает на конфликт с отдельным подключением к базе данных, вероятно, из другого процесса, тогда как SQLITE_LOCKED указывает на конфликт в рамках того же подключения к базе данных (или иногда с подключением к базе данных, использующим общий кеш).
(6) SQLITE_LOCKED
Код результата SQLITE_LOCKED указывает, что операция записи не может продолжаться из-за конфликта в рамках того же подключения к базе данных или конфликта с другим подключением к базе данных, использующим общий кеш.
Например, оператор DROP TABLE нельзя выполнить, пока другой поток читает эту таблицу в том же подключении к базе данных, поскольку удаление таблицы лишило бы её параллельно работающий поток чтения.
Код результата SQLITE_LOCKED отличается от SQLITE_BUSY: SQLITE_LOCKED указывает на конфликт в том же подключении к базе данных (или в подключении с общим кешем), тогда как SQLITE_BUSY указывает на конфликт с другим подключением к базе данных, вероятно, из другого процесса.
(7) SQLITE_NOMEM
Код результата SQLITE_NOMEM указывает, что SQLite не удалось выделить всю память, необходимую для завершения операции. Иными словами, внутренний вызов sqlite3_malloc() или sqlite3_realloc() завершился неудачей в ситуации, когда выделяемая память была необходима для продолжения операции.
(8) SQLITE_READONLY
Код результата SQLITE_READONLY возвращается при попытке изменить данные, для которых у текущего подключения к базе данных нет разрешения на запись.
(9) SQLITE_INTERRUPT
Код результата SQLITE_INTERRUPT указывает, что операция была прервана интерфейсом sqlite3_interrupt(). См. также: SQLITE_ABORT.
(10) SQLITE_IOERR
Код результата SQLITE_IOERR означает, что операция не смогла завершиться, поскольку операционная система сообщила об ошибке ввода-вывода.
При полностью заполненном диске обычно возникает ошибка SQLITE_FULL, а не SQLITE_IOERR.
Существует множество различных расширенных кодов результатов ошибок ввода-вывода, указывающих конкретную операцию ввода-вывода, завершившуюся неудачей.
(11) SQLITE_CORRUPT
Код результата SQLITE_CORRUPT указывает, что файл базы данных повреждён. Дополнительные сведения о возможных причинах повреждения см. в разделе Как повредить файлы базы данных.
(12) SQLITE_NOTFOUND
Код результата SQLITE_NOTFOUND может проявляться тремя способами:
Интерфейс sqlite3_file_control() может вернуть SQLITE_NOTFOUND, чтобы указать, что базовая VFS не распознала код операции управления файлом, переданный в качестве третьего аргумента.
Метод xSetSystemCall() объекта sqlite3_vfs также может вернуть SQLITE_NOTFOUND.
Функция sqlite3_vtab_rhs_value() может вернуть SQLITE_NOTFOUND, чтобы указать, что правый операнд ограничения недоступен для вызвавшего функцию метода xBestIndex.
Код результата SQLITE_NOTFOUND также используется внутри реализации SQLite, но такое внутреннее использование не доступно приложению.
(13) SQLITE_FULL
Код результата SQLITE_FULL указывает, что запись не может быть завершена из-за нехватки места на диске. Обратите внимание: эта ошибка может возникнуть при записи информации в основной файл базы данных, а также при записи во временные файлы на диске.
Иногда приложения сталкиваются с этой ошибкой, хотя на основном диске достаточно места: ошибка возникает при записи во временные файлы на диске в системе, где временные файлы хранятся на отдельном разделе с гораздо меньшим объёмом свободного места.
(14) SQLITE_CANTOPEN
Код результата SQLITE_CANTOPEN указывает, что SQLite не удалось открыть файл. Этим файлом может быть основной файл базы данных или один из нескольких временных файлов на диске.
(15) SQLITE_PROTOCOL
Код результата SQLITE_PROTOCOL указывает на проблему с протоколом блокировки файлов, используемым SQLite. В настоящее время ошибка SQLITE_PROTOCOL возвращается только при использовании режима WAL и попытке начать новую транзакцию. При одновременной попытке двух отдельных подключений к базе данных начать транзакцию в режиме WAL может возникнуть состояние гонки. Проигравшее подключение отступает и повторяет попытку после небольшой задержки. Если одно и то же подключение проигрывает гонку за блокировку десятки раз в течение нескольких секунд, оно в конце концов прекращает попытки и возвращает SQLITE_PROTOCOL. На практике ошибка SQLITE_PROTOCOL должна возникать крайне редко и только тогда, когда множество отдельных процессов активно конкурируют за запись в одну базу данных.
(16) SQLITE_EMPTY
В настоящее время код результата SQLITE_EMPTY не используется.
(17) SQLITE_SCHEMA
Код результата SQLITE_SCHEMA указывает, что схема базы данных изменилась. Этот код результата может быть возвращён функцией sqlite3_step() для подготовленного оператора, созданного с помощью sqlite3_prepare() или sqlite3_prepare16(). Эта ошибка может возникнуть, если другой процесс изменил схему базы данных между подготовкой и выполнением оператора.
Если подготовленный оператор создан с помощью sqlite3_prepare_v2(), то при изменении схемы оператор подготавливается заново автоматически, до SQLITE_MAX_SCHEMA_RETRY раз (по умолчанию: 50). Интерфейс sqlite3_step() вернёт SQLITE_SCHEMA приложению только в том случае, если ошибка сохраняется после такого количества повторных попыток.
(18) SQLITE_TOOBIG
Код ошибки SQLITE_TOOBIG указывает, что строка или BLOB слишком велики. Максимальная длина строки или BLOB в SQLite по умолчанию составляет 1 000 000 000 байт. Это ограничение можно изменить во время компиляции с помощью параметра SQLITE_MAX_LENGTH или во время выполнения с помощью интерфейса sqlite3_limit(db,SQLITE_LIMIT_LENGTH,...). Ошибка SQLITE_TOOBIG возникает, если SQLite обнаруживает строку или BLOB, превышающие ограничение, заданное во время компиляции или выполнения.
Код ошибки SQLITE_TOOBIG также может возникнуть, если слишком большой оператор SQL передан одному из интерфейсов sqlite3_prepare_v2(). Максимальная длина оператора SQL по умолчанию составляет аналогичное значение — 1 000 000 000 байт. Максимальную длину оператора SQL можно задать во время компиляции с помощью SQLITE_MAX_SQL_LENGTH или во время выполнения с помощью sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,...).
(19) SQLITE_CONSTRAINT
Код ошибки SQLITE_CONSTRAINT означает, что при обработке оператора SQL произошло нарушение ограничения SQL. Дополнительную информацию о нарушенном ограничении можно получить из сопровождающего сообщения об ошибке (возвращаемого через sqlite3_errmsg() или sqlite3_errmsg16()) либо изучив расширенный код ошибки.
Код SQLITE_CONSTRAINT также может использоваться в качестве возвращаемого значения метода xBestIndex() реализации виртуальной таблицы. Если xBestIndex() возвращает SQLITE_CONSTRAINT, это означает, что данное сочетание входных данных, переданных в xBestIndex(), не позволяет создать пригодный план запроса и его не следует рассматривать дальше.
(20) SQLITE_MISMATCH
Код ошибки SQLITE_MISMATCH указывает на несоответствие типов данных.
Обычно SQLite весьма терпимо относится к несовпадению типа значения и объявленного типа контейнера, в котором это значение хранится. Например, SQLite позволяет приложению сохранить большой BLOB в столбце с объявленным типом BOOLEAN. Но в некоторых случаях SQLite строго проверяет типы. Ошибка SQLITE_MISMATCH возвращается в этих случаях, когда типы не совпадают.
Значение rowid таблицы должно быть целым числом. Попытка установить для rowid любое значение, кроме целого числа (или NULL, которое автоматически преобразуется в следующий доступный целочисленный rowid), приводит к ошибке SQLITE_MISMATCH.
(21) SQLITE_MISUSE
Код возврата SQLITE_MISUSE может быть возвращён, если приложение использует какой-либо интерфейс SQLite способом, который не определён или не поддерживается. Например, использование подготовленного оператора после его завершения может привести к ошибке SQLITE_MISUSE.
SQLite пытается обнаруживать неправильное использование и сообщать о нём с помощью этого кода результата. Однако нет гарантии, что обнаружение будет успешным. Обнаружение неправильного использования носит вероятностный характер. Приложения не должны полагаться на получение SQLITE_MISUSE.
Если SQLite когда-либо возвращает SQLITE_MISUSE из любого интерфейса, это означает, что код приложения написан неправильно и его необходимо исправить. Не выпускайте приложение, которое иногда возвращает SQLITE_MISUSE из стандартного интерфейса SQLite, поскольку такое приложение содержит потенциально серьёзные ошибки.
(22) SQLITE_NOLFS
Ошибка SQLITE_NOLFS может возвращаться в системах, не поддерживающих большие файлы, когда база данных становится больше, чем может обработать файловая система. «NOLFS» означает «NO Large File Support» («нет поддержки больших файлов»).
(23) SQLITE_AUTH
Ошибка SQLITE_AUTH возвращается, когда функция обратного вызова авторизатора указывает, что подготавливаемый оператор SQL не авторизован.
(24) SQLITE_FORMAT
В настоящее время SQLite не использует код ошибки SQLITE_FORMAT.
(25) SQLITE_RANGE
Ошибка SQLITE_RANGE указывает, что аргумент с номером параметра одной из процедур sqlite3_bind или номер столбца одной из процедур sqlite3_column находится вне допустимого диапазона.
(26) SQLITE_NOTADB
При попытке открыть файл ошибка SQLITE_NOTADB указывает, что открываемый файл, по-видимому, не является файлом базы данных SQLite.
(27) SQLITE_NOTICE
Ни один интерфейс C/C++ не возвращает код результата SQLITE_NOTICE. Однако SQLITE_NOTICE (точнее, один из его расширенных кодов ошибок) иногда используется в качестве первого аргумента обратного вызова sqlite3_log(), чтобы указать на выполнение необычной операции.
(28) SQLITE_WARNING
Ни один интерфейс C/C++ не возвращает код результата SQLITE_WARNING. Однако SQLITE_WARNING (точнее, один из его расширенных кодов ошибок) иногда используется в качестве первого аргумента обратного вызова sqlite3_log(), чтобы указать на выполнение необычной и, возможно, не рекомендуемой операции.
(100) SQLITE_ROW
Код результата SQLITE_ROW, возвращаемый функцией sqlite3_step(), указывает, что доступна ещё одна строка результата.
(101) SQLITE_DONE
Код результата SQLITE_DONE указывает, что операция завершена. Чаще всего код SQLITE_DONE возвращается функцией sqlite3_step() и означает, что выполнение оператора SQL завершилось. Однако SQLITE_DONE также могут возвращать другие многошаговые интерфейсы, например sqlite3_backup_step().
(256) SQLITE_OK_LOAD_PERMANENTLY
Интерфейс sqlite3_load_extension() загружает расширение в одно подключение к базе данных. По умолчанию это расширение автоматически выгружается при закрытии подключения к базе данных. Однако если точка входа расширения возвращает SQLITE_OK_LOAD_PERMANENTLY вместо SQLITE_OK, расширение остаётся загруженным в адресное пространство процесса после закрытия подключения к базе данных. Иными словами, при закрытии подключения к базе данных метод xDlClose объекта sqlite3_vfs для этого расширения не вызывается.
Код возврата SQLITE_OK_LOAD_PERMANENTLY полезен, например, для загружаемых расширений, регистрирующих новые VFS.
(257) SQLITE_ERROR_MISSING_COLLSEQ
Код результата SQLITE_ERROR_MISSING_COLLSEQ означает, что оператор SQL не удалось подготовить, поскольку не удалось найти указанную в нём последовательность сортировки.
Иногда при возникновении этой ошибки процедура sqlite3_prepare_v2() преобразует её в SQLITE_ERROR_RETRY и повторяет подготовку оператора SQL, используя другой план запроса, для которого не требуется неизвестная последовательность сортировки.
(261) SQLITE_BUSY_RECOVERY
Код ошибки SQLITE_BUSY_RECOVERY — это расширенный код ошибки для SQLITE_BUSY, указывающий, что операция не может продолжаться, поскольку другой процесс занят восстановлением файла базы данных в режиме WAL после сбоя. Код ошибки SQLITE_BUSY_RECOVERY возникает только для баз данных в режиме WAL.
(262) SQLITE_LOCKED_SHAREDCACHE
Код результата SQLITE_LOCKED_SHAREDCACHE указывает, что доступ к записи данных SQLite заблокирован другим подключением к базе данных, использующим ту же запись в режиме общего кеша. Когда два или более подключения к базе данных используют общий кеш и одно из подключений изменяет запись в этом кеше, остальные подключения не могут обращаться к этим данным, пока изменения не завершены. Это необходимо, чтобы читающие подключения не видели повреждённые или частично изменённые данные.
(264) SQLITE_READONLY_RECOVERY
Код ошибки SQLITE_READONLY_RECOVERY является расширенным кодом ошибки для SQLITE_READONLY. Код ошибки SQLITE_READONLY_RECOVERY указывает, что базу данных в режиме WAL невозможно открыть, поскольку файл базы данных необходимо восстановить, а для восстановления требуется доступ на запись, но доступен только доступ на чтение.
(266) SQLITE_IOERR_READ
Код ошибки SQLITE_IOERR_READ является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в слое VFS при попытке чтения файла с диска. Эта ошибка может быть вызвана аппаратной неисправностью или размонтированием файловой системы, пока файл был открыт.
(267) SQLITE_CORRUPT_VTAB
Код ошибки SQLITE_CORRUPT_VTAB является расширенным кодом ошибки для SQLITE_CORRUPT, используемым виртуальными таблицами. Виртуальная таблица может вернуть SQLITE_CORRUPT_VTAB, чтобы указать на повреждение содержимого виртуальной таблицы.
(270) SQLITE_CANTOPEN_NOTEMPDIR
Код ошибки SQLITE_CANTOPEN_NOTEMPDIR больше не используется.
(275) SQLITE_CONSTRAINT_CHECK
Код ошибки SQLITE_CONSTRAINT_CHECK является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает на нарушение ограничения CHECK.
(279) SQLITE_AUTH_USER
Код ошибки SQLITE_AUTH_USER является расширенным кодом ошибки для SQLITE_AUTH и указывает, что была предпринята попытка выполнить операцию с базой данных, на которую у вошедшего в систему пользователя недостаточно прав.
(283) SQLITE_NOTICE_RECOVER_WAL
Код результата SQLITE_NOTICE_RECOVER_WAL передаётся функции обратного вызова sqlite3_log() при восстановлении файла базы данных в режиме WAL.
(284) SQLITE_WARNING_AUTOINDEX
Код результата SQLITE_WARNING_AUTOINDEX передаётся функции обратного вызова sqlite3_log() при каждом использовании автоматической индексации. Это может служить предупреждением разработчикам приложения о том, что базе данных могут быть полезны дополнительные индексы.
(513) SQLITE_ERROR_RETRY
SQLITE_ERROR_RETRY используется внутри SQLite, чтобы побудить sqlite3_prepare_v2() (или одну из родственных процедур создания подготовленных инструкций) повторить подготовку инструкции, при предыдущей попытке подготовить которую произошла ошибка.
(516) SQLITE_ABORT_ROLLBACK
Код ошибки SQLITE_ABORT_ROLLBACK является расширенным кодом ошибки для SQLITE_ABORT и указывает, что инструкция SQL была прервана из-за отката транзакции, активной на момент первого запуска инструкции SQL. При откате ожидающие операции записи всегда завершаются этой ошибкой. ROLLBACK приведёт к сбою ожидающей операции чтения только в том случае, если схема была изменена в откатываемой транзакции.
(517) SQLITE_BUSY_SNAPSHOT
Код ошибки SQLITE_BUSY_SNAPSHOT является расширенным кодом ошибки для SQLITE_BUSY. Он возникает в базах данных в режиме WAL, когда подключение к базе данных пытается преобразовать транзакцию чтения в транзакцию записи, но обнаруживает, что другое подключение к базе данных уже выполнило запись в базу данных и тем самым сделало предыдущие чтения недействительными.
Следующий сценарий показывает, как может возникнуть ошибка SQLITE_BUSY_SNAPSHOT:
- Процесс A начинает транзакцию чтения в базе данных и выполняет одну или несколько инструкций SELECT. Процесс A оставляет транзакцию открытой.
- Процесс B обновляет базу данных, изменяя значения, ранее прочитанные процессом A.
- Теперь процесс A пытается выполнить запись в базу данных. Однако представление содержимого базы данных, доступное процессу A, уже устарело, поскольку процесс B изменил файл базы данных после того, как процесс A прочитал его. Поэтому процесс A получает ошибку SQLITE_BUSY_SNAPSHOT.
(518) SQLITE_LOCKED_VTAB
Код результата SQLITE_LOCKED_VTAB не используется ядром SQLite, но доступен для использования расширениями. Реализации виртуальных таблиц могут возвращать этот код результата, чтобы указать, что они не могут завершить текущую операцию из-за блокировок, удерживаемых другими потоками или процессами.
Расширение R-Tree возвращает этот код результата при попытке обновить R-Tree, пока другая подготовленная инструкция активно читает R-Tree. Продолжить обновление невозможно, поскольку любое изменение R-Tree может потребовать перестановки и ребалансировки узлов, что нарушит работу курсоров чтения: некоторые строки будут повторены, а другие пропущены.
(520) SQLITE_READONLY_CANTLOCK
Код ошибки SQLITE_READONLY_CANTLOCK является расширенным кодом ошибки для SQLITE_READONLY. Код ошибки SQLITE_READONLY_CANTLOCK указывает, что SQLite не может получить блокировку чтения для базы данных в режиме WAL, поскольку связанный с этой базой данных файл общей памяти доступен только для чтения.
(522) SQLITE_IOERR_SHORT_READ
Код ошибки SQLITE_IOERR_SHORT_READ является расширенным кодом ошибки для SQLITE_IOERR и указывает, что попытка чтения в слое VFS не позволила получить запрошенное количество байтов. Это может быть вызвано усечением файла.
(523) SQLITE_CORRUPT_SEQUENCE
Код результата SQLITE_CORRUPT_SEQUENCE означает, что схема таблицы sqlite_sequence повреждена. Таблица sqlite_sequence используется для поддержки функции AUTOINCREMENT. Таблица sqlite_sequence должна иметь следующий формат:
CREATE TABLE sqlite_sequence(name,seq);
Если SQLite обнаруживает, что таблица sqlite_sequence имеет какой-либо другой формат, она возвращает ошибку SQLITE_CORRUPT_SEQUENCE.
(526) SQLITE_CANTOPEN_ISDIR
Код ошибки SQLITE_CANTOPEN_ISDIR является расширенным кодом ошибки для SQLITE_CANTOPEN и указывает, что операция открытия файла завершилась неудачно, поскольку на самом деле файл является каталогом.
(531) SQLITE_CONSTRAINT_COMMITHOOK
Код ошибки SQLITE_CONSTRAINT_COMMITHOOK является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает, что функция обратного вызова обработчика фиксации вернула ненулевое значение, из-за чего инструкция SQL была отменена.
(539) SQLITE_NOTICE_RECOVER_ROLLBACK
Код результата SQLITE_NOTICE_RECOVER_ROLLBACK передаётся функции обратного вызова sqlite3_log() при откате горячего журнала.
(769) SQLITE_ERROR_SNAPSHOT
Код результата SQLITE_ERROR_SNAPSHOT может быть возвращён при попытке начать транзакцию чтения для исторической версии базы данных с помощью интерфейса sqlite3_snapshot_open(). Если исторический снимок больше недоступен, транзакция чтения завершится ошибкой SQLITE_ERROR_SNAPSHOT. Этот код ошибки возможен только в том случае, если SQLite скомпилирована с параметром -DSQLITE_ENABLE_SNAPSHOT.
(773) SQLITE_BUSY_TIMEOUT
Код ошибки SQLITE_BUSY_TIMEOUT указывает, что запрос блокирующей рекомендательной файловой блокировки Posix в слое VFS завершился неудачно из-за истечения времени ожидания. Блокирующие рекомендательные блокировки Posix доступны только как проприетарное расширение SQLite и поддерживаются лишь в том случае, если SQLite скомпилирована с параметром времени компиляции SQLITE_ENABLE_SETLK_TIMEOUT.
(776) SQLITE_READONLY_ROLLBACK
Код ошибки SQLITE_READONLY_ROLLBACK является расширенным кодом ошибки для SQLITE_READONLY. Код ошибки SQLITE_READONLY_ROLLBACK указывает, что базу данных невозможно открыть, поскольку в ней есть горячий журнал, который необходимо откатить, но это невозможно, так как база данных доступна только для чтения.
(778) SQLITE_IOERR_WRITE
Код ошибки SQLITE_IOERR_WRITE является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в слое VFS при попытке записи в файл на диске. Эта ошибка может быть вызвана аппаратной неисправностью или размонтированием файловой системы, пока файл был открыт. Эта ошибка не должна возникать при заполнении файловой системы, поскольку для этого предусмотрен отдельный код ошибки (SQLITE_FULL).
(779) SQLITE_CORRUPT_INDEX
Код результата SQLITE_CORRUPT_INDEX означает, что SQLite обнаружила отсутствие или потерю записи в индексе. Это частный случай кода ошибки SQLITE_CORRUPT, который указывает, что проблему можно устранить командой REINDEX, если в других частях файла базы данных нет иных проблем.
(782) SQLITE_CANTOPEN_FULLPATH
Код ошибки SQLITE_CANTOPEN_FULLPATH является расширенным кодом ошибки для SQLITE_CANTOPEN и указывает, что операция открытия файла завершилась неудачно, поскольку операционной системе не удалось преобразовать имя файла в полный путь.
(787) SQLITE_CONSTRAINT_FOREIGNKEY
Код ошибки SQLITE_CONSTRAINT_FOREIGNKEY является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает на нарушение ограничения внешнего ключа.
(1032) SQLITE_READONLY_DBMOVED
Код ошибки SQLITE_READONLY_DBMOVED является расширенным кодом ошибки для SQLITE_READONLY. Код ошибки SQLITE_READONLY_DBMOVED указывает, что базу данных невозможно изменить, поскольку файл базы данных был перемещён после открытия. Поэтому попытка изменить базу данных может привести к её повреждению в случае сбоя процесса, так как журнал отката будет иметь неправильное имя.
(1034) SQLITE_IOERR_FSYNC
Код ошибки SQLITE_IOERR_FSYNC является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в слое VFS при попытке сбросить ранее записанное содержимое из буферов операционной системы и/или контроллера диска в постоянное хранилище. Иными словами, этот код указывает на проблему с системным вызовом fsync() в Unix или системным вызовом FlushFileBuffers() в Windows.
(1038) SQLITE_CANTOPEN_CONVPATH
Код ошибки SQLITE_CANTOPEN_CONVPATH является расширенным кодом ошибки для SQLITE_CANTOPEN. Он используется только в Cygwin VFS и указывает, что системный вызов cygwin_conv_path() завершился неудачно при попытке открыть файл. См. также: SQLITE_IOERR_CONVPATH
(1043) SQLITE_CONSTRAINT_FUNCTION
Код ошибки SQLITE_CONSTRAINT_FUNCTION в настоящее время не используется ядром SQLite. Однако этот код ошибки доступен для использования функциями расширений.
(1288) SQLITE_READONLY_CANTINIT
Код результата SQLITE_READONLY_CANTINIT возникает в методе xShmMap объекта VFS и указывает, что область общей памяти, используемая режимом WAL, существует, но её содержимое ненадёжно и непригодно для текущего процесса, поскольку у него нет разрешения на запись в область общей памяти. (Область общей памяти для режима WAL обычно представляет собой файл с суффиксом «-wal», отображённый в адресное пространство процесса. Если у текущего процесса нет разрешения на запись в этот файл, он не может записывать данные в общую память.)
Логика SQLite более высокого уровня обычно перехватывает этот код ошибки и создаёт временную область общей памяти в памяти, чтобы текущий процесс мог хотя бы читать содержимое базы данных. Этот код результата не должен доходить до уровня интерфейса приложения.
(1290) SQLITE_IOERR_DIR_FSYNC
Код ошибки SQLITE_IOERR_DIR_FSYNC является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в слое VFS при попытке вызвать fsync() для каталога. Unix-реализация VFS пытается вызвать fsync() для каталогов после создания или удаления определённых файлов, чтобы гарантировать, что эти файлы останутся в файловой системе после отключения питания или сбоя системы. Этот код ошибки указывает на проблему при выполнении такого вызова fsync().
(1294) SQLITE_CANTOPEN_DIRTYWAL
Код результата SQLITE_CANTOPEN_DIRTYWAL в настоящее время не используется.
(1299) SQLITE_CONSTRAINT_NOTNULL
Код ошибки SQLITE_CONSTRAINT_NOTNULL является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает на нарушение ограничения NOT NULL.
(1544) SQLITE_READONLY_DIRECTORY
Код результата SQLITE_READONLY_DIRECTORY указывает, что база данных доступна только для чтения, поскольку у процесса нет разрешения на создание файла журнала в том же каталоге, что и база данных, а создание файла журнала является необходимым условием для записи.
(1546) SQLITE_IOERR_TRUNCATE
Код ошибки SQLITE_IOERR_TRUNCATE является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в слое VFS при попытке изменить размер файла с помощью метода xTruncate объекта sqlite3_io_methods.
(1550) SQLITE_CANTOPEN_SYMLINK
Код результата SQLITE_CANTOPEN_SYMLINK возвращается интерфейсом sqlite3_open() и его аналогами, если указан флаг SQLITE_OPEN_NOFOLLOW, а файл базы данных является символической ссылкой.
(1555) SQLITE_CONSTRAINT_PRIMARYKEY
Код ошибки SQLITE_CONSTRAINT_PRIMARYKEY является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает на нарушение ограничения PRIMARY KEY.
(1802) SQLITE_IOERR_FSTAT
Код ошибки SQLITE_IOERR_FSTAT является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в слое VFS при попытке вызвать fstat() (или аналогичную функцию) для файла, чтобы определить такие сведения, как размер файла или права доступа.
(1811) SQLITE_CONSTRAINT_TRIGGER
Код ошибки SQLITE_CONSTRAINT_TRIGGER является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает, что в триггере сработала функция RAISE, вызвав прерывание инструкции SQL.
(2058) SQLITE_IOERR_UNLOCK
Код ошибки SQLITE_IOERR_UNLOCK является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xUnlock объекта sqlite3_io_methods.
(2067) SQLITE_CONSTRAINT_UNIQUE
Код ошибки SQLITE_CONSTRAINT_UNIQUE является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает на нарушение ограничения UNIQUE.
(2314) SQLITE_IOERR_RDLOCK
Код ошибки SQLITE_IOERR_RDLOCK является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xLock объекта sqlite3_io_methods при попытке получить блокировку чтения.
(2323) SQLITE_CONSTRAINT_VTAB
Код ошибки SQLITE_CONSTRAINT_VTAB в настоящее время не используется ядром SQLite. Однако этот код ошибки доступен для использования в определённых приложением виртуальных таблицах.
(2570) SQLITE_IOERR_DELETE
Код ошибки SQLITE_IOERR_DELETE является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xDelete объекта sqlite3_vfs.
(2579) SQLITE_CONSTRAINT_ROWID
Код ошибки SQLITE_CONSTRAINT_ROWID является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает, что значение rowid не является уникальным.
(2826) SQLITE_IOERR_BLOCKED
Код ошибки SQLITE_IOERR_BLOCKED больше не используется.
(2835) SQLITE_CONSTRAINT_PINNED
Код ошибки SQLITE_CONSTRAINT_PINNED является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает, что триггер UPDATE попытался удалить строку, которая обновлялась в ходе выполнения операции обновления.
(3082) SQLITE_IOERR_NOMEM
Код ошибки SQLITE_IOERR_NOMEM иногда возвращается слоем VFS, чтобы указать, что операцию не удалось завершить из-за невозможности выделить достаточно памяти. Обычно более высокие уровни SQLite преобразуют этот код ошибки в SQLITE_NOMEM, прежде чем вернуть его приложению.
(3091) SQLITE_CONSTRAINT_DATATYPE
Код ошибки SQLITE_CONSTRAINT_DATATYPE является расширенным кодом ошибки для SQLITE_CONSTRAINT и указывает, что при вставке или обновлении была предпринята попытка сохранить значение, несовместимое с объявленным типом столбца в таблице, определённой как STRICT.
(3338) SQLITE_IOERR_ACCESS
Код ошибки SQLITE_IOERR_ACCESS является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xAccess объекта sqlite3_vfs.
(3594) SQLITE_IOERR_CHECKRESERVEDLOCK
Код ошибки SQLITE_IOERR_CHECKRESERVEDLOCK является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xCheckReservedLock объекта sqlite3_io_methods.
(3850) SQLITE_IOERR_LOCK
Код ошибки SQLITE_IOERR_LOCK является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в логике рекомендательной блокировки файлов. Обычно ошибка SQLITE_IOERR_LOCK указывает на проблему с получением ожидающей блокировки. Однако в некоторых специализированных реализациях VFS, используемых на компьютерах Mac, она также может указывать на различные ошибки блокировки.
(4106) SQLITE_IOERR_CLOSE
Код ошибки SQLITE_IOERR_CLOSE является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xClose объекта sqlite3_io_methods.
(4362) SQLITE_IOERR_DIR_CLOSE
Код ошибки SQLITE_IOERR_DIR_CLOSE больше не используется.
(4618) SQLITE_IOERR_SHMOPEN
Код ошибки SQLITE_IOERR_SHMOPEN является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке открыть новый сегмент общей памяти.
(4874) SQLITE_IOERR_SHMSIZE
Код ошибки SQLITE_IOERR_SHMSIZE является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке увеличить размер файла «shm» в ходе обработки транзакции в режиме WAL. Эта ошибка может указывать на то, что на томе файловой системы закончилось место.
(5130) SQLITE_IOERR_SHMLOCK
Код ошибки SQLITE_IOERR_SHMLOCK больше не используется.
(5386) SQLITE_IOERR_SHMMAP
Код ошибки SQLITE_IOERR_SHMMAP является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методе xShmMap объекта sqlite3_io_methods при попытке отобразить сегмент общей памяти в адресное пространство процесса.
(5642) SQLITE_IOERR_SEEK
Код ошибки SQLITE_IOERR_SEEK является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методах xRead или xWrite объекта sqlite3_io_methods при попытке переместить файловый дескриптор в начало участка файла, где должно выполняться чтение или запись.
(5898) SQLITE_IOERR_DELETE_NOENT
Код ошибки SQLITE_IOERR_DELETE_NOENT является расширенным кодом ошибки для SQLITE_IOERR и указывает, что метод xDelete объекта sqlite3_vfs завершился неудачно, поскольку удаляемый файл не существует.
(6154) SQLITE_IOERR_MMAP
Код ошибки SQLITE_IOERR_MMAP является расширенным кодом ошибки для SQLITE_IOERR и указывает на ошибку ввода-вывода в методах xFetch или xUnfetch объекта sqlite3_io_methods при попытке отобразить или отменить отображение части файла базы данных в адресное пространство процесса.
(6410) SQLITE_IOERR_GETTEMPPATH
Код ошибки SQLITE_IOERR_GETTEMPPATH является расширенным кодом ошибки для SQLITE_IOERR и указывает, что VFS не может определить подходящий каталог для размещения временных файлов.
(6666) SQLITE_IOERR_CONVPATH
Код ошибки SQLITE_IOERR_CONVPATH является расширенным кодом ошибки для SQLITE_IOERR. Он используется только в Cygwin VFS и указывает, что системный вызов cygwin_conv_path() завершился неудачно. См. также: SQLITE_CANTOPEN_CONVPATH
(6922) SQLITE_IOERR_VNODE
Код ошибки SQLITE_IOERR_VNODE зарезервирован для использования расширениями. Ядро SQLite его не использует.
(7178) SQLITE_IOERR_AUTH
Код ошибки SQLITE_IOERR_AUTH зарезервирован для использования расширениями. Ядро SQLite его не использует.
(7434) SQLITE_IOERR_BEGIN_ATOMIC
Код ошибки SQLITE_IOERR_BEGIN_ATOMIC указывает, что базовая операционная система сообщила об ошибке при выполнении файловой управляющей операции SQLITE_FCNTL_BEGIN_ATOMIC_WRITE. Это возможно только при включённом параметре SQLITE_ENABLE_ATOMIC_WRITE и размещении базы данных в файловой системе, поддерживающей атомарную запись.
(7690) SQLITE_IOERR_COMMIT_ATOMIC
Код ошибки SQLITE_IOERR_COMMIT_ATOMIC указывает, что базовая операционная система сообщила об ошибке при выполнении файловой управляющей операции SQLITE_FCNTL_COMMIT_ATOMIC_WRITE. Это возможно только при включённом параметре SQLITE_ENABLE_ATOMIC_WRITE и размещении базы данных в файловой системе, поддерживающей атомарную запись.
(7946) SQLITE_IOERR_ROLLBACK_ATOMIC
Код ошибки SQLITE_IOERR_ROLLBACK_ATOMIC указывает, что базовая операционная система сообщила об ошибке при выполнении файловой управляющей операции SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE. Это возможно только при включённом параметре SQLITE_ENABLE_ATOMIC_WRITE и размещении базы данных в файловой системе, поддерживающей атомарную запись.
(8202) SQLITE_IOERR_DATA
Код ошибки SQLITE_IOERR_DATA является расширенным кодом ошибки для SQLITE_IOERR и используется только прослойкой VFS для проверки контрольных сумм, чтобы указать, что контрольная сумма страницы файла базы данных неверна.
(8458) SQLITE_IOERR_CORRUPTFS
Код ошибки SQLITE_IOERR_CORRUPTFS является расширенным кодом ошибки для SQLITE_IOERR и используется только VFS, чтобы указать, что ошибка позиционирования или чтения вызвана выходом запрошенной области за границы файла, а не обычным сбоем устройства. Часто это указывает на повреждение файловой системы.
Последнее обновление этой страницы: 2026-02-18 11:56:50Z
SQLite is in the Public Domain.
https://sqlite.org/rescode.html