diff options
author | drh <drh@noemail.net> | 2012-12-08 21:36:26 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2012-12-08 21:36:26 +0000 |
commit | 261d8a51e218577415d2560e611b0ecdb055026f (patch) | |
tree | 548d56063db4109a99673d56c15c97f49f37f28e /src | |
parent | fb76f5a00c07b97d715816587e685dd0bd39c6f3 (diff) | |
download | sqlite-261d8a51e218577415d2560e611b0ecdb055026f.tar.gz sqlite-261d8a51e218577415d2560e611b0ecdb055026f.zip |
Adjustments to the collating-sequence refactoring to facilitate full-coverage
testing and to fix some minor issues found by TH3.
FossilOrigin-Name: cdbfa664839a409589ec7cebfc9111235d2f3b38
Diffstat (limited to 'src')
-rw-r--r-- | src/expr.c | 31 | ||||
-rw-r--r-- | src/vdbeaux.c | 26 | ||||
-rw-r--r-- | src/where.c | 2 |
3 files changed, 29 insertions, 30 deletions
diff --git a/src/expr.c b/src/expr.c index c58dfddea..9ca34ec7b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -77,13 +77,11 @@ Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr *pExpr, Token *pCollName){ return pExpr; } Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ - if( zC ){ - Token s; - s.z = zC; - s.n = sqlite3Strlen30(s.z); - pExpr = sqlite3ExprAddCollateToken(pParse, pExpr, &s); - } - return pExpr; + Token s; + assert( zC!=0 ); + s.z = zC; + s.n = sqlite3Strlen30(s.z); + return sqlite3ExprAddCollateToken(pParse, pExpr, &s); } /* @@ -110,13 +108,14 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ sqlite3 *db = pParse->db; CollSeq *pColl = 0; Expr *p = pExpr; - while( p && pColl==0 ){ + while( p ){ int op = p->op; if( op==TK_CAST || op==TK_UPLUS ){ p = p->pLeft; continue; } - if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ + assert( op!=TK_REGISTER || p->op2!=TK_COLLATE ); + if( op==TK_COLLATE ){ if( db->init.busy ){ /* Do not report errors when parsing while the schema */ pColl = sqlite3FindCollSeq(db, ENC(db), p->u.zToken, 0); @@ -139,7 +138,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ break; } if( p->flags & EP_Collate ){ - if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ + if( ALWAYS(p->pLeft) && (p->pLeft->flags & EP_Collate)!=0 ){ p = p->pLeft; }else{ p = p->pRight; @@ -3363,6 +3362,9 @@ static int evalConstExpr(Walker *pWalker, Expr *pExpr){ case TK_REGISTER: { return WRC_Prune; } + case TK_COLLATE: { + return WRC_Continue; + } case TK_FUNCTION: case TK_AGG_FUNCTION: case TK_CONST_FUNC: { @@ -3384,9 +3386,11 @@ static int evalConstExpr(Walker *pWalker, Expr *pExpr){ } if( isAppropriateForFactoring(pExpr) ){ int r1 = ++pParse->nMem; - int r2; - r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); - if( r1!=r2 ) sqlite3ReleaseTempReg(pParse, r1); + int r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); + /* If r2!=r1, it means that register r1 is never used. That is harmless + ** but suboptimal, so we want to know about the situation to fix it. + ** Hence the following assert: */ + assert( r2==r1 ); pExpr->op2 = pExpr->op; pExpr->op = TK_REGISTER; pExpr->iTable = r2; @@ -3826,7 +3830,6 @@ int sqlite3ExprCompare(Expr *pA, Expr *pB){ return pA->op==TK_COLLATE ? 1 : 2; } } - if( (pA->flags&EP_Collate)!=(pB->flags&EP_Collate) ) return 1; return 0; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 7f419ecda..3bf8e4714 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -866,22 +866,18 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ i = sqlite3Strlen30(zTemp); for(j=0; j<pKeyInfo->nField; j++){ CollSeq *pColl = pKeyInfo->aColl[j]; - if( pColl ){ - int n = sqlite3Strlen30(pColl->zName); - if( i+n>nTemp-6 ){ - memcpy(&zTemp[i],",...",4); - break; - } - zTemp[i++] = ','; - if( pKeyInfo->aSortOrder[j] ){ - zTemp[i++] = '-'; - } - memcpy(&zTemp[i], pColl->zName,n+1); - i += n; - }else if( i+4<nTemp-6 ){ - memcpy(&zTemp[i],",nil",4); - i += 4; + const char *zColl = pColl ? pColl->zName : "nil"; + int n = sqlite3Strlen30(zColl); + if( i+n>nTemp-6 ){ + memcpy(&zTemp[i],",...",4); + break; + } + zTemp[i++] = ','; + if( pKeyInfo->aSortOrder[j] ){ + zTemp[i++] = '-'; } + memcpy(&zTemp[i], zColl, n+1); + i += n; } zTemp[i++] = ')'; zTemp[i] = 0; diff --git a/src/where.c b/src/where.c index 49c3ab95c..e5e497ad0 100644 --- a/src/where.c +++ b/src/where.c @@ -670,7 +670,7 @@ static WhereTerm *findTerm( for(j=0; pIdx->aiColumn[j]!=iColumn; j++){ if( NEVER(j>=pIdx->nColumn) ) return 0; } - if( pColl && sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue; + if( sqlite3StrICmp(pColl->zName, pIdx->azColl[j]) ) continue; } return pTerm; } |