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 3fab5b6..4d6388a 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/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/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.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 da01591..1317f91 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-86de4e755e37dc1cbcbd59018927aa87ff49fc15f706a36187631d8f14075c12
+d029e94399ab3efc5d7f424493cb6e066b2c94a800d8e815328c570e8a585eb4
diff --git a/src/expr.c b/src/expr.c
index 53b0170..8589da9 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -2849,6 +2849,40 @@
 }
 
 /*
+** 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.
 **
 ** If the expression might be NULL or if the expression is too complex
diff --git a/src/resolve.c b/src/resolve.c
index d5c1515..33bdfee 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -1391,8 +1391,12 @@
         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 6a92bef..b8c00c5 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -5097,6 +5097,7 @@
 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*);