int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut); int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
这些接口仅在虚拟表实现的 xFilter() 方法 中有用。在任何其他上下文中调用这些接口的结果是未定义的,并且可能是有害的。
调用 sqlite3_vtab_in_first(X,P) 或 sqlite3_vtab_in_next(X,P) 中的 X 参数应为调用这些例程的 xFilter 方法的参数之一,特别是先前已选择用于一次性 IN 约束处理的参数,使用 sqlite3_vtab_in() 接口在 xBestIndex 方法 中。如果 X 参数不是为一次性 IN 约束处理而选择的 xFilter 参数,则这些例程将返回 SQLITE_ERROR。
使用这些例程访问 IN 约束右侧的所有值,代码如下所示
for(rc=sqlite3_vtab_in_first(pList, &pVal); rc==SQLITE_OK && pVal; rc=sqlite3_vtab_in_next(pList, &pVal) ){ // do something with pVal } if( rc!=SQLITE_OK ){ // an error has occurred }
成功时,sqlite3_vtab_in_first(X,P) 和 sqlite3_vtab_in_next(X,P) 例程返回 SQLITE_OK 并将 *P 设置为指向 IN 约束 RHS 的第一个或下一个值。如果 IN 约束右侧没有更多值,则 *P 设置为 NULL,并且这些例程返回 SQLITE_DONE。在发生故障的情况下,返回值可能是其他一些值,例如 SQLITE_NOMEM。
这些例程返回的 *ppOut 值仅在对这些例程中的任何一个进行下一次调用之前或在调用这些例程的 xFilter 方法结束之前有效。如果虚拟表实现需要更长时间地保留 *ppOut 值,则必须进行复制。*ppOut 值是 受保护的。