mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Update and correct the documentation on the OP_OpenRead, OP_OpenWrite,
and OP_ReopenIdx opcodes. No code changes other than the addition of an assert(). FossilOrigin-Name: 8a0b730d0ea640d5cf75febe39b2162411a12eb5275765a85882158b5a085681
This commit is contained in:
82
src/vdbe.c
82
src/vdbe.c
@@ -3370,59 +3370,78 @@ case OP_SetCookie: {
|
||||
** values need not be contiguous but all P1 values should be small integers.
|
||||
** It is an error for P1 to be negative.
|
||||
**
|
||||
** If P5!=0 then use the content of register P2 as the root page, not
|
||||
** the value of P2 itself.
|
||||
**
|
||||
** There will be a read lock on the database whenever there is an
|
||||
** open cursor. If the database was unlocked prior to this instruction
|
||||
** then a read lock is acquired as part of this instruction. A read
|
||||
** lock allows other processes to read the database but prohibits
|
||||
** any other process from modifying the database. The read lock is
|
||||
** released when all cursors are closed. If this instruction attempts
|
||||
** to get a read lock but fails, the script terminates with an
|
||||
** SQLITE_BUSY error code.
|
||||
** Allowed P5 bits:
|
||||
** <ul>
|
||||
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
|
||||
** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
|
||||
** of OP_SeekLE/OP_IdxGT)
|
||||
** </ul>
|
||||
**
|
||||
** The P4 value may be either an integer (P4_INT32) or a pointer to
|
||||
** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
|
||||
** structure, then said structure defines the content and collating
|
||||
** sequence of the index being opened. Otherwise, if P4 is an integer
|
||||
** value, it is set to the number of columns in the table.
|
||||
** object, then table being opened must be an [index b-tree] where the
|
||||
** KeyInfo object defines the content and collating
|
||||
** sequence of that index b-tree. Otherwise, if P4 is an integer
|
||||
** value, then the table being opened must be a [table b-tree] with a
|
||||
** number of columns no less than the value of P4.
|
||||
**
|
||||
** See also: OpenWrite, ReopenIdx
|
||||
*/
|
||||
/* Opcode: ReopenIdx P1 P2 P3 P4 P5
|
||||
** Synopsis: root=P2 iDb=P3
|
||||
**
|
||||
** The ReopenIdx opcode works exactly like ReadOpen except that it first
|
||||
** checks to see if the cursor on P1 is already open with a root page
|
||||
** number of P2 and if it is this opcode becomes a no-op. In other words,
|
||||
** The ReopenIdx opcode works like OP_OpenRead except that it first
|
||||
** checks to see if the cursor on P1 is already open on the same
|
||||
** b-tree and if it is this opcode becomes a no-op. In other words,
|
||||
** if the cursor is already open, do not reopen it.
|
||||
**
|
||||
** The ReopenIdx opcode may only be used with P5==0 and with P4 being
|
||||
** a P4_KEYINFO object. Furthermore, the P3 value must be the same as
|
||||
** every other ReopenIdx or OpenRead for the same cursor number.
|
||||
** The ReopenIdx opcode may only be used with P5==0 or P5==OPFLAG_SEEKEQ
|
||||
** and with P4 being a P4_KEYINFO object. Furthermore, the P3 value must
|
||||
** be the same as every other ReopenIdx or OpenRead for the same cursor
|
||||
** number.
|
||||
**
|
||||
** See the OpenRead opcode documentation for additional information.
|
||||
** Allowed P5 bits:
|
||||
** <ul>
|
||||
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
|
||||
** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
|
||||
** of OP_SeekLE/OP_IdxGT)
|
||||
** </ul>
|
||||
**
|
||||
** See also: OP_OpenRead, OP_OpenWrite
|
||||
*/
|
||||
/* Opcode: OpenWrite P1 P2 P3 P4 P5
|
||||
** Synopsis: root=P2 iDb=P3
|
||||
**
|
||||
** Open a read/write cursor named P1 on the table or index whose root
|
||||
** page is P2. Or if P5!=0 use the content of register P2 to find the
|
||||
** root page.
|
||||
** page is P2 (or whose root page is held in register P2 if the
|
||||
** OPFLAG_P2ISREG bit is set in P5 - see below).
|
||||
**
|
||||
** The P4 value may be either an integer (P4_INT32) or a pointer to
|
||||
** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
|
||||
** structure, then said structure defines the content and collating
|
||||
** sequence of the index being opened. Otherwise, if P4 is an integer
|
||||
** value, it is set to the number of columns in the table, or to the
|
||||
** largest index of any column of the table that is actually used.
|
||||
** object, then table being opened must be an [index b-tree] where the
|
||||
** KeyInfo object defines the content and collating
|
||||
** sequence of that index b-tree. Otherwise, if P4 is an integer
|
||||
** value, then the table being opened must be a [table b-tree] with a
|
||||
** number of columns no less than the value of P4.
|
||||
**
|
||||
** This instruction works just like OpenRead except that it opens the cursor
|
||||
** in read/write mode. For a given table, there can be one or more read-only
|
||||
** cursors or a single read/write cursor but not both.
|
||||
** Allowed P5 bits:
|
||||
** <ul>
|
||||
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for
|
||||
** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
|
||||
** of OP_SeekLE/OP_IdxGT)
|
||||
** <li> <b>0x08 OPFLAG_FORDELETE</b>: This cursor is used only to seek
|
||||
** and subsequently delete entries in an index btree. This is a
|
||||
** hint to the storage engine that the storage engine is allowed to
|
||||
** ignore. The hint is not used by the official SQLite b*tree storage
|
||||
** engine, but is used by COMDB2.
|
||||
** <li> <b>0x10 OPFLAG_P2ISREG</b>: Use the content of register P2
|
||||
** as the root page, not the value of P2 itself.
|
||||
** </ul>
|
||||
**
|
||||
** See also OpenRead.
|
||||
** This instruction works like OpenRead except that it opens the cursor
|
||||
** in read/write mode.
|
||||
**
|
||||
** See also: OP_OpenRead, OP_ReopenIdx
|
||||
*/
|
||||
case OP_ReopenIdx: {
|
||||
int nField;
|
||||
@@ -3478,6 +3497,7 @@ case OP_OpenWrite:
|
||||
if( pOp->p5 & OPFLAG_P2ISREG ){
|
||||
assert( p2>0 );
|
||||
assert( p2<=(p->nMem+1 - p->nCursor) );
|
||||
assert( pOp->opcode==OP_OpenWrite );
|
||||
pIn2 = &aMem[p2];
|
||||
assert( memIsValid(pIn2) );
|
||||
assert( (pIn2->flags & MEM_Int)!=0 );
|
||||
|
Reference in New Issue
Block a user