OLD | NEW |
1 # 2010 July 16 | 1 # 2010 July 16 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 # This file implements tests to verify that the "testable statements" in | 12 # This file implements tests to verify that the "testable statements" in |
13 # the lang_expr.html document are correct. | 13 # the lang_expr.html document are correct. |
14 # | 14 # |
15 | 15 |
16 set testdir [file dirname $argv0] | 16 set testdir [file dirname $argv0] |
17 source $testdir/tester.tcl | 17 source $testdir/tester.tcl |
18 source $testdir/malloc_common.tcl | 18 source $testdir/malloc_common.tcl |
19 | 19 |
| 20 ifcapable !compound { |
| 21 finish_test |
| 22 return |
| 23 } |
20 | 24 |
21 proc do_expr_test {tn expr type value} { | 25 proc do_expr_test {tn expr type value} { |
22 uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [ | 26 uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [ |
23 list [list $type $value] | 27 list [list $type $value] |
24 ] | 28 ] |
25 } | 29 } |
26 | 30 |
27 proc do_qexpr_test {tn expr value} { | 31 proc do_qexpr_test {tn expr value} { |
28 uplevel do_execsql_test $tn [list "SELECT quote($expr)"] [list $value] | 32 uplevel do_execsql_test $tn [list "SELECT quote($expr)"] [list $value] |
29 } | 33 } |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 set out | 359 set out |
356 } | 360 } |
357 proc reverse_collate {zLeft zRight} { | 361 proc reverse_collate {zLeft zRight} { |
358 string compare [reverse_str $zLeft] [reverse_str $zRight] | 362 string compare [reverse_str $zLeft] [reverse_str $zRight] |
359 } | 363 } |
360 db collate reverse reverse_collate | 364 db collate reverse reverse_collate |
361 | 365 |
362 # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix | 366 # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix |
363 # operator that assigns a collating sequence to an expression. | 367 # operator that assigns a collating sequence to an expression. |
364 # | 368 # |
365 # EVIDENCE-OF: R-23441-22541 The COLLATE operator has a higher | 369 # EVIDENCE-OF: R-36231-30731 The COLLATE operator has a higher |
366 # precedence (binds more tightly) than any prefix unary operator or any | 370 # precedence (binds more tightly) than any binary operator and any unary |
367 # binary operator. | 371 # prefix operator except "~". |
368 # | 372 # |
369 do_execsql_test e_expr-9.1 { SELECT 'abcd' < 'bbbb' COLLATE reverse } 0 | 373 do_execsql_test e_expr-9.1 { SELECT 'abcd' < 'bbbb' COLLATE reverse } 0 |
370 do_execsql_test e_expr-9.2 { SELECT ('abcd' < 'bbbb') COLLATE reverse } 1 | 374 do_execsql_test e_expr-9.2 { SELECT ('abcd' < 'bbbb') COLLATE reverse } 1 |
371 do_execsql_test e_expr-9.3 { SELECT 'abcd' <= 'bbbb' COLLATE reverse } 0 | 375 do_execsql_test e_expr-9.3 { SELECT 'abcd' <= 'bbbb' COLLATE reverse } 0 |
372 do_execsql_test e_expr-9.4 { SELECT ('abcd' <= 'bbbb') COLLATE reverse } 1 | 376 do_execsql_test e_expr-9.4 { SELECT ('abcd' <= 'bbbb') COLLATE reverse } 1 |
373 | 377 |
374 do_execsql_test e_expr-9.5 { SELECT 'abcd' > 'bbbb' COLLATE reverse } 1 | 378 do_execsql_test e_expr-9.5 { SELECT 'abcd' > 'bbbb' COLLATE reverse } 1 |
375 do_execsql_test e_expr-9.6 { SELECT ('abcd' > 'bbbb') COLLATE reverse } 0 | 379 do_execsql_test e_expr-9.6 { SELECT ('abcd' > 'bbbb') COLLATE reverse } 0 |
376 do_execsql_test e_expr-9.7 { SELECT 'abcd' >= 'bbbb' COLLATE reverse } 1 | 380 do_execsql_test e_expr-9.7 { SELECT 'abcd' >= 'bbbb' COLLATE reverse } 1 |
377 do_execsql_test e_expr-9.8 { SELECT ('abcd' >= 'bbbb') COLLATE reverse } 0 | 381 do_execsql_test e_expr-9.8 { SELECT ('abcd' >= 'bbbb') COLLATE reverse } 0 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 # | 443 # |
440 do_execsql_test e_expr-10.3.1 { SELECT 'is not' } {{is not}} | 444 do_execsql_test e_expr-10.3.1 { SELECT 'is not' } {{is not}} |
441 do_execsql_test e_expr-10.3.2 { SELECT typeof('is not') } {text} | 445 do_execsql_test e_expr-10.3.2 { SELECT typeof('is not') } {text} |
442 do_execsql_test e_expr-10.3.3 { SELECT 'isn''t' } {isn't} | 446 do_execsql_test e_expr-10.3.3 { SELECT 'isn''t' } {isn't} |
443 do_execsql_test e_expr-10.3.4 { SELECT typeof('isn''t') } {text} | 447 do_execsql_test e_expr-10.3.4 { SELECT typeof('isn''t') } {text} |
444 | 448 |
445 # EVIDENCE-OF: R-09593-03321 BLOB literals are string literals | 449 # EVIDENCE-OF: R-09593-03321 BLOB literals are string literals |
446 # containing hexadecimal data and preceded by a single "x" or "X" | 450 # containing hexadecimal data and preceded by a single "x" or "X" |
447 # character. | 451 # character. |
448 # | 452 # |
449 # EVIDENCE-OF: R-39344-59787 For example: X'53514C697465' | 453 # EVIDENCE-OF: R-19836-11244 Example: X'53514C697465' |
450 # | 454 # |
451 do_execsql_test e_expr-10.4.1 { SELECT typeof(X'0123456789ABCDEF') } blob | 455 do_execsql_test e_expr-10.4.1 { SELECT typeof(X'0123456789ABCDEF') } blob |
452 do_execsql_test e_expr-10.4.2 { SELECT typeof(x'0123456789ABCDEF') } blob | 456 do_execsql_test e_expr-10.4.2 { SELECT typeof(x'0123456789ABCDEF') } blob |
453 do_execsql_test e_expr-10.4.3 { SELECT typeof(X'0123456789abcdef') } blob | 457 do_execsql_test e_expr-10.4.3 { SELECT typeof(X'0123456789abcdef') } blob |
454 do_execsql_test e_expr-10.4.4 { SELECT typeof(x'0123456789abcdef') } blob | 458 do_execsql_test e_expr-10.4.4 { SELECT typeof(x'0123456789abcdef') } blob |
455 do_execsql_test e_expr-10.4.5 { SELECT typeof(X'53514C697465') } blob | 459 do_execsql_test e_expr-10.4.5 { SELECT typeof(X'53514C697465') } blob |
456 | 460 |
457 # EVIDENCE-OF: R-23914-51476 A literal value can also be the token | 461 # EVIDENCE-OF: R-23914-51476 A literal value can also be the token |
458 # "NULL". | 462 # "NULL". |
459 # | 463 # |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 list [sqlite3_column_type $stmt 0] \ | 624 list [sqlite3_column_type $stmt 0] \ |
621 [sqlite3_column_type $stmt 1] \ | 625 [sqlite3_column_type $stmt 1] \ |
622 [sqlite3_column_type $stmt 2] \ | 626 [sqlite3_column_type $stmt 2] \ |
623 [sqlite3_column_type $stmt 3] | 627 [sqlite3_column_type $stmt 3] |
624 } {NULL NULL NULL NULL} | 628 } {NULL NULL NULL NULL} |
625 do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK | 629 do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK |
626 | 630 |
627 #------------------------------------------------------------------------- | 631 #------------------------------------------------------------------------- |
628 # "Test" the syntax diagrams in lang_expr.html. | 632 # "Test" the syntax diagrams in lang_expr.html. |
629 # | 633 # |
630 # EVIDENCE-OF: R-62067-43884 -- syntax diagram signed-number | 634 # -- syntax diagram signed-number |
631 # | 635 # |
632 do_execsql_test e_expr-12.1.1 { SELECT 0, +0, -0 } {0 0 0} | 636 do_execsql_test e_expr-12.1.1 { SELECT 0, +0, -0 } {0 0 0} |
633 do_execsql_test e_expr-12.1.2 { SELECT 1, +1, -1 } {1 1 -1} | 637 do_execsql_test e_expr-12.1.2 { SELECT 1, +1, -1 } {1 1 -1} |
634 do_execsql_test e_expr-12.1.3 { SELECT 2, +2, -2 } {2 2 -2} | 638 do_execsql_test e_expr-12.1.3 { SELECT 2, +2, -2 } {2 2 -2} |
635 do_execsql_test e_expr-12.1.4 { | 639 do_execsql_test e_expr-12.1.4 { |
636 SELECT 1.4, +1.4, -1.4 | 640 SELECT 1.4, +1.4, -1.4 |
637 } {1.4 1.4 -1.4} | 641 } {1.4 1.4 -1.4} |
638 do_execsql_test e_expr-12.1.5 { | 642 do_execsql_test e_expr-12.1.5 { |
639 SELECT 1.5e+5, +1.5e+5, -1.5e+5 | 643 SELECT 1.5e+5, +1.5e+5, -1.5e+5 |
640 } {150000.0 150000.0 -150000.0} | 644 } {150000.0 150000.0 -150000.0} |
641 do_execsql_test e_expr-12.1.6 { | 645 do_execsql_test e_expr-12.1.6 { |
642 SELECT 0.0001, +0.0001, -0.0001 | 646 SELECT 0.0001, +0.0001, -0.0001 |
643 } {0.0001 0.0001 -0.0001} | 647 } {0.0001 0.0001 -0.0001} |
644 | 648 |
645 # EVIDENCE-OF: R-21258-25489 -- syntax diagram literal-value | 649 # -- syntax diagram literal-value |
646 # | 650 # |
647 set sqlite_current_time 1 | 651 set sqlite_current_time 1 |
648 do_execsql_test e_expr-12.2.1 {SELECT 123} {123} | 652 do_execsql_test e_expr-12.2.1 {SELECT 123} {123} |
649 do_execsql_test e_expr-12.2.2 {SELECT 123.4e05} {12340000.0} | 653 do_execsql_test e_expr-12.2.2 {SELECT 123.4e05} {12340000.0} |
650 do_execsql_test e_expr-12.2.3 {SELECT 'abcde'} {abcde} | 654 do_execsql_test e_expr-12.2.3 {SELECT 'abcde'} {abcde} |
651 do_execsql_test e_expr-12.2.4 {SELECT X'414243'} {ABC} | 655 do_execsql_test e_expr-12.2.4 {SELECT X'414243'} {ABC} |
652 do_execsql_test e_expr-12.2.5 {SELECT NULL} {{}} | 656 do_execsql_test e_expr-12.2.5 {SELECT NULL} {{}} |
653 do_execsql_test e_expr-12.2.6 {SELECT CURRENT_TIME} {00:00:01} | 657 do_execsql_test e_expr-12.2.6 {SELECT CURRENT_TIME} {00:00:01} |
654 do_execsql_test e_expr-12.2.7 {SELECT CURRENT_DATE} {1970-01-01} | 658 do_execsql_test e_expr-12.2.7 {SELECT CURRENT_DATE} {1970-01-01} |
655 do_execsql_test e_expr-12.2.8 {SELECT CURRENT_TIMESTAMP} {{1970-01-01 00:00:01}} | 659 do_execsql_test e_expr-12.2.8 {SELECT CURRENT_TIMESTAMP} {{1970-01-01 00:00:01}} |
656 set sqlite_current_time 0 | 660 set sqlite_current_time 0 |
657 | 661 |
658 # EVIDENCE-OF: R-57598-59332 -- syntax diagram expr | 662 # -- syntax diagram expr |
659 # | 663 # |
660 file delete -force test.db2 | 664 forcedelete test.db2 |
661 execsql { | 665 execsql { |
662 ATTACH 'test.db2' AS dbname; | 666 ATTACH 'test.db2' AS dbname; |
663 CREATE TABLE dbname.tblname(cname); | 667 CREATE TABLE dbname.tblname(cname); |
664 } | 668 } |
665 | 669 |
666 proc glob {args} {return 1} | 670 proc glob {args} {return 1} |
667 db function glob glob | 671 db function glob glob |
668 db function match glob | 672 db function match glob |
669 db function regexp glob | 673 db function regexp glob |
670 | 674 |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 | 809 |
806 set x 0 | 810 set x 0 |
807 foreach e $elist { | 811 foreach e $elist { |
808 incr x | 812 incr x |
809 do_test e_expr-12.3.$tn.$x { | 813 do_test e_expr-12.3.$tn.$x { |
810 set rc [catch { execsql "SELECT $e FROM tblname" } msg] | 814 set rc [catch { execsql "SELECT $e FROM tblname" } msg] |
811 } {0} | 815 } {0} |
812 } | 816 } |
813 } | 817 } |
814 | 818 |
815 # EVIDENCE-OF: R-49462-56079 -- syntax diagram raise-function | 819 # -- syntax diagram raise-function |
816 # | 820 # |
817 foreach {tn raiseexpr} { | 821 foreach {tn raiseexpr} { |
818 1 "RAISE(IGNORE)" | 822 1 "RAISE(IGNORE)" |
819 2 "RAISE(ROLLBACK, 'error message')" | 823 2 "RAISE(ROLLBACK, 'error message')" |
820 3 "RAISE(ABORT, 'error message')" | 824 3 "RAISE(ABORT, 'error message')" |
821 4 "RAISE(FAIL, 'error message')" | 825 4 "RAISE(FAIL, 'error message')" |
822 } { | 826 } { |
823 do_execsql_test e_expr-12.4.$tn " | 827 do_execsql_test e_expr-12.4.$tn " |
824 CREATE TRIGGER dbname.tr$tn BEFORE DELETE ON tblname BEGIN | 828 CREATE TRIGGER dbname.tr$tn BEFORE DELETE ON tblname BEGIN |
825 SELECT $raiseexpr ; | 829 SELECT $raiseexpr ; |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1070 SELECT regexp('abc', 'def') | 1074 SELECT regexp('abc', 'def') |
1071 } {1 {no such function: regexp}} | 1075 } {1 {no such function: regexp}} |
1072 do_catchsql_test e_expr-18.1.2 { | 1076 do_catchsql_test e_expr-18.1.2 { |
1073 SELECT 'abc' REGEXP 'def' | 1077 SELECT 'abc' REGEXP 'def' |
1074 } {1 {no such function: REGEXP}} | 1078 } {1 {no such function: REGEXP}} |
1075 } | 1079 } |
1076 | 1080 |
1077 # EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for | 1081 # EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for |
1078 # the regexp() user function. | 1082 # the regexp() user function. |
1079 # | 1083 # |
1080 # EVIDENCE-OF: R-57289-13578 If a application-defined SQL function named | 1084 # EVIDENCE-OF: R-65524-61849 If an application-defined SQL function |
1081 # "regexp" is added at run-time, that function will be called in order | 1085 # named "regexp" is added at run-time, then the "X REGEXP Y" operator |
1082 # to implement the REGEXP operator. | 1086 # will be implemented as a call to "regexp(Y,X)". |
1083 # | 1087 # |
1084 proc regexpfunc {args} { | 1088 proc regexpfunc {args} { |
1085 eval lappend ::regexpargs $args | 1089 eval lappend ::regexpargs $args |
1086 return 1 | 1090 return 1 |
1087 } | 1091 } |
1088 db func regexp -argcount 2 regexpfunc | 1092 db func regexp -argcount 2 regexpfunc |
1089 set ::regexpargs [list] | 1093 set ::regexpargs [list] |
1090 do_execsql_test e_expr-18.2.1 { SELECT 'abc' REGEXP 'def' } 1 | 1094 do_execsql_test e_expr-18.2.1 { SELECT 'abc' REGEXP 'def' } 1 |
1091 do_test e_expr-18.2.2 { set regexpargs } {def abc} | 1095 do_test e_expr-18.2.2 { set regexpargs } {def abc} |
1092 set ::regexpargs [list] | 1096 set ::regexpargs [list] |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1283 # | 1287 # |
1284 proc rev {str} { | 1288 proc rev {str} { |
1285 set ret "" | 1289 set ret "" |
1286 set chars [split $str] | 1290 set chars [split $str] |
1287 for {set i [expr [llength $chars]-1]} {$i>=0} {incr i -1} { | 1291 for {set i [expr [llength $chars]-1]} {$i>=0} {incr i -1} { |
1288 append ret [lindex $chars $i] | 1292 append ret [lindex $chars $i] |
1289 } | 1293 } |
1290 set ret | 1294 set ret |
1291 } | 1295 } |
1292 proc reverse {lhs rhs} { | 1296 proc reverse {lhs rhs} { |
1293 string compare [rev $lhs] [ref $rhs] | 1297 string compare [rev $lhs] [rev $rhs] |
1294 } | 1298 } |
1295 db collate reverse reverse | 1299 db collate reverse reverse |
1296 do_execsql_test e_expr-23.1.1 { | 1300 do_execsql_test e_expr-23.1.1 { |
1297 CREATE TABLE t1( | 1301 CREATE TABLE t1( |
1298 a TEXT COLLATE NOCASE, | 1302 a TEXT COLLATE NOCASE, |
1299 b COLLATE REVERSE, | 1303 b COLLATE REVERSE, |
1300 c INTEGER, | 1304 c INTEGER, |
1301 d BLOB | 1305 d BLOB |
1302 ); | 1306 ); |
1303 INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5); | 1307 INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5); |
1304 } {} | 1308 } {} |
1305 do_execsql_test e_expr-23.1.2 { | 1309 do_execsql_test e_expr-23.1.2 { |
1306 SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1 | 1310 SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1 |
1307 } {B} | 1311 } {B} |
1308 do_execsql_test e_expr-23.1.3 { | 1312 do_execsql_test e_expr-23.1.3 { |
1309 SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1 | 1313 SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1 |
1310 } {B} | 1314 } {B} |
1311 do_execsql_test e_expr-23.1.4 { | 1315 do_execsql_test e_expr-23.1.4 { |
1312 SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1 | 1316 SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1 |
1313 } {B} | 1317 } {B} |
1314 do_execsql_test e_expr-23.1.5 { | 1318 do_execsql_test e_expr-23.1.5 { |
1315 SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1 | 1319 SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1 |
1316 } {A} | 1320 } {B} |
1317 do_execsql_test e_expr-23.1.6 { | 1321 do_execsql_test e_expr-23.1.6 { |
1318 SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END | 1322 SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END |
1319 } {B} | 1323 } {B} |
1320 do_execsql_test e_expr-23.1.7 { | 1324 do_execsql_test e_expr-23.1.7 { |
1321 SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1 | 1325 SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1 |
1322 } {A} | 1326 } {A} |
1323 do_execsql_test e_expr-23.1.8 { | 1327 do_execsql_test e_expr-23.1.8 { |
1324 SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1 | 1328 SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1 |
1325 } {B} | 1329 } {B} |
1326 do_execsql_test e_expr-23.1.9 { | 1330 do_execsql_test e_expr-23.1.9 { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1396 WHEN ceval(x)=w2 THEN r2 | 1400 WHEN ceval(x)=w2 THEN r2 |
1397 ELSE r3 END | 1401 ELSE r3 END |
1398 FROM t2 | 1402 FROM t2 |
1399 } {R1 R2 R3} | 1403 } {R1 R2 R3} |
1400 do_test e_expr-26.1.6 { set ::evalcount } {5} | 1404 do_test e_expr-26.1.6 { set ::evalcount } {5} |
1401 | 1405 |
1402 | 1406 |
1403 #------------------------------------------------------------------------- | 1407 #------------------------------------------------------------------------- |
1404 # Test statements related to CAST expressions. | 1408 # Test statements related to CAST expressions. |
1405 # | 1409 # |
1406 # EVIDENCE-OF: R-65079-31758 Application of a CAST expression is | 1410 # EVIDENCE-OF: R-20854-17109 A CAST conversion is similar to the |
1407 # different to application of a column affinity, as with a CAST | 1411 # conversion that takes place when a column affinity is applied to a |
1408 # expression the storage class conversion is forced even if it is lossy | 1412 # value except that with the CAST operator the conversion always takes |
1409 # and irrreversible. | 1413 # place even if the conversion lossy and irreversible, whereas column |
| 1414 # affinity only changes the data type of a value if the change is |
| 1415 # lossless and reversible. |
1410 # | 1416 # |
1411 do_execsql_test e_expr-27.1.1 { | 1417 do_execsql_test e_expr-27.1.1 { |
1412 CREATE TABLE t3(a TEXT, b REAL, c INTEGER); | 1418 CREATE TABLE t3(a TEXT, b REAL, c INTEGER); |
1413 INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5); | 1419 INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5); |
1414 SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3; | 1420 SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3; |
1415 } {blob UVU text 1.23abc real 4.5} | 1421 } {blob UVU text 1.23abc real 4.5} |
1416 do_execsql_test e_expr-27.1.2 { | 1422 do_execsql_test e_expr-27.1.2 { |
1417 SELECT | 1423 SELECT |
1418 typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT), | 1424 typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT), |
1419 typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL), | 1425 typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL), |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1583 do_expr_test e_expr-30.3.3 { CAST(' -2.12e-01ABC' AS INT) } integer -2 | 1589 do_expr_test e_expr-30.3.3 { CAST(' -2.12e-01ABC' AS INT) } integer -2 |
1584 do_expr_test e_expr-30.3.4 { CAST(' 1 2 3 4' AS INT) } integer 1 | 1590 do_expr_test e_expr-30.3.4 { CAST(' 1 2 3 4' AS INT) } integer 1 |
1585 | 1591 |
1586 # EVIDENCE-OF: R-43164-44276 If there is no prefix that can be | 1592 # EVIDENCE-OF: R-43164-44276 If there is no prefix that can be |
1587 # interpreted as an integer number, the result of the conversion is 0. | 1593 # interpreted as an integer number, the result of the conversion is 0. |
1588 # | 1594 # |
1589 do_expr_test e_expr-30.4.1 { CAST('' AS INTEGER) } integer 0 | 1595 do_expr_test e_expr-30.4.1 { CAST('' AS INTEGER) } integer 0 |
1590 do_expr_test e_expr-30.4.2 { CAST('not a number' AS INTEGER) } integer 0 | 1596 do_expr_test e_expr-30.4.2 { CAST('not a number' AS INTEGER) } integer 0 |
1591 do_expr_test e_expr-30.4.3 { CAST('XXI' AS INTEGER) } integer 0 | 1597 do_expr_test e_expr-30.4.3 { CAST('XXI' AS INTEGER) } integer 0 |
1592 | 1598 |
1593 # EVIDENCE-OF: R-00741-38776 A cast of a REAL value into an INTEGER will | 1599 # EVIDENCE-OF: R-08980-53124 The CAST operator understands decimal |
1594 # truncate the fractional part of the REAL. | 1600 # integers only — conversion of hexadecimal integers stops at |
| 1601 # the "x" in the "0x" prefix of the hexadecimal integer string and thus |
| 1602 # result of the CAST is always zero. |
| 1603 do_expr_test e_expr-30.5.1 { CAST('0x1234' AS INTEGER) } integer 0 |
| 1604 do_expr_test e_expr-30.5.2 { CAST('0X1234' AS INTEGER) } integer 0 |
| 1605 |
| 1606 # EVIDENCE-OF: R-02752-50091 A cast of a REAL value into an INTEGER |
| 1607 # results in the integer between the REAL value and zero that is closest |
| 1608 # to the REAL value. |
1595 # | 1609 # |
1596 do_expr_test e_expr-31.1.1 { CAST(3.14159 AS INTEGER) } integer 3 | 1610 do_expr_test e_expr-31.1.1 { CAST(3.14159 AS INTEGER) } integer 3 |
1597 do_expr_test e_expr-31.1.2 { CAST(1.99999 AS INTEGER) } integer 1 | 1611 do_expr_test e_expr-31.1.2 { CAST(1.99999 AS INTEGER) } integer 1 |
1598 do_expr_test e_expr-31.1.3 { CAST(-1.99999 AS INTEGER) } integer -1 | 1612 do_expr_test e_expr-31.1.3 { CAST(-1.99999 AS INTEGER) } integer -1 |
1599 do_expr_test e_expr-31.1.4 { CAST(-0.99999 AS INTEGER) } integer 0 | 1613 do_expr_test e_expr-31.1.4 { CAST(-0.99999 AS INTEGER) } integer 0 |
1600 | 1614 |
1601 # EVIDENCE-OF: R-06126-36021 If an REAL is too large to be represented | 1615 # EVIDENCE-OF: R-51517-40824 If a REAL is greater than the greatest |
1602 # as an INTEGER then the result of the cast is the largest negative | 1616 # possible signed integer (+9223372036854775807) then the result is the |
1603 # integer: -9223372036854775808. | 1617 # greatest possible signed integer and if the REAL is less than the |
| 1618 # least possible signed integer (-9223372036854775808) then the result |
| 1619 # is the least possible signed integer. |
1604 # | 1620 # |
1605 do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer -9223372036854775808 | 1621 do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer 9223372036854775807 |
1606 do_expr_test e_expr-31.2.2 { CAST(-2e+50 AS INT) } integer -9223372036854775808 | 1622 do_expr_test e_expr-31.2.2 { CAST(-2e+50 AS INT) } integer -9223372036854775808 |
1607 do_expr_test e_expr-31.2.3 { | 1623 do_expr_test e_expr-31.2.3 { |
1608 CAST(-9223372036854775809.0 AS INT) | 1624 CAST(-9223372036854775809.0 AS INT) |
1609 } integer -9223372036854775808 | 1625 } integer -9223372036854775808 |
1610 do_expr_test e_expr-31.2.4 { | 1626 do_expr_test e_expr-31.2.4 { |
1611 CAST(9223372036854775809.0 AS INT) | 1627 CAST(9223372036854775809.0 AS INT) |
1612 } integer -9223372036854775808 | 1628 } integer 9223372036854775807 |
1613 | 1629 |
1614 | 1630 |
1615 # EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC | 1631 # EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC |
1616 # first does a forced conversion into REAL but then further converts the | 1632 # first does a forced conversion into REAL but then further converts the |
1617 # result into INTEGER if and only if the conversion from REAL to INTEGER | 1633 # result into INTEGER if and only if the conversion from REAL to INTEGER |
1618 # is lossless and reversible. | 1634 # is lossless and reversible. |
1619 # | 1635 # |
1620 do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45 | 1636 do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45 |
1621 do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45 | 1637 do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45 |
1622 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2 | 1638 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2 |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1668 } | 1684 } |
1669 db1 close | 1685 db1 close |
1670 db2 close | 1686 db2 close |
1671 db3 close | 1687 db3 close |
1672 } | 1688 } |
1673 | 1689 |
1674 #------------------------------------------------------------------------- | 1690 #------------------------------------------------------------------------- |
1675 # Test statements related to the EXISTS and NOT EXISTS operators. | 1691 # Test statements related to the EXISTS and NOT EXISTS operators. |
1676 # | 1692 # |
1677 catch { db close } | 1693 catch { db close } |
1678 file delete -force test.db | 1694 forcedelete test.db |
1679 sqlite3 db test.db | 1695 sqlite3 db test.db |
1680 | 1696 |
1681 do_execsql_test e_expr-34.1 { | 1697 do_execsql_test e_expr-34.1 { |
1682 CREATE TABLE t1(a, b); | 1698 CREATE TABLE t1(a, b); |
1683 INSERT INTO t1 VALUES(1, 2); | 1699 INSERT INTO t1 VALUES(1, 2); |
1684 INSERT INTO t1 VALUES(NULL, 2); | 1700 INSERT INTO t1 VALUES(NULL, 2); |
1685 INSERT INTO t1 VALUES(1, NULL); | 1701 INSERT INTO t1 VALUES(1, NULL); |
1686 INSERT INTO t1 VALUES(NULL, NULL); | 1702 INSERT INTO t1 VALUES(NULL, NULL); |
1687 } {} | 1703 } {} |
1688 | 1704 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1749 set res [db one "SELECT $e1"] | 1765 set res [db one "SELECT $e1"] |
1750 do_expr_test e_expr-34.5.${tn}a $e1 integer $res | 1766 do_expr_test e_expr-34.5.${tn}a $e1 integer $res |
1751 do_expr_test e_expr-34.5.${tn}b $e2 integer $res | 1767 do_expr_test e_expr-34.5.${tn}b $e2 integer $res |
1752 } | 1768 } |
1753 | 1769 |
1754 #------------------------------------------------------------------------- | 1770 #------------------------------------------------------------------------- |
1755 # Test statements related to scalar sub-queries. | 1771 # Test statements related to scalar sub-queries. |
1756 # | 1772 # |
1757 | 1773 |
1758 catch { db close } | 1774 catch { db close } |
1759 file delete -force test.db | 1775 forcedelete test.db |
1760 sqlite3 db test.db | 1776 sqlite3 db test.db |
1761 do_test e_expr-35.0 { | 1777 do_test e_expr-35.0 { |
1762 execsql { | 1778 execsql { |
1763 CREATE TABLE t2(a, b); | 1779 CREATE TABLE t2(a, b); |
1764 INSERT INTO t2 VALUES('one', 'two'); | 1780 INSERT INTO t2 VALUES('one', 'two'); |
1765 INSERT INTO t2 VALUES('three', NULL); | 1781 INSERT INTO t2 VALUES('three', NULL); |
1766 INSERT INTO t2 VALUES(4, 5.0); | 1782 INSERT INTO t2 VALUES(4, 5.0); |
1767 } | 1783 } |
1768 } {} | 1784 } {} |
1769 | 1785 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1836 # EVIDENCE-OF: R-25492-41572 If the SELECT yields no rows, then the | 1852 # EVIDENCE-OF: R-25492-41572 If the SELECT yields no rows, then the |
1837 # value of the expression is NULL. | 1853 # value of the expression is NULL. |
1838 # | 1854 # |
1839 foreach {tn expr} { | 1855 foreach {tn expr} { |
1840 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) } | 1856 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) } |
1841 2 { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y ) } | 1857 2 { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y ) } |
1842 } { | 1858 } { |
1843 do_expr_test e_expr-36.4.$tn $expr null {} | 1859 do_expr_test e_expr-36.4.$tn $expr null {} |
1844 } | 1860 } |
1845 | 1861 |
| 1862 # EVIDENCE-OF: R-62477-06476 For example, the values NULL, 0.0, 0, |
| 1863 # 'english' and '0' are all considered to be false. |
| 1864 # |
| 1865 do_execsql_test e_expr-37.1 { |
| 1866 SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END; |
| 1867 } {false} |
| 1868 do_execsql_test e_expr-37.2 { |
| 1869 SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END; |
| 1870 } {false} |
| 1871 do_execsql_test e_expr-37.3 { |
| 1872 SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END; |
| 1873 } {false} |
| 1874 do_execsql_test e_expr-37.4 { |
| 1875 SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END; |
| 1876 } {false} |
| 1877 do_execsql_test e_expr-37.5 { |
| 1878 SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END; |
| 1879 } {false} |
| 1880 |
| 1881 # EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are |
| 1882 # considered to be true. |
| 1883 # |
| 1884 do_execsql_test e_expr-37.6 { |
| 1885 SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END; |
| 1886 } {true} |
| 1887 do_execsql_test e_expr-37.7 { |
| 1888 SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END; |
| 1889 } {true} |
| 1890 do_execsql_test e_expr-37.8 { |
| 1891 SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END; |
| 1892 } {true} |
| 1893 do_execsql_test e_expr-37.9 { |
| 1894 SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END; |
| 1895 } {true} |
| 1896 do_execsql_test e_expr-37.10 { |
| 1897 SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END; |
| 1898 } {true} |
| 1899 |
1846 | 1900 |
1847 finish_test | 1901 finish_test |
1848 | |
OLD | NEW |