]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The idea here was to simply an expression like "(a=5) IS TRUE" into broken-istrue-opt
authordrh <>
Mon, 29 Jul 2024 17:59:55 +0000 (17:59 +0000)
committerdrh <>
Mon, 29 Jul 2024 17:59:55 +0000 (17:59 +0000)
"(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

manifest
manifest.uuid
src/expr.c
src/resolve.c
src/sqliteInt.h

index 3fab5b62afbd96eeb14e2080a02445c71b7ae860..4d6388aa27a91891b7c54390a6c400c3cbb226e5 100644 (file)
--- 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.
index da015916e3176212652a2966b35964f7522ad3cf..1317f9120d3ccb247dadfcb4cc098c14c5c88523 100644 (file)
@@ -1 +1 @@
-86de4e755e37dc1cbcbd59018927aa87ff49fc15f706a36187631d8f14075c12
+d029e94399ab3efc5d7f424493cb6e066b2c94a800d8e815328c570e8a585eb4
index 53b0170ab4ec040398417e2338d7a70992db1c26..8589da98d01d55c4fd290e503d701cfadd8bff06 100644 (file)
@@ -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.
 **
index d5c1515a7470b9a7e9e077aa388905092a6cb9f8..33bdfeef9b023b835092602dd21943f6938034dd 100644 (file)
@@ -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;
         }
       }
index 6a92befe0f41b94270fc7de30f26b5e530ae49e5..b8c00c55703dff3d1dcd66df623f7f56a7ac5628 100644 (file)
@@ -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*);