-C Bring\sthe\scomments\son\ssqlite3FindInIndex()\sinto\scloser\salignment\swith\swhat\nthat\sroutine\sactually\sdoes.
-D 2022-05-02T11:24:21.557
+C Improvement\son\scheck-in\s[a193749730d6cfba]\sso\sthat\sthe\ssubroutine\scall\sto\nthe\sIN\soperator\sright-hand\sside\sgenerator\sfrom\sthe\sRIGHT\sJOIN\sno-match\slogic\ndoes\snot\sgenerate\sunreachable\sbyte\scode.
+D 2022-05-02T14:32:56.242
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68
F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d
F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce
-F src/expr.c 926dccca86a8d02bf2a8533ba07c9b0c576148915844a1c2217d94c718e9699b
+F src/expr.c 36acab0dde36ab805ed9c793c9a2bb864793999c8b4d4b0e758100eb0339b124
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c d965ede15d8360c09ed59348940649ee647b192e784466837d7aefa836d1d91e
F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761
F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
-F src/sqliteInt.h 4092f9f2395909ebf7da0a6e9907e92883cf98656bb751e1d919d2a0e475ae70
+F src/sqliteInt.h b076cfab9455b6ef1245667ff73dada79a204c750985f788e52469727f0d1c31
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
F src/where.c 43085b3a4ce2e56315fabb0b240a56e76667d9e03c79f287695bcae7b76152d5
F src/whereInt.h 4db5a877a9d1f38b5c928c1c84297c07f30b9a3bc1f5f66214cf1a8ef90a0556
-F src/wherecode.c d629ba77a3601a979b2a30d1a21ca7ae283faff797c7cffe79fb9366a075db89
+F src/wherecode.c 9c2af255257287a50a2c884cc13d0cca4292d46ffa235fbfa1f2e9c67b071e7c
F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5
F src/window.c 924e04fd6e0e113d4dba18b78d43fcb8e42b8ebffc8fc728da52cf3ab014cf3c
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b250c218b4b6327a1cae3edbc037625ba998f89ee13a9bfbc2cefd1edfc4b768
-R b1223a28f05ca5a28b33b633588aeacf
+P 40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9
+R fa255f48eb3059bbcc1be1195343e4b6
U drh
-Z 2fc59ad1d223e831e71b6ddeee2728d5
+Z e6ffd1955bb698b867fb285f4218f7e4
# Remove this line to create a well-formed Fossil manifest.
-40f3274745b53bb72933c1052d0e85bc74be56d3a1068e9d54dc28763a2cfef9
\ No newline at end of file
+cc458317bd77046c4328715ae9e3409f3f4cd422a01162cb33405ef3a142b0a3
\ No newline at end of file
){
Select *p; /* SELECT to the right of IN operator */
int eType = 0; /* Type of RHS table. IN_INDEX_* */
- int iTab = pParse->nTab++; /* Cursor of the RHS table */
+ int iTab; /* Cursor of the RHS table */
int mustBeUnique; /* True if RHS must be unique */
Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */
assert( pX->op==TK_IN );
mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0;
+ if( pX->iTable && (inFlags & IN_INDEX_REUSE_CUR)!=0 ){
+ iTab = pX->iTable;
+ }else{
+ iTab = pParse->nTab++;
+ }
/* If the RHS of this IN(...) operator is a SELECT, and if it matters
** whether or not the SELECT result contains NULL values, check whether
assert( ExprUseYSub(pExpr) );
sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
pExpr->y.sub.iAddr);
- sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable);
+ if( iTab!=pExpr->iTable ){
+ sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable);
+ }
sqlite3VdbeJumpHere(v, addrOnce);
return;
}
#define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */
#define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */
#define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */
+#define IN_INDEX_REUSE_CUR 0x0008 /* Reuse prior table cursor */
int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*);
int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int);
eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab);
}else{
Expr *pExpr = pTerm->pExpr;
- if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){
+ if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){
sqlite3 *db = pParse->db;
pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX);
if( !db->mallocFailed ){
}
sqlite3ExprDelete(db, pX);
}else{
- int j1;
- sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn,
- pExpr->y.sub.iAddr);
- j1 = sqlite3VdbeAddOp0(v, OP_Goto);
aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
- eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab);
+ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP|IN_INDEX_REUSE_CUR, 0, aiMap,&iTab);
iTab = pExpr->iTable;
- sqlite3VdbeJumpHere(v, j1);
}
pX = pExpr;
}