blob: 2caf3bce3b3042d98eec378234fc767cce3c3d6b [file] [log] [blame]
drhd55e0722012-10-25 03:07:29 +00001# 2012 October 24
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# This file implements regression tests for SQLite library. The
12# focus of this file is testing the built-in INSTR() functions.
13#
drh3432daa2013-10-11 16:35:49 +000014# EVIDENCE-OF: R-27549-59611 The instr(X,Y) function finds the first
15# occurrence of string Y within string X and returns the number of prior
16# characters plus 1, or 0 if Y is nowhere found within X.
17#
18
drhd55e0722012-10-25 03:07:29 +000019
20set testdir [file dirname $argv0]
21source $testdir/tester.tcl
22
23# Create a table to work with.
24#
25do_test instr-1.1 {
26 db eval {SELECT instr('abcdefg','a');}
27} {1}
28do_test instr-1.2 {
29 db eval {SELECT instr('abcdefg','b');}
30} {2}
31do_test instr-1.3 {
32 db eval {SELECT instr('abcdefg','c');}
33} {3}
34do_test instr-1.4 {
35 db eval {SELECT instr('abcdefg','d');}
36} {4}
37do_test instr-1.5 {
38 db eval {SELECT instr('abcdefg','e');}
39} {5}
40do_test instr-1.6 {
41 db eval {SELECT instr('abcdefg','f');}
42} {6}
43do_test instr-1.7 {
44 db eval {SELECT instr('abcdefg','g');}
45} {7}
46do_test instr-1.8 {
47 db eval {SELECT instr('abcdefg','h');}
48} {0}
49do_test instr-1.9 {
50 db eval {SELECT instr('abcdefg','abcdefg');}
51} {1}
52do_test instr-1.10 {
53 db eval {SELECT instr('abcdefg','abcdefgh');}
54} {0}
55do_test instr-1.11 {
56 db eval {SELECT instr('abcdefg','bcdefg');}
57} {2}
58do_test instr-1.12 {
59 db eval {SELECT instr('abcdefg','bcdefgh');}
60} {0}
61do_test instr-1.13 {
62 db eval {SELECT instr('abcdefg','cdefg');}
63} {3}
64do_test instr-1.14 {
65 db eval {SELECT instr('abcdefg','cdefgh');}
66} {0}
67do_test instr-1.15 {
68 db eval {SELECT instr('abcdefg','defg');}
69} {4}
70do_test instr-1.16 {
71 db eval {SELECT instr('abcdefg','defgh');}
72} {0}
73do_test instr-1.17 {
74 db eval {SELECT instr('abcdefg','efg');}
75} {5}
76do_test instr-1.18 {
77 db eval {SELECT instr('abcdefg','efgh');}
78} {0}
79do_test instr-1.19 {
80 db eval {SELECT instr('abcdefg','fg');}
81} {6}
82do_test instr-1.20 {
83 db eval {SELECT instr('abcdefg','fgh');}
84} {0}
85do_test instr-1.21 {
86 db eval {SELECT coalesce(instr('abcdefg',NULL),'nil');}
87} {nil}
88do_test instr-1.22 {
89 db eval {SELECT coalesce(instr(NULL,'x'),'nil');}
90} {nil}
91do_test instr-1.23 {
92 db eval {SELECT instr(12345,34);}
93} {3}
94do_test instr-1.24 {
95 db eval {SELECT instr(123456.78,34);}
96} {3}
97do_test instr-1.25 {
98 db eval {SELECT instr(123456.78,x'3334');}
99} {3}
100do_test instr-1.26 {
101 db eval {SELECT instr('äbcdefg','efg');}
102} {5}
103do_test instr-1.27 {
104 db eval {SELECT instr('€xyzzy','xyz');}
105} {2}
106do_test instr-1.28 {
107 db eval {SELECT instr('abc€xyzzy','xyz');}
108} {5}
109do_test instr-1.29 {
110 db eval {SELECT instr('abc€xyzzy','€xyz');}
111} {4}
112do_test instr-1.30 {
113 db eval {SELECT instr('abc€xyzzy','c€xyz');}
114} {3}
115do_test instr-1.31 {
116 db eval {SELECT instr(x'0102030405',x'01');}
117} {1}
118do_test instr-1.32 {
119 db eval {SELECT instr(x'0102030405',x'02');}
120} {2}
121do_test instr-1.33 {
122 db eval {SELECT instr(x'0102030405',x'03');}
123} {3}
124do_test instr-1.34 {
125 db eval {SELECT instr(x'0102030405',x'04');}
126} {4}
127do_test instr-1.35 {
128 db eval {SELECT instr(x'0102030405',x'05');}
129} {5}
130do_test instr-1.36 {
131 db eval {SELECT instr(x'0102030405',x'06');}
132} {0}
133do_test instr-1.37 {
134 db eval {SELECT instr(x'0102030405',x'0102030405');}
135} {1}
136do_test instr-1.38 {
137 db eval {SELECT instr(x'0102030405',x'02030405');}
138} {2}
139do_test instr-1.39 {
140 db eval {SELECT instr(x'0102030405',x'030405');}
141} {3}
142do_test instr-1.40 {
143 db eval {SELECT instr(x'0102030405',x'0405');}
144} {4}
145do_test instr-1.41 {
146 db eval {SELECT instr(x'0102030405',x'0506');}
147} {0}
148do_test instr-1.42 {
149 db eval {SELECT instr(x'0102030405',x'');}
150} {1}
151do_test instr-1.43 {
152 db eval {SELECT instr(x'',x'');}
153} {1}
154do_test instr-1.44 {
155 db eval {SELECT instr('','');}
156} {1}
157do_test instr-1.45 {
158 db eval {SELECT instr('abcdefg','');}
159} {1}
160unset -nocomplain longstr
161set longstr abcdefghijklmonpqrstuvwxyz
162append longstr $longstr
163append longstr $longstr
164append longstr $longstr
165append longstr $longstr
166append longstr $longstr
167append longstr $longstr
168append longstr $longstr
169append longstr $longstr
170append longstr $longstr
171append longstr $longstr
172append longstr $longstr
173append longstr $longstr
174# puts [string length $longstr]
175append longstr Xabcde
176do_test instr-1.46 {
177 db eval {SELECT instr($longstr,'X');}
178} {106497}
179do_test instr-1.47 {
180 db eval {SELECT instr($longstr,'Y');}
181} {0}
182do_test instr-1.48 {
183 db eval {SELECT instr($longstr,'Xa');}
184} {106497}
185do_test instr-1.49 {
186 db eval {SELECT instr($longstr,'zXa');}
187} {106496}
188set longstr [string map {a ä} $longstr]
189do_test instr-1.50 {
190 db eval {SELECT instr($longstr,'X');}
191} {106497}
192do_test instr-1.51 {
193 db eval {SELECT instr($longstr,'Y');}
194} {0}
195do_test instr-1.52 {
196 db eval {SELECT instr($longstr,'Xä');}
197} {106497}
198do_test instr-1.53 {
199 db eval {SELECT instr($longstr,'zXä');}
200} {106496}
201do_test instr-1.54 {
202 db eval {SELECT instr(x'78c3a4e282ac79','x');}
203} {1}
204do_test instr-1.55 {
205 db eval {SELECT instr(x'78c3a4e282ac79','y');}
206} {4}
drh3432daa2013-10-11 16:35:49 +0000207
208# EVIDENCE-OF: R-46421-32541 Or, if X and Y are both BLOBs, then
209# instr(X,Y) returns one more than the number bytes prior to the first
210# occurrence of Y, or 0 if Y does not occur anywhere within X.
211#
212do_test instr-1.56.1 {
drhd55e0722012-10-25 03:07:29 +0000213 db eval {SELECT instr(x'78c3a4e282ac79',x'79');}
214} {7}
drh3432daa2013-10-11 16:35:49 +0000215do_test instr-1.56.2 {
216 db eval {SELECT instr(x'78c3a4e282ac79',x'7a');}
217} {0}
218do_test instr-1.56.3 {
219 db eval {SELECT instr(x'78c3a4e282ac79',x'78');}
220} {1}
221do_test instr-1.56.3 {
222 db eval {SELECT instr(x'78c3a4e282ac79',x'a4');}
223} {3}
224
225# EVIDENCE-OF: R-17329-35644 If both arguments X and Y to instr(X,Y) are
226# non-NULL and are not BLOBs then both are interpreted as strings.
227#
228do_test instr-1.57.1 {
drhd55e0722012-10-25 03:07:29 +0000229 db eval {SELECT instr('xä€y',x'79');}
230} {4}
drh3432daa2013-10-11 16:35:49 +0000231do_test instr-1.57.2 {
232 db eval {SELECT instr('xä€y',x'a4');}
233} {0}
234do_test instr-1.57.3 {
235 db eval {SELECT instr(x'78c3a4e282ac79','y');}
236} {4}
drhd55e0722012-10-25 03:07:29 +0000237
drh3432daa2013-10-11 16:35:49 +0000238# EVIDENCE-OF: R-14708-27487 If either X or Y are NULL in instr(X,Y)
239# then the result is NULL.
240#
241do_execsql_test instr-1.60 {
242 SELECT coalesce(instr(NULL,'abc'), 999);
243} {999}
244do_execsql_test instr-1.61 {
245 SELECT coalesce(instr('abc',NULL), 999);
246} {999}
247do_execsql_test instr-1.62 {
248 SELECT coalesce(instr(NULL,NULL), 999);
249} {999}
drhd55e0722012-10-25 03:07:29 +0000250
dan3043b532016-12-30 17:40:14 +0000251do_execsql_test instr-1.63 {
252 SELECT instr(X'', 'abc')
253} 0
254do_execsql_test instr-1.64 {
255 CREATE TABLE x1(a, b);
256 INSERT INTO x1 VALUES(X'', 'abc');
257 SELECT instr(a, b) FROM x1;
258} 0
259
drhd55e0722012-10-25 03:07:29 +0000260finish_test