Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(297)

Side by Side Diff: third_party/sqlite/src/src/where.c

Issue 1022423004: [sqlite backport] Fix collation dequoting. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/sqlite/src/src/sqliteInt.h ('k') | third_party/sqlite/src/test/collate1.test » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
(...skipping 1234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 */ 1245 */
1246 if( pWC->op==TK_AND 1246 if( pWC->op==TK_AND
1247 && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) 1247 && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase)
1248 ){ 1248 ){
1249 Expr *pLeft; /* LHS of LIKE/GLOB operator */ 1249 Expr *pLeft; /* LHS of LIKE/GLOB operator */
1250 Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */ 1250 Expr *pStr2; /* Copy of pStr1 - RHS of LIKE/GLOB operator */
1251 Expr *pNewExpr1; 1251 Expr *pNewExpr1;
1252 Expr *pNewExpr2; 1252 Expr *pNewExpr2;
1253 int idxNew1; 1253 int idxNew1;
1254 int idxNew2; 1254 int idxNew2;
1255 Token sCollSeqName; /* Name of collating sequence */ 1255 const char *zCollSeqName; /* Name of collating sequence */
1256 1256
1257 pLeft = pExpr->x.pList->a[1].pExpr; 1257 pLeft = pExpr->x.pList->a[1].pExpr;
1258 pStr2 = sqlite3ExprDup(db, pStr1, 0); 1258 pStr2 = sqlite3ExprDup(db, pStr1, 0);
1259 if( !db->mallocFailed ){ 1259 if( !db->mallocFailed ){
1260 u8 c, *pC; /* Last character before the first wildcard */ 1260 u8 c, *pC; /* Last character before the first wildcard */
1261 pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; 1261 pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1];
1262 c = *pC; 1262 c = *pC;
1263 if( noCase ){ 1263 if( noCase ){
1264 /* The point is to increment the last character before the first 1264 /* The point is to increment the last character before the first
1265 ** wildcard. But if we increment '@', that will push it into the 1265 ** wildcard. But if we increment '@', that will push it into the
1266 ** alphabetic range where case conversions will mess up the 1266 ** alphabetic range where case conversions will mess up the
1267 ** inequality. To avoid this, make sure to also run the full 1267 ** inequality. To avoid this, make sure to also run the full
1268 ** LIKE on all candidate expressions by clearing the isComplete flag 1268 ** LIKE on all candidate expressions by clearing the isComplete flag
1269 */ 1269 */
1270 if( c=='A'-1 ) isComplete = 0; 1270 if( c=='A'-1 ) isComplete = 0;
1271 c = sqlite3UpperToLower[c]; 1271 c = sqlite3UpperToLower[c];
1272 } 1272 }
1273 *pC = c + 1; 1273 *pC = c + 1;
1274 } 1274 }
1275 sCollSeqName.z = noCase ? "NOCASE" : "BINARY"; 1275 zCollSeqName = noCase ? "NOCASE" : "BINARY";
1276 sCollSeqName.n = 6;
1277 pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); 1276 pNewExpr1 = sqlite3ExprDup(db, pLeft, 0);
1278 pNewExpr1 = sqlite3PExpr(pParse, TK_GE, 1277 pNewExpr1 = sqlite3PExpr(pParse, TK_GE,
1279 sqlite3ExprAddCollateToken(pParse,pNewExpr1,&sCollSeqName), 1278 sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName),
1280 pStr1, 0); 1279 pStr1, 0);
1281 transferJoinMarkings(pNewExpr1, pExpr); 1280 transferJoinMarkings(pNewExpr1, pExpr);
1282 idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC); 1281 idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC);
1283 testcase( idxNew1==0 ); 1282 testcase( idxNew1==0 );
1284 exprAnalyze(pSrc, pWC, idxNew1); 1283 exprAnalyze(pSrc, pWC, idxNew1);
1285 pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); 1284 pNewExpr2 = sqlite3ExprDup(db, pLeft, 0);
1286 pNewExpr2 = sqlite3PExpr(pParse, TK_LT, 1285 pNewExpr2 = sqlite3PExpr(pParse, TK_LT,
1287 sqlite3ExprAddCollateToken(pParse,pNewExpr2,&sCollSeqName), 1286 sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName),
1288 pStr2, 0); 1287 pStr2, 0);
1289 transferJoinMarkings(pNewExpr2, pExpr); 1288 transferJoinMarkings(pNewExpr2, pExpr);
1290 idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC); 1289 idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC);
1291 testcase( idxNew2==0 ); 1290 testcase( idxNew2==0 );
1292 exprAnalyze(pSrc, pWC, idxNew2); 1291 exprAnalyze(pSrc, pWC, idxNew2);
1293 pTerm = &pWC->a[idxTerm]; 1292 pTerm = &pWC->a[idxTerm];
1294 if( isComplete ){ 1293 if( isComplete ){
1295 pWC->a[idxNew1].iParent = idxTerm; 1294 pWC->a[idxNew1].iParent = idxTerm;
1296 pWC->a[idxNew2].iParent = idxTerm; 1295 pWC->a[idxNew2].iParent = idxTerm;
1297 pTerm->nChild = 2; 1296 pTerm->nChild = 2;
(...skipping 5302 matching lines...) Expand 10 before | Expand all | Expand 10 after
6600 } 6599 }
6601 } 6600 }
6602 } 6601 }
6603 6602
6604 /* Final cleanup 6603 /* Final cleanup
6605 */ 6604 */
6606 pParse->nQueryLoop = pWInfo->savedNQueryLoop; 6605 pParse->nQueryLoop = pWInfo->savedNQueryLoop;
6607 whereInfoFree(db, pWInfo); 6606 whereInfoFree(db, pWInfo);
6608 return; 6607 return;
6609 } 6608 }
OLDNEW
« no previous file with comments | « third_party/sqlite/src/src/sqliteInt.h ('k') | third_party/sqlite/src/test/collate1.test » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698