Spec-Zone.ru › SQLite

Флаги функций

#define SQLITE_DETERMINISTIC    0x000000800
#define SQLITE_DIRECTONLY       0x000080000
#define SQLITE_SUBTYPE          0x000100000
#define SQLITE_INNOCUOUS        0x000200000
#define SQLITE_RESULT_SUBTYPE   0x001000000
#define SQLITE_SELFORDER1       0x002000000

Эти константы могут быть объединены с помощью операции OR с предпочтительным кодированием текста в качестве четвертого аргумента для sqlite3_create_function(), sqlite3_create_function16() или sqlite3_create_function_v2().

SQLITE_DETERMINISTIC
Флаг SQLITE_DETERMINISTIC означает, что новая функция всегда возвращает одинаковый результат при одинаковых входных параметрах. Например, функция abs() является детерминированной, но функция randomblob() — нет. Функции должны быть детерминированными, чтобы их можно было использовать в определённых контекстах, таких как в условии WHERE частичных индексов или в генерируемых столбцах. SQLite также может оптимизировать детерминированные функции, вынося их за пределы внутренних циклов.

SQLITE_DIRECTONLY
Флаг SQLITE_DIRECTONLY означает, что функция может вызываться только из верхнего уровня SQL и не может использоваться в представлении или триггере, а также в структурах схемы, таких как ограничения CHECK, умолчания по умолчанию, индексы выражений, частичные индексы или генерируемые столбцы.

Флаг SQLITE_DIRECTONLY рекомендуется для любой приложением-определённой SQL-функции, имеющей побочные эффекты или потенциально раскрывающей конфиденциальную информацию. Это предотвратит атаки, в которых приложение вынуждено использовать базу данных, чья схема была тайно изменена для вызова определённой приложением функции вредным способом.

Некоторые считают хорошей практикой устанавливать SQLITE_DIRECTONLY для всех приложением-определённых SQL-функций, независимо от того, являются ли они чувствительными к безопасности, поскольку это предотвращает использование этих функций внутри схемы базы данных и гарантирует, что базу данных можно инспектировать и изменять с помощью общих инструментов (например, CLI), которые не имеют доступа к приложением-определённым функциям.

SQLITE_INNOCUOUS
Флаг SQLITE_INNOCUOUS означает, что функция, скорее всего, не вызовет проблем, даже если она будет использоваться неправильно. Невинная функция не должна иметь побочных эффектов и не должна зависеть от значений, кроме входных параметров. Примером невинной функции является функция abs(). Функция load_extension() не является невинной из-за её побочных эффектов.

SQLITE_INNOCUOUS похож на SQLITE_DETERMINISTIC, но не идентичен ему. Функция random() является примером функции, которая является невинной, но не детерминированной.

Некоторые расширенные настройки безопасности (SQLITE_DBCONFIG_TRUSTED_SCHEMA и PRAGMA trusted_schema=OFF) отключают использование SQL-функций в представлениях и триггерах, а также в структурах схемы, таких как ограничения CHECK, умолчания по умолчанию, индексы выражений, частичные индексы и генерируемые столбцы, если функция не помечена флагом SQLITE_INNOCUOUS. Большинство встроенных функций являются невинными. Разработчикам рекомендуется избегать использования флага SQLITE_INNOCUOUS для функций, определённых приложением, если функция не была тщательно проверена и не была выявлена как свободная от потенциально небезопасных побочных эффектов и утечек информации.

SQLITE_SUBTYPE
Флаг SQLITE_SUBTYPE указывает SQLite, что функция может вызвать sqlite3_value_subtype() для проверки подтипов своих аргументов. Этот флаг инструктирует SQLite опустить некоторые оптимизации краевых случаев, которые могут нарушить работу функции sqlite3_value_subtype(), заставляя её возвращать ноль вместо правильного подтипа(). Все SQL-функции, которые вызывают sqlite3_value_subtype(), должны иметь это свойство. Если свойство SQLITE_SUBTYPE опущено, то возвращаемое значение sqlite3_value_subtype() может иногда быть нулём, даже если функция аргумента выражения задала ненулевой подтип.

SQLITE_RESULT_SUBTYPE
Флаг SQLITE_RESULT_SUBTYPE указывает SQLite, что функция может вызвать sqlite3_result_subtype() для присвоения подтипа к своему результату. Каждая функция, вызывающая sqlite3_result_subtype(), должна иметь это свойство. Если это не так, то вызов sqlite3_result_subtype() может стать недействующим, если функция используется в выражении индекса. С другой стороны, SQL-функции, которые никогда не вызывают sqlite3_result_subtype(), должны избегать установки этого свойства, так как цель этого свойства — отключение определённых оптимизаций, несовместимых с подтипами.

SQLITE_SELFORDER1
Флаг SQLITE_SELFORDER1 указывает, что функция является агрегатной, которая внутри сортирует значения, предоставляемые первому аргументу. Для вызова этой функции можно использовать синтаксис агрегатов упорядоченного набора со единственным оператором ORDER BY. Если синтаксис агрегата упорядоченного набора используется для функции, у которой нет этого флага, то генерируется ошибка. Обратите внимание, что синтаксис агрегата упорядоченного набора доступен только если SQLite был скомпилирован с помощью опции времени компиляции -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES.

См. также списки объектов, констант и функций.

SQLite is in the Public Domain.
https://sqlite.org/c3ref/c_deterministic.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API