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 |