fts3aux1.test 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. # 2011 January 27
  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 FTS3 module.
  13. #
  14. set testdir [file dirname $argv0]
  15. source $testdir/tester.tcl
  16. ifcapable !fts3 { finish_test ; return }
  17. set ::testprefix fts3aux1
  18. do_execsql_test 1.1 {
  19. CREATE VIRTUAL TABLE t1 USING fts4;
  20. INSERT INTO t1 VALUES('one two three four');
  21. INSERT INTO t1 VALUES('three four five six');
  22. INSERT INTO t1 VALUES('one three five seven');
  23. CREATE VIRTUAL TABLE terms USING fts4aux(t1);
  24. SELECT term, documents, occurrences FROM terms WHERE col = '*';
  25. } {
  26. five 2 2 four 2 2 one 2 2 seven 1 1
  27. six 1 1 three 3 3 two 1 1
  28. }
  29. do_execsql_test 1.2 {
  30. INSERT INTO t1 VALUES('one one one three three three');
  31. SELECT term, documents, occurrences FROM terms WHERE col = '*';
  32. } {
  33. five 2 2 four 2 2 one 3 5 seven 1 1
  34. six 1 1 three 4 6 two 1 1
  35. }
  36. do_execsql_test 1.3.1 { DELETE FROM t1; }
  37. do_execsql_test 1.3.2 {
  38. SELECT term, documents, occurrences FROM terms WHERE col = '*';
  39. }
  40. do_execsql_test 1.4 {
  41. INSERT INTO t1 VALUES('a b a b a b a');
  42. INSERT INTO t1 SELECT * FROM t1;
  43. INSERT INTO t1 SELECT * FROM t1;
  44. INSERT INTO t1 SELECT * FROM t1;
  45. INSERT INTO t1 SELECT * FROM t1;
  46. INSERT INTO t1 SELECT * FROM t1;
  47. INSERT INTO t1 SELECT * FROM t1;
  48. INSERT INTO t1 SELECT * FROM t1;
  49. INSERT INTO t1 SELECT * FROM t1;
  50. SELECT term, documents, occurrences FROM terms WHERE col = '*';
  51. } {a 256 1024 b 256 768}
  52. #-------------------------------------------------------------------------
  53. # The following tests verify that the fts4aux module uses the full-text
  54. # index to reduce the number of rows scanned in the following circumstances:
  55. #
  56. # * when there is equality comparison against the term column using the
  57. # BINARY collating sequence.
  58. #
  59. # * when there is a range constraint on the term column using the BINARY
  60. # collating sequence.
  61. #
  62. # And also uses the full-text index to optimize ORDER BY clauses of the
  63. # form "ORDER BY term ASC" or equivalent.
  64. #
  65. # Test organization is:
  66. #
  67. # fts3aux1-2.1.*: equality constraints.
  68. # fts3aux1-2.2.*: range constraints.
  69. # fts3aux1-2.3.*: ORDER BY optimization.
  70. #
  71. do_execsql_test 2.0 {
  72. DROP TABLE t1;
  73. DROP TABLE terms;
  74. CREATE VIRTUAL TABLE x1 USING fts4(x);
  75. INSERT INTO x1(x1) VALUES('nodesize=24');
  76. CREATE VIRTUAL TABLE terms USING fts4aux(x1);
  77. CREATE VIEW terms_v AS
  78. SELECT term, documents, occurrences FROM terms WHERE col = '*';
  79. INSERT INTO x1 VALUES('braes brag bragged bragger bragging');
  80. INSERT INTO x1 VALUES('brags braid braided braiding braids');
  81. INSERT INTO x1 VALUES('brain brainchild brained braining brains');
  82. INSERT INTO x1 VALUES('brainstem brainstems brainstorm brainstorms');
  83. }
  84. proc rec {varname x} {
  85. global $varname
  86. incr $varname
  87. return 1
  88. }
  89. db func rec rec
  90. # Use EQP to show that the WHERE expression "term='braid'" uses a different
  91. # index number (1) than "+term='braid'" (0).
  92. #
  93. do_execsql_test 2.1.1.1 {
  94. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term='braid'
  95. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 1:} }
  96. do_execsql_test 2.1.1.2 {
  97. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term='braid'
  98. } {0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:}}
  99. # Now show that using "term='braid'" means the virtual table returns
  100. # only 1 row to SQLite, but "+term='braid'" means all 19 are returned.
  101. #
  102. do_test 2.1.2.1 {
  103. set cnt 0
  104. execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND term='braid' }
  105. set cnt
  106. } {2}
  107. do_test 2.1.2.2 {
  108. set cnt 0
  109. execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND +term='braid' }
  110. set cnt
  111. } {38}
  112. # Similar to the test immediately above, but using a term ("breakfast") that
  113. # is not featured in the dataset.
  114. #
  115. do_test 2.1.3.1 {
  116. set cnt 0
  117. execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND term='breakfast' }
  118. set cnt
  119. } {0}
  120. do_test 2.1.3.2 {
  121. set cnt 0
  122. execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND +term='breakfast' }
  123. set cnt
  124. } {38}
  125. do_execsql_test 2.1.4.1 { SELECT * FROM terms_v WHERE term='braid' } {braid 1 1}
  126. do_execsql_test 2.1.4.2 { SELECT * FROM terms_v WHERE +term='braid'} {braid 1 1}
  127. do_execsql_test 2.1.4.3 { SELECT * FROM terms_v WHERE term='breakfast' } {}
  128. do_execsql_test 2.1.4.4 { SELECT * FROM terms_v WHERE +term='breakfast' } {}
  129. do_execsql_test 2.1.4.5 { SELECT * FROM terms_v WHERE term='cba' } {}
  130. do_execsql_test 2.1.4.6 { SELECT * FROM terms_v WHERE +term='cba' } {}
  131. do_execsql_test 2.1.4.7 { SELECT * FROM terms_v WHERE term='abc' } {}
  132. do_execsql_test 2.1.4.8 { SELECT * FROM terms_v WHERE +term='abc' } {}
  133. # Special case: term=NULL
  134. #
  135. do_execsql_test 2.1.5 { SELECT * FROM terms WHERE term=NULL } {}
  136. do_execsql_test 2.2.1.1 {
  137. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term>'brain'
  138. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 2:} }
  139. do_execsql_test 2.2.1.2 {
  140. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term>'brain'
  141. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:} }
  142. do_execsql_test 2.2.1.3 {
  143. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term<'brain'
  144. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 4:} }
  145. do_execsql_test 2.2.1.4 {
  146. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term<'brain'
  147. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:} }
  148. do_execsql_test 2.2.1.5 {
  149. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE term BETWEEN 'brags' AND 'brain'
  150. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 6:} }
  151. do_execsql_test 2.2.1.6 {
  152. EXPLAIN QUERY PLAN SELECT * FROM terms WHERE +term BETWEEN 'brags' AND 'brain'
  153. } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:} }
  154. do_test 2.2.2.1 {
  155. set cnt 0
  156. execsql { SELECT * FROM terms WHERE rec('cnt', term) AND term>'brain' }
  157. set cnt
  158. } {18}
  159. do_test 2.2.2.2 {
  160. set cnt 0
  161. execsql { SELECT * FROM terms WHERE rec('cnt', term) AND +term>'brain' }
  162. set cnt
  163. } {38}
  164. do_execsql_test 2.2.2.3 {
  165. SELECT term, documents, occurrences FROM terms_v WHERE term>'brain'
  166. } {
  167. brainchild 1 1 brained 1 1 braining 1 1 brains 1 1
  168. brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1
  169. }
  170. do_execsql_test 2.2.2.4 {
  171. SELECT term, documents, occurrences FROM terms_v WHERE +term>'brain'
  172. } {
  173. brainchild 1 1 brained 1 1 braining 1 1 brains 1 1
  174. brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1
  175. }
  176. do_execsql_test 2.2.2.5 {
  177. SELECT term, documents, occurrences FROM terms_v WHERE term>='brain'
  178. } {
  179. brain 1 1
  180. brainchild 1 1 brained 1 1 braining 1 1 brains 1 1
  181. brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1
  182. }
  183. do_execsql_test 2.2.2.6 {
  184. SELECT term, documents, occurrences FROM terms_v WHERE +term>='brain'
  185. } {
  186. brain 1 1
  187. brainchild 1 1 brained 1 1 braining 1 1 brains 1 1
  188. brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1
  189. }
  190. do_execsql_test 2.2.2.7 {
  191. SELECT term, documents, occurrences FROM terms_v WHERE term>='abc'
  192. } {
  193. braes 1 1 brag 1 1 bragged 1 1 bragger 1 1
  194. bragging 1 1 brags 1 1 braid 1 1 braided 1 1
  195. braiding 1 1 braids 1 1 brain 1 1 brainchild 1 1
  196. brained 1 1 braining 1 1 brains 1 1 brainstem 1 1
  197. brainstems 1 1 brainstorm 1 1 brainstorms 1 1
  198. }
  199. do_execsql_test 2.2.2.8 {
  200. SELECT term, documents, occurrences FROM terms_v WHERE +term>='abc'
  201. } {
  202. braes 1 1 brag 1 1 bragged 1 1 bragger 1 1
  203. bragging 1 1 brags 1 1 braid 1 1 braided 1 1
  204. braiding 1 1 braids 1 1 brain 1 1 brainchild 1 1
  205. brained 1 1 braining 1 1 brains 1 1 brainstem 1 1
  206. brainstems 1 1 brainstorm 1 1 brainstorms 1 1
  207. }
  208. do_execsql_test 2.2.2.9 {
  209. SELECT term, documents, occurrences FROM terms_v WHERE term>='brainstorms'
  210. } {brainstorms 1 1}
  211. do_execsql_test 2.2.2.10 {
  212. SELECT term, documents, occurrences FROM terms_v WHERE term>='brainstorms'
  213. } {brainstorms 1 1}
  214. do_execsql_test 2.2.2.11 { SELECT * FROM terms_v WHERE term>'brainstorms' } {}
  215. do_execsql_test 2.2.2.12 { SELECT * FROM terms_v WHERE term>'brainstorms' } {}
  216. do_execsql_test 2.2.2.13 { SELECT * FROM terms_v WHERE term>'cba' } {}
  217. do_execsql_test 2.2.2.14 { SELECT * FROM terms_v WHERE term>'cba' } {}
  218. do_test 2.2.3.1 {
  219. set cnt 0
  220. execsql { SELECT * FROM terms WHERE rec('cnt', term) AND term<'brain' }
  221. set cnt
  222. } {22}
  223. do_test 2.2.3.2 {
  224. set cnt 0
  225. execsql { SELECT * FROM terms WHERE rec('cnt', term) AND +term<'brain' }
  226. set cnt
  227. } {38}
  228. do_execsql_test 2.2.3.3 {
  229. SELECT term, documents, occurrences FROM terms_v WHERE term<'brain'
  230. } {
  231. braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1
  232. brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1
  233. }
  234. do_execsql_test 2.2.3.4 {
  235. SELECT term, documents, occurrences FROM terms_v WHERE +term<'brain'
  236. } {
  237. braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1
  238. brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1
  239. }
  240. do_execsql_test 2.2.3.5 {
  241. SELECT term, documents, occurrences FROM terms_v WHERE term<='brain'
  242. } {
  243. braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1
  244. brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1
  245. brain 1 1
  246. }
  247. do_execsql_test 2.2.3.6 {
  248. SELECT term, documents, occurrences FROM terms_v WHERE +term<='brain'
  249. } {
  250. braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1
  251. brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1
  252. brain 1 1
  253. }
  254. do_test 2.2.4.1 {
  255. set cnt 0
  256. execsql {
  257. SELECT term, documents, occurrences FROM terms
  258. WHERE rec('cnt', term) AND term BETWEEN 'brags' AND 'brain'
  259. }
  260. set cnt
  261. } {12}
  262. do_test 2.2.4.2 {
  263. set cnt 0
  264. execsql {
  265. SELECT term, documents, occurrences FROM terms
  266. WHERE rec('cnt', term) AND +term BETWEEN 'brags' AND 'brain'
  267. }
  268. set cnt
  269. } {38}
  270. do_execsql_test 2.2.4.3 {
  271. SELECT term, documents, occurrences FROM terms_v
  272. WHERE rec('cnt', term) AND term BETWEEN 'brags' AND 'brain'
  273. } {
  274. brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 brain 1 1
  275. }
  276. do_execsql_test 2.2.4.4 {
  277. SELECT term, documents, occurrences FROM terms_v
  278. WHERE rec('cnt', term) AND +term BETWEEN 'brags' AND 'brain'
  279. } {
  280. brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 brain 1 1
  281. }
  282. do_execsql_test 2.2.4.5 {
  283. SELECT term, documents, occurrences FROM terms_v
  284. WHERE rec('cnt', term) AND term > 'brags' AND term < 'brain'
  285. } {
  286. braid 1 1 braided 1 1 braiding 1 1 braids 1 1
  287. }
  288. do_execsql_test 2.2.4.6 {
  289. SELECT term, documents, occurrences FROM terms_v
  290. WHERE rec('cnt', term) AND +term > 'brags' AND +term < 'brain'
  291. } {
  292. braid 1 1 braided 1 1 braiding 1 1 braids 1 1
  293. }
  294. # Check that "ORDER BY term ASC" and equivalents are sorted by the
  295. # virtual table implementation. Any other ORDER BY clause requires
  296. # SQLite to sort results using a temporary b-tree.
  297. #
  298. foreach {tn sort orderby} {
  299. 1 0 "ORDER BY term ASC"
  300. 2 0 "ORDER BY term"
  301. 3 1 "ORDER BY term DESC"
  302. 4 1 "ORDER BY documents ASC"
  303. 5 1 "ORDER BY documents"
  304. 6 1 "ORDER BY documents DESC"
  305. 7 1 "ORDER BY occurrences ASC"
  306. 8 1 "ORDER BY occurrences"
  307. 9 1 "ORDER BY occurrences DESC"
  308. } {
  309. set res [list 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:}]
  310. if {$sort} { lappend res 0 0 0 {USE TEMP B-TREE FOR ORDER BY} }
  311. set sql "SELECT * FROM terms $orderby"
  312. do_execsql_test 2.3.1.$tn "EXPLAIN QUERY PLAN $sql" $res
  313. }
  314. #-------------------------------------------------------------------------
  315. # The next set of tests, fts3aux1-3.*, test error conditions in the
  316. # fts4aux module. Except, fault injection testing (OOM, IO error etc.) is
  317. # done in fts3fault2.test
  318. #
  319. do_execsql_test 3.1.1 {
  320. CREATE VIRTUAL TABLE t2 USING fts4;
  321. }
  322. do_catchsql_test 3.1.2 {
  323. CREATE VIRTUAL TABLE terms2 USING fts4aux;
  324. } {1 {invalid arguments to fts4aux constructor}}
  325. do_catchsql_test 3.1.3 {
  326. CREATE VIRTUAL TABLE terms2 USING fts4aux(t2, t2);
  327. } {1 {invalid arguments to fts4aux constructor}}
  328. do_execsql_test 3.2.1 {
  329. CREATE VIRTUAL TABLE terms3 USING fts4aux(does_not_exist)
  330. }
  331. do_catchsql_test 3.2.2 {
  332. SELECT * FROM terms3
  333. } {1 {SQL logic error or missing database}}
  334. do_catchsql_test 3.2.3 {
  335. SELECT * FROM terms3 WHERE term = 'abc'
  336. } {1 {SQL logic error or missing database}}
  337. do_catchsql_test 3.3.1 {
  338. INSERT INTO terms VALUES(1,2,3);
  339. } {1 {table terms may not be modified}}
  340. do_catchsql_test 3.3.2 {
  341. DELETE FROM terms
  342. } {1 {table terms may not be modified}}
  343. do_catchsql_test 3.3.3 {
  344. UPDATE terms set documents = documents+1;
  345. } {1 {table terms may not be modified}}
  346. #-------------------------------------------------------------------------
  347. # The following tests - fts4aux-4.* - test that joins work with fts4aux
  348. # tables. And that fts4aux provides reasonably sane cost information via
  349. # xBestIndex to the query planner.
  350. #
  351. db close
  352. forcedelete test.db
  353. sqlite3 db test.db
  354. do_execsql_test 4.1 {
  355. CREATE VIRTUAL TABLE x1 USING fts4(x);
  356. CREATE VIRTUAL TABLE terms USING fts4aux(x1);
  357. CREATE TABLE x2(y);
  358. CREATE TABLE x3(y);
  359. CREATE INDEX i1 ON x3(y);
  360. INSERT INTO x1 VALUES('a b c d e');
  361. INSERT INTO x1 VALUES('f g h i j');
  362. INSERT INTO x1 VALUES('k k l l a');
  363. INSERT INTO x2 SELECT term FROM terms WHERE col = '*';
  364. INSERT INTO x3 SELECT term FROM terms WHERE col = '*';
  365. }
  366. proc do_plansql_test {tn sql r} {
  367. uplevel do_execsql_test $tn [list "EXPLAIN QUERY PLAN $sql ; $sql"] [list $r]
  368. }
  369. do_plansql_test 4.2 {
  370. SELECT y FROM x2, terms WHERE y = term AND col = '*'
  371. } {
  372. 0 0 0 {SCAN TABLE x2}
  373. 0 1 1 {SCAN TABLE terms VIRTUAL TABLE INDEX 1:}
  374. a b c d e f g h i j k l
  375. }
  376. do_plansql_test 4.3 {
  377. SELECT y FROM terms, x2 WHERE y = term AND col = '*'
  378. } {
  379. 0 0 1 {SCAN TABLE x2}
  380. 0 1 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 1:}
  381. a b c d e f g h i j k l
  382. }
  383. do_plansql_test 4.4 {
  384. SELECT y FROM x3, terms WHERE y = term AND col = '*'
  385. } {
  386. 0 0 1 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:}
  387. 0 1 0 {SEARCH TABLE x3 USING COVERING INDEX i1 (y=?)}
  388. a b c d e f g h i j k l
  389. }
  390. do_plansql_test 4.5 {
  391. SELECT y FROM terms, x3 WHERE y = term AND occurrences>1 AND col = '*'
  392. } {
  393. 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0:}
  394. 0 1 1 {SEARCH TABLE x3 USING COVERING INDEX i1 (y=?)}
  395. a k l
  396. }
  397. #-------------------------------------------------------------------------
  398. # The following tests check that fts4aux can handle an fts table with an
  399. # odd name (one that requires quoting for use in SQL statements). And that
  400. # the argument to the fts4aux constructor is properly dequoted before use.
  401. #
  402. do_execsql_test 5.1 {
  403. CREATE VIRTUAL TABLE "abc '!' def" USING fts4(x, y);
  404. INSERT INTO "abc '!' def" VALUES('XX', 'YY');
  405. CREATE VIRTUAL TABLE terms3 USING fts4aux("abc '!' def");
  406. SELECT * FROM terms3;
  407. } {xx * 1 1 xx 0 1 1 yy * 1 1 yy 1 1 1}
  408. do_execsql_test 5.2 {
  409. CREATE VIRTUAL TABLE "%%^^%%" USING fts4aux('abc ''!'' def');
  410. SELECT * FROM "%%^^%%";
  411. } {xx * 1 1 xx 0 1 1 yy * 1 1 yy 1 1 1}
  412. #-------------------------------------------------------------------------
  413. # Test that we can create an fts4aux table in the temp database.
  414. #
  415. forcedelete test.db2
  416. do_execsql_test 6.1 {
  417. CREATE VIRTUAL TABLE ft1 USING fts4(x, y);
  418. INSERT INTO ft1 VALUES('a b', 'c d');
  419. INSERT INTO ft1 VALUES('e e', 'c d');
  420. INSERT INTO ft1 VALUES('a a', 'b b');
  421. CREATE VIRTUAL TABLE temp.aux1 USING fts4aux(main, ft1);
  422. SELECT * FROM aux1;
  423. } {
  424. a * 2 3 a 0 2 3
  425. b * 2 3 b 0 1 1 b 1 1 2
  426. c * 2 2 c 1 2 2
  427. d * 2 2 d 1 2 2
  428. e * 1 2 e 0 1 2
  429. }
  430. do_execsql_test 6.2 {
  431. ATTACH 'test.db2' AS att;
  432. CREATE VIRTUAL TABLE att.ft1 USING fts4(x, y);
  433. INSERT INTO att.ft1 VALUES('v w', 'x y');
  434. INSERT INTO att.ft1 VALUES('z z', 'x y');
  435. INSERT INTO att.ft1 VALUES('v v', 'w w');
  436. CREATE VIRTUAL TABLE temp.aux2 USING fts4aux(att, ft1);
  437. SELECT * FROM aux2;
  438. } {
  439. v * 2 3 v 0 2 3
  440. w * 2 3 w 0 1 1 w 1 1 2
  441. x * 2 2 x 1 2 2
  442. y * 2 2 y 1 2 2
  443. z * 1 2 z 0 1 2
  444. }
  445. foreach {tn q res1 res2} {
  446. 1 { SELECT * FROM %%% WHERE term = 'a' } {a * 2 3 a 0 2 3} {}
  447. 2 { SELECT * FROM %%% WHERE term = 'x' } {} {x * 2 2 x 1 2 2}
  448. 3 { SELECT * FROM %%% WHERE term >= 'y' }
  449. {} {y * 2 2 y 1 2 2 z * 1 2 z 0 1 2}
  450. 4 { SELECT * FROM %%% WHERE term <= 'c' }
  451. {a * 2 3 a 0 2 3 b * 2 3 b 0 1 1 b 1 1 2 c * 2 2 c 1 2 2} {}
  452. } {
  453. set sql1 [string map {%%% aux1} $q]
  454. set sql2 [string map {%%% aux2} $q]
  455. do_execsql_test 7.$tn.1 $sql1 $res1
  456. do_execsql_test 7.$tn.2 $sql2 $res2
  457. }
  458. do_test 8.1 {
  459. catchsql { CREATE VIRTUAL TABLE att.aux3 USING fts4aux(main, ft1) }
  460. } {1 {invalid arguments to fts4aux constructor}}
  461. do_test 8.2 {
  462. execsql {DETACH att}
  463. catchsql { SELECT * FROM aux2 }
  464. } {1 {SQL logic error or missing database}}
  465. finish_test