1d55e0729Sdrh# 2012 October 24 2d55e0729Sdrh# 3d55e0729Sdrh# The author disclaims copyright to this source code. In place of 4d55e0729Sdrh# a legal notice, here is a blessing: 5d55e0729Sdrh# 6d55e0729Sdrh# May you do good and not evil. 7d55e0729Sdrh# May you find forgiveness for yourself and forgive others. 8d55e0729Sdrh# May you share freely, never taking more than you give. 9d55e0729Sdrh# 10d55e0729Sdrh#*********************************************************************** 11d55e0729Sdrh# This file implements regression tests for SQLite library. The 12d55e0729Sdrh# focus of this file is testing the built-in INSTR() functions. 13d55e0729Sdrh# 143432daa8Sdrh# EVIDENCE-OF: R-27549-59611 The instr(X,Y) function finds the first 153432daa8Sdrh# occurrence of string Y within string X and returns the number of prior 163432daa8Sdrh# characters plus 1, or 0 if Y is nowhere found within X. 173432daa8Sdrh# 183432daa8Sdrh 19d55e0729Sdrh 20d55e0729Sdrhset testdir [file dirname $argv0] 21d55e0729Sdrhsource $testdir/tester.tcl 22d55e0729Sdrh 23d55e0729Sdrh# Create a table to work with. 24d55e0729Sdrh# 25d55e0729Sdrhdo_test instr-1.1 { 26d55e0729Sdrh db eval {SELECT instr('abcdefg','a');} 27d55e0729Sdrh} {1} 28d55e0729Sdrhdo_test instr-1.2 { 29d55e0729Sdrh db eval {SELECT instr('abcdefg','b');} 30d55e0729Sdrh} {2} 31d55e0729Sdrhdo_test instr-1.3 { 32d55e0729Sdrh db eval {SELECT instr('abcdefg','c');} 33d55e0729Sdrh} {3} 34d55e0729Sdrhdo_test instr-1.4 { 35d55e0729Sdrh db eval {SELECT instr('abcdefg','d');} 36d55e0729Sdrh} {4} 37d55e0729Sdrhdo_test instr-1.5 { 38d55e0729Sdrh db eval {SELECT instr('abcdefg','e');} 39d55e0729Sdrh} {5} 40d55e0729Sdrhdo_test instr-1.6 { 41d55e0729Sdrh db eval {SELECT instr('abcdefg','f');} 42d55e0729Sdrh} {6} 43d55e0729Sdrhdo_test instr-1.7 { 44d55e0729Sdrh db eval {SELECT instr('abcdefg','g');} 45d55e0729Sdrh} {7} 46d55e0729Sdrhdo_test instr-1.8 { 47d55e0729Sdrh db eval {SELECT instr('abcdefg','h');} 48d55e0729Sdrh} {0} 49d55e0729Sdrhdo_test instr-1.9 { 50d55e0729Sdrh db eval {SELECT instr('abcdefg','abcdefg');} 51d55e0729Sdrh} {1} 52d55e0729Sdrhdo_test instr-1.10 { 53d55e0729Sdrh db eval {SELECT instr('abcdefg','abcdefgh');} 54d55e0729Sdrh} {0} 55d55e0729Sdrhdo_test instr-1.11 { 56d55e0729Sdrh db eval {SELECT instr('abcdefg','bcdefg');} 57d55e0729Sdrh} {2} 58d55e0729Sdrhdo_test instr-1.12 { 59d55e0729Sdrh db eval {SELECT instr('abcdefg','bcdefgh');} 60d55e0729Sdrh} {0} 61d55e0729Sdrhdo_test instr-1.13 { 62d55e0729Sdrh db eval {SELECT instr('abcdefg','cdefg');} 63d55e0729Sdrh} {3} 64d55e0729Sdrhdo_test instr-1.14 { 65d55e0729Sdrh db eval {SELECT instr('abcdefg','cdefgh');} 66d55e0729Sdrh} {0} 67d55e0729Sdrhdo_test instr-1.15 { 68d55e0729Sdrh db eval {SELECT instr('abcdefg','defg');} 69d55e0729Sdrh} {4} 70d55e0729Sdrhdo_test instr-1.16 { 71d55e0729Sdrh db eval {SELECT instr('abcdefg','defgh');} 72d55e0729Sdrh} {0} 73d55e0729Sdrhdo_test instr-1.17 { 74d55e0729Sdrh db eval {SELECT instr('abcdefg','efg');} 75d55e0729Sdrh} {5} 76d55e0729Sdrhdo_test instr-1.18 { 77d55e0729Sdrh db eval {SELECT instr('abcdefg','efgh');} 78d55e0729Sdrh} {0} 79d55e0729Sdrhdo_test instr-1.19 { 80d55e0729Sdrh db eval {SELECT instr('abcdefg','fg');} 81d55e0729Sdrh} {6} 82d55e0729Sdrhdo_test instr-1.20 { 83d55e0729Sdrh db eval {SELECT instr('abcdefg','fgh');} 84d55e0729Sdrh} {0} 85d55e0729Sdrhdo_test instr-1.21 { 86d55e0729Sdrh db eval {SELECT coalesce(instr('abcdefg',NULL),'nil');} 87d55e0729Sdrh} {nil} 88d55e0729Sdrhdo_test instr-1.22 { 89d55e0729Sdrh db eval {SELECT coalesce(instr(NULL,'x'),'nil');} 90d55e0729Sdrh} {nil} 91d55e0729Sdrhdo_test instr-1.23 { 92d55e0729Sdrh db eval {SELECT instr(12345,34);} 93d55e0729Sdrh} {3} 94d55e0729Sdrhdo_test instr-1.24 { 95d55e0729Sdrh db eval {SELECT instr(123456.78,34);} 96d55e0729Sdrh} {3} 97d55e0729Sdrhdo_test instr-1.25 { 98d55e0729Sdrh db eval {SELECT instr(123456.78,x'3334');} 99d55e0729Sdrh} {3} 100d55e0729Sdrhdo_test instr-1.26 { 101d55e0729Sdrh db eval {SELECT instr('äbcdefg','efg');} 102d55e0729Sdrh} {5} 103d55e0729Sdrhdo_test instr-1.27 { 104d55e0729Sdrh db eval {SELECT instr('€xyzzy','xyz');} 105d55e0729Sdrh} {2} 106d55e0729Sdrhdo_test instr-1.28 { 107d55e0729Sdrh db eval {SELECT instr('abc€xyzzy','xyz');} 108d55e0729Sdrh} {5} 109d55e0729Sdrhdo_test instr-1.29 { 110d55e0729Sdrh db eval {SELECT instr('abc€xyzzy','€xyz');} 111d55e0729Sdrh} {4} 112d55e0729Sdrhdo_test instr-1.30 { 113d55e0729Sdrh db eval {SELECT instr('abc€xyzzy','c€xyz');} 114d55e0729Sdrh} {3} 115d55e0729Sdrhdo_test instr-1.31 { 116d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'01');} 117d55e0729Sdrh} {1} 118d55e0729Sdrhdo_test instr-1.32 { 119d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'02');} 120d55e0729Sdrh} {2} 121d55e0729Sdrhdo_test instr-1.33 { 122d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'03');} 123d55e0729Sdrh} {3} 124d55e0729Sdrhdo_test instr-1.34 { 125d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'04');} 126d55e0729Sdrh} {4} 127d55e0729Sdrhdo_test instr-1.35 { 128d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'05');} 129d55e0729Sdrh} {5} 130d55e0729Sdrhdo_test instr-1.36 { 131d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'06');} 132d55e0729Sdrh} {0} 133d55e0729Sdrhdo_test instr-1.37 { 134d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'0102030405');} 135d55e0729Sdrh} {1} 136d55e0729Sdrhdo_test instr-1.38 { 137d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'02030405');} 138d55e0729Sdrh} {2} 139d55e0729Sdrhdo_test instr-1.39 { 140d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'030405');} 141d55e0729Sdrh} {3} 142d55e0729Sdrhdo_test instr-1.40 { 143d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'0405');} 144d55e0729Sdrh} {4} 145d55e0729Sdrhdo_test instr-1.41 { 146d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'0506');} 147d55e0729Sdrh} {0} 148d55e0729Sdrhdo_test instr-1.42 { 149d55e0729Sdrh db eval {SELECT instr(x'0102030405',x'');} 150d55e0729Sdrh} {1} 151d55e0729Sdrhdo_test instr-1.43 { 152d55e0729Sdrh db eval {SELECT instr(x'',x'');} 153d55e0729Sdrh} {1} 154d55e0729Sdrhdo_test instr-1.44 { 155d55e0729Sdrh db eval {SELECT instr('','');} 156d55e0729Sdrh} {1} 157d55e0729Sdrhdo_test instr-1.45 { 158d55e0729Sdrh db eval {SELECT instr('abcdefg','');} 159d55e0729Sdrh} {1} 160d55e0729Sdrhunset -nocomplain longstr 161d55e0729Sdrhset longstr abcdefghijklmonpqrstuvwxyz 162d55e0729Sdrhappend longstr $longstr 163d55e0729Sdrhappend longstr $longstr 164d55e0729Sdrhappend longstr $longstr 165d55e0729Sdrhappend longstr $longstr 166d55e0729Sdrhappend longstr $longstr 167d55e0729Sdrhappend longstr $longstr 168d55e0729Sdrhappend longstr $longstr 169d55e0729Sdrhappend longstr $longstr 170d55e0729Sdrhappend longstr $longstr 171d55e0729Sdrhappend longstr $longstr 172d55e0729Sdrhappend longstr $longstr 173d55e0729Sdrhappend longstr $longstr 174d55e0729Sdrh# puts [string length $longstr] 175d55e0729Sdrhappend longstr Xabcde 176d55e0729Sdrhdo_test instr-1.46 { 177d55e0729Sdrh db eval {SELECT instr($longstr,'X');} 178d55e0729Sdrh} {106497} 179d55e0729Sdrhdo_test instr-1.47 { 180d55e0729Sdrh db eval {SELECT instr($longstr,'Y');} 181d55e0729Sdrh} {0} 182d55e0729Sdrhdo_test instr-1.48 { 183d55e0729Sdrh db eval {SELECT instr($longstr,'Xa');} 184d55e0729Sdrh} {106497} 185d55e0729Sdrhdo_test instr-1.49 { 186d55e0729Sdrh db eval {SELECT instr($longstr,'zXa');} 187d55e0729Sdrh} {106496} 188d55e0729Sdrhset longstr [string map {a ä} $longstr] 189d55e0729Sdrhdo_test instr-1.50 { 190d55e0729Sdrh db eval {SELECT instr($longstr,'X');} 191d55e0729Sdrh} {106497} 192d55e0729Sdrhdo_test instr-1.51 { 193d55e0729Sdrh db eval {SELECT instr($longstr,'Y');} 194d55e0729Sdrh} {0} 195d55e0729Sdrhdo_test instr-1.52 { 196d55e0729Sdrh db eval {SELECT instr($longstr,'Xä');} 197d55e0729Sdrh} {106497} 198d55e0729Sdrhdo_test instr-1.53 { 199d55e0729Sdrh db eval {SELECT instr($longstr,'zXä');} 200d55e0729Sdrh} {106496} 201d55e0729Sdrhdo_test instr-1.54 { 202d55e0729Sdrh db eval {SELECT instr(x'78c3a4e282ac79','x');} 203d55e0729Sdrh} {1} 204d55e0729Sdrhdo_test instr-1.55 { 205d55e0729Sdrh db eval {SELECT instr(x'78c3a4e282ac79','y');} 206d55e0729Sdrh} {4} 2073432daa8Sdrh 2083432daa8Sdrh# EVIDENCE-OF: R-46421-32541 Or, if X and Y are both BLOBs, then 2093432daa8Sdrh# instr(X,Y) returns one more than the number bytes prior to the first 2103432daa8Sdrh# occurrence of Y, or 0 if Y does not occur anywhere within X. 2113432daa8Sdrh# 2123432daa8Sdrhdo_test instr-1.56.1 { 213d55e0729Sdrh db eval {SELECT instr(x'78c3a4e282ac79',x'79');} 214d55e0729Sdrh} {7} 2153432daa8Sdrhdo_test instr-1.56.2 { 2163432daa8Sdrh db eval {SELECT instr(x'78c3a4e282ac79',x'7a');} 2173432daa8Sdrh} {0} 2183432daa8Sdrhdo_test instr-1.56.3 { 2193432daa8Sdrh db eval {SELECT instr(x'78c3a4e282ac79',x'78');} 2203432daa8Sdrh} {1} 2213432daa8Sdrhdo_test instr-1.56.3 { 2223432daa8Sdrh db eval {SELECT instr(x'78c3a4e282ac79',x'a4');} 2233432daa8Sdrh} {3} 2243432daa8Sdrh 2253432daa8Sdrh# EVIDENCE-OF: R-17329-35644 If both arguments X and Y to instr(X,Y) are 2263432daa8Sdrh# non-NULL and are not BLOBs then both are interpreted as strings. 2273432daa8Sdrh# 2283432daa8Sdrhdo_test instr-1.57.1 { 229d55e0729Sdrh db eval {SELECT instr('xä€y',x'79');} 230d55e0729Sdrh} {4} 2313432daa8Sdrhdo_test instr-1.57.2 { 2323432daa8Sdrh db eval {SELECT instr('xä€y',x'a4');} 2333432daa8Sdrh} {0} 2343432daa8Sdrhdo_test instr-1.57.3 { 2353432daa8Sdrh db eval {SELECT instr(x'78c3a4e282ac79','y');} 2363432daa8Sdrh} {4} 237d55e0729Sdrh 2383432daa8Sdrh# EVIDENCE-OF: R-14708-27487 If either X or Y are NULL in instr(X,Y) 2393432daa8Sdrh# then the result is NULL. 2403432daa8Sdrh# 2413432daa8Sdrhdo_execsql_test instr-1.60 { 2423432daa8Sdrh SELECT coalesce(instr(NULL,'abc'), 999); 2433432daa8Sdrh} {999} 2443432daa8Sdrhdo_execsql_test instr-1.61 { 2453432daa8Sdrh SELECT coalesce(instr('abc',NULL), 999); 2463432daa8Sdrh} {999} 2473432daa8Sdrhdo_execsql_test instr-1.62 { 2483432daa8Sdrh SELECT coalesce(instr(NULL,NULL), 999); 2493432daa8Sdrh} {999} 250d55e0729Sdrh 2513043b532Sdando_execsql_test instr-1.63 { 2523043b532Sdan SELECT instr(X'', 'abc') 2533043b532Sdan} 0 2543043b532Sdando_execsql_test instr-1.64 { 2553043b532Sdan CREATE TABLE x1(a, b); 2563043b532Sdan INSERT INTO x1 VALUES(X'', 'abc'); 2573043b532Sdan SELECT instr(a, b) FROM x1; 2583043b532Sdan} 0 2593043b532Sdan 260*e691dcb5Sdrh# 2019-09-16 ticket https://www.sqlite.org/src/info/587791f92620090e 261*e691dcb5Sdrh# 262*e691dcb5Sdrhdo_execsql_test instr-2.0 { 263*e691dcb5Sdrh DROP TABLE IF EXISTS t0; 264*e691dcb5Sdrh CREATE TABLE t0(c0 PRIMARY KEY, c1); 265*e691dcb5Sdrh INSERT INTO t0(c0) VALUES (x'bb'), (0); 266*e691dcb5Sdrh SELECT COUNT(*) FROM t0 WHERE INSTR(x'aabb', t0.c0) ORDER BY t0.c0, t0.c1; 267*e691dcb5Sdrh} {1} 268*e691dcb5Sdrhdo_execsql_test instr-2.1 { 269*e691dcb5Sdrh SELECT quote(c0) FROM t0 WHERE INSTR(x'aabb', t0.c0) ORDER BY t0.c0, t0.c1; 270*e691dcb5Sdrh} {X'BB'} 271*e691dcb5Sdrhdo_execsql_test instr-2.2 { 272*e691dcb5Sdrh DROP TABLE IF EXISTS t1; 273*e691dcb5Sdrh CREATE TABLE t1(x); 274*e691dcb5Sdrh INSERT INTO t1(x) VALUES('text'),(x'bb'); 275*e691dcb5Sdrh SELECT quote(x) FROM t1 WHERE instr(x'aabb',x); 276*e691dcb5Sdrh} {X'BB'} 277*e691dcb5Sdrhdo_execsql_test instr-2.3 { 278*e691dcb5Sdrh SELECT quote(x) FROM t1 WHERE x>'zzz' AND instr(x'aabb',x); 279*e691dcb5Sdrh} {X'BB'} 280*e691dcb5Sdrh 281d55e0729Sdrhfinish_test 282