blob: 98148dace84a35bb0b7f72d50d6996dc7290e666 [file] [log] [blame]
dan784141e2010-07-17 18:44:49 +00001# 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
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18source $testdir/malloc_common.tcl
19
20# Set up three global variables:
21#
22# ::opname An array mapping from SQL operator to an easy to parse
23# name. The names are used as part of test case names.
24#
25# ::opprec An array mapping from SQL operator to a numeric
26# precedence value. Operators that group more tightly
27# have lower numeric precedences.
28#
29# ::oplist A list of all SQL operators supported by SQLite.
30#
31foreach {op opn} {
32 || cat * mul / div % mod + add
33 - sub << lshift >> rshift & bitand | bitor
34 < less <= lesseq > more >= moreeq = eq1
35 == eq2 <> ne1 != ne2 IS is LIKE like
36 GLOB glob AND and OR or MATCH match REGEXP regexp
37 {IS NOT} isnt
38} {
39 set ::opname($op) $opn
40}
41set oplist [list]
42foreach {prec opl} {
43 1 ||
44 2 {* / %}
45 3 {+ -}
46 4 {<< >> & |}
47 5 {< <= > >=}
48 6 {= == != <> IS {IS NOT} LIKE GLOB MATCH REGEXP}
49 7 AND
50 8 OR
51} {
52 foreach op $opl {
53 set ::opprec($op) $prec
54 lappend oplist $op
55 }
56}
57
58
59# Hook in definitions of MATCH and REGEX. The following implementations
60# cause MATCH and REGEX to behave similarly to the == operator.
61#
62proc matchfunc {a b} { return [expr {$a==$b}] }
63proc regexfunc {a b} { return [expr {$a==$b}] }
64db func match -argcount 2 matchfunc
65db func regexp -argcount 2 regexfunc
66
67#-------------------------------------------------------------------------
68# Test cases e_expr-1.* attempt to verify that all binary operators listed
69# in the documentation exist and that the relative precedences of the
70# operators are also as the documentation suggests.
71#
72# EVIDENCE-OF: R-15514-65163 SQLite understands the following binary
73# operators, in order from highest to lowest precedence: || * / % + -
74# << >> & | < <= > >= = == != <> IS IS
75# NOT IN LIKE GLOB MATCH REGEXP AND OR
76#
77# EVIDENCE-OF: R-38759-38789 Operators IS and IS NOT have the same
78# precedence as =.
79#
80
dan784141e2010-07-17 18:44:49 +000081unset -nocomplain untested
82foreach op1 $oplist {
83 foreach op2 $oplist {
84 set untested($op1,$op2) 1
85 foreach {tn A B C} {
86 1 22 45 66
87 2 0 0 0
88 3 0 0 1
89 4 0 1 0
90 5 0 1 1
91 6 1 0 0
92 7 1 0 1
93 8 1 1 0
94 9 1 1 1
95 10 5 6 1
96 11 1 5 6
97 12 1 5 5
98 13 5 5 1
99
100 14 5 2 1
101 15 1 4 1
102 16 -1 0 1
103 17 0 1 -1
104
105 } {
106 set testname "e_expr-1.$opname($op1).$opname($op2).$tn"
107
108 # If $op2 groups more tightly than $op1, then the result
109 # of executing $sql1 whould be the same as executing $sql3.
110 # If $op1 groups more tightly, or if $op1 and $op2 have
111 # the same precedence, then executing $sql1 should return
112 # the same value as $sql2.
113 #
114 set sql1 "SELECT $A $op1 $B $op2 $C"
115 set sql2 "SELECT ($A $op1 $B) $op2 $C"
116 set sql3 "SELECT $A $op1 ($B $op2 $C)"
117
118 set a2 [db one $sql2]
119 set a3 [db one $sql3]
120
121 do_execsql_test $testname $sql1 [list [
danbd0c0012010-07-19 05:27:17 +0000122 if {$opprec($op2) < $opprec($op1)} {set a3} {set a2}
dan784141e2010-07-17 18:44:49 +0000123 ]]
dan784141e2010-07-17 18:44:49 +0000124 if {$a2 != $a3} { unset -nocomplain untested($op1,$op2) }
125 }
126 }
127}
128
129foreach op {* AND OR + || & |} { unset untested($op,$op) }
130unset untested(+,-) ;# Since (a+b)-c == a+(b-c)
131unset untested(*,<<) ;# Since (a*b)<<c == a*(b<<c)
132
133do_test e_expr-1.1 { array names untested } {}
134
135# At one point, test 1.2.2 was failing. Instead of the correct result, it
136# was returning {1 1 0}. This would seem to indicate that LIKE has the
137# same precedence as '<'. Which is incorrect. It has lower precedence.
138#
139do_execsql_test e_expr-1.2.1 {
140 SELECT 0 < 2 LIKE 1, (0 < 2) LIKE 1, 0 < (2 LIKE 1)
141} {1 1 0}
142do_execsql_test e_expr-1.2.2 {
143 SELECT 0 LIKE 0 < 2, (0 LIKE 0) < 2, 0 LIKE (0 < 2)
144} {0 1 0}
145
146# Showing that LIKE and == have the same precedence
147#
148do_execsql_test e_expr-1.2.3 {
149 SELECT 2 LIKE 2 == 1, (2 LIKE 2) == 1, 2 LIKE (2 == 1)
150} {1 1 0}
151do_execsql_test e_expr-1.2.4 {
152 SELECT 2 == 2 LIKE 1, (2 == 2) LIKE 1, 2 == (2 LIKE 1)
153} {1 1 0}
154
155# Showing that < groups more tightly than == (< has higher precedence).
156#
157do_execsql_test e_expr-1.2.5 {
158 SELECT 0 < 2 == 1, (0 < 2) == 1, 0 < (2 == 1)
159} {1 1 0}
160do_execsql_test e_expr-1.6 {
161 SELECT 0 == 0 < 2, (0 == 0) < 2, 0 == (0 < 2)
162} {0 1 0}
163
dan784141e2010-07-17 18:44:49 +0000164#-------------------------------------------------------------------------
165# Check that the four unary prefix operators mentioned in the
166# documentation exist.
167#
168# EVIDENCE-OF: R-13958-53419 Supported unary prefix operators are these:
169# - + ~ NOT
170#
171do_execsql_test e_expr-2.1 { SELECT - 10 } {-10}
172do_execsql_test e_expr-2.2 { SELECT + 10 } {10}
173do_execsql_test e_expr-2.3 { SELECT ~ 10 } {-11}
174do_execsql_test e_expr-2.4 { SELECT NOT 10 } {0}
175
176#-------------------------------------------------------------------------
177# Tests for the two statements made regarding the unary + operator.
178#
179# EVIDENCE-OF: R-53670-03373 The unary operator + is a no-op.
180#
181# EVIDENCE-OF: R-19480-30968 It can be applied to strings, numbers,
182# blobs or NULL and it always returns a result with the same value as
183# the operand.
184#
185foreach {tn literal type} {
186 1 'helloworld' text
187 2 45 integer
188 3 45.2 real
189 4 45.0 real
190 5 X'ABCDEF' blob
191 6 NULL null
192} {
193 set sql " SELECT quote( + $literal ), typeof( + $literal) "
194 do_execsql_test e_expr-3.$tn $sql [list $literal $type]
195}
196
197#-------------------------------------------------------------------------
198# Check that both = and == are both acceptable as the "equals" operator.
199# Similarly, either != or <> work as the not-equals operator.
200#
201# EVIDENCE-OF: R-03679-60639 Equals can be either = or ==.
202#
203# EVIDENCE-OF: R-30082-38996 The non-equals operator can be either != or
204# <>.
205#
206foreach {tn literal different} {
207 1 'helloworld' '12345'
208 2 22 23
209 3 'xyz' X'78797A'
210 4 X'78797A00' 'xyz'
211} {
212 do_execsql_test e_expr-4.$tn "
213 SELECT $literal = $literal, $literal == $literal,
214 $literal = $different, $literal == $different,
215 $literal = NULL, $literal == NULL,
216 $literal != $literal, $literal <> $literal,
217 $literal != $different, $literal <> $different,
218 $literal != NULL, $literal != NULL
219
220 " {1 1 0 0 {} {} 0 0 1 1 {} {}}
221}
222
223#-------------------------------------------------------------------------
224# Test the || operator.
225#
226# EVIDENCE-OF: R-44409-62641 The || operator is "concatenate" - it joins
227# together the two strings of its operands.
228#
229foreach {tn a b} {
230 1 'helloworld' '12345'
231 2 22 23
232} {
233 set as [db one "SELECT $a"]
234 set bs [db one "SELECT $b"]
235
236 do_execsql_test e_expr-5.$tn "SELECT $a || $b" [list "${as}${bs}"]
237}
238
239#-------------------------------------------------------------------------
240# Test the % operator.
241#
242# EVIDENCE-OF: R-08914-63790 The operator % outputs the value of its
243# left operand modulo its right operand.
244#
245do_execsql_test e_expr-6.1 {SELECT 72%5} {2}
246do_execsql_test e_expr-6.2 {SELECT 72%-5} {2}
247do_execsql_test e_expr-6.3 {SELECT -72%-5} {-2}
248do_execsql_test e_expr-6.4 {SELECT -72%5} {-2}
249
250#-------------------------------------------------------------------------
251# Test that the results of all binary operators are either numeric or
252# NULL, except for the || operator, which may evaluate to either a text
253# value or NULL.
254#
255# EVIDENCE-OF: R-20665-17792 The result of any binary operator is either
256# a numeric value or NULL, except for the || concatenation operator
257# which always evaluates to either NULL or a text value.
258#
259set literals {
260 1 'abc' 2 'hexadecimal' 3 ''
261 4 123 5 -123 6 0
262 7 123.4 8 0.0 9 -123.4
263 10 X'ABCDEF' 11 X'' 12 X'0000'
264 13 NULL
265}
266foreach op $oplist {
267 foreach {n1 rhs} $literals {
268 foreach {n2 lhs} $literals {
269
270 set t [db one " SELECT typeof($lhs $op $rhs) "]
271 do_test e_expr-7.$opname($op).$n1.$n2 {
272 expr {
273 ($op=="||" && ($t == "text" || $t == "null"))
274 || ($op!="||" && ($t == "integer" || $t == "real" || $t == "null"))
275 }
276 } 1
277
278 }}
279}
280
281#-------------------------------------------------------------------------
282# Test the IS and IS NOT operators.
283#
284# EVIDENCE-OF: R-24731-45773 The IS and IS NOT operators work like = and
285# != except when one or both of the operands are NULL.
286#
287# EVIDENCE-OF: R-06325-15315 In this case, if both operands are NULL,
288# then the IS operator evaluates to 1 (true) and the IS NOT operator
289# evaluates to 0 (false).
290#
291# EVIDENCE-OF: R-19812-36779 If one operand is NULL and the other is
292# not, then the IS operator evaluates to 0 (false) and the IS NOT
293# operator is 1 (true).
294#
295# EVIDENCE-OF: R-61975-13410 It is not possible for an IS or IS NOT
296# expression to evaluate to NULL.
297#
298do_execsql_test e_expr-8.1.1 { SELECT NULL IS NULL } {1}
299do_execsql_test e_expr-8.1.2 { SELECT 'ab' IS NULL } {0}
300do_execsql_test e_expr-8.1.3 { SELECT NULL IS 'ab' } {0}
301do_execsql_test e_expr-8.1.4 { SELECT 'ab' IS 'ab' } {1}
302do_execsql_test e_expr-8.1.5 { SELECT NULL == NULL } {{}}
303do_execsql_test e_expr-8.1.6 { SELECT 'ab' == NULL } {{}}
304do_execsql_test e_expr-8.1.7 { SELECT NULL == 'ab' } {{}}
305do_execsql_test e_expr-8.1.8 { SELECT 'ab' == 'ab' } {1}
306do_execsql_test e_expr-8.1.9 { SELECT NULL IS NOT NULL } {0}
307do_execsql_test e_expr-8.1.10 { SELECT 'ab' IS NOT NULL } {1}
308do_execsql_test e_expr-8.1.11 { SELECT NULL IS NOT 'ab' } {1}
309do_execsql_test e_expr-8.1.12 { SELECT 'ab' IS NOT 'ab' } {0}
310do_execsql_test e_expr-8.1.13 { SELECT NULL != NULL } {{}}
311do_execsql_test e_expr-8.1.14 { SELECT 'ab' != NULL } {{}}
312do_execsql_test e_expr-8.1.15 { SELECT NULL != 'ab' } {{}}
313do_execsql_test e_expr-8.1.16 { SELECT 'ab' != 'ab' } {0}
314
315foreach {n1 rhs} $literals {
316 foreach {n2 lhs} $literals {
317 if {$rhs!="NULL" && $lhs!="NULL"} {
318 set eq [execsql "SELECT $lhs = $rhs, $lhs != $rhs"]
319 } else {
320 set eq [list [expr {$lhs=="NULL" && $rhs=="NULL"}] \
321 [expr {$lhs!="NULL" || $rhs!="NULL"}]
322 ]
323 }
324 set test e_expr-8.2.$n1.$n2
325 do_execsql_test $test.1 "SELECT $lhs IS $rhs, $lhs IS NOT $rhs" $eq
326 do_execsql_test $test.2 "
327 SELECT ($lhs IS $rhs) IS NULL, ($lhs IS NOT $rhs) IS NULL
328 " {0 0}
329 }
330}
331
danc29486a2010-08-13 18:41:09 +0000332#-------------------------------------------------------------------------
333# Run some tests on the COLLATE "unary postfix operator".
334#
335# This collation sequence reverses both arguments before using
336# [string compare] to compare them. For example, when comparing the
337# strings 'one' and 'four', return the result of:
338#
339# string compare eno ruof
340#
341proc reverse_str {zStr} {
342 set out ""
343 foreach c [split $zStr {}] { set out "${c}${out}" }
344 set out
345}
346proc reverse_collate {zLeft zRight} {
347 string compare [reverse_str $zLeft] [reverse_str $zRight]
348}
349db collate reverse reverse_collate
350
351# EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix
352# operator that assigns a collating sequence to an expression.
353#
354# EVIDENCE-OF: R-23441-22541 The COLLATE operator has a higher
355# precedence (binds more tightly) than any prefix unary operator or any
356# binary operator.
357#
358do_execsql_test e_expr-9.1 { SELECT 'abcd' < 'bbbb' COLLATE reverse } 0
359do_execsql_test e_expr-9.2 { SELECT ('abcd' < 'bbbb') COLLATE reverse } 1
360do_execsql_test e_expr-9.3 { SELECT 'abcd' <= 'bbbb' COLLATE reverse } 0
361do_execsql_test e_expr-9.4 { SELECT ('abcd' <= 'bbbb') COLLATE reverse } 1
362
363do_execsql_test e_expr-9.5 { SELECT 'abcd' > 'bbbb' COLLATE reverse } 1
364do_execsql_test e_expr-9.6 { SELECT ('abcd' > 'bbbb') COLLATE reverse } 0
365do_execsql_test e_expr-9.7 { SELECT 'abcd' >= 'bbbb' COLLATE reverse } 1
366do_execsql_test e_expr-9.8 { SELECT ('abcd' >= 'bbbb') COLLATE reverse } 0
367
368do_execsql_test e_expr-9.10 { SELECT 'abcd' = 'ABCD' COLLATE nocase } 1
369do_execsql_test e_expr-9.11 { SELECT ('abcd' = 'ABCD') COLLATE nocase } 0
370do_execsql_test e_expr-9.12 { SELECT 'abcd' == 'ABCD' COLLATE nocase } 1
371do_execsql_test e_expr-9.13 { SELECT ('abcd' == 'ABCD') COLLATE nocase } 0
372do_execsql_test e_expr-9.14 { SELECT 'abcd' IS 'ABCD' COLLATE nocase } 1
373do_execsql_test e_expr-9.15 { SELECT ('abcd' IS 'ABCD') COLLATE nocase } 0
374
375do_execsql_test e_expr-9.16 { SELECT 'abcd' != 'ABCD' COLLATE nocase } 0
376do_execsql_test e_expr-9.17 { SELECT ('abcd' != 'ABCD') COLLATE nocase } 1
377do_execsql_test e_expr-9.18 { SELECT 'abcd' <> 'ABCD' COLLATE nocase } 0
378do_execsql_test e_expr-9.19 { SELECT ('abcd' <> 'ABCD') COLLATE nocase } 1
379do_execsql_test e_expr-9.20 { SELECT 'abcd' IS NOT 'ABCD' COLLATE nocase } 0
380do_execsql_test e_expr-9.21 { SELECT ('abcd' IS NOT 'ABCD') COLLATE nocase } 1
381
382do_execsql_test e_expr-9.22 {
383 SELECT 'bbb' BETWEEN 'AAA' AND 'CCC' COLLATE nocase
384} 1
385do_execsql_test e_expr-9.23 {
386 SELECT ('bbb' BETWEEN 'AAA' AND 'CCC') COLLATE nocase
387} 0
388
389# EVIDENCE-OF: R-58731-25439 The collating sequence set by the COLLATE
390# operator overrides the collating sequence determined by the COLLATE
391# clause in a table column definition.
392#
393do_execsql_test e_expr-9.24 {
394 CREATE TABLE t24(a COLLATE NOCASE, b);
395 INSERT INTO t24 VALUES('aaa', 1);
396 INSERT INTO t24 VALUES('bbb', 2);
397 INSERT INTO t24 VALUES('ccc', 3);
398} {}
399do_execsql_test e_expr-9.25 { SELECT 'BBB' = a FROM t24 } {0 1 0}
400do_execsql_test e_expr-9.25 { SELECT a = 'BBB' FROM t24 } {0 1 0}
401do_execsql_test e_expr-9.25 { SELECT 'BBB' = a COLLATE binary FROM t24 } {0 0 0}
402do_execsql_test e_expr-9.25 { SELECT a COLLATE binary = 'BBB' FROM t24 } {0 0 0}
403
404#-------------------------------------------------------------------------
405# Test statements related to literal values.
406#
407# EVIDENCE-OF: R-31536-32008 Literal values may be integers, floating
408# point numbers, strings, BLOBs, or NULLs.
409#
410do_execsql_test e_expr-10.1.1 { SELECT typeof(5) } {integer}
411do_execsql_test e_expr-10.1.2 { SELECT typeof(5.1) } {real}
412do_execsql_test e_expr-10.1.3 { SELECT typeof('5.1') } {text}
413do_execsql_test e_expr-10.1.4 { SELECT typeof(X'ABCD') } {blob}
414do_execsql_test e_expr-10.1.5 { SELECT typeof(NULL) } {null}
415
416# EVIDENCE-OF: R-26921-59298 Scientific notation is supported for
417# floating point literal values.
418#
419do_execsql_test e_expr-10.2.1 { SELECT typeof(3.4e-02) } {real}
420do_execsql_test e_expr-10.2.2 { SELECT typeof(3e+5) } {real}
421do_execsql_test e_expr-10.2.3 { SELECT 3.4e-02 } {0.034}
422do_execsql_test e_expr-10.2.4 { SELECT 3e+4 } {30000.0}
423
424# EVIDENCE-OF: R-35229-17830 A string constant is formed by enclosing
425# the string in single quotes (').
426#
427# EVIDENCE-OF: R-07100-06606 A single quote within the string can be
428# encoded by putting two single quotes in a row - as in Pascal.
429#
430do_execsql_test e_expr-10.3.1 { SELECT 'is not' } {{is not}}
431do_execsql_test e_expr-10.3.2 { SELECT typeof('is not') } {text}
432do_execsql_test e_expr-10.3.3 { SELECT 'isn''t' } {isn't}
433do_execsql_test e_expr-10.3.4 { SELECT typeof('isn''t') } {text}
434
435# EVIDENCE-OF: R-09593-03321 BLOB literals are string literals
436# containing hexadecimal data and preceded by a single "x" or "X"
437# character.
438#
439# EVIDENCE-OF: R-39344-59787 For example: X'53514C697465'
440#
441do_execsql_test e_expr-10.4.1 { SELECT typeof(X'0123456789ABCDEF') } blob
442do_execsql_test e_expr-10.4.2 { SELECT typeof(x'0123456789ABCDEF') } blob
443do_execsql_test e_expr-10.4.3 { SELECT typeof(X'0123456789abcdef') } blob
444do_execsql_test e_expr-10.4.4 { SELECT typeof(x'0123456789abcdef') } blob
445do_execsql_test e_expr-10.4.5 { SELECT typeof(X'53514C697465') } blob
446
447# EVIDENCE-OF: R-23914-51476 A literal value can also be the token
448# "NULL".
danc7d61562010-08-14 12:25:18 +0000449#
danc29486a2010-08-13 18:41:09 +0000450do_execsql_test e_expr-10.5.1 { SELECT NULL } {{}}
451do_execsql_test e_expr-10.5.2 { SELECT typeof(NULL) } {null}
452
danc7d61562010-08-14 12:25:18 +0000453#-------------------------------------------------------------------------
454# Test statements related to bound parameters
455#
456
457proc parameter_test {tn sql params result} {
458 set stmt [sqlite3_prepare_v2 db $sql -1]
459
460 foreach {number name} $params {
461 set nm [sqlite3_bind_parameter_name $stmt $number]
462 do_test $tn.name.$number [list set {} $nm] $name
463 sqlite3_bind_int $stmt $number [expr -1 * $number]
464 }
465
466 sqlite3_step $stmt
467
468 set res [list]
469 for {set i 0} {$i < [sqlite3_column_count $stmt]} {incr i} {
470 lappend res [sqlite3_column_text $stmt $i]
471 }
472
473 set rc [sqlite3_finalize $stmt]
474 do_test $tn.rc [list set {} $rc] SQLITE_OK
475 do_test $tn.res [list set {} $res] $result
476}
477
478# EVIDENCE-OF: R-33509-39458 A question mark followed by a number NNN
479# holds a spot for the NNN-th parameter. NNN must be between 1 and
480# SQLITE_MAX_VARIABLE_NUMBER.
481#
482set mvn $SQLITE_MAX_VARIABLE_NUMBER
483parameter_test e_expr-11.1 "
484 SELECT ?1, ?123, ?$SQLITE_MAX_VARIABLE_NUMBER, ?123, ?4
485" "1 ?1 123 ?123 $mvn ?$mvn 4 ?4" "-1 -123 -$mvn -123 -4"
486
487set errmsg "variable number must be between ?1 and ?$SQLITE_MAX_VARIABLE_NUMBER"
488foreach {tn param_number} [list \
489 2 0 \
490 3 [expr $SQLITE_MAX_VARIABLE_NUMBER+1] \
491 4 [expr $SQLITE_MAX_VARIABLE_NUMBER+2] \
492 5 12345678903456789034567890234567890 \
493 6 2147483648 \
494 7 2147483649 \
495 8 4294967296 \
496 9 4294967297 \
497 10 9223372036854775808 \
498 11 9223372036854775809 \
499 12 18446744073709551616 \
500 13 18446744073709551617 \
501] {
502 do_catchsql_test e_expr-11.1.$tn "SELECT ?$param_number" [list 1 $errmsg]
503}
504
505# EVIDENCE-OF: R-33670-36097 A question mark that is not followed by a
506# number creates a parameter with a number one greater than the largest
507# parameter number already assigned.
508#
509# EVIDENCE-OF: R-42938-07030 If this means the parameter number is
510# greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error.
511#
512parameter_test e_expr-11.2.1 "SELECT ?" {1 {}} -1
513parameter_test e_expr-11.2.2 "SELECT ?, ?" {1 {} 2 {}} {-1 -2}
514parameter_test e_expr-11.2.3 "SELECT ?5, ?" {5 ?5 6 {}} {-5 -6}
515parameter_test e_expr-11.2.4 "SELECT ?, ?5" {1 {} 5 ?5} {-1 -5}
516parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?" {
517 1 {} 456 ?456 457 {}
518} {-1 -456 -457}
519parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?4, ?" {
520 1 {} 456 ?456 4 ?4 457 {}
521} {-1 -456 -4 -457}
522foreach {tn sql} [list \
523 1 "SELECT ?$mvn, ?" \
524 2 "SELECT ?[expr $mvn-5], ?, ?, ?, ?, ?, ?" \
525 3 "SELECT ?[expr $mvn], ?5, ?6, ?" \
526] {
527 do_catchsql_test e_expr-11.3.$tn $sql [list 1 {too many SQL variables}]
528}
529
530# EVIDENCE-OF: R-11620-22743 A colon followed by an identifier name
531# holds a spot for a named parameter with the name :AAAA.
532#
533# Identifiers in SQLite consist of alphanumeric, '_' and '$' characters,
534# and any UTF characters with codepoints larger than 127 (non-ASCII
535# characters).
536#
537parameter_test e_expr-11.2.1 {SELECT :AAAA} {1 :AAAA} -1
538parameter_test e_expr-11.2.2 {SELECT :123} {1 :123} -1
539parameter_test e_expr-11.2.3 {SELECT :__} {1 :__} -1
540parameter_test e_expr-11.2.4 {SELECT :_$_} {1 :_$_} -1
541parameter_test e_expr-11.2.5 "
542 SELECT :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
543" "1 :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
544parameter_test e_expr-11.2.6 "SELECT :\u0080" "1 :\u0080" -1
545
546# EVIDENCE-OF: R-49783-61279 An "at" sign works exactly like a colon,
547# except that the name of the parameter created is @AAAA.
548#
549parameter_test e_expr-11.3.1 {SELECT @AAAA} {1 @AAAA} -1
550parameter_test e_expr-11.3.2 {SELECT @123} {1 @123} -1
551parameter_test e_expr-11.3.3 {SELECT @__} {1 @__} -1
552parameter_test e_expr-11.3.4 {SELECT @_$_} {1 @_$_} -1
553parameter_test e_expr-11.3.5 "
554 SELECT @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
555" "1 @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
556parameter_test e_expr-11.3.6 "SELECT @\u0080" "1 @\u0080" -1
557
558# EVIDENCE-OF: R-62610-51329 A dollar-sign followed by an identifier
559# name also holds a spot for a named parameter with the name $AAAA.
560#
561# EVIDENCE-OF: R-55025-21042 The identifier name in this case can
562# include one or more occurrences of "::" and a suffix enclosed in
563# "(...)" containing any text at all.
564#
565# Note: Looks like an identifier cannot consist entirely of "::"
566# characters or just a suffix. Also, the other named variable characters
567# (: and @) work the same way internally. Why not just document it that way?
568#
569parameter_test e_expr-11.4.1 {SELECT $AAAA} {1 $AAAA} -1
570parameter_test e_expr-11.4.2 {SELECT $123} {1 $123} -1
571parameter_test e_expr-11.4.3 {SELECT $__} {1 $__} -1
572parameter_test e_expr-11.4.4 {SELECT $_$_} {1 $_$_} -1
573parameter_test e_expr-11.4.5 "
574 SELECT \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
575" "1 \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
576parameter_test e_expr-11.4.6 "SELECT \$\u0080" "1 \$\u0080" -1
577
578parameter_test e_expr-11.5.1 {SELECT $::::a(++--++)} {1 $::::a(++--++)} -1
579parameter_test e_expr-11.5.2 {SELECT $::a()} {1 $::a()} -1
580parameter_test e_expr-11.5.3 {SELECT $::1(::#$)} {1 $::1(::#$)} -1
581
582# EVIDENCE-OF: R-11370-04520 Named parameters are also numbered. The
583# number assigned is one greater than the largest parameter number
584# already assigned.
585#
586# EVIDENCE-OF: R-42620-22184 If this means the parameter would be
587# assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is an
588# error.
589#
590parameter_test e_expr-11.6.1 "SELECT ?, @abc" {1 {} 2 @abc} {-1 -2}
591parameter_test e_expr-11.6.2 "SELECT ?123, :a1" {123 ?123 124 :a1} {-123 -124}
592parameter_test e_expr-11.6.3 {SELECT $a, ?8, ?, $b, ?2, $c} {
593 1 $a 8 ?8 9 {} 10 $b 2 ?2 11 $c
594} {-1 -8 -9 -10 -2 -11}
595foreach {tn sql} [list \
596 1 "SELECT ?$mvn, \$::a" \
597 2 "SELECT ?$mvn, ?4, @a1" \
598 3 "SELECT ?[expr $mvn-2], :bag, @123, \$x" \
599] {
600 do_catchsql_test e_expr-11.7.$tn $sql [list 1 {too many SQL variables}]
601}
602
dan1afca9b2010-08-14 18:32:23 +0000603# EVIDENCE-OF: R-14068-49671 Parameters that are not assigned values
604# using sqlite3_bind() are treated as NULL.
605#
606do_test e_expr-11.7.1 {
607 set stmt [sqlite3_prepare_v2 db { SELECT ?, :a, @b, $d } -1]
608 sqlite3_step $stmt
609
610 list [sqlite3_column_type $stmt 0] \
611 [sqlite3_column_type $stmt 1] \
612 [sqlite3_column_type $stmt 2] \
613 [sqlite3_column_type $stmt 3]
614} {NULL NULL NULL NULL}
615do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK
616
dan994e9402010-08-16 18:26:30 +0000617#-------------------------------------------------------------------------
618# "Test" the syntax diagrams in lang_expr.html.
619#
620# EVIDENCE-OF: R-04177-20688 -- syntax diagram signed-number
621#
622do_execsql_test e_expr-12.1.1 { SELECT 0, +0, -0 } {0 0 0}
623do_execsql_test e_expr-12.1.2 { SELECT 1, +1, -1 } {1 1 -1}
624do_execsql_test e_expr-12.1.3 { SELECT 2, +2, -2 } {2 2 -2}
625do_execsql_test e_expr-12.1.4 {
626 SELECT 1.4, +1.4, -1.4
627} {1.4 1.4 -1.4}
628do_execsql_test e_expr-12.1.5 {
629 SELECT 1.5e+5, +1.5e+5, -1.5e+5
630} {150000.0 150000.0 -150000.0}
631do_execsql_test e_expr-12.1.6 {
632 SELECT 0.0001, +0.0001, -0.0001
633} {0.0001 0.0001 -0.0001}
634
635# EVIDENCE-OF: R-30740-26723 -- syntax diagram literal-value
636#
637set sqlite_current_time 1
638do_execsql_test e_expr-12.2.1 {SELECT 123} {123}
639do_execsql_test e_expr-12.2.2 {SELECT 123.4e05} {12340000.0}
640do_execsql_test e_expr-12.2.3 {SELECT 'abcde'} {abcde}
641do_execsql_test e_expr-12.2.4 {SELECT X'414243'} {ABC}
642do_execsql_test e_expr-12.2.5 {SELECT NULL} {{}}
643do_execsql_test e_expr-12.2.6 {SELECT CURRENT_TIME} {00:00:01}
644do_execsql_test e_expr-12.2.7 {SELECT CURRENT_DATE} {1970-01-01}
645do_execsql_test e_expr-12.2.8 {SELECT CURRENT_TIMESTAMP} {{1970-01-01 00:00:01}}
646set sqlite_current_time 0
647
648# EVIDENCE-OF: R-57598-59332 -- syntax diagram expr
649#
650file delete -force test.db2
651execsql {
652 ATTACH 'test.db2' AS dbname;
653 CREATE TABLE dbname.tblname(cname);
654}
655
656proc glob {args} {return 1}
657db function glob glob
658db function match glob
659db function regexp glob
660
661foreach {tn expr} {
662 1 123
663 2 123.4e05
664 3 'abcde'
665 4 X'414243'
666 5 NULL
667 6 CURRENT_TIME
668 7 CURRENT_DATE
669 8 CURRENT_TIMESTAMP
670
671 9 ?
672 10 ?123
673 11 @hello
674 12 :world
675 13 $tcl
676 14 $tcl(array)
677
678 15 cname
679 16 tblname.cname
680 17 dbname.tblname.cname
681
682 18 "+ EXPR"
683 19 "- EXPR"
684 20 "NOT EXPR"
685 21 "~ EXPR"
686
687 22 "EXPR1 || EXPR2"
688 23 "EXPR1 * EXPR2"
689 24 "EXPR1 / EXPR2"
690 25 "EXPR1 % EXPR2"
691 26 "EXPR1 + EXPR2"
692 27 "EXPR1 - EXPR2"
693 28 "EXPR1 << EXPR2"
694 29 "EXPR1 >> EXPR2"
695 30 "EXPR1 & EXPR2"
696 31 "EXPR1 | EXPR2"
697 32 "EXPR1 < EXPR2"
698 33 "EXPR1 <= EXPR2"
699 34 "EXPR1 > EXPR2"
700 35 "EXPR1 >= EXPR2"
701 36 "EXPR1 = EXPR2"
702 37 "EXPR1 == EXPR2"
703 38 "EXPR1 != EXPR2"
704 39 "EXPR1 <> EXPR2"
705 40 "EXPR1 IS EXPR2"
706 41 "EXPR1 IS NOT EXPR2"
707 42 "EXPR1 AND EXPR2"
708 43 "EXPR1 OR EXPR2"
709
710 44 "count(*)"
711 45 "count(DISTINCT EXPR)"
712 46 "substr(EXPR, 10, 20)"
713 47 "changes()"
714
715 48 "( EXPR )"
716
717 49 "CAST ( EXPR AS integer )"
718 50 "CAST ( EXPR AS 'abcd' )"
719 51 "CAST ( EXPR AS 'ab$ $cd' )"
720
721 52 "EXPR COLLATE nocase"
722 53 "EXPR COLLATE binary"
723
724 54 "EXPR1 LIKE EXPR2"
725 55 "EXPR1 LIKE EXPR2 ESCAPE EXPR"
726 56 "EXPR1 GLOB EXPR2"
727 57 "EXPR1 GLOB EXPR2 ESCAPE EXPR"
728 58 "EXPR1 REGEXP EXPR2"
729 59 "EXPR1 REGEXP EXPR2 ESCAPE EXPR"
730 60 "EXPR1 MATCH EXPR2"
731 61 "EXPR1 MATCH EXPR2 ESCAPE EXPR"
732 62 "EXPR1 NOT LIKE EXPR2"
733 63 "EXPR1 NOT LIKE EXPR2 ESCAPE EXPR"
734 64 "EXPR1 NOT GLOB EXPR2"
735 65 "EXPR1 NOT GLOB EXPR2 ESCAPE EXPR"
736 66 "EXPR1 NOT REGEXP EXPR2"
737 67 "EXPR1 NOT REGEXP EXPR2 ESCAPE EXPR"
738 68 "EXPR1 NOT MATCH EXPR2"
739 69 "EXPR1 NOT MATCH EXPR2 ESCAPE EXPR"
740
741 70 "EXPR ISNULL"
742 71 "EXPR NOTNULL"
743 72 "EXPR NOT NULL"
744
745 73 "EXPR1 IS EXPR2"
746 74 "EXPR1 IS NOT EXPR2"
747
748 75 "EXPR NOT BETWEEN EXPR1 AND EXPR2"
749 76 "EXPR BETWEEN EXPR1 AND EXPR2"
750
751 77 "EXPR NOT IN (SELECT cname FROM tblname)"
752 78 "EXPR NOT IN (1)"
753 79 "EXPR NOT IN (1, 2, 3)"
754 80 "EXPR NOT IN tblname"
755 81 "EXPR NOT IN dbname.tblname"
756 82 "EXPR IN (SELECT cname FROM tblname)"
757 83 "EXPR IN (1)"
758 84 "EXPR IN (1, 2, 3)"
759 85 "EXPR IN tblname"
760 86 "EXPR IN dbname.tblname"
761
762 87 "EXISTS (SELECT cname FROM tblname)"
763 88 "NOT EXISTS (SELECT cname FROM tblname)"
764
765 89 "CASE EXPR WHEN EXPR1 THEN EXPR2 ELSE EXPR END"
766 90 "CASE EXPR WHEN EXPR1 THEN EXPR2 END"
767 91 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END"
768 92 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END"
769 93 "CASE WHEN EXPR1 THEN EXPR2 ELSE EXPR END"
770 94 "CASE WHEN EXPR1 THEN EXPR2 END"
771 95 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END"
772 96 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END"
773} {
774
775 # If the expression string being parsed contains "EXPR2", then replace
776 # string "EXPR1" and "EXPR2" with arbitrary SQL expressions. If it
777 # contains "EXPR", then replace EXPR with an arbitrary SQL expression.
778 #
779 set elist [list $expr]
780 if {[string match *EXPR2* $expr]} {
781 set elist [list]
782 foreach {e1 e2} { cname "34+22" } {
783 lappend elist [string map [list EXPR1 $e1 EXPR2 $e2] $expr]
784 }
785 }
786 if {[string match *EXPR* $expr]} {
787 set elist2 [list]
788 foreach el $elist {
789 foreach e { cname "34+22" } {
790 lappend elist2 [string map [list EXPR $e] $el]
791 }
792 }
793 set elist $elist2
794 }
795
796 set x 0
797 foreach e $elist {
798 incr x
799 do_test e_expr-12.3.$tn.$x {
800 set rc [catch { execsql "SELECT $e FROM tblname" } msg]
801 } {0}
802 }
803}
804
805# EVIDENCE-OF: R-49462-56079 -- syntax diagram raise-function
806#
807foreach {tn raiseexpr} {
808 1 "RAISE(IGNORE)"
809 2 "RAISE(ROLLBACK, 'error message')"
810 3 "RAISE(ABORT, 'error message')"
811 4 "RAISE(FAIL, 'error message')"
812} {
813 do_execsql_test e_expr-12.4.$tn "
814 CREATE TRIGGER dbname.tr$tn BEFORE DELETE ON tblname BEGIN
815 SELECT $raiseexpr ;
816 END;
817 " {}
818}
819
dan73625ec2010-08-17 16:06:08 +0000820#-------------------------------------------------------------------------
821# Test the statements related to the BETWEEN operator.
822#
823# EVIDENCE-OF: R-40079-54503 The BETWEEN operator is logically
824# equivalent to a pair of comparisons. "x BETWEEN y AND z" is equivalent
825# to "x>=y AND x<=z" except that with BETWEEN, the x expression is
826# only evaluated once.
827#
828db func x x
829proc x {} { incr ::xcount ; return [expr $::x] }
830foreach {tn x expr res nEval} {
831 1 10 "x() >= 5 AND x() <= 15" 1 2
832 2 10 "x() BETWEEN 5 AND 15" 1 1
833
834 3 5 "x() >= 5 AND x() <= 5" 1 2
835 4 5 "x() BETWEEN 5 AND 5" 1 1
836} {
837 do_test e_expr-13.1.$tn {
838 set ::xcount 0
839 set a [execsql "SELECT $expr"]
840 list $::xcount $a
841 } [list $nEval $res]
842}
843
844# EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is
845# the same as the precedence as operators == and != and LIKE and groups
846# left to right.
847#
848# Therefore, BETWEEN groups more tightly than operator "AND", but less
849# so than "<".
850#
851do_execsql_test e_expr-13.2.1 { SELECT 1 == 10 BETWEEN 0 AND 2 } 1
852do_execsql_test e_expr-13.2.2 { SELECT (1 == 10) BETWEEN 0 AND 2 } 1
853do_execsql_test e_expr-13.2.3 { SELECT 1 == (10 BETWEEN 0 AND 2) } 0
854do_execsql_test e_expr-13.2.4 { SELECT 6 BETWEEN 4 AND 8 == 1 } 1
855do_execsql_test e_expr-13.2.5 { SELECT (6 BETWEEN 4 AND 8) == 1 } 1
856do_execsql_test e_expr-13.2.6 { SELECT 6 BETWEEN 4 AND (8 == 1) } 0
857
858do_execsql_test e_expr-13.2.7 { SELECT 5 BETWEEN 0 AND 0 != 1 } 1
859do_execsql_test e_expr-13.2.8 { SELECT (5 BETWEEN 0 AND 0) != 1 } 1
860do_execsql_test e_expr-13.2.9 { SELECT 5 BETWEEN 0 AND (0 != 1) } 0
861do_execsql_test e_expr-13.2.10 { SELECT 1 != 0 BETWEEN 0 AND 2 } 1
862do_execsql_test e_expr-13.2.11 { SELECT (1 != 0) BETWEEN 0 AND 2 } 1
863do_execsql_test e_expr-13.2.12 { SELECT 1 != (0 BETWEEN 0 AND 2) } 0
864
danf5d3df42010-08-21 15:51:05 +0000865do_execsql_test e_expr-13.2.13 { SELECT 1 LIKE 10 BETWEEN 0 AND 2 } 1
866do_execsql_test e_expr-13.2.14 { SELECT (1 LIKE 10) BETWEEN 0 AND 2 } 1
867do_execsql_test e_expr-13.2.15 { SELECT 1 LIKE (10 BETWEEN 0 AND 2) } 0
868do_execsql_test e_expr-13.2.16 { SELECT 6 BETWEEN 4 AND 8 LIKE 1 } 1
869do_execsql_test e_expr-13.2.17 { SELECT (6 BETWEEN 4 AND 8) LIKE 1 } 1
870do_execsql_test e_expr-13.2.18 { SELECT 6 BETWEEN 4 AND (8 LIKE 1) } 0
dan73625ec2010-08-17 16:06:08 +0000871
danf5d3df42010-08-21 15:51:05 +0000872do_execsql_test e_expr-13.2.19 { SELECT 0 AND 0 BETWEEN 0 AND 1 } 0
873do_execsql_test e_expr-13.2.20 { SELECT 0 AND (0 BETWEEN 0 AND 1) } 0
874do_execsql_test e_expr-13.2.21 { SELECT (0 AND 0) BETWEEN 0 AND 1 } 1
875do_execsql_test e_expr-13.2.22 { SELECT 0 BETWEEN -1 AND 1 AND 0 } 0
876do_execsql_test e_expr-13.2.23 { SELECT (0 BETWEEN -1 AND 1) AND 0 } 0
877do_execsql_test e_expr-13.2.24 { SELECT 0 BETWEEN -1 AND (1 AND 0) } 1
dan73625ec2010-08-17 16:06:08 +0000878
danf5d3df42010-08-21 15:51:05 +0000879do_execsql_test e_expr-13.2.25 { SELECT 2 < 3 BETWEEN 0 AND 1 } 1
880do_execsql_test e_expr-13.2.26 { SELECT (2 < 3) BETWEEN 0 AND 1 } 1
881do_execsql_test e_expr-13.2.27 { SELECT 2 < (3 BETWEEN 0 AND 1) } 0
882do_execsql_test e_expr-13.2.28 { SELECT 2 BETWEEN 1 AND 2 < 3 } 0
883do_execsql_test e_expr-13.2.29 { SELECT 2 BETWEEN 1 AND (2 < 3) } 0
884do_execsql_test e_expr-13.2.30 { SELECT (2 BETWEEN 1 AND 2) < 3 } 1
885
886#-------------------------------------------------------------------------
887# Test the statements related to the LIKE and GLOB operators.
888#
889# EVIDENCE-OF: R-16584-60189 The LIKE operator does a pattern matching
890# comparison.
891#
892# EVIDENCE-OF: R-11295-04657 The operand to the right of the LIKE
893# operator contains the pattern and the left hand operand contains the
894# string to match against the pattern.
895#
896do_execsql_test e_expr-14.1.1 { SELECT 'abc%' LIKE 'abcde' } 0
897do_execsql_test e_expr-14.1.2 { SELECT 'abcde' LIKE 'abc%' } 1
898
899# EVIDENCE-OF: R-55406-38524 A percent symbol ("%") in the LIKE pattern
900# matches any sequence of zero or more characters in the string.
901#
902do_execsql_test e_expr-14.2.1 { SELECT 'abde' LIKE 'ab%de' } 1
903do_execsql_test e_expr-14.2.2 { SELECT 'abXde' LIKE 'ab%de' } 1
904do_execsql_test e_expr-14.2.3 { SELECT 'abABCde' LIKE 'ab%de' } 1
905
906# EVIDENCE-OF: R-30433-25443 An underscore ("_") in the LIKE pattern
907# matches any single character in the string.
908#
909do_execsql_test e_expr-14.3.1 { SELECT 'abde' LIKE 'ab_de' } 0
910do_execsql_test e_expr-14.3.2 { SELECT 'abXde' LIKE 'ab_de' } 1
911do_execsql_test e_expr-14.3.3 { SELECT 'abABCde' LIKE 'ab_de' } 0
912
913# EVIDENCE-OF: R-59007-20454 Any other character matches itself or its
914# lower/upper case equivalent (i.e. case-insensitive matching).
915#
916do_execsql_test e_expr-14.4.1 { SELECT 'abc' LIKE 'aBc' } 1
917do_execsql_test e_expr-14.4.2 { SELECT 'aBc' LIKE 'aBc' } 1
918do_execsql_test e_expr-14.4.3 { SELECT 'ac' LIKE 'aBc' } 0
919
920# EVIDENCE-OF: R-23648-58527 SQLite only understands upper/lower case
921# for ASCII characters by default.
922#
923# EVIDENCE-OF: R-04532-11527 The LIKE operator is case sensitive by
924# default for unicode characters that are beyond the ASCII range.
925#
926# EVIDENCE-OF: R-44381-11669 the expression
927# 'a'&nbsp;LIKE&nbsp;'A' is TRUE but
928# '&aelig;'&nbsp;LIKE&nbsp;'&AElig;' is FALSE.
929#
930do_execsql_test e_expr-14.5.1 { SELECT 'A' LIKE 'a' } 1
931do_execsql_test e_expr-14.5.2 "SELECT '\u00c6' LIKE '\u00e6'" 0
932
933# EVIDENCE-OF: R-56683-13731 If the optional ESCAPE clause is present,
934# then the expression following the ESCAPE keyword must evaluate to a
935# string consisting of a single character.
936#
937do_catchsql_test e_expr-14.6.1 {
938 SELECT 'A' LIKE 'a' ESCAPE '12'
939} {1 {ESCAPE expression must be a single character}}
940do_catchsql_test e_expr-14.6.2 {
941 SELECT 'A' LIKE 'a' ESCAPE ''
942} {1 {ESCAPE expression must be a single character}}
943do_catchsql_test e_expr-14.6.3 { SELECT 'A' LIKE 'a' ESCAPE 'x' } {0 1}
944do_catchsql_test e_expr-14.6.4 "SELECT 'A' LIKE 'a' ESCAPE '\u00e6'" {0 1}
945
946# EVIDENCE-OF: R-02045-23762 This character may be used in the LIKE
947# pattern to include literal percent or underscore characters.
948#
949# EVIDENCE-OF: R-13345-31830 The escape character followed by a percent
950# symbol (%), underscore (_), or a second instance of the escape
951# character itself matches a literal percent symbol, underscore, or a
952# single escape character, respectively.
953#
954do_execsql_test e_expr-14.7.1 { SELECT 'abc%' LIKE 'abcX%' ESCAPE 'X' } 1
955do_execsql_test e_expr-14.7.2 { SELECT 'abc5' LIKE 'abcX%' ESCAPE 'X' } 0
956do_execsql_test e_expr-14.7.3 { SELECT 'abc' LIKE 'abcX%' ESCAPE 'X' } 0
957do_execsql_test e_expr-14.7.4 { SELECT 'abcX%' LIKE 'abcX%' ESCAPE 'X' } 0
958do_execsql_test e_expr-14.7.5 { SELECT 'abc%%' LIKE 'abcX%' ESCAPE 'X' } 0
959
960do_execsql_test e_expr-14.7.6 { SELECT 'abc_' LIKE 'abcX_' ESCAPE 'X' } 1
961do_execsql_test e_expr-14.7.7 { SELECT 'abc5' LIKE 'abcX_' ESCAPE 'X' } 0
962do_execsql_test e_expr-14.7.8 { SELECT 'abc' LIKE 'abcX_' ESCAPE 'X' } 0
963do_execsql_test e_expr-14.7.9 { SELECT 'abcX_' LIKE 'abcX_' ESCAPE 'X' } 0
964do_execsql_test e_expr-14.7.10 { SELECT 'abc__' LIKE 'abcX_' ESCAPE 'X' } 0
965
966do_execsql_test e_expr-14.7.11 { SELECT 'abcX' LIKE 'abcXX' ESCAPE 'X' } 1
967do_execsql_test e_expr-14.7.12 { SELECT 'abc5' LIKE 'abcXX' ESCAPE 'X' } 0
968do_execsql_test e_expr-14.7.13 { SELECT 'abc' LIKE 'abcXX' ESCAPE 'X' } 0
969do_execsql_test e_expr-14.7.14 { SELECT 'abcXX' LIKE 'abcXX' ESCAPE 'X' } 0
970
971# EVIDENCE-OF: R-51359-17496 The infix LIKE operator is implemented by
972# calling the application-defined SQL functions like(Y,X) or like(Y,X,Z).
973#
974proc likefunc {args} {
975 eval lappend ::likeargs $args
976 return 1
977}
978db func like likefunc
979set ::likeargs [list]
980do_execsql_test e_expr-15.1.1 { SELECT 'abc' LIKE 'def' } 1
981do_test e_expr-15.1.2 { set likeargs } {def abc}
982set ::likeargs [list]
983do_execsql_test e_expr-15.1.3 { SELECT 'abc' LIKE 'def' ESCAPE 'X' } 1
984do_test e_expr-15.1.4 { set likeargs } {def abc X}
985db close
986sqlite3 db test.db
987
988# EVIDENCE-OF: R-22868-25880 The LIKE operator can be made case
989# sensitive using the case_sensitive_like pragma.
990#
991do_execsql_test e_expr-16.1.1 { SELECT 'abcxyz' LIKE 'ABC%' } 1
992do_execsql_test e_expr-16.1.2 { PRAGMA case_sensitive_like = 1 } {}
993do_execsql_test e_expr-16.1.3 { SELECT 'abcxyz' LIKE 'ABC%' } 0
994do_execsql_test e_expr-16.1.4 { SELECT 'ABCxyz' LIKE 'ABC%' } 1
995do_execsql_test e_expr-16.1.5 { PRAGMA case_sensitive_like = 0 } {}
996do_execsql_test e_expr-16.1.6 { SELECT 'abcxyz' LIKE 'ABC%' } 1
997do_execsql_test e_expr-16.1.7 { SELECT 'ABCxyz' LIKE 'ABC%' } 1
998
999# EVIDENCE-OF: R-52087-12043 The GLOB operator is similar to LIKE but
1000# uses the Unix file globbing syntax for its wildcards.
1001#
1002# EVIDENCE-OF: R-09813-17279 Also, GLOB is case sensitive, unlike LIKE.
1003#
1004do_execsql_test e_expr-17.1.1 { SELECT 'abcxyz' GLOB 'abc%' } 0
1005do_execsql_test e_expr-17.1.2 { SELECT 'abcxyz' GLOB 'abc*' } 1
1006do_execsql_test e_expr-17.1.3 { SELECT 'abcxyz' GLOB 'abc___' } 0
1007do_execsql_test e_expr-17.1.4 { SELECT 'abcxyz' GLOB 'abc???' } 1
1008
1009do_execsql_test e_expr-17.1.5 { SELECT 'abcxyz' GLOB 'abc*' } 1
1010do_execsql_test e_expr-17.1.6 { SELECT 'ABCxyz' GLOB 'abc*' } 0
1011do_execsql_test e_expr-17.1.7 { SELECT 'abcxyz' GLOB 'ABC*' } 0
1012
1013# EVIDENCE-OF: R-39616-20555 Both GLOB and LIKE may be preceded by the
1014# NOT keyword to invert the sense of the test.
1015#
1016do_execsql_test e_expr-17.2.1 { SELECT 'abcxyz' NOT GLOB 'ABC*' } 1
1017do_execsql_test e_expr-17.2.2 { SELECT 'abcxyz' NOT GLOB 'abc*' } 0
1018do_execsql_test e_expr-17.2.3 { SELECT 'abcxyz' NOT LIKE 'ABC%' } 0
1019do_execsql_test e_expr-17.2.4 { SELECT 'abcxyz' NOT LIKE 'abc%' } 0
1020do_execsql_test e_expr-17.2.5 { SELECT 'abdxyz' NOT LIKE 'abc%' } 1
1021
1022db nullvalue null
1023do_execsql_test e_expr-17.2.6 { SELECT 'abcxyz' NOT GLOB NULL } null
1024do_execsql_test e_expr-17.2.7 { SELECT 'abcxyz' NOT LIKE NULL } null
1025do_execsql_test e_expr-17.2.8 { SELECT NULL NOT GLOB 'abc*' } null
1026do_execsql_test e_expr-17.2.9 { SELECT NULL NOT LIKE 'ABC%' } null
1027db nullvalue {}
1028
1029# EVIDENCE-OF: R-39414-35489 The infix GLOB operator is implemented by
1030# calling the function glob(Y,X) and can be modified by overriding that
1031# function.
1032proc globfunc {args} {
1033 eval lappend ::globargs $args
1034 return 1
1035}
1036db func glob -argcount 2 globfunc
1037set ::globargs [list]
1038do_execsql_test e_expr-17.3.1 { SELECT 'abc' GLOB 'def' } 1
1039do_test e_expr-17.3.2 { set globargs } {def abc}
1040set ::globargs [list]
1041do_execsql_test e_expr-17.3.3 { SELECT 'X' NOT GLOB 'Y' } 0
1042do_test e_expr-17.3.4 { set globargs } {Y X}
1043sqlite3 db test.db
1044
1045# EVIDENCE-OF: R-41650-20872 No regexp() user function is defined by
1046# default and so use of the REGEXP operator will normally result in an
1047# error message.
1048#
1049do_catchsql_test e_expr-18.1.1 {
1050 SELECT regexp('abc', 'def')
1051} {1 {no such function: regexp}}
1052do_catchsql_test e_expr-18.1.2 {
1053 SELECT 'abc' REGEXP 'def'
1054} {1 {no such function: REGEXP}}
1055
1056# EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for
1057# the regexp() user function.
1058#
1059# EVIDENCE-OF: R-57289-13578 If a application-defined SQL function named
1060# "regexp" is added at run-time, that function will be called in order
1061# to implement the REGEXP operator.
1062#
1063proc regexpfunc {args} {
1064 eval lappend ::regexpargs $args
1065 return 1
1066}
1067db func regexp -argcount 2 regexpfunc
1068set ::regexpargs [list]
1069do_execsql_test e_expr-18.2.1 { SELECT 'abc' REGEXP 'def' } 1
1070do_test e_expr-18.2.2 { set regexpargs } {def abc}
1071set ::regexpargs [list]
1072do_execsql_test e_expr-18.2.3 { SELECT 'X' NOT REGEXP 'Y' } 0
1073do_test e_expr-18.2.4 { set regexpargs } {Y X}
1074sqlite3 db test.db
1075
1076# EVIDENCE-OF: R-42037-37826 The default match() function implementation
1077# raises an exception and is not really useful for anything.
1078#
1079do_catchsql_test e_expr-19.1.1 {
1080 SELECT 'abc' MATCH 'def'
1081} {1 {unable to use function MATCH in the requested context}}
1082do_catchsql_test e_expr-19.1.2 {
1083 SELECT match('abc', 'def')
1084} {1 {unable to use function MATCH in the requested context}}
1085
1086# EVIDENCE-OF: R-37916-47407 The MATCH operator is a special syntax for
1087# the match() application-defined function.
1088#
1089# EVIDENCE-OF: R-06021-09373 But extensions can override the match()
1090# function with more helpful logic.
1091#
1092proc matchfunc {args} {
1093 eval lappend ::matchargs $args
1094 return 1
1095}
1096db func match -argcount 2 matchfunc
1097set ::matchargs [list]
1098do_execsql_test e_expr-19.2.1 { SELECT 'abc' MATCH 'def' } 1
1099do_test e_expr-19.2.2 { set matchargs } {def abc}
1100set ::matchargs [list]
1101do_execsql_test e_expr-19.2.3 { SELECT 'X' NOT MATCH 'Y' } 0
1102do_test e_expr-19.2.4 { set matchargs } {Y X}
1103sqlite3 db test.db
1104
daneb385b42010-08-24 13:11:52 +00001105#-------------------------------------------------------------------------
1106# Test cases for the testable statements related to the CASE expression.
1107#
1108# EVIDENCE-OF: R-15199-61389 There are two basic forms of the CASE
1109# expression: those with a base expression and those without.
1110#
1111do_execsql_test e_expr-20.1 {
1112 SELECT CASE WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END;
1113} {true}
1114do_execsql_test e_expr-20.2 {
1115 SELECT CASE 0 WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END;
1116} {false}
1117
1118proc var {nm} {
1119 lappend ::varlist $nm
1120 return [set "::$nm"]
1121}
1122db func var var
1123
1124# EVIDENCE-OF: R-30638-59954 In a CASE without a base expression, each
1125# WHEN expression is evaluated and the result treated as a boolean,
1126# starting with the leftmost and continuing to the right.
1127#
1128foreach {a b c} {0 0 0} break
1129set varlist [list]
1130do_execsql_test e_expr-21.1.1 {
1131 SELECT CASE WHEN var('a') THEN 'A'
1132 WHEN var('b') THEN 'B'
1133 WHEN var('c') THEN 'C' END
1134} {{}}
1135do_test e_expr-21.1.2 { set varlist } {a b c}
1136set varlist [list]
1137do_execsql_test e_expr-21.1.3 {
1138 SELECT CASE WHEN var('c') THEN 'C'
1139 WHEN var('b') THEN 'B'
1140 WHEN var('a') THEN 'A'
1141 ELSE 'no result'
1142 END
1143} {{no result}}
1144do_test e_expr-21.1.4 { set varlist } {c b a}
1145
1146# EVIDENCE-OF: R-39009-25596 The result of the CASE expression is the
1147# evaluation of the THEN expression that corresponds to the first WHEN
1148# expression that evaluates to true.
1149#
1150foreach {a b c} {0 1 0} break
1151do_execsql_test e_expr-21.2.1 {
1152 SELECT CASE WHEN var('a') THEN 'A'
1153 WHEN var('b') THEN 'B'
1154 WHEN var('c') THEN 'C'
1155 ELSE 'no result'
1156 END
1157} {B}
1158foreach {a b c} {0 1 1} break
1159do_execsql_test e_expr-21.2.2 {
1160 SELECT CASE WHEN var('a') THEN 'A'
1161 WHEN var('b') THEN 'B'
1162 WHEN var('c') THEN 'C'
1163 ELSE 'no result'
1164 END
1165} {B}
1166foreach {a b c} {0 0 1} break
1167do_execsql_test e_expr-21.2.3 {
1168 SELECT CASE WHEN var('a') THEN 'A'
1169 WHEN var('b') THEN 'B'
1170 WHEN var('c') THEN 'C'
1171 ELSE 'no result'
1172 END
1173} {C}
1174
1175# EVIDENCE-OF: R-24227-04807 Or, if none of the WHEN expressions
1176# evaluate to true, the result of evaluating the ELSE expression, if
1177# any.
1178#
1179foreach {a b c} {0 0 0} break
1180do_execsql_test e_expr-21.3.1 {
1181 SELECT CASE WHEN var('a') THEN 'A'
1182 WHEN var('b') THEN 'B'
1183 WHEN var('c') THEN 'C'
1184 ELSE 'no result'
1185 END
1186} {{no result}}
1187
1188# EVIDENCE-OF: R-14168-07579 If there is no ELSE expression and none of
1189# the WHEN expressions are true, then the overall result is NULL.
1190#
1191db nullvalue null
1192do_execsql_test e_expr-21.3.2 {
1193 SELECT CASE WHEN var('a') THEN 'A'
1194 WHEN var('b') THEN 'B'
1195 WHEN var('c') THEN 'C'
1196 END
1197} {null}
1198db nullvalue {}
1199
1200# EVIDENCE-OF: R-13943-13592 A NULL result is considered untrue when
1201# evaluating WHEN terms.
1202#
1203do_execsql_test e_expr-21.4.1 {
1204 SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END
1205} {B}
1206do_execsql_test e_expr-21.4.2 {
1207 SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END
1208} {C}
1209
1210# EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base
1211# expression is evaluated just once and the result is compared against
1212# the evaluation of each WHEN expression from left to right.
1213#
1214# Note: This test case tests the "evaluated just once" part of the above
1215# statement. Tests associated with the next two statements test that the
1216# comparisons take place.
1217#
1218foreach {a b c} [list [expr 3] [expr 4] [expr 5]] break
1219set ::varlist [list]
1220do_execsql_test e_expr-22.1.1 {
1221 SELECT CASE var('a') WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' END
1222} {C}
1223do_test e_expr-22.1.2 { set ::varlist } {a}
1224
1225# EVIDENCE-OF: R-07667-49537 The result of the CASE expression is the
1226# evaluation of the THEN expression that corresponds to the first WHEN
1227# expression for which the comparison is true.
1228#
1229do_execsql_test e_expr-22.2.1 {
1230 SELECT CASE 23 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1231} {B}
1232do_execsql_test e_expr-22.2.2 {
1233 SELECT CASE 1 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1234} {A}
1235
1236# EVIDENCE-OF: R-47543-32145 Or, if none of the WHEN expressions
1237# evaluate to a value equal to the base expression, the result of
1238# evaluating the ELSE expression, if any.
1239#
1240do_execsql_test e_expr-22.3.1 {
1241 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' ELSE 'D' END
1242} {D}
1243
1244# EVIDENCE-OF: R-54721-48557 If there is no ELSE expression and none of
1245# the WHEN expressions produce a result equal to the base expression,
1246# the overall result is NULL.
1247#
1248do_execsql_test e_expr-22.4.1 {
1249 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1250} {{}}
1251db nullvalue null
1252do_execsql_test e_expr-22.4.2 {
1253 SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
1254} {null}
1255db nullvalue {}
1256
1257# EVIDENCE-OF: R-11479-62774 When comparing a base expression against a
1258# WHEN expression, the same collating sequence, affinity, and
1259# NULL-handling rules apply as if the base expression and WHEN
1260# expression are respectively the left- and right-hand operands of an =
1261# operator.
1262#
1263proc rev {str} {
1264 set ret ""
1265 set chars [split $str]
1266 for {set i [expr [llength $chars]-1]} {$i>=0} {incr i -1} {
1267 append ret [lindex $chars $i]
1268 }
1269 set ret
1270}
1271proc reverse {lhs rhs} {
1272 string compare [rev $lhs] [ref $rhs]
1273}
1274db collate reverse reverse
1275do_execsql_test e_expr-23.1.1 {
1276 CREATE TABLE t1(
1277 a TEXT COLLATE NOCASE,
1278 b COLLATE REVERSE,
1279 c INTEGER,
1280 d BLOB
1281 );
1282 INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5);
1283} {}
1284do_execsql_test e_expr-23.1.2 {
1285 SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1
1286} {B}
1287do_execsql_test e_expr-23.1.3 {
1288 SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1
1289} {B}
1290do_execsql_test e_expr-23.1.4 {
1291 SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1
1292} {B}
1293do_execsql_test e_expr-23.1.5 {
1294 SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1
1295} {A}
1296do_execsql_test e_expr-23.1.6 {
1297 SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END
1298} {B}
1299do_execsql_test e_expr-23.1.7 {
1300 SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1
1301} {A}
1302do_execsql_test e_expr-23.1.8 {
1303 SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1
1304} {B}
1305do_execsql_test e_expr-23.1.9 {
1306 SELECT CASE NULL WHEN NULL THEN 'A' ELSE 'B' END
1307} {B}
1308
1309# EVIDENCE-OF: R-37304-39405 If the base expression is NULL then the
1310# result of the CASE is always the result of evaluating the ELSE
1311# expression if it exists, or NULL if it does not.
1312#
1313do_execsql_test e_expr-24.1.1 {
1314 SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' END;
1315} {{}}
1316do_execsql_test e_expr-24.1.2 {
1317 SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' ELSE 'C' END;
1318} {C}
1319
1320# EVIDENCE-OF: R-56280-17369 Both forms of the CASE expression use lazy,
1321# or short-circuit, evaluation.
1322#
1323set varlist [list]
1324foreach {a b c} {0 1 0} break
1325do_execsql_test e_expr-25.1.1 {
1326 SELECT CASE WHEN var('a') THEN 'A'
1327 WHEN var('b') THEN 'B'
1328 WHEN var('c') THEN 'C'
1329 END
1330} {B}
1331do_test e_expr-25.1.2 { set ::varlist } {a b}
1332set varlist [list]
1333do_execsql_test e_expr-25.1.3 {
1334 SELECT CASE '0' WHEN var('a') THEN 'A'
1335 WHEN var('b') THEN 'B'
1336 WHEN var('c') THEN 'C'
1337 END
1338} {A}
1339do_test e_expr-25.1.4 { set ::varlist } {a}
1340
1341# EVIDENCE-OF: R-34773-62253 The only difference between the following
1342# two CASE expressions is that the x expression is evaluated exactly
1343# once in the first example but might be evaluated multiple times in the
1344# second: CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END CASE WHEN
1345# x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
1346#
1347proc ceval {x} {
1348 incr ::evalcount
1349 return $x
1350}
1351db func ceval ceval
1352set ::evalcount 0
1353
1354do_execsql_test e_expr-26.1.1 {
1355 CREATE TABLE t2(x, w1, r1, w2, r2, r3);
1356 INSERT INTO t2 VALUES(1, 1, 'R1', 2, 'R2', 'R3');
1357 INSERT INTO t2 VALUES(2, 1, 'R1', 2, 'R2', 'R3');
1358 INSERT INTO t2 VALUES(3, 1, 'R1', 2, 'R2', 'R3');
1359} {}
1360do_execsql_test e_expr-26.1.2 {
1361 SELECT CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2
1362} {R1 R2 R3}
1363do_execsql_test e_expr-26.1.3 {
1364 SELECT CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END FROM t2
1365} {R1 R2 R3}
1366
1367do_execsql_test e_expr-26.1.4 {
1368 SELECT CASE ceval(x) WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2
1369} {R1 R2 R3}
1370do_test e_expr-26.1.5 { set ::evalcount } {3}
1371set ::evalcount 0
1372do_execsql_test e_expr-26.1.6 {
1373 SELECT CASE
1374 WHEN ceval(x)=w1 THEN r1
1375 WHEN ceval(x)=w2 THEN r2
1376 ELSE r3 END
1377 FROM t2
1378} {R1 R2 R3}
1379do_test e_expr-26.1.6 { set ::evalcount } {5}
dan994e9402010-08-16 18:26:30 +00001380
dan51f3a502010-08-26 19:05:23 +00001381
1382#-------------------------------------------------------------------------
1383# Test statements related to CAST expressions.
1384#
1385# EVIDENCE-OF: R-65079-31758 Application of a CAST expression is
1386# different to application of a column affinity, as with a CAST
1387# expression the storage class conversion is forced even if it is lossy
1388# and irrreversible.
1389#
1390do_execsql_test e_expr-27.1.1 {
1391 CREATE TABLE t3(a TEXT, b REAL, c INTEGER);
1392 INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5);
1393 SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3;
1394} {blob UVU text 1.23abc real 4.5}
1395do_execsql_test e_expr-27.1.2 {
1396 SELECT
1397 typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT),
1398 typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL),
1399 typeof(CAST(4.5 as INTEGER)), CAST(4.5 as INTEGER)
1400} {text UVU real 1.23 integer 4}
1401
1402proc do_expr_test {tn expr type value} {
1403 uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [
1404 list [list $type $value]
1405 ]
1406}
1407proc do_qexpr_test {tn expr value} {
1408 uplevel do_execsql_test $tn [list "SELECT quote($expr)"] [list $value]
1409}
1410
1411# EVIDENCE-OF: R-27225-65050 If the value of <expr> is NULL, then
1412# the result of the CAST expression is also NULL.
1413#
1414do_expr_test e_expr-27.2.1 { CAST(NULL AS integer) } null {}
1415do_expr_test e_expr-27.2.2 { CAST(NULL AS text) } null {}
1416do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) } null {}
1417do_expr_test e_expr-27.2.4 { CAST(NULL AS number) } null {}
1418
1419# EVIDENCE-OF: R-31076-23575 Casting a value to a <type-name> with
1420# no affinity causes the value to be converted into a BLOB.
1421#
1422do_expr_test e_expr-27.3.1 { CAST('abc' AS blob) } blob abc
1423do_expr_test e_expr-27.3.2 { CAST('def' AS shobblob_x) } blob def
1424do_expr_test e_expr-27.3.3 { CAST('ghi' AS abbLOb10) } blob ghi
1425
1426# EVIDENCE-OF: R-22956-37754 Casting to a BLOB consists of first casting
1427# the value to TEXT in the encoding of the database connection, then
1428# interpreting the resulting byte sequence as a BLOB instead of as TEXT.
1429#
1430do_qexpr_test e_expr-27.4.1 { CAST('ghi' AS blob) } X'676869'
1431do_qexpr_test e_expr-27.4.2 { CAST(456 AS blob) } X'343536'
1432do_qexpr_test e_expr-27.4.3 { CAST(1.78 AS blob) } X'312E3738'
1433rename db db2
1434sqlite3 db :memory:
1435db eval { PRAGMA encoding = 'utf-16le' }
1436do_qexpr_test e_expr-27.4.4 { CAST('ghi' AS blob) } X'670068006900'
1437do_qexpr_test e_expr-27.4.5 { CAST(456 AS blob) } X'340035003600'
1438do_qexpr_test e_expr-27.4.6 { CAST(1.78 AS blob) } X'31002E0037003800'
1439db close
1440sqlite3 db :memory:
1441db eval { PRAGMA encoding = 'utf-16be' }
1442do_qexpr_test e_expr-27.4.7 { CAST('ghi' AS blob) } X'006700680069'
1443do_qexpr_test e_expr-27.4.8 { CAST(456 AS blob) } X'003400350036'
1444do_qexpr_test e_expr-27.4.9 { CAST(1.78 AS blob) } X'0031002E00370038'
1445db close
1446rename db2 db
1447
1448# EVIDENCE-OF: R-04207-37981 To cast a BLOB value to TEXT, the sequence
1449# of bytes that make up the BLOB is interpreted as text encoded using
1450# the database encoding.
1451#
1452do_expr_test e_expr-28.1.1 { CAST (X'676869' AS text) } text ghi
1453do_expr_test e_expr-28.1.2 { CAST (X'670068006900' AS text) } text g
1454rename db db2
1455sqlite3 db :memory:
1456db eval { PRAGMA encoding = 'utf-16le' }
1457do_expr_test e_expr-28.1.3 { CAST (X'676869' AS text) == 'ghi' } integer 0
1458do_expr_test e_expr-28.1.4 { CAST (X'670068006900' AS text) } text ghi
1459db close
1460rename db2 db
1461
1462# EVIDENCE-OF: R-22235-47006 Casting an INTEGER or REAL value into TEXT
1463# renders the value as if via sqlite3_snprintf() except that the
1464# resulting TEXT uses the encoding of the database connection.
1465#
1466do_expr_test e_expr-28.2.1 { CAST (1 AS text) } text 1
1467do_expr_test e_expr-28.2.2 { CAST (45 AS text) } text 45
1468do_expr_test e_expr-28.2.3 { CAST (-45 AS text) } text -45
1469do_expr_test e_expr-28.2.4 { CAST (8.8 AS text) } text 8.8
1470do_expr_test e_expr-28.2.5 { CAST (2.3e+5 AS text) } text 230000.0
1471do_expr_test e_expr-28.2.6 { CAST (-2.3e-5 AS text) } text -2.3e-05
1472do_expr_test e_expr-28.2.7 { CAST (0.0 AS text) } text 0.0
1473do_expr_test e_expr-28.2.7 { CAST (0 AS text) } text 0
1474
1475# EVIDENCE-OF: R-26346-36443 When casting a BLOB value to a REAL, the
1476# value is first converted to TEXT.
1477#
1478do_expr_test e_expr-29.1.1 { CAST (X'312E3233' AS REAL) } real 1.23
1479do_expr_test e_expr-29.1.2 { CAST (X'3233302E30' AS REAL) } real 230.0
1480do_expr_test e_expr-29.1.3 { CAST (X'2D392E3837' AS REAL) } real -9.87
1481do_expr_test e_expr-29.1.4 { CAST (X'302E30303031' AS REAL) } real 0.0001
1482rename db db2
1483sqlite3 db :memory:
1484db eval { PRAGMA encoding = 'utf-16le' }
1485do_expr_test e_expr-29.1.1 {
1486 CAST (X'31002E0032003300' AS REAL) } real 1.23
1487do_expr_test e_expr-29.1.2 {
1488 CAST (X'3200330030002E003000' AS REAL) } real 230.0
1489do_expr_test e_expr-29.1.3 {
1490 CAST (X'2D0039002E0038003700' AS REAL) } real -9.87
1491do_expr_test e_expr-29.1.4 {
1492 CAST (X'30002E003000300030003100' AS REAL) } real 0.0001
1493db close
1494rename db2 db
1495
dan784141e2010-07-17 18:44:49 +00001496finish_test
dan51f3a502010-08-26 19:05:23 +00001497