mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-12 13:01:09 +03:00
Use NEVER and ALWAYS macros to confirm that the return value from
sqlite3ExprSkipCollateAndLikely() is never NULL in some of its use cases. FossilOrigin-Name: 76d2eb86e109fc3cbdba2e8175c22ed7660b59bb9315f6c55c565587f33ad43b
This commit is contained in:
20
manifest
20
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Add\sALWAYS()\sto\sconditionals\sassociated\swith\sSHM\slocking\sthat\sare\salways\strue.
|
C Use\sNEVER\sand\sALWAYS\smacros\sto\sconfirm\sthat\sthe\sreturn\svalue\sfrom\nsqlite3ExprSkipCollateAndLikely()\sis\snever\sNULL\sin\ssome\sof\sits\suse\scases.
|
||||||
D 2020-11-06T16:48:55.396
|
D 2020-11-08T20:44:30.361
|
||||||
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
|
||||||
@@ -489,7 +489,7 @@ F src/date.c dace306a10d9b02ee553d454c8e1cf8d3c9b932e137738a6b15b90253a9bfc10
|
|||||||
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
|
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
|
||||||
F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c
|
F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c
|
||||||
F src/delete.c 927cf8f900583e79aca8f1a321979e0a8f053babd9a690b44b38f79de2cc09fe
|
F src/delete.c 927cf8f900583e79aca8f1a321979e0a8f053babd9a690b44b38f79de2cc09fe
|
||||||
F src/expr.c 2cfe739c81e9751123b900dee54f6d34f8ec4b747515a51f1771de8e2840650d
|
F src/expr.c 0d196ed5a2ebf96be7e8df88add4fabfad0dce16c0fed81a4b8f6a26e259797f
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 83372403298e6a7dd989a47aaacdbaa5b4307b5199dbd56e07d4896066b3de72
|
F src/fkey.c 83372403298e6a7dd989a47aaacdbaa5b4307b5199dbd56e07d4896066b3de72
|
||||||
F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0
|
F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0
|
||||||
@@ -535,9 +535,9 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf
|
|||||||
F src/prepare.c 270170a239c0f66bd3c228f373afe24447c2614a6829ae22080babc64f241931
|
F src/prepare.c 270170a239c0f66bd3c228f373afe24447c2614a6829ae22080babc64f241931
|
||||||
F src/printf.c 30e92b638fac71dcd85cdea1d12ecfae354c9adee2c71e8e1ae4727cde7c91ed
|
F src/printf.c 30e92b638fac71dcd85cdea1d12ecfae354c9adee2c71e8e1ae4727cde7c91ed
|
||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c 97b91fb25d86881ff20c9ad2ad98412c6c1bb5f7d6c9bb044db250cbc9cfcd4b
|
F src/resolve.c 1948a92ca9eab776632816b97e57c61d933474a78aad4f4ef835c916a83dbb1c
|
||||||
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
|
||||||
F src/select.c 507c541942d78a9af1d4680e6addf60b677d8fc6d55f0b0a047a01759f0c0386
|
F src/select.c 31387e56f5e6d1adc798dfa04b946001289a61e65acf4615f7b7130f121f3b9c
|
||||||
F src/shell.c.in c0b4aea11596235e4206d671568590f9516f6db63755e82661cb75b662e3cbf2
|
F src/shell.c.in c0b4aea11596235e4206d671568590f9516f6db63755e82661cb75b662e3cbf2
|
||||||
F src/sqlite.h.in ff32663b457306eb88c3039868280aa39da31162ed69c4e71fa8e028684e7277
|
F src/sqlite.h.in ff32663b457306eb88c3039868280aa39da31162ed69c4e71fa8e028684e7277
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
@@ -624,10 +624,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
|
|||||||
F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14
|
F src/wal.c 69e770e96fd56cc21608992bf2c6f1f3dc5cf2572d0495c6a643b06c3a679f14
|
||||||
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
|
F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
|
||||||
F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049
|
F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049
|
||||||
F src/where.c 03d35ea488e694849923e28ccdce1ef377a5c3738405b5323ff97eb9aa7569c1
|
F src/where.c 21f472adb5217f907d7e6d3aa8194f181ded3c04696933992a8632cf51a5ec5e
|
||||||
F src/whereInt.h 59077fbd0b3d01bc8715e746c86a99ebf4c85bde8a57077ec04d2a23e59666ec
|
F src/whereInt.h 59077fbd0b3d01bc8715e746c86a99ebf4c85bde8a57077ec04d2a23e59666ec
|
||||||
F src/wherecode.c a3a1aff30fe99a818d8e7c607980f033f40c68d890e03ed25838b9dbb7908bee
|
F src/wherecode.c a3a1aff30fe99a818d8e7c607980f033f40c68d890e03ed25838b9dbb7908bee
|
||||||
F src/whereexpr.c 2a05552e808047a93845278c98c6ca64a265fa8e9ffd087c161bb11bfe339866
|
F src/whereexpr.c 3a463e156ea388083c501502229c2c7f4f5c6b5330ea59bdf40d6eb6e155a25f
|
||||||
F src/window.c edd6f5e25a1e8f2b6f5305b7f5f7da7bb35f07f0d432b255b1d4c2fcab4205aa
|
F src/window.c edd6f5e25a1e8f2b6f5305b7f5f7da7bb35f07f0d432b255b1d4c2fcab4205aa
|
||||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||||
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
|
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
|
||||||
@@ -1883,7 +1883,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 991ca9b26bacd8f6b64498057fe28f2068466a220f372fd365b6685f583f0e92
|
P b599e89076d60afede7d2b3503b9338ca863d0c2d25799afe4080a6186386ea9
|
||||||
R f26b9e90b790a8d006742a6dcee07267
|
R 7beca53d7c8d22c465c9d56afbdf86de
|
||||||
U drh
|
U drh
|
||||||
Z 453afee97587daa6fc13b031ff46a5e1
|
Z c36c228a67de698bd35d3d99e8941c75
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
b599e89076d60afede7d2b3503b9338ca863d0c2d25799afe4080a6186386ea9
|
76d2eb86e109fc3cbdba2e8175c22ed7660b59bb9315f6c55c565587f33ad43b
|
||||||
@@ -3623,6 +3623,7 @@ void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){
|
|||||||
*/
|
*/
|
||||||
static void exprToRegister(Expr *pExpr, int iReg){
|
static void exprToRegister(Expr *pExpr, int iReg){
|
||||||
Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr);
|
Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr);
|
||||||
|
if( NEVER(p==0) ) return;
|
||||||
p->op2 = p->op;
|
p->op2 = p->op;
|
||||||
p->op = TK_REGISTER;
|
p->op = TK_REGISTER;
|
||||||
p->iTable = iReg;
|
p->iTable = iReg;
|
||||||
@@ -4610,6 +4611,7 @@ int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){
|
|||||||
int r2;
|
int r2;
|
||||||
pExpr = sqlite3ExprSkipCollateAndLikely(pExpr);
|
pExpr = sqlite3ExprSkipCollateAndLikely(pExpr);
|
||||||
if( ConstFactorOk(pParse)
|
if( ConstFactorOk(pParse)
|
||||||
|
&& ALWAYS(pExpr!=0)
|
||||||
&& pExpr->op!=TK_REGISTER
|
&& pExpr->op!=TK_REGISTER
|
||||||
&& sqlite3ExprIsConstantNotJoin(pExpr)
|
&& sqlite3ExprIsConstantNotJoin(pExpr)
|
||||||
){
|
){
|
||||||
|
|||||||
@@ -1284,6 +1284,7 @@ static int resolveCompoundOrderBy(
|
|||||||
Expr *pE, *pDup;
|
Expr *pE, *pDup;
|
||||||
if( pItem->done ) continue;
|
if( pItem->done ) continue;
|
||||||
pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr);
|
pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr);
|
||||||
|
if( NEVER(pE==0) ) continue;
|
||||||
if( sqlite3ExprIsInteger(pE, &iCol) ){
|
if( sqlite3ExprIsInteger(pE, &iCol) ){
|
||||||
if( iCol<=0 || iCol>pEList->nExpr ){
|
if( iCol<=0 || iCol>pEList->nExpr ){
|
||||||
resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr);
|
resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr);
|
||||||
@@ -1463,6 +1464,7 @@ static int resolveOrderGroupBy(
|
|||||||
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
|
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){
|
||||||
Expr *pE = pItem->pExpr;
|
Expr *pE = pItem->pExpr;
|
||||||
Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE);
|
Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE);
|
||||||
|
if( NEVER(pE2==0) ) continue;
|
||||||
if( zType[0]!='G' ){
|
if( zType[0]!='G' ){
|
||||||
iCol = resolveAsName(pParse, pSelect->pEList, pE2);
|
iCol = resolveAsName(pParse, pSelect->pEList, pE2);
|
||||||
if( iCol>0 ){
|
if( iCol>0 ){
|
||||||
|
|||||||
@@ -1995,7 +1995,7 @@ int sqlite3ColumnsFromExprList(
|
|||||||
/* If the column contains an "AS <name>" phrase, use <name> as the name */
|
/* If the column contains an "AS <name>" phrase, use <name> as the name */
|
||||||
}else{
|
}else{
|
||||||
Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr);
|
Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr);
|
||||||
while( pColExpr->op==TK_DOT ){
|
while( ALWAYS(pColExpr!=0) && pColExpr->op==TK_DOT ){
|
||||||
pColExpr = pColExpr->pRight;
|
pColExpr = pColExpr->pRight;
|
||||||
assert( pColExpr!=0 );
|
assert( pColExpr!=0 );
|
||||||
}
|
}
|
||||||
|
|||||||
20
src/where.c
20
src/where.c
@@ -235,6 +235,16 @@ static void createMask(WhereMaskSet *pMaskSet, int iCursor){
|
|||||||
pMaskSet->ix[pMaskSet->n++] = iCursor;
|
pMaskSet->ix[pMaskSet->n++] = iCursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** If the right-hand branch of the expression is a TK_COLUMN, then return
|
||||||
|
** a pointer to the right-hand branch. Otherwise, return NULL.
|
||||||
|
*/
|
||||||
|
static Expr *whereRightSubexprIsColumn(Expr *p){
|
||||||
|
p = sqlite3ExprSkipCollateAndLikely(p->pRight);
|
||||||
|
if( ALWAYS(p!=0) && p->op==TK_COLUMN ) return p;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Advance to the next WhereTerm that matches according to the criteria
|
** Advance to the next WhereTerm that matches according to the criteria
|
||||||
** established when the pScan object was initialized by whereScanInit().
|
** established when the pScan object was initialized by whereScanInit().
|
||||||
@@ -265,8 +275,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){
|
|||||||
){
|
){
|
||||||
if( (pTerm->eOperator & WO_EQUIV)!=0
|
if( (pTerm->eOperator & WO_EQUIV)!=0
|
||||||
&& pScan->nEquiv<ArraySize(pScan->aiCur)
|
&& pScan->nEquiv<ArraySize(pScan->aiCur)
|
||||||
&& (pX = sqlite3ExprSkipCollateAndLikely(pTerm->pExpr->pRight))->op
|
&& (pX = whereRightSubexprIsColumn(pTerm->pExpr))!=0
|
||||||
==TK_COLUMN
|
|
||||||
){
|
){
|
||||||
int j;
|
int j;
|
||||||
for(j=0; j<pScan->nEquiv; j++){
|
for(j=0; j<pScan->nEquiv; j++){
|
||||||
@@ -462,7 +471,8 @@ static int findIndexCol(
|
|||||||
|
|
||||||
for(i=0; i<pList->nExpr; i++){
|
for(i=0; i<pList->nExpr; i++){
|
||||||
Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr);
|
Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr);
|
||||||
if( p->op==TK_COLUMN
|
if( ALWAYS(p!=0)
|
||||||
|
&& p->op==TK_COLUMN
|
||||||
&& p->iColumn==pIdx->aiColumn[iCol]
|
&& p->iColumn==pIdx->aiColumn[iCol]
|
||||||
&& p->iTable==iBase
|
&& p->iTable==iBase
|
||||||
){
|
){
|
||||||
@@ -526,6 +536,7 @@ static int isDistinctRedundant(
|
|||||||
*/
|
*/
|
||||||
for(i=0; i<pDistinct->nExpr; i++){
|
for(i=0; i<pDistinct->nExpr; i++){
|
||||||
Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr);
|
Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr);
|
||||||
|
if( NEVER(p==0) ) continue;
|
||||||
if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1;
|
if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2811,6 +2822,7 @@ static int indexMightHelpWithOrderBy(
|
|||||||
if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0;
|
if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0;
|
||||||
for(ii=0; ii<pOB->nExpr; ii++){
|
for(ii=0; ii<pOB->nExpr; ii++){
|
||||||
Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr);
|
Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr);
|
||||||
|
if( NEVER(pExpr==0) ) continue;
|
||||||
if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){
|
if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){
|
||||||
if( pExpr->iColumn<0 ) return 1;
|
if( pExpr->iColumn<0 ) return 1;
|
||||||
for(jj=0; jj<pIndex->nKeyCol; jj++){
|
for(jj=0; jj<pIndex->nKeyCol; jj++){
|
||||||
@@ -3789,6 +3801,7 @@ static i8 wherePathSatisfiesOrderBy(
|
|||||||
for(i=0; i<nOrderBy; i++){
|
for(i=0; i<nOrderBy; i++){
|
||||||
if( MASKBIT(i) & obSat ) continue;
|
if( MASKBIT(i) & obSat ) continue;
|
||||||
pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr);
|
pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr);
|
||||||
|
if( NEVER(pOBExpr==0) ) continue;
|
||||||
if( pOBExpr->op!=TK_COLUMN ) continue;
|
if( pOBExpr->op!=TK_COLUMN ) continue;
|
||||||
if( pOBExpr->iTable!=iCur ) continue;
|
if( pOBExpr->iTable!=iCur ) continue;
|
||||||
pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn,
|
pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn,
|
||||||
@@ -3915,6 +3928,7 @@ static i8 wherePathSatisfiesOrderBy(
|
|||||||
pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr);
|
pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr);
|
||||||
testcase( wctrlFlags & WHERE_GROUPBY );
|
testcase( wctrlFlags & WHERE_GROUPBY );
|
||||||
testcase( wctrlFlags & WHERE_DISTINCTBY );
|
testcase( wctrlFlags & WHERE_DISTINCTBY );
|
||||||
|
if( NEVER(pOBExpr==0) ) continue;
|
||||||
if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0;
|
if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0;
|
||||||
if( iColumn>=XN_ROWID ){
|
if( iColumn>=XN_ROWID ){
|
||||||
if( pOBExpr->op!=TK_COLUMN ) continue;
|
if( pOBExpr->op!=TK_COLUMN ) continue;
|
||||||
|
|||||||
@@ -1451,6 +1451,7 @@ static void exprAnalyze(
|
|||||||
void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){
|
void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){
|
||||||
Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr);
|
Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr);
|
||||||
pWC->op = op;
|
pWC->op = op;
|
||||||
|
assert( pE2!=0 || pExpr==0 );
|
||||||
if( pE2==0 ) return;
|
if( pE2==0 ) return;
|
||||||
if( pE2->op!=op ){
|
if( pE2->op!=op ){
|
||||||
whereClauseInsert(pWC, pExpr, 0);
|
whereClauseInsert(pWC, pExpr, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user