1d8e454e1Sdan# 2011 October 03 2d8e454e1Sdan# 3d8e454e1Sdan# The author disclaims copyright to this source code. In place of 4d8e454e1Sdan# a legal notice, here is a blessing: 5d8e454e1Sdan# 6d8e454e1Sdan# May you do good and not evil. 7d8e454e1Sdan# May you find forgiveness for yourself and forgive others. 8d8e454e1Sdan# May you share freely, never taking more than you give. 9d8e454e1Sdan# 10d8e454e1Sdan#************************************************************************* 11d8e454e1Sdan# This file implements regression tests for SQLite library. The 12d8e454e1Sdan# focus of this script is testing the content=xxx FTS4 option. 13d8e454e1Sdan# 14d8e454e1Sdan 15d8e454e1Sdanset testdir [file dirname $argv0] 16d8e454e1Sdansource $testdir/tester.tcl 17d8e454e1Sdanset ::testprefix fts4content 18d8e454e1Sdan 19d8e454e1Sdan# If SQLITE_ENABLE_FTS3 is defined, omit this file. 20d8e454e1Sdanifcapable !fts3 { 21d8e454e1Sdan finish_test 22d8e454e1Sdan return 23d8e454e1Sdan} 24d8e454e1Sdan 25cc5b8146Sdan#------------------------------------------------------------------------- 26cc5b8146Sdan# Test organization: 27cc5b8146Sdan# 28cc5b8146Sdan# 1.* - Warm-body tests. 29cc5b8146Sdan# 30cc5b8146Sdan# 2.* - Querying a content=xxx FTS table. 31cc5b8146Sdan# 32cc5b8146Sdan# 3.* - Writing to a content=xxx FTS table. 33cc5b8146Sdan# 34cc5b8146Sdan# 4.* - The "INSERT INTO fts(fts) VALUES('rebuild')" command. 35cc5b8146Sdan# 36cc5b8146Sdan# 5.* - Check that CREATE TABLE, DROP TABLE and ALTER TABLE correctly 37cc5b8146Sdan# ignore any %_content table when used with the content=xxx option. 38cc5b8146Sdan# 39cc5b8146Sdan# 6.* - Test the effects of messing with the schema of table xxx after 40cc5b8146Sdan# creating a content=xxx FTS index. 41cc5b8146Sdan# 42042f88e5Sdan# 7.* - Test that if content=xxx is specified and table xxx does not 43042f88e5Sdan# exist, the FTS table can still be used for INSERT and some 44042f88e5Sdan# SELECT statements. 45042f88e5Sdan# 468e05180fSdan# 8.* - Test that if the content=xxx and prefix options are used together, 478e05180fSdan# the 'rebuild' command still works. 488e05180fSdan# 499fe27de6Sdan# 9.* - Test using content=xxx where xxx is a virtual table. 509fe27de6Sdan# 5175395ccdSdan# 11.* - Test that circular references (e.g. "t1(content=t1)") are 5275395ccdSdan# detected. 5375395ccdSdan# 54cc5b8146Sdan 55deb94732Sdando_execsql_test 1.1.1 { 56d8e454e1Sdan CREATE TABLE t1(a, b, c); 57d8e454e1Sdan INSERT INTO t1 VALUES('w x', 'x y', 'y z'); 58d8e454e1Sdan CREATE VIRTUAL TABLE ft1 USING fts4(content=t1); 59d8e454e1Sdan} 60d8e454e1Sdan 61deb94732Sdando_execsql_test 1.1.2 { 62d8e454e1Sdan PRAGMA table_info(ft1); 63d8e454e1Sdan} { 64d8e454e1Sdan 0 a {} 0 {} 0 65d8e454e1Sdan 1 b {} 0 {} 0 66d8e454e1Sdan 2 c {} 0 {} 0 67d8e454e1Sdan} 68d8e454e1Sdan 69deb94732Sdando_execsql_test 1.1.3 { SELECT *, rowid FROM ft1 } {{w x} {x y} {y z} 1} 70deb94732Sdando_execsql_test 1.1.4 { SELECT a, c FROM ft1 WHERE rowid=1 } {{w x} {y z}} 71d8e454e1Sdan 72deb94732Sdando_execsql_test 1.1.5 { INSERT INTO ft1(ft1) VALUES('rebuild') } {} 73deb94732Sdando_execsql_test 1.1.6 { SELECT rowid FROM ft1 WHERE ft1 MATCH 'x' } {1} 74deb94732Sdando_execsql_test 1.1.7 { SELECT rowid FROM ft1 WHERE ft1 MATCH 'a' } {} 75deb94732Sdan 76deb94732Sdando_execsql_test 1.2.1 { 77deb94732Sdan DROP TABLE ft1; 78deb94732Sdan CREATE VIRTUAL TABLE ft1 USING fts4(content=t1, b); 79deb94732Sdan PRAGMA table_info(ft1); 80deb94732Sdan} { 81deb94732Sdan 0 b {} 0 {} 0 82deb94732Sdan} 83deb94732Sdando_execsql_test 1.2.2 { 84deb94732Sdan SELECT *, rowid FROM ft1 85deb94732Sdan} {{x y} 1} 86d8e454e1Sdan 87d8e454e1Sdan#------------------------------------------------------------------------- 88d8e454e1Sdan# The following block of tests - 2.* - test that a content=xxx FTS table 89d8e454e1Sdan# can be queried. Also tested are cases where rows identified in the FTS 90d8e454e1Sdan# are missing from the content table, and cases where the index is 91d8e454e1Sdan# inconsistent with the content table. 92d8e454e1Sdan# 93d8e454e1Sdando_execsql_test 2.0 { 94d8e454e1Sdan CREATE TABLE t2(x); 95d8e454e1Sdan INSERT INTO t2 VALUES('O S W W F U C R Q I C N P Z Y Y E Y Y E'); -- 1 96d8e454e1Sdan INSERT INTO t2 VALUES('Y X U V L B E H Y J C Y A I A P V F V K'); -- 2 97d8e454e1Sdan INSERT INTO t2 VALUES('P W I N J H I I N I F B K D U Q B Z S F'); -- 3 98d8e454e1Sdan INSERT INTO t2 VALUES('N R O R H J R H G M D I U U B O M P A U'); -- 4 99d8e454e1Sdan INSERT INTO t2 VALUES('Y O V O G T P N G T N F I V B U M J M G'); -- 5 100d8e454e1Sdan INSERT INTO t2 VALUES('J O B N K N E C H Z R K J O U G M K L S'); -- 6 101d8e454e1Sdan INSERT INTO t2 VALUES('S Z S R I Q U A P W R X H K C Z U L S P'); -- 7 102d8e454e1Sdan INSERT INTO t2 VALUES('J C H N R C K R V N M O F Z M Z A I H W'); -- 8 103d8e454e1Sdan INSERT INTO t2 VALUES('O Y G I S J U U W O D Z F J K N R P R L'); -- 9 104d8e454e1Sdan INSERT INTO t2 VALUES('B G L K U R U P V X Z I H V R W C Q A S'); -- 10 105d8e454e1Sdan INSERT INTO t2 VALUES('T F T J F F Y V F W N X K Q A Y L X W G'); -- 11 106d8e454e1Sdan INSERT INTO t2 VALUES('C J U H B Q X L C M M Y E G V F W V Z C'); -- 12 107d8e454e1Sdan INSERT INTO t2 VALUES('B W L T F S G X D P H N G M R I O A X I'); -- 13 108d8e454e1Sdan INSERT INTO t2 VALUES('N G Y O K Q K Z N M H U J E D H U W R K'); -- 14 109d8e454e1Sdan INSERT INTO t2 VALUES('U D T R U Y F J D S J X E H Q G V A S Z'); -- 15 110d8e454e1Sdan INSERT INTO t2 VALUES('M I W P J S H R J D Q I C G P C T P H R'); -- 16 111d8e454e1Sdan INSERT INTO t2 VALUES('J M N I S L X Q C A B F C B Y D H V R J'); -- 17 112d8e454e1Sdan INSERT INTO t2 VALUES('F V Z W J Q L P X Y E W B U Q N H X K T'); -- 18 113d8e454e1Sdan INSERT INTO t2 VALUES('R F S R Y O F Q E I E G H C B H R X Y N'); -- 19 114d8e454e1Sdan INSERT INTO t2 VALUES('U Q Q Q T E P D M F X P J G H X C Q D L'); -- 20 115d8e454e1Sdan} 116d8e454e1Sdan 117d8e454e1Sdando_execsql_test 2.1 { 118d8e454e1Sdan CREATE VIRTUAL TABLE ft2 USING fts4(content=t2); 119d8e454e1Sdan INSERT INTO ft2(ft2) VALUES('rebuild'); 120d8e454e1Sdan 121d8e454e1Sdan -- Modify the backing table a bit: Row 17 is missing and the contents 122d8e454e1Sdan -- of row 20 do not match the FTS index contents. 123d8e454e1Sdan DELETE FROM t2 WHERE rowid = 17; 124d8e454e1Sdan UPDATE t2 SET x = 'a b c d e f g h i j' WHERE rowid = 20; 125d8e454e1Sdan} 126d8e454e1Sdan 127d8e454e1Sdanforeach {tn match rowidlist} { 128d8e454e1Sdan 1 {S} {1 3 6 7 9 10 13 15 16 17 19} 129d8e454e1Sdan 2 {"S R"} {7 19} 130d8e454e1Sdan 3 {"N K N"} {6} 131d8e454e1Sdan 4 {"Q Q"} {20} 132d8e454e1Sdan 5 {"B Y D"} {17} 133d8e454e1Sdan} { 134d8e454e1Sdan do_execsql_test 2.2.1.$tn { 135d8e454e1Sdan SELECT rowid FROM ft2 WHERE ft2 MATCH $match 136d8e454e1Sdan } $rowidlist 137d8e454e1Sdan 138d8e454e1Sdan do_execsql_test 2.2.2.$tn { 139d8e454e1Sdan SELECT docid FROM ft2 WHERE ft2 MATCH $match 140d8e454e1Sdan } $rowidlist 141d8e454e1Sdan} 142d8e454e1Sdan 143d8e454e1Sdanforeach {tn match result} { 144d8e454e1Sdan 1 {"N K N"} {{J O B N K N E C H Z R K J O U G M K L S}} 145d8e454e1Sdan 2 {"Q Q"} {{a b c d e f g h i j}} 146d8e454e1Sdan 3 {"B Y D"} {{}} 147d8e454e1Sdan} { 148d8e454e1Sdan do_execsql_test 2.3.$tn { 149d8e454e1Sdan SELECT * FROM ft2 WHERE ft2 MATCH $match 150d8e454e1Sdan } $result 151d8e454e1Sdan} 152d8e454e1Sdan 153d8e454e1Sdanforeach {tn match result} { 154d8e454e1Sdan 1 {"N K N"} {{..O B [N] [K] [N] E..}} 155d8e454e1Sdan 2 {"B Y D"} {{}} 156d8e454e1Sdan 3 {"Q Q"} {{a [b] [c] [d] e f..}} 157d8e454e1Sdan} { 158d8e454e1Sdan do_execsql_test 2.4.$tn { 159d8e454e1Sdan SELECT snippet(ft2, '[', ']', '..', -1, 6) FROM ft2 WHERE ft2 MATCH $match 160d8e454e1Sdan } $result 161d8e454e1Sdan} 162d8e454e1Sdan 163d8e454e1Sdanforeach {tn match result} { 164d8e454e1Sdan 1 {"N K N"} {{0 0 6 1 0 1 8 1 0 2 10 1}} 165d8e454e1Sdan 2 {"B Y D"} {{}} 166d8e454e1Sdan 3 {"Q Q"} {{0 0 2 1 0 0 4 1 0 1 4 1 0 1 6 1}} 167d8e454e1Sdan 4 {"Q D L"} {{}} 168d8e454e1Sdan} { 169d8e454e1Sdan do_execsql_test 2.5.$tn { 170d8e454e1Sdan SELECT offsets(ft2) FROM ft2 WHERE ft2 MATCH $match 171d8e454e1Sdan } $result 172d8e454e1Sdan} 173d8e454e1Sdan 174d8e454e1Sdan#------------------------------------------------------------------------- 175d8e454e1Sdan# The following block of tests - 3.* - test that the FTS index can be 176d8e454e1Sdan# modified by writing to the table. But that this has no effect on the 177d8e454e1Sdan# content table. 178d8e454e1Sdan# 179d8e454e1Sdan 180d8e454e1Sdando_execsql_test 3.1 { 181d8e454e1Sdan CREATE TABLE t3(x, y); 182d8e454e1Sdan CREATE VIRTUAL TABLE ft3 USING fts4(content=t3); 183d8e454e1Sdan} 184d8e454e1Sdan 185d8e454e1Sdando_catchsql_test 3.1.1 { 186d8e454e1Sdan INSERT INTO ft3 VALUES('a b c', 'd e f'); 187d8e454e1Sdan} {1 {constraint failed}} 188d8e454e1Sdando_execsql_test 3.1.2 { 189d8e454e1Sdan INSERT INTO ft3(docid, x, y) VALUES(21, 'a b c', 'd e f'); 190d8e454e1Sdan SELECT rowid FROM ft3 WHERE ft3 MATCH '"a b c"'; 191d8e454e1Sdan} {21} 192d8e454e1Sdando_execsql_test 3.1.3 { SELECT * FROM t3 } {} 193d8e454e1Sdan 194d8e454e1Sdan# This DELETE does not work, since there is no row in [t3] to base the 195d8e454e1Sdan# DELETE on. So the SELECT on [ft3] still returns rowid 21. 196d8e454e1Sdando_execsql_test 3.1.4 { 197d8e454e1Sdan DELETE FROM ft3; 198d8e454e1Sdan SELECT rowid FROM ft3 WHERE ft3 MATCH '"a b c"'; 199d8e454e1Sdan} {21} 200d8e454e1Sdan 201d8e454e1Sdan# If the row is added to [t3] before the DELETE on [ft3], it works. 202d8e454e1Sdando_execsql_test 3.1.5 { 203d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(21, 'a b c', 'd e f'); 204d8e454e1Sdan DELETE FROM ft3; 205d8e454e1Sdan SELECT rowid FROM ft3 WHERE ft3 MATCH '"a b c"'; 206d8e454e1Sdan} {} 207d8e454e1Sdando_execsql_test 3.1.6 { SELECT rowid FROM t3 } {21} 208d8e454e1Sdan 209d8e454e1Sdando_execsql_test 3.2.1 { 210d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(0, 'R T M S M', 'A F O K H'); 211d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(1, 'C Z J O X', 'U S Q D K'); 212d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(2, 'N G H P O', 'N O P O C'); 213d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(3, 'V H S D R', 'K N G E C'); 214d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(4, 'J T R V U', 'U X S L C'); 215d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(5, 'N A Y N G', 'X D G P Y'); 216d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(6, 'I Q I S P', 'D R O Q B'); 217d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(7, 'T K T Z J', 'B W D G O'); 218d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(8, 'Y K F X T', 'D F G V G'); 219d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(9, 'E L E T L', 'P W N F Z'); 220d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(10, 'O G J G X', 'G J F E P'); 221d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(11, 'O L N N Z', 'K E Z F D'); 222d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(12, 'R Z M R J', 'X G I M Z'); 223d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(13, 'L X N N X', 'R R N S T'); 224d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(14, 'F L B J H', 'K W F L C'); 225d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(15, 'P E B M V', 'E A A B U'); 226d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(16, 'V E C F P', 'L U T V K'); 227d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(17, 'T N O Z N', 'T P Q X N'); 228d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(18, 'V W U W R', 'H O A A V'); 229d8e454e1Sdan INSERT INTO ft3(rowid, x, y) VALUES(19, 'A H N L F', 'I G H B O'); 230d8e454e1Sdan} 231d8e454e1Sdan 232d8e454e1Sdanforeach {tn match rowidlist} { 233d8e454e1Sdan 1 "N A" {5 19} 234d8e454e1Sdan 2 "x:O" {1 2 10 11 17} 235d8e454e1Sdan 3 "y:O" {0 2 6 7 18 19} 236d8e454e1Sdan} { 237d8e454e1Sdan set res [list] 238d8e454e1Sdan foreach rowid $rowidlist { lappend res $rowid {} {} } 239d8e454e1Sdan 240d8e454e1Sdan do_execsql_test 3.2.2.$tn { 241d8e454e1Sdan SELECT rowid, * FROM ft3 WHERE ft3 MATCH $match 242d8e454e1Sdan } $res 243d8e454e1Sdan do_execsql_test 3.2.3.$tn { 244d8e454e1Sdan SELECT docid, * FROM ft3 WHERE ft3 MATCH $match 245d8e454e1Sdan } $res 246d8e454e1Sdan} 247d8e454e1Sdan 248d8e454e1Sdando_execsql_test 3.3.1 { 249d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(0, 'R T M S M', 'A F O K H'); 250d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(1, 'C Z J O X', 'U S Q D K'); 251d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(2, 'N G H P O', 'N O P O C'); 252d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(3, 'V H S D R', 'K N G E C'); 253d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(4, 'J T R V U', 'U X S L C'); 254d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(5, 'N A Y N G', 'X D G P Y'); 255d8e454e1Sdan UPDATE ft3 SET x = y, y = x; 256d8e454e1Sdan DELETE FROM t3; 257d8e454e1Sdan} 258d8e454e1Sdan 259d8e454e1Sdanforeach {tn match rowidlist} { 260d8e454e1Sdan 1 "N A" {5 19} 261d8e454e1Sdan 2 "x:O" {0 2 10 11 17} 262d8e454e1Sdan 3 "y:O" {1 2 6 7 18 19} 263d8e454e1Sdan} { 264d8e454e1Sdan set res [list] 265d8e454e1Sdan foreach rowid $rowidlist { lappend res $rowid {} {} } 266d8e454e1Sdan 267d8e454e1Sdan do_execsql_test 3.3.2.$tn { 268d8e454e1Sdan SELECT rowid, * FROM ft3 WHERE ft3 MATCH $match 269d8e454e1Sdan } $res 270d8e454e1Sdan do_execsql_test 3.3.3.$tn { 271d8e454e1Sdan SELECT docid, * FROM ft3 WHERE ft3 MATCH $match 272d8e454e1Sdan } $res 273d8e454e1Sdan} 274d8e454e1Sdan 275d8e454e1Sdando_execsql_test 3.3.1 { 276d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(15, 'P E B M V', 'E A A B U'); 277d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(16, 'V E C F P', 'L U T V K'); 278d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(17, 'T N O Z N', 'T P Q X N'); 279d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(18, 'V W U W R', 'H O A A V'); 280d8e454e1Sdan INSERT INTO t3(rowid, x, y) VALUES(19, 'A H N L F', 'I G H B O'); 281d8e454e1Sdan DELETE FROM ft3; 282d8e454e1Sdan} 283d8e454e1Sdan 284d8e454e1Sdanforeach {tn match rowidlist} { 285d8e454e1Sdan 1 "N A" {5} 286d8e454e1Sdan 2 "x:O" {0 2 10 11} 287d8e454e1Sdan 3 "y:O" {1 2 6 7} 288d8e454e1Sdan} { 289d8e454e1Sdan set res [list] 290d8e454e1Sdan foreach rowid $rowidlist { lappend res $rowid {} {} } 291d8e454e1Sdan 292d8e454e1Sdan do_execsql_test 3.3.2.$tn { 293d8e454e1Sdan SELECT rowid, * FROM ft3 WHERE ft3 MATCH $match 294d8e454e1Sdan } $res 295d8e454e1Sdan do_execsql_test 3.3.3.$tn { 296d8e454e1Sdan SELECT docid, * FROM ft3 WHERE ft3 MATCH $match 297d8e454e1Sdan } $res 298d8e454e1Sdan} 299d8e454e1Sdan 300d8e454e1Sdan 301d8e454e1Sdan#------------------------------------------------------------------------- 302d8e454e1Sdan# Test cases 4.* test the 'rebuild' command. On content=xxx and regular 303d8e454e1Sdan# FTS tables. 304d8e454e1Sdan# 305d8e454e1Sdando_execsql_test 4.0 { 306d8e454e1Sdan CREATE TABLE t4(x); 307d8e454e1Sdan CREATE VIRTUAL TABLE ft4 USING fts4(content=t4); 308d8e454e1Sdan CREATE VIRTUAL TABLE ft4x USING fts4(x); 309d8e454e1Sdan} 310d8e454e1Sdan 311d8e454e1Sdando_execsql_test 4.1.1 { 312d8e454e1Sdan INSERT INTO ft4x(ft4x) VALUES('rebuild'); 313d8e454e1Sdan INSERT INTO ft4(ft4) VALUES('rebuild'); 314d8e454e1Sdan} {} 315d8e454e1Sdando_execsql_test 4.1.2 { 316d8e454e1Sdan SELECT id, quote(value) FROM ft4_stat 317d8e454e1Sdan} {0 X'000000'} 318d8e454e1Sdando_execsql_test 4.1.3 { 319d8e454e1Sdan SELECT id, quote(value) FROM ft4x_stat 320d8e454e1Sdan} {0 X'000000'} 321d8e454e1Sdan 322d8e454e1Sdando_execsql_test 4.2.1 { 323d8e454e1Sdan INSERT INTO ft4x VALUES('M G M F T'); 324d8e454e1Sdan INSERT INTO ft4x VALUES('Z Q C A U'); 325d8e454e1Sdan INSERT INTO ft4x VALUES('N L L V'); 326d8e454e1Sdan INSERT INTO ft4x VALUES('T F D X D'); 327d8e454e1Sdan INSERT INTO ft4x VALUES('Z H I S D'); 328d8e454e1Sdan 329d8e454e1Sdan SELECT id, quote(value) FROM ft4x_stat 330d8e454e1Sdan} {0 X'05182B'} 331d8e454e1Sdan 332d8e454e1Sdando_execsql_test 4.2.2 { 333d8e454e1Sdan INSERT INTO ft4(rowid, x) SELECT rowid, * FROM ft4x; 334d8e454e1Sdan SELECT id, quote(value) FROM ft4_stat 335d8e454e1Sdan} {0 X'05182B'} 336d8e454e1Sdan 337d8e454e1Sdando_execsql_test 4.2.3 { 338d8e454e1Sdan SELECT docid, quote(size) FROM ft4_docsize 339d8e454e1Sdan} {1 X'05' 2 X'05' 3 X'04' 4 X'05' 5 X'05'} 340d8e454e1Sdan 341d8e454e1Sdando_execsql_test 4.2.4 { 342d8e454e1Sdan INSERT INTO ft4x(ft4x) VALUES('rebuild'); 343d8e454e1Sdan SELECT id, quote(value) FROM ft4x_stat; 344d8e454e1Sdan SELECT docid, quote(size) FROM ft4x_docsize 345d8e454e1Sdan} {0 X'05182B' 1 X'05' 2 X'05' 3 X'04' 4 X'05' 5 X'05'} 346d8e454e1Sdan 347d8e454e1Sdando_execsql_test 4.2.5 { 348d8e454e1Sdan INSERT INTO ft4(ft4) VALUES('rebuild'); 349d8e454e1Sdan SELECT id, quote(value) FROM ft4_stat; 350d8e454e1Sdan SELECT docid, quote(size) FROM ft4_docsize 351d8e454e1Sdan} {0 X'000000'} 352d8e454e1Sdan 353d8e454e1Sdando_execsql_test 4.2.6 { 354d8e454e1Sdan INSERT INTO t4(rowid, x) SELECT rowid, x FROM ft4x; 355d8e454e1Sdan INSERT INTO ft4(ft4) VALUES('rebuild'); 356d8e454e1Sdan SELECT id, quote(value) FROM ft4_stat; 357d8e454e1Sdan SELECT docid, quote(size) FROM ft4_docsize 358d8e454e1Sdan} {0 X'05182B' 1 X'05' 2 X'05' 3 X'04' 4 X'05' 5 X'05'} 359d8e454e1Sdan 360d8e454e1Sdan 361d8e454e1Sdan#------------------------------------------------------------------------- 362d8e454e1Sdan# Test cases 5.* test that the following commands do not create/move or 363d8e454e1Sdan# delete a %_content table when used with a content=xxx FTS table. 364d8e454e1Sdan# 365d8e454e1Sdando_execsql_test 5.1.1 { 366d8e454e1Sdan CREATE TABLE t5(a, b, c, d); 367d8e454e1Sdan CREATE VIRTUAL TABLE ft5 USING fts4(content=t5); 368d8e454e1Sdan SELECT name FROM sqlite_master WHERE name LIKE '%t5%'; 369d8e454e1Sdan} { 370d8e454e1Sdan t5 ft5 ft5_segments ft5_segdir 371d8e454e1Sdan sqlite_autoindex_ft5_segdir_1 ft5_docsize ft5_stat 372d8e454e1Sdan} 373d8e454e1Sdando_execsql_test 5.1.2 { 374d8e454e1Sdan ALTER TABLE ft5 RENAME TO ft6; 375d8e454e1Sdan SELECT name FROM sqlite_master WHERE name LIKE '%t5%'; 376d8e454e1Sdan} { 377d8e454e1Sdan t5 378d8e454e1Sdan} 379d8e454e1Sdando_execsql_test 5.1.3 { 380d8e454e1Sdan SELECT name FROM sqlite_master WHERE name LIKE '%t6%'; 381d8e454e1Sdan} { 382d8e454e1Sdan ft6 ft6_segments ft6_segdir 383d8e454e1Sdan sqlite_autoindex_ft6_segdir_1 ft6_docsize ft6_stat 384d8e454e1Sdan} 385d8e454e1Sdando_execsql_test 5.1.4 { 386d8e454e1Sdan INSERT INTO t5 VALUES('a', 'b', 'c', 'd'); 387d8e454e1Sdan INSERT INTO ft6(ft6) VALUES('rebuild'); 388d8e454e1Sdan SELECT rowid FROM ft6 WHERE ft6 MATCH 'b'; 389d8e454e1Sdan} {1} 390d8e454e1Sdando_execsql_test 5.1.5 { 391d8e454e1Sdan DROP TABLE ft6; 392d8e454e1Sdan SELECT * FROM t5; 393d8e454e1Sdan} {a b c d} 394d8e454e1Sdando_execsql_test 5.1.6 { 395d8e454e1Sdan SELECT name FROM sqlite_master WHERE name LIKE '%t6%'; 396d8e454e1Sdan} { 397d8e454e1Sdan} 398d8e454e1Sdando_execsql_test 5.1.7 { 399d8e454e1Sdan CREATE VIRTUAL TABLE ft5 USING fts4(content=t5); 400d8e454e1Sdan CREATE TABLE t5_content(a, b); 401d8e454e1Sdan DROP TABLE ft5; 402d8e454e1Sdan SELECT name FROM sqlite_master WHERE name LIKE '%t5%'; 403d8e454e1Sdan} { 404d8e454e1Sdan t5 t5_content 405d8e454e1Sdan} 406d8e454e1Sdan 407cc5b8146Sdan#------------------------------------------------------------------------- 408cc5b8146Sdan# Test cases 6.* test 409cc5b8146Sdan# 410cc5b8146Sdando_catchsql_test 6.1.1 { 411cc5b8146Sdan CREATE VIRTUAL TABLE ft7 USING fts4(content=t7); 41275395ccdSdan} {1 {no such table: main.t7}} 413cc5b8146Sdan 414cc5b8146Sdando_execsql_test 6.2.1 { 415cc5b8146Sdan CREATE TABLE t7(one, two); 416cc5b8146Sdan CREATE VIRTUAL TABLE ft7 USING fts4(content=t7); 417cc5b8146Sdan INSERT INTO t7 VALUES('A B', 'B A'); 418cc5b8146Sdan INSERT INTO t7 VALUES('C D', 'A A'); 419cc5b8146Sdan SELECT * FROM ft7; 420cc5b8146Sdan} { 421cc5b8146Sdan {A B} {B A} {C D} {A A} 422cc5b8146Sdan} 423cc5b8146Sdan 424cc5b8146Sdando_catchsql_test 6.2.2 { 425cc5b8146Sdan DROP TABLE t7; 426cc5b8146Sdan SELECT * FROM ft7; 427a690ff36Sdrh} {1 {SQL logic error}} 428cc5b8146Sdan 429cc5b8146Sdandb close 430cc5b8146Sdansqlite3 db test.db 431cc5b8146Sdando_execsql_test 6.2.3 { 432cc5b8146Sdan SELECT name FROM sqlite_master WHERE name LIKE '%t7%' 433cc5b8146Sdan} { 434cc5b8146Sdan ft7 ft7_segments ft7_segdir sqlite_autoindex_ft7_segdir_1 435cc5b8146Sdan ft7_docsize ft7_stat 436cc5b8146Sdan} 437cc5b8146Sdando_catchsql_test 6.2.4 { 438cc5b8146Sdan SELECT * FROM ft7; 43975395ccdSdan} {1 {no such table: main.t7}} 440cc5b8146Sdando_execsql_test 6.2.5 { 441cc5b8146Sdan CREATE TABLE t7(x, y); 442cc5b8146Sdan INSERT INTO t7 VALUES('A B', 'B A'); 443cc5b8146Sdan INSERT INTO t7 VALUES('C D', 'A A'); 444cc5b8146Sdan SELECT * FROM ft7; 445cc5b8146Sdan} { 446cc5b8146Sdan {A B} {B A} {C D} {A A} 447cc5b8146Sdan} 448cc5b8146Sdan 449cc5b8146Sdando_execsql_test 6.2.6 { 450cc5b8146Sdan INSERT INTO ft7(ft7) VALUES('rebuild'); 451cc5b8146Sdan SELECT rowid FROM ft7 WHERE ft7 MATCH '"A A"'; 452cc5b8146Sdan} {2} 453cc5b8146Sdan 454cc5b8146Sdando_execsql_test 6.2.7 { 455cc5b8146Sdan DROP TABLE t7; 456cc5b8146Sdan CREATE TABLE t7(x); 457cc5b8146Sdan} 458cc5b8146Sdando_catchsql_test 6.2.8 { 459deb94732Sdan SELECT * FROM ft7 WHERE ft7 MATCH '"A A"'; 460a690ff36Sdrh} {1 {SQL logic error}} 461cc5b8146Sdando_catchsql_test 6.2.9 { 462deb94732Sdan SELECT * FROM ft7 WHERE ft7 MATCH '"A A"'; 463a690ff36Sdrh} {1 {SQL logic error}} 464cc5b8146Sdan 465cc5b8146Sdandb close 466cc5b8146Sdansqlite3 db test.db 467cc5b8146Sdando_catchsql_test 6.2.10 { 468cc5b8146Sdan SELECT rowid FROM ft7 WHERE ft7 MATCH '"A A"'; 469cc5b8146Sdan} {0 2} 470cc5b8146Sdando_catchsql_test 6.2.11 { 471cc5b8146Sdan SELECT rowid, * FROM ft7 WHERE ft7 MATCH '"A A"'; 472cc5b8146Sdan} {0 {2 {}}} 473cc5b8146Sdan 474deb94732Sdan#------------------------------------------------------------------------- 475deb94732Sdan# Test cases 7.* 476deb94732Sdan# 477deb94732Sdando_execsql_test 7.1.1 { 478deb94732Sdan CREATE VIRTUAL TABLE ft8 USING fts4(content=nosuchtable, x); 479deb94732Sdan INSERT INTO ft8(docid, x) VALUES(13, 'U O N X G'); 480deb94732Sdan INSERT INTO ft8(docid, x) VALUES(14, 'C J J U B'); 481deb94732Sdan INSERT INTO ft8(docid, x) VALUES(15, 'N J Y G X'); 482deb94732Sdan INSERT INTO ft8(docid, x) VALUES(16, 'R Y D O R'); 483deb94732Sdan INSERT INTO ft8(docid, x) VALUES(17, 'I Y T Q O'); 484deb94732Sdan} 485deb94732Sdan 486deb94732Sdando_execsql_test 7.1.2 { 487deb94732Sdan SELECT docid FROM ft8 WHERE ft8 MATCH 'N'; 488deb94732Sdan} {13 15} 489deb94732Sdan 490042f88e5Sdando_execsql_test 7.2.1 { 491042f88e5Sdan CREATE VIRTUAL TABLE ft9 USING fts4(content=, x); 492042f88e5Sdan INSERT INTO ft9(docid, x) VALUES(13, 'U O N X G'); 493042f88e5Sdan INSERT INTO ft9(docid, x) VALUES(14, 'C J J U B'); 494042f88e5Sdan INSERT INTO ft9(docid, x) VALUES(15, 'N J Y G X'); 495042f88e5Sdan INSERT INTO ft9(docid, x) VALUES(16, 'R Y D O R'); 496042f88e5Sdan INSERT INTO ft9(docid, x) VALUES(17, 'I Y T Q O'); 497042f88e5Sdan} 498042f88e5Sdando_execsql_test 7.2.2 { 499042f88e5Sdan SELECT docid FROM ft9 WHERE ft9 MATCH 'N'; 500042f88e5Sdan} {13 15} 501042f88e5Sdando_execsql_test 7.2.3 { 502042f88e5Sdan SELECT name FROM sqlite_master WHERE name LIKE 'ft9_%'; 503042f88e5Sdan} {ft9_segments ft9_segdir ft9_docsize ft9_stat} 504042f88e5Sdan 505042f88e5Sdando_catchsql_test 7.2.4 { 506042f88e5Sdan SELECT * FROM ft9 WHERE ft9 MATCH 'N'; 507a690ff36Sdrh} {1 {SQL logic error}} 508042f88e5Sdan 5098e05180fSdan#------------------------------------------------------------------------- 5108e05180fSdan# Test cases 8.* 5118e05180fSdan# 5128e05180fSdando_execsql_test 8.1 { 5138e05180fSdan CREATE TABLE t10(a, b); 5148e05180fSdan INSERT INTO t10 VALUES( 5158e05180fSdan 'abasia abasic abask', 'Abassin abastardize abatable'); 5168e05180fSdan INSERT INTO t10 VALUES( 5178e05180fSdan 'abate abatement abater', 'abatis abatised abaton'); 5188e05180fSdan INSERT INTO t10 VALUES( 5198e05180fSdan 'abator abattoir Abatua', 'abature abave abaxial'); 5208e05180fSdan 5218e05180fSdan CREATE VIRTUAL TABLE ft10 USING fts4(content=t10, prefix="2,4", a, b); 5228e05180fSdan} 5238e05180fSdan 5248e05180fSdando_execsql_test 8.2 { SELECT * FROM ft10 WHERE a MATCH 'ab*'; } 5258e05180fSdando_execsql_test 8.3 { INSERT INTO ft10(ft10) VALUES('rebuild'); } 5268e05180fSdando_execsql_test 8.4 { SELECT rowid FROM ft10 WHERE a MATCH 'ab*'; } {1 2 3} 5278e05180fSdando_execsql_test 8.5 { SELECT rowid FROM ft10 WHERE b MATCH 'abav*'; } {3} 5288e05180fSdando_execsql_test 8.6 { SELECT rowid FROM ft10 WHERE ft10 MATCH 'abas*'; } {1} 5298e05180fSdan 5309fe27de6Sdan#------------------------------------------------------------------------- 5319fe27de6Sdan# Test cases 9.* 5329fe27de6Sdan# 5339fe27de6Sdanreset_db 5349fe27de6Sdanregister_echo_module [sqlite3_connection_pointer db] 5359fe27de6Sdan 5369fe27de6Sdando_execsql_test 9.1 { 5379fe27de6Sdan CREATE TABLE tbl1(a, b); 5389fe27de6Sdan INSERT INTO tbl1 VALUES('a b', 'c d'); 5399fe27de6Sdan INSERT INTO tbl1 VALUES('e f', 'a b'); 5409fe27de6Sdan CREATE VIRTUAL TABLE e1 USING echo(tbl1); 5419fe27de6Sdan CREATE VIRTUAL TABLE ft1 USING fts4(content=e1); 5429fe27de6Sdan INSERT INTO ft1(ft1) VALUES('rebuild'); 5439fe27de6Sdan} 5449fe27de6Sdan 5459fe27de6Sdando_execsql_test 9.2 { 5469fe27de6Sdan SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'e' 5479fe27de6Sdan} {2 {e f} {a b}} 5489fe27de6Sdan 5499fe27de6Sdando_execsql_test 9.3 { 5509fe27de6Sdan SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'a' 5519fe27de6Sdan} {1 {a b} {c d} 2 {e f} {a b}} 5529fe27de6Sdan 5539fe27de6Sdando_execsql_test 9.4 { 5549fe27de6Sdan DELETE FROM ft1 WHERE docid=1; 5559fe27de6Sdan} 5569fe27de6Sdan 5579fe27de6Sdando_execsql_test 9.5 { 5589fe27de6Sdan SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'a' 5599fe27de6Sdan} {2 {e f} {a b}} 5609fe27de6Sdan 5619fe27de6Sdando_execsql_test 9.6 { 5629fe27de6Sdan INSERT INTO ft1(ft1) VALUES('rebuild'); 5639fe27de6Sdan SELECT rowid, * FROM ft1 WHERE ft1 MATCH 'a' 5649fe27de6Sdan} {1 {a b} {c d} 2 {e f} {a b}} 5659fe27de6Sdan 5669fe27de6Sdan 5679f5ff371Sdan#------------------------------------------------------------------------- 5689f5ff371Sdan# Test cases 10.* 5699f5ff371Sdan# 5709f5ff371Sdanreset_db 5719f5ff371Sdanregister_fs_module [sqlite3_connection_pointer db] 5729f5ff371Sdan 5739f5ff371Sdanproc write_file {path text} { 5749f5ff371Sdan set fd [open $path w] 5759f5ff371Sdan puts -nonewline $fd $text 5769f5ff371Sdan close $fd 5779f5ff371Sdan} 5789f5ff371Sdan 5799f5ff371Sdanwrite_file t1.txt {a b c d e f g h i j k l m n o p q r s t u v w x y z} 5809f5ff371Sdanwrite_file t2.txt {a b c d e f g h i j k l m a b c d e f g h i j k l m} 5819f5ff371Sdanwrite_file t3.txt {n o p q r s t u v w x y z n o p q r s t u v w x y z} 5829f5ff371Sdan 5839f5ff371Sdando_execsql_test 10.1 { 5849f5ff371Sdan CREATE TABLE idx(id INTEGER PRIMARY KEY, path TEXT); 5859f5ff371Sdan INSERT INTO idx VALUES (1, 't1.txt'); 5869f5ff371Sdan INSERT INTO idx VALUES (2, 't2.txt'); 5879f5ff371Sdan INSERT INTO idx VALUES (3, 't3.txt'); 5889f5ff371Sdan 5899f5ff371Sdan CREATE VIRTUAL TABLE vt USING fs(idx); 5901e93173fSdan SELECT path, data FROM vt; 5919f5ff371Sdan} { 5929f5ff371Sdan 1 {a b c d e f g h i j k l m n o p q r s t u v w x y z} 5939f5ff371Sdan 2 {a b c d e f g h i j k l m a b c d e f g h i j k l m} 5949f5ff371Sdan 3 {n o p q r s t u v w x y z n o p q r s t u v w x y z} 5959f5ff371Sdan} 5969f5ff371Sdan 5979f5ff371Sdando_execsql_test 10.2 { 5981e93173fSdan SELECT path, data FROM vt WHERE rowid = 2; 5999f5ff371Sdan} { 6009f5ff371Sdan 2 {a b c d e f g h i j k l m a b c d e f g h i j k l m} 6019f5ff371Sdan} 6029f5ff371Sdan 6039f5ff371Sdando_execsql_test 10.3 { 6049f5ff371Sdan CREATE VIRTUAL TABLE ft USING fts4(content=vt); 6059f5ff371Sdan INSERT INTO ft(ft) VALUES('rebuild'); 6069f5ff371Sdan} 6079f5ff371Sdan 6089f5ff371Sdando_execsql_test 10.4 { 6099f5ff371Sdan SELECT snippet(ft, '[', ']', '...', -1, 5) FROM ft WHERE ft MATCH 'e' 6109f5ff371Sdan} { 6119f5ff371Sdan {...c d [e] f g...} {...c d [e] f g...} 6129f5ff371Sdan} 6139f5ff371Sdan 6149f5ff371Sdando_execsql_test 10.5 { 6159f5ff371Sdan SELECT snippet(ft, '[', ']', '...', -1, 5) FROM ft WHERE ft MATCH 't' 6169f5ff371Sdan} { 6179f5ff371Sdan {...r s [t] u v...} {...r s [t] u v...} 6189f5ff371Sdan} 6199f5ff371Sdan 6209f5ff371Sdando_execsql_test 10.6 { DELETE FROM ft WHERE docid=2 } 6219f5ff371Sdan 6229f5ff371Sdando_execsql_test 10.7 { 6239f5ff371Sdan SELECT snippet(ft, '[', ']', '...', -1, 5) FROM ft WHERE ft MATCH 'e' 6249f5ff371Sdan} { 6259f5ff371Sdan {...c d [e] f g...} 6269f5ff371Sdan} 6279fe27de6Sdan 62875395ccdSdan#------------------------------------------------------------------------- 62975395ccdSdan# Test cases 11.* 63075395ccdSdan# 63175395ccdSdanreset_db 63275395ccdSdan 63375395ccdSdando_catchsql_test 11.1 { 63475395ccdSdan CREATE VIRTUAL TABLE x1 USING fts4(content=x1); 63575395ccdSdan} {1 {vtable constructor called recursively: x1}} 63675395ccdSdan 637*66373329Sdan#--------------------------------------------------------------------------- 638*66373329Sdan# Check that an fts4 table cannot be its own content table. 639*66373329Sdan# 640*66373329Sdanreset_db 641*66373329Sdanbreakpoint 642*66373329Sdando_execsql_test 12.1.1 { 643*66373329Sdan CREATE VIRTUAL TABLE t1 USING fts4(a, content=t1 ); 644*66373329Sdan INSERT INTO t1(rowid, a) VALUES(1, 'abc'); 645*66373329Sdan} 646*66373329Sdando_catchsql_test 12.1.2 { 647*66373329Sdan SELECT * FROM t1; 648*66373329Sdan} {1 {SQL logic error}} 649*66373329Sdando_catchsql_test 12.1.3 { 650*66373329Sdan SELECT * FROM t1('abc'); 651*66373329Sdan} {1 {SQL logic error}} 652*66373329Sdando_catchsql_test 12.1.4 { 653*66373329Sdan SELECT count(*) FROM t1; 654*66373329Sdan} {1 {SQL logic error}} 655*66373329Sdan 656*66373329Sdanreset_db 657*66373329Sdando_execsql_test 12.2.1 { 658*66373329Sdan CREATE VIRTUAL TABLE t1 USING fts4(a, content=t2 ); 659*66373329Sdan CREATE VIRTUAL TABLE t2 USING fts4(a, content=t1 ); 660*66373329Sdan INSERT INTO t1(rowid, a) VALUES(1, 'abc'); 661*66373329Sdan} 662*66373329Sdando_catchsql_test 12.2.2 { 663*66373329Sdan SELECT * FROM t1; 664*66373329Sdan} {1 {SQL logic error}} 665*66373329Sdando_catchsql_test 12.2.3 { 666*66373329Sdan SELECT * FROM t1('abc'); 667*66373329Sdan} {1 {SQL logic error}} 668*66373329Sdando_catchsql_test 12.2.4 { 669*66373329Sdan SELECT count(*) FROM t1; 670*66373329Sdan} {1 {SQL logic error}} 671*66373329Sdan 672*66373329Sdan 67375395ccdSdan 674d8e454e1Sdanfinish_test 675