1# 2019 September 02 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 script is testing the FTS5 module. 13# 14 15source [file join [file dirname [info script]] fts5_common.tcl] 16set testprefix fts5misc 17 18# If SQLITE_ENABLE_FTS5 is not defined, omit this file. 19ifcapable !fts5 { 20 finish_test 21 return 22} 23 24do_execsql_test 1.0 { 25 CREATE VIRTUAL TABLE t1 USING fts5(a); 26} 27 28do_catchsql_test 1.1.1 { 29 SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*'); 30} {1 {unknown special query: }} 31do_catchsql_test 1.1.2 { 32 SELECT a FROM t1 33 WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*')); 34} {1 {unknown special query: }} 35 36do_catchsql_test 1.2.1 { 37 SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*id'); 38} {0 {{}}} 39 40do_catchsql_test 1.2.2 { 41 SELECT a FROM t1 42 WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*id')); 43} {0 {}} 44 45do_catchsql_test 1.3.1 { 46 SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads'); 47} {1 {no such cursor: 1}} 48 49do_catchsql_test 1.3.2 { 50 SELECT a FROM t1 51 WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads')); 52} {1 {no such cursor: 1}} 53 54db close 55sqlite3 db test.db 56 57do_catchsql_test 1.3.3 { 58 SELECT a FROM t1 59 WHERE rank = (SELECT highlight(t1, 4, '<b>', '</b>') FROM t1('*reads')); 60} {1 {no such cursor: 1}} 61 62#------------------------------------------------------------------------- 63reset_db 64do_execsql_test 2.0 { 65 CREATE TABLE t0(c0); 66 CREATE VIRTUAL TABLE vt0 USING fts5(c0); 67} 68do_execsql_test 2.1.1 { 69 BEGIN TRANSACTION; 70 INSERT INTO vt0(c0) VALUES ('xyz'); 71} 72do_execsql_test 2.1.2 { 73 ALTER TABLE t0 ADD COLUMN c5; 74} 75do_execsql_test 2.1.3 { 76 INSERT INTO vt0(vt0) VALUES('integrity-check'); 77} 78do_execsql_test 2.1.4 { 79 INSERT INTO vt0(c0) VALUES ('abc'); 80 COMMIT 81} 82do_execsql_test 2.1.5 { 83 INSERT INTO vt0(vt0) VALUES('integrity-check'); 84} 85 86reset_db 87do_execsql_test 2.2.1 { 88 CREATE TABLE t0(c0); 89 CREATE VIRTUAL TABLE vt0 USING fts5(c0); 90 BEGIN TRANSACTION; 91 INSERT INTO vt0(c0) VALUES ('xyz'); 92} 93 94breakpoint 95do_execsql_test 2.2.2 { 96 ALTER TABLE t0 RENAME TO t1; 97} 98do_execsql_test 2.2.3 { 99 INSERT INTO vt0(vt0) VALUES('integrity-check'); 100} 101do_execsql_test 2.2.4 { 102 INSERT INTO vt0(c0) VALUES ('abc'); 103 COMMIT; 104} 105do_execsql_test 2.2.5 { 106 INSERT INTO vt0(vt0) VALUES('integrity-check'); 107} 108 109#------------------------------------------------------------------------- 110reset_db 111do_execsql_test 3.0 { 112 CREATE VIRTUAL TABLE vt0 USING fts5(a); 113 PRAGMA reverse_unordered_selects = true; 114 INSERT INTO vt0 VALUES('365062398'), (0), (0); 115 INSERT INTO vt0(vt0, rank) VALUES('pgsz', '38'); 116} 117do_execsql_test 3.1 { 118 UPDATE vt0 SET a = 399905135; -- unexpected: database disk image is malformed 119} 120do_execsql_test 3.2 { 121 INSERT INTO vt0(vt0) VALUES('integrity-check'); 122} 123 124#------------------------------------------------------------------------- 125reset_db 126do_execsql_test 4.0 { 127 CREATE VIRTUAL TABLE vt0 USING fts5(c0); 128 INSERT INTO vt0(c0) VALUES ('xyz'); 129} 130 131do_execsql_test 4.1 { 132 BEGIN; 133 INSERT INTO vt0(c0) VALUES ('abc'); 134 INSERT INTO vt0(vt0) VALUES('rebuild'); 135 COMMIT; 136} 137 138do_execsql_test 4.2 { 139 INSERT INTO vt0(vt0) VALUES('integrity-check'); 140} 141 142do_execsql_test 4.3 { 143 BEGIN; 144 INSERT INTO vt0(vt0) VALUES('rebuild'); 145 INSERT INTO vt0(vt0) VALUES('rebuild'); 146 COMMIT; 147} 148 149do_execsql_test 4.4 { 150 INSERT INTO vt0(vt0) VALUES('integrity-check'); 151} 152 153#------------------------------------------------------------------------- 154# Ticket [81a7f7b9]. 155# 156reset_db 157do_execsql_test 5.0 { 158 CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1); 159 INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65536'); 160 WITH s(i) AS ( 161 SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1236 162 ) 163 INSERT INTO vt0(c0) SELECT '0' FROM s; 164} {} 165 166do_execsql_test 5.1 { 167 UPDATE vt0 SET c1 = 'T,D&p^y/7#3*v<b<4j7|f'; 168} 169 170do_execsql_test 5.2 { 171 INSERT INTO vt0(vt0) VALUES('integrity-check'); 172} 173 174do_catchsql_test 5.3 { 175 INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65537'); 176} {1 {SQL logic error}} 177 178#------------------------------------------------------------------------- 179# Ticket [d392017c]. 180# 181reset_db 182do_execsql_test 6.0 { 183 CREATE VIRTUAL TABLE vt0 USING fts5(c0); 184 WITH s(i) AS ( 185 SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000 186 ) 187 INSERT INTO vt0(c0) SELECT '0' FROM s; 188 INSERT INTO vt0(vt0, rank) VALUES('crisismerge', 2000); 189 INSERT INTO vt0(vt0, rank) VALUES('automerge', 0); 190} {} 191 192do_execsql_test 6.1 { 193 INSERT INTO vt0(vt0) VALUES('rebuild'); 194} 195 196#------------------------------------------------------------------------- 197# 198reset_db 199do_execsql_test 7.0 { 200 CREATE VIRTUAL TABLE t1 USING fts5(x); 201 INSERT INTO t1(rowid, x) VALUES(1, 'hello world'); 202 INSERT INTO t1(rowid, x) VALUES(2, 'well said'); 203 INSERT INTO t1(rowid, x) VALUES(3, 'hello said'); 204 INSERT INTO t1(rowid, x) VALUES(4, 'well world'); 205 206 CREATE TABLE t2 (a, b); 207 INSERT INTO t2 VALUES(1, 'hello'); 208 INSERT INTO t2 VALUES(2, 'world'); 209 INSERT INTO t2 VALUES(3, 'said'); 210 INSERT INTO t2 VALUES(4, 'hello'); 211} 212 213do_execsql_test 7.1 { 214 SELECT rowid FROM t1 WHERE (rowid, x) IN (SELECT a, b FROM t2); 215} 216 217do_execsql_test 7.2 { 218 SELECT rowid FROM t1 WHERE rowid=2 AND t1 = 'hello'; 219} 220 221#------------------------------------------------------------------------- 222# 223reset_db 224do_execsql_test 8.0 { 225 CREATE VIRTUAL TABLE vt0 USING fts5(c0, tokenize = "ascii", prefix = 1); 226 INSERT INTO vt0(c0) VALUES (x'd1'); 227} 228 229do_execsql_test 8.1 { 230 INSERT INTO vt0(vt0) VALUES('integrity-check'); 231} 232 233#------------------------------------------------------------------------- 234# 235reset_db 236do_execsql_test 9.0 { 237 CREATE VIRTUAL TABLE t1 using FTS5(mailcontent); 238 insert into t1(rowid, mailcontent) values 239 (-4764623217061966105, 'we are going to upgrade'), 240 (8324454597464624651, 'we are going to upgrade'); 241} 242 243do_execsql_test 9.1 { 244 INSERT INTO t1(t1) VALUES('integrity-check'); 245} 246 247do_execsql_test 9.2 { 248 SELECT rowid FROM t1('upgrade'); 249} { 250 -4764623217061966105 8324454597464624651 251} 252 253#------------------------------------------------------------------------- 254# 255reset_db 256do_execsql_test 10.0 { 257 CREATE VIRTUAL TABLE vt1 USING fts5(c1, c2, prefix = 1, tokenize = "ascii"); 258 INSERT INTO vt1 VALUES (x'e4', '䔬'); 259} 260 261do_execsql_test 10.1 { 262 SELECT quote(CAST(c1 AS blob)), quote(CAST(c2 AS blob)) FROM vt1 263} {X'E4' X'E494AC'} 264 265do_execsql_test 10.2 { 266 INSERT INTO vt1(vt1) VALUES('integrity-check'); 267} 268 269#------------------------------------------------------------------------- 270# 271reset_db 272do_execsql_test 11.0 { 273 CREATE VIRTUAL TABLE vt0 USING fts5( 274 c0, prefix = 71, tokenize = "porter ascii", prefix = 9 275 ); 276} {} 277do_execsql_test 11.1 { 278 BEGIN; 279 INSERT INTO vt0(c0) VALUES (x'e8'); 280} 281do_execsql_test 11.2 { 282 INSERT INTO vt0(vt0) VALUES('integrity-check'); 283} 284 285#------------------------------------------------------------------------- 286# Ticket [752fdbf6] 287# 288reset_db 289do_execsql_test 11.0 { 290 PRAGMA encoding = 'UTF-16'; 291 CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1); 292 INSERT INTO vt0(vt0, rank) VALUES('pgsz', '37'); 293 INSERT INTO vt0(c0, c1) VALUES (0.66077, 1957391816); 294} 295do_execsql_test 11.1 { 296 INSERT INTO vt0(vt0) VALUES('integrity-check'); 297} 298 299#------------------------------------------------------------------------- 300# Ticket [7c0e06b16] 301# 302do_execsql_test 12.0 { 303 CREATE TABLE t1(a, b, rank); 304 INSERT INTO t1 VALUES('a', 'hello', ''); 305 INSERT INTO t1 VALUES('b', 'world', ''); 306 307 CREATE VIRTUAL TABLE ft USING fts5(a); 308 INSERT INTO ft VALUES('b'); 309 INSERT INTO ft VALUES('y'); 310 311 CREATE TABLE t2(x, y, ft); 312 INSERT INTO t2 VALUES(1, 2, 'x'); 313 INSERT INTO t2 VALUES(3, 4, 'b'); 314} 315 316do_execsql_test 12.1 { 317 SELECT * FROM t1 NATURAL JOIN ft WHERE ft MATCH('b') 318} {b world {}} 319do_execsql_test 12.2 { 320 SELECT * FROM ft NATURAL JOIN t1 WHERE ft MATCH('b') 321} {b world {}} 322do_execsql_test 12.3 { 323 SELECT * FROM t2 JOIN ft USING (ft) 324} {3 4 b b} 325 326#------------------------------------------------------------------------- 327# Forum post https://sqlite.org/forum/forumpost/21127c1160 328# 329reset_db 330sqlite3_db_config db DEFENSIVE 1 331 332do_execsql_test 13.0 { 333 CREATE TABLE a (id INTEGER PRIMARY KEY, name TEXT); 334 CREATE VIRTUAL TABLE b USING fts5(name); 335 CREATE TRIGGER a_trigger AFTER INSERT ON a BEGIN 336 INSERT INTO b (name) VALUES ('foo'); 337 END; 338} 339 340do_test 13.1 { 341 set ::STMT [ 342 sqlite3_prepare db "INSERT INTO a VALUES (1, 'foo') RETURNING id;" -1 dummy 343 ] 344 sqlite3_step $::STMT 345} {SQLITE_ROW} 346 347do_test 13.2 { 348 sqlite3_finalize $::STMT 349} {SQLITE_OK} 350 351do_test 13.3 { 352 sqlite3_errmsg db 353} {not an error} 354 355finish_test 356 357