| Index: third_party/sqlite/src/test/e_expr.test | 
| diff --git a/third_party/sqlite/src/test/e_expr.test b/third_party/sqlite/src/test/e_expr.test | 
| index 1e7685352e69049ef7ea9d020be3a0214e750c60..271635f9442970510a8d709e3cefec5ef42c1521 100644 | 
| --- a/third_party/sqlite/src/test/e_expr.test | 
| +++ b/third_party/sqlite/src/test/e_expr.test | 
| @@ -17,6 +17,10 @@ set testdir [file dirname $argv0] | 
| source $testdir/tester.tcl | 
| source $testdir/malloc_common.tcl | 
|  | 
| +ifcapable !compound { | 
| +  finish_test | 
| +  return | 
| +} | 
|  | 
| proc do_expr_test {tn expr type value} { | 
| uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [ | 
| @@ -362,9 +366,9 @@ db collate reverse reverse_collate | 
| # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix | 
| # operator that assigns a collating sequence to an expression. | 
| # | 
| -# EVIDENCE-OF: R-23441-22541 The COLLATE operator has a higher | 
| -# precedence (binds more tightly) than any prefix unary operator or any | 
| -# binary operator. | 
| +# EVIDENCE-OF: R-36231-30731 The COLLATE operator has a higher | 
| +# precedence (binds more tightly) than any binary operator and any unary | 
| +# prefix operator except "~". | 
| # | 
| do_execsql_test e_expr-9.1 { SELECT  'abcd' < 'bbbb'    COLLATE reverse } 0 | 
| do_execsql_test e_expr-9.2 { SELECT ('abcd' < 'bbbb')   COLLATE reverse } 1 | 
| @@ -446,7 +450,7 @@ do_execsql_test e_expr-10.3.4 { SELECT typeof('isn''t') } {text} | 
| # containing hexadecimal data and preceded by a single "x" or "X" | 
| # character. | 
| # | 
| -# EVIDENCE-OF: R-39344-59787 For example: X'53514C697465' | 
| +# EVIDENCE-OF: R-19836-11244 Example: X'53514C697465' | 
| # | 
| do_execsql_test e_expr-10.4.1 { SELECT typeof(X'0123456789ABCDEF') } blob | 
| do_execsql_test e_expr-10.4.2 { SELECT typeof(x'0123456789ABCDEF') } blob | 
| @@ -627,7 +631,7 @@ do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK | 
| #------------------------------------------------------------------------- | 
| # "Test" the syntax diagrams in lang_expr.html. | 
| # | 
| -# EVIDENCE-OF: R-62067-43884 -- syntax diagram signed-number | 
| +# -- syntax diagram signed-number | 
| # | 
| do_execsql_test e_expr-12.1.1 { SELECT 0, +0, -0 } {0 0 0} | 
| do_execsql_test e_expr-12.1.2 { SELECT 1, +1, -1 } {1 1 -1} | 
| @@ -642,7 +646,7 @@ do_execsql_test e_expr-12.1.6 { | 
| SELECT 0.0001, +0.0001, -0.0001 | 
| } {0.0001 0.0001 -0.0001} | 
|  | 
| -# EVIDENCE-OF: R-21258-25489 -- syntax diagram literal-value | 
| +# -- syntax diagram literal-value | 
| # | 
| set sqlite_current_time 1 | 
| do_execsql_test e_expr-12.2.1 {SELECT 123}               {123} | 
| @@ -655,9 +659,9 @@ do_execsql_test e_expr-12.2.7 {SELECT CURRENT_DATE}      {1970-01-01} | 
| do_execsql_test e_expr-12.2.8 {SELECT CURRENT_TIMESTAMP} {{1970-01-01 00:00:01}} | 
| set sqlite_current_time 0 | 
|  | 
| -# EVIDENCE-OF: R-57598-59332 -- syntax diagram expr | 
| +# -- syntax diagram expr | 
| # | 
| -file delete -force test.db2 | 
| +forcedelete test.db2 | 
| execsql { | 
| ATTACH 'test.db2' AS dbname; | 
| CREATE TABLE dbname.tblname(cname); | 
| @@ -812,7 +816,7 @@ foreach {tn expr} { | 
| } | 
| } | 
|  | 
| -# EVIDENCE-OF: R-49462-56079 -- syntax diagram raise-function | 
| +# -- syntax diagram raise-function | 
| # | 
| foreach {tn raiseexpr} { | 
| 1 "RAISE(IGNORE)" | 
| @@ -1077,9 +1081,9 @@ ifcapable !icu { | 
| # EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for | 
| # the regexp() user function. | 
| # | 
| -# EVIDENCE-OF: R-57289-13578 If a application-defined SQL function named | 
| -# "regexp" is added at run-time, that function will be called in order | 
| -# to implement the REGEXP operator. | 
| +# EVIDENCE-OF: R-65524-61849 If an application-defined SQL function | 
| +# named "regexp" is added at run-time, then the "X REGEXP Y" operator | 
| +# will be implemented as a call to "regexp(Y,X)". | 
| # | 
| proc regexpfunc {args} { | 
| eval lappend ::regexpargs $args | 
| @@ -1290,7 +1294,7 @@ proc rev {str} { | 
| set ret | 
| } | 
| proc reverse {lhs rhs} { | 
| -  string compare [rev $lhs] [ref $rhs] | 
| +  string compare [rev $lhs] [rev $rhs] | 
| } | 
| db collate reverse reverse | 
| do_execsql_test e_expr-23.1.1 { | 
| @@ -1313,7 +1317,7 @@ do_execsql_test e_expr-23.1.4 { | 
| } {B} | 
| do_execsql_test e_expr-23.1.5 { | 
| SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1 | 
| -} {A} | 
| +} {B} | 
| do_execsql_test e_expr-23.1.6 { | 
| SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END | 
| } {B} | 
| @@ -1403,10 +1407,12 @@ do_test e_expr-26.1.6 { set ::evalcount } {5} | 
| #------------------------------------------------------------------------- | 
| # Test statements related to CAST expressions. | 
| # | 
| -# EVIDENCE-OF: R-65079-31758 Application of a CAST expression is | 
| -# different to application of a column affinity, as with a CAST | 
| -# expression the storage class conversion is forced even if it is lossy | 
| -# and irrreversible. | 
| +# EVIDENCE-OF: R-20854-17109 A CAST conversion is similar to the | 
| +# conversion that takes place when a column affinity is applied to a | 
| +# value except that with the CAST operator the conversion always takes | 
| +# place even if the conversion lossy and irreversible, whereas column | 
| +# affinity only changes the data type of a value if the change is | 
| +# lossless and reversible. | 
| # | 
| do_execsql_test e_expr-27.1.1 { | 
| CREATE TABLE t3(a TEXT, b REAL, c INTEGER); | 
| @@ -1590,26 +1596,36 @@ do_expr_test e_expr-30.4.1 { CAST('' AS INTEGER) } integer 0 | 
| do_expr_test e_expr-30.4.2 { CAST('not a number' AS INTEGER) } integer 0 | 
| do_expr_test e_expr-30.4.3 { CAST('XXI' AS INTEGER) } integer 0 | 
|  | 
| -# EVIDENCE-OF: R-00741-38776 A cast of a REAL value into an INTEGER will | 
| -# truncate the fractional part of the REAL. | 
| +# EVIDENCE-OF: R-08980-53124 The CAST operator understands decimal | 
| +# integers only — conversion of hexadecimal integers stops at | 
| +# the "x" in the "0x" prefix of the hexadecimal integer string and thus | 
| +# result of the CAST is always zero. | 
| +do_expr_test e_expr-30.5.1 { CAST('0x1234' AS INTEGER) } integer 0 | 
| +do_expr_test e_expr-30.5.2 { CAST('0X1234' AS INTEGER) } integer 0 | 
| + | 
| +# EVIDENCE-OF: R-02752-50091 A cast of a REAL value into an INTEGER | 
| +# results in the integer between the REAL value and zero that is closest | 
| +# to the REAL value. | 
| # | 
| do_expr_test e_expr-31.1.1 { CAST(3.14159 AS INTEGER) } integer 3 | 
| do_expr_test e_expr-31.1.2 { CAST(1.99999 AS INTEGER) } integer 1 | 
| do_expr_test e_expr-31.1.3 { CAST(-1.99999 AS INTEGER) } integer -1 | 
| do_expr_test e_expr-31.1.4 { CAST(-0.99999 AS INTEGER) } integer 0 | 
|  | 
| -# EVIDENCE-OF: R-06126-36021 If an REAL is too large to be represented | 
| -# as an INTEGER then the result of the cast is the largest negative | 
| -# integer: -9223372036854775808. | 
| +# EVIDENCE-OF: R-51517-40824 If a REAL is greater than the greatest | 
| +# possible signed integer (+9223372036854775807) then the result is the | 
| +# greatest possible signed integer and if the REAL is less than the | 
| +# least possible signed integer (-9223372036854775808) then the result | 
| +# is the least possible signed integer. | 
| # | 
| -do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer -9223372036854775808 | 
| +do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer 9223372036854775807 | 
| do_expr_test e_expr-31.2.2 { CAST(-2e+50 AS INT) } integer -9223372036854775808 | 
| do_expr_test e_expr-31.2.3 { | 
| CAST(-9223372036854775809.0 AS INT) | 
| } integer -9223372036854775808 | 
| do_expr_test e_expr-31.2.4 { | 
| CAST(9223372036854775809.0 AS INT) | 
| -} integer -9223372036854775808 | 
| +} integer 9223372036854775807 | 
|  | 
|  | 
| # EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC | 
| @@ -1675,7 +1691,7 @@ db3 close | 
| # Test statements related to the EXISTS and NOT EXISTS operators. | 
| # | 
| catch { db close } | 
| -file delete -force test.db | 
| +forcedelete test.db | 
| sqlite3 db test.db | 
|  | 
| do_execsql_test e_expr-34.1 { | 
| @@ -1756,7 +1772,7 @@ foreach {tn e1 e2} { | 
| # | 
|  | 
| catch { db close } | 
| -file delete -force test.db | 
| +forcedelete test.db | 
| sqlite3 db test.db | 
| do_test e_expr-35.0 { | 
| execsql { | 
| @@ -1843,6 +1859,43 @@ foreach {tn expr} { | 
| do_expr_test e_expr-36.4.$tn $expr null {} | 
| } | 
|  | 
| +# EVIDENCE-OF: R-62477-06476 For example, the values NULL, 0.0, 0, | 
| +# 'english' and '0' are all considered to be false. | 
| +# | 
| +do_execsql_test e_expr-37.1 { | 
| +   SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END; | 
| +} {false} | 
| +do_execsql_test e_expr-37.2 { | 
| +   SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END; | 
| +} {false} | 
| +do_execsql_test e_expr-37.3 { | 
| +   SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END; | 
| +} {false} | 
| +do_execsql_test e_expr-37.4 { | 
| +   SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END; | 
| +} {false} | 
| +do_execsql_test e_expr-37.5 { | 
| +   SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END; | 
| +} {false} | 
|  | 
| -finish_test | 
| +# EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are | 
| +# considered to be true. | 
| +# | 
| +do_execsql_test e_expr-37.6 { | 
| +   SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END; | 
| +} {true} | 
| +do_execsql_test e_expr-37.7 { | 
| +   SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END; | 
| +} {true} | 
| +do_execsql_test e_expr-37.8 { | 
| +   SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END; | 
| +} {true} | 
| +do_execsql_test e_expr-37.9 { | 
| +   SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END; | 
| +} {true} | 
| +do_execsql_test e_expr-37.10 { | 
| +   SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END; | 
| +} {true} | 
|  | 
| + | 
| +finish_test | 
|  |