Compare commits

...

1 Commits

Author SHA1 Message Date
drh ede695ab23 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
2024-07-29 17:59:55 +00:00
5 changed files with 53 additions and 11 deletions
+11 -8
View File
@@ -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.
+1 -1
View File
@@ -1 +1 @@
86de4e755e37dc1cbcbd59018927aa87ff49fc15f706a36187631d8f14075c12
d029e94399ab3efc5d7f424493cb6e066b2c94a800d8e815328c570e8a585eb4
+34
View 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.
**
+6 -2
View 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;
}
}
+1
View 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*);