From: drh <> Date: Mon, 29 Jul 2024 17:59:55 +0000 (+0000) Subject: The idea here was to simply an expression like "(a=5) IS TRUE" into X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fbroken-istrue-opt;p=thirdparty%2Fsqlite.git The idea here was to simply an expression like "(a=5) IS TRUE" into "(a=5)=TRUE". But that does not work, since the original form is FALSE if y is NULL whereas the second form is NULL. Patch save for historical reference only. FossilOrigin-Name: d029e94399ab3efc5d7f424493cb6e066b2c94a800d8e815328c570e8a585eb4 --- diff --git a/manifest b/manifest index 3fab5b62af..4d6388aa27 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sdocumentation\stypo.\s\n[forum:/forumpost/993cb82402|Forum\spost\s993cb82402] -D 2024-07-27T20:28:13.014 +C The\sidea\shere\swas\sto\ssimply\san\sexpression\slike\s"(a=5)\sIS\sTRUE"\sinto\n"(a=5)=TRUE".\s\sBut\sthat\sdoes\snot\swork,\ssince\sthe\soriginal\nform\sis\sFALSE\sif\sy\sis\sNULL\swhereas\sthe\ssecond\sform\sis\sNULL.\s\sPatch\nsave\sfor\shistorical\sreference\sonly. +D 2024-07-29T17:59:55.190 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -709,7 +709,7 @@ F src/date.c 13dd752847afb32ed70510ad7345a5b9c841f51ad904dba5d010f1fa3a6a324e F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782 F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43 F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500 -F src/expr.c fe958028b36af640b70b2174354c044f75b8c4a4645c921592122aa2a022083a +F src/expr.c b6cdef9cadc409c9aa27099c44a0b806e0611b4f34733f794dea27cc64907637 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 852f93c0ef995e0c2b8983059a2b97151c194cc8259e21f5bc2b7ac508348c2a F src/func.c 1f61e32e7a357e615b5d2e774bee563761fce4f2fd97ecb0f72c33e62a2ada5f @@ -757,14 +757,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c d99931f45416652895e502328ca49fe782cfc4e1ebdcda13b3736d991ebf42ce F src/printf.c 8b250972305e14b365561be5117ed0fd364e4fd58968776df1ce64c6280b90f9 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c 7e8d23ce7cdbfedf351a47e759f2722e8182ca10fd7580be43f4ce1f1a228145 +F src/resolve.c 678f0f6c4e69fd4fe4c8d9d76c8d80495ba92030ef7336621382897b01b9e8e5 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 6a95a2bffa6c09584dea99db5a7ae10c813305c09c92920ffc54f6eae2ba399e F src/shell.c.in 44c02fd1581d95e066b479241e081f37dc95c98452badd03627ef2a1c21bdc80 F src/sqlite.h.in 1ad9110150773c38ebababbad11b5cb361bcd3997676dec1c91ac5e0416a7b86 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h b77218c425891c7c90506c77fd2eb13bae03628d065b44fffeb37401cd955ac1 +F src/sqliteInt.h 2202de4cc386785dafdbfe54e3237c01b7e06972aaca8fb1417cd75b0be51b67 F src/sqliteLimit.h 6878ab64bdeb8c24a1d762d45635e34b96da21132179023338c93f820eee6728 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2199,8 +2199,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eb64d106551718467e0f6c6b53695410bf4c566901008e4cda8580d0f7efa7b0 -R ad51bbdd14781776f7624246eec357e7 +P 86de4e755e37dc1cbcbd59018927aa87ff49fc15f706a36187631d8f14075c12 +R 577db7894e90fd4bbbe316f442d40b04 +T *branch * broken-istrue-opt +T *sym-broken-istrue-opt * +T -sym-trunk * U drh -Z 102d909571cd81f9b00d601f888788db +Z f1758616771a221aa97fc75faf56a656 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index da015916e3..1317f9120d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86de4e755e37dc1cbcbd59018927aa87ff49fc15f706a36187631d8f14075c12 +d029e94399ab3efc5d7f424493cb6e066b2c94a800d8e815328c570e8a585eb4 diff --git a/src/expr.c b/src/expr.c index 53b0170ab4..8589da98d0 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2848,6 +2848,40 @@ int sqlite3ExprIsInteger(const Expr *p, int *pValue, Parse *pParse){ return rc; } +/* +** Return true if pExpr always returns integer 0 or integer 1 or NULL. +*/ +int sqlite3ExprIsBoolean(const Expr *pExpr){ + assert( pExpr!=0 ); + switch( pExpr->op ){ + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + case TK_IN: + case TK_TRUTH: + case TK_ISNULL: + case TK_NOTNULL: + case TK_IS: + case TK_ISNOT: + case TK_AND: + case TK_OR: + case TK_BETWEEN: + case TK_NOT: +/* +** case TK_EXISTS: // technical this is also a boolean. But the use case +** // for this routine does not allow for subqueries +** // so we might as well leave it out +*/ + return 1; + + default: + return 0; + } +} + /* ** Return FALSE if there is no chance that the expression can be NULL. ** diff --git a/src/resolve.c b/src/resolve.c index d5c1515a74..33bdfeef9b 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1391,8 +1391,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ int rc = resolveExprStep(pWalker, pRight); if( rc==WRC_Abort ) return WRC_Abort; if( pRight->op==TK_TRUEFALSE ){ - pExpr->op2 = pExpr->op; - pExpr->op = TK_TRUTH; + if( pExpr->op==TK_IS && sqlite3ExprIsBoolean(pExpr->pLeft) ){ + pExpr->op = TK_EQ; + }else{ + pExpr->op2 = pExpr->op; + pExpr->op = TK_TRUTH; + } return WRC_Continue; } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6a92befe0f..b8c00c5570 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -5097,6 +5097,7 @@ int sqlite3ExprIsSingleTableConstraint(Expr*,const SrcList*,int,int); int sqlite3ExprContainsSubquery(Expr*); #endif int sqlite3ExprIsInteger(const Expr*, int*, Parse*); +int sqlite3ExprIsBoolean(const Expr*); int sqlite3ExprCanBeNull(const Expr*); int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); int sqlite3IsRowid(const char*);