000001 # 2012 October 24 000002 # 000003 # The author disclaims copyright to this source code. In place of 000004 # a legal notice, here is a blessing: 000005 # 000006 # May you do good and not evil. 000007 # May you find forgiveness for yourself and forgive others. 000008 # May you share freely, never taking more than you give. 000009 # 000010 #*********************************************************************** 000011 # This file implements regression tests for SQLite library. The 000012 # focus of this file is testing the built-in INSTR() functions. 000013 # 000014 # EVIDENCE-OF: R-27549-59611 The instr(X,Y) function finds the first 000015 # occurrence of string Y within string X and returns the number of prior 000016 # characters plus 1, or 0 if Y is nowhere found within X. 000017 # 000018 000019 000020 set testdir [file dirname $argv0] 000021 source $testdir/tester.tcl 000022 000023 # Create a table to work with. 000024 # 000025 do_test instr-1.1 { 000026 db eval {SELECT instr('abcdefg','a');} 000027 } {1} 000028 do_test instr-1.2 { 000029 db eval {SELECT instr('abcdefg','b');} 000030 } {2} 000031 do_test instr-1.3 { 000032 db eval {SELECT instr('abcdefg','c');} 000033 } {3} 000034 do_test instr-1.4 { 000035 db eval {SELECT instr('abcdefg','d');} 000036 } {4} 000037 do_test instr-1.5 { 000038 db eval {SELECT instr('abcdefg','e');} 000039 } {5} 000040 do_test instr-1.6 { 000041 db eval {SELECT instr('abcdefg','f');} 000042 } {6} 000043 do_test instr-1.7 { 000044 db eval {SELECT instr('abcdefg','g');} 000045 } {7} 000046 do_test instr-1.8 { 000047 db eval {SELECT instr('abcdefg','h');} 000048 } {0} 000049 do_test instr-1.9 { 000050 db eval {SELECT instr('abcdefg','abcdefg');} 000051 } {1} 000052 do_test instr-1.10 { 000053 db eval {SELECT instr('abcdefg','abcdefgh');} 000054 } {0} 000055 do_test instr-1.11 { 000056 db eval {SELECT instr('abcdefg','bcdefg');} 000057 } {2} 000058 do_test instr-1.12 { 000059 db eval {SELECT instr('abcdefg','bcdefgh');} 000060 } {0} 000061 do_test instr-1.13 { 000062 db eval {SELECT instr('abcdefg','cdefg');} 000063 } {3} 000064 do_test instr-1.14 { 000065 db eval {SELECT instr('abcdefg','cdefgh');} 000066 } {0} 000067 do_test instr-1.15 { 000068 db eval {SELECT instr('abcdefg','defg');} 000069 } {4} 000070 do_test instr-1.16 { 000071 db eval {SELECT instr('abcdefg','defgh');} 000072 } {0} 000073 do_test instr-1.17 { 000074 db eval {SELECT instr('abcdefg','efg');} 000075 } {5} 000076 do_test instr-1.18 { 000077 db eval {SELECT instr('abcdefg','efgh');} 000078 } {0} 000079 do_test instr-1.19 { 000080 db eval {SELECT instr('abcdefg','fg');} 000081 } {6} 000082 do_test instr-1.20 { 000083 db eval {SELECT instr('abcdefg','fgh');} 000084 } {0} 000085 do_test instr-1.21 { 000086 db eval {SELECT coalesce(instr('abcdefg',NULL),'nil');} 000087 } {nil} 000088 do_test instr-1.22 { 000089 db eval {SELECT coalesce(instr(NULL,'x'),'nil');} 000090 } {nil} 000091 do_test instr-1.23 { 000092 db eval {SELECT instr(12345,34);} 000093 } {3} 000094 do_test instr-1.24 { 000095 db eval {SELECT instr(123456.78,34);} 000096 } {3} 000097 do_test instr-1.25 { 000098 db eval {SELECT instr(123456.78,x'3334');} 000099 } {3} 000100 do_test instr-1.26 { 000101 db eval {SELECT instr('äbcdefg','efg');} 000102 } {5} 000103 do_test instr-1.27 { 000104 db eval {SELECT instr('€xyzzy','xyz');} 000105 } {2} 000106 do_test instr-1.28 { 000107 db eval {SELECT instr('abc€xyzzy','xyz');} 000108 } {5} 000109 do_test instr-1.29 { 000110 db eval {SELECT instr('abc€xyzzy','€xyz');} 000111 } {4} 000112 do_test instr-1.30 { 000113 db eval {SELECT instr('abc€xyzzy','c€xyz');} 000114 } {3} 000115 do_test instr-1.31 { 000116 db eval {SELECT instr(x'0102030405',x'01');} 000117 } {1} 000118 do_test instr-1.32 { 000119 db eval {SELECT instr(x'0102030405',x'02');} 000120 } {2} 000121 do_test instr-1.33 { 000122 db eval {SELECT instr(x'0102030405',x'03');} 000123 } {3} 000124 do_test instr-1.34 { 000125 db eval {SELECT instr(x'0102030405',x'04');} 000126 } {4} 000127 do_test instr-1.35 { 000128 db eval {SELECT instr(x'0102030405',x'05');} 000129 } {5} 000130 do_test instr-1.36 { 000131 db eval {SELECT instr(x'0102030405',x'06');} 000132 } {0} 000133 do_test instr-1.37 { 000134 db eval {SELECT instr(x'0102030405',x'0102030405');} 000135 } {1} 000136 do_test instr-1.38 { 000137 db eval {SELECT instr(x'0102030405',x'02030405');} 000138 } {2} 000139 do_test instr-1.39 { 000140 db eval {SELECT instr(x'0102030405',x'030405');} 000141 } {3} 000142 do_test instr-1.40 { 000143 db eval {SELECT instr(x'0102030405',x'0405');} 000144 } {4} 000145 do_test instr-1.41 { 000146 db eval {SELECT instr(x'0102030405',x'0506');} 000147 } {0} 000148 do_test instr-1.42 { 000149 db eval {SELECT instr(x'0102030405',x'');} 000150 } {1} 000151 do_test instr-1.43 { 000152 db eval {SELECT instr(x'',x'');} 000153 } {1} 000154 do_test instr-1.44 { 000155 db eval {SELECT instr('','');} 000156 } {1} 000157 do_test instr-1.45 { 000158 db eval {SELECT instr('abcdefg','');} 000159 } {1} 000160 unset -nocomplain longstr 000161 set longstr abcdefghijklmonpqrstuvwxyz 000162 append longstr $longstr 000163 append longstr $longstr 000164 append longstr $longstr 000165 append longstr $longstr 000166 append longstr $longstr 000167 append longstr $longstr 000168 append longstr $longstr 000169 append longstr $longstr 000170 append longstr $longstr 000171 append longstr $longstr 000172 append longstr $longstr 000173 append longstr $longstr 000174 # puts [string length $longstr] 000175 append longstr Xabcde 000176 do_test instr-1.46 { 000177 db eval {SELECT instr($longstr,'X');} 000178 } {106497} 000179 do_test instr-1.47 { 000180 db eval {SELECT instr($longstr,'Y');} 000181 } {0} 000182 do_test instr-1.48 { 000183 db eval {SELECT instr($longstr,'Xa');} 000184 } {106497} 000185 do_test instr-1.49 { 000186 db eval {SELECT instr($longstr,'zXa');} 000187 } {106496} 000188 set longstr [string map {a ä} $longstr] 000189 do_test instr-1.50 { 000190 db eval {SELECT instr($longstr,'X');} 000191 } {106497} 000192 do_test instr-1.51 { 000193 db eval {SELECT instr($longstr,'Y');} 000194 } {0} 000195 do_test instr-1.52 { 000196 db eval {SELECT instr($longstr,'Xä');} 000197 } {106497} 000198 do_test instr-1.53 { 000199 db eval {SELECT instr($longstr,'zXä');} 000200 } {106496} 000201 do_test instr-1.54 { 000202 db eval {SELECT instr(x'78c3a4e282ac79','x');} 000203 } {1} 000204 do_test instr-1.55 { 000205 db eval {SELECT instr(x'78c3a4e282ac79','y');} 000206 } {4} 000207 000208 # EVIDENCE-OF: R-46421-32541 Or, if X and Y are both BLOBs, then 000209 # instr(X,Y) returns one more than the number bytes prior to the first 000210 # occurrence of Y, or 0 if Y does not occur anywhere within X. 000211 # 000212 do_test instr-1.56.1 { 000213 db eval {SELECT instr(x'78c3a4e282ac79',x'79');} 000214 } {7} 000215 do_test instr-1.56.2 { 000216 db eval {SELECT instr(x'78c3a4e282ac79',x'7a');} 000217 } {0} 000218 do_test instr-1.56.3 { 000219 db eval {SELECT instr(x'78c3a4e282ac79',x'78');} 000220 } {1} 000221 do_test instr-1.56.3 { 000222 db eval {SELECT instr(x'78c3a4e282ac79',x'a4');} 000223 } {3} 000224 000225 # EVIDENCE-OF: R-17329-35644 If both arguments X and Y to instr(X,Y) are 000226 # non-NULL and are not BLOBs then both are interpreted as strings. 000227 # 000228 do_test instr-1.57.1 { 000229 db eval {SELECT instr('xä€y',x'79');} 000230 } {4} 000231 do_test instr-1.57.2 { 000232 db eval {SELECT instr('xä€y',x'a4');} 000233 } {0} 000234 do_test instr-1.57.3 { 000235 db eval {SELECT instr(x'78c3a4e282ac79','y');} 000236 } {4} 000237 000238 # EVIDENCE-OF: R-14708-27487 If either X or Y are NULL in instr(X,Y) 000239 # then the result is NULL. 000240 # 000241 do_execsql_test instr-1.60 { 000242 SELECT coalesce(instr(NULL,'abc'), 999); 000243 } {999} 000244 do_execsql_test instr-1.61 { 000245 SELECT coalesce(instr('abc',NULL), 999); 000246 } {999} 000247 do_execsql_test instr-1.62 { 000248 SELECT coalesce(instr(NULL,NULL), 999); 000249 } {999} 000250 000251 do_execsql_test instr-1.63 { 000252 SELECT instr(X'', 'abc') 000253 } 0 000254 do_execsql_test instr-1.64 { 000255 CREATE TABLE x1(a, b); 000256 INSERT INTO x1 VALUES(X'', 'abc'); 000257 SELECT instr(a, b) FROM x1; 000258 } 0 000259 000260 # 2019-09-16 ticket https://www.sqlite.org/src/info/587791f92620090e 000261 # 000262 do_execsql_test instr-2.0 { 000263 DROP TABLE IF EXISTS t0; 000264 CREATE TABLE t0(c0 PRIMARY KEY, c1); 000265 INSERT INTO t0(c0) VALUES (x'bb'), (0); 000266 SELECT COUNT(*) FROM t0 WHERE INSTR(x'aabb', t0.c0) ORDER BY t0.c0, t0.c1; 000267 } {1} 000268 do_execsql_test instr-2.1 { 000269 SELECT quote(c0) FROM t0 WHERE INSTR(x'aabb', t0.c0) ORDER BY t0.c0, t0.c1; 000270 } {X'BB'} 000271 do_execsql_test instr-2.2 { 000272 DROP TABLE IF EXISTS t1; 000273 CREATE TABLE t1(x); 000274 INSERT INTO t1(x) VALUES('text'),(x'bb'); 000275 SELECT quote(x) FROM t1 WHERE instr(x'aabb',x); 000276 } {X'BB'} 000277 do_execsql_test instr-2.3 { 000278 SELECT quote(x) FROM t1 WHERE x>'zzz' AND instr(x'aabb',x); 000279 } {X'BB'} 000280 000281 finish_test