000001 # 2010 July 16 000002 # 000003 # The author disclaims copyright to this source code. In place of 000004 # a legal notice, here is a blessing: 000005 # 000006 # May you do good and not evil. 000007 # May you find forgiveness for yourself and forgive others. 000008 # May you share freely, never taking more than you give. 000009 # 000010 #*********************************************************************** 000011 # 000012 # This file implements tests to verify that the "testable statements" in 000013 # the lang_expr.html document are correct. 000014 # 000015 000016 set testdir [file dirname $argv0] 000017 source $testdir/tester.tcl 000018 source $testdir/malloc_common.tcl 000019 000020 ifcapable !compound { 000021 finish_test 000022 return 000023 } 000024 000025 proc do_expr_test {tn expr type value} { 000026 uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [ 000027 list [list $type $value] 000028 ] 000029 } 000030 000031 proc do_qexpr_test {tn expr value} { 000032 uplevel do_execsql_test $tn [list "SELECT quote($expr)"] [list $value] 000033 } 000034 000035 # Set up three global variables: 000036 # 000037 # ::opname An array mapping from SQL operator to an easy to parse 000038 # name. The names are used as part of test case names. 000039 # 000040 # ::opprec An array mapping from SQL operator to a numeric 000041 # precedence value. Operators that group more tightly 000042 # have lower numeric precedences. 000043 # 000044 # ::oplist A list of all SQL operators supported by SQLite. 000045 # 000046 foreach {op opn} { 000047 || cat * mul / div % mod + add 000048 - sub << lshift >> rshift & bitand | bitor 000049 < less <= lesseq > more >= moreeq = eq1 000050 == eq2 <> ne1 != ne2 IS is LIKE like 000051 GLOB glob AND and OR or MATCH match REGEXP regexp 000052 {IS NOT} isnt 000053 } { 000054 set ::opname($op) $opn 000055 } 000056 set oplist [list] 000057 foreach {prec opl} { 000058 1 || 000059 2 {* / %} 000060 3 {+ -} 000061 4 {<< >> & |} 000062 5 {< <= > >=} 000063 6 {= == != <> IS {IS NOT} LIKE GLOB MATCH REGEXP} 000064 7 AND 000065 8 OR 000066 } { 000067 foreach op $opl { 000068 set ::opprec($op) $prec 000069 lappend oplist $op 000070 } 000071 } 000072 000073 000074 # Hook in definitions of MATCH and REGEX. The following implementations 000075 # cause MATCH and REGEX to behave similarly to the == operator. 000076 # 000077 proc matchfunc {a b} { return [expr {$a==$b}] } 000078 proc regexfunc {a b} { return [expr {$a==$b}] } 000079 db func match -argcount 2 matchfunc 000080 db func regexp -argcount 2 regexfunc 000081 000082 #------------------------------------------------------------------------- 000083 # Test cases e_expr-1.* attempt to verify that all binary operators listed 000084 # in the documentation exist and that the relative precedences of the 000085 # operators are also as the documentation suggests. 000086 # 000087 # EVIDENCE-OF: R-15514-65163 SQLite understands the following binary 000088 # operators, in order from highest to lowest precedence: || * / % + - 000089 # << >> & | < <= > >= = == != <> IS IS 000090 # NOT IN LIKE GLOB MATCH REGEXP AND OR 000091 # 000092 # EVIDENCE-OF: R-38759-38789 Operators IS and IS NOT have the same 000093 # precedence as =. 000094 # 000095 000096 unset -nocomplain untested 000097 foreach op1 $oplist { 000098 foreach op2 $oplist { 000099 set untested($op1,$op2) 1 000100 foreach {tn A B C} { 000101 1 22 45 66 000102 2 0 0 0 000103 3 0 0 1 000104 4 0 1 0 000105 5 0 1 1 000106 6 1 0 0 000107 7 1 0 1 000108 8 1 1 0 000109 9 1 1 1 000110 10 5 6 1 000111 11 1 5 6 000112 12 1 5 5 000113 13 5 5 1 000114 000115 14 5 2 1 000116 15 1 4 1 000117 16 -1 0 1 000118 17 0 1 -1 000119 000120 } { 000121 set testname "e_expr-1.$opname($op1).$opname($op2).$tn" 000122 000123 # If $op2 groups more tightly than $op1, then the result 000124 # of executing $sql1 whould be the same as executing $sql3. 000125 # If $op1 groups more tightly, or if $op1 and $op2 have 000126 # the same precedence, then executing $sql1 should return 000127 # the same value as $sql2. 000128 # 000129 set sql1 "SELECT $A $op1 $B $op2 $C" 000130 set sql2 "SELECT ($A $op1 $B) $op2 $C" 000131 set sql3 "SELECT $A $op1 ($B $op2 $C)" 000132 000133 set a2 [db one $sql2] 000134 set a3 [db one $sql3] 000135 000136 do_execsql_test $testname $sql1 [list [ 000137 if {$opprec($op2) < $opprec($op1)} {set a3} {set a2} 000138 ]] 000139 if {$a2 != $a3} { unset -nocomplain untested($op1,$op2) } 000140 } 000141 } 000142 } 000143 000144 foreach op {* AND OR + || & |} { unset untested($op,$op) } 000145 unset untested(+,-) ;# Since (a+b)-c == a+(b-c) 000146 unset untested(*,<<) ;# Since (a*b)<<c == a*(b<<c) 000147 000148 do_test e_expr-1.1 { array names untested } {} 000149 000150 # At one point, test 1.2.2 was failing. Instead of the correct result, it 000151 # was returning {1 1 0}. This would seem to indicate that LIKE has the 000152 # same precedence as '<'. Which is incorrect. It has lower precedence. 000153 # 000154 do_execsql_test e_expr-1.2.1 { 000155 SELECT 0 < 2 LIKE 1, (0 < 2) LIKE 1, 0 < (2 LIKE 1) 000156 } {1 1 0} 000157 do_execsql_test e_expr-1.2.2 { 000158 SELECT 0 LIKE 0 < 2, (0 LIKE 0) < 2, 0 LIKE (0 < 2) 000159 } {0 1 0} 000160 000161 # Showing that LIKE and == have the same precedence 000162 # 000163 do_execsql_test e_expr-1.2.3 { 000164 SELECT 2 LIKE 2 == 1, (2 LIKE 2) == 1, 2 LIKE (2 == 1) 000165 } {1 1 0} 000166 do_execsql_test e_expr-1.2.4 { 000167 SELECT 2 == 2 LIKE 1, (2 == 2) LIKE 1, 2 == (2 LIKE 1) 000168 } {1 1 0} 000169 000170 # Showing that < groups more tightly than == (< has higher precedence). 000171 # 000172 do_execsql_test e_expr-1.2.5 { 000173 SELECT 0 < 2 == 1, (0 < 2) == 1, 0 < (2 == 1) 000174 } {1 1 0} 000175 do_execsql_test e_expr-1.6 { 000176 SELECT 0 == 0 < 2, (0 == 0) < 2, 0 == (0 < 2) 000177 } {0 1 0} 000178 000179 #------------------------------------------------------------------------- 000180 # Check that the four unary prefix operators mentioned in the 000181 # documentation exist. 000182 # 000183 # EVIDENCE-OF: R-13958-53419 Supported unary prefix operators are these: 000184 # - + ~ NOT 000185 # 000186 do_execsql_test e_expr-2.1 { SELECT - 10 } {-10} 000187 do_execsql_test e_expr-2.2 { SELECT + 10 } {10} 000188 do_execsql_test e_expr-2.3 { SELECT ~ 10 } {-11} 000189 do_execsql_test e_expr-2.4 { SELECT NOT 10 } {0} 000190 000191 #------------------------------------------------------------------------- 000192 # Tests for the two statements made regarding the unary + operator. 000193 # 000194 # EVIDENCE-OF: R-53670-03373 The unary operator + is a no-op. 000195 # 000196 # EVIDENCE-OF: R-19480-30968 It can be applied to strings, numbers, 000197 # blobs or NULL and it always returns a result with the same value as 000198 # the operand. 000199 # 000200 foreach {tn literal type} { 000201 1 'helloworld' text 000202 2 45 integer 000203 3 45.2 real 000204 4 45.0 real 000205 5 X'ABCDEF' blob 000206 6 NULL null 000207 } { 000208 set sql " SELECT quote( + $literal ), typeof( + $literal) " 000209 do_execsql_test e_expr-3.$tn $sql [list $literal $type] 000210 } 000211 000212 #------------------------------------------------------------------------- 000213 # Check that both = and == are both acceptable as the "equals" operator. 000214 # Similarly, either != or <> work as the not-equals operator. 000215 # 000216 # EVIDENCE-OF: R-03679-60639 Equals can be either = or ==. 000217 # 000218 # EVIDENCE-OF: R-30082-38996 The non-equals operator can be either != or 000219 # <>. 000220 # 000221 foreach {tn literal different} { 000222 1 'helloworld' '12345' 000223 2 22 23 000224 3 'xyz' X'78797A' 000225 4 X'78797A00' 'xyz' 000226 } { 000227 do_execsql_test e_expr-4.$tn " 000228 SELECT $literal = $literal, $literal == $literal, 000229 $literal = $different, $literal == $different, 000230 $literal = NULL, $literal == NULL, 000231 $literal != $literal, $literal <> $literal, 000232 $literal != $different, $literal <> $different, 000233 $literal != NULL, $literal != NULL 000234 000235 " {1 1 0 0 {} {} 0 0 1 1 {} {}} 000236 } 000237 000238 #------------------------------------------------------------------------- 000239 # Test the || operator. 000240 # 000241 # EVIDENCE-OF: R-44409-62641 The || operator is "concatenate" - it joins 000242 # together the two strings of its operands. 000243 # 000244 foreach {tn a b} { 000245 1 'helloworld' '12345' 000246 2 22 23 000247 } { 000248 set as [db one "SELECT $a"] 000249 set bs [db one "SELECT $b"] 000250 000251 do_execsql_test e_expr-5.$tn "SELECT $a || $b" [list "${as}${bs}"] 000252 } 000253 000254 #------------------------------------------------------------------------- 000255 # Test the % operator. 000256 # 000257 # EVIDENCE-OF: R-08914-63790 The operator % outputs the value of its 000258 # left operand modulo its right operand. 000259 # 000260 do_execsql_test e_expr-6.1 {SELECT 72%5} {2} 000261 do_execsql_test e_expr-6.2 {SELECT 72%-5} {2} 000262 do_execsql_test e_expr-6.3 {SELECT -72%-5} {-2} 000263 do_execsql_test e_expr-6.4 {SELECT -72%5} {-2} 000264 000265 #------------------------------------------------------------------------- 000266 # Test that the results of all binary operators are either numeric or 000267 # NULL, except for the || operator, which may evaluate to either a text 000268 # value or NULL. 000269 # 000270 # EVIDENCE-OF: R-20665-17792 The result of any binary operator is either 000271 # a numeric value or NULL, except for the || concatenation operator 000272 # which always evaluates to either NULL or a text value. 000273 # 000274 set literals { 000275 1 'abc' 2 'hexadecimal' 3 '' 000276 4 123 5 -123 6 0 000277 7 123.4 8 0.0 9 -123.4 000278 10 X'ABCDEF' 11 X'' 12 X'0000' 000279 13 NULL 000280 } 000281 foreach op $oplist { 000282 foreach {n1 rhs} $literals { 000283 foreach {n2 lhs} $literals { 000284 000285 set t [db one " SELECT typeof($lhs $op $rhs) "] 000286 do_test e_expr-7.$opname($op).$n1.$n2 { 000287 expr { 000288 ($op=="||" && ($t == "text" || $t == "null")) 000289 || ($op!="||" && ($t == "integer" || $t == "real" || $t == "null")) 000290 } 000291 } 1 000292 000293 }} 000294 } 000295 000296 #------------------------------------------------------------------------- 000297 # Test the IS and IS NOT operators. 000298 # 000299 # EVIDENCE-OF: R-24731-45773 The IS and IS NOT operators work like = and 000300 # != except when one or both of the operands are NULL. 000301 # 000302 # EVIDENCE-OF: R-06325-15315 In this case, if both operands are NULL, 000303 # then the IS operator evaluates to 1 (true) and the IS NOT operator 000304 # evaluates to 0 (false). 000305 # 000306 # EVIDENCE-OF: R-19812-36779 If one operand is NULL and the other is 000307 # not, then the IS operator evaluates to 0 (false) and the IS NOT 000308 # operator is 1 (true). 000309 # 000310 # EVIDENCE-OF: R-61975-13410 It is not possible for an IS or IS NOT 000311 # expression to evaluate to NULL. 000312 # 000313 do_execsql_test e_expr-8.1.1 { SELECT NULL IS NULL } {1} 000314 do_execsql_test e_expr-8.1.2 { SELECT 'ab' IS NULL } {0} 000315 do_execsql_test e_expr-8.1.3 { SELECT NULL IS 'ab' } {0} 000316 do_execsql_test e_expr-8.1.4 { SELECT 'ab' IS 'ab' } {1} 000317 do_execsql_test e_expr-8.1.5 { SELECT NULL == NULL } {{}} 000318 do_execsql_test e_expr-8.1.6 { SELECT 'ab' == NULL } {{}} 000319 do_execsql_test e_expr-8.1.7 { SELECT NULL == 'ab' } {{}} 000320 do_execsql_test e_expr-8.1.8 { SELECT 'ab' == 'ab' } {1} 000321 do_execsql_test e_expr-8.1.9 { SELECT NULL IS NOT NULL } {0} 000322 do_execsql_test e_expr-8.1.10 { SELECT 'ab' IS NOT NULL } {1} 000323 do_execsql_test e_expr-8.1.11 { SELECT NULL IS NOT 'ab' } {1} 000324 do_execsql_test e_expr-8.1.12 { SELECT 'ab' IS NOT 'ab' } {0} 000325 do_execsql_test e_expr-8.1.13 { SELECT NULL != NULL } {{}} 000326 do_execsql_test e_expr-8.1.14 { SELECT 'ab' != NULL } {{}} 000327 do_execsql_test e_expr-8.1.15 { SELECT NULL != 'ab' } {{}} 000328 do_execsql_test e_expr-8.1.16 { SELECT 'ab' != 'ab' } {0} 000329 000330 foreach {n1 rhs} $literals { 000331 foreach {n2 lhs} $literals { 000332 if {$rhs!="NULL" && $lhs!="NULL"} { 000333 set eq [execsql "SELECT $lhs = $rhs, $lhs != $rhs"] 000334 } else { 000335 set eq [list [expr {$lhs=="NULL" && $rhs=="NULL"}] \ 000336 [expr {$lhs!="NULL" || $rhs!="NULL"}] 000337 ] 000338 } 000339 set test e_expr-8.2.$n1.$n2 000340 do_execsql_test $test.1 "SELECT $lhs IS $rhs, $lhs IS NOT $rhs" $eq 000341 do_execsql_test $test.2 " 000342 SELECT ($lhs IS $rhs) IS NULL, ($lhs IS NOT $rhs) IS NULL 000343 " {0 0} 000344 } 000345 } 000346 000347 #------------------------------------------------------------------------- 000348 # Run some tests on the COLLATE "unary postfix operator". 000349 # 000350 # This collation sequence reverses both arguments before using 000351 # [string compare] to compare them. For example, when comparing the 000352 # strings 'one' and 'four', return the result of: 000353 # 000354 # string compare eno ruof 000355 # 000356 proc reverse_str {zStr} { 000357 set out "" 000358 foreach c [split $zStr {}] { set out "${c}${out}" } 000359 set out 000360 } 000361 proc reverse_collate {zLeft zRight} { 000362 string compare [reverse_str $zLeft] [reverse_str $zRight] 000363 } 000364 db collate reverse reverse_collate 000365 000366 # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix 000367 # operator that assigns a collating sequence to an expression. 000368 # 000369 # EVIDENCE-OF: R-36231-30731 The COLLATE operator has a higher 000370 # precedence (binds more tightly) than any binary operator and any unary 000371 # prefix operator except "~". 000372 # 000373 do_execsql_test e_expr-9.1 { SELECT 'abcd' < 'bbbb' COLLATE reverse } 0 000374 do_execsql_test e_expr-9.2 { SELECT ('abcd' < 'bbbb') COLLATE reverse } 1 000375 do_execsql_test e_expr-9.3 { SELECT 'abcd' <= 'bbbb' COLLATE reverse } 0 000376 do_execsql_test e_expr-9.4 { SELECT ('abcd' <= 'bbbb') COLLATE reverse } 1 000377 000378 do_execsql_test e_expr-9.5 { SELECT 'abcd' > 'bbbb' COLLATE reverse } 1 000379 do_execsql_test e_expr-9.6 { SELECT ('abcd' > 'bbbb') COLLATE reverse } 0 000380 do_execsql_test e_expr-9.7 { SELECT 'abcd' >= 'bbbb' COLLATE reverse } 1 000381 do_execsql_test e_expr-9.8 { SELECT ('abcd' >= 'bbbb') COLLATE reverse } 0 000382 000383 do_execsql_test e_expr-9.10 { SELECT 'abcd' = 'ABCD' COLLATE nocase } 1 000384 do_execsql_test e_expr-9.11 { SELECT ('abcd' = 'ABCD') COLLATE nocase } 0 000385 do_execsql_test e_expr-9.12 { SELECT 'abcd' == 'ABCD' COLLATE nocase } 1 000386 do_execsql_test e_expr-9.13 { SELECT ('abcd' == 'ABCD') COLLATE nocase } 0 000387 do_execsql_test e_expr-9.14 { SELECT 'abcd' IS 'ABCD' COLLATE nocase } 1 000388 do_execsql_test e_expr-9.15 { SELECT ('abcd' IS 'ABCD') COLLATE nocase } 0 000389 000390 do_execsql_test e_expr-9.16 { SELECT 'abcd' != 'ABCD' COLLATE nocase } 0 000391 do_execsql_test e_expr-9.17 { SELECT ('abcd' != 'ABCD') COLLATE nocase } 1 000392 do_execsql_test e_expr-9.18 { SELECT 'abcd' <> 'ABCD' COLLATE nocase } 0 000393 do_execsql_test e_expr-9.19 { SELECT ('abcd' <> 'ABCD') COLLATE nocase } 1 000394 do_execsql_test e_expr-9.20 { SELECT 'abcd' IS NOT 'ABCD' COLLATE nocase } 0 000395 do_execsql_test e_expr-9.21 { SELECT ('abcd' IS NOT 'ABCD') COLLATE nocase } 1 000396 000397 do_execsql_test e_expr-9.22 { 000398 SELECT 'bbb' BETWEEN 'AAA' AND 'CCC' COLLATE nocase 000399 } 1 000400 do_execsql_test e_expr-9.23 { 000401 SELECT ('bbb' BETWEEN 'AAA' AND 'CCC') COLLATE nocase 000402 } 0 000403 000404 # EVIDENCE-OF: R-58731-25439 The collating sequence set by the COLLATE 000405 # operator overrides the collating sequence determined by the COLLATE 000406 # clause in a table column definition. 000407 # 000408 do_execsql_test e_expr-9.24 { 000409 CREATE TABLE t24(a COLLATE NOCASE, b); 000410 INSERT INTO t24 VALUES('aaa', 1); 000411 INSERT INTO t24 VALUES('bbb', 2); 000412 INSERT INTO t24 VALUES('ccc', 3); 000413 } {} 000414 do_execsql_test e_expr-9.25 { SELECT 'BBB' = a FROM t24 } {0 1 0} 000415 do_execsql_test e_expr-9.25 { SELECT a = 'BBB' FROM t24 } {0 1 0} 000416 do_execsql_test e_expr-9.25 { SELECT 'BBB' = a COLLATE binary FROM t24 } {0 0 0} 000417 do_execsql_test e_expr-9.25 { SELECT a COLLATE binary = 'BBB' FROM t24 } {0 0 0} 000418 000419 #------------------------------------------------------------------------- 000420 # Test statements related to literal values. 000421 # 000422 # EVIDENCE-OF: R-31536-32008 Literal values may be integers, floating 000423 # point numbers, strings, BLOBs, or NULLs. 000424 # 000425 do_execsql_test e_expr-10.1.1 { SELECT typeof(5) } {integer} 000426 do_execsql_test e_expr-10.1.2 { SELECT typeof(5.1) } {real} 000427 do_execsql_test e_expr-10.1.3 { SELECT typeof('5.1') } {text} 000428 do_execsql_test e_expr-10.1.4 { SELECT typeof(X'ABCD') } {blob} 000429 do_execsql_test e_expr-10.1.5 { SELECT typeof(NULL) } {null} 000430 000431 # "Scientific notation is supported for point literal values." 000432 # 000433 do_execsql_test e_expr-10.2.1 { SELECT typeof(3.4e-02) } {real} 000434 do_execsql_test e_expr-10.2.2 { SELECT typeof(3e+5) } {real} 000435 do_execsql_test e_expr-10.2.3 { SELECT 3.4e-02 } {0.034} 000436 do_execsql_test e_expr-10.2.4 { SELECT 3e+4 } {30000.0} 000437 000438 # EVIDENCE-OF: R-35229-17830 A string constant is formed by enclosing 000439 # the string in single quotes ('). 000440 # 000441 # EVIDENCE-OF: R-07100-06606 A single quote within the string can be 000442 # encoded by putting two single quotes in a row - as in Pascal. 000443 # 000444 do_execsql_test e_expr-10.3.1 { SELECT 'is not' } {{is not}} 000445 do_execsql_test e_expr-10.3.2 { SELECT typeof('is not') } {text} 000446 do_execsql_test e_expr-10.3.3 { SELECT 'isn''t' } {isn't} 000447 do_execsql_test e_expr-10.3.4 { SELECT typeof('isn''t') } {text} 000448 000449 # EVIDENCE-OF: R-09593-03321 BLOB literals are string literals 000450 # containing hexadecimal data and preceded by a single "x" or "X" 000451 # character. 000452 # 000453 # EVIDENCE-OF: R-19836-11244 Example: X'53514C697465' 000454 # 000455 do_execsql_test e_expr-10.4.1 { SELECT typeof(X'0123456789ABCDEF') } blob 000456 do_execsql_test e_expr-10.4.2 { SELECT typeof(x'0123456789ABCDEF') } blob 000457 do_execsql_test e_expr-10.4.3 { SELECT typeof(X'0123456789abcdef') } blob 000458 do_execsql_test e_expr-10.4.4 { SELECT typeof(x'0123456789abcdef') } blob 000459 do_execsql_test e_expr-10.4.5 { SELECT typeof(X'53514C697465') } blob 000460 000461 # EVIDENCE-OF: R-23914-51476 A literal value can also be the token 000462 # "NULL". 000463 # 000464 do_execsql_test e_expr-10.5.1 { SELECT NULL } {{}} 000465 do_execsql_test e_expr-10.5.2 { SELECT typeof(NULL) } {null} 000466 000467 #------------------------------------------------------------------------- 000468 # Test statements related to bound parameters 000469 # 000470 000471 proc parameter_test {tn sql params result} { 000472 set stmt [sqlite3_prepare_v2 db $sql -1] 000473 000474 foreach {number name} $params { 000475 set nm [sqlite3_bind_parameter_name $stmt $number] 000476 do_test $tn.name.$number [list set {} $nm] $name 000477 sqlite3_bind_int $stmt $number [expr -1 * $number] 000478 } 000479 000480 sqlite3_step $stmt 000481 000482 set res [list] 000483 for {set i 0} {$i < [sqlite3_column_count $stmt]} {incr i} { 000484 lappend res [sqlite3_column_text $stmt $i] 000485 } 000486 000487 set rc [sqlite3_finalize $stmt] 000488 do_test $tn.rc [list set {} $rc] SQLITE_OK 000489 do_test $tn.res [list set {} $res] $result 000490 } 000491 000492 # EVIDENCE-OF: R-33509-39458 A question mark followed by a number NNN 000493 # holds a spot for the NNN-th parameter. NNN must be between 1 and 000494 # SQLITE_MAX_VARIABLE_NUMBER. 000495 # 000496 set mvn $SQLITE_MAX_VARIABLE_NUMBER 000497 parameter_test e_expr-11.1 " 000498 SELECT ?1, ?123, ?$SQLITE_MAX_VARIABLE_NUMBER, ?123, ?4 000499 " "1 ?1 123 ?123 $mvn ?$mvn 4 ?4" "-1 -123 -$mvn -123 -4" 000500 000501 set errmsg "variable number must be between ?1 and ?$SQLITE_MAX_VARIABLE_NUMBER" 000502 foreach {tn param_number} [list \ 000503 2 0 \ 000504 3 [expr $SQLITE_MAX_VARIABLE_NUMBER+1] \ 000505 4 [expr $SQLITE_MAX_VARIABLE_NUMBER+2] \ 000506 5 12345678903456789034567890234567890 \ 000507 6 2147483648 \ 000508 7 2147483649 \ 000509 8 4294967296 \ 000510 9 4294967297 \ 000511 10 9223372036854775808 \ 000512 11 9223372036854775809 \ 000513 12 18446744073709551616 \ 000514 13 18446744073709551617 \ 000515 ] { 000516 do_catchsql_test e_expr-11.1.$tn "SELECT ?$param_number" [list 1 $errmsg] 000517 } 000518 000519 # EVIDENCE-OF: R-33670-36097 A question mark that is not followed by a 000520 # number creates a parameter with a number one greater than the largest 000521 # parameter number already assigned. 000522 # 000523 # EVIDENCE-OF: R-42938-07030 If this means the parameter number is 000524 # greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error. 000525 # 000526 parameter_test e_expr-11.2.1 "SELECT ?" {1 {}} -1 000527 parameter_test e_expr-11.2.2 "SELECT ?, ?" {1 {} 2 {}} {-1 -2} 000528 parameter_test e_expr-11.2.3 "SELECT ?5, ?" {5 ?5 6 {}} {-5 -6} 000529 parameter_test e_expr-11.2.4 "SELECT ?, ?5" {1 {} 5 ?5} {-1 -5} 000530 parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?" { 000531 1 {} 456 ?456 457 {} 000532 } {-1 -456 -457} 000533 parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?4, ?" { 000534 1 {} 456 ?456 4 ?4 457 {} 000535 } {-1 -456 -4 -457} 000536 foreach {tn sql} [list \ 000537 1 "SELECT ?$mvn, ?" \ 000538 2 "SELECT ?[expr $mvn-5], ?, ?, ?, ?, ?, ?" \ 000539 3 "SELECT ?[expr $mvn], ?5, ?6, ?" \ 000540 ] { 000541 do_catchsql_test e_expr-11.3.$tn $sql [list 1 {too many SQL variables}] 000542 } 000543 000544 # EVIDENCE-OF: R-11620-22743 A colon followed by an identifier name 000545 # holds a spot for a named parameter with the name :AAAA. 000546 # 000547 # Identifiers in SQLite consist of alphanumeric, '_' and '$' characters, 000548 # and any UTF characters with codepoints larger than 127 (non-ASCII 000549 # characters). 000550 # 000551 parameter_test e_expr-11.2.1 {SELECT :AAAA} {1 :AAAA} -1 000552 parameter_test e_expr-11.2.2 {SELECT :123} {1 :123} -1 000553 parameter_test e_expr-11.2.3 {SELECT :__} {1 :__} -1 000554 parameter_test e_expr-11.2.4 {SELECT :_$_} {1 :_$_} -1 000555 parameter_test e_expr-11.2.5 " 000556 SELECT :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25 000557 " "1 :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1 000558 parameter_test e_expr-11.2.6 "SELECT :\u0080" "1 :\u0080" -1 000559 000560 # EVIDENCE-OF: R-49783-61279 An "at" sign works exactly like a colon, 000561 # except that the name of the parameter created is @AAAA. 000562 # 000563 parameter_test e_expr-11.3.1 {SELECT @AAAA} {1 @AAAA} -1 000564 parameter_test e_expr-11.3.2 {SELECT @123} {1 @123} -1 000565 parameter_test e_expr-11.3.3 {SELECT @__} {1 @__} -1 000566 parameter_test e_expr-11.3.4 {SELECT @_$_} {1 @_$_} -1 000567 parameter_test e_expr-11.3.5 " 000568 SELECT @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25 000569 " "1 @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1 000570 parameter_test e_expr-11.3.6 "SELECT @\u0080" "1 @\u0080" -1 000571 000572 # EVIDENCE-OF: R-62610-51329 A dollar-sign followed by an identifier 000573 # name also holds a spot for a named parameter with the name $AAAA. 000574 # 000575 # EVIDENCE-OF: R-55025-21042 The identifier name in this case can 000576 # include one or more occurrences of "::" and a suffix enclosed in 000577 # "(...)" containing any text at all. 000578 # 000579 # Note: Looks like an identifier cannot consist entirely of "::" 000580 # characters or just a suffix. Also, the other named variable characters 000581 # (: and @) work the same way internally. Why not just document it that way? 000582 # 000583 parameter_test e_expr-11.4.1 {SELECT $AAAA} {1 $AAAA} -1 000584 parameter_test e_expr-11.4.2 {SELECT $123} {1 $123} -1 000585 parameter_test e_expr-11.4.3 {SELECT $__} {1 $__} -1 000586 parameter_test e_expr-11.4.4 {SELECT $_$_} {1 $_$_} -1 000587 parameter_test e_expr-11.4.5 " 000588 SELECT \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25 000589 " "1 \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1 000590 parameter_test e_expr-11.4.6 "SELECT \$\u0080" "1 \$\u0080" -1 000591 000592 parameter_test e_expr-11.5.1 {SELECT $::::a(++--++)} {1 $::::a(++--++)} -1 000593 parameter_test e_expr-11.5.2 {SELECT $::a()} {1 $::a()} -1 000594 parameter_test e_expr-11.5.3 {SELECT $::1(::#$)} {1 $::1(::#$)} -1 000595 000596 # EVIDENCE-OF: R-11370-04520 Named parameters are also numbered. The 000597 # number assigned is one greater than the largest parameter number 000598 # already assigned. 000599 # 000600 # EVIDENCE-OF: R-42620-22184 If this means the parameter would be 000601 # assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is an 000602 # error. 000603 # 000604 parameter_test e_expr-11.6.1 "SELECT ?, @abc" {1 {} 2 @abc} {-1 -2} 000605 parameter_test e_expr-11.6.2 "SELECT ?123, :a1" {123 ?123 124 :a1} {-123 -124} 000606 parameter_test e_expr-11.6.3 {SELECT $a, ?8, ?, $b, ?2, $c} { 000607 1 $a 8 ?8 9 {} 10 $b 2 ?2 11 $c 000608 } {-1 -8 -9 -10 -2 -11} 000609 foreach {tn sql} [list \ 000610 1 "SELECT ?$mvn, \$::a" \ 000611 2 "SELECT ?$mvn, ?4, @a1" \ 000612 3 "SELECT ?[expr $mvn-2], :bag, @123, \$x" \ 000613 ] { 000614 do_catchsql_test e_expr-11.7.$tn $sql [list 1 {too many SQL variables}] 000615 } 000616 000617 # EVIDENCE-OF: R-14068-49671 Parameters that are not assigned values 000618 # using sqlite3_bind() are treated as NULL. 000619 # 000620 do_test e_expr-11.7.1 { 000621 set stmt [sqlite3_prepare_v2 db { SELECT ?, :a, @b, $d } -1] 000622 sqlite3_step $stmt 000623 000624 list [sqlite3_column_type $stmt 0] \ 000625 [sqlite3_column_type $stmt 1] \ 000626 [sqlite3_column_type $stmt 2] \ 000627 [sqlite3_column_type $stmt 3] 000628 } {NULL NULL NULL NULL} 000629 do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK 000630 000631 #------------------------------------------------------------------------- 000632 # "Test" the syntax diagrams in lang_expr.html. 000633 # 000634 # -- syntax diagram signed-number 000635 # 000636 do_execsql_test e_expr-12.1.1 { SELECT 0, +0, -0 } {0 0 0} 000637 do_execsql_test e_expr-12.1.2 { SELECT 1, +1, -1 } {1 1 -1} 000638 do_execsql_test e_expr-12.1.3 { SELECT 2, +2, -2 } {2 2 -2} 000639 do_execsql_test e_expr-12.1.4 { 000640 SELECT 1.4, +1.4, -1.4 000641 } {1.4 1.4 -1.4} 000642 do_execsql_test e_expr-12.1.5 { 000643 SELECT 1.5e+5, +1.5e+5, -1.5e+5 000644 } {150000.0 150000.0 -150000.0} 000645 do_execsql_test e_expr-12.1.6 { 000646 SELECT 0.0001, +0.0001, -0.0001 000647 } {0.0001 0.0001 -0.0001} 000648 000649 # -- syntax diagram literal-value 000650 # 000651 set sqlite_current_time 1 000652 do_execsql_test e_expr-12.2.1 {SELECT 123} {123} 000653 do_execsql_test e_expr-12.2.2 {SELECT 123.4e05} {12340000.0} 000654 do_execsql_test e_expr-12.2.3 {SELECT 'abcde'} {abcde} 000655 do_execsql_test e_expr-12.2.4 {SELECT X'414243'} {ABC} 000656 do_execsql_test e_expr-12.2.5 {SELECT NULL} {{}} 000657 do_execsql_test e_expr-12.2.6 {SELECT CURRENT_TIME} {00:00:01} 000658 do_execsql_test e_expr-12.2.7 {SELECT CURRENT_DATE} {1970-01-01} 000659 do_execsql_test e_expr-12.2.8 {SELECT CURRENT_TIMESTAMP} {{1970-01-01 00:00:01}} 000660 set sqlite_current_time 0 000661 000662 # -- syntax diagram expr 000663 # 000664 forcedelete test.db2 000665 execsql { 000666 ATTACH 'test.db2' AS dbname; 000667 CREATE TABLE dbname.tblname(cname); 000668 } 000669 000670 proc glob {args} {return 1} 000671 db function glob glob 000672 db function match glob 000673 db function regexp glob 000674 000675 foreach {tn expr} { 000676 1 123 000677 2 123.4e05 000678 3 'abcde' 000679 4 X'414243' 000680 5 NULL 000681 6 CURRENT_TIME 000682 7 CURRENT_DATE 000683 8 CURRENT_TIMESTAMP 000684 000685 9 ? 000686 10 ?123 000687 11 @hello 000688 12 :world 000689 13 $tcl 000690 14 $tcl(array) 000691 000692 15 cname 000693 16 tblname.cname 000694 17 dbname.tblname.cname 000695 000696 18 "+ EXPR" 000697 19 "- EXPR" 000698 20 "NOT EXPR" 000699 21 "~ EXPR" 000700 000701 22 "EXPR1 || EXPR2" 000702 23 "EXPR1 * EXPR2" 000703 24 "EXPR1 / EXPR2" 000704 25 "EXPR1 % EXPR2" 000705 26 "EXPR1 + EXPR2" 000706 27 "EXPR1 - EXPR2" 000707 28 "EXPR1 << EXPR2" 000708 29 "EXPR1 >> EXPR2" 000709 30 "EXPR1 & EXPR2" 000710 31 "EXPR1 | EXPR2" 000711 32 "EXPR1 < EXPR2" 000712 33 "EXPR1 <= EXPR2" 000713 34 "EXPR1 > EXPR2" 000714 35 "EXPR1 >= EXPR2" 000715 36 "EXPR1 = EXPR2" 000716 37 "EXPR1 == EXPR2" 000717 38 "EXPR1 != EXPR2" 000718 39 "EXPR1 <> EXPR2" 000719 40 "EXPR1 IS EXPR2" 000720 41 "EXPR1 IS NOT EXPR2" 000721 42 "EXPR1 AND EXPR2" 000722 43 "EXPR1 OR EXPR2" 000723 000724 44 "count(*)" 000725 45 "count(DISTINCT EXPR)" 000726 46 "substr(EXPR, 10, 20)" 000727 47 "changes()" 000728 000729 48 "( EXPR )" 000730 000731 49 "CAST ( EXPR AS integer )" 000732 50 "CAST ( EXPR AS 'abcd' )" 000733 51 "CAST ( EXPR AS 'ab$ $cd' )" 000734 000735 52 "EXPR COLLATE nocase" 000736 53 "EXPR COLLATE binary" 000737 000738 54 "EXPR1 LIKE EXPR2" 000739 55 "EXPR1 LIKE EXPR2 ESCAPE EXPR" 000740 56 "EXPR1 GLOB EXPR2" 000741 57 "EXPR1 GLOB EXPR2 ESCAPE EXPR" 000742 58 "EXPR1 REGEXP EXPR2" 000743 59 "EXPR1 REGEXP EXPR2 ESCAPE EXPR" 000744 60 "EXPR1 MATCH EXPR2" 000745 61 "EXPR1 MATCH EXPR2 ESCAPE EXPR" 000746 62 "EXPR1 NOT LIKE EXPR2" 000747 63 "EXPR1 NOT LIKE EXPR2 ESCAPE EXPR" 000748 64 "EXPR1 NOT GLOB EXPR2" 000749 65 "EXPR1 NOT GLOB EXPR2 ESCAPE EXPR" 000750 66 "EXPR1 NOT REGEXP EXPR2" 000751 67 "EXPR1 NOT REGEXP EXPR2 ESCAPE EXPR" 000752 68 "EXPR1 NOT MATCH EXPR2" 000753 69 "EXPR1 NOT MATCH EXPR2 ESCAPE EXPR" 000754 000755 70 "EXPR ISNULL" 000756 71 "EXPR NOTNULL" 000757 72 "EXPR NOT NULL" 000758 000759 73 "EXPR1 IS EXPR2" 000760 74 "EXPR1 IS NOT EXPR2" 000761 000762 75 "EXPR NOT BETWEEN EXPR1 AND EXPR2" 000763 76 "EXPR BETWEEN EXPR1 AND EXPR2" 000764 000765 77 "EXPR NOT IN (SELECT cname FROM tblname)" 000766 78 "EXPR NOT IN (1)" 000767 79 "EXPR NOT IN (1, 2, 3)" 000768 80 "EXPR NOT IN tblname" 000769 81 "EXPR NOT IN dbname.tblname" 000770 82 "EXPR IN (SELECT cname FROM tblname)" 000771 83 "EXPR IN (1)" 000772 84 "EXPR IN (1, 2, 3)" 000773 85 "EXPR IN tblname" 000774 86 "EXPR IN dbname.tblname" 000775 000776 87 "EXISTS (SELECT cname FROM tblname)" 000777 88 "NOT EXISTS (SELECT cname FROM tblname)" 000778 000779 89 "CASE EXPR WHEN EXPR1 THEN EXPR2 ELSE EXPR END" 000780 90 "CASE EXPR WHEN EXPR1 THEN EXPR2 END" 000781 91 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END" 000782 92 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END" 000783 93 "CASE WHEN EXPR1 THEN EXPR2 ELSE EXPR END" 000784 94 "CASE WHEN EXPR1 THEN EXPR2 END" 000785 95 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END" 000786 96 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END" 000787 } { 000788 000789 # If the expression string being parsed contains "EXPR2", then replace 000790 # string "EXPR1" and "EXPR2" with arbitrary SQL expressions. If it 000791 # contains "EXPR", then replace EXPR with an arbitrary SQL expression. 000792 # 000793 set elist [list $expr] 000794 if {[string match *EXPR2* $expr]} { 000795 set elist [list] 000796 foreach {e1 e2} { cname "34+22" } { 000797 lappend elist [string map [list EXPR1 $e1 EXPR2 $e2] $expr] 000798 } 000799 } 000800 if {[string match *EXPR* $expr]} { 000801 set elist2 [list] 000802 foreach el $elist { 000803 foreach e { cname "34+22" } { 000804 lappend elist2 [string map [list EXPR $e] $el] 000805 } 000806 } 000807 set elist $elist2 000808 } 000809 000810 set x 0 000811 foreach e $elist { 000812 incr x 000813 do_test e_expr-12.3.$tn.$x { 000814 set rc [catch { execsql "SELECT $e FROM tblname" } msg] 000815 } {0} 000816 } 000817 } 000818 000819 # -- syntax diagram raise-function 000820 # 000821 foreach {tn raiseexpr} { 000822 1 "RAISE(IGNORE)" 000823 2 "RAISE(ROLLBACK, 'error message')" 000824 3 "RAISE(ABORT, 'error message')" 000825 4 "RAISE(FAIL, 'error message')" 000826 } { 000827 do_execsql_test e_expr-12.4.$tn " 000828 CREATE TRIGGER dbname.tr$tn BEFORE DELETE ON tblname BEGIN 000829 SELECT $raiseexpr ; 000830 END; 000831 " {} 000832 } 000833 000834 #------------------------------------------------------------------------- 000835 # Test the statements related to the BETWEEN operator. 000836 # 000837 # EVIDENCE-OF: R-40079-54503 The BETWEEN operator is logically 000838 # equivalent to a pair of comparisons. "x BETWEEN y AND z" is equivalent 000839 # to "x>=y AND x<=z" except that with BETWEEN, the x expression is 000840 # only evaluated once. 000841 # 000842 db func x x 000843 proc x {} { incr ::xcount ; return [expr $::x] } 000844 foreach {tn x expr res nEval} { 000845 1 10 "x() >= 5 AND x() <= 15" 1 2 000846 2 10 "x() BETWEEN 5 AND 15" 1 1 000847 000848 3 5 "x() >= 5 AND x() <= 5" 1 2 000849 4 5 "x() BETWEEN 5 AND 5" 1 1 000850 000851 5 9 "(x(),8) >= (9,7) AND (x(),8)<=(9,10)" 1 2 000852 6 9 "(x(),8) BETWEEN (9,7) AND (9,10)" 1 1 000853 } { 000854 do_test e_expr-13.1.$tn { 000855 set ::xcount 0 000856 set a [execsql "SELECT $expr"] 000857 list $::xcount $a 000858 } [list $nEval $res] 000859 } 000860 000861 # EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is 000862 # the same as the precedence as operators == and != and LIKE and groups 000863 # left to right. 000864 # 000865 # Therefore, BETWEEN groups more tightly than operator "AND", but less 000866 # so than "<". 000867 # 000868 do_execsql_test e_expr-13.2.1 { SELECT 1 == 10 BETWEEN 0 AND 2 } 1 000869 do_execsql_test e_expr-13.2.2 { SELECT (1 == 10) BETWEEN 0 AND 2 } 1 000870 do_execsql_test e_expr-13.2.3 { SELECT 1 == (10 BETWEEN 0 AND 2) } 0 000871 do_execsql_test e_expr-13.2.4 { SELECT 6 BETWEEN 4 AND 8 == 1 } 1 000872 do_execsql_test e_expr-13.2.5 { SELECT (6 BETWEEN 4 AND 8) == 1 } 1 000873 do_execsql_test e_expr-13.2.6 { SELECT 6 BETWEEN 4 AND (8 == 1) } 0 000874 000875 do_execsql_test e_expr-13.2.7 { SELECT 5 BETWEEN 0 AND 0 != 1 } 1 000876 do_execsql_test e_expr-13.2.8 { SELECT (5 BETWEEN 0 AND 0) != 1 } 1 000877 do_execsql_test e_expr-13.2.9 { SELECT 5 BETWEEN 0 AND (0 != 1) } 0 000878 do_execsql_test e_expr-13.2.10 { SELECT 1 != 0 BETWEEN 0 AND 2 } 1 000879 do_execsql_test e_expr-13.2.11 { SELECT (1 != 0) BETWEEN 0 AND 2 } 1 000880 do_execsql_test e_expr-13.2.12 { SELECT 1 != (0 BETWEEN 0 AND 2) } 0 000881 000882 do_execsql_test e_expr-13.2.13 { SELECT 1 LIKE 10 BETWEEN 0 AND 2 } 1 000883 do_execsql_test e_expr-13.2.14 { SELECT (1 LIKE 10) BETWEEN 0 AND 2 } 1 000884 do_execsql_test e_expr-13.2.15 { SELECT 1 LIKE (10 BETWEEN 0 AND 2) } 0 000885 do_execsql_test e_expr-13.2.16 { SELECT 6 BETWEEN 4 AND 8 LIKE 1 } 1 000886 do_execsql_test e_expr-13.2.17 { SELECT (6 BETWEEN 4 AND 8) LIKE 1 } 1 000887 do_execsql_test e_expr-13.2.18 { SELECT 6 BETWEEN 4 AND (8 LIKE 1) } 0 000888 000889 do_execsql_test e_expr-13.2.19 { SELECT 0 AND 0 BETWEEN 0 AND 1 } 0 000890 do_execsql_test e_expr-13.2.20 { SELECT 0 AND (0 BETWEEN 0 AND 1) } 0 000891 do_execsql_test e_expr-13.2.21 { SELECT (0 AND 0) BETWEEN 0 AND 1 } 1 000892 do_execsql_test e_expr-13.2.22 { SELECT 0 BETWEEN -1 AND 1 AND 0 } 0 000893 do_execsql_test e_expr-13.2.23 { SELECT (0 BETWEEN -1 AND 1) AND 0 } 0 000894 do_execsql_test e_expr-13.2.24 { SELECT 0 BETWEEN -1 AND (1 AND 0) } 1 000895 000896 do_execsql_test e_expr-13.2.25 { SELECT 2 < 3 BETWEEN 0 AND 1 } 1 000897 do_execsql_test e_expr-13.2.26 { SELECT (2 < 3) BETWEEN 0 AND 1 } 1 000898 do_execsql_test e_expr-13.2.27 { SELECT 2 < (3 BETWEEN 0 AND 1) } 0 000899 do_execsql_test e_expr-13.2.28 { SELECT 2 BETWEEN 1 AND 2 < 3 } 0 000900 do_execsql_test e_expr-13.2.29 { SELECT 2 BETWEEN 1 AND (2 < 3) } 0 000901 do_execsql_test e_expr-13.2.30 { SELECT (2 BETWEEN 1 AND 2) < 3 } 1 000902 000903 #------------------------------------------------------------------------- 000904 # Test the statements related to the LIKE and GLOB operators. 000905 # 000906 # EVIDENCE-OF: R-16584-60189 The LIKE operator does a pattern matching 000907 # comparison. 000908 # 000909 # EVIDENCE-OF: R-11295-04657 The operand to the right of the LIKE 000910 # operator contains the pattern and the left hand operand contains the 000911 # string to match against the pattern. 000912 # 000913 do_execsql_test e_expr-14.1.1 { SELECT 'abc%' LIKE 'abcde' } 0 000914 do_execsql_test e_expr-14.1.2 { SELECT 'abcde' LIKE 'abc%' } 1 000915 000916 # EVIDENCE-OF: R-55406-38524 A percent symbol ("%") in the LIKE pattern 000917 # matches any sequence of zero or more characters in the string. 000918 # 000919 do_execsql_test e_expr-14.2.1 { SELECT 'abde' LIKE 'ab%de' } 1 000920 do_execsql_test e_expr-14.2.2 { SELECT 'abXde' LIKE 'ab%de' } 1 000921 do_execsql_test e_expr-14.2.3 { SELECT 'abABCde' LIKE 'ab%de' } 1 000922 000923 # EVIDENCE-OF: R-30433-25443 An underscore ("_") in the LIKE pattern 000924 # matches any single character in the string. 000925 # 000926 do_execsql_test e_expr-14.3.1 { SELECT 'abde' LIKE 'ab_de' } 0 000927 do_execsql_test e_expr-14.3.2 { SELECT 'abXde' LIKE 'ab_de' } 1 000928 do_execsql_test e_expr-14.3.3 { SELECT 'abABCde' LIKE 'ab_de' } 0 000929 000930 # EVIDENCE-OF: R-59007-20454 Any other character matches itself or its 000931 # lower/upper case equivalent (i.e. case-insensitive matching). 000932 # 000933 do_execsql_test e_expr-14.4.1 { SELECT 'abc' LIKE 'aBc' } 1 000934 do_execsql_test e_expr-14.4.2 { SELECT 'aBc' LIKE 'aBc' } 1 000935 do_execsql_test e_expr-14.4.3 { SELECT 'ac' LIKE 'aBc' } 0 000936 000937 # EVIDENCE-OF: R-23648-58527 SQLite only understands upper/lower case 000938 # for ASCII characters by default. 000939 # 000940 # EVIDENCE-OF: R-04532-11527 The LIKE operator is case sensitive by 000941 # default for unicode characters that are beyond the ASCII range. 000942 # 000943 # EVIDENCE-OF: R-44381-11669 the expression 000944 # 'a' LIKE 'A' is TRUE but 000945 # 'æ' LIKE 'Æ' is FALSE. 000946 # 000947 # The restriction to ASCII characters does not apply if the ICU 000948 # library is compiled in. When ICU is enabled SQLite does not act 000949 # as it does "by default". 000950 # 000951 do_execsql_test e_expr-14.5.1 { SELECT 'A' LIKE 'a' } 1 000952 ifcapable !icu { 000953 do_execsql_test e_expr-14.5.2 "SELECT '\u00c6' LIKE '\u00e6'" 0 000954 } 000955 000956 # EVIDENCE-OF: R-56683-13731 If the optional ESCAPE clause is present, 000957 # then the expression following the ESCAPE keyword must evaluate to a 000958 # string consisting of a single character. 000959 # 000960 do_catchsql_test e_expr-14.6.1 { 000961 SELECT 'A' LIKE 'a' ESCAPE '12' 000962 } {1 {ESCAPE expression must be a single character}} 000963 do_catchsql_test e_expr-14.6.2 { 000964 SELECT 'A' LIKE 'a' ESCAPE '' 000965 } {1 {ESCAPE expression must be a single character}} 000966 do_catchsql_test e_expr-14.6.3 { SELECT 'A' LIKE 'a' ESCAPE 'x' } {0 1} 000967 do_catchsql_test e_expr-14.6.4 "SELECT 'A' LIKE 'a' ESCAPE '\u00e6'" {0 1} 000968 000969 # EVIDENCE-OF: R-02045-23762 This character may be used in the LIKE 000970 # pattern to include literal percent or underscore characters. 000971 # 000972 # EVIDENCE-OF: R-13345-31830 The escape character followed by a percent 000973 # symbol (%), underscore (_), or a second instance of the escape 000974 # character itself matches a literal percent symbol, underscore, or a 000975 # single escape character, respectively. 000976 # 000977 do_execsql_test e_expr-14.7.1 { SELECT 'abc%' LIKE 'abcX%' ESCAPE 'X' } 1 000978 do_execsql_test e_expr-14.7.2 { SELECT 'abc5' LIKE 'abcX%' ESCAPE 'X' } 0 000979 do_execsql_test e_expr-14.7.3 { SELECT 'abc' LIKE 'abcX%' ESCAPE 'X' } 0 000980 do_execsql_test e_expr-14.7.4 { SELECT 'abcX%' LIKE 'abcX%' ESCAPE 'X' } 0 000981 do_execsql_test e_expr-14.7.5 { SELECT 'abc%%' LIKE 'abcX%' ESCAPE 'X' } 0 000982 000983 do_execsql_test e_expr-14.7.6 { SELECT 'abc_' LIKE 'abcX_' ESCAPE 'X' } 1 000984 do_execsql_test e_expr-14.7.7 { SELECT 'abc5' LIKE 'abcX_' ESCAPE 'X' } 0 000985 do_execsql_test e_expr-14.7.8 { SELECT 'abc' LIKE 'abcX_' ESCAPE 'X' } 0 000986 do_execsql_test e_expr-14.7.9 { SELECT 'abcX_' LIKE 'abcX_' ESCAPE 'X' } 0 000987 do_execsql_test e_expr-14.7.10 { SELECT 'abc__' LIKE 'abcX_' ESCAPE 'X' } 0 000988 000989 do_execsql_test e_expr-14.7.11 { SELECT 'abcX' LIKE 'abcXX' ESCAPE 'X' } 1 000990 do_execsql_test e_expr-14.7.12 { SELECT 'abc5' LIKE 'abcXX' ESCAPE 'X' } 0 000991 do_execsql_test e_expr-14.7.13 { SELECT 'abc' LIKE 'abcXX' ESCAPE 'X' } 0 000992 do_execsql_test e_expr-14.7.14 { SELECT 'abcXX' LIKE 'abcXX' ESCAPE 'X' } 0 000993 000994 # EVIDENCE-OF: R-51359-17496 The infix LIKE operator is implemented by 000995 # calling the application-defined SQL functions like(Y,X) or like(Y,X,Z). 000996 # 000997 proc likefunc {args} { 000998 eval lappend ::likeargs $args 000999 return 1 001000 } 001001 db func like -argcount 2 likefunc 001002 db func like -argcount 3 likefunc 001003 set ::likeargs [list] 001004 do_execsql_test e_expr-15.1.1 { SELECT 'abc' LIKE 'def' } 1 001005 do_test e_expr-15.1.2 { set likeargs } {def abc} 001006 set ::likeargs [list] 001007 do_execsql_test e_expr-15.1.3 { SELECT 'abc' LIKE 'def' ESCAPE 'X' } 1 001008 do_test e_expr-15.1.4 { set likeargs } {def abc X} 001009 db close 001010 sqlite3 db test.db 001011 001012 # EVIDENCE-OF: R-22868-25880 The LIKE operator can be made case 001013 # sensitive using the case_sensitive_like pragma. 001014 # 001015 do_execsql_test e_expr-16.1.1 { SELECT 'abcxyz' LIKE 'ABC%' } 1 001016 do_execsql_test e_expr-16.1.2 { PRAGMA case_sensitive_like = 1 } {} 001017 do_execsql_test e_expr-16.1.3 { SELECT 'abcxyz' LIKE 'ABC%' } 0 001018 do_execsql_test e_expr-16.1.4 { SELECT 'ABCxyz' LIKE 'ABC%' } 1 001019 do_execsql_test e_expr-16.1.5 { PRAGMA case_sensitive_like = 0 } {} 001020 do_execsql_test e_expr-16.1.6 { SELECT 'abcxyz' LIKE 'ABC%' } 1 001021 do_execsql_test e_expr-16.1.7 { SELECT 'ABCxyz' LIKE 'ABC%' } 1 001022 001023 # EVIDENCE-OF: R-52087-12043 The GLOB operator is similar to LIKE but 001024 # uses the Unix file globbing syntax for its wildcards. 001025 # 001026 # EVIDENCE-OF: R-09813-17279 Also, GLOB is case sensitive, unlike LIKE. 001027 # 001028 do_execsql_test e_expr-17.1.1 { SELECT 'abcxyz' GLOB 'abc%' } 0 001029 do_execsql_test e_expr-17.1.2 { SELECT 'abcxyz' GLOB 'abc*' } 1 001030 do_execsql_test e_expr-17.1.3 { SELECT 'abcxyz' GLOB 'abc___' } 0 001031 do_execsql_test e_expr-17.1.4 { SELECT 'abcxyz' GLOB 'abc???' } 1 001032 001033 do_execsql_test e_expr-17.1.5 { SELECT 'abcxyz' GLOB 'abc*' } 1 001034 do_execsql_test e_expr-17.1.6 { SELECT 'ABCxyz' GLOB 'abc*' } 0 001035 do_execsql_test e_expr-17.1.7 { SELECT 'abcxyz' GLOB 'ABC*' } 0 001036 001037 # EVIDENCE-OF: R-39616-20555 Both GLOB and LIKE may be preceded by the 001038 # NOT keyword to invert the sense of the test. 001039 # 001040 do_execsql_test e_expr-17.2.1 { SELECT 'abcxyz' NOT GLOB 'ABC*' } 1 001041 do_execsql_test e_expr-17.2.2 { SELECT 'abcxyz' NOT GLOB 'abc*' } 0 001042 do_execsql_test e_expr-17.2.3 { SELECT 'abcxyz' NOT LIKE 'ABC%' } 0 001043 do_execsql_test e_expr-17.2.4 { SELECT 'abcxyz' NOT LIKE 'abc%' } 0 001044 do_execsql_test e_expr-17.2.5 { SELECT 'abdxyz' NOT LIKE 'abc%' } 1 001045 001046 db nullvalue null 001047 do_execsql_test e_expr-17.2.6 { SELECT 'abcxyz' NOT GLOB NULL } null 001048 do_execsql_test e_expr-17.2.7 { SELECT 'abcxyz' NOT LIKE NULL } null 001049 do_execsql_test e_expr-17.2.8 { SELECT NULL NOT GLOB 'abc*' } null 001050 do_execsql_test e_expr-17.2.9 { SELECT NULL NOT LIKE 'ABC%' } null 001051 db nullvalue {} 001052 001053 # EVIDENCE-OF: R-39414-35489 The infix GLOB operator is implemented by 001054 # calling the function glob(Y,X) and can be modified by overriding that 001055 # function. 001056 proc globfunc {args} { 001057 eval lappend ::globargs $args 001058 return 1 001059 } 001060 db func glob -argcount 2 globfunc 001061 set ::globargs [list] 001062 do_execsql_test e_expr-17.3.1 { SELECT 'abc' GLOB 'def' } 1 001063 do_test e_expr-17.3.2 { set globargs } {def abc} 001064 set ::globargs [list] 001065 do_execsql_test e_expr-17.3.3 { SELECT 'X' NOT GLOB 'Y' } 0 001066 do_test e_expr-17.3.4 { set globargs } {Y X} 001067 sqlite3 db test.db 001068 001069 # EVIDENCE-OF: R-41650-20872 No regexp() user function is defined by 001070 # default and so use of the REGEXP operator will normally result in an 001071 # error message. 001072 # 001073 # There is a regexp function if ICU is enabled though. 001074 # 001075 ifcapable !icu { 001076 do_catchsql_test e_expr-18.1.1 { 001077 SELECT regexp('abc', 'def') 001078 } {1 {no such function: regexp}} 001079 do_catchsql_test e_expr-18.1.2 { 001080 SELECT 'abc' REGEXP 'def' 001081 } {1 {no such function: REGEXP}} 001082 } 001083 001084 # EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for 001085 # the regexp() user function. 001086 # 001087 # EVIDENCE-OF: R-65524-61849 If an application-defined SQL function 001088 # named "regexp" is added at run-time, then the "X REGEXP Y" operator 001089 # will be implemented as a call to "regexp(Y,X)". 001090 # 001091 proc regexpfunc {args} { 001092 eval lappend ::regexpargs $args 001093 return 1 001094 } 001095 db func regexp -argcount 2 regexpfunc 001096 set ::regexpargs [list] 001097 do_execsql_test e_expr-18.2.1 { SELECT 'abc' REGEXP 'def' } 1 001098 do_test e_expr-18.2.2 { set regexpargs } {def abc} 001099 set ::regexpargs [list] 001100 do_execsql_test e_expr-18.2.3 { SELECT 'X' NOT REGEXP 'Y' } 0 001101 do_test e_expr-18.2.4 { set regexpargs } {Y X} 001102 sqlite3 db test.db 001103 001104 # EVIDENCE-OF: R-42037-37826 The default match() function implementation 001105 # raises an exception and is not really useful for anything. 001106 # 001107 do_catchsql_test e_expr-19.1.1 { 001108 SELECT 'abc' MATCH 'def' 001109 } {1 {unable to use function MATCH in the requested context}} 001110 do_catchsql_test e_expr-19.1.2 { 001111 SELECT match('abc', 'def') 001112 } {1 {unable to use function MATCH in the requested context}} 001113 001114 # EVIDENCE-OF: R-37916-47407 The MATCH operator is a special syntax for 001115 # the match() application-defined function. 001116 # 001117 # EVIDENCE-OF: R-06021-09373 But extensions can override the match() 001118 # function with more helpful logic. 001119 # 001120 proc matchfunc {args} { 001121 eval lappend ::matchargs $args 001122 return 1 001123 } 001124 db func match -argcount 2 matchfunc 001125 set ::matchargs [list] 001126 do_execsql_test e_expr-19.2.1 { SELECT 'abc' MATCH 'def' } 1 001127 do_test e_expr-19.2.2 { set matchargs } {def abc} 001128 set ::matchargs [list] 001129 do_execsql_test e_expr-19.2.3 { SELECT 'X' NOT MATCH 'Y' } 0 001130 do_test e_expr-19.2.4 { set matchargs } {Y X} 001131 sqlite3 db test.db 001132 001133 #------------------------------------------------------------------------- 001134 # Test cases for the testable statements related to the CASE expression. 001135 # 001136 # EVIDENCE-OF: R-15199-61389 There are two basic forms of the CASE 001137 # expression: those with a base expression and those without. 001138 # 001139 do_execsql_test e_expr-20.1 { 001140 SELECT CASE WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END; 001141 } {true} 001142 do_execsql_test e_expr-20.2 { 001143 SELECT CASE 0 WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END; 001144 } {false} 001145 001146 proc var {nm} { 001147 lappend ::varlist $nm 001148 return [set "::$nm"] 001149 } 001150 db func var var 001151 001152 # EVIDENCE-OF: R-30638-59954 In a CASE without a base expression, each 001153 # WHEN expression is evaluated and the result treated as a boolean, 001154 # starting with the leftmost and continuing to the right. 001155 # 001156 foreach {a b c} {0 0 0} break 001157 set varlist [list] 001158 do_execsql_test e_expr-21.1.1 { 001159 SELECT CASE WHEN var('a') THEN 'A' 001160 WHEN var('b') THEN 'B' 001161 WHEN var('c') THEN 'C' END 001162 } {{}} 001163 do_test e_expr-21.1.2 { set varlist } {a b c} 001164 set varlist [list] 001165 do_execsql_test e_expr-21.1.3 { 001166 SELECT CASE WHEN var('c') THEN 'C' 001167 WHEN var('b') THEN 'B' 001168 WHEN var('a') THEN 'A' 001169 ELSE 'no result' 001170 END 001171 } {{no result}} 001172 do_test e_expr-21.1.4 { set varlist } {c b a} 001173 001174 # EVIDENCE-OF: R-39009-25596 The result of the CASE expression is the 001175 # evaluation of the THEN expression that corresponds to the first WHEN 001176 # expression that evaluates to true. 001177 # 001178 foreach {a b c} {0 1 0} break 001179 do_execsql_test e_expr-21.2.1 { 001180 SELECT CASE WHEN var('a') THEN 'A' 001181 WHEN var('b') THEN 'B' 001182 WHEN var('c') THEN 'C' 001183 ELSE 'no result' 001184 END 001185 } {B} 001186 foreach {a b c} {0 1 1} break 001187 do_execsql_test e_expr-21.2.2 { 001188 SELECT CASE WHEN var('a') THEN 'A' 001189 WHEN var('b') THEN 'B' 001190 WHEN var('c') THEN 'C' 001191 ELSE 'no result' 001192 END 001193 } {B} 001194 foreach {a b c} {0 0 1} break 001195 do_execsql_test e_expr-21.2.3 { 001196 SELECT CASE WHEN var('a') THEN 'A' 001197 WHEN var('b') THEN 'B' 001198 WHEN var('c') THEN 'C' 001199 ELSE 'no result' 001200 END 001201 } {C} 001202 001203 # EVIDENCE-OF: R-24227-04807 Or, if none of the WHEN expressions 001204 # evaluate to true, the result of evaluating the ELSE expression, if 001205 # any. 001206 # 001207 foreach {a b c} {0 0 0} break 001208 do_execsql_test e_expr-21.3.1 { 001209 SELECT CASE WHEN var('a') THEN 'A' 001210 WHEN var('b') THEN 'B' 001211 WHEN var('c') THEN 'C' 001212 ELSE 'no result' 001213 END 001214 } {{no result}} 001215 001216 # EVIDENCE-OF: R-14168-07579 If there is no ELSE expression and none of 001217 # the WHEN expressions are true, then the overall result is NULL. 001218 # 001219 db nullvalue null 001220 do_execsql_test e_expr-21.3.2 { 001221 SELECT CASE WHEN var('a') THEN 'A' 001222 WHEN var('b') THEN 'B' 001223 WHEN var('c') THEN 'C' 001224 END 001225 } {null} 001226 db nullvalue {} 001227 001228 # EVIDENCE-OF: R-13943-13592 A NULL result is considered untrue when 001229 # evaluating WHEN terms. 001230 # 001231 do_execsql_test e_expr-21.4.1 { 001232 SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END 001233 } {B} 001234 do_execsql_test e_expr-21.4.2 { 001235 SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END 001236 } {C} 001237 001238 # EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base 001239 # expression is evaluated just once and the result is compared against 001240 # the evaluation of each WHEN expression from left to right. 001241 # 001242 # Note: This test case tests the "evaluated just once" part of the above 001243 # statement. Tests associated with the next two statements test that the 001244 # comparisons take place. 001245 # 001246 foreach {a b c} [list [expr 3] [expr 4] [expr 5]] break 001247 set ::varlist [list] 001248 do_execsql_test e_expr-22.1.1 { 001249 SELECT CASE var('a') WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' END 001250 } {C} 001251 do_test e_expr-22.1.2 { set ::varlist } {a} 001252 001253 # EVIDENCE-OF: R-07667-49537 The result of the CASE expression is the 001254 # evaluation of the THEN expression that corresponds to the first WHEN 001255 # expression for which the comparison is true. 001256 # 001257 do_execsql_test e_expr-22.2.1 { 001258 SELECT CASE 23 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END 001259 } {B} 001260 do_execsql_test e_expr-22.2.2 { 001261 SELECT CASE 1 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END 001262 } {A} 001263 001264 # EVIDENCE-OF: R-47543-32145 Or, if none of the WHEN expressions 001265 # evaluate to a value equal to the base expression, the result of 001266 # evaluating the ELSE expression, if any. 001267 # 001268 do_execsql_test e_expr-22.3.1 { 001269 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' ELSE 'D' END 001270 } {D} 001271 001272 # EVIDENCE-OF: R-54721-48557 If there is no ELSE expression and none of 001273 # the WHEN expressions produce a result equal to the base expression, 001274 # the overall result is NULL. 001275 # 001276 do_execsql_test e_expr-22.4.1 { 001277 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END 001278 } {{}} 001279 db nullvalue null 001280 do_execsql_test e_expr-22.4.2 { 001281 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END 001282 } {null} 001283 db nullvalue {} 001284 001285 # EVIDENCE-OF: R-11479-62774 When comparing a base expression against a 001286 # WHEN expression, the same collating sequence, affinity, and 001287 # NULL-handling rules apply as if the base expression and WHEN 001288 # expression are respectively the left- and right-hand operands of an = 001289 # operator. 001290 # 001291 proc rev {str} { 001292 set ret "" 001293 set chars [split $str] 001294 for {set i [expr [llength $chars]-1]} {$i>=0} {incr i -1} { 001295 append ret [lindex $chars $i] 001296 } 001297 set ret 001298 } 001299 proc reverse {lhs rhs} { 001300 string compare [rev $lhs] [rev $rhs] 001301 } 001302 db collate reverse reverse 001303 do_execsql_test e_expr-23.1.1 { 001304 CREATE TABLE t1( 001305 a TEXT COLLATE NOCASE, 001306 b COLLATE REVERSE, 001307 c INTEGER, 001308 d BLOB 001309 ); 001310 INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5); 001311 } {} 001312 do_execsql_test e_expr-23.1.2 { 001313 SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1 001314 } {B} 001315 do_execsql_test e_expr-23.1.3 { 001316 SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1 001317 } {B} 001318 do_execsql_test e_expr-23.1.4 { 001319 SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1 001320 } {B} 001321 do_execsql_test e_expr-23.1.5 { 001322 SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1 001323 } {B} 001324 do_execsql_test e_expr-23.1.6 { 001325 SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END 001326 } {B} 001327 do_execsql_test e_expr-23.1.7 { 001328 SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1 001329 } {A} 001330 do_execsql_test e_expr-23.1.8 { 001331 SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1 001332 } {B} 001333 do_execsql_test e_expr-23.1.9 { 001334 SELECT CASE NULL WHEN NULL THEN 'A' ELSE 'B' END 001335 } {B} 001336 001337 # EVIDENCE-OF: R-37304-39405 If the base expression is NULL then the 001338 # result of the CASE is always the result of evaluating the ELSE 001339 # expression if it exists, or NULL if it does not. 001340 # 001341 do_execsql_test e_expr-24.1.1 { 001342 SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' END; 001343 } {{}} 001344 do_execsql_test e_expr-24.1.2 { 001345 SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' ELSE 'C' END; 001346 } {C} 001347 001348 # EVIDENCE-OF: R-56280-17369 Both forms of the CASE expression use lazy, 001349 # or short-circuit, evaluation. 001350 # 001351 set varlist [list] 001352 foreach {a b c} {0 1 0} break 001353 do_execsql_test e_expr-25.1.1 { 001354 SELECT CASE WHEN var('a') THEN 'A' 001355 WHEN var('b') THEN 'B' 001356 WHEN var('c') THEN 'C' 001357 END 001358 } {B} 001359 do_test e_expr-25.1.2 { set ::varlist } {a b} 001360 set varlist [list] 001361 do_execsql_test e_expr-25.1.3 { 001362 SELECT CASE '0' WHEN var('a') THEN 'A' 001363 WHEN var('b') THEN 'B' 001364 WHEN var('c') THEN 'C' 001365 END 001366 } {A} 001367 do_test e_expr-25.1.4 { set ::varlist } {a} 001368 001369 # EVIDENCE-OF: R-34773-62253 The only difference between the following 001370 # two CASE expressions is that the x expression is evaluated exactly 001371 # once in the first example but might be evaluated multiple times in the 001372 # second: CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END CASE WHEN 001373 # x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END 001374 # 001375 proc ceval {x} { 001376 incr ::evalcount 001377 return $x 001378 } 001379 db func ceval ceval 001380 set ::evalcount 0 001381 001382 do_execsql_test e_expr-26.1.1 { 001383 CREATE TABLE t2(x, w1, r1, w2, r2, r3); 001384 INSERT INTO t2 VALUES(1, 1, 'R1', 2, 'R2', 'R3'); 001385 INSERT INTO t2 VALUES(2, 1, 'R1', 2, 'R2', 'R3'); 001386 INSERT INTO t2 VALUES(3, 1, 'R1', 2, 'R2', 'R3'); 001387 } {} 001388 do_execsql_test e_expr-26.1.2 { 001389 SELECT CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2 001390 } {R1 R2 R3} 001391 do_execsql_test e_expr-26.1.3 { 001392 SELECT CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END FROM t2 001393 } {R1 R2 R3} 001394 001395 do_execsql_test e_expr-26.1.4 { 001396 SELECT CASE ceval(x) WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2 001397 } {R1 R2 R3} 001398 do_test e_expr-26.1.5 { set ::evalcount } {3} 001399 set ::evalcount 0 001400 do_execsql_test e_expr-26.1.6 { 001401 SELECT CASE 001402 WHEN ceval(x)=w1 THEN r1 001403 WHEN ceval(x)=w2 THEN r2 001404 ELSE r3 END 001405 FROM t2 001406 } {R1 R2 R3} 001407 do_test e_expr-26.1.6 { set ::evalcount } {5} 001408 001409 001410 #------------------------------------------------------------------------- 001411 # Test statements related to CAST expressions. 001412 # 001413 # EVIDENCE-OF: R-20854-17109 A CAST conversion is similar to the 001414 # conversion that takes place when a column affinity is applied to a 001415 # value except that with the CAST operator the conversion always takes 001416 # place even if the conversion lossy and irreversible, whereas column 001417 # affinity only changes the data type of a value if the change is 001418 # lossless and reversible. 001419 # 001420 do_execsql_test e_expr-27.1.1 { 001421 CREATE TABLE t3(a TEXT, b REAL, c INTEGER); 001422 INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5); 001423 SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3; 001424 } {blob UVU text 1.23abc real 4.5} 001425 do_execsql_test e_expr-27.1.2 { 001426 SELECT 001427 typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT), 001428 typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL), 001429 typeof(CAST(4.5 as INTEGER)), CAST(4.5 as INTEGER) 001430 } {text UVU real 1.23 integer 4} 001431 001432 # EVIDENCE-OF: R-32434-09092 If the value of expr is NULL, then the 001433 # result of the CAST expression is also NULL. 001434 # 001435 do_expr_test e_expr-27.2.1 { CAST(NULL AS integer) } null {} 001436 do_expr_test e_expr-27.2.2 { CAST(NULL AS text) } null {} 001437 do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) } null {} 001438 do_expr_test e_expr-27.2.4 { CAST(NULL AS number) } null {} 001439 001440 # EVIDENCE-OF: R-29283-15561 Otherwise, the storage class of the result 001441 # is determined by applying the rules for determining column affinity to 001442 # the type-name. 001443 # 001444 # The R-29283-15561 requirement above is demonstrated by all of the 001445 # subsequent e_expr-26 tests. 001446 # 001447 # EVIDENCE-OF: R-43522-35548 Casting a value to a type-name with no 001448 # affinity causes the value to be converted into a BLOB. 001449 # 001450 do_expr_test e_expr-27.3.1 { CAST('abc' AS blob) } blob abc 001451 do_expr_test e_expr-27.3.2 { CAST('def' AS shobblob_x) } blob def 001452 do_expr_test e_expr-27.3.3 { CAST('ghi' AS abbLOb10) } blob ghi 001453 001454 # EVIDENCE-OF: R-22956-37754 Casting to a BLOB consists of first casting 001455 # the value to TEXT in the encoding of the database connection, then 001456 # interpreting the resulting byte sequence as a BLOB instead of as TEXT. 001457 # 001458 do_qexpr_test e_expr-27.4.1 { CAST('ghi' AS blob) } X'676869' 001459 do_qexpr_test e_expr-27.4.2 { CAST(456 AS blob) } X'343536' 001460 do_qexpr_test e_expr-27.4.3 { CAST(1.78 AS blob) } X'312E3738' 001461 rename db db2 001462 sqlite3 db :memory: 001463 ifcapable {utf16} { 001464 db eval { PRAGMA encoding = 'utf-16le' } 001465 do_qexpr_test e_expr-27.4.4 { CAST('ghi' AS blob) } X'670068006900' 001466 do_qexpr_test e_expr-27.4.5 { CAST(456 AS blob) } X'340035003600' 001467 do_qexpr_test e_expr-27.4.6 { CAST(1.78 AS blob) } X'31002E0037003800' 001468 } 001469 db close 001470 sqlite3 db :memory: 001471 db eval { PRAGMA encoding = 'utf-16be' } 001472 ifcapable {utf16} { 001473 do_qexpr_test e_expr-27.4.7 { CAST('ghi' AS blob) } X'006700680069' 001474 do_qexpr_test e_expr-27.4.8 { CAST(456 AS blob) } X'003400350036' 001475 do_qexpr_test e_expr-27.4.9 { CAST(1.78 AS blob) } X'0031002E00370038' 001476 } 001477 db close 001478 rename db2 db 001479 001480 # EVIDENCE-OF: R-04207-37981 To cast a BLOB value to TEXT, the sequence 001481 # of bytes that make up the BLOB is interpreted as text encoded using 001482 # the database encoding. 001483 # 001484 do_expr_test e_expr-28.1.1 { CAST (X'676869' AS text) } text ghi 001485 do_expr_test e_expr-28.1.2 { CAST (X'670068006900' AS text) } text g 001486 rename db db2 001487 sqlite3 db :memory: 001488 db eval { PRAGMA encoding = 'utf-16le' } 001489 ifcapable {utf16} { 001490 do_expr_test e_expr-28.1.3 { CAST (X'676869' AS text) == 'ghi' } integer 0 001491 do_expr_test e_expr-28.1.4 { CAST (X'670068006900' AS text) } text ghi 001492 } 001493 db close 001494 rename db2 db 001495 001496 # EVIDENCE-OF: R-22235-47006 Casting an INTEGER or REAL value into TEXT 001497 # renders the value as if via sqlite3_snprintf() except that the 001498 # resulting TEXT uses the encoding of the database connection. 001499 # 001500 do_expr_test e_expr-28.2.1 { CAST (1 AS text) } text 1 001501 do_expr_test e_expr-28.2.2 { CAST (45 AS text) } text 45 001502 do_expr_test e_expr-28.2.3 { CAST (-45 AS text) } text -45 001503 do_expr_test e_expr-28.2.4 { CAST (8.8 AS text) } text 8.8 001504 do_expr_test e_expr-28.2.5 { CAST (2.3e+5 AS text) } text 230000.0 001505 do_expr_test e_expr-28.2.6 { CAST (-2.3e-5 AS text) } text -2.3e-05 001506 do_expr_test e_expr-28.2.7 { CAST (0.0 AS text) } text 0.0 001507 do_expr_test e_expr-28.2.7 { CAST (0 AS text) } text 0 001508 001509 # EVIDENCE-OF: R-26346-36443 When casting a BLOB value to a REAL, the 001510 # value is first converted to TEXT. 001511 # 001512 do_expr_test e_expr-29.1.1 { CAST (X'312E3233' AS REAL) } real 1.23 001513 do_expr_test e_expr-29.1.2 { CAST (X'3233302E30' AS REAL) } real 230.0 001514 do_expr_test e_expr-29.1.3 { CAST (X'2D392E3837' AS REAL) } real -9.87 001515 do_expr_test e_expr-29.1.4 { CAST (X'302E30303031' AS REAL) } real 0.0001 001516 rename db db2 001517 sqlite3 db :memory: 001518 ifcapable {utf16} { 001519 db eval { PRAGMA encoding = 'utf-16le' } 001520 do_expr_test e_expr-29.1.5 { 001521 CAST (X'31002E0032003300' AS REAL) } real 1.23 001522 do_expr_test e_expr-29.1.6 { 001523 CAST (X'3200330030002E003000' AS REAL) } real 230.0 001524 do_expr_test e_expr-29.1.7 { 001525 CAST (X'2D0039002E0038003700' AS REAL) } real -9.87 001526 do_expr_test e_expr-29.1.8 { 001527 CAST (X'30002E003000300030003100' AS REAL) } real 0.0001 001528 } 001529 db close 001530 rename db2 db 001531 001532 # EVIDENCE-OF: R-54898-34554 When casting a TEXT value to REAL, the 001533 # longest possible prefix of the value that can be interpreted as a real 001534 # number is extracted from the TEXT value and the remainder ignored. 001535 # 001536 do_expr_test e_expr-29.2.1 { CAST('1.23abcd' AS REAL) } real 1.23 001537 do_expr_test e_expr-29.2.2 { CAST('1.45.23abcd' AS REAL) } real 1.45 001538 do_expr_test e_expr-29.2.3 { CAST('-2.12e-01ABC' AS REAL) } real -0.212 001539 do_expr_test e_expr-29.2.4 { CAST('1 2 3 4' AS REAL) } real 1.0 001540 001541 # EVIDENCE-OF: R-11321-47427 Any leading spaces in the TEXT value are 001542 # ignored when converging from TEXT to REAL. 001543 # 001544 do_expr_test e_expr-29.3.1 { CAST(' 1.23abcd' AS REAL) } real 1.23 001545 do_expr_test e_expr-29.3.2 { CAST(' 1.45.23abcd' AS REAL) } real 1.45 001546 do_expr_test e_expr-29.3.3 { CAST(' -2.12e-01ABC' AS REAL) } real -0.212 001547 do_expr_test e_expr-29.3.4 { CAST(' 1 2 3 4' AS REAL) } real 1.0 001548 001549 # EVIDENCE-OF: R-22662-28218 If there is no prefix that can be 001550 # interpreted as a real number, the result of the conversion is 0.0. 001551 # 001552 do_expr_test e_expr-29.4.1 { CAST('' AS REAL) } real 0.0 001553 do_expr_test e_expr-29.4.2 { CAST('not a number' AS REAL) } real 0.0 001554 do_expr_test e_expr-29.4.3 { CAST('XXI' AS REAL) } real 0.0 001555 001556 # EVIDENCE-OF: R-21829-14563 When casting a BLOB value to INTEGER, the 001557 # value is first converted to TEXT. 001558 # 001559 do_expr_test e_expr-30.1.1 { CAST(X'313233' AS INTEGER) } integer 123 001560 do_expr_test e_expr-30.1.2 { CAST(X'2D363738' AS INTEGER) } integer -678 001561 do_expr_test e_expr-30.1.3 { 001562 CAST(X'31303030303030' AS INTEGER) 001563 } integer 1000000 001564 do_expr_test e_expr-30.1.4 { 001565 CAST(X'2D31313235383939393036383432363234' AS INTEGER) 001566 } integer -1125899906842624 001567 001568 rename db db2 001569 sqlite3 db :memory: 001570 ifcapable {utf16} { 001571 execsql { PRAGMA encoding = 'utf-16be' } 001572 do_expr_test e_expr-30.1.5 { CAST(X'003100320033' AS INTEGER) } integer 123 001573 do_expr_test e_expr-30.1.6 { CAST(X'002D003600370038' AS INTEGER) } integer -678 001574 do_expr_test e_expr-30.1.7 { 001575 CAST(X'0031003000300030003000300030' AS INTEGER) 001576 } integer 1000000 001577 do_expr_test e_expr-30.1.8 { 001578 CAST(X'002D0031003100320035003800390039003900300036003800340032003600320034' AS INTEGER) 001579 } integer -1125899906842624 001580 } 001581 db close 001582 rename db2 db 001583 001584 # EVIDENCE-OF: R-47612-45842 When casting a TEXT value to INTEGER, the 001585 # longest possible prefix of the value that can be interpreted as an 001586 # integer number is extracted from the TEXT value and the remainder 001587 # ignored. 001588 # 001589 do_expr_test e_expr-30.2.1 { CAST('123abcd' AS INT) } integer 123 001590 do_expr_test e_expr-30.2.2 { CAST('14523abcd' AS INT) } integer 14523 001591 do_expr_test e_expr-30.2.3 { CAST('-2.12e-01ABC' AS INT) } integer -2 001592 do_expr_test e_expr-30.2.4 { CAST('1 2 3 4' AS INT) } integer 1 001593 001594 # EVIDENCE-OF: R-34400-33772 Any leading spaces in the TEXT value when 001595 # converting from TEXT to INTEGER are ignored. 001596 # 001597 do_expr_test e_expr-30.3.1 { CAST(' 123abcd' AS INT) } integer 123 001598 do_expr_test e_expr-30.3.2 { CAST(' 14523abcd' AS INT) } integer 14523 001599 do_expr_test e_expr-30.3.3 { CAST(' -2.12e-01ABC' AS INT) } integer -2 001600 do_expr_test e_expr-30.3.4 { CAST(' 1 2 3 4' AS INT) } integer 1 001601 001602 # EVIDENCE-OF: R-43164-44276 If there is no prefix that can be 001603 # interpreted as an integer number, the result of the conversion is 0. 001604 # 001605 do_expr_test e_expr-30.4.1 { CAST('' AS INTEGER) } integer 0 001606 do_expr_test e_expr-30.4.2 { CAST('not a number' AS INTEGER) } integer 0 001607 do_expr_test e_expr-30.4.3 { CAST('XXI' AS INTEGER) } integer 0 001608 001609 # EVIDENCE-OF: R-08980-53124 The CAST operator understands decimal 001610 # integers only — conversion of hexadecimal integers stops at 001611 # the "x" in the "0x" prefix of the hexadecimal integer string and thus 001612 # result of the CAST is always zero. 001613 do_expr_test e_expr-30.5.1 { CAST('0x1234' AS INTEGER) } integer 0 001614 do_expr_test e_expr-30.5.2 { CAST('0X1234' AS INTEGER) } integer 0 001615 001616 # EVIDENCE-OF: R-02752-50091 A cast of a REAL value into an INTEGER 001617 # results in the integer between the REAL value and zero that is closest 001618 # to the REAL value. 001619 # 001620 do_expr_test e_expr-31.1.1 { CAST(3.14159 AS INTEGER) } integer 3 001621 do_expr_test e_expr-31.1.2 { CAST(1.99999 AS INTEGER) } integer 1 001622 do_expr_test e_expr-31.1.3 { CAST(-1.99999 AS INTEGER) } integer -1 001623 do_expr_test e_expr-31.1.4 { CAST(-0.99999 AS INTEGER) } integer 0 001624 001625 # EVIDENCE-OF: R-51517-40824 If a REAL is greater than the greatest 001626 # possible signed integer (+9223372036854775807) then the result is the 001627 # greatest possible signed integer and if the REAL is less than the 001628 # least possible signed integer (-9223372036854775808) then the result 001629 # is the least possible signed integer. 001630 # 001631 do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer 9223372036854775807 001632 do_expr_test e_expr-31.2.2 { CAST(-2e+50 AS INT) } integer -9223372036854775808 001633 do_expr_test e_expr-31.2.3 { 001634 CAST(-9223372036854775809.0 AS INT) 001635 } integer -9223372036854775808 001636 do_expr_test e_expr-31.2.4 { 001637 CAST(9223372036854775809.0 AS INT) 001638 } integer 9223372036854775807 001639 001640 001641 # EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC 001642 # first does a forced conversion into REAL but then further converts the 001643 # result into INTEGER if and only if the conversion from REAL to INTEGER 001644 # is lossless and reversible. 001645 # 001646 do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45 001647 do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45 001648 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2 001649 do_expr_test e_expr-32.1.4 { CAST('11abc' AS NUMERIC) } integer 11 001650 do_expr_test e_expr-32.1.5 { CAST('11.1abc' AS NUMERIC) } real 11.1 001651 001652 # EVIDENCE-OF: R-30347-18702 Casting a REAL or INTEGER value to NUMERIC 001653 # is a no-op, even if a real value could be losslessly converted to an 001654 # integer. 001655 # 001656 do_expr_test e_expr-32.2.1 { CAST(13.0 AS NUMERIC) } real 13.0 001657 do_expr_test e_expr-32.2.2 { CAST(13.5 AS NUMERIC) } real 13.5 001658 001659 do_expr_test e_expr-32.2.3 { 001660 CAST(-9223372036854775808 AS NUMERIC) 001661 } integer -9223372036854775808 001662 do_expr_test e_expr-32.2.4 { 001663 CAST(9223372036854775807 AS NUMERIC) 001664 } integer 9223372036854775807 001665 001666 # EVIDENCE-OF: R-64550-29191 Note that the result from casting any 001667 # non-BLOB value into a BLOB and the result from casting any BLOB value 001668 # into a non-BLOB value may be different depending on whether the 001669 # database encoding is UTF-8, UTF-16be, or UTF-16le. 001670 # 001671 ifcapable {utf16} { 001672 sqlite3 db1 :memory: ; db1 eval { PRAGMA encoding = 'utf-8' } 001673 sqlite3 db2 :memory: ; db2 eval { PRAGMA encoding = 'utf-16le' } 001674 sqlite3 db3 :memory: ; db3 eval { PRAGMA encoding = 'utf-16be' } 001675 foreach {tn castexpr differs} { 001676 1 { CAST(123 AS BLOB) } 1 001677 2 { CAST('' AS BLOB) } 0 001678 3 { CAST('abcd' AS BLOB) } 1 001679 001680 4 { CAST(X'abcd' AS TEXT) } 1 001681 5 { CAST(X'' AS TEXT) } 0 001682 } { 001683 set r1 [db1 eval "SELECT typeof($castexpr), quote($castexpr)"] 001684 set r2 [db2 eval "SELECT typeof($castexpr), quote($castexpr)"] 001685 set r3 [db3 eval "SELECT typeof($castexpr), quote($castexpr)"] 001686 001687 if {$differs} { 001688 set res [expr {$r1!=$r2 && $r2!=$r3}] 001689 } else { 001690 set res [expr {$r1==$r2 && $r2==$r3}] 001691 } 001692 001693 do_test e_expr-33.1.$tn {set res} 1 001694 } 001695 db1 close 001696 db2 close 001697 db3 close 001698 } 001699 001700 #------------------------------------------------------------------------- 001701 # Test statements related to the EXISTS and NOT EXISTS operators. 001702 # 001703 catch { db close } 001704 forcedelete test.db 001705 sqlite3 db test.db 001706 001707 do_execsql_test e_expr-34.1 { 001708 CREATE TABLE t1(a, b); 001709 INSERT INTO t1 VALUES(1, 2); 001710 INSERT INTO t1 VALUES(NULL, 2); 001711 INSERT INTO t1 VALUES(1, NULL); 001712 INSERT INTO t1 VALUES(NULL, NULL); 001713 } {} 001714 001715 # EVIDENCE-OF: R-25588-27181 The EXISTS operator always evaluates to one 001716 # of the integer values 0 and 1. 001717 # 001718 # This statement is not tested by itself. Instead, all e_expr-34.* tests 001719 # following this point explicitly test that specific invocations of EXISTS 001720 # return either integer 0 or integer 1. 001721 # 001722 001723 # EVIDENCE-OF: R-58553-63740 If executing the SELECT statement specified 001724 # as the right-hand operand of the EXISTS operator would return one or 001725 # more rows, then the EXISTS operator evaluates to 1. 001726 # 001727 foreach {tn expr} { 001728 1 { EXISTS ( SELECT a FROM t1 ) } 001729 2 { EXISTS ( SELECT b FROM t1 ) } 001730 3 { EXISTS ( SELECT 24 ) } 001731 4 { EXISTS ( SELECT NULL ) } 001732 5 { EXISTS ( SELECT a FROM t1 WHERE a IS NULL ) } 001733 } { 001734 do_expr_test e_expr-34.2.$tn $expr integer 1 001735 } 001736 001737 # EVIDENCE-OF: R-19673-40972 If executing the SELECT would return no 001738 # rows at all, then the EXISTS operator evaluates to 0. 001739 # 001740 foreach {tn expr} { 001741 1 { EXISTS ( SELECT a FROM t1 WHERE 0) } 001742 2 { EXISTS ( SELECT b FROM t1 WHERE a = 5) } 001743 3 { EXISTS ( SELECT 24 WHERE 0) } 001744 4 { EXISTS ( SELECT NULL WHERE 1=2) } 001745 } { 001746 do_expr_test e_expr-34.3.$tn $expr integer 0 001747 } 001748 001749 # EVIDENCE-OF: R-35109-49139 The number of columns in each row returned 001750 # by the SELECT statement (if any) and the specific values returned have 001751 # no effect on the results of the EXISTS operator. 001752 # 001753 foreach {tn expr res} { 001754 1 { EXISTS ( SELECT * FROM t1 ) } 1 001755 2 { EXISTS ( SELECT *, *, * FROM t1 ) } 1 001756 3 { EXISTS ( SELECT 24, 25 ) } 1 001757 4 { EXISTS ( SELECT NULL, NULL, NULL ) } 1 001758 5 { EXISTS ( SELECT a,b,a||b FROM t1 WHERE a IS NULL ) } 1 001759 001760 6 { EXISTS ( SELECT a, a FROM t1 WHERE 0) } 0 001761 7 { EXISTS ( SELECT b, b, a FROM t1 WHERE a = 5) } 0 001762 8 { EXISTS ( SELECT 24, 46, 89 WHERE 0) } 0 001763 9 { EXISTS ( SELECT NULL, NULL WHERE 1=2) } 0 001764 } { 001765 do_expr_test e_expr-34.4.$tn $expr integer $res 001766 } 001767 001768 # EVIDENCE-OF: R-10645-12439 In particular, rows containing NULL values 001769 # are not handled any differently from rows without NULL values. 001770 # 001771 foreach {tn e1 e2} { 001772 1 { EXISTS (SELECT 'not null') } { EXISTS (SELECT NULL) } 001773 2 { EXISTS (SELECT NULL FROM t1) } { EXISTS (SELECT 'bread' FROM t1) } 001774 } { 001775 set res [db one "SELECT $e1"] 001776 do_expr_test e_expr-34.5.${tn}a $e1 integer $res 001777 do_expr_test e_expr-34.5.${tn}b $e2 integer $res 001778 } 001779 001780 #------------------------------------------------------------------------- 001781 # Test statements related to scalar sub-queries. 001782 # 001783 001784 catch { db close } 001785 forcedelete test.db 001786 sqlite3 db test.db 001787 do_test e_expr-35.0 { 001788 execsql { 001789 CREATE TABLE t2(a, b); 001790 INSERT INTO t2 VALUES('one', 'two'); 001791 INSERT INTO t2 VALUES('three', NULL); 001792 INSERT INTO t2 VALUES(4, 5.0); 001793 } 001794 } {} 001795 001796 # EVIDENCE-OF: R-43573-23448 A SELECT statement enclosed in parentheses 001797 # is a subquery. 001798 # 001799 # EVIDENCE-OF: R-56294-03966 All types of SELECT statement, including 001800 # aggregate and compound SELECT queries (queries with keywords like 001801 # UNION or EXCEPT) are allowed as scalar subqueries. 001802 # 001803 do_expr_test e_expr-35.1.1 { (SELECT 35) } integer 35 001804 do_expr_test e_expr-35.1.2 { (SELECT NULL) } null {} 001805 001806 do_expr_test e_expr-35.1.3 { (SELECT count(*) FROM t2) } integer 3 001807 do_expr_test e_expr-35.1.4 { (SELECT 4 FROM t2) } integer 4 001808 001809 do_expr_test e_expr-35.1.5 { 001810 (SELECT b FROM t2 UNION SELECT a+1 FROM t2) 001811 } null {} 001812 do_expr_test e_expr-35.1.6 { 001813 (SELECT a FROM t2 UNION SELECT COALESCE(b, 55) FROM t2 ORDER BY 1) 001814 } integer 4 001815 001816 # EVIDENCE-OF: R-22239-33740 A subquery that returns two or more columns 001817 # is a row value subquery and can only be used as the operand of a 001818 # comparison operator. 001819 # 001820 # The following block tests that errors are returned in a bunch of cases 001821 # where a subquery returns more than one column. 001822 # 001823 set M {/1 {sub-select returns [23] columns - expected 1}/} 001824 foreach {tn sql} { 001825 1 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2) } 001826 2 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2 ORDER BY 1) } 001827 3 { SELECT (SELECT 1, 2) } 001828 4 { SELECT (SELECT NULL, NULL, NULL) } 001829 5 { SELECT (SELECT * FROM t2) } 001830 6 { SELECT (SELECT * FROM (SELECT 1, 2, 3)) } 001831 } { 001832 do_catchsql_test e_expr-35.2.$tn $sql $M 001833 } 001834 001835 # EVIDENCE-OF: R-18318-14995 The value of a subquery expression is the 001836 # first row of the result from the enclosed SELECT statement. 001837 # 001838 # EVIDENCE-OF: R-15900-52156 In other words, an implied "LIMIT 1" is 001839 # added to the subquery, overriding an explicitly coded LIMIT. 001840 # 001841 do_execsql_test e_expr-36.3.1 { 001842 CREATE TABLE t4(x, y); 001843 INSERT INTO t4 VALUES(1, 'one'); 001844 INSERT INTO t4 VALUES(2, 'two'); 001845 INSERT INTO t4 VALUES(3, 'three'); 001846 } {} 001847 001848 foreach {tn expr restype resval} { 001849 2 { ( SELECT x FROM t4 ORDER BY x ) } integer 1 001850 3 { ( SELECT x FROM t4 ORDER BY y ) } integer 1 001851 4 { ( SELECT x FROM t4 ORDER BY x DESC ) } integer 3 001852 5 { ( SELECT x FROM t4 ORDER BY y DESC ) } integer 2 001853 6 { ( SELECT y FROM t4 ORDER BY y DESC ) } text two 001854 001855 7 { ( SELECT sum(x) FROM t4 ) } integer 6 001856 8 { ( SELECT group_concat(y,'') FROM t4 ) } text onetwothree 001857 9 { ( SELECT max(x) FROM t4 WHERE y LIKE '___') } integer 2 001858 001859 } { 001860 do_expr_test e_expr-36.3.$tn $expr $restype $resval 001861 } 001862 001863 # EVIDENCE-OF: R-52325-25449 The value of a subquery expression is NULL 001864 # if the enclosed SELECT statement returns no rows. 001865 # 001866 foreach {tn expr} { 001867 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) } 001868 2 { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y ) } 001869 } { 001870 do_expr_test e_expr-36.4.$tn $expr null {} 001871 } 001872 001873 # EVIDENCE-OF: R-62477-06476 For example, the values NULL, 0.0, 0, 001874 # 'english' and '0' are all considered to be false. 001875 # 001876 do_execsql_test e_expr-37.1 { 001877 SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END; 001878 } {false} 001879 do_execsql_test e_expr-37.2 { 001880 SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END; 001881 } {false} 001882 do_execsql_test e_expr-37.3 { 001883 SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END; 001884 } {false} 001885 do_execsql_test e_expr-37.4 { 001886 SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END; 001887 } {false} 001888 do_execsql_test e_expr-37.5 { 001889 SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END; 001890 } {false} 001891 001892 # EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are 001893 # considered to be true. 001894 # 001895 do_execsql_test e_expr-37.6 { 001896 SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END; 001897 } {true} 001898 do_execsql_test e_expr-37.7 { 001899 SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END; 001900 } {true} 001901 do_execsql_test e_expr-37.8 { 001902 SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END; 001903 } {true} 001904 do_execsql_test e_expr-37.9 { 001905 SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END; 001906 } {true} 001907 do_execsql_test e_expr-37.10 { 001908 SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END; 001909 } {true} 001910 001911 001912 finish_test