Convert the implementation of the ".dbstat" dot-command of the command-line
[sqlite.git] / test / fts3defer2.test
blob275e0f0eb36feb3b01b02855d45968ba0fb6a7de
1 # 2010 October 23
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
15 source $testdir/malloc_common.tcl
16 ifcapable !fts3||!fts4_deferred {
17   finish_test 
18   return
21 set testprefix fts3defer2
23 proc mit {blob} {
24   set scan(littleEndian) i*
25   set scan(bigEndian) I*
26   binary scan $blob $scan($::tcl_platform(byteOrder)) r
27   return $r
29 db func mit mit
31 #-----------------------------------------------------------------------------
32 # This block of tests - fts3defer2-1.* - test the interaction of deferred NEAR
33 # expressions and the snippet, offsets and matchinfo functions.
34
35 do_execsql_test 1.1.1 {
36   CREATE VIRTUAL TABLE t1 USING fts4;
38 do_execsql_test 1.1.2 "INSERT INTO t1 VALUES('[string repeat {a } 20000]')"
39 do_execsql_test 1.1.3 "INSERT INTO t1 VALUES('[string repeat {z } 20000]')"
40 do_execsql_test 1.1.4 {
41   INSERT INTO t1 VALUES('a b c d e f a x y');
42   INSERT INTO t1 VALUES('');
43   INSERT INTO t1 VALUES('');
44   INSERT INTO t1 VALUES('');
45   INSERT INTO t1 VALUES('');
46   INSERT INTO t1 VALUES('');
47   INSERT INTO t1(t1) VALUES('optimize');
49 do_execsql_test 1.1.4 {
50   SELECT count(*) FROM t1_segments WHERE length(block)>10000;
51   UPDATE t1_segments SET block = zeroblob(length(block)) WHERE length(block)>10000;
52 } {2}
54 do_execsql_test 1.2.0 {
55   SELECT content FROM t1 WHERE t1 MATCH 'f (e a)';
56 } {{a b c d e f a x y}}
58 do_execsql_test 1.2.1 {
59   SELECT content FROM t1 WHERE t1 MATCH 'f (e NEAR/2 a)';
60 } {{a b c d e f a x y}}
63 do_execsql_test 1.2.2 {
64   SELECT snippet(t1, '[', ']'), offsets(t1), mit(matchinfo(t1, 'pcxnal'))
65   FROM t1 WHERE t1 MATCH 'f (e NEAR/2 a)';
66 } [list                              \
67    {a b c d [e] [f] [a] x y}         \
68    {0 1 8 1 0 0 10 1 0 2 12 1}       \
69    [list 3 1   1 1 1   1 1 1   1 1 1   8 5001 9]
72 do_execsql_test 1.2.3 {
73   SELECT snippet(t1, '[', ']'), offsets(t1), mit(matchinfo(t1, 'pcxnal'))
74   FROM t1 WHERE t1 MATCH 'f (e NEAR/3 a)';
75 } [list                                 \
76    {[a] b c d [e] [f] [a] x y}          \
77    {0 2 0 1 0 1 8 1 0 0 10 1 0 2 12 1}  \
78    [list 3 1   1 1 1   1 1 1   2 2 1   8 5001 9]
81 do_execsql_test 1.3.1 { DROP TABLE t1 }
83 #-----------------------------------------------------------------------------
84 # Test cases fts3defer2-2.* focus specifically on the matchinfo function.
85
86 do_execsql_test 2.1.1 "CREATE VIRTUAL TABLE t2 USING fts4"
87 do_execsql_test 2.1.2 "INSERT INTO t2 VALUES('[string repeat {a } 10000]')"
88 do_execsql_test 2.1.3 "INSERT INTO t2 VALUES('b [string repeat {z } 10000]')"
89 do_execsql_test 2.1.4 [string repeat "INSERT INTO t2 VALUES('x');" 50]
90 do_execsql_test 2.1.5 {
91   INSERT INTO t2 VALUES('a b c d e f g z');
92   INSERT INTO t2 VALUES('a b c d e f g');
94 foreach {tn sql} {
95   1 {}
96   2 { INSERT INTO t2(t2) VALUES('optimize') }
97   3 { UPDATE t2_segments SET block = zeroblob(length(block)) 
98       WHERE length(block)>10000;
99   }
100 } {
101   execsql $sql
103   do_execsql_test 2.2.$tn.1 {
104     SELECT mit(matchinfo(t2, 'pcxnal')) FROM t2 WHERE t2 MATCH 'a b';
105   } [list                                          \
106     [list 2 1  1 54 54  1 3 3  54 372 8]        \
107     [list 2 1  1 54 54  1 3 3  54 372 7]        \
108   ]
110   do_execsql_test 2.2.$tn.2 {
111     SELECT mit(matchinfo(t2, 'x')) FROM t2 WHERE t2 MATCH 'g z';
112   } [list                                       \
113     [list 1 2 2  1 54 54]                       \
114   ]
116   set sqlite_fts3_enable_parentheses 1
117   do_execsql_test 2.2.$tn.3 {
118     SELECT mit(matchinfo(t2, 'x')) FROM t2 WHERE t2 MATCH 'g OR (g z)';
119   } [list                                       \
120     [list 1 2 2  1 2 2   1 54 54]               \
121     [list 1 2 2  1 2 2   0 54 54]               \
122   ]
123   set sqlite_fts3_enable_parentheses 0
125   do_execsql_test 2.2.$tn.4 {
126     SELECT mit(matchinfo(t2, 'x')) FROM t2 WHERE t2 MATCH 'e "g z"';
127   } [list                                       \
128     [list 1 2 2  1 2 2]                         \
129   ]
132 do_execsql_test 2.3.1 {
133   CREATE VIRTUAL TABLE t3 USING fts4;
134   INSERT INTO t3 VALUES('a b c d e f');
135   INSERT INTO t3 VALUES('x b c d e f');
136   INSERT INTO t3 VALUES('d e f a b c');
137   INSERT INTO t3 VALUES('b c d e f');
138   INSERT INTO t3 VALUES('');
139   INSERT INTO t3 VALUES('');
140   INSERT INTO t3 VALUES('');
141   INSERT INTO t3 VALUES('');
142   INSERT INTO t3 VALUES('');
143   INSERT INTO t3 VALUES('');
145 do_execsql_test 2.3.2 "
146   INSERT INTO t3 VALUES('f e d c b [string repeat {a } 10000]')
148 foreach {tn sql} {
149   1 {}
150   2 { INSERT INTO t3(t3) VALUES('optimize') }
151   3 { UPDATE t3_segments SET block = zeroblob(length(block)) 
152       WHERE length(block)>10000;
153   }
154 } {
155   execsql $sql
156   do_execsql_test 2.4.$tn {
157     SELECT docid, mit(matchinfo(t3, 'pcxnal')) FROM t3 WHERE t3 MATCH '"a b c"';
158   } {1 {1 1 1 4 4 11 912 6} 3 {1 1 1 4 4 11 912 6}}
162 finish_test