mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Remove an unnecessary OP_Null in the IN-operator logic. Attempt to clarify
comments explaining the IN-operator code, though it is not clear that the comments are correct even yet - more work to be done. FossilOrigin-Name: c11e55fabbc718cb324ecd3540453c25db98f50c
This commit is contained in:
15
manifest
15
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Clean\sup\sthe\sIN\soperator\scode\sgeneration\slogic\sto\smake\sit\seasier\sto\sreason\nabout.\s\sIn\sthe\sprocess,\simprove\scode\sgeneration\sto\somit\ssome\sunused\sOP_Null\noperations.
|
C Remove\san\sunnecessary\sOP_Null\sin\sthe\sIN-operator\slogic.\s\sAttempt\sto\sclarify\ncomments\sexplaining\sthe\sIN-operator\scode,\sthough\sit\sis\snot\sclear\sthat\sthe\ncomments\sare\scorrect\seven\syet\s-\smore\swork\sto\sbe\sdone.
|
||||||
D 2014-08-01T15:51:36.528
|
D 2014-08-01T18:00:24.770
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
|
F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -176,7 +176,7 @@ F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
|
|||||||
F src/ctime.c 0231df905e2c4abba4483ee18ffc05adc321df2a
|
F src/ctime.c 0231df905e2c4abba4483ee18ffc05adc321df2a
|
||||||
F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
|
F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
|
||||||
F src/delete.c bcf8f72126cea80fc3d5bc5494cf19b3f8935aaf
|
F src/delete.c bcf8f72126cea80fc3d5bc5494cf19b3f8935aaf
|
||||||
F src/expr.c 1f7fa7ddbdffd89898a3ce5ff1e57d137ec87aa5
|
F src/expr.c 45da7f2dd6b5c52b3210387956711d578bdceb37
|
||||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||||
F src/fkey.c 8545f3b36da47473e10800ea4fb0810fd4062514
|
F src/fkey.c 8545f3b36da47473e10800ea4fb0810fd4062514
|
||||||
F src/func.c 3bc223ea36cd29a91c481485343d0ee4257ab8dc
|
F src/func.c 3bc223ea36cd29a91c481485343d0ee4257ab8dc
|
||||||
@@ -283,7 +283,7 @@ F src/update.c 01564b3c430f6c7b0a35afaf7aba7987206fa3a5
|
|||||||
F src/utf.c a0314e637768a030e6e84a957d0c4f6ba910cc05
|
F src/utf.c a0314e637768a030e6e84a957d0c4f6ba910cc05
|
||||||
F src/util.c 3076bdd51cdbf60a6e2e57fada745be37133c73e
|
F src/util.c 3076bdd51cdbf60a6e2e57fada745be37133c73e
|
||||||
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
|
F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
|
||||||
F src/vdbe.c 115e08834b883964d9a480f685d8601826c5792a
|
F src/vdbe.c b9e6866e43a61ca4080410f27c4bb52823495186
|
||||||
F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
|
F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
|
||||||
F src/vdbeInt.h f5513f2b5ac1e2c5128996c7ea23add256a301df
|
F src/vdbeInt.h f5513f2b5ac1e2c5128996c7ea23add256a301df
|
||||||
F src/vdbeapi.c 24e40422382beb774daab11fe9fe9d37e8a04949
|
F src/vdbeapi.c 24e40422382beb774daab11fe9fe9d37e8a04949
|
||||||
@@ -1185,8 +1185,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 9abcf2698c09f4f6a44a68e74f9f6b538f3253d6 e13175d3579e1045165bab091b3b28951d691704
|
P 7c6fbcfe6ed5739e8e4639b7b123fbf9828cbfc0
|
||||||
R b49330a02feffafe84f051ae1dbb9076
|
R 76f22de612006799aae8055deaa164fe
|
||||||
T +closed e13175d3579e1045165bab091b3b28951d691704
|
|
||||||
U drh
|
U drh
|
||||||
Z e21436d3fd2e7daacda65f50d724cf15
|
Z ebc1ba4c7f530e221b3bc2fcb7e1119a
|
||||||
|
@@ -1 +1 @@
|
|||||||
7c6fbcfe6ed5739e8e4639b7b123fbf9828cbfc0
|
c11e55fabbc718cb324ecd3540453c25db98f50c
|
42
src/expr.c
42
src/expr.c
@@ -1525,29 +1525,34 @@ int sqlite3CodeOnce(Parse *pParse){
|
|||||||
**
|
**
|
||||||
** When the b-tree is being used for membership tests, the calling function
|
** When the b-tree is being used for membership tests, the calling function
|
||||||
** might need to know whether or not the RHS side of the IN operator
|
** might need to know whether or not the RHS side of the IN operator
|
||||||
** contains a NULL. If prNotFound is not NULL and
|
** contains a NULL. If prRhsHasNull is not a NULL pointer and
|
||||||
** if there is any chance that the (...) might contain a NULL value at
|
** if there is any chance that the (...) might contain a NULL value at
|
||||||
** runtime, then a register is allocated and the register number written
|
** runtime, then a register is allocated and the register number written
|
||||||
** to *prNotFound. If there is no chance that the (...) contains a
|
** to *prRhsHasNull. If there is no chance that the (...) contains a
|
||||||
** NULL value, then *prNotFound is left unchanged.
|
** NULL value, then *prRhsHasNull is left unchanged.
|
||||||
**
|
**
|
||||||
** If a register is allocated and its location stored in *prNotFound, then
|
** If a register is allocated and its location stored in *prRhsHasNull, then
|
||||||
** its initial value is NULL. If the (...) does not remain constant
|
** the value in that register will be:
|
||||||
** for the duration of the query (i.e. the SELECT within the (...)
|
|
||||||
** is a correlated subquery) then the value of the allocated register is
|
|
||||||
** reset to NULL each time the subquery is rerun. This allows the
|
|
||||||
** caller to use vdbe code equivalent to the following:
|
|
||||||
**
|
**
|
||||||
** if( register==NULL ){
|
** 0 if the (...) contains no NULL values
|
||||||
** has_null = <test if data structure contains null>
|
** 1 if the (...) does not contain NULL values
|
||||||
** register = 1
|
** NULL if we do not yet know if (...) contains NULLs
|
||||||
|
**
|
||||||
|
** If the (...) does not remain constant for the duration of the query
|
||||||
|
** (i.e. the SELECT within the (...) is a correlated subquery) then the
|
||||||
|
** value of the allocated register is reset to NULL each time the subquery
|
||||||
|
** is rerun. This allows the caller to use vdbe code equivalent to the
|
||||||
|
** following:
|
||||||
|
**
|
||||||
|
** if( r[*prRhsHasNull] IS NULL ){
|
||||||
|
** r[*prRhsHasNull] = <test if data structure contains null>
|
||||||
** }
|
** }
|
||||||
**
|
**
|
||||||
** in order to avoid running the <test if data structure contains null>
|
** in order to avoid running the <test if data structure contains null>
|
||||||
** test more often than is necessary.
|
** test more often than is necessary.
|
||||||
*/
|
*/
|
||||||
#ifndef SQLITE_OMIT_SUBQUERY
|
#ifndef SQLITE_OMIT_SUBQUERY
|
||||||
int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int *prNotFound){
|
int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int *prRhsHasNull){
|
||||||
Select *p; /* SELECT to the right of IN operator */
|
Select *p; /* SELECT to the right of IN operator */
|
||||||
int eType = 0; /* Type of RHS table. IN_INDEX_* */
|
int eType = 0; /* Type of RHS table. IN_INDEX_* */
|
||||||
int iTab = pParse->nTab++; /* Cursor of the RHS table */
|
int iTab = pParse->nTab++; /* Cursor of the RHS table */
|
||||||
@@ -1621,9 +1626,9 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int *prNotFound){
|
|||||||
assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 );
|
assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 );
|
||||||
eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0];
|
eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0];
|
||||||
|
|
||||||
if( prNotFound && !pTab->aCol[iCol].notNull ){
|
if( prRhsHasNull && !pTab->aCol[iCol].notNull ){
|
||||||
*prNotFound = ++pParse->nMem;
|
*prRhsHasNull = ++pParse->nMem;
|
||||||
sqlite3VdbeAddOp2(v, OP_Null, 0, *prNotFound);
|
sqlite3VdbeAddOp2(v, OP_Null, 0, *prRhsHasNull);
|
||||||
}
|
}
|
||||||
sqlite3VdbeJumpHere(v, iAddr);
|
sqlite3VdbeJumpHere(v, iAddr);
|
||||||
}
|
}
|
||||||
@@ -1643,9 +1648,8 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int *prNotFound){
|
|||||||
if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){
|
if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){
|
||||||
eType = IN_INDEX_ROWID;
|
eType = IN_INDEX_ROWID;
|
||||||
}
|
}
|
||||||
}else if( prNotFound ){
|
}else if( prRhsHasNull ){
|
||||||
*prNotFound = rMayHaveNull = ++pParse->nMem;
|
*prRhsHasNull = rMayHaveNull = ++pParse->nMem;
|
||||||
sqlite3VdbeAddOp2(v, OP_Null, 0, rMayHaveNull);
|
|
||||||
}
|
}
|
||||||
sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID);
|
sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID);
|
||||||
pParse->nQueryLoop = savedNQueryLoop;
|
pParse->nQueryLoop = savedNQueryLoop;
|
||||||
|
@@ -2229,13 +2229,13 @@ case OP_Once: { /* jump */
|
|||||||
**
|
**
|
||||||
** Jump to P2 if the value in register P1 is true. The value
|
** Jump to P2 if the value in register P1 is true. The value
|
||||||
** is considered true if it is numeric and non-zero. If the value
|
** is considered true if it is numeric and non-zero. If the value
|
||||||
** in P1 is NULL then take the jump if P3 is non-zero.
|
** in P1 is NULL then take the jump if and only if P3 is non-zero.
|
||||||
*/
|
*/
|
||||||
/* Opcode: IfNot P1 P2 P3 * *
|
/* Opcode: IfNot P1 P2 P3 * *
|
||||||
**
|
**
|
||||||
** Jump to P2 if the value in register P1 is False. The value
|
** Jump to P2 if the value in register P1 is False. The value
|
||||||
** is considered false if it has a numeric value of zero. If the value
|
** is considered false if it has a numeric value of zero. If the value
|
||||||
** in P1 is NULL then take the jump if P3 is zero.
|
** in P1 is NULL then take the jump if and only if P3 is non-zero.
|
||||||
*/
|
*/
|
||||||
case OP_If: /* jump, in1 */
|
case OP_If: /* jump, in1 */
|
||||||
case OP_IfNot: { /* jump, in1 */
|
case OP_IfNot: { /* jump, in1 */
|
||||||
|
Reference in New Issue
Block a user