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

Small. Fast. Reliable.
Choose any three.

SQLite C Interface

Определите и обращайтесь с ограничениями IN в xBestIndex

int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle);

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

Ограничение на виртуальную таблицу формы "column IN (...)" сообщено методу xBestIndex как ограничение SQLITE_INDEX_CONSTRAINT_EQ. Если xBestIndex хочет использовать это ограничение, он должен установить соответствующий aConstraintUsage[].argvIndex в положительный integer. Затем под обычным режимом обработки операторов IN SQLite создает байт-код, который вызывает метод xFilter() однажды для каждого значения на правой стороне оператора IN. Таким образом виртуальная таблица видит только единственное значение с правой стороны оператора IN за один раз.

В некоторых случаях, однако, было бы выгодно для виртуальной таблицы видеть все значения справа от оператора IN. sqlite3_vtab_in() облегчает это двумя способами:

  1. Запрос sqlite3_vtab_in(P,N,-1) вернет true (не 0) если и только если ограничение P->aConstraint[N] это оператор IN, который может быть обработан за раз. Другими словами, sqlite3_vtab_in() с -1 в третьем аргументе это механизм, которым виртуальная таблица может спросить SQLite, если возможна обработка всего оператора IN за раз.

  2. Запрос sqlite3_vtab_in(P,N,F) с F==1 или F==0 указывает SQLite, что виртуальная таблица делает или не хочет обрабатывать оператор IN за раз, соответственно. Таким образом, когда третий параметр (F) неотрицательный, этот интерфейс это механизм, которым виртуальная таблица говорит SQLite, как это хочет обработать оператор IN.

sqlite3_vtab_in(P,N,F) может быть вызван многократно в том же самом вызове метода xBestIndex. Для любой данной пары P,N возвращаемое значение sqlite3_vtab_in(P,N,F) всегда будет тем же самым в рамках того же самого вызова xBestIndex. Если интерфейс возвращает true (не 0), это означает, что ограничение это оператор IN, который может быть обработан за раз. Если ограничение не оператор IN или он не может быть обработан за раз, то интерфейс вернет false.

Одновременная обработка оператора IN отобрана, если обоим из следующих условий отвечают:

  1. P->aConstraintUsage[N].argvIndex установлено в положительный integer. Это как виртуальная таблица говорит SQLite, что это хочет использовать N-е ограничение.

  2. У последнего вызова sqlite3_vtab_in(P,N,F), для которого F был неотрицательным, был F>=1.

Если хоть одно или оба из условий выше ложные, то SQLite использует традиционную стратегию пошаговой обработки ограничения IN. Если оба условия будут верны, то argvIndex-й параметр метода xFilter будет sqlite3_value, который, кажется, NULL, но который может быть передан sqlite3_vtab_in_first() и sqlite3_vtab_in_next(), чтобы найти все значения на правой стороне ограничения IN.