![]() |
|
|||
WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Функции SQL в SQLite могут
быть детерминированными и недетерминированными. Детерминированные функции всегда дают тот же самый ответ, когда у этого
есть те же самые входы. Большинство встроенных функций SQL в SQLite
детерминировано. Например, abs(X)
всегда дает тот же самый ответ, пока вход X является тем же самым. Недетерминированные функции могли бы дать различные ответы на каждом
вызове, даже если аргументы всегда те же самые.
Ниже приводятся примеры недетерминированных функций: random()
очевидно недетерминирована, потому что она дает различный ответ
каждый раз, когда она вызвана. Ответы от
changes() и
last_insert_rowid()
зависят от предшествующих SQL-операторов, и таким образом, они также
недетерминированы. sqlite3_version()
главным образом постоянная, но это может измениться, когда SQLite
модернизирован, и поэтому даже при том, что это всегда дает тот же самый
ответ для какой-то конкретной сессии, потому что это может изменить ответы
через сессии, это все еще считают недетерминированным. Есть некоторые контексты в SQLite, которые не позволяют
использование недетерминированных функций: В случаях выше, значения, возвращенные функцией, затрагивают информацию,
хранившую в файле базы данных. Значения функций в ограничениях CHECK
определяют, какие записи действительны для таблицы,
функции в операторе Where частичного индекса или в индексе по выражению
вычисляют значения, сохраненные в b-дереве индекса. Если любая из этих
функций позже вернет иное значение,
то база данных больше не может быть правильно построена.
Следовательно, чтобы избежать повреждения базы данных, только
детерминированные функции могут использоваться в контекстах выше.
Встроенные функции даты/времени
SQLite это особый случай. Эти функции обычно считают детерминированными.
Однако, если эти функции используют последовательность "now"
в качестве даты, если они используют
модификатор localtime или
модификатор utc,
тогда их считают недетерминированными. Поскольку входы функции не обязательно
известны до времени выполнения функции даты/времени бросят исключение, если
они столкнутся с какой-либо из недетерминированных особенностей в контексте,
где только детерминированные функции позволены. До SQLite 3.20.0 (2017-08-01) все функции даты/времени всегда считали
недетерминированными. Способность функций даты/времени иногда быть
детерминированными и недетерминированными в других случаях, в зависимости от
их аргументов, была добавлена в версии 3.20.0. Когда улучшение было сделано в SQLite 3.20.0 таким образом, что функции
даты/времени будут считать детерминированными, поскольку они не зависят от
текущего времени, один случай был пропущен: многие функции даты/времени могут
быть вызваны без аргументов вообще.
Эти функции даты/времени без аргументов ведут себя, как будто у них был
единственный аргумент "'now'". Таким образом,
"datetime()" и "datetime('now')"
приводят к текущей дате и времени. Однако, только вторая форма была признана
недетерминированной. Это означало, что разработчики могли
применить недетерминированную форму
"datetime()" в ограничении CHECK, выражениях индекса
и подобных местах, где недетерминированные функции не имеют никакого смысла.
Это было исправлено в версии 3.35.2 (2021-03-17).
Однако, в обращении могут быть унаследованные базы данных, которые были
созданы версией SQLite с 3.20.0 по 3.35.1,
у которых есть недетерминированные функции даты/времени в их схемах. По умолчанию определенные применением функции SQL
считаются недетерминированными. Однако, если 4-й параметр
sqlite3_create_function_v2() OR с
SQLITE_DETERMINISTIC, SQLite будет рассматривать ту функцию, как будто
это было детерминировано. Отметьте что, если недетерминированная функция помечена
SQLITE_DETERMINISTIC и если та функция использовалась в операторе Where
частичного индекса или в
индексе выражения,
то, когда функция начинает давать различные ответы, связанный индекс может
стать поврежденным. Если функция SQL почти детерминирована (если она только
редко изменяется, как, например,
sqlite_version()) и она используется в индексе, который становится
поврежденным, повреждение может быть исправлено через
REINDEX. Интерфейсы, необходимые, чтобы построить функцию, которая иногда
детерминирована и иногда недетерминирована в зависимости от их входов, как
встроенные функции дата/время, не издаются.
Определенные универсальным приложением функции SQL
всегда должны быть детерминированы или недетерминированы.
Choose any three.
1. Обзор
2. Ограничения на использование недетерминированных функций
3.
Обработка особого случая для функций даты/времени
3.1.
Ошибка исправлена в версии 3.35.2
4.
Определенные применением детерминированные функции