Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: third_party/sqlite/src/test/e_expr.test

Issue 5626002: Update sqlite to 3.7.3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/third_party/sqlite/src
Patch Set: Remove misc change. Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/sqlite/src/test/e_delete.test ('k') | third_party/sqlite/src/test/e_fkey.test » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # 2010 July 16
2 #
3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
5 #
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
9 #
10 #***********************************************************************
11 #
12 # This file implements tests to verify that the "testable statements" in
13 # the lang_expr.html document are correct.
14 #
15
16 set testdir [file dirname $argv0]
17 source $testdir/tester.tcl
18 source $testdir/malloc_common.tcl
19
20
21 proc do_expr_test {tn expr type value} {
22 uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [
23 list [list $type $value]
24 ]
25 }
26
27 proc do_qexpr_test {tn expr value} {
28 uplevel do_execsql_test $tn [list "SELECT quote($expr)"] [list $value]
29 }
30
31 # Set up three global variables:
32 #
33 # ::opname An array mapping from SQL operator to an easy to parse
34 # name. The names are used as part of test case names.
35 #
36 # ::opprec An array mapping from SQL operator to a numeric
37 # precedence value. Operators that group more tightly
38 # have lower numeric precedences.
39 #
40 # ::oplist A list of all SQL operators supported by SQLite.
41 #
42 foreach {op opn} {
43 || cat * mul / div % mod + add
44 - sub << lshift >> rshift & bitand | bitor
45 < less <= lesseq > more >= moreeq = eq1
46 == eq2 <> ne1 != ne2 IS is LIKE like
47 GLOB glob AND and OR or MATCH match REGEXP regexp
48 {IS NOT} isnt
49 } {
50 set ::opname($op) $opn
51 }
52 set oplist [list]
53 foreach {prec opl} {
54 1 ||
55 2 {* / %}
56 3 {+ -}
57 4 {<< >> & |}
58 5 {< <= > >=}
59 6 {= == != <> IS {IS NOT} LIKE GLOB MATCH REGEXP}
60 7 AND
61 8 OR
62 } {
63 foreach op $opl {
64 set ::opprec($op) $prec
65 lappend oplist $op
66 }
67 }
68
69
70 # Hook in definitions of MATCH and REGEX. The following implementations
71 # cause MATCH and REGEX to behave similarly to the == operator.
72 #
73 proc matchfunc {a b} { return [expr {$a==$b}] }
74 proc regexfunc {a b} { return [expr {$a==$b}] }
75 db func match -argcount 2 matchfunc
76 db func regexp -argcount 2 regexfunc
77
78 #-------------------------------------------------------------------------
79 # Test cases e_expr-1.* attempt to verify that all binary operators listed
80 # in the documentation exist and that the relative precedences of the
81 # operators are also as the documentation suggests.
82 #
83 # EVIDENCE-OF: R-15514-65163 SQLite understands the following binary
84 # operators, in order from highest to lowest precedence: || * / % + -
85 # << >> & | < <= > >= = == != <> IS IS
86 # NOT IN LIKE GLOB MATCH REGEXP AND OR
87 #
88 # EVIDENCE-OF: R-38759-38789 Operators IS and IS NOT have the same
89 # precedence as =.
90 #
91
92 unset -nocomplain untested
93 foreach op1 $oplist {
94 foreach op2 $oplist {
95 set untested($op1,$op2) 1
96 foreach {tn A B C} {
97 1 22 45 66
98 2 0 0 0
99 3 0 0 1
100 4 0 1 0
101 5 0 1 1
102 6 1 0 0
103 7 1 0 1
104 8 1 1 0
105 9 1 1 1
106 10 5 6 1
107 11 1 5 6
108 12 1 5 5
109 13 5 5 1
110
111 14 5 2 1
112 15 1 4 1
113 16 -1 0 1
114 17 0 1 -1
115
116 } {
117 set testname "e_expr-1.$opname($op1).$opname($op2).$tn"
118
119 # If $op2 groups more tightly than $op1, then the result
120 # of executing $sql1 whould be the same as executing $sql3.
121 # If $op1 groups more tightly, or if $op1 and $op2 have
122 # the same precedence, then executing $sql1 should return
123 # the same value as $sql2.
124 #
125 set sql1 "SELECT $A $op1 $B $op2 $C"
126 set sql2 "SELECT ($A $op1 $B) $op2 $C"
127 set sql3 "SELECT $A $op1 ($B $op2 $C)"
128
129 set a2 [db one $sql2]
130 set a3 [db one $sql3]
131
132 do_execsql_test $testname $sql1 [list [
133 if {$opprec($op2) < $opprec($op1)} {set a3} {set a2}
134 ]]
135 if {$a2 != $a3} { unset -nocomplain untested($op1,$op2) }
136 }
137 }
138 }
139
140 foreach op {* AND OR + || & |} { unset untested($op,$op) }
141 unset untested(+,-) ;# Since (a+b)-c == a+(b-c)
142 unset untested(*,<<) ;# Since (a*b)<<c == a*(b<<c)
143
144 do_test e_expr-1.1 { array names untested } {}
145
146 # At one point, test 1.2.2 was failing. Instead of the correct result, it
147 # was returning {1 1 0}. This would seem to indicate that LIKE has the
148 # same precedence as '<'. Which is incorrect. It has lower precedence.
149 #
150 do_execsql_test e_expr-1.2.1 {
151 SELECT 0 < 2 LIKE 1, (0 < 2) LIKE 1, 0 < (2 LIKE 1)
152 } {1 1 0}
153 do_execsql_test e_expr-1.2.2 {
154 SELECT 0 LIKE 0 < 2, (0 LIKE 0) < 2, 0 LIKE (0 < 2)
155 } {0 1 0}
156
157 # Showing that LIKE and == have the same precedence
158 #
159 do_execsql_test e_expr-1.2.3 {
160 SELECT 2 LIKE 2 == 1, (2 LIKE 2) == 1, 2 LIKE (2 == 1)
161 } {1 1 0}
162 do_execsql_test e_expr-1.2.4 {
163 SELECT 2 == 2 LIKE 1, (2 == 2) LIKE 1, 2 == (2 LIKE 1)
164 } {1 1 0}
165
166 # Showing that < groups more tightly than == (< has higher precedence).
167 #
168 do_execsql_test e_expr-1.2.5 {
169 SELECT 0 < 2 == 1, (0 < 2) == 1, 0 < (2 == 1)
170 } {1 1 0}
171 do_execsql_test e_expr-1.6 {
172 SELECT 0 == 0 < 2, (0 == 0) < 2, 0 == (0 < 2)
173 } {0 1 0}
174
175 #-------------------------------------------------------------------------
176 # Check that the four unary prefix operators mentioned in the
177 # documentation exist.
178 #
179 # EVIDENCE-OF: R-13958-53419 Supported unary prefix operators are these:
180 # - + ~ NOT
181 #
182 do_execsql_test e_expr-2.1 { SELECT - 10 } {-10}
183 do_execsql_test e_expr-2.2 { SELECT + 10 } {10}
184 do_execsql_test e_expr-2.3 { SELECT ~ 10 } {-11}
185 do_execsql_test e_expr-2.4 { SELECT NOT 10 } {0}
186
187 #-------------------------------------------------------------------------
188 # Tests for the two statements made regarding the unary + operator.
189 #
190 # EVIDENCE-OF: R-53670-03373 The unary operator + is a no-op.
191 #
192 # EVIDENCE-OF: R-19480-30968 It can be applied to strings, numbers,
193 # blobs or NULL and it always returns a result with the same value as
194 # the operand.
195 #
196 foreach {tn literal type} {
197 1 'helloworld' text
198 2 45 integer
199 3 45.2 real
200 4 45.0 real
201 5 X'ABCDEF' blob
202 6 NULL null
203 } {
204 set sql " SELECT quote( + $literal ), typeof( + $literal) "
205 do_execsql_test e_expr-3.$tn $sql [list $literal $type]
206 }
207
208 #-------------------------------------------------------------------------
209 # Check that both = and == are both acceptable as the "equals" operator.
210 # Similarly, either != or <> work as the not-equals operator.
211 #
212 # EVIDENCE-OF: R-03679-60639 Equals can be either = or ==.
213 #
214 # EVIDENCE-OF: R-30082-38996 The non-equals operator can be either != or
215 # <>.
216 #
217 foreach {tn literal different} {
218 1 'helloworld' '12345'
219 2 22 23
220 3 'xyz' X'78797A'
221 4 X'78797A00' 'xyz'
222 } {
223 do_execsql_test e_expr-4.$tn "
224 SELECT $literal = $literal, $literal == $literal,
225 $literal = $different, $literal == $different,
226 $literal = NULL, $literal == NULL,
227 $literal != $literal, $literal <> $literal,
228 $literal != $different, $literal <> $different,
229 $literal != NULL, $literal != NULL
230
231 " {1 1 0 0 {} {} 0 0 1 1 {} {}}
232 }
233
234 #-------------------------------------------------------------------------
235 # Test the || operator.
236 #
237 # EVIDENCE-OF: R-44409-62641 The || operator is "concatenate" - it joins
238 # together the two strings of its operands.
239 #
240 foreach {tn a b} {
241 1 'helloworld' '12345'
242 2 22 23
243 } {
244 set as [db one "SELECT $a"]
245 set bs [db one "SELECT $b"]
246
247 do_execsql_test e_expr-5.$tn "SELECT $a || $b" [list "${as}${bs}"]
248 }
249
250 #-------------------------------------------------------------------------
251 # Test the % operator.
252 #
253 # EVIDENCE-OF: R-08914-63790 The operator % outputs the value of its
254 # left operand modulo its right operand.
255 #
256 do_execsql_test e_expr-6.1 {SELECT 72%5} {2}
257 do_execsql_test e_expr-6.2 {SELECT 72%-5} {2}
258 do_execsql_test e_expr-6.3 {SELECT -72%-5} {-2}
259 do_execsql_test e_expr-6.4 {SELECT -72%5} {-2}
260
261 #-------------------------------------------------------------------------
262 # Test that the results of all binary operators are either numeric or
263 # NULL, except for the || operator, which may evaluate to either a text
264 # value or NULL.
265 #
266 # EVIDENCE-OF: R-20665-17792 The result of any binary operator is either
267 # a numeric value or NULL, except for the || concatenation operator
268 # which always evaluates to either NULL or a text value.
269 #
270 set literals {
271 1 'abc' 2 'hexadecimal' 3 ''
272 4 123 5 -123 6 0
273 7 123.4 8 0.0 9 -123.4
274 10 X'ABCDEF' 11 X'' 12 X'0000'
275 13 NULL
276 }
277 foreach op $oplist {
278 foreach {n1 rhs} $literals {
279 foreach {n2 lhs} $literals {
280
281 set t [db one " SELECT typeof($lhs $op $rhs) "]
282 do_test e_expr-7.$opname($op).$n1.$n2 {
283 expr {
284 ($op=="||" && ($t == "text" || $t == "null"))
285 || ($op!="||" && ($t == "integer" || $t == "real" || $t == "null"))
286 }
287 } 1
288
289 }}
290 }
291
292 #-------------------------------------------------------------------------
293 # Test the IS and IS NOT operators.
294 #
295 # EVIDENCE-OF: R-24731-45773 The IS and IS NOT operators work like = and
296 # != except when one or both of the operands are NULL.
297 #
298 # EVIDENCE-OF: R-06325-15315 In this case, if both operands are NULL,
299 # then the IS operator evaluates to 1 (true) and the IS NOT operator
300 # evaluates to 0 (false).
301 #
302 # EVIDENCE-OF: R-19812-36779 If one operand is NULL and the other is
303 # not, then the IS operator evaluates to 0 (false) and the IS NOT
304 # operator is 1 (true).
305 #
306 # EVIDENCE-OF: R-61975-13410 It is not possible for an IS or IS NOT
307 # expression to evaluate to NULL.
308 #
309 do_execsql_test e_expr-8.1.1 { SELECT NULL IS NULL } {1}
310 do_execsql_test e_expr-8.1.2 { SELECT 'ab' IS NULL } {0}
311 do_execsql_test e_expr-8.1.3 { SELECT NULL IS 'ab' } {0}
312 do_execsql_test e_expr-8.1.4 { SELECT 'ab' IS 'ab' } {1}
313 do_execsql_test e_expr-8.1.5 { SELECT NULL == NULL } {{}}
314 do_execsql_test e_expr-8.1.6 { SELECT 'ab' == NULL } {{}}
315 do_execsql_test e_expr-8.1.7 { SELECT NULL == 'ab' } {{}}
316 do_execsql_test e_expr-8.1.8 { SELECT 'ab' == 'ab' } {1}
317 do_execsql_test e_expr-8.1.9 { SELECT NULL IS NOT NULL } {0}
318 do_execsql_test e_expr-8.1.10 { SELECT 'ab' IS NOT NULL } {1}
319 do_execsql_test e_expr-8.1.11 { SELECT NULL IS NOT 'ab' } {1}
320 do_execsql_test e_expr-8.1.12 { SELECT 'ab' IS NOT 'ab' } {0}
321 do_execsql_test e_expr-8.1.13 { SELECT NULL != NULL } {{}}
322 do_execsql_test e_expr-8.1.14 { SELECT 'ab' != NULL } {{}}
323 do_execsql_test e_expr-8.1.15 { SELECT NULL != 'ab' } {{}}
324 do_execsql_test e_expr-8.1.16 { SELECT 'ab' != 'ab' } {0}
325
326 foreach {n1 rhs} $literals {
327 foreach {n2 lhs} $literals {
328 if {$rhs!="NULL" && $lhs!="NULL"} {
329 set eq [execsql "SELECT $lhs = $rhs, $lhs != $rhs"]
330 } else {
331 set eq [list [expr {$lhs=="NULL" && $rhs=="NULL"}] \
332 [expr {$lhs!="NULL" || $rhs!="NULL"}]
333 ]
334 }
335 set test e_expr-8.2.$n1.$n2
336 do_execsql_test $test.1 "SELECT $lhs IS $rhs, $lhs IS NOT $rhs" $eq
337 do_execsql_test $test.2 "
338 SELECT ($lhs IS $rhs) IS NULL, ($lhs IS NOT $rhs) IS NULL
339 " {0 0}
340 }
341 }
342
343 #-------------------------------------------------------------------------
344 # Run some tests on the COLLATE "unary postfix operator".
345 #
346 # This collation sequence reverses both arguments before using
347 # [string compare] to compare them. For example, when comparing the
348 # strings 'one' and 'four', return the result of:
349 #
350 # string compare eno ruof
351 #
352 proc reverse_str {zStr} {
353 set out ""
354 foreach c [split $zStr {}] { set out "${c}${out}" }
355 set out
356 }
357 proc reverse_collate {zLeft zRight} {
358 string compare [reverse_str $zLeft] [reverse_str $zRight]
359 }
360 db collate reverse reverse_collate
361
362 # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix
363 # operator that assigns a collating sequence to an expression.
364 #
365 # EVIDENCE-OF: R-23441-22541 The COLLATE operator has a higher
366 # precedence (binds more tightly) than any prefix unary operator or any
367 # binary operator.
368 #
369 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
371 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
373
374 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
376 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
378
379 do_execsql_test e_expr-9.10 { SELECT 'abcd' = 'ABCD' COLLATE nocase } 1
380 do_execsql_test e_expr-9.11 { SELECT ('abcd' = 'ABCD') COLLATE nocase } 0
381 do_execsql_test e_expr-9.12 { SELECT 'abcd' == 'ABCD' COLLATE nocase } 1
382 do_execsql_test e_expr-9.13 { SELECT ('abcd' == 'ABCD') COLLATE nocase } 0
383 do_execsql_test e_expr-9.14 { SELECT 'abcd' IS 'ABCD' COLLATE nocase } 1
384 do_execsql_test e_expr-9.15 { SELECT ('abcd' IS 'ABCD') COLLATE nocase } 0
385
386 do_execsql_test e_expr-9.16 { SELECT 'abcd' != 'ABCD' COLLATE nocase } 0
387 do_execsql_test e_expr-9.17 { SELECT ('abcd' != 'ABCD') COLLATE nocase } 1
388 do_execsql_test e_expr-9.18 { SELECT 'abcd' <> 'ABCD' COLLATE nocase } 0
389 do_execsql_test e_expr-9.19 { SELECT ('abcd' <> 'ABCD') COLLATE nocase } 1
390 do_execsql_test e_expr-9.20 { SELECT 'abcd' IS NOT 'ABCD' COLLATE nocase } 0
391 do_execsql_test e_expr-9.21 { SELECT ('abcd' IS NOT 'ABCD') COLLATE nocase } 1
392
393 do_execsql_test e_expr-9.22 {
394 SELECT 'bbb' BETWEEN 'AAA' AND 'CCC' COLLATE nocase
395 } 1
396 do_execsql_test e_expr-9.23 {
397 SELECT ('bbb' BETWEEN 'AAA' AND 'CCC') COLLATE nocase
398 } 0
399
400 # EVIDENCE-OF: R-58731-25439 The collating sequence set by the COLLATE
401 # operator overrides the collating sequence determined by the COLLATE
402 # clause in a table column definition.
403 #
404 do_execsql_test e_expr-9.24 {
405 CREATE TABLE t24(a COLLATE NOCASE, b);
406 INSERT INTO t24 VALUES('aaa', 1);
407 INSERT INTO t24 VALUES('bbb', 2);
408 INSERT INTO t24 VALUES('ccc', 3);
409 } {}
410 do_execsql_test e_expr-9.25 { SELECT 'BBB' = a FROM t24 } {0 1 0}
411 do_execsql_test e_expr-9.25 { SELECT a = 'BBB' FROM t24 } {0 1 0}
412 do_execsql_test e_expr-9.25 { SELECT 'BBB' = a COLLATE binary FROM t24 } {0 0 0}
413 do_execsql_test e_expr-9.25 { SELECT a COLLATE binary = 'BBB' FROM t24 } {0 0 0}
414
415 #-------------------------------------------------------------------------
416 # Test statements related to literal values.
417 #
418 # EVIDENCE-OF: R-31536-32008 Literal values may be integers, floating
419 # point numbers, strings, BLOBs, or NULLs.
420 #
421 do_execsql_test e_expr-10.1.1 { SELECT typeof(5) } {integer}
422 do_execsql_test e_expr-10.1.2 { SELECT typeof(5.1) } {real}
423 do_execsql_test e_expr-10.1.3 { SELECT typeof('5.1') } {text}
424 do_execsql_test e_expr-10.1.4 { SELECT typeof(X'ABCD') } {blob}
425 do_execsql_test e_expr-10.1.5 { SELECT typeof(NULL) } {null}
426
427 # "Scientific notation is supported for point literal values."
428 #
429 do_execsql_test e_expr-10.2.1 { SELECT typeof(3.4e-02) } {real}
430 do_execsql_test e_expr-10.2.2 { SELECT typeof(3e+5) } {real}
431 do_execsql_test e_expr-10.2.3 { SELECT 3.4e-02 } {0.034}
432 do_execsql_test e_expr-10.2.4 { SELECT 3e+4 } {30000.0}
433
434 # EVIDENCE-OF: R-35229-17830 A string constant is formed by enclosing
435 # the string in single quotes (').
436 #
437 # EVIDENCE-OF: R-07100-06606 A single quote within the string can be
438 # encoded by putting two single quotes in a row - as in Pascal.
439 #
440 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}
442 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}
444
445 # EVIDENCE-OF: R-09593-03321 BLOB literals are string literals
446 # containing hexadecimal data and preceded by a single "x" or "X"
447 # character.
448 #
449 # EVIDENCE-OF: R-39344-59787 For example: X'53514C697465'
450 #
451 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
453 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
455 do_execsql_test e_expr-10.4.5 { SELECT typeof(X'53514C697465') } blob
456
457 # EVIDENCE-OF: R-23914-51476 A literal value can also be the token
458 # "NULL".
459 #
460 do_execsql_test e_expr-10.5.1 { SELECT NULL } {{}}
461 do_execsql_test e_expr-10.5.2 { SELECT typeof(NULL) } {null}
462
463 #-------------------------------------------------------------------------
464 # Test statements related to bound parameters
465 #
466
467 proc parameter_test {tn sql params result} {
468 set stmt [sqlite3_prepare_v2 db $sql -1]
469
470 foreach {number name} $params {
471 set nm [sqlite3_bind_parameter_name $stmt $number]
472 do_test $tn.name.$number [list set {} $nm] $name
473 sqlite3_bind_int $stmt $number [expr -1 * $number]
474 }
475
476 sqlite3_step $stmt
477
478 set res [list]
479 for {set i 0} {$i < [sqlite3_column_count $stmt]} {incr i} {
480 lappend res [sqlite3_column_text $stmt $i]
481 }
482
483 set rc [sqlite3_finalize $stmt]
484 do_test $tn.rc [list set {} $rc] SQLITE_OK
485 do_test $tn.res [list set {} $res] $result
486 }
487
488 # EVIDENCE-OF: R-33509-39458 A question mark followed by a number NNN
489 # holds a spot for the NNN-th parameter. NNN must be between 1 and
490 # SQLITE_MAX_VARIABLE_NUMBER.
491 #
492 set mvn $SQLITE_MAX_VARIABLE_NUMBER
493 parameter_test e_expr-11.1 "
494 SELECT ?1, ?123, ?$SQLITE_MAX_VARIABLE_NUMBER, ?123, ?4
495 " "1 ?1 123 ?123 $mvn ?$mvn 4 ?4" "-1 -123 -$mvn -123 -4"
496
497 set errmsg "variable number must be between ?1 and ?$SQLITE_MAX_VARIABLE_NUMBER"
498 foreach {tn param_number} [list \
499 2 0 \
500 3 [expr $SQLITE_MAX_VARIABLE_NUMBER+1] \
501 4 [expr $SQLITE_MAX_VARIABLE_NUMBER+2] \
502 5 12345678903456789034567890234567890 \
503 6 2147483648 \
504 7 2147483649 \
505 8 4294967296 \
506 9 4294967297 \
507 10 9223372036854775808 \
508 11 9223372036854775809 \
509 12 18446744073709551616 \
510 13 18446744073709551617 \
511 ] {
512 do_catchsql_test e_expr-11.1.$tn "SELECT ?$param_number" [list 1 $errmsg]
513 }
514
515 # EVIDENCE-OF: R-33670-36097 A question mark that is not followed by a
516 # number creates a parameter with a number one greater than the largest
517 # parameter number already assigned.
518 #
519 # EVIDENCE-OF: R-42938-07030 If this means the parameter number is
520 # greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error.
521 #
522 parameter_test e_expr-11.2.1 "SELECT ?" {1 {}} -1
523 parameter_test e_expr-11.2.2 "SELECT ?, ?" {1 {} 2 {}} {-1 -2}
524 parameter_test e_expr-11.2.3 "SELECT ?5, ?" {5 ?5 6 {}} {-5 -6}
525 parameter_test e_expr-11.2.4 "SELECT ?, ?5" {1 {} 5 ?5} {-1 -5}
526 parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?" {
527 1 {} 456 ?456 457 {}
528 } {-1 -456 -457}
529 parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?4, ?" {
530 1 {} 456 ?456 4 ?4 457 {}
531 } {-1 -456 -4 -457}
532 foreach {tn sql} [list \
533 1 "SELECT ?$mvn, ?" \
534 2 "SELECT ?[expr $mvn-5], ?, ?, ?, ?, ?, ?" \
535 3 "SELECT ?[expr $mvn], ?5, ?6, ?" \
536 ] {
537 do_catchsql_test e_expr-11.3.$tn $sql [list 1 {too many SQL variables}]
538 }
539
540 # EVIDENCE-OF: R-11620-22743 A colon followed by an identifier name
541 # holds a spot for a named parameter with the name :AAAA.
542 #
543 # Identifiers in SQLite consist of alphanumeric, '_' and '$' characters,
544 # and any UTF characters with codepoints larger than 127 (non-ASCII
545 # characters).
546 #
547 parameter_test e_expr-11.2.1 {SELECT :AAAA} {1 :AAAA} -1
548 parameter_test e_expr-11.2.2 {SELECT :123} {1 :123} -1
549 parameter_test e_expr-11.2.3 {SELECT :__} {1 :__} -1
550 parameter_test e_expr-11.2.4 {SELECT :_$_} {1 :_$_} -1
551 parameter_test e_expr-11.2.5 "
552 SELECT :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
553 " "1 :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
554 parameter_test e_expr-11.2.6 "SELECT :\u0080" "1 :\u0080" -1
555
556 # EVIDENCE-OF: R-49783-61279 An "at" sign works exactly like a colon,
557 # except that the name of the parameter created is @AAAA.
558 #
559 parameter_test e_expr-11.3.1 {SELECT @AAAA} {1 @AAAA} -1
560 parameter_test e_expr-11.3.2 {SELECT @123} {1 @123} -1
561 parameter_test e_expr-11.3.3 {SELECT @__} {1 @__} -1
562 parameter_test e_expr-11.3.4 {SELECT @_$_} {1 @_$_} -1
563 parameter_test e_expr-11.3.5 "
564 SELECT @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
565 " "1 @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
566 parameter_test e_expr-11.3.6 "SELECT @\u0080" "1 @\u0080" -1
567
568 # EVIDENCE-OF: R-62610-51329 A dollar-sign followed by an identifier
569 # name also holds a spot for a named parameter with the name $AAAA.
570 #
571 # EVIDENCE-OF: R-55025-21042 The identifier name in this case can
572 # include one or more occurrences of "::" and a suffix enclosed in
573 # "(...)" containing any text at all.
574 #
575 # Note: Looks like an identifier cannot consist entirely of "::"
576 # characters or just a suffix. Also, the other named variable characters
577 # (: and @) work the same way internally. Why not just document it that way?
578 #
579 parameter_test e_expr-11.4.1 {SELECT $AAAA} {1 $AAAA} -1
580 parameter_test e_expr-11.4.2 {SELECT $123} {1 $123} -1
581 parameter_test e_expr-11.4.3 {SELECT $__} {1 $__} -1
582 parameter_test e_expr-11.4.4 {SELECT $_$_} {1 $_$_} -1
583 parameter_test e_expr-11.4.5 "
584 SELECT \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
585 " "1 \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
586 parameter_test e_expr-11.4.6 "SELECT \$\u0080" "1 \$\u0080" -1
587
588 parameter_test e_expr-11.5.1 {SELECT $::::a(++--++)} {1 $::::a(++--++)} -1
589 parameter_test e_expr-11.5.2 {SELECT $::a()} {1 $::a()} -1
590 parameter_test e_expr-11.5.3 {SELECT $::1(::#$)} {1 $::1(::#$)} -1
591
592 # EVIDENCE-OF: R-11370-04520 Named parameters are also numbered. The
593 # number assigned is one greater than the largest parameter number
594 # already assigned.
595 #
596 # EVIDENCE-OF: R-42620-22184 If this means the parameter would be
597 # assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is an
598 # error.
599 #
600 parameter_test e_expr-11.6.1 "SELECT ?, @abc" {1 {} 2 @abc} {-1 -2}
601 parameter_test e_expr-11.6.2 "SELECT ?123, :a1" {123 ?123 124 :a1} {-123 -124}
602 parameter_test e_expr-11.6.3 {SELECT $a, ?8, ?, $b, ?2, $c} {
603 1 $a 8 ?8 9 {} 10 $b 2 ?2 11 $c
604 } {-1 -8 -9 -10 -2 -11}
605 foreach {tn sql} [list \
606 1 "SELECT ?$mvn, \$::a" \
607 2 "SELECT ?$mvn, ?4, @a1" \
608 3 "SELECT ?[expr $mvn-2], :bag, @123, \$x" \
609 ] {
610 do_catchsql_test e_expr-11.7.$tn $sql [list 1 {too many SQL variables}]
611 }
612
613 # EVIDENCE-OF: R-14068-49671 Parameters that are not assigned values
614 # using sqlite3_bind() are treated as NULL.
615 #
616 do_test e_expr-11.7.1 {
617 set stmt [sqlite3_prepare_v2 db { SELECT ?, :a, @b, $d } -1]
618 sqlite3_step $stmt
619
620 list [sqlite3_column_type $stmt 0] \
621 [sqlite3_column_type $stmt 1] \
622 [sqlite3_column_type $stmt 2] \
623 [sqlite3_column_type $stmt 3]
624 } {NULL NULL NULL NULL}
625 do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK
626
627 #-------------------------------------------------------------------------
628 # "Test" the syntax diagrams in lang_expr.html.
629 #
630 # EVIDENCE-OF: R-62067-43884 -- syntax diagram signed-number
631 #
632 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}
634 do_execsql_test e_expr-12.1.3 { SELECT 2, +2, -2 } {2 2 -2}
635 do_execsql_test e_expr-12.1.4 {
636 SELECT 1.4, +1.4, -1.4
637 } {1.4 1.4 -1.4}
638 do_execsql_test e_expr-12.1.5 {
639 SELECT 1.5e+5, +1.5e+5, -1.5e+5
640 } {150000.0 150000.0 -150000.0}
641 do_execsql_test e_expr-12.1.6 {
642 SELECT 0.0001, +0.0001, -0.0001
643 } {0.0001 0.0001 -0.0001}
644
645 # EVIDENCE-OF: R-21258-25489 -- syntax diagram literal-value
646 #
647 set sqlite_current_time 1
648 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}
650 do_execsql_test e_expr-12.2.3 {SELECT 'abcde'} {abcde}
651 do_execsql_test e_expr-12.2.4 {SELECT X'414243'} {ABC}
652 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}
654 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}}
656 set sqlite_current_time 0
657
658 # EVIDENCE-OF: R-57598-59332 -- syntax diagram expr
659 #
660 file delete -force test.db2
661 execsql {
662 ATTACH 'test.db2' AS dbname;
663 CREATE TABLE dbname.tblname(cname);
664 }
665
666 proc glob {args} {return 1}
667 db function glob glob
668 db function match glob
669 db function regexp glob
670
671 foreach {tn expr} {
672 1 123
673 2 123.4e05
674 3 'abcde'
675 4 X'414243'
676 5 NULL
677 6 CURRENT_TIME
678 7 CURRENT_DATE
679 8 CURRENT_TIMESTAMP
680
681 9 ?
682 10 ?123
683 11 @hello
684 12 :world
685 13 $tcl
686 14 $tcl(array)
687
688 15 cname
689 16 tblname.cname
690 17 dbname.tblname.cname
691
692 18 "+ EXPR"
693 19 "- EXPR"
694 20 "NOT EXPR"
695 21 "~ EXPR"
696
697 22 "EXPR1 || EXPR2"
698 23 "EXPR1 * EXPR2"
699 24 "EXPR1 / EXPR2"
700 25 "EXPR1 % EXPR2"
701 26 "EXPR1 + EXPR2"
702 27 "EXPR1 - EXPR2"
703 28 "EXPR1 << EXPR2"
704 29 "EXPR1 >> EXPR2"
705 30 "EXPR1 & EXPR2"
706 31 "EXPR1 | EXPR2"
707 32 "EXPR1 < EXPR2"
708 33 "EXPR1 <= EXPR2"
709 34 "EXPR1 > EXPR2"
710 35 "EXPR1 >= EXPR2"
711 36 "EXPR1 = EXPR2"
712 37 "EXPR1 == EXPR2"
713 38 "EXPR1 != EXPR2"
714 39 "EXPR1 <> EXPR2"
715 40 "EXPR1 IS EXPR2"
716 41 "EXPR1 IS NOT EXPR2"
717 42 "EXPR1 AND EXPR2"
718 43 "EXPR1 OR EXPR2"
719
720 44 "count(*)"
721 45 "count(DISTINCT EXPR)"
722 46 "substr(EXPR, 10, 20)"
723 47 "changes()"
724
725 48 "( EXPR )"
726
727 49 "CAST ( EXPR AS integer )"
728 50 "CAST ( EXPR AS 'abcd' )"
729 51 "CAST ( EXPR AS 'ab$ $cd' )"
730
731 52 "EXPR COLLATE nocase"
732 53 "EXPR COLLATE binary"
733
734 54 "EXPR1 LIKE EXPR2"
735 55 "EXPR1 LIKE EXPR2 ESCAPE EXPR"
736 56 "EXPR1 GLOB EXPR2"
737 57 "EXPR1 GLOB EXPR2 ESCAPE EXPR"
738 58 "EXPR1 REGEXP EXPR2"
739 59 "EXPR1 REGEXP EXPR2 ESCAPE EXPR"
740 60 "EXPR1 MATCH EXPR2"
741 61 "EXPR1 MATCH EXPR2 ESCAPE EXPR"
742 62 "EXPR1 NOT LIKE EXPR2"
743 63 "EXPR1 NOT LIKE EXPR2 ESCAPE EXPR"
744 64 "EXPR1 NOT GLOB EXPR2"
745 65 "EXPR1 NOT GLOB EXPR2 ESCAPE EXPR"
746 66 "EXPR1 NOT REGEXP EXPR2"
747 67 "EXPR1 NOT REGEXP EXPR2 ESCAPE EXPR"
748 68 "EXPR1 NOT MATCH EXPR2"
749 69 "EXPR1 NOT MATCH EXPR2 ESCAPE EXPR"
750
751 70 "EXPR ISNULL"
752 71 "EXPR NOTNULL"
753 72 "EXPR NOT NULL"
754
755 73 "EXPR1 IS EXPR2"
756 74 "EXPR1 IS NOT EXPR2"
757
758 75 "EXPR NOT BETWEEN EXPR1 AND EXPR2"
759 76 "EXPR BETWEEN EXPR1 AND EXPR2"
760
761 77 "EXPR NOT IN (SELECT cname FROM tblname)"
762 78 "EXPR NOT IN (1)"
763 79 "EXPR NOT IN (1, 2, 3)"
764 80 "EXPR NOT IN tblname"
765 81 "EXPR NOT IN dbname.tblname"
766 82 "EXPR IN (SELECT cname FROM tblname)"
767 83 "EXPR IN (1)"
768 84 "EXPR IN (1, 2, 3)"
769 85 "EXPR IN tblname"
770 86 "EXPR IN dbname.tblname"
771
772 87 "EXISTS (SELECT cname FROM tblname)"
773 88 "NOT EXISTS (SELECT cname FROM tblname)"
774
775 89 "CASE EXPR WHEN EXPR1 THEN EXPR2 ELSE EXPR END"
776 90 "CASE EXPR WHEN EXPR1 THEN EXPR2 END"
777 91 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END"
778 92 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END"
779 93 "CASE WHEN EXPR1 THEN EXPR2 ELSE EXPR END"
780 94 "CASE WHEN EXPR1 THEN EXPR2 END"
781 95 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END"
782 96 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END"
783 } {
784
785 # If the expression string being parsed contains "EXPR2", then replace
786 # string "EXPR1" and "EXPR2" with arbitrary SQL expressions. If it
787 # contains "EXPR", then replace EXPR with an arbitrary SQL expression.
788 #
789 set elist [list $expr]
790 if {[string match *EXPR2* $expr]} {
791 set elist [list]
792 foreach {e1 e2} { cname "34+22" } {
793 lappend elist [string map [list EXPR1 $e1 EXPR2 $e2] $expr]
794 }
795 }
796 if {[string match *EXPR* $expr]} {
797 set elist2 [list]
798 foreach el $elist {
799 foreach e { cname "34+22" } {
800 lappend elist2 [string map [list EXPR $e] $el]
801 }
802 }
803 set elist $elist2
804 }
805
806 set x 0
807 foreach e $elist {
808 incr x
809 do_test e_expr-12.3.$tn.$x {
810 set rc [catch { execsql "SELECT $e FROM tblname" } msg]
811 } {0}
812 }
813 }
814
815 # EVIDENCE-OF: R-49462-56079 -- syntax diagram raise-function
816 #
817 foreach {tn raiseexpr} {
818 1 "RAISE(IGNORE)"
819 2 "RAISE(ROLLBACK, 'error message')"
820 3 "RAISE(ABORT, 'error message')"
821 4 "RAISE(FAIL, 'error message')"
822 } {
823 do_execsql_test e_expr-12.4.$tn "
824 CREATE TRIGGER dbname.tr$tn BEFORE DELETE ON tblname BEGIN
825 SELECT $raiseexpr ;
826 END;
827 " {}
828 }
829
830 #-------------------------------------------------------------------------
831 # Test the statements related to the BETWEEN operator.
832 #
833 # EVIDENCE-OF: R-40079-54503 The BETWEEN operator is logically
834 # equivalent to a pair of comparisons. "x BETWEEN y AND z" is equivalent
835 # to "x>=y AND x<=z" except that with BETWEEN, the x expression is
836 # only evaluated once.
837 #
838 db func x x
839 proc x {} { incr ::xcount ; return [expr $::x] }
840 foreach {tn x expr res nEval} {
841 1 10 "x() >= 5 AND x() <= 15" 1 2
842 2 10 "x() BETWEEN 5 AND 15" 1 1
843
844 3 5 "x() >= 5 AND x() <= 5" 1 2
845 4 5 "x() BETWEEN 5 AND 5" 1 1
846 } {
847 do_test e_expr-13.1.$tn {
848 set ::xcount 0
849 set a [execsql "SELECT $expr"]
850 list $::xcount $a
851 } [list $nEval $res]
852 }
853
854 # EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is
855 # the same as the precedence as operators == and != and LIKE and groups
856 # left to right.
857 #
858 # Therefore, BETWEEN groups more tightly than operator "AND", but less
859 # so than "<".
860 #
861 do_execsql_test e_expr-13.2.1 { SELECT 1 == 10 BETWEEN 0 AND 2 } 1
862 do_execsql_test e_expr-13.2.2 { SELECT (1 == 10) BETWEEN 0 AND 2 } 1
863 do_execsql_test e_expr-13.2.3 { SELECT 1 == (10 BETWEEN 0 AND 2) } 0
864 do_execsql_test e_expr-13.2.4 { SELECT 6 BETWEEN 4 AND 8 == 1 } 1
865 do_execsql_test e_expr-13.2.5 { SELECT (6 BETWEEN 4 AND 8) == 1 } 1
866 do_execsql_test e_expr-13.2.6 { SELECT 6 BETWEEN 4 AND (8 == 1) } 0
867
868 do_execsql_test e_expr-13.2.7 { SELECT 5 BETWEEN 0 AND 0 != 1 } 1
869 do_execsql_test e_expr-13.2.8 { SELECT (5 BETWEEN 0 AND 0) != 1 } 1
870 do_execsql_test e_expr-13.2.9 { SELECT 5 BETWEEN 0 AND (0 != 1) } 0
871 do_execsql_test e_expr-13.2.10 { SELECT 1 != 0 BETWEEN 0 AND 2 } 1
872 do_execsql_test e_expr-13.2.11 { SELECT (1 != 0) BETWEEN 0 AND 2 } 1
873 do_execsql_test e_expr-13.2.12 { SELECT 1 != (0 BETWEEN 0 AND 2) } 0
874
875 do_execsql_test e_expr-13.2.13 { SELECT 1 LIKE 10 BETWEEN 0 AND 2 } 1
876 do_execsql_test e_expr-13.2.14 { SELECT (1 LIKE 10) BETWEEN 0 AND 2 } 1
877 do_execsql_test e_expr-13.2.15 { SELECT 1 LIKE (10 BETWEEN 0 AND 2) } 0
878 do_execsql_test e_expr-13.2.16 { SELECT 6 BETWEEN 4 AND 8 LIKE 1 } 1
879 do_execsql_test e_expr-13.2.17 { SELECT (6 BETWEEN 4 AND 8) LIKE 1 } 1
880 do_execsql_test e_expr-13.2.18 { SELECT 6 BETWEEN 4 AND (8 LIKE 1) } 0
881
882 do_execsql_test e_expr-13.2.19 { SELECT 0 AND 0 BETWEEN 0 AND 1 } 0
883 do_execsql_test e_expr-13.2.20 { SELECT 0 AND (0 BETWEEN 0 AND 1) } 0
884 do_execsql_test e_expr-13.2.21 { SELECT (0 AND 0) BETWEEN 0 AND 1 } 1
885 do_execsql_test e_expr-13.2.22 { SELECT 0 BETWEEN -1 AND 1 AND 0 } 0
886 do_execsql_test e_expr-13.2.23 { SELECT (0 BETWEEN -1 AND 1) AND 0 } 0
887 do_execsql_test e_expr-13.2.24 { SELECT 0 BETWEEN -1 AND (1 AND 0) } 1
888
889 do_execsql_test e_expr-13.2.25 { SELECT 2 < 3 BETWEEN 0 AND 1 } 1
890 do_execsql_test e_expr-13.2.26 { SELECT (2 < 3) BETWEEN 0 AND 1 } 1
891 do_execsql_test e_expr-13.2.27 { SELECT 2 < (3 BETWEEN 0 AND 1) } 0
892 do_execsql_test e_expr-13.2.28 { SELECT 2 BETWEEN 1 AND 2 < 3 } 0
893 do_execsql_test e_expr-13.2.29 { SELECT 2 BETWEEN 1 AND (2 < 3) } 0
894 do_execsql_test e_expr-13.2.30 { SELECT (2 BETWEEN 1 AND 2) < 3 } 1
895
896 #-------------------------------------------------------------------------
897 # Test the statements related to the LIKE and GLOB operators.
898 #
899 # EVIDENCE-OF: R-16584-60189 The LIKE operator does a pattern matching
900 # comparison.
901 #
902 # EVIDENCE-OF: R-11295-04657 The operand to the right of the LIKE
903 # operator contains the pattern and the left hand operand contains the
904 # string to match against the pattern.
905 #
906 do_execsql_test e_expr-14.1.1 { SELECT 'abc%' LIKE 'abcde' } 0
907 do_execsql_test e_expr-14.1.2 { SELECT 'abcde' LIKE 'abc%' } 1
908
909 # EVIDENCE-OF: R-55406-38524 A percent symbol ("%") in the LIKE pattern
910 # matches any sequence of zero or more characters in the string.
911 #
912 do_execsql_test e_expr-14.2.1 { SELECT 'abde' LIKE 'ab%de' } 1
913 do_execsql_test e_expr-14.2.2 { SELECT 'abXde' LIKE 'ab%de' } 1
914 do_execsql_test e_expr-14.2.3 { SELECT 'abABCde' LIKE 'ab%de' } 1
915
916 # EVIDENCE-OF: R-30433-25443 An underscore ("_") in the LIKE pattern
917 # matches any single character in the string.
918 #
919 do_execsql_test e_expr-14.3.1 { SELECT 'abde' LIKE 'ab_de' } 0
920 do_execsql_test e_expr-14.3.2 { SELECT 'abXde' LIKE 'ab_de' } 1
921 do_execsql_test e_expr-14.3.3 { SELECT 'abABCde' LIKE 'ab_de' } 0
922
923 # EVIDENCE-OF: R-59007-20454 Any other character matches itself or its
924 # lower/upper case equivalent (i.e. case-insensitive matching).
925 #
926 do_execsql_test e_expr-14.4.1 { SELECT 'abc' LIKE 'aBc' } 1
927 do_execsql_test e_expr-14.4.2 { SELECT 'aBc' LIKE 'aBc' } 1
928 do_execsql_test e_expr-14.4.3 { SELECT 'ac' LIKE 'aBc' } 0
929
930 # EVIDENCE-OF: R-23648-58527 SQLite only understands upper/lower case
931 # for ASCII characters by default.
932 #
933 # EVIDENCE-OF: R-04532-11527 The LIKE operator is case sensitive by
934 # default for unicode characters that are beyond the ASCII range.
935 #
936 # EVIDENCE-OF: R-44381-11669 the expression
937 # 'a'&nbsp;LIKE&nbsp;'A' is TRUE but
938 # '&aelig;'&nbsp;LIKE&nbsp;'&AElig;' is FALSE.
939 #
940 do_execsql_test e_expr-14.5.1 { SELECT 'A' LIKE 'a' } 1
941 do_execsql_test e_expr-14.5.2 "SELECT '\u00c6' LIKE '\u00e6'" 0
942
943 # EVIDENCE-OF: R-56683-13731 If the optional ESCAPE clause is present,
944 # then the expression following the ESCAPE keyword must evaluate to a
945 # string consisting of a single character.
946 #
947 do_catchsql_test e_expr-14.6.1 {
948 SELECT 'A' LIKE 'a' ESCAPE '12'
949 } {1 {ESCAPE expression must be a single character}}
950 do_catchsql_test e_expr-14.6.2 {
951 SELECT 'A' LIKE 'a' ESCAPE ''
952 } {1 {ESCAPE expression must be a single character}}
953 do_catchsql_test e_expr-14.6.3 { SELECT 'A' LIKE 'a' ESCAPE 'x' } {0 1}
954 do_catchsql_test e_expr-14.6.4 "SELECT 'A' LIKE 'a' ESCAPE '\u00e6'" {0 1}
955
956 # EVIDENCE-OF: R-02045-23762 This character may be used in the LIKE
957 # pattern to include literal percent or underscore characters.
958 #
959 # EVIDENCE-OF: R-13345-31830 The escape character followed by a percent
960 # symbol (%), underscore (_), or a second instance of the escape
961 # character itself matches a literal percent symbol, underscore, or a
962 # single escape character, respectively.
963 #
964 do_execsql_test e_expr-14.7.1 { SELECT 'abc%' LIKE 'abcX%' ESCAPE 'X' } 1
965 do_execsql_test e_expr-14.7.2 { SELECT 'abc5' LIKE 'abcX%' ESCAPE 'X' } 0
966 do_execsql_test e_expr-14.7.3 { SELECT 'abc' LIKE 'abcX%' ESCAPE 'X' } 0
967 do_execsql_test e_expr-14.7.4 { SELECT 'abcX%' LIKE 'abcX%' ESCAPE 'X' } 0
968 do_execsql_test e_expr-14.7.5 { SELECT 'abc%%' LIKE 'abcX%' ESCAPE 'X' } 0
969
970 do_execsql_test e_expr-14.7.6 { SELECT 'abc_' LIKE 'abcX_' ESCAPE 'X' } 1
971 do_execsql_test e_expr-14.7.7 { SELECT 'abc5' LIKE 'abcX_' ESCAPE 'X' } 0
972 do_execsql_test e_expr-14.7.8 { SELECT 'abc' LIKE 'abcX_' ESCAPE 'X' } 0
973 do_execsql_test e_expr-14.7.9 { SELECT 'abcX_' LIKE 'abcX_' ESCAPE 'X' } 0
974 do_execsql_test e_expr-14.7.10 { SELECT 'abc__' LIKE 'abcX_' ESCAPE 'X' } 0
975
976 do_execsql_test e_expr-14.7.11 { SELECT 'abcX' LIKE 'abcXX' ESCAPE 'X' } 1
977 do_execsql_test e_expr-14.7.12 { SELECT 'abc5' LIKE 'abcXX' ESCAPE 'X' } 0
978 do_execsql_test e_expr-14.7.13 { SELECT 'abc' LIKE 'abcXX' ESCAPE 'X' } 0
979 do_execsql_test e_expr-14.7.14 { SELECT 'abcXX' LIKE 'abcXX' ESCAPE 'X' } 0
980
981 # EVIDENCE-OF: R-51359-17496 The infix LIKE operator is implemented by
982 # calling the application-defined SQL functions like(Y,X) or like(Y,X,Z).
983 #
984 proc likefunc {args} {
985 eval lappend ::likeargs $args
986 return 1
987 }
988 db func like likefunc
989 set ::likeargs [list]
990 do_execsql_test e_expr-15.1.1 { SELECT 'abc' LIKE 'def' } 1
991 do_test e_expr-15.1.2 { set likeargs } {def abc}
992 set ::likeargs [list]
993 do_execsql_test e_expr-15.1.3 { SELECT 'abc' LIKE 'def' ESCAPE 'X' } 1
994 do_test e_expr-15.1.4 { set likeargs } {def abc X}
995 db close
996 sqlite3 db test.db
997
998 # EVIDENCE-OF: R-22868-25880 The LIKE operator can be made case
999 # sensitive using the case_sensitive_like pragma.
1000 #
1001 do_execsql_test e_expr-16.1.1 { SELECT 'abcxyz' LIKE 'ABC%' } 1
1002 do_execsql_test e_expr-16.1.2 { PRAGMA case_sensitive_like = 1 } {}
1003 do_execsql_test e_expr-16.1.3 { SELECT 'abcxyz' LIKE 'ABC%' } 0
1004 do_execsql_test e_expr-16.1.4 { SELECT 'ABCxyz' LIKE 'ABC%' } 1
1005 do_execsql_test e_expr-16.1.5 { PRAGMA case_sensitive_like = 0 } {}
1006 do_execsql_test e_expr-16.1.6 { SELECT 'abcxyz' LIKE 'ABC%' } 1
1007 do_execsql_test e_expr-16.1.7 { SELECT 'ABCxyz' LIKE 'ABC%' } 1
1008
1009 # EVIDENCE-OF: R-52087-12043 The GLOB operator is similar to LIKE but
1010 # uses the Unix file globbing syntax for its wildcards.
1011 #
1012 # EVIDENCE-OF: R-09813-17279 Also, GLOB is case sensitive, unlike LIKE.
1013 #
1014 do_execsql_test e_expr-17.1.1 { SELECT 'abcxyz' GLOB 'abc%' } 0
1015 do_execsql_test e_expr-17.1.2 { SELECT 'abcxyz' GLOB 'abc*' } 1
1016 do_execsql_test e_expr-17.1.3 { SELECT 'abcxyz' GLOB 'abc___' } 0
1017 do_execsql_test e_expr-17.1.4 { SELECT 'abcxyz' GLOB 'abc???' } 1
1018
1019 do_execsql_test e_expr-17.1.5 { SELECT 'abcxyz' GLOB 'abc*' } 1
1020 do_execsql_test e_expr-17.1.6 { SELECT 'ABCxyz' GLOB 'abc*' } 0
1021 do_execsql_test e_expr-17.1.7 { SELECT 'abcxyz' GLOB 'ABC*' } 0
1022
1023 # EVIDENCE-OF: R-39616-20555 Both GLOB and LIKE may be preceded by the
1024 # NOT keyword to invert the sense of the test.
1025 #
1026 do_execsql_test e_expr-17.2.1 { SELECT 'abcxyz' NOT GLOB 'ABC*' } 1
1027 do_execsql_test e_expr-17.2.2 { SELECT 'abcxyz' NOT GLOB 'abc*' } 0
1028 do_execsql_test e_expr-17.2.3 { SELECT 'abcxyz' NOT LIKE 'ABC%' } 0
1029 do_execsql_test e_expr-17.2.4 { SELECT 'abcxyz' NOT LIKE 'abc%' } 0
1030 do_execsql_test e_expr-17.2.5 { SELECT 'abdxyz' NOT LIKE 'abc%' } 1
1031
1032 db nullvalue null
1033 do_execsql_test e_expr-17.2.6 { SELECT 'abcxyz' NOT GLOB NULL } null
1034 do_execsql_test e_expr-17.2.7 { SELECT 'abcxyz' NOT LIKE NULL } null
1035 do_execsql_test e_expr-17.2.8 { SELECT NULL NOT GLOB 'abc*' } null
1036 do_execsql_test e_expr-17.2.9 { SELECT NULL NOT LIKE 'ABC%' } null
1037 db nullvalue {}
1038
1039 # EVIDENCE-OF: R-39414-35489 The infix GLOB operator is implemented by
1040 # calling the function glob(Y,X) and can be modified by overriding that
1041 # function.
1042 proc globfunc {args} {
1043 eval lappend ::globargs $args
1044 return 1
1045 }
1046 db func glob -argcount 2 globfunc
1047 set ::globargs [list]
1048 do_execsql_test e_expr-17.3.1 { SELECT 'abc' GLOB 'def' } 1
1049 do_test e_expr-17.3.2 { set globargs } {def abc}
1050 set ::globargs [list]
1051 do_execsql_test e_expr-17.3.3 { SELECT 'X' NOT GLOB 'Y' } 0
1052 do_test e_expr-17.3.4 { set globargs } {Y X}
1053 sqlite3 db test.db
1054
1055 # EVIDENCE-OF: R-41650-20872 No regexp() user function is defined by
1056 # default and so use of the REGEXP operator will normally result in an
1057 # error message.
1058 #
1059 do_catchsql_test e_expr-18.1.1 {
1060 SELECT regexp('abc', 'def')
1061 } {1 {no such function: regexp}}
1062 do_catchsql_test e_expr-18.1.2 {
1063 SELECT 'abc' REGEXP 'def'
1064 } {1 {no such function: REGEXP}}
1065
1066 # EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for
1067 # the regexp() user function.
1068 #
1069 # EVIDENCE-OF: R-57289-13578 If a application-defined SQL function named
1070 # "regexp" is added at run-time, that function will be called in order
1071 # to implement the REGEXP operator.
1072 #
1073 proc regexpfunc {args} {
1074 eval lappend ::regexpargs $args
1075 return 1
1076 }
1077 db func regexp -argcount 2 regexpfunc
1078 set ::regexpargs [list]
1079 do_execsql_test e_expr-18.2.1 { SELECT 'abc' REGEXP 'def' } 1
1080 do_test e_expr-18.2.2 { set regexpargs } {def abc}
1081 set ::regexpargs [list]
1082 do_execsql_test e_expr-18.2.3 { SELECT 'X' NOT REGEXP 'Y' } 0
1083 do_test e_expr-18.2.4 { set regexpargs } {Y X}
1084 sqlite3 db test.db
1085
1086 # EVIDENCE-OF: R-42037-37826 The default match() function implementation
1087 # raises an exception and is not really useful for anything.
1088 #
1089 do_catchsql_test e_expr-19.1.1 {
1090 SELECT 'abc' MATCH 'def'
1091 } {1 {unable to use function MATCH in the requested context}}
1092 do_catchsql_test e_expr-19.1.2 {
1093 SELECT match('abc', 'def')
1094 } {1 {unable to use function MATCH in the requested context}}
1095
1096 # EVIDENCE-OF: R-37916-47407 The MATCH operator is a special syntax for
1097 # the match() application-defined function.
1098 #
1099 # EVIDENCE-OF: R-06021-09373 But extensions can override the match()
1100 # function with more helpful logic.
1101 #
1102 proc matchfunc {args} {
1103 eval lappend ::matchargs $args
1104 return 1
1105 }
1106 db func match -argcount 2 matchfunc
1107 set ::matchargs [list]
1108 do_execsql_test e_expr-19.2.1 { SELECT 'abc' MATCH 'def' } 1
1109 do_test e_expr-19.2.2 { set matchargs } {def abc}
1110 set ::matchargs [list]
1111 do_execsql_test e_expr-19.2.3 { SELECT 'X' NOT MATCH 'Y' } 0
1112 do_test e_expr-19.2.4 { set matchargs } {Y X}
1113 sqlite3 db test.db
1114
1115 #-------------------------------------------------------------------------
1116 # Test cases for the testable statements related to the CASE expression.
1117 #
1118 # EVIDENCE-OF: R-15199-61389 There are two basic forms of the CASE
1119 # expression: those with a base expression and those without.
1120 #
1121 do_execsql_test e_expr-20.1 {
1122 SELECT CASE WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END;
1123 } {true}
1124 do_execsql_test e_expr-20.2 {
1125 SELECT CASE 0 WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END;
1126 } {false}
1127
1128 proc var {nm} {
1129 lappend ::varlist $nm
1130 return [set "::$nm"]
1131 }
1132 db func var var
1133
1134 # EVIDENCE-OF: R-30638-59954 In a CASE without a base expression, each
1135 # WHEN expression is evaluated and the result treated as a boolean,
1136 # starting with the leftmost and continuing to the right.
1137 #
1138 foreach {a b c} {0 0 0} break
1139 set varlist [list]
1140 do_execsql_test e_expr-21.1.1 {
1141 SELECT CASE WHEN var('a') THEN 'A'
1142 WHEN var('b') THEN 'B'
1143 WHEN var('c') THEN 'C' END
1144 } {{}}
1145 do_test e_expr-21.1.2 { set varlist } {a b c}
1146 set varlist [list]
1147 do_execsql_test e_expr-21.1.3 {
1148 SELECT CASE WHEN var('c') THEN 'C'
1149 WHEN var('b') THEN 'B'
1150 WHEN var('a') THEN 'A'
1151 ELSE 'no result'
1152 END
1153 } {{no result}}
1154 do_test e_expr-21.1.4 { set varlist } {c b a}
1155
1156 # EVIDENCE-OF: R-39009-25596 The result of the CASE expression is the
1157 # evaluation of the THEN expression that corresponds to the first WHEN
1158 # expression that evaluates to true.
1159 #
1160 foreach {a b c} {0 1 0} break
1161 do_execsql_test e_expr-21.2.1 {
1162 SELECT CASE WHEN var('a') THEN 'A'
1163 WHEN var('b') THEN 'B'
1164 WHEN var('c') THEN 'C'
1165 ELSE 'no result'
1166 END
1167 } {B}
1168 foreach {a b c} {0 1 1} break
1169 do_execsql_test e_expr-21.2.2 {
1170 SELECT CASE WHEN var('a') THEN 'A'
1171 WHEN var('b') THEN 'B'
1172 WHEN var('c') THEN 'C'
1173 ELSE 'no result'
1174 END
1175 } {B}
1176 foreach {a b c} {0 0 1} break
1177 do_execsql_test e_expr-21.2.3 {
1178 SELECT CASE WHEN var('a') THEN 'A'
1179 WHEN var('b') THEN 'B'
1180 WHEN var('c') THEN 'C'
1181 ELSE 'no result'
1182 END
1183 } {C}
1184
1185 # EVIDENCE-OF: R-24227-04807 Or, if none of the WHEN expressions
1186 # evaluate to true, the result of evaluating the ELSE expression, if
1187 # any.
1188 #
1189 foreach {a b c} {0 0 0} break
1190 do_execsql_test e_expr-21.3.1 {
1191 SELECT CASE WHEN var('a') THEN 'A'
1192 WHEN var('b') THEN 'B'
1193 WHEN var('c') THEN 'C'
1194 ELSE 'no result'
1195 END
1196 } {{no result}}
1197
1198 # EVIDENCE-OF: R-14168-07579 If there is no ELSE expression and none of
1199 # the WHEN expressions are true, then the overall result is NULL.
1200 #
1201 db nullvalue null
1202 do_execsql_test e_expr-21.3.2 {
1203 SELECT CASE WHEN var('a') THEN 'A'
1204 WHEN var('b') THEN 'B'
1205 WHEN var('c') THEN 'C'
1206 END
1207 } {null}
1208 db nullvalue {}
1209
1210 # EVIDENCE-OF: R-13943-13592 A NULL result is considered untrue when
1211 # evaluating WHEN terms.
1212 #
1213 do_execsql_test e_expr-21.4.1 {
1214 SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END
1215 } {B}
1216 do_execsql_test e_expr-21.4.2 {
1217 SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END
1218 } {C}
1219
1220 # EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base
1221 # expression is evaluated just once and the result is compared against
1222 # the evaluation of each WHEN expression from left to right.
1223 #
1224 # Note: This test case tests the "evaluated just once" part of the above
1225 # statement. Tests associated with the next two statements test that the
1226 # comparisons take place.
1227 #
1228 foreach {a b c} [list [expr 3] [expr 4] [expr 5]] break
1229 set ::varlist [list]
1230 do_execsql_test e_expr-22.1.1 {
1231 SELECT CASE var('a') WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' END
1232 } {C}
1233 do_test e_expr-22.1.2 { set ::varlist } {a}
1234
1235 # EVIDENCE-OF: R-07667-49537 The result of the CASE expression is the
1236 # evaluation of the THEN expression that corresponds to the first WHEN
1237 # expression for which the comparison is true.
1238 #
1239 do_execsql_test e_expr-22.2.1 {
1240 SELECT CASE 23 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1241 } {B}
1242 do_execsql_test e_expr-22.2.2 {
1243 SELECT CASE 1 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1244 } {A}
1245
1246 # EVIDENCE-OF: R-47543-32145 Or, if none of the WHEN expressions
1247 # evaluate to a value equal to the base expression, the result of
1248 # evaluating the ELSE expression, if any.
1249 #
1250 do_execsql_test e_expr-22.3.1 {
1251 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' ELSE 'D' END
1252 } {D}
1253
1254 # EVIDENCE-OF: R-54721-48557 If there is no ELSE expression and none of
1255 # the WHEN expressions produce a result equal to the base expression,
1256 # the overall result is NULL.
1257 #
1258 do_execsql_test e_expr-22.4.1 {
1259 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1260 } {{}}
1261 db nullvalue null
1262 do_execsql_test e_expr-22.4.2 {
1263 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1264 } {null}
1265 db nullvalue {}
1266
1267 # EVIDENCE-OF: R-11479-62774 When comparing a base expression against a
1268 # WHEN expression, the same collating sequence, affinity, and
1269 # NULL-handling rules apply as if the base expression and WHEN
1270 # expression are respectively the left- and right-hand operands of an =
1271 # operator.
1272 #
1273 proc rev {str} {
1274 set ret ""
1275 set chars [split $str]
1276 for {set i [expr [llength $chars]-1]} {$i>=0} {incr i -1} {
1277 append ret [lindex $chars $i]
1278 }
1279 set ret
1280 }
1281 proc reverse {lhs rhs} {
1282 string compare [rev $lhs] [ref $rhs]
1283 }
1284 db collate reverse reverse
1285 do_execsql_test e_expr-23.1.1 {
1286 CREATE TABLE t1(
1287 a TEXT COLLATE NOCASE,
1288 b COLLATE REVERSE,
1289 c INTEGER,
1290 d BLOB
1291 );
1292 INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5);
1293 } {}
1294 do_execsql_test e_expr-23.1.2 {
1295 SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1
1296 } {B}
1297 do_execsql_test e_expr-23.1.3 {
1298 SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1
1299 } {B}
1300 do_execsql_test e_expr-23.1.4 {
1301 SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1
1302 } {B}
1303 do_execsql_test e_expr-23.1.5 {
1304 SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1
1305 } {A}
1306 do_execsql_test e_expr-23.1.6 {
1307 SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END
1308 } {B}
1309 do_execsql_test e_expr-23.1.7 {
1310 SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1
1311 } {A}
1312 do_execsql_test e_expr-23.1.8 {
1313 SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1
1314 } {B}
1315 do_execsql_test e_expr-23.1.9 {
1316 SELECT CASE NULL WHEN NULL THEN 'A' ELSE 'B' END
1317 } {B}
1318
1319 # EVIDENCE-OF: R-37304-39405 If the base expression is NULL then the
1320 # result of the CASE is always the result of evaluating the ELSE
1321 # expression if it exists, or NULL if it does not.
1322 #
1323 do_execsql_test e_expr-24.1.1 {
1324 SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' END;
1325 } {{}}
1326 do_execsql_test e_expr-24.1.2 {
1327 SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' ELSE 'C' END;
1328 } {C}
1329
1330 # EVIDENCE-OF: R-56280-17369 Both forms of the CASE expression use lazy,
1331 # or short-circuit, evaluation.
1332 #
1333 set varlist [list]
1334 foreach {a b c} {0 1 0} break
1335 do_execsql_test e_expr-25.1.1 {
1336 SELECT CASE WHEN var('a') THEN 'A'
1337 WHEN var('b') THEN 'B'
1338 WHEN var('c') THEN 'C'
1339 END
1340 } {B}
1341 do_test e_expr-25.1.2 { set ::varlist } {a b}
1342 set varlist [list]
1343 do_execsql_test e_expr-25.1.3 {
1344 SELECT CASE '0' WHEN var('a') THEN 'A'
1345 WHEN var('b') THEN 'B'
1346 WHEN var('c') THEN 'C'
1347 END
1348 } {A}
1349 do_test e_expr-25.1.4 { set ::varlist } {a}
1350
1351 # EVIDENCE-OF: R-34773-62253 The only difference between the following
1352 # two CASE expressions is that the x expression is evaluated exactly
1353 # once in the first example but might be evaluated multiple times in the
1354 # second: CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END CASE WHEN
1355 # x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
1356 #
1357 proc ceval {x} {
1358 incr ::evalcount
1359 return $x
1360 }
1361 db func ceval ceval
1362 set ::evalcount 0
1363
1364 do_execsql_test e_expr-26.1.1 {
1365 CREATE TABLE t2(x, w1, r1, w2, r2, r3);
1366 INSERT INTO t2 VALUES(1, 1, 'R1', 2, 'R2', 'R3');
1367 INSERT INTO t2 VALUES(2, 1, 'R1', 2, 'R2', 'R3');
1368 INSERT INTO t2 VALUES(3, 1, 'R1', 2, 'R2', 'R3');
1369 } {}
1370 do_execsql_test e_expr-26.1.2 {
1371 SELECT CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2
1372 } {R1 R2 R3}
1373 do_execsql_test e_expr-26.1.3 {
1374 SELECT CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END FROM t2
1375 } {R1 R2 R3}
1376
1377 do_execsql_test e_expr-26.1.4 {
1378 SELECT CASE ceval(x) WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2
1379 } {R1 R2 R3}
1380 do_test e_expr-26.1.5 { set ::evalcount } {3}
1381 set ::evalcount 0
1382 do_execsql_test e_expr-26.1.6 {
1383 SELECT CASE
1384 WHEN ceval(x)=w1 THEN r1
1385 WHEN ceval(x)=w2 THEN r2
1386 ELSE r3 END
1387 FROM t2
1388 } {R1 R2 R3}
1389 do_test e_expr-26.1.6 { set ::evalcount } {5}
1390
1391
1392 #-------------------------------------------------------------------------
1393 # Test statements related to CAST expressions.
1394 #
1395 # EVIDENCE-OF: R-65079-31758 Application of a CAST expression is
1396 # different to application of a column affinity, as with a CAST
1397 # expression the storage class conversion is forced even if it is lossy
1398 # and irrreversible.
1399 #
1400 do_execsql_test e_expr-27.1.1 {
1401 CREATE TABLE t3(a TEXT, b REAL, c INTEGER);
1402 INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5);
1403 SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3;
1404 } {blob UVU text 1.23abc real 4.5}
1405 do_execsql_test e_expr-27.1.2 {
1406 SELECT
1407 typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT),
1408 typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL),
1409 typeof(CAST(4.5 as INTEGER)), CAST(4.5 as INTEGER)
1410 } {text UVU real 1.23 integer 4}
1411
1412 # EVIDENCE-OF: R-27225-65050 If the value of <expr> is NULL, then
1413 # the result of the CAST expression is also NULL.
1414 #
1415 do_expr_test e_expr-27.2.1 { CAST(NULL AS integer) } null {}
1416 do_expr_test e_expr-27.2.2 { CAST(NULL AS text) } null {}
1417 do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) } null {}
1418 do_expr_test e_expr-27.2.4 { CAST(NULL AS number) } null {}
1419
1420 # EVIDENCE-OF: R-31076-23575 Casting a value to a <type-name> with
1421 # no affinity causes the value to be converted into a BLOB.
1422 #
1423 do_expr_test e_expr-27.3.1 { CAST('abc' AS blob) } blob abc
1424 do_expr_test e_expr-27.3.2 { CAST('def' AS shobblob_x) } blob def
1425 do_expr_test e_expr-27.3.3 { CAST('ghi' AS abbLOb10) } blob ghi
1426
1427 # EVIDENCE-OF: R-22956-37754 Casting to a BLOB consists of first casting
1428 # the value to TEXT in the encoding of the database connection, then
1429 # interpreting the resulting byte sequence as a BLOB instead of as TEXT.
1430 #
1431 do_qexpr_test e_expr-27.4.1 { CAST('ghi' AS blob) } X'676869'
1432 do_qexpr_test e_expr-27.4.2 { CAST(456 AS blob) } X'343536'
1433 do_qexpr_test e_expr-27.4.3 { CAST(1.78 AS blob) } X'312E3738'
1434 rename db db2
1435 sqlite3 db :memory:
1436 db eval { PRAGMA encoding = 'utf-16le' }
1437 do_qexpr_test e_expr-27.4.4 { CAST('ghi' AS blob) } X'670068006900'
1438 do_qexpr_test e_expr-27.4.5 { CAST(456 AS blob) } X'340035003600'
1439 do_qexpr_test e_expr-27.4.6 { CAST(1.78 AS blob) } X'31002E0037003800'
1440 db close
1441 sqlite3 db :memory:
1442 db eval { PRAGMA encoding = 'utf-16be' }
1443 do_qexpr_test e_expr-27.4.7 { CAST('ghi' AS blob) } X'006700680069'
1444 do_qexpr_test e_expr-27.4.8 { CAST(456 AS blob) } X'003400350036'
1445 do_qexpr_test e_expr-27.4.9 { CAST(1.78 AS blob) } X'0031002E00370038'
1446 db close
1447 rename db2 db
1448
1449 # EVIDENCE-OF: R-04207-37981 To cast a BLOB value to TEXT, the sequence
1450 # of bytes that make up the BLOB is interpreted as text encoded using
1451 # the database encoding.
1452 #
1453 do_expr_test e_expr-28.1.1 { CAST (X'676869' AS text) } text ghi
1454 do_expr_test e_expr-28.1.2 { CAST (X'670068006900' AS text) } text g
1455 rename db db2
1456 sqlite3 db :memory:
1457 db eval { PRAGMA encoding = 'utf-16le' }
1458 do_expr_test e_expr-28.1.3 { CAST (X'676869' AS text) == 'ghi' } integer 0
1459 do_expr_test e_expr-28.1.4 { CAST (X'670068006900' AS text) } text ghi
1460 db close
1461 rename db2 db
1462
1463 # EVIDENCE-OF: R-22235-47006 Casting an INTEGER or REAL value into TEXT
1464 # renders the value as if via sqlite3_snprintf() except that the
1465 # resulting TEXT uses the encoding of the database connection.
1466 #
1467 do_expr_test e_expr-28.2.1 { CAST (1 AS text) } text 1
1468 do_expr_test e_expr-28.2.2 { CAST (45 AS text) } text 45
1469 do_expr_test e_expr-28.2.3 { CAST (-45 AS text) } text -45
1470 do_expr_test e_expr-28.2.4 { CAST (8.8 AS text) } text 8.8
1471 do_expr_test e_expr-28.2.5 { CAST (2.3e+5 AS text) } text 230000.0
1472 do_expr_test e_expr-28.2.6 { CAST (-2.3e-5 AS text) } text -2.3e-05
1473 do_expr_test e_expr-28.2.7 { CAST (0.0 AS text) } text 0.0
1474 do_expr_test e_expr-28.2.7 { CAST (0 AS text) } text 0
1475
1476 # EVIDENCE-OF: R-26346-36443 When casting a BLOB value to a REAL, the
1477 # value is first converted to TEXT.
1478 #
1479 do_expr_test e_expr-29.1.1 { CAST (X'312E3233' AS REAL) } real 1.23
1480 do_expr_test e_expr-29.1.2 { CAST (X'3233302E30' AS REAL) } real 230.0
1481 do_expr_test e_expr-29.1.3 { CAST (X'2D392E3837' AS REAL) } real -9.87
1482 do_expr_test e_expr-29.1.4 { CAST (X'302E30303031' AS REAL) } real 0.0001
1483 rename db db2
1484 sqlite3 db :memory:
1485 db eval { PRAGMA encoding = 'utf-16le' }
1486 do_expr_test e_expr-29.1.5 {
1487 CAST (X'31002E0032003300' AS REAL) } real 1.23
1488 do_expr_test e_expr-29.1.6 {
1489 CAST (X'3200330030002E003000' AS REAL) } real 230.0
1490 do_expr_test e_expr-29.1.7 {
1491 CAST (X'2D0039002E0038003700' AS REAL) } real -9.87
1492 do_expr_test e_expr-29.1.8 {
1493 CAST (X'30002E003000300030003100' AS REAL) } real 0.0001
1494 db close
1495 rename db2 db
1496
1497 # EVIDENCE-OF: R-54898-34554 When casting a TEXT value to REAL, the
1498 # longest possible prefix of the value that can be interpreted as a real
1499 # number is extracted from the TEXT value and the remainder ignored.
1500 #
1501 do_expr_test e_expr-29.2.1 { CAST('1.23abcd' AS REAL) } real 1.23
1502 do_expr_test e_expr-29.2.2 { CAST('1.45.23abcd' AS REAL) } real 1.45
1503 do_expr_test e_expr-29.2.3 { CAST('-2.12e-01ABC' AS REAL) } real -0.212
1504 do_expr_test e_expr-29.2.4 { CAST('1 2 3 4' AS REAL) } real 1.0
1505
1506 # EVIDENCE-OF: R-11321-47427 Any leading spaces in the TEXT value are
1507 # ignored when converging from TEXT to REAL.
1508 #
1509 do_expr_test e_expr-29.3.1 { CAST(' 1.23abcd' AS REAL) } real 1.23
1510 do_expr_test e_expr-29.3.2 { CAST(' 1.45.23abcd' AS REAL) } real 1.45
1511 do_expr_test e_expr-29.3.3 { CAST(' -2.12e-01ABC' AS REAL) } real -0.212
1512 do_expr_test e_expr-29.3.4 { CAST(' 1 2 3 4' AS REAL) } real 1.0
1513
1514 # EVIDENCE-OF: R-22662-28218 If there is no prefix that can be
1515 # interpreted as a real number, the result of the conversion is 0.0.
1516 #
1517 do_expr_test e_expr-29.4.1 { CAST('' AS REAL) } real 0.0
1518 do_expr_test e_expr-29.4.2 { CAST('not a number' AS REAL) } real 0.0
1519 do_expr_test e_expr-29.4.3 { CAST('XXI' AS REAL) } real 0.0
1520
1521 # EVIDENCE-OF: R-21829-14563 When casting a BLOB value to INTEGER, the
1522 # value is first converted to TEXT.
1523 #
1524 do_expr_test e_expr-30.1.1 { CAST(X'313233' AS INTEGER) } integer 123
1525 do_expr_test e_expr-30.1.2 { CAST(X'2D363738' AS INTEGER) } integer -678
1526 do_expr_test e_expr-30.1.3 {
1527 CAST(X'31303030303030' AS INTEGER)
1528 } integer 1000000
1529 do_expr_test e_expr-30.1.4 {
1530 CAST(X'2D31313235383939393036383432363234' AS INTEGER)
1531 } integer -1125899906842624
1532
1533 rename db db2
1534 sqlite3 db :memory:
1535 execsql { PRAGMA encoding = 'utf-16be' }
1536 do_expr_test e_expr-30.1.5 { CAST(X'003100320033' AS INTEGER) } integer 123
1537 do_expr_test e_expr-30.1.6 { CAST(X'002D003600370038' AS INTEGER) } integer -678
1538 do_expr_test e_expr-30.1.7 {
1539 CAST(X'0031003000300030003000300030' AS INTEGER)
1540 } integer 1000000
1541 do_expr_test e_expr-30.1.8 {
1542 CAST(X'002D0031003100320035003800390039003900300036003800340032003600320034' A S INTEGER)
1543 } integer -1125899906842624
1544 db close
1545 rename db2 db
1546
1547 # EVIDENCE-OF: R-47612-45842 When casting a TEXT value to INTEGER, the
1548 # longest possible prefix of the value that can be interpreted as an
1549 # integer number is extracted from the TEXT value and the remainder
1550 # ignored.
1551 #
1552 do_expr_test e_expr-30.2.1 { CAST('123abcd' AS INT) } integer 123
1553 do_expr_test e_expr-30.2.2 { CAST('14523abcd' AS INT) } integer 14523
1554 do_expr_test e_expr-30.2.3 { CAST('-2.12e-01ABC' AS INT) } integer -2
1555 do_expr_test e_expr-30.2.4 { CAST('1 2 3 4' AS INT) } integer 1
1556
1557 # EVIDENCE-OF: R-34400-33772 Any leading spaces in the TEXT value when
1558 # converting from TEXT to INTEGER are ignored.
1559 #
1560 do_expr_test e_expr-30.3.1 { CAST(' 123abcd' AS INT) } integer 123
1561 do_expr_test e_expr-30.3.2 { CAST(' 14523abcd' AS INT) } integer 14523
1562 do_expr_test e_expr-30.3.3 { CAST(' -2.12e-01ABC' AS INT) } integer -2
1563 do_expr_test e_expr-30.3.4 { CAST(' 1 2 3 4' AS INT) } integer 1
1564
1565 # EVIDENCE-OF: R-43164-44276 If there is no prefix that can be
1566 # interpreted as an integer number, the result of the conversion is 0.
1567 #
1568 do_expr_test e_expr-30.4.1 { CAST('' AS INTEGER) } integer 0
1569 do_expr_test e_expr-30.4.2 { CAST('not a number' AS INTEGER) } integer 0
1570 do_expr_test e_expr-30.4.3 { CAST('XXI' AS INTEGER) } integer 0
1571
1572 # EVIDENCE-OF: R-00741-38776 A cast of a REAL value into an INTEGER will
1573 # truncate the fractional part of the REAL.
1574 #
1575 do_expr_test e_expr-31.1.1 { CAST(3.14159 AS INTEGER) } integer 3
1576 do_expr_test e_expr-31.1.2 { CAST(1.99999 AS INTEGER) } integer 1
1577 do_expr_test e_expr-31.1.3 { CAST(-1.99999 AS INTEGER) } integer -1
1578 do_expr_test e_expr-31.1.4 { CAST(-0.99999 AS INTEGER) } integer 0
1579
1580 # EVIDENCE-OF: R-06126-36021 If an REAL is too large to be represented
1581 # as an INTEGER then the result of the cast is the largest negative
1582 # integer: -9223372036854775808.
1583 #
1584 do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer -9223372036854775808
1585 do_expr_test e_expr-31.2.2 { CAST(-2e+50 AS INT) } integer -9223372036854775808
1586 do_expr_test e_expr-31.2.3 {
1587 CAST(-9223372036854775809.0 AS INT)
1588 } integer -9223372036854775808
1589 do_expr_test e_expr-31.2.4 {
1590 CAST(9223372036854775809.0 AS INT)
1591 } integer -9223372036854775808
1592
1593
1594 # EVIDENCE-OF: R-09295-61337 Casting a TEXT or BLOB value into NUMERIC
1595 # first does a forced conversion into REAL but then further converts the
1596 # result into INTEGER if and only if the conversion from REAL to INTEGER
1597 # is lossless and reversible.
1598 #
1599 do_expr_test e_expr-32.1.1 { CAST('45' AS NUMERIC) } integer 45
1600 do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC) } integer 45
1601 do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC) } real 45.2
1602 do_expr_test e_expr-32.1.4 { CAST('11abc' AS NUMERIC) } integer 11
1603 do_expr_test e_expr-32.1.5 { CAST('11.1abc' AS NUMERIC) } real 11.1
1604
1605 # EVIDENCE-OF: R-30347-18702 Casting a REAL or INTEGER value to NUMERIC
1606 # is a no-op, even if a real value could be losslessly converted to an
1607 # integer.
1608 #
1609 do_expr_test e_expr-32.2.1 { CAST(13.0 AS NUMERIC) } real 13.0
1610 do_expr_test e_expr-32.2.2 { CAST(13.5 AS NUMERIC) } real 13.5
1611
1612 do_expr_test e_expr-32.2.3 {
1613 CAST(-9223372036854775808 AS NUMERIC)
1614 } integer -9223372036854775808
1615 do_expr_test e_expr-32.2.4 {
1616 CAST(9223372036854775807 AS NUMERIC)
1617 } integer 9223372036854775807
1618
1619 # EVIDENCE-OF: R-64550-29191 Note that the result from casting any
1620 # non-BLOB value into a BLOB and the result from casting any BLOB value
1621 # into a non-BLOB value may be different depending on whether the
1622 # database encoding is UTF-8, UTF-16be, or UTF-16le.
1623 #
1624 sqlite3 db1 :memory: ; db1 eval { PRAGMA encoding = 'utf-8' }
1625 sqlite3 db2 :memory: ; db2 eval { PRAGMA encoding = 'utf-16le' }
1626 sqlite3 db3 :memory: ; db3 eval { PRAGMA encoding = 'utf-16be' }
1627 foreach {tn castexpr differs} {
1628 1 { CAST(123 AS BLOB) } 1
1629 2 { CAST('' AS BLOB) } 0
1630 3 { CAST('abcd' AS BLOB) } 1
1631
1632 4 { CAST(X'abcd' AS TEXT) } 1
1633 5 { CAST(X'' AS TEXT) } 0
1634 } {
1635 set r1 [db1 eval "SELECT typeof($castexpr), quote($castexpr)"]
1636 set r2 [db2 eval "SELECT typeof($castexpr), quote($castexpr)"]
1637 set r3 [db3 eval "SELECT typeof($castexpr), quote($castexpr)"]
1638
1639 if {$differs} {
1640 set res [expr {$r1!=$r2 && $r2!=$r3}]
1641 } else {
1642 set res [expr {$r1==$r2 && $r2==$r3}]
1643 }
1644
1645 do_test e_expr-33.1.$tn {set res} 1
1646 }
1647 db1 close
1648 db2 close
1649 db3 close
1650
1651 #-------------------------------------------------------------------------
1652 # Test statements related to the EXISTS and NOT EXISTS operators.
1653 #
1654 catch { db close }
1655 file delete -force test.db
1656 sqlite3 db test.db
1657
1658 do_execsql_test e_expr-34.1 {
1659 CREATE TABLE t1(a, b);
1660 INSERT INTO t1 VALUES(1, 2);
1661 INSERT INTO t1 VALUES(NULL, 2);
1662 INSERT INTO t1 VALUES(1, NULL);
1663 INSERT INTO t1 VALUES(NULL, NULL);
1664 } {}
1665
1666 # EVIDENCE-OF: R-25588-27181 The EXISTS operator always evaluates to one
1667 # of the integer values 0 and 1.
1668 #
1669 # This statement is not tested by itself. Instead, all e_expr-34.* tests
1670 # following this point explicitly test that specific invocations of EXISTS
1671 # return either integer 0 or integer 1.
1672 #
1673
1674 # EVIDENCE-OF: R-58553-63740 If executing the SELECT statement specified
1675 # as the right-hand operand of the EXISTS operator would return one or
1676 # more rows, then the EXISTS operator evaluates to 1.
1677 #
1678 foreach {tn expr} {
1679 1 { EXISTS ( SELECT a FROM t1 ) }
1680 2 { EXISTS ( SELECT b FROM t1 ) }
1681 3 { EXISTS ( SELECT 24 ) }
1682 4 { EXISTS ( SELECT NULL ) }
1683 5 { EXISTS ( SELECT a FROM t1 WHERE a IS NULL ) }
1684 } {
1685 do_expr_test e_expr-34.2.$tn $expr integer 1
1686 }
1687
1688 # EVIDENCE-OF: R-19673-40972 If executing the SELECT would return no
1689 # rows at all, then the EXISTS operator evaluates to 0.
1690 #
1691 foreach {tn expr} {
1692 1 { EXISTS ( SELECT a FROM t1 WHERE 0) }
1693 2 { EXISTS ( SELECT b FROM t1 WHERE a = 5) }
1694 3 { EXISTS ( SELECT 24 WHERE 0) }
1695 4 { EXISTS ( SELECT NULL WHERE 1=2) }
1696 } {
1697 do_expr_test e_expr-34.3.$tn $expr integer 0
1698 }
1699
1700 # EVIDENCE-OF: R-35109-49139 The number of columns in each row returned
1701 # by the SELECT statement (if any) and the specific values returned have
1702 # no effect on the results of the EXISTS operator.
1703 #
1704 foreach {tn expr res} {
1705 1 { EXISTS ( SELECT * FROM t1 ) } 1
1706 2 { EXISTS ( SELECT *, *, * FROM t1 ) } 1
1707 3 { EXISTS ( SELECT 24, 25 ) } 1
1708 4 { EXISTS ( SELECT NULL, NULL, NULL ) } 1
1709 5 { EXISTS ( SELECT a,b,a||b FROM t1 WHERE a IS NULL ) } 1
1710
1711 6 { EXISTS ( SELECT a, a FROM t1 WHERE 0) } 0
1712 7 { EXISTS ( SELECT b, b, a FROM t1 WHERE a = 5) } 0
1713 8 { EXISTS ( SELECT 24, 46, 89 WHERE 0) } 0
1714 9 { EXISTS ( SELECT NULL, NULL WHERE 1=2) } 0
1715 } {
1716 do_expr_test e_expr-34.4.$tn $expr integer $res
1717 }
1718
1719 # EVIDENCE-OF: R-10645-12439 In particular, rows containing NULL values
1720 # are not handled any differently from rows without NULL values.
1721 #
1722 foreach {tn e1 e2} {
1723 1 { EXISTS (SELECT 'not null') } { EXISTS (SELECT NULL) }
1724 2 { EXISTS (SELECT NULL FROM t1) } { EXISTS (SELECT 'bread' FROM t1) }
1725 } {
1726 set res [db one "SELECT $e1"]
1727 do_expr_test e_expr-34.5.${tn}a $e1 integer $res
1728 do_expr_test e_expr-34.5.${tn}b $e2 integer $res
1729 }
1730
1731 #-------------------------------------------------------------------------
1732 # Test statements related to scalar sub-queries.
1733 #
1734
1735 catch { db close }
1736 file delete -force test.db
1737 sqlite3 db test.db
1738 do_test e_expr-35.0 {
1739 execsql {
1740 CREATE TABLE t2(a, b);
1741 INSERT INTO t2 VALUES('one', 'two');
1742 INSERT INTO t2 VALUES('three', NULL);
1743 INSERT INTO t2 VALUES(4, 5.0);
1744 }
1745 } {}
1746
1747 # EVIDENCE-OF: R-00980-39256 A SELECT statement enclosed in parentheses
1748 # may appear as a scalar quantity.
1749 #
1750 # EVIDENCE-OF: R-56294-03966 All types of SELECT statement, including
1751 # aggregate and compound SELECT queries (queries with keywords like
1752 # UNION or EXCEPT) are allowed as scalar subqueries.
1753 #
1754 do_expr_test e_expr-35.1.1 { (SELECT 35) } integer 35
1755 do_expr_test e_expr-35.1.2 { (SELECT NULL) } null {}
1756
1757 do_expr_test e_expr-35.1.3 { (SELECT count(*) FROM t2) } integer 3
1758 do_expr_test e_expr-35.1.4 { (SELECT 4 FROM t2) } integer 4
1759
1760 do_expr_test e_expr-35.1.5 {
1761 (SELECT b FROM t2 UNION SELECT a+1 FROM t2)
1762 } null {}
1763 do_expr_test e_expr-35.1.6 {
1764 (SELECT a FROM t2 UNION SELECT COALESCE(b, 55) FROM t2 ORDER BY 1)
1765 } integer 4
1766
1767 # EVIDENCE-OF: R-46899-53765 A SELECT used as a scalar quantity must
1768 # return a result set with a single column.
1769 #
1770 # The following block tests that errors are returned in a bunch of cases
1771 # where a subquery returns more than one column.
1772 #
1773 set M {only a single result allowed for a SELECT that is part of an expression}
1774 foreach {tn sql} {
1775 1 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2) }
1776 2 { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2 ORDER BY 1) }
1777 3 { SELECT (SELECT 1, 2) }
1778 4 { SELECT (SELECT NULL, NULL, NULL) }
1779 5 { SELECT (SELECT * FROM t2) }
1780 6 { SELECT (SELECT * FROM (SELECT 1, 2, 3)) }
1781 } {
1782 do_catchsql_test e_expr-35.2.$tn $sql [list 1 $M]
1783 }
1784
1785 # EVIDENCE-OF: R-35764-28041 The result of the expression is the value
1786 # of the only column in the first row returned by the SELECT statement.
1787 #
1788 # EVIDENCE-OF: R-41898-06686 If the SELECT yields more than one result
1789 # row, all rows after the first are ignored.
1790 #
1791 do_execsql_test e_expr-36.3.1 {
1792 CREATE TABLE t4(x, y);
1793 INSERT INTO t4 VALUES(1, 'one');
1794 INSERT INTO t4 VALUES(2, 'two');
1795 INSERT INTO t4 VALUES(3, 'three');
1796 } {}
1797
1798 foreach {tn expr restype resval} {
1799 2 { ( SELECT x FROM t4 ORDER BY x ) } integer 1
1800 3 { ( SELECT x FROM t4 ORDER BY y ) } integer 1
1801 4 { ( SELECT x FROM t4 ORDER BY x DESC ) } integer 3
1802 5 { ( SELECT x FROM t4 ORDER BY y DESC ) } integer 2
1803 6 { ( SELECT y FROM t4 ORDER BY y DESC ) } text two
1804
1805 7 { ( SELECT sum(x) FROM t4 ) } integer 6
1806 8 { ( SELECT group_concat(y,'') FROM t4 ) } text onetwothree
1807 9 { ( SELECT max(x) FROM t4 WHERE y LIKE '___') } integer 2
1808
1809 } {
1810 do_expr_test e_expr-36.3.$tn $expr $restype $resval
1811 }
1812
1813 # EVIDENCE-OF: R-25492-41572 If the SELECT yields no rows, then the
1814 # value of the expression is NULL.
1815 #
1816 foreach {tn expr} {
1817 1 { ( SELECT x FROM t4 WHERE x>3 ORDER BY x ) }
1818 2 { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y ) }
1819 } {
1820 do_expr_test e_expr-36.4.$tn $expr null {}
1821 }
1822
1823
1824 finish_test
1825
OLDNEW
« no previous file with comments | « third_party/sqlite/src/test/e_delete.test ('k') | third_party/sqlite/src/test/e_fkey.test » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698