Fix comments and strengthen assert() statements associated with the

OPFLAG_SEEKEQ and BTREE_SEEK_EQ flags.

FossilOrigin-Name: 231749213854756b599b33413b17b35186f17889b0c73f109fa9db726b415558
This commit is contained in:
drh 2020-03-12 17:28:27 +00:00
parent 2267a7fa87
commit 576d0a9fd9
4 changed files with 34 additions and 30 deletions

View File

@ -1,5 +1,5 @@
C Do\snot\sfactor\sout\sconstant\sfunctions\sinto\sthe\sinitialization\ssection\sof\sa\nprepared\sstatement,\sbecause\seven\sthough\sthey\sare\sconstant,\sthey\scan\sstill\nthrow\sexceptions.\s\sInstead,\sput\ssuch\sfunctions\sin\san\sOP_Once\sblock.\s\sThis\nfixes\sticket\s[3c9eadd2a6ba0aa5]\sand\scauses\sCOALESCE()\sand\sCASE...END\sto\nbe\sshort-circuit. C Fix\scomments\sand\sstrengthen\sassert()\sstatements\sassociated\swith\sthe\nOPFLAG_SEEKEQ\sand\sBTREE_SEEK_EQ\sflags.
D 2020-03-11T19:56:26.290 D 2020-03-12T17:28:27.168
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -603,7 +603,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78
F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7
F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a
F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9 F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9
F src/vdbe.c 6d0cf7ac2d54f78ff2fb55cbef970199695319c0a95bf862c6561d7d2c9f7134 F src/vdbe.c c1c123c6248fa88940b932a00bcc75056921b6d046d45a82566cb97415d2299c
F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9 F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9
F src/vdbeInt.h a17146053a1aa438474012998fe07e314f3df274a61491ad838ad85d848ac051 F src/vdbeInt.h a17146053a1aa438474012998fe07e314f3df274a61491ad838ad85d848ac051
F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02
@ -617,7 +617,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc
F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d
F src/where.c 3b8c9bd013eb0736e16f60bdc109e83337ef99513a3aff5f16ddac036e6c277e F src/where.c 8e4283542574f7586d84673692d36c2d6f4bc323f7427c21d791946737842dbf
F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c
F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d
F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7
@ -1860,8 +1860,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P fb5a8a9edd0a4f979d6c30278d4ddc73c651f56ae989b4e5983fca36887c5ceb d7f18489978fdbbe3ab317485518cac91a75416ccef55898301afdd76d3b415b P c5f96a085db9688a09793f52ce1ecf033c2e6e2e5873a19fe0fb374b242b317f
R bb18f5b4c4c1d8067c8d33e0ad339acb R b4d34578c5e19c108e63249f3f407b58
T +closed d7f18489978fdbbe3ab317485518cac91a75416ccef55898301afdd76d3b415b
U drh U drh
Z 0612eee0f98137a25a8377c8a68a78fc Z 3512687e2725ca4d1f170ef6f945b212

View File

@ -1 +1 @@
c5f96a085db9688a09793f52ce1ecf033c2e6e2e5873a19fe0fb374b242b317f 231749213854756b599b33413b17b35186f17889b0c73f109fa9db726b415558

View File

@ -3664,7 +3664,7 @@ case OP_SetCookie: {
** <ul> ** <ul>
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** <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 ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
** of OP_SeekLE/OP_IdxGT) ** of OP_SeekLE/OP_IdxLT)
** </ul> ** </ul>
** **
** The P4 value may be either an integer (P4_INT32) or a pointer to ** The P4 value may be either an integer (P4_INT32) or a pointer to
@ -3694,7 +3694,7 @@ case OP_SetCookie: {
** <ul> ** <ul>
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** <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 ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
** of OP_SeekLE/OP_IdxGT) ** of OP_SeekLE/OP_IdxLT)
** </ul> ** </ul>
** **
** See also: OP_OpenRead, OP_OpenWrite ** See also: OP_OpenRead, OP_OpenWrite
@ -3718,7 +3718,7 @@ case OP_SetCookie: {
** <ul> ** <ul>
** <li> <b>0x02 OPFLAG_SEEKEQ</b>: This cursor will only be used for ** <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 ** equality lookups (implemented as a pair of opcodes OP_SeekGE/OP_IdxGT
** of OP_SeekLE/OP_IdxGT) ** of OP_SeekLE/OP_IdxLT)
** <li> <b>0x08 OPFLAG_FORDELETE</b>: This cursor is used only to seek ** <li> <b>0x08 OPFLAG_FORDELETE</b>: This cursor is used only to seek
** and subsequently delete entries in an index btree. This is a ** and subsequently delete entries in an index btree. This is a
** hint to the storage engine that the storage engine is allowed to ** hint to the storage engine that the storage engine is allowed to
@ -3830,9 +3830,7 @@ open_cursor_set_hints:
assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); assert( OPFLAG_BULKCSR==BTREE_BULKLOAD );
assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ );
testcase( pOp->p5 & OPFLAG_BULKCSR ); testcase( pOp->p5 & OPFLAG_BULKCSR );
#ifdef SQLITE_ENABLE_CURSOR_HINTS
testcase( pOp->p2 & OPFLAG_SEEKEQ ); testcase( pOp->p2 & OPFLAG_SEEKEQ );
#endif
sqlite3BtreeCursorHintFlags(pCur->uc.pCursor, sqlite3BtreeCursorHintFlags(pCur->uc.pCursor,
(pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ))); (pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ)));
if( rc ) goto abort_due_to_error; if( rc ) goto abort_due_to_error;
@ -4088,11 +4086,13 @@ case OP_ColumnsUsed: {
** greater than or equal to the key and P2 is not zero, then jump to P2. ** greater than or equal to the key and P2 is not zero, then jump to P2.
** **
** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this
** opcode will always land on a record that equally equals the key, or ** opcode will either land on a record that exactly matches the key, or
** else jump immediately to P2. When the cursor is OPFLAG_SEEKEQ, this ** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ,
** opcode must be followed by an IdxLE opcode with the same arguments. ** this opcode must be followed by an IdxLE opcode with the same arguments.
** The IdxLE opcode will be skipped if this opcode succeeds, but the ** The IdxGT opcode will be skipped if this opcode succeeds, but the
** IdxLE opcode will be used on subsequent loop iterations. ** IdxGT opcode will be used on subsequent loop iterations. The
** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this
** is an equality search.
** **
** This opcode leaves the cursor configured to move in forward order, ** This opcode leaves the cursor configured to move in forward order,
** from the beginning toward the end. In other words, the cursor is ** from the beginning toward the end. In other words, the cursor is
@ -4108,7 +4108,7 @@ case OP_ColumnsUsed: {
** to an SQL index, then P3 is the first in an array of P4 registers ** to an SQL index, then P3 is the first in an array of P4 registers
** that are used as an unpacked index key. ** that are used as an unpacked index key.
** **
** Reposition cursor P1 so that it points to the smallest entry that ** Reposition cursor P1 so that it points to the smallest entry that
** is greater than the key value. If there are no records greater than ** is greater than the key value. If there are no records greater than
** the key and P2 is not zero, then jump to P2. ** the key and P2 is not zero, then jump to P2.
** **
@ -4153,11 +4153,13 @@ case OP_ColumnsUsed: {
** configured to use Prev, not Next. ** configured to use Prev, not Next.
** **
** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this ** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this
** opcode will always land on a record that equally equals the key, or ** opcode will either land on a record that exactly matches the key, or
** else jump immediately to P2. When the cursor is OPFLAG_SEEKEQ, this ** else it will cause a jump to P2. When the cursor is OPFLAG_SEEKEQ,
** opcode must be followed by an IdxGE opcode with the same arguments. ** this opcode must be followed by an IdxLE opcode with the same arguments.
** The IdxGE opcode will be skipped if this opcode succeeds, but the ** The IdxGE opcode will be skipped if this opcode succeeds, but the
** IdxGE opcode will be used on subsequent loop iterations. ** IdxGE opcode will be used on subsequent loop iterations. The
** OPFLAG_SEEKEQ flags is a hint to the btree layer to say that this
** is an equality search.
** **
** See also: Found, NotFound, SeekGt, SeekGe, SeekLt ** See also: Found, NotFound, SeekGt, SeekGe, SeekLt
*/ */
@ -4194,7 +4196,7 @@ case OP_SeekGT: { /* jump, in3, group */
pC->cacheStatus = CACHE_STALE; pC->cacheStatus = CACHE_STALE;
if( pC->isTable ){ if( pC->isTable ){
u16 flags3, newType; u16 flags3, newType;
/* The BTREE_SEEK_EQ flag is only set on index cursors */ /* The OPFLAG_SEEKEQ/BTREE_SEEK_EQ flag is only set on index cursors */
assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0
|| CORRUPT_DB ); || CORRUPT_DB );
@ -4253,14 +4255,17 @@ case OP_SeekGT: { /* jump, in3, group */
goto abort_due_to_error; goto abort_due_to_error;
} }
}else{ }else{
/* For a cursor with the BTREE_SEEK_EQ hint, only the OP_SeekGE and /* For a cursor with the OPFLAG_SEEKEQ/BTREE_SEEK_EQ hint, only the
** OP_SeekLE opcodes are allowed, and these must be immediately followed ** OP_SeekGE and OP_SeekLE opcodes are allowed, and these must be
** by an OP_IdxGT or OP_IdxLT opcode, respectively, with the same key. ** immediately followed by an OP_IdxGT or OP_IdxLT opcode, respectively,
** with the same key.
*/ */
if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){ if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){
eqOnly = 1; eqOnly = 1;
assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE ); assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE );
assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT );
assert( pOp->opcode==OP_SeekGE || pOp[1].opcode==OP_IdxLT );
assert( pOp->opcode==OP_SeekLE || pOp[1].opcode==OP_IdxGT );
assert( pOp[1].p1==pOp[0].p1 ); assert( pOp[1].p1==pOp[0].p1 );
assert( pOp[1].p2==pOp[0].p2 ); assert( pOp[1].p2==pOp[0].p2 );
assert( pOp[1].p3==pOp[0].p3 ); assert( pOp[1].p3==pOp[0].p3 );

View File

@ -5122,7 +5122,7 @@ WhereInfo *sqlite3WhereBegin(
sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32); sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32);
assert( n<=pTab->nCol ); assert( n<=pTab->nCol );
} }
#ifdef SQLITE_ENABLE_CURSOR_HINTS #ifdef SQLITE_ENABLE_CURSOR_HINTS*/
if( pLoop->u.btree.pIndex!=0 ){ if( pLoop->u.btree.pIndex!=0 ){
sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete);
}else }else
@ -5178,7 +5178,7 @@ WhereInfo *sqlite3WhereBegin(
&& (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0
&& pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED
){ ){
sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */ sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ);
} }
VdbeComment((v, "%s", pIx->zName)); VdbeComment((v, "%s", pIx->zName));
#ifdef SQLITE_ENABLE_COLUMN_USED_MASK #ifdef SQLITE_ENABLE_COLUMN_USED_MASK