From 60ad5266394ae6b5fe879618eaf81a42df081188 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 28 Nov 2024 00:34:20 +0000 Subject: [PATCH 1/4] Enhancements to sqlite3ExprImpliesExpr() so that it realizes that "iif(A,B)" implies "A". FossilOrigin-Name: d96ecbee59b50eca25447456dfff2c168e8eade7a68e542932d5829f97debb31 --- manifest | 19 ++++++----- manifest.uuid | 2 +- src/expr.c | 90 ++++++++++++++++++++++++++++++++++++++++----------- src/where.c | 1 - 4 files changed, 83 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 2c47dca7a7..a34db27f4e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sinaccuracy\sin\sthe\sdocumentation\sin\sfts5.h. -D 2024-11-27T18:01:25.186 +C Enhancements\sto\ssqlite3ExprImpliesExpr()\sso\sthat\sit\srealizes\sthat\n"iif(A,B)"\simplies\s"A". +D 2024-11-28T00:34:20.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -726,7 +726,7 @@ F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a F src/dbpage.c db1be8adaf1f839ad733c08baeac5c22aa912f7b535865c0c061382602081360 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c a9d9f5fdfbdd3b2c94d7af1b11f181464b8a641736cf32cb92fa3c5e7ecb30df +F src/expr.c bc1e0266dfd88c996e509550220b74b46c7654b0818909adba8ba8227452cd3e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 49489dcce46d2d491cedb451e974264150c473e5f5bba448498a9aa4c1993537 @@ -860,7 +860,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 8b7e309a8012659ac9275ad8cdcc6acaf73fa04b1090e38a01335f230fd10681 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 504d72098437ab97dfd3a71cea85e554381650f9dffde277c66603f3e34daddc +F src/where.c b34adb09fdb2a4f57a0bafd4194b501047ef383976fef9f0ac3f395f4881694d F src/whereInt.h 1e36ec50392f7cc3d93d1152d4338064cd522b87156a0739388b7e273735f0ca F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2201,8 +2201,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1e405c39a8405e2081ce061559d1aacc70055fc74ab86d886b973076a3fb124b -R 306a37bedf7a72c95bbfd16141af1dca -U dan -Z 0f8994542e0c6b090d32b7bcc99e7877 +P ec3ca6f17972a9624018ae352e5a4be8dc34602a4569c80e827e09cd7fbed7f7 +R 7e7059a06e37f0bd3101b74065b6331a +T *branch * expr-implies-expr +T *sym-expr-implies-expr * +T -sym-trunk * +U drh +Z 9da80189eab742fa7806914a5f17a037 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2abc82dd83..f8884a526d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ec3ca6f17972a9624018ae352e5a4be8dc34602a4569c80e827e09cd7fbed7f7 +d96ecbee59b50eca25447456dfff2c168e8eade7a68e542932d5829f97debb31 diff --git a/src/expr.c b/src/expr.c index cc915987dd..68cb60012d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6180,16 +6180,20 @@ void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ ** same as that currently bound to variable pVar, non-zero is returned. ** Otherwise, if the values are not the same or if pExpr is not a simple ** SQL value, zero is returned. +** +** If the SQLITE_EnableQPSG flag is set on the database connection, then +** this routine always returns false. */ -static int exprCompareVariable( +static SQLITE_NOINLINE int exprCompareVariable( const Parse *pParse, const Expr *pVar, const Expr *pExpr ){ - int res = 0; + int res = 2; int iVar; sqlite3_value *pL, *pR = 0; + if( (pParse->db->flags & SQLITE_EnableQPSG)!=0 ) return 2; sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR); if( pR ){ iVar = pVar->iColumn; @@ -6199,12 +6203,11 @@ static int exprCompareVariable( if( sqlite3_value_type(pL)==SQLITE_TEXT ){ sqlite3_value_text(pL); /* Make sure the encoding is UTF-8 */ } - res = 0==sqlite3MemCompare(pL, pR, 0); + res = sqlite3MemCompare(pL, pR, 0) ? 2 : 0; } sqlite3ValueFree(pR); sqlite3ValueFree(pL); } - return res; } @@ -6230,12 +6233,10 @@ static int exprCompareVariable( ** just might result in some slightly slower code. But returning ** an incorrect 0 or 1 could lead to a malfunction. ** -** If pParse is not NULL then TK_VARIABLE terms in pA with bindings in -** pParse->pReprepare can be matched against literals in pB. The -** pParse->pVdbe->expmask bitmask is updated for each variable referenced. -** If pParse is NULL (the normal case) then any TK_VARIABLE term in -** Argument pParse should normally be NULL. If it is not NULL and pA or -** pB causes a return value of 2. +** If pParse is not NULL and SQLITE_EnableQPSG is off then TK_VARIABLE +** terms in pA with bindings in pParse->pReprepare can be matched against +** literals in pB. The pParse->pVdbe->expmask bitmask is updated for +** each variable referenced. */ int sqlite3ExprCompare( const Parse *pParse, @@ -6247,8 +6248,8 @@ int sqlite3ExprCompare( if( pA==0 || pB==0 ){ return pB==pA ? 0 : 2; } - if( pParse && pA->op==TK_VARIABLE && exprCompareVariable(pParse, pA, pB) ){ - return 0; + if( pParse && pA->op==TK_VARIABLE ){ + return exprCompareVariable(pParse, pA, pB); } combinedFlags = pA->flags | pB->flags; if( combinedFlags & EP_IntValue ){ @@ -6443,18 +6444,66 @@ static int exprImpliesNotNull( return 0; } +/* +** Return true if the boolean value of the expression is always either +** FALSE or NULL. +*/ +static int sqlite3ExprIsNotTrue(Expr *pExpr){ + int v; + if( pExpr->op==TK_NULL ) return 1; + if( pExpr->op==TK_TRUEFALSE && sqlite3ExprTruthValue(pExpr)==0 ) return 1; + v = 1; + if( sqlite3ExprIsInteger(pExpr, &v, 0) && v==0 ) return 1; + return 0; +} + +/* +** Return true if the expression is one of the following: +** +** CASE WHEN x THEN y END +** CASE WHEN x THEN y ELSE NULL END +** CASE WHEN x THEN y ELSE false END +** iif(x,y) +** iif(x,y,NULL) +** iif(x,y,false) +*/ +static int sqlite3ExprIsIIF(sqlite3 *db, const Expr *pExpr){ + ExprList *pList; + if( pExpr->op==TK_FUNCTION ){ + const char *z = pExpr->u.zToken; + FuncDef *pDef; + if( (z[0]!='i' && z[0]!='I') ) return 0; + if( pExpr->x.pList==0 ) return 0; + pDef = sqlite3FindFunction(db, z, pExpr->x.pList->nExpr, ENC(db), 0); + if( pDef==0 ) return 0; + if( (pDef->funcFlags & SQLITE_FUNC_INLINE)==0 ) return 0; + if( SQLITE_PTR_TO_INT(pDef->pUserData)!=INLINEFUNC_iif ) return 0; + }else if( pExpr->op==TK_CASE ){ + if( pExpr->pLeft!=0 ) return 0; + }else{ + return 0; + } + pList = pExpr->x.pList; + assert( pList!=0 ); + if( pList->nExpr==2 ) return 1; + if( pList->nExpr==3 && sqlite3ExprIsNotTrue(pList->a[2].pExpr) ) return 1; + return 0; +} + /* ** Return true if we can prove the pE2 will always be true if pE1 is ** true. Return false if we cannot complete the proof or if pE2 might ** be false. Examples: ** -** pE1: x==5 pE2: x==5 Result: true -** pE1: x>0 pE2: x==5 Result: false -** pE1: x=21 pE2: x=21 OR y=43 Result: true -** pE1: x!=123 pE2: x IS NOT NULL Result: true -** pE1: x!=?1 pE2: x IS NOT NULL Result: true -** pE1: x IS NULL pE2: x IS NOT NULL Result: false -** pE1: x IS ?2 pE2: x IS NOT NULL Result: false +** pE1: x==5 pE2: x==5 Result: true +** pE1: x>0 pE2: x==5 Result: false +** pE1: x=21 pE2: x=21 OR y=43 Result: true +** pE1: x!=123 pE2: x IS NOT NULL Result: true +** pE1: x!=?1 pE2: x IS NOT NULL Result: true +** pE1: x IS NULL pE2: x IS NOT NULL Result: false +** pE1: x IS ?2 pE2: x IS NOT NULL Result: false +** pE1: iif(x,y) pE2: x Result: true +** PE1: iif(x,y,0) pE2: x Result: true ** ** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has ** Expr.iTable<0 then assume a table number given by iTab. @@ -6488,6 +6537,9 @@ int sqlite3ExprImpliesExpr( ){ return 1; } + if( sqlite3ExprIsIIF(pParse->db, pE1) ){ + return sqlite3ExprImpliesExpr(pParse,pE1->x.pList->a[0].pExpr,pE2,iTab); + } return 0; } diff --git a/src/where.c b/src/where.c index 1315a8cc37..5abb40eced 100644 --- a/src/where.c +++ b/src/where.c @@ -3564,7 +3564,6 @@ static int whereUsablePartialIndex( if( !whereUsablePartialIndex(iTab,jointype,pWC,pWhere->pLeft) ) return 0; pWhere = pWhere->pRight; } - if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr; pExpr = pTerm->pExpr; From bfb7f77a8cbad0958abd2e436431d46b345609bb Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 28 Nov 2024 00:58:37 +0000 Subject: [PATCH 2/4] Add two NEVER() conditions. FossilOrigin-Name: 4f358ad20dc8a45e7aaa1a1996b40abd39caf34be6556ed54e1e0c80572b7ac0 --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/expr.c | 4 ++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index a34db27f4e..142c278cbf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\ssqlite3ExprImpliesExpr()\sso\sthat\sit\srealizes\sthat\n"iif(A,B)"\simplies\s"A". -D 2024-11-28T00:34:20.169 +C Add\stwo\sNEVER()\sconditions. +D 2024-11-28T00:58:37.403 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -726,7 +726,7 @@ F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a F src/dbpage.c db1be8adaf1f839ad733c08baeac5c22aa912f7b535865c0c061382602081360 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c bc1e0266dfd88c996e509550220b74b46c7654b0818909adba8ba8227452cd3e +F src/expr.c 9084ade243ef14259986230a5f3599459eaf7cf200b87b5fe8dc29187cdcde2c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 49489dcce46d2d491cedb451e974264150c473e5f5bba448498a9aa4c1993537 @@ -2201,11 +2201,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ec3ca6f17972a9624018ae352e5a4be8dc34602a4569c80e827e09cd7fbed7f7 -R 7e7059a06e37f0bd3101b74065b6331a -T *branch * expr-implies-expr -T *sym-expr-implies-expr * -T -sym-trunk * +P d96ecbee59b50eca25447456dfff2c168e8eade7a68e542932d5829f97debb31 +R c1720db3ecd4ced84ca8ae6628cd5f49 U drh -Z 9da80189eab742fa7806914a5f17a037 +Z c947295bb77ac6e7f18a91b6b404684e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f8884a526d..59b628059b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d96ecbee59b50eca25447456dfff2c168e8eade7a68e542932d5829f97debb31 +4f358ad20dc8a45e7aaa1a1996b40abd39caf34be6556ed54e1e0c80572b7ac0 diff --git a/src/expr.c b/src/expr.c index 68cb60012d..6c7a93118e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6475,9 +6475,9 @@ static int sqlite3ExprIsIIF(sqlite3 *db, const Expr *pExpr){ if( (z[0]!='i' && z[0]!='I') ) return 0; if( pExpr->x.pList==0 ) return 0; pDef = sqlite3FindFunction(db, z, pExpr->x.pList->nExpr, ENC(db), 0); - if( pDef==0 ) return 0; + if( NEVER(pDef==0) ) return 0; if( (pDef->funcFlags & SQLITE_FUNC_INLINE)==0 ) return 0; - if( SQLITE_PTR_TO_INT(pDef->pUserData)!=INLINEFUNC_iif ) return 0; + if( NEVER(SQLITE_PTR_TO_INT(pDef->pUserData)!=INLINEFUNC_iif) ) return 0; }else if( pExpr->op==TK_CASE ){ if( pExpr->pLeft!=0 ) return 0; }else{ From 3ff6aa6e3999a0e9fadbc80926e69e3f2b91ad68 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 28 Nov 2024 01:47:44 +0000 Subject: [PATCH 3/4] The sqlite3ExprCompare() routine should always compare the same variables as equal to one another, regardless of whether or not QPSG is set. FossilOrigin-Name: df95d5209a77c0302e08ea7b1f248646fb2a062ba5beca898678aee0a1d03a3a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 142c278cbf..24769f2a3d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stwo\sNEVER()\sconditions. -D 2024-11-28T00:58:37.403 +C The\ssqlite3ExprCompare()\sroutine\sshould\salways\scompare\sthe\ssame\svariables\nas\sequal\sto\sone\sanother,\sregardless\sof\swhether\sor\snot\sQPSG\sis\sset. +D 2024-11-28T01:47:44.201 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -726,7 +726,7 @@ F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a F src/dbpage.c db1be8adaf1f839ad733c08baeac5c22aa912f7b535865c0c061382602081360 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c 9084ade243ef14259986230a5f3599459eaf7cf200b87b5fe8dc29187cdcde2c +F src/expr.c 4c63e54936581c817ae8016206d166d80984767dcbe8260335d30a3a949b46b8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 49489dcce46d2d491cedb451e974264150c473e5f5bba448498a9aa4c1993537 @@ -2201,8 +2201,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d96ecbee59b50eca25447456dfff2c168e8eade7a68e542932d5829f97debb31 -R c1720db3ecd4ced84ca8ae6628cd5f49 +P 4f358ad20dc8a45e7aaa1a1996b40abd39caf34be6556ed54e1e0c80572b7ac0 +R bf789819bbc729d8b5b556765482541d U drh -Z c947295bb77ac6e7f18a91b6b404684e +Z cce72d62fb16414e1a59b528ee955fa0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 59b628059b..f688f406bf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f358ad20dc8a45e7aaa1a1996b40abd39caf34be6556ed54e1e0c80572b7ac0 +df95d5209a77c0302e08ea7b1f248646fb2a062ba5beca898678aee0a1d03a3a diff --git a/src/expr.c b/src/expr.c index 6c7a93118e..709d90fad4 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6193,6 +6193,15 @@ static SQLITE_NOINLINE int exprCompareVariable( int iVar; sqlite3_value *pL, *pR = 0; + if( pExpr->op==TK_VARIABLE ){ + assert( pVar->u.zToken!=0 ); + assert( pExpr->u.zToken!=0 ); + if( pVar->iColumn==pExpr->iColumn + && strcmp(pVar->u.zToken,pExpr->u.zToken)==0 + ){ + return 0; + } + } if( (pParse->db->flags & SQLITE_EnableQPSG)!=0 ) return 2; sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR); if( pR ){ From dc7b94e63f682db6ccda6ae41bf105ce8bbb0a5c Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 28 Nov 2024 02:09:27 +0000 Subject: [PATCH 4/4] Simplification to the fix in the prior check-in. FossilOrigin-Name: f79cb748c9447ca4d2184a24219feb19571eb79870e0bedf14704743a3d5f8b9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 10 ++-------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 24769f2a3d..08329b81dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3ExprCompare()\sroutine\sshould\salways\scompare\sthe\ssame\svariables\nas\sequal\sto\sone\sanother,\sregardless\sof\swhether\sor\snot\sQPSG\sis\sset. -D 2024-11-28T01:47:44.201 +C Simplification\sto\sthe\sfix\sin\sthe\sprior\scheck-in. +D 2024-11-28T02:09:27.502 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -726,7 +726,7 @@ F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a F src/dbpage.c db1be8adaf1f839ad733c08baeac5c22aa912f7b535865c0c061382602081360 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c 4c63e54936581c817ae8016206d166d80984767dcbe8260335d30a3a949b46b8 +F src/expr.c b838969c58a38dfedabec18c432204895c7333d7a509a20fa63c39bf92001f0e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 49489dcce46d2d491cedb451e974264150c473e5f5bba448498a9aa4c1993537 @@ -2201,8 +2201,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4f358ad20dc8a45e7aaa1a1996b40abd39caf34be6556ed54e1e0c80572b7ac0 -R bf789819bbc729d8b5b556765482541d +P df95d5209a77c0302e08ea7b1f248646fb2a062ba5beca898678aee0a1d03a3a +R 2a463ba8c7e54a6e85c2163c1e1ce03b U drh -Z cce72d62fb16414e1a59b528ee955fa0 +Z 5b8128e8d052469f340725fed84274b9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f688f406bf..d656caede7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df95d5209a77c0302e08ea7b1f248646fb2a062ba5beca898678aee0a1d03a3a +f79cb748c9447ca4d2184a24219feb19571eb79870e0bedf14704743a3d5f8b9 diff --git a/src/expr.c b/src/expr.c index 709d90fad4..d0282f7147 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6193,14 +6193,8 @@ static SQLITE_NOINLINE int exprCompareVariable( int iVar; sqlite3_value *pL, *pR = 0; - if( pExpr->op==TK_VARIABLE ){ - assert( pVar->u.zToken!=0 ); - assert( pExpr->u.zToken!=0 ); - if( pVar->iColumn==pExpr->iColumn - && strcmp(pVar->u.zToken,pExpr->u.zToken)==0 - ){ - return 0; - } + if( pExpr->op==TK_VARIABLE && pVar->iColumn==pExpr->iColumn ){ + return 0; } if( (pParse->db->flags & SQLITE_EnableQPSG)!=0 ) return 2; sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR);