1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Refactor sqlite3_vtab_in() to make use of the existing

sqlite3_value_pointer() mechanism for passing the list of IN operator
RHS values into xFilter, for improved memory safety.

FossilOrigin-Name: 8965929be236fe1a6994f31b94c1b7590c7c1e809470c542a76f3e0e275d032f
This commit is contained in:
drh
2022-02-02 14:36:58 +00:00
parent b30298d3ea
commit 30e314e4cb
5 changed files with 74 additions and 71 deletions

View File

@@ -7736,20 +7736,27 @@ case OP_VOpen: {
#ifndef SQLITE_OMIT_VIRTUALTABLE
/* Opcode: VInitIn P1 P2 P3 * *
** Synopsis: r[P2]=cursor over eph table P1.
** Synopsis: r[P2]=ValueList(P1,P3)
**
** Initialize register P2 as a value that can be used as an iterator over
** the contents of ephemeral table P1 by an xFilter callback implementation.
** Register P3 is used as a cache by the iterator.
** Set register P2 to be a pointer to a ValueList object for cursor P1
** with cache register P3 and output register P3+1. This ValueList object
** can be used as the first argument to sqlite3_vtab_in_first() and
** sqlite3_vtab_in_next() to extract all of the values stored in the P1
** cursor. Register P3 is used to hold the values returned by
** sqlite3_vtab_in_first() and sqlite3_vtab_in_next().
*/
case OP_VInitIn: { /* out2 */
VdbeCursor *pC;
VdbeCursor *pC; /* The cursor containing the RHS values */
ValueList *pRhs; /* New ValueList object to put in reg[P2] */
pC = p->apCsr[pOp->p1];
pRhs = sqlite3_malloc64( sizeof(*pRhs) );
if( pRhs==0 ) goto no_mem;
pRhs->pCsr = pC->uc.pCursor;
pRhs->pOut = &aMem[pOp->p3];
pOut = out2Prerelease(p, pOp);
pOut->z = (char*)(pC->uc.pCursor);
pOut->u.pVal = &aMem[pOp->p3];
pOut->uTemp = SQLITE_VTAB_IN_MAGIC;
pOut->flags = MEM_Null;
sqlite3VdbeMemSetPointer(pOut, pRhs, "ValueList", sqlite3_free);
break;
}
#endif /* SQLITE_OMIT_VIRTUALTABLE */