| 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 |