SQLite C 接口
查找 IN 约束右侧的所有元素。
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 方法的参数之一,特别是之前为 all-at-once IN 选择的参数约束处理使用xBestIndex 方法中的sqlite3_vtab_in()接口 。如果 X 参数不是为一次性 IN 约束处理选择的 xFilter 参数,则这些例程返回SQLITE_MISUSE或者可能表现出一些其他未定义或有害的行为。
使用这些例程访问 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 值受保护。