RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

SQLite C Interface

Определите, является ли запрос виртуальной таблицы DISTINCT

int sqlite3_vtab_distinct(sqlite3_index_info*);

API может использоваться только из метода xBestIndex вритуальной таблицы. Результат запроса этого интерфейса за пределами xBestIndex() не определен и вероятно вреден.

sqlite3_vtab_distinct() возвращает целое число между 0 и 3. Целое число, возвращенное sqlite3_vtab_distinct(), дает дополнительную информацию виртуальную таблицы о том, как планировщик запроса хочет, чтобы вывод был упорядочен. Пока виртуальная таблица может ответить требованиям порядка планировщика запроса, он может установить флаг "orderByConsumed".

  1. Если sqlite3_vtab_distinct() вернет 0, это означает, что планировщику запроса нужна виртуальная таблица, чтобы возвратить все строки в порядке сортировки, определенном полями "nOrderBy" и "aOrderBy" объекта sqlite3_index_info. Это ожидание по умолчанию. Если виртуальная таблица производит все строки в сортированном порядке, то для метода xBestIndex всегда безопасно установить флаг "orderByConsumed", независимо от возвращаемого значения sqlite3_vtab_distinct().

  2. Если sqlite3_vtab_distinct() вернет 1, это означает, что планировщику запроса не нужны строки, которые будут возвращены в сортированном порядке, пока все строки с теми же самыми значениями во всех колонках, определенных полем "aOrderBy", смежны. Этот режим используется, когда планировщик запроса делает GROUP BY.

  3. Если sqlite3_vtab_distinct() вернет 2, это означает, что планировщику запроса не нужны строки, возвращенные ни в каком конкретном порядке, пока строки с теми же самыми значениями во всех колонках "aOrderBy" смежны. Кроме того, только единственная строка для каждой конкретной комбинации значений в колонках, определенных полем "aOrderBy", должна быть возвращена. Для двух или больше строк с теми же самыми значениями во всех столбцах "aOrderBy" всегда нормально быть возвращенным, пока все такие строки смежны. Виртуальная таблица, если это выбирает, может опустить дополнительные строки, у которых есть то же самое значение для всех колонок, определенных "aOrderBy". Однако, исключение дополнительных строк опционально. Этот режим используется для запроса DISTINCT.

  4. Если sqlite3_vtab_distinct() вернет 3, это означает, что планировщику запроса нужны только отличные строки, но этому действительно нужны строки, которые будут сортированы. Виртуальное внедрение таблицы свободно опустить строки, которые идентичны во всех колонках aOrderBy, если оно хочет, но не требуется опускать любые строки. Этот режим используется для запросов, у которых есть пункты DISTINCT и ORDER BY.

В целях сравнить виртуальные выходные значения таблицы, чтобы видеть, являются ли значения тем же самым значением для целей сортировки, два значения NULL считаются тем же самым. Другими словами, оператор сравнения "IS" (или "IS NOT DISTINCT FROM"), но не "==".

Если виртуальное внедрение таблицы не может ответить требованиям, определенным выше, то оно не должно устанавливать флаг "orderByConsumed" в объекте sqlite3_index_info или это может закончиться неправильным ответом.

Виртуальное внедрение таблицы всегда может вернуть строки в любом порядке, который оно хочет, пока флаг "orderByConsumed" не установлен. Когда флаг "orderByConsumed" будет сброшен, планировщик запроса добавит дополнительный байт-код, чтобы гарантировать, что конечные результаты, возвращенные SQL-запросом, упорядочены правильно. Использование флага "orderByConsumed" и интерфейса sqlite3_vtab_distinct() является просто оптимизацией. Тщательное использование sqlite3_vtab_distinct() и флага "orderByConsumed" могло бы помочь запросам для виртуального таблицы работать быстрее. Установка флага "orderByConsumed", когда это не действительно, с другой стороны, могло бы заставить SQLite возвращать неправильные результаты.