Artifact
1320d8826a845e38a96e769562bf83d7a92a15d0:
- File
test/fts3rnd.test
— part of check-in
[4e8dd19e]
at
2011-06-09 10:48:02
on branch fts3-prefix-search
— Fix problems to do with using both OR and NEAR operators in a single expression.
(user:
dan
size: 13539)
[more...]
0000: 23 20 32 30 30 39 20 44 65 63 65 6d 62 65 72 20 # 2009 December
0010: 30 33 0a 23 0a 23 20 20 20 20 4d 61 79 20 79 6f 03.#.# May yo
0020: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f u do good and no
0030: 74 20 65 76 69 6c 2e 0a 23 20 20 20 20 4d 61 79 t evil..# May
0040: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 you find forgiv
0050: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 eness for yourse
0060: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f lf and forgive o
0070: 74 68 65 72 73 2e 0a 23 20 20 20 20 4d 61 79 20 thers..# May
0080: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 you share freely
0090: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d , never taking m
00a0: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 ore than you giv
00b0: 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a e..#.#**********
00c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
00d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
00e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 0a *************.#.
0100: 23 20 42 72 75 74 65 20 66 6f 72 63 65 20 28 72 # Brute force (r
0110: 61 6e 64 6f 6d 20 64 61 74 61 29 20 74 65 73 74 andom data) test
0120: 73 20 66 6f 72 20 46 54 53 33 2e 0a 23 0a 0a 23 s for FTS3..#..#
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 23 20 54 68 ---------.#.# Th
0180: 65 20 46 54 53 33 20 74 65 73 74 73 20 69 6d 70 e FTS3 tests imp
0190: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 69 73 lemented in this
01a0: 20 66 69 6c 65 20 66 6f 63 75 73 20 6f 6e 20 74 file focus on t
01b0: 65 73 74 69 6e 67 20 74 68 61 74 20 46 54 53 33 esting that FTS3
01c0: 0a 23 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 .# returns the c
01d0: 6f 72 72 65 63 74 20 73 65 74 20 6f 66 20 64 6f orrect set of do
01e0: 63 75 6d 65 6e 74 73 20 66 6f 72 20 76 61 72 69 cuments for vari
01f0: 6f 75 73 20 74 79 70 65 73 20 6f 66 20 66 75 6c ous types of ful
0200: 6c 2d 74 65 78 74 0a 23 20 71 75 65 72 79 2e 20 l-text.# query.
0210: 54 68 69 73 20 69 73 20 64 6f 6e 65 20 75 73 69 This is done usi
0220: 6e 67 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d ng pseudo-random
0230: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 64 61 74 ly generated dat
0240: 61 20 61 6e 64 20 71 75 65 72 69 65 73 2e 0a 23 a and queries..#
0250: 20 54 68 65 20 65 78 70 65 63 74 65 64 20 72 65 The expected re
0260: 73 75 6c 74 20 6f 66 20 65 61 63 68 20 71 75 65 sult of each que
0270: 72 79 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 ry is calculated
0280: 20 75 73 69 6e 67 20 54 63 6c 20 63 6f 64 65 2e using Tcl code.
0290: 0a 23 0a 23 20 20 20 31 2e 20 54 68 65 20 64 61 .#.# 1. The da
02a0: 74 61 62 61 73 65 20 69 73 20 69 6e 69 74 69 61 tabase is initia
02b0: 6c 69 7a 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e lized to contain
02c0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 a single table
02d0: 77 69 74 68 20 74 68 72 65 65 0a 23 20 20 20 20 with three.#
02e0: 20 20 63 6f 6c 75 6d 6e 73 2e 20 31 30 30 20 72 columns. 100 r
02f0: 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74 65 64 ows are inserted
0300: 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 2e into the table.
0310: 20 45 61 63 68 20 6f 66 20 74 68 65 20 74 68 72 Each of the thr
0320: 65 65 0a 23 20 20 20 20 20 20 76 61 6c 75 65 73 ee.# values
0330: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 69 73 20 in each row is
0340: 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 73 69 a document consi
0350: 73 74 69 6e 67 20 6f 66 20 62 65 74 77 65 65 6e sting of between
0360: 20 30 20 61 6e 64 20 31 30 30 0a 23 20 20 20 20 0 and 100.#
0370: 20 20 74 65 72 6d 73 2e 20 54 65 72 6d 73 20 61 terms. Terms a
0380: 72 65 20 73 65 6c 65 63 74 65 64 20 66 72 6f 6d re selected from
0390: 20 61 20 76 6f 63 61 62 75 6c 61 72 79 20 6f 66 a vocabulary of
03a0: 20 24 47 28 6e 56 6f 63 61 62 29 20 74 65 72 6d $G(nVocab) term
03b0: 73 2e 0a 23 0a 23 20 20 20 32 2e 20 54 68 65 20 s..#.# 2. The
03c0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 70 65 72 following is per
03d0: 66 6f 72 6d 65 64 20 31 30 30 20 74 69 6d 65 73 formed 100 times
03e0: 3a 0a 23 0a 23 20 20 20 20 20 20 61 2e 20 41 20 :.#.# a. A
03f0: 72 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 20 row is inserted
0400: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 into the databas
0410: 65 2e 20 54 68 65 20 72 6f 77 20 63 6f 6e 74 65 e. The row conte
0420: 6e 74 73 20 61 72 65 20 0a 23 20 20 20 20 20 20 nts are .#
0430: 20 20 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 generated as
0440: 69 6e 20 73 74 65 70 20 31 2e 20 54 68 65 20 64 in step 1. The d
0450: 6f 63 69 64 20 69 73 20 61 20 70 73 65 75 64 6f ocid is a pseudo
0460: 2d 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 -randomly select
0470: 65 64 0a 23 20 20 20 20 20 20 20 20 20 76 61 6c ed.# val
0480: 75 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 ue between 0 and
0490: 20 31 30 30 30 30 30 30 2e 0a 23 20 0a 23 20 20 1000000..# .#
04a0: 20 20 20 20 62 2e 20 41 20 70 73 75 65 64 6f 2d b. A psuedo-
04b0: 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 randomly selecte
04c0: 64 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 d row is updated
04d0: 2e 20 4f 6e 65 20 6f 66 20 69 74 73 20 63 6f 6c . One of its col
04e0: 75 6d 6e 73 20 69 73 0a 23 20 20 20 20 20 20 20 umns is.#
04f0: 20 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e set to contain
0500: 20 61 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 20 a new document
0510: 67 65 6e 65 72 61 74 65 64 20 69 6e 20 74 68 65 generated in the
0520: 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65 same way as the
0530: 0a 23 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d .# docum
0540: 65 6e 74 73 20 69 6e 20 73 74 65 70 20 31 2e 0a ents in step 1..
0550: 23 20 0a 23 20 20 20 20 20 20 63 2e 20 41 20 70 # .# c. A p
0560: 73 75 65 64 6f 2d 72 61 6e 64 6f 6d 6c 79 20 73 suedo-randomly s
0570: 65 6c 65 63 74 65 64 20 72 6f 77 20 69 73 20 64 elected row is d
0580: 65 6c 65 74 65 64 2e 0a 23 20 0a 23 20 20 20 20 eleted..# .#
0590: 20 20 64 2e 20 46 6f 72 20 65 61 63 68 20 6f 66 d. For each of
05a0: 20 73 65 76 65 72 61 6c 20 74 79 70 65 73 20 6f several types o
05b0: 66 20 66 74 73 33 20 71 75 65 72 69 65 73 2c 20 f fts3 queries,
05c0: 31 30 20 53 45 4c 45 43 54 20 71 75 65 72 69 65 10 SELECT querie
05d0: 73 0a 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 s.# of t
05e0: 68 65 20 66 6f 72 6d 3a 0a 23 20 0a 23 20 20 20 he form:.# .#
05f0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 64 SELECT d
0600: 6f 63 69 64 20 46 52 4f 4d 20 3c 74 62 6c 3e 20 ocid FROM <tbl>
0610: 57 48 45 52 45 20 3c 74 62 6c 3e 20 4d 41 54 43 WHERE <tbl> MATC
0620: 48 20 27 3c 71 75 65 72 79 3e 27 0a 23 20 0a 23 H '<query>'.# .#
0630: 20 20 20 20 20 20 20 20 20 61 72 65 20 65 76 61 are eva
0640: 6c 75 61 74 65 64 2e 20 54 68 65 20 72 65 73 75 luated. The resu
0650: 6c 74 73 20 61 72 65 20 63 6f 6d 70 61 72 65 64 lts are compared
0660: 20 74 6f 20 74 68 6f 73 65 20 63 61 6c 63 75 6c to those calcul
0670: 61 74 65 64 20 62 79 0a 23 20 20 20 20 20 20 20 ated by.#
0680: 20 20 54 63 6c 20 63 6f 64 65 20 69 6e 20 74 68 Tcl code in th
0690: 69 73 20 66 69 6c 65 2e 20 54 68 65 20 70 61 74 is file. The pat
06a0: 74 65 72 6e 73 20 75 73 65 64 20 66 6f 72 20 74 terns used for t
06b0: 68 65 20 64 69 66 66 65 72 65 6e 74 20 71 75 65 he different que
06c0: 72 79 0a 23 20 20 20 20 20 20 20 20 20 74 79 70 ry.# typ
06d0: 65 73 20 61 72 65 3a 0a 23 20 0a 23 20 20 20 20 es are:.# .#
06e0: 20 20 20 20 20 20 20 31 2e 20 20 71 75 65 72 79 1. query
06f0: 20 3d 20 3c 74 65 72 6d 3e 0a 23 20 20 20 20 20 = <term>.#
0700: 20 20 20 20 20 20 32 2e 20 20 71 75 65 72 79 20 2. query
0710: 3d 20 3c 70 72 65 66 69 78 3e 0a 23 20 20 20 20 = <prefix>.#
0720: 20 20 20 20 20 20 20 33 2e 20 20 71 75 65 72 79 3. query
0730: 20 3d 20 22 3c 74 65 72 6d 3e 20 3c 74 65 72 6d = "<term> <term
0740: 3e 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 34 >".# 4
0750: 2e 20 20 71 75 65 72 79 20 3d 20 22 3c 74 65 72 . query = "<ter
0760: 6d 3e 20 3c 74 65 72 6d 3e 20 3c 74 65 72 6d 3e m> <term> <term>
0770: 22 0a 23 20 20 20 20 20 20 20 20 20 20 20 35 2e ".# 5.
0780: 20 20 71 75 65 72 79 20 3d 20 22 3c 70 72 65 66 query = "<pref
0790: 69 78 3e 20 3c 70 72 65 66 69 78 3e 20 3c 70 72 ix> <prefix> <pr
07a0: 65 66 69 78 3e 22 0a 23 20 20 20 20 20 20 20 20 efix>".#
07b0: 20 20 20 36 2e 20 20 71 75 65 72 79 20 3d 20 3c 6. query = <
07c0: 74 65 72 6d 3e 20 4e 45 41 52 20 3c 74 65 72 6d term> NEAR <term
07d0: 3e 0a 23 20 20 20 20 20 20 20 20 20 20 20 37 2e >.# 7.
07e0: 20 20 71 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e query = <term>
07f0: 20 4e 45 41 52 2f 31 31 20 3c 74 65 72 6d 3e 20 NEAR/11 <term>
0800: 4e 45 41 52 2f 31 31 20 3c 74 65 72 6d 3e 0a 23 NEAR/11 <term>.#
0810: 20 20 20 20 20 20 20 20 20 20 20 38 2e 20 20 71 8. q
0820: 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e 20 4f 52 uery = <term> OR
0830: 20 3c 74 65 72 6d 3e 0a 23 20 20 20 20 20 20 20 <term>.#
0840: 20 20 20 20 39 2e 20 20 71 75 65 72 79 20 3d 20 9. query =
0850: 3c 74 65 72 6d 3e 20 4e 4f 54 20 3c 74 65 72 6d <term> NOT <term
0860: 3e 0a 23 20 20 20 20 20 20 20 20 20 20 20 31 30 >.# 10
0870: 2e 20 71 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e . query = <term>
0880: 20 41 4e 44 20 3c 74 65 72 6d 3e 0a 23 20 20 20 AND <term>.#
0890: 20 20 20 20 20 20 20 20 31 31 2e 20 71 75 65 72 11. quer
08a0: 79 20 3d 20 3c 74 65 72 6d 3e 20 4e 45 41 52 20 y = <term> NEAR
08b0: 3c 74 65 72 6d 3e 20 4f 52 20 3c 74 65 72 6d 3e <term> OR <term>
08c0: 20 4e 45 41 52 20 3c 74 65 72 6d 3e 0a 23 20 20 NEAR <term>.#
08d0: 20 20 20 20 20 20 20 20 20 31 32 2e 20 71 75 65 12. que
08e0: 72 79 20 3d 20 3c 74 65 72 6d 3e 20 4e 45 41 52 ry = <term> NEAR
08f0: 20 3c 74 65 72 6d 3e 20 4e 4f 54 20 3c 74 65 72 <term> NOT <ter
0900: 6d 3e 20 4e 45 41 52 20 3c 74 65 72 6d 3e 0a 23 m> NEAR <term>.#
0910: 20 20 20 20 20 20 20 20 20 20 20 31 33 2e 20 71 13. q
0920: 75 65 72 79 20 3d 20 3c 74 65 72 6d 3e 20 4e 45 uery = <term> NE
0930: 41 52 20 3c 74 65 72 6d 3e 20 41 4e 44 20 3c 74 AR <term> AND <t
0940: 65 72 6d 3e 20 4e 45 41 52 20 3c 74 65 72 6d 3e erm> NEAR <term>
0950: 0a 23 20 0a 23 20 20 20 20 20 20 20 20 20 77 68 .# .# wh
0960: 65 72 65 20 3c 74 65 72 6d 3e 20 69 73 20 61 20 ere <term> is a
0970: 74 65 72 6d 20 70 73 75 65 64 6f 2d 72 61 6e 64 term psuedo-rand
0980: 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 20 66 72 omly selected fr
0990: 6f 6d 20 74 68 65 20 76 6f 63 61 62 75 6c 61 72 om the vocabular
09a0: 79 0a 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 y.# and
09b0: 70 72 65 66 69 78 20 69 73 20 74 68 65 20 66 69 prefix is the fi
09c0: 72 73 74 20 32 20 63 68 61 72 61 63 74 65 72 73 rst 2 characters
09d0: 20 6f 66 20 73 75 63 68 20 61 20 74 65 72 6d 20 of such a term
09e0: 66 6f 6c 6c 6f 77 65 64 20 62 79 0a 23 20 20 20 followed by.#
09f0: 20 20 20 20 20 20 61 20 22 2a 22 20 63 68 61 72 a "*" char
0a00: 61 63 74 65 72 2e 0a 23 20 20 20 20 20 0a 23 20 acter..# .#
0a10: 20 20 20 20 20 45 76 65 72 79 20 73 65 63 6f 6e Every secon
0a20: 64 20 69 74 65 72 61 74 69 6f 6e 2c 20 73 74 65 d iteration, ste
0a30: 70 73 20 28 61 29 20 74 68 72 6f 75 67 68 20 28 ps (a) through (
0a40: 64 29 20 61 62 6f 76 65 20 61 72 65 20 70 65 72 d) above are per
0a50: 66 6f 72 6d 65 64 0a 23 20 20 20 20 20 20 77 69 formed.# wi
0a60: 74 68 69 6e 20 61 20 73 69 6e 67 6c 65 20 74 72 thin a single tr
0a70: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 ansaction. This
0a80: 66 6f 72 63 65 73 20 74 68 65 20 71 75 65 72 69 forces the queri
0a90: 65 73 20 69 6e 20 28 64 29 20 74 6f 0a 23 20 20 es in (d) to.#
0aa0: 20 20 20 20 72 65 61 64 20 64 61 74 61 20 66 72 read data fr
0ab0: 6f 6d 20 62 6f 74 68 20 74 68 65 20 64 61 74 61 om both the data
0ac0: 62 61 73 65 20 61 6e 64 20 74 68 65 20 69 6e 2d base and the in-
0ad0: 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c memory hash tabl
0ae0: 65 0a 23 20 20 20 20 20 20 74 68 61 74 20 63 61 e.# that ca
0af0: 63 68 65 73 20 74 68 65 20 66 75 6c 6c 2d 74 65 ches the full-te
0b00: 78 74 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 xt index entries
0b10: 20 63 72 65 61 74 65 64 20 62 79 20 73 74 65 70 created by step
0b20: 73 20 28 61 29 2c 20 28 62 29 0a 23 20 20 20 20 s (a), (b).#
0b30: 20 20 61 6e 64 20 28 63 29 20 75 6e 74 69 6c 20 and (c) until
0b40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 the transaction
0b50: 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a is committed..#.
0b60: 23 20 54 68 65 20 70 72 6f 63 65 64 75 72 65 20 # The procedure
0b70: 61 62 6f 76 65 20 69 73 20 72 75 6e 20 35 20 74 above is run 5 t
0b80: 69 6d 65 73 2c 20 75 73 69 6e 67 20 61 64 76 69 imes, using advi
0b90: 73 6f 72 79 20 66 74 73 33 20 6e 6f 64 65 20 73 sory fts3 node s
0ba0: 69 7a 65 73 20 6f 66 20 35 30 2c 0a 23 20 35 30 izes of 50,.# 50
0bb0: 30 2c 20 31 30 30 30 20 61 6e 64 20 32 30 30 30 0, 1000 and 2000
0bc0: 20 62 79 74 65 73 2e 0a 23 0a 23 20 41 66 74 65 bytes..#.# Afte
0bd0: 72 20 74 68 65 20 74 65 73 74 20 75 73 69 6e 67 r the test using
0be0: 20 61 6e 20 61 64 76 69 73 6f 72 79 20 6e 6f 64 an advisory nod
0bf0: 65 2d 73 69 7a 65 20 6f 66 20 35 30 2c 20 61 6e e-size of 50, an
0c00: 20 4f 4f 4d 20 74 65 73 74 20 69 73 20 72 75 6e OOM test is run
0c10: 20 75 73 69 6e 67 0a 23 20 74 68 65 20 64 61 74 using.# the dat
0c20: 61 62 61 73 65 2e 20 54 68 69 73 20 74 65 73 74 abase. This test
0c30: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 is similar to s
0c40: 74 65 70 20 28 64 29 20 61 62 6f 76 65 2c 20 65 tep (d) above, e
0c50: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 74 65 xcept that it te
0c60: 73 74 73 0a 23 20 74 68 65 20 65 66 66 65 63 74 sts.# the effect
0c70: 73 20 6f 66 20 74 72 61 6e 73 69 65 6e 74 20 61 s of transient a
0c80: 6e 64 20 70 65 72 73 69 73 74 65 6e 74 20 4f 4f nd persistent OO
0c90: 4d 20 63 6f 6e 64 69 74 69 6f 6e 73 20 65 6e 63 M conditions enc
0ca0: 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 0a 23 ountered while.#
0cb0: 20 65 78 65 63 75 74 69 6e 67 20 65 61 63 68 20 executing each
0cc0: 71 75 65 72 79 2e 0a 23 0a 0a 73 65 74 20 74 65 query..#..set te
0cd0: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e stdir [file dirn
0ce0: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 ame $argv0].sour
0cf0: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 ce $testdir/test
0d00: 65 72 2e 74 63 6c 0a 0a 23 20 49 66 20 74 68 69 er.tcl..# If thi
0d10: 73 20 62 75 69 6c 64 20 64 6f 65 73 20 6e 6f 74 s build does not
0d20: 20 69 6e 63 6c 75 64 65 20 46 54 53 33 2c 20 73 include FTS3, s
0d30: 6b 69 70 20 74 68 65 20 74 65 73 74 73 20 69 6e kip the tests in
0d40: 20 74 68 69 73 20 66 69 6c 65 2e 0a 23 0a 69 66 this file..#.if
0d50: 63 61 70 61 62 6c 65 20 21 66 74 73 33 20 7b 20 capable !fts3 {
0d60: 66 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 finish_test ; re
0d70: 74 75 72 6e 20 7d 0a 73 6f 75 72 63 65 20 24 74 turn }.source $t
0d80: 65 73 74 64 69 72 2f 66 74 73 33 5f 63 6f 6d 6d estdir/fts3_comm
0d90: 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20 24 74 on.tcl.source $t
0da0: 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f 63 6f estdir/malloc_co
0db0: 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 47 28 mmon.tcl..set G(
0dc0: 6e 56 6f 63 61 62 29 20 31 30 30 0a 0a 73 65 74 nVocab) 100..set
0dd0: 20 6e 56 6f 63 61 62 20 31 30 30 0a 73 65 74 20 nVocab 100.set
0de0: 6c 56 6f 63 61 62 20 5b 6c 69 73 74 5d 0a 0a 65 lVocab [list]..e
0df0: 78 70 72 20 73 72 61 6e 64 28 30 29 0a 0a 23 20 xpr srand(0)..#
0e00: 47 65 6e 65 72 61 74 65 20 61 20 76 6f 63 61 62 Generate a vocab
0e10: 75 6c 61 72 79 20 6f 66 20 6e 56 6f 63 61 62 20 ulary of nVocab
0e20: 77 6f 72 64 73 2e 20 45 61 63 68 20 77 6f 72 64 words. Each word
0e30: 20 69 73 20 33 20 63 68 61 72 61 63 74 65 72 73 is 3 characters
0e40: 20 6c 6f 6e 67 2e 0a 23 0a 73 65 74 20 6c 43 68 long..#.set lCh
0e50: 61 72 20 7b 61 20 62 20 63 20 64 20 65 20 66 20 ar {a b c d e f
0e60: 67 20 68 20 69 20 6a 20 6b 20 6c 20 6d 20 6e 20 g h i j k l m n
0e70: 6f 20 70 20 71 20 72 20 73 20 74 20 75 20 76 20 o p q r s t u v
0e80: 77 20 78 20 79 20 7a 7d 0a 66 6f 72 20 7b 73 65 w x y z}.for {se
0e90: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 56 t i 0} {$i < $nV
0ea0: 6f 63 61 62 7d 20 7b 69 6e 63 72 20 69 7d 20 7b ocab} {incr i} {
0eb0: 0a 20 20 73 65 74 20 6c 65 6e 20 5b 65 78 70 72 . set len [expr
0ec0: 20 69 6e 74 28 72 61 6e 64 28 29 2a 33 29 2b 32 int(rand()*3)+2
0ed0: 5d 0a 20 20 73 65 74 20 20 20 20 77 6f 72 64 20 ]. set word
0ee0: 5b 6c 69 6e 64 65 78 20 24 6c 43 68 61 72 20 5b [lindex $lChar [
0ef0: 65 78 70 72 20 69 6e 74 28 72 61 6e 64 28 29 2a expr int(rand()*
0f00: 32 36 29 5d 5d 0a 20 20 61 70 70 65 6e 64 20 77 26)]]. append w
0f10: 6f 72 64 20 5b 6c 69 6e 64 65 78 20 24 6c 43 68 ord [lindex $lCh
0f20: 61 72 20 5b 65 78 70 72 20 69 6e 74 28 72 61 6e ar [expr int(ran
0f30: 64 28 29 2a 32 36 29 5d 5d 0a 20 20 69 66 20 7b d()*26)]]. if {
0f40: 24 6c 65 6e 3e 32 7d 20 7b 20 61 70 70 65 6e 64 $len>2} { append
0f50: 20 77 6f 72 64 20 5b 6c 69 6e 64 65 78 20 24 6c word [lindex $l
0f60: 43 68 61 72 20 5b 65 78 70 72 20 69 6e 74 28 72 Char [expr int(r
0f70: 61 6e 64 28 29 2a 32 36 29 5d 5d 20 7d 0a 20 20 and()*26)]] }.
0f80: 69 66 20 7b 24 6c 65 6e 3e 33 7d 20 7b 20 61 70 if {$len>3} { ap
0f90: 70 65 6e 64 20 77 6f 72 64 20 5b 6c 69 6e 64 65 pend word [linde
0fa0: 78 20 24 6c 43 68 61 72 20 5b 65 78 70 72 20 69 x $lChar [expr i
0fb0: 6e 74 28 72 61 6e 64 28 29 2a 32 36 29 5d 5d 20 nt(rand()*26)]]
0fc0: 7d 0a 20 20 6c 61 70 70 65 6e 64 20 6c 56 6f 63 }. lappend lVoc
0fd0: 61 62 20 24 77 6f 72 64 0a 7d 0a 0a 70 72 6f 63 ab $word.}..proc
0fe0: 20 72 61 6e 64 6f 6d 5f 74 65 72 6d 20 7b 7d 20 random_term {}
0ff0: 7b 0a 20 20 6c 69 6e 64 65 78 20 24 3a 3a 6c 56 {. lindex $::lV
1000: 6f 63 61 62 20 5b 65 78 70 72 20 7b 69 6e 74 28 ocab [expr {int(
1010: 72 61 6e 64 28 29 2a 24 3a 3a 6e 56 6f 63 61 62 rand()*$::nVocab
1020: 29 7d 5d 0a 7d 0a 0a 23 20 52 65 74 75 72 6e 20 )}].}..# Return
1030: 61 20 64 6f 63 75 6d 65 6e 74 20 63 6f 6e 73 69 a document consi
1040: 73 74 69 6e 67 20 6f 66 20 24 6e 57 6f 72 64 20 sting of $nWord
1050: 61 72 62 69 74 72 61 72 69 6c 79 20 73 65 6c 65 arbitrarily sele
1060: 63 74 65 64 20 74 65 72 6d 73 0a 23 20 66 72 6f cted terms.# fro
1070: 6d 20 74 68 65 20 24 3a 3a 6c 56 6f 63 61 62 20 m the $::lVocab
1080: 6c 69 73 74 2e 0a 23 0a 70 72 6f 63 20 67 65 6e list..#.proc gen
1090: 65 72 61 74 65 5f 64 6f 63 20 7b 6e 57 6f 72 64 erate_doc {nWord
10a0: 7d 20 7b 0a 20 20 73 65 74 20 64 6f 63 20 5b 6c } {. set doc [l
10b0: 69 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 ist]. for {set
10c0: 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 57 6f 72 i 0} {$i < $nWor
10d0: 64 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 d} {incr i} {.
10e0: 20 20 6c 61 70 70 65 6e 64 20 64 6f 63 20 5b 72 lappend doc [r
10f0: 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 7d 0a andom_term]. }.
1100: 20 20 72 65 74 75 72 6e 20 24 64 6f 63 0a 7d 0a return $doc.}.
1110: 0a 0a 0a 23 20 50 72 69 6d 69 74 69 76 65 73 20 ...# Primitives
1120: 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 74 61 to update the ta
1130: 62 6c 65 2e 0a 23 0a 75 6e 73 65 74 20 2d 6e 6f ble..#.unset -no
1140: 63 6f 6d 70 6c 61 69 6e 20 74 31 0a 70 72 6f 63 complain t1.proc
1150: 20 69 6e 73 65 72 74 5f 72 6f 77 20 7b 72 6f 77 insert_row {row
1160: 69 64 7d 20 7b 0a 20 20 73 65 74 20 61 20 5b 67 id} {. set a [g
1170: 65 6e 65 72 61 74 65 5f 64 6f 63 20 5b 65 78 70 enerate_doc [exp
1180: 72 20 69 6e 74 28 28 72 61 6e 64 28 29 2a 31 30 r int((rand()*10
1190: 30 29 29 5d 5d 0a 20 20 73 65 74 20 62 20 5b 67 0))]]. set b [g
11a0: 65 6e 65 72 61 74 65 5f 64 6f 63 20 5b 65 78 70 enerate_doc [exp
11b0: 72 20 69 6e 74 28 28 72 61 6e 64 28 29 2a 31 30 r int((rand()*10
11c0: 30 29 29 5d 5d 0a 20 20 73 65 74 20 63 20 5b 67 0))]]. set c [g
11d0: 65 6e 65 72 61 74 65 5f 64 6f 63 20 5b 65 78 70 enerate_doc [exp
11e0: 72 20 69 6e 74 28 28 72 61 6e 64 28 29 2a 31 30 r int((rand()*10
11f0: 30 29 29 5d 5d 0a 20 20 65 78 65 63 73 71 6c 20 0))]]. execsql
1200: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 { INSERT INTO t1
1210: 28 64 6f 63 69 64 2c 20 61 2c 20 62 2c 20 63 29 (docid, a, b, c)
1220: 20 56 41 4c 55 45 53 28 24 72 6f 77 69 64 2c 20 VALUES($rowid,
1230: 24 61 2c 20 24 62 2c 20 24 63 29 20 7d 0a 20 20 $a, $b, $c) }.
1240: 73 65 74 20 3a 3a 74 31 28 24 72 6f 77 69 64 29 set ::t1($rowid)
1250: 20 5b 6c 69 73 74 20 24 61 20 24 62 20 24 63 5d [list $a $b $c]
1260: 0a 7d 0a 70 72 6f 63 20 64 65 6c 65 74 65 5f 72 .}.proc delete_r
1270: 6f 77 20 7b 72 6f 77 69 64 7d 20 7b 0a 20 20 65 ow {rowid} {. e
1280: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 xecsql { DELETE
1290: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f FROM t1 WHERE ro
12a0: 77 69 64 20 3d 20 24 72 6f 77 69 64 20 7d 0a 20 wid = $rowid }.
12b0: 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a 3a catch {unset ::
12c0: 74 31 28 24 72 6f 77 69 64 29 7d 0a 7d 0a 70 72 t1($rowid)}.}.pr
12d0: 6f 63 20 75 70 64 61 74 65 5f 72 6f 77 20 7b 72 oc update_row {r
12e0: 6f 77 69 64 7d 20 7b 0a 20 20 73 65 74 20 63 6f owid} {. set co
12f0: 6c 73 20 7b 61 20 62 20 63 7d 0a 20 20 73 65 74 ls {a b c}. set
1300: 20 69 43 6f 6c 20 5b 65 78 70 72 20 69 6e 74 28 iCol [expr int(
1310: 72 61 6e 64 28 29 2a 33 29 5d 0a 20 20 73 65 74 rand()*3)]. set
1320: 20 64 6f 63 20 20 5b 67 65 6e 65 72 61 74 65 5f doc [generate_
1330: 64 6f 63 20 5b 65 78 70 72 20 69 6e 74 28 28 72 doc [expr int((r
1340: 61 6e 64 28 29 2a 31 30 30 29 29 5d 5d 0a 20 20 and()*100))]].
1350: 6c 73 65 74 20 3a 3a 74 31 28 24 72 6f 77 69 64 lset ::t1($rowid
1360: 29 20 24 69 43 6f 6c 20 24 64 6f 63 0a 20 20 65 ) $iCol $doc. e
1370: 78 65 63 73 71 6c 20 22 55 50 44 41 54 45 20 74 xecsql "UPDATE t
1380: 31 20 53 45 54 20 5b 6c 69 6e 64 65 78 20 24 63 1 SET [lindex $c
1390: 6f 6c 73 20 24 69 43 6f 6c 5d 20 3d 20 5c 24 64 ols $iCol] = \$d
13a0: 6f 63 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d oc WHERE rowid =
13b0: 20 5c 24 72 6f 77 69 64 22 0a 7d 0a 0a 70 72 6f \$rowid".}..pro
13c0: 63 20 73 69 6d 70 6c 65 5f 70 68 72 61 73 65 20 c simple_phrase
13d0: 7b 7a 50 72 65 66 69 78 7d 20 7b 0a 20 20 73 65 {zPrefix} {. se
13e0: 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 0a 20 20 t ret [list]..
13f0: 73 65 74 20 72 65 67 20 5b 73 74 72 69 6e 67 20 set reg [string
1400: 6d 61 70 20 7b 2a 20 7b 5b 5e 20 5d 2a 7d 7d 20 map {* {[^ ]*}}
1410: 24 7a 50 72 65 66 69 78 5d 0a 20 20 73 65 74 20 $zPrefix]. set
1420: 72 65 67 20 22 20 24 72 65 67 20 22 0a 0a 20 20 reg " $reg "..
1430: 66 6f 72 65 61 63 68 20 6b 65 79 20 5b 6c 73 6f foreach key [lso
1440: 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 rt -integer [arr
1450: 61 79 20 6e 61 6d 65 73 20 3a 3a 74 31 5d 5d 20 ay names ::t1]]
1460: 7b 0a 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 {. set value
1470: 24 3a 3a 74 31 28 24 6b 65 79 29 0a 20 20 20 20 $::t1($key).
1480: 73 65 74 20 63 6e 74 20 5b 6c 69 73 74 5d 0a 20 set cnt [list].
1490: 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6c 20 24 foreach col $
14a0: 76 61 6c 75 65 20 7b 0a 20 20 20 20 20 20 69 66 value {. if
14b0: 20 7b 5b 72 65 67 65 78 70 20 24 72 65 67 20 22 {[regexp $reg "
14c0: 20 24 63 6f 6c 20 22 5d 7d 20 7b 20 6c 61 70 70 $col "]} { lapp
14d0: 65 6e 64 20 72 65 74 20 24 6b 65 79 20 3b 20 62 end ret $key ; b
14e0: 72 65 61 6b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d reak }. }. }
14f0: 0a 0a 20 20 23 6c 73 6f 72 74 20 2d 75 6e 69 71 .. #lsort -uniq
1500: 20 2d 69 6e 74 65 67 65 72 20 24 72 65 74 0a 20 -integer $ret.
1510: 20 73 65 74 20 72 65 74 0a 7d 0a 0a 23 20 54 68 set ret.}..# Th
1520: 69 73 20 5b 70 72 6f 63 5d 20 69 73 20 75 73 65 is [proc] is use
1530: 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 46 54 d to test the FT
1540: 53 33 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 S3 matchinfo() f
1550: 75 6e 63 74 69 6f 6e 2e 0a 23 20 0a 70 72 6f 63 unction..# .proc
1560: 20 73 69 6d 70 6c 65 5f 74 6f 6b 65 6e 5f 6d 61 simple_token_ma
1570: 74 63 68 69 6e 66 6f 20 7b 7a 54 6f 6b 65 6e 20 tchinfo {zToken
1580: 62 44 65 73 63 7d 20 7b 0a 0a 20 20 73 65 74 20 bDesc} {.. set
1590: 6e 44 6f 63 28 30 29 20 30 0a 20 20 73 65 74 20 nDoc(0) 0. set
15a0: 6e 44 6f 63 28 31 29 20 30 0a 20 20 73 65 74 20 nDoc(1) 0. set
15b0: 6e 44 6f 63 28 32 29 20 30 0a 20 20 73 65 74 20 nDoc(2) 0. set
15c0: 6e 48 69 74 28 30 29 20 30 0a 20 20 73 65 74 20 nHit(0) 0. set
15d0: 6e 48 69 74 28 31 29 20 30 0a 20 20 73 65 74 20 nHit(1) 0. set
15e0: 6e 48 69 74 28 32 29 20 30 0a 0a 20 20 73 65 74 nHit(2) 0.. set
15f0: 20 64 69 72 20 2d 69 6e 63 0a 20 20 69 66 20 7b dir -inc. if {
1600: 24 62 44 65 73 63 7d 20 7b 20 73 65 74 20 64 69 $bDesc} { set di
1610: 72 20 2d 64 65 63 20 7d 0a 0a 20 20 66 6f 72 65 r -dec }.. fore
1620: 61 63 68 20 6b 65 79 20 5b 61 72 72 61 79 20 6e ach key [array n
1630: 61 6d 65 73 20 3a 3a 74 31 5d 20 7b 0a 20 20 20 ames ::t1] {.
1640: 20 73 65 74 20 76 61 6c 75 65 20 24 3a 3a 74 31 set value $::t1
1650: 28 24 6b 65 79 29 0a 20 20 20 20 73 65 74 20 61 ($key). set a
1660: 28 24 6b 65 79 29 20 5b 6c 69 73 74 5d 0a 20 20 ($key) [list].
1670: 20 20 66 6f 72 65 61 63 68 20 69 20 7b 30 20 31 foreach i {0 1
1680: 20 32 7d 20 63 6f 6c 20 24 76 61 6c 75 65 20 7b 2} col $value {
1690: 0a 20 20 20 20 20 20 73 65 74 20 68 69 74 20 5b . set hit [
16a0: 6c 6c 65 6e 67 74 68 20 5b 6c 73 65 61 72 63 68 llength [lsearch
16b0: 20 2d 61 6c 6c 20 24 63 6f 6c 20 24 7a 54 6f 6b -all $col $zTok
16c0: 65 6e 5d 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 en]]. lappe
16d0: 6e 64 20 61 28 24 6b 65 79 29 20 24 68 69 74 0a nd a($key) $hit.
16e0: 20 20 20 20 20 20 69 6e 63 72 20 6e 48 69 74 28 incr nHit(
16f0: 24 69 29 20 24 68 69 74 0a 20 20 20 20 20 20 69 $i) $hit. i
1700: 66 20 7b 24 68 69 74 3e 30 7d 20 7b 20 69 6e 63 f {$hit>0} { inc
1710: 72 20 6e 44 6f 63 28 24 69 29 20 7d 0a 20 20 20 r nDoc($i) }.
1720: 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 65 }. }.. set re
1730: 74 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 t [list]. forea
1740: 63 68 20 64 6f 63 69 64 20 5b 6c 73 6f 72 74 20 ch docid [lsort
1750: 2d 69 6e 74 65 67 65 72 20 24 64 69 72 20 5b 61 -integer $dir [a
1760: 72 72 61 79 20 6e 61 6d 65 73 20 61 5d 5d 20 7b rray names a]] {
1770: 0a 20 20 20 20 69 66 20 7b 20 5b 6c 69 6e 64 65 . if { [linde
1780: 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 x [lsort -intege
1790: 72 20 24 61 28 24 64 6f 63 69 64 29 5d 20 65 6e r $a($docid)] en
17a0: 64 5d 20 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 d] } {. set
17b0: 20 6d 61 74 63 68 69 6e 66 6f 20 5b 6c 69 73 74 matchinfo [list
17c0: 20 31 20 33 5d 0a 20 20 20 20 20 20 66 6f 72 65 1 3]. fore
17d0: 61 63 68 20 69 20 7b 30 20 31 20 32 7d 20 68 69 ach i {0 1 2} hi
17e0: 74 20 24 61 28 24 64 6f 63 69 64 29 20 7b 0a 20 t $a($docid) {.
17f0: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d lappend m
1800: 61 74 63 68 69 6e 66 6f 20 24 68 69 74 20 24 6e atchinfo $hit $n
1810: 48 69 74 28 24 69 29 20 24 6e 44 6f 63 28 24 69 Hit($i) $nDoc($i
1820: 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ). }.
1830: 6c 61 70 70 65 6e 64 20 72 65 74 20 24 64 6f 63 lappend ret $doc
1840: 69 64 20 24 6d 61 74 63 68 69 6e 66 6f 0a 20 20 id $matchinfo.
1850: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 }. }.. set r
1860: 65 74 0a 7d 20 0a 0a 70 72 6f 63 20 73 69 6d 70 et.} ..proc simp
1870: 6c 65 5f 6e 65 61 72 20 7b 74 65 72 6d 6c 69 73 le_near {termlis
1880: 74 20 6e 4e 65 61 72 7d 20 7b 0a 20 20 73 65 74 t nNear} {. set
1890: 20 72 65 74 20 5b 6c 69 73 74 5d 0a 0a 20 20 66 ret [list].. f
18a0: 6f 72 65 61 63 68 20 7b 6b 65 79 20 76 61 6c 75 oreach {key valu
18b0: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 3a 3a e} [array get ::
18c0: 74 31 5d 20 7b 0a 20 20 20 20 66 6f 72 65 61 63 t1] {. foreac
18d0: 68 20 76 20 24 76 61 6c 75 65 20 7b 0a 0a 20 20 h v $value {..
18e0: 20 20 20 20 73 65 74 20 6c 20 5b 6c 73 65 61 72 set l [lsear
18f0: 63 68 20 2d 65 78 61 63 74 20 2d 61 6c 6c 20 24 ch -exact -all $
1900: 76 20 5b 6c 69 6e 64 65 78 20 24 74 65 72 6d 6c v [lindex $terml
1910: 69 73 74 20 30 5d 5d 0a 20 20 20 20 20 20 66 6f ist 0]]. fo
1920: 72 65 61 63 68 20 54 20 5b 6c 72 61 6e 67 65 20 reach T [lrange
1930: 24 74 65 72 6d 6c 69 73 74 20 31 20 65 6e 64 5d $termlist 1 end]
1940: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 6c {. set l
1950: 32 20 5b 6c 69 73 74 5d 0a 20 20 20 20 20 20 20 2 [list].
1960: 20 66 6f 72 65 61 63 68 20 69 20 24 6c 20 7b 0a foreach i $l {.
1970: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69 53 set iS
1980: 74 61 72 74 20 5b 65 78 70 72 20 24 69 20 2d 20 tart [expr $i -
1990: 24 6e 4e 65 61 72 20 2d 20 31 5d 0a 20 20 20 20 $nNear - 1].
19a0: 20 20 20 20 20 20 73 65 74 20 69 45 6e 64 20 5b set iEnd [
19b0: 65 78 70 72 20 24 69 20 2b 20 24 6e 4e 65 61 72 expr $i + $nNear
19c0: 20 2b 20 31 5d 0a 20 20 20 20 20 20 20 20 20 20 + 1].
19d0: 69 66 20 7b 24 69 53 74 61 72 74 20 3c 20 30 7d if {$iStart < 0}
19e0: 20 7b 73 65 74 20 69 53 74 61 72 74 20 30 7d 0a {set iStart 0}.
19f0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 foreac
1a00: 68 20 69 32 20 5b 6c 73 65 61 72 63 68 20 2d 65 h i2 [lsearch -e
1a10: 78 61 63 74 20 2d 61 6c 6c 20 5b 6c 72 61 6e 67 xact -all [lrang
1a20: 65 20 24 76 20 24 69 53 74 61 72 74 20 24 69 45 e $v $iStart $iE
1a30: 6e 64 5d 20 24 54 5d 20 7b 0a 20 20 20 20 20 20 nd] $T] {.
1a40: 20 20 20 20 20 20 69 6e 63 72 20 69 32 20 24 69 incr i2 $i
1a50: 53 74 61 72 74 0a 20 20 20 20 20 20 20 20 20 20 Start.
1a60: 20 20 69 66 20 7b 24 69 32 20 21 3d 20 24 69 7d if {$i2 != $i}
1a70: 20 7b 20 6c 61 70 70 65 6e 64 20 6c 32 20 24 69 { lappend l2 $i
1a80: 32 20 7d 20 0a 20 20 20 20 20 20 20 20 20 20 7d 2 } . }
1a90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1aa0: 20 20 20 73 65 74 20 6c 20 5b 6c 73 6f 72 74 20 set l [lsort
1ab0: 2d 75 6e 69 71 20 2d 69 6e 74 65 67 65 72 20 24 -uniq -integer $
1ac0: 6c 32 5d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 l2]. }..
1ad0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 if {[llength
1ae0: 24 6c 5d 7d 20 7b 0a 23 70 75 74 73 20 22 4d 41 $l]} {.#puts "MA
1af0: 54 43 48 28 24 6b 65 79 29 3a 20 24 76 22 0a 20 TCH($key): $v".
1b00: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 lappend r
1b10: 65 74 20 24 6b 65 79 0a 20 20 20 20 20 20 7d 20 et $key. }
1b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6c 73 . }. }.. ls
1b30: 6f 72 74 20 2d 75 6e 69 71 75 65 20 2d 69 6e 74 ort -unique -int
1b40: 65 67 65 72 20 24 72 65 74 0a 7d 0a 0a 23 20 54 eger $ret.}..# T
1b50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 he following thr
1b60: 65 65 20 70 72 6f 63 73 3a 0a 23 20 0a 23 20 20 ee procs:.# .#
1b70: 20 73 65 74 75 70 5f 6e 6f 74 20 41 20 42 0a 23 setup_not A B.#
1b80: 20 20 20 73 65 74 75 70 5f 6f 72 20 20 41 20 42 setup_or A B
1b90: 0a 23 20 20 20 73 65 74 75 70 5f 61 6e 64 20 41 .# setup_and A
1ba0: 20 42 0a 23 0a 23 20 65 61 63 68 20 74 61 6b 65 B.#.# each take
1bb0: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 20 two arguments.
1bc0: 42 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20 6d Both arguments m
1bd0: 75 73 74 20 62 65 20 6c 69 73 74 73 20 6f 66 20 ust be lists of
1be0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 0a 23 integer values.#
1bf0: 20 73 6f 72 74 65 64 20 62 79 20 76 61 6c 75 65 sorted by value
1c00: 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c . The return val
1c10: 75 65 20 69 73 20 74 68 65 20 6c 69 73 74 20 70 ue is the list p
1c20: 72 6f 64 75 63 65 64 20 62 79 20 65 76 61 6c 75 roduced by evalu
1c30: 61 74 69 6e 67 0a 23 20 74 68 65 20 65 71 75 69 ating.# the equi
1c40: 76 61 6c 65 6e 74 20 6f 66 20 22 41 20 6f 70 20 valent of "A op
1c50: 42 22 2c 20 77 68 65 72 65 20 6f 70 20 69 73 20 B", where op is
1c60: 74 68 65 20 46 54 53 33 20 6f 70 65 72 61 74 6f the FTS3 operato
1c70: 72 20 4e 4f 54 2c 20 4f 52 20 6f 72 0a 23 20 41 r NOT, OR or.# A
1c80: 4e 44 2e 0a 23 0a 70 72 6f 63 20 73 65 74 6f 70 ND..#.proc setop
1c90: 5f 6e 6f 74 20 7b 41 20 42 7d 20 7b 0a 20 20 66 _not {A B} {. f
1ca0: 6f 72 65 61 63 68 20 62 20 24 42 20 7b 20 73 65 oreach b $B { se
1cb0: 74 20 6e 28 24 62 29 20 7b 7d 20 7d 0a 20 20 73 t n($b) {} }. s
1cc0: 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20 20 et ret [list].
1cd0: 66 6f 72 65 61 63 68 20 61 20 24 41 20 7b 20 69 foreach a $A { i
1ce0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 f {![info exists
1cf0: 20 6e 28 24 61 29 5d 7d 20 7b 6c 61 70 70 65 6e n($a)]} {lappen
1d00: 64 20 72 65 74 20 24 61 7d 20 7d 0a 20 20 72 65 d ret $a} }. re
1d10: 74 75 72 6e 20 24 72 65 74 0a 7d 0a 70 72 6f 63 turn $ret.}.proc
1d20: 20 73 65 74 6f 70 5f 6f 72 20 7b 41 20 42 7d 20 setop_or {A B}
1d30: 7b 0a 20 20 6c 73 6f 72 74 20 2d 69 6e 74 65 67 {. lsort -integ
1d40: 65 72 20 2d 75 6e 69 71 20 5b 63 6f 6e 63 61 74 er -uniq [concat
1d50: 20 24 41 20 24 42 5d 0a 7d 0a 70 72 6f 63 20 73 $A $B].}.proc s
1d60: 65 74 6f 70 5f 61 6e 64 20 7b 41 20 42 7d 20 7b etop_and {A B} {
1d70: 0a 20 20 66 6f 72 65 61 63 68 20 62 20 24 42 20 . foreach b $B
1d80: 7b 20 73 65 74 20 6e 28 24 62 29 20 7b 7d 20 7d { set n($b) {} }
1d90: 0a 20 20 73 65 74 20 72 65 74 20 5b 6c 69 73 74 . set ret [list
1da0: 5d 0a 20 20 66 6f 72 65 61 63 68 20 61 20 24 41 ]. foreach a $A
1db0: 20 7b 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 { if {[info exi
1dc0: 73 74 73 20 6e 28 24 61 29 5d 7d 20 7b 6c 61 70 sts n($a)]} {lap
1dd0: 70 65 6e 64 20 72 65 74 20 24 61 7d 20 7d 0a 20 pend ret $a} }.
1de0: 20 72 65 74 75 72 6e 20 24 72 65 74 0a 7d 0a 0a return $ret.}..
1df0: 70 72 6f 63 20 6d 69 74 20 7b 62 6c 6f 62 7d 20 proc mit {blob}
1e00: 7b 0a 20 20 73 65 74 20 73 63 61 6e 28 6c 69 74 {. set scan(lit
1e10: 74 6c 65 45 6e 64 69 61 6e 29 20 69 2a 0a 20 20 tleEndian) i*.
1e20: 73 65 74 20 73 63 61 6e 28 62 69 67 45 6e 64 69 set scan(bigEndi
1e30: 61 6e 29 20 49 2a 0a 20 20 62 69 6e 61 72 79 20 an) I*. binary
1e40: 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63 61 6e scan $blob $scan
1e50: 28 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d ($::tcl_platform
1e60: 28 62 79 74 65 4f 72 64 65 72 29 29 20 72 0a 20 (byteOrder)) r.
1e70: 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 64 62 20 return $r.}.db
1e80: 66 75 6e 63 20 6d 69 74 20 6d 69 74 0a 73 65 74 func mit mit.set
1e90: 20 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 sqlite_fts3_ena
1ea0: 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73 20 ble_parentheses
1eb0: 31 0a 0a 70 72 6f 63 20 64 6f 5f 6f 72 64 65 72 1..proc do_order
1ec0: 62 79 64 6f 63 69 64 5f 74 65 73 74 20 7b 74 6e bydocid_test {tn
1ed0: 20 73 71 6c 20 72 65 73 7d 20 7b 0a 20 20 75 70 sql res} {. up
1ee0: 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f 73 level [list do_s
1ef0: 65 6c 65 63 74 5f 74 65 73 74 20 24 74 6e 2e 61 elect_test $tn.a
1f00: 73 63 20 22 24 73 71 6c 20 4f 52 44 45 52 20 42 sc "$sql ORDER B
1f10: 59 20 64 6f 63 69 64 20 41 53 43 22 20 24 72 65 Y docid ASC" $re
1f20: 73 5d 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 s]. uplevel [li
1f30: 73 74 20 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 st do_select_tes
1f40: 74 20 24 74 6e 2e 64 65 73 63 20 22 24 73 71 6c t $tn.desc "$sql
1f50: 20 4f 52 44 45 52 20 42 59 20 64 6f 63 69 64 20 ORDER BY docid
1f60: 44 45 53 43 22 20 5c 0a 20 20 20 20 5b 6c 73 6f DESC" \. [lso
1f70: 72 74 20 2d 69 6e 74 20 2d 64 65 63 20 24 72 65 rt -int -dec $re
1f80: 73 5d 0a 20 20 5d 0a 7d 0a 0a 73 65 74 20 4e 55 s]. ].}..set NU
1f90: 4d 5f 54 52 49 41 4c 53 20 31 30 30 0a 0a 66 6f M_TRIALS 100..fo
1fa0: 72 65 61 63 68 20 7b 6e 6f 64 65 73 69 7a 65 20 reach {nodesize
1fb0: 6f 72 64 65 72 7d 20 7b 0a 20 20 35 30 20 20 20 order} {. 50
1fc0: 20 44 45 53 43 0a 20 20 35 30 20 20 20 20 41 53 DESC. 50 AS
1fd0: 43 0a 20 20 35 30 30 20 20 20 41 53 43 0a 20 20 C. 500 ASC.
1fe0: 31 30 30 30 20 20 44 45 53 43 0a 20 20 32 30 30 1000 DESC. 200
1ff0: 30 20 20 41 53 43 0a 7d 20 7b 0a 20 20 63 61 74 0 ASC.} {. cat
2000: 63 68 20 7b 20 61 72 72 61 79 20 75 6e 73 65 74 ch { array unset
2010: 20 3a 3a 74 31 20 7d 0a 20 20 73 65 74 20 74 65 ::t1 }. set te
2020: 73 74 6e 61 6d 65 20 22 24 6e 6f 64 65 73 69 7a stname "$nodesiz
2030: 65 2f 24 6f 72 64 65 72 22 0a 0a 20 20 23 20 43 e/$order".. # C
2040: 72 65 61 74 65 20 74 68 65 20 46 54 53 33 20 74 reate the FTS3 t
2050: 61 62 6c 65 2e 20 50 6f 70 75 6c 61 74 65 20 69 able. Populate i
2060: 74 20 28 61 6e 64 20 74 68 65 20 54 63 6c 20 61 t (and the Tcl a
2070: 72 72 61 79 29 20 77 69 74 68 20 31 30 30 20 72 rray) with 100 r
2080: 6f 77 73 2e 0a 20 20 23 0a 20 20 64 62 20 74 72 ows.. #. db tr
2090: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 ansaction {.
20a0: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 catchsql { DROP
20b0: 54 41 42 4c 45 20 74 31 20 7d 0a 20 20 20 20 65 TABLE t1 }. e
20c0: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 56 xecsql "CREATE V
20d0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 IRTUAL TABLE t1
20e0: 55 53 49 4e 47 20 66 74 73 34 28 61 2c 20 62 2c USING fts4(a, b,
20f0: 20 63 2c 20 6f 72 64 65 72 3d 24 6f 72 64 65 72 c, order=$order
2100: 29 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 )". execsql "
2110: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28 74 INSERT INTO t1(t
2120: 31 29 20 56 41 4c 55 45 53 28 27 6e 6f 64 65 73 1) VALUES('nodes
2130: 69 7a 65 3d 24 6e 6f 64 65 73 69 7a 65 27 29 22 ize=$nodesize')"
2140: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 . for {set i
2150: 30 7d 20 7b 24 69 20 3c 20 31 30 30 7d 20 7b 69 0} {$i < 100} {i
2160: 6e 63 72 20 69 7d 20 7b 20 69 6e 73 65 72 74 5f ncr i} { insert_
2170: 72 6f 77 20 24 69 20 7d 0a 20 20 7d 0a 20 20 0a row $i }. }. .
2180: 20 20 66 6f 72 20 7b 73 65 74 20 69 54 65 73 74 for {set iTest
2190: 20 31 7d 20 7b 24 69 54 65 73 74 20 3c 3d 20 24 1} {$iTest <= $
21a0: 4e 55 4d 5f 54 52 49 41 4c 53 7d 20 7b 69 6e 63 NUM_TRIALS} {inc
21b0: 72 20 69 54 65 73 74 7d 20 7b 0a 20 20 20 20 63 r iTest} {. c
21c0: 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a 0a atchsql COMMIT..
21d0: 20 20 20 20 73 65 74 20 44 4f 5f 4d 41 4c 4c 4f set DO_MALLO
21e0: 43 5f 54 45 53 54 20 30 0a 20 20 20 20 73 65 74 C_TEST 0. set
21f0: 20 6e 52 65 70 20 31 30 0a 20 20 20 20 69 66 20 nRep 10. if
2200: 7b 24 69 54 65 73 74 3d 3d 31 30 30 20 26 26 20 {$iTest==100 &&
2210: 24 6e 6f 64 65 73 69 7a 65 3d 3d 35 30 7d 20 7b $nodesize==50} {
2220: 20 0a 20 20 20 20 20 20 73 65 74 20 44 4f 5f 4d . set DO_M
2230: 41 4c 4c 4f 43 5f 54 45 53 54 20 31 20 0a 20 20 ALLOC_TEST 1 .
2240: 20 20 20 20 73 65 74 20 6e 52 65 70 20 32 0a 20 set nRep 2.
2250: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 3a 3a }.. set ::
2260: 74 65 73 74 70 72 65 66 69 78 20 66 74 73 33 72 testprefix fts3r
2270: 6e 64 2d 31 2e 24 74 65 73 74 6e 61 6d 65 2e 24 nd-1.$testname.$
2280: 69 54 65 73 74 0a 20 20 0a 20 20 20 20 23 20 44 iTest. . # D
2290: 65 6c 65 74 65 20 6f 6e 65 20 72 6f 77 2c 20 75 elete one row, u
22a0: 70 64 61 74 65 20 6f 6e 65 20 72 6f 77 20 61 6e pdate one row an
22b0: 64 20 69 6e 73 65 72 74 20 6f 6e 65 20 72 6f 77 d insert one row
22c0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 73 65 74 20 .. #. set
22d0: 72 6f 77 73 20 5b 61 72 72 61 79 20 6e 61 6d 65 rows [array name
22e0: 73 20 3a 3a 74 31 5d 0a 20 20 20 20 73 65 74 20 s ::t1]. set
22f0: 6e 52 6f 77 20 5b 6c 6c 65 6e 67 74 68 20 24 72 nRow [llength $r
2300: 6f 77 73 5d 0a 20 20 20 20 73 65 74 20 69 55 70 ows]. set iUp
2310: 64 61 74 65 20 5b 6c 69 6e 64 65 78 20 24 72 6f date [lindex $ro
2320: 77 73 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 ws [expr {int(ra
2330: 6e 64 28 29 2a 24 6e 52 6f 77 29 7d 5d 5d 0a 20 nd()*$nRow)}]].
2340: 20 20 20 73 65 74 20 69 44 65 6c 65 74 65 20 24 set iDelete $
2350: 69 55 70 64 61 74 65 0a 20 20 20 20 77 68 69 6c iUpdate. whil
2360: 65 20 7b 24 69 44 65 6c 65 74 65 20 3d 3d 20 24 e {$iDelete == $
2370: 69 55 70 64 61 74 65 7d 20 7b 0a 20 20 20 20 20 iUpdate} {.
2380: 20 73 65 74 20 69 44 65 6c 65 74 65 20 5b 6c 69 set iDelete [li
2390: 6e 64 65 78 20 24 72 6f 77 73 20 5b 65 78 70 72 ndex $rows [expr
23a0: 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a 24 6e 52 {int(rand()*$nR
23b0: 6f 77 29 7d 5d 5d 0a 20 20 20 20 7d 0a 20 20 20 ow)}]]. }.
23c0: 20 73 65 74 20 69 49 6e 73 65 72 74 20 24 69 55 set iInsert $iU
23d0: 70 64 61 74 65 0a 20 20 20 20 77 68 69 6c 65 20 pdate. while
23e0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a {[info exists ::
23f0: 74 31 28 24 69 49 6e 73 65 72 74 29 5d 7d 20 7b t1($iInsert)]} {
2400: 0a 20 20 20 20 20 20 73 65 74 20 69 49 6e 73 65 . set iInse
2410: 72 74 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 rt [expr {int(ra
2420: 6e 64 28 29 2a 31 30 30 30 30 30 30 29 7d 5d 0a nd()*1000000)}].
2430: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 }. execsq
2440: 6c 20 42 45 47 49 4e 0a 20 20 20 20 20 20 69 6e l BEGIN. in
2450: 73 65 72 74 5f 72 6f 77 20 24 69 49 6e 73 65 72 sert_row $iInser
2460: 74 0a 20 20 20 20 20 20 75 70 64 61 74 65 5f 72 t. update_r
2470: 6f 77 20 24 69 55 70 64 61 74 65 0a 20 20 20 20 ow $iUpdate.
2480: 20 20 64 65 6c 65 74 65 5f 72 6f 77 20 24 69 44 delete_row $iD
2490: 65 6c 65 74 65 0a 20 20 20 20 69 66 20 7b 30 3d elete. if {0=
24a0: 3d 28 24 69 54 65 73 74 25 32 29 7d 20 7b 20 65 =($iTest%2)} { e
24b0: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 20 7d 0a xecsql COMMIT }.
24c0: 0a 20 20 20 20 69 66 20 7b 30 3d 3d 28 24 69 54 . if {0==($iT
24d0: 65 73 74 25 32 29 7d 20 7b 20 0a 20 20 20 20 20 est%2)} { .
24e0: 20 23 64 6f 5f 74 65 73 74 20 30 20 7b 20 66 74 #do_test 0 { ft
24f0: 73 33 5f 69 6e 74 65 67 72 69 74 79 5f 63 68 65 s3_integrity_che
2500: 63 6b 20 74 31 20 7d 20 6f 6b 20 0a 20 20 20 20 ck t1 } ok .
2510: 7d 0a 0a 20 20 20 20 23 20 50 69 63 6b 20 31 30 }.. # Pick 10
2520: 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 terms from the
2530: 76 6f 63 61 62 75 6c 61 72 79 2e 20 43 68 65 63 vocabulary. Chec
2540: 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c k that the resul
2550: 74 73 20 6f 66 20 71 75 65 72 79 69 6e 67 0a 20 ts of querying.
2560: 20 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73 # the databas
2570: 65 20 66 6f 72 20 74 68 65 20 73 65 74 20 6f 66 e for the set of
2580: 20 64 6f 63 75 6d 65 6e 74 73 20 63 6f 6e 74 61 documents conta
2590: 69 6e 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68 ining each of th
25a0: 65 73 65 20 74 65 72 6d 73 0a 20 20 20 20 23 20 ese terms. #
25b0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 is the same as t
25c0: 68 65 20 72 65 73 75 6c 74 20 6f 62 74 61 69 6e he result obtain
25d0: 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 ed by scanning t
25e0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 he contents of t
25f0: 68 65 20 54 63 6c 20 0a 20 20 20 20 23 20 61 72 he Tcl . # ar
2600: 72 61 79 20 66 6f 72 20 65 61 63 68 20 74 65 72 ray for each ter
2610: 6d 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 6f 72 m.. #. for
2620: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c {set i 0} {$i <
2630: 20 31 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 10} {incr i} {.
2640: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 20 5b set term [
2650: 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 20 random_term].
2660: 20 20 20 64 6f 5f 73 65 6c 65 63 74 5f 74 65 73 do_select_tes
2670: 74 20 31 2e 24 69 2e 61 73 63 20 7b 0a 20 20 20 t 1.$i.asc {.
2680: 20 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 SELECT doci
2690: 64 2c 20 6d 69 74 28 6d 61 74 63 68 69 6e 66 6f d, mit(matchinfo
26a0: 28 74 31 29 29 20 46 52 4f 4d 20 74 31 20 57 48 (t1)) FROM t1 WH
26b0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 24 74 65 ERE t1 MATCH $te
26c0: 72 6d 0a 20 20 20 20 20 20 20 20 4f 52 44 45 52 rm. ORDER
26d0: 20 42 59 20 64 6f 63 69 64 20 41 53 43 0a 20 20 BY docid ASC.
26e0: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 74 6f } [simple_to
26f0: 6b 65 6e 5f 6d 61 74 63 68 69 6e 66 6f 20 24 74 ken_matchinfo $t
2700: 65 72 6d 20 30 5d 0a 20 20 20 20 20 20 64 6f 5f erm 0]. do_
2710: 73 65 6c 65 63 74 5f 74 65 73 74 20 31 2e 24 69 select_test 1.$i
2720: 2e 64 65 73 63 20 7b 0a 20 20 20 20 20 20 20 20 .desc {.
2730: 53 45 4c 45 43 54 20 64 6f 63 69 64 2c 20 6d 69 SELECT docid, mi
2740: 74 28 6d 61 74 63 68 69 6e 66 6f 28 74 31 29 29 t(matchinfo(t1))
2750: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 FROM t1 WHERE t
2760: 31 20 4d 41 54 43 48 20 24 74 65 72 6d 0a 20 20 1 MATCH $term.
2770: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 64 ORDER BY d
2780: 6f 63 69 64 20 44 45 53 43 0a 20 20 20 20 20 20 ocid DESC.
2790: 7d 20 5b 73 69 6d 70 6c 65 5f 74 6f 6b 65 6e 5f } [simple_token_
27a0: 6d 61 74 63 68 69 6e 66 6f 20 24 74 65 72 6d 20 matchinfo $term
27b0: 31 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 1]. }.. #
27c0: 54 68 69 73 20 74 69 6d 65 2c 20 75 73 65 20 74 This time, use t
27d0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 63 68 61 he first two cha
27e0: 72 61 63 74 65 72 73 20 6f 66 20 65 61 63 68 20 racters of each
27f0: 74 65 72 6d 20 61 73 20 61 20 74 65 72 6d 20 70 term as a term p
2800: 72 65 66 69 78 0a 20 20 20 20 23 20 74 6f 20 71 refix. # to q
2810: 75 65 72 79 20 66 6f 72 2e 20 54 65 73 74 20 74 uery for. Test t
2820: 68 61 74 20 71 75 65 72 79 69 6e 67 20 74 68 65 hat querying the
2830: 20 54 63 6c 20 61 72 72 61 79 20 70 72 6f 64 75 Tcl array produ
2840: 63 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 ces the same res
2850: 75 6c 74 73 0a 20 20 20 20 23 20 61 73 20 71 75 ults. # as qu
2860: 65 72 79 69 6e 67 20 74 68 65 20 46 54 53 33 20 erying the FTS3
2870: 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 70 72 table for the pr
2880: 65 66 69 78 2e 0a 20 20 20 20 23 0a 20 20 20 20 efix.. #.
2890: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 for {set i 0} {$
28a0: 69 20 3c 20 24 6e 52 65 70 7d 20 7b 69 6e 63 72 i < $nRep} {incr
28b0: 20 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 i} {. set
28c0: 70 72 65 66 69 78 20 5b 73 74 72 69 6e 67 20 72 prefix [string r
28d0: 61 6e 67 65 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 ange [random_ter
28e0: 6d 5d 20 30 20 65 6e 64 2d 31 5d 0a 20 20 20 20 m] 0 end-1].
28f0: 20 20 73 65 74 20 6d 61 74 63 68 20 22 24 7b 70 set match "${p
2900: 72 65 66 69 78 7d 2a 22 0a 20 20 20 20 20 20 64 refix}*". d
2910: 6f 5f 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74 o_orderbydocid_t
2920: 65 73 74 20 32 2e 24 69 20 7b 0a 20 20 20 20 20 est 2.$i {.
2930: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 SELECT docid
2940: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 FROM t1 WHERE t1
2950: 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20 MATCH $match.
2960: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68 } [simple_ph
2970: 72 61 73 65 20 24 6d 61 74 63 68 5d 0a 20 20 20 rase $match].
2980: 20 7d 0a 0a 20 20 20 20 23 20 53 69 6d 69 6c 61 }.. # Simila
2990: 72 20 74 6f 20 74 68 65 20 61 62 6f 76 65 2c 20 r to the above,
29a0: 65 78 63 65 70 74 20 66 6f 72 20 70 68 72 61 73 except for phras
29b0: 65 20 71 75 65 72 69 65 73 2e 0a 20 20 20 20 23 e queries.. #
29c0: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 . for {set i
29d0: 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 70 7d 20 0} {$i < $nRep}
29e0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 {incr i} {.
29f0: 20 73 65 74 20 74 65 72 6d 20 5b 6c 69 73 74 20 set term [list
2a00: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 5b 72 [random_term] [r
2a10: 61 6e 64 6f 6d 5f 74 65 72 6d 5d 5d 0a 20 20 20 andom_term]].
2a20: 20 20 20 73 65 74 20 6d 61 74 63 68 20 22 5c 22 set match "\"
2a30: 24 74 65 72 6d 5c 22 22 0a 20 20 20 20 20 20 64 $term\"". d
2a40: 6f 5f 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74 o_orderbydocid_t
2a50: 65 73 74 20 33 2e 24 69 20 7b 0a 20 20 20 20 20 est 3.$i {.
2a60: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 SELECT docid
2a70: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 FROM t1 WHERE t1
2a80: 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20 MATCH $match.
2a90: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68 } [simple_ph
2aa0: 72 61 73 65 20 24 74 65 72 6d 5d 0a 20 20 20 20 rase $term].
2ab0: 7d 0a 0a 20 20 20 20 23 20 54 68 72 65 65 20 77 }.. # Three w
2ac0: 6f 72 64 20 70 68 72 61 73 65 73 2e 0a 20 20 20 ord phrases..
2ad0: 20 23 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 #. for {set
2ae0: 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 70 i 0} {$i < $nRep
2af0: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 } {incr i} {.
2b00: 20 20 20 73 65 74 20 74 65 72 6d 20 5b 6c 69 73 set term [lis
2b10: 74 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 t [random_term]
2b20: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 5b 72 [random_term] [r
2b30: 61 6e 64 6f 6d 5f 74 65 72 6d 5d 5d 0a 20 20 20 andom_term]].
2b40: 20 20 20 73 65 74 20 6d 61 74 63 68 20 22 5c 22 set match "\"
2b50: 24 74 65 72 6d 5c 22 22 0a 20 20 20 20 20 20 64 $term\"". d
2b60: 6f 5f 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74 o_orderbydocid_t
2b70: 65 73 74 20 34 2e 24 69 20 7b 0a 20 20 20 20 20 est 4.$i {.
2b80: 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 SELECT docid
2b90: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 FROM t1 WHERE t1
2ba0: 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20 MATCH $match.
2bb0: 20 20 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68 } [simple_ph
2bc0: 72 61 73 65 20 24 74 65 72 6d 5d 0a 20 20 20 20 rase $term].
2bd0: 7d 0a 0a 20 20 20 20 23 20 54 68 72 65 65 20 77 }.. # Three w
2be0: 6f 72 64 20 70 68 72 61 73 65 73 20 6d 61 64 65 ord phrases made
2bf0: 20 75 70 20 6f 66 20 74 65 72 6d 2d 70 72 65 66 up of term-pref
2c00: 69 78 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 ixes.. #.
2c10: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 for {set i 0} {$
2c20: 69 20 3c 20 24 6e 52 65 70 7d 20 7b 69 6e 63 72 i < $nRep} {incr
2c30: 20 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 i} {. set
2c40: 20 20 20 71 75 65 72 79 20 22 5b 73 74 72 69 6e query "[strin
2c50: 67 20 72 61 6e 67 65 20 5b 72 61 6e 64 6f 6d 5f g range [random_
2c60: 74 65 72 6d 5d 20 30 20 65 6e 64 2d 31 5d 2a 20 term] 0 end-1]*
2c70: 22 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 71 ". append q
2c80: 75 65 72 79 20 22 5b 73 74 72 69 6e 67 20 72 61 uery "[string ra
2c90: 6e 67 65 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d nge [random_term
2ca0: 5d 20 30 20 65 6e 64 2d 31 5d 2a 20 22 0a 20 20 ] 0 end-1]* ".
2cb0: 20 20 20 20 61 70 70 65 6e 64 20 71 75 65 72 79 append query
2cc0: 20 22 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 "[string range
2cd0: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 20 30 20 [random_term] 0
2ce0: 65 6e 64 2d 31 5d 2a 22 0a 0a 20 20 20 20 20 20 end-1]*"..
2cf0: 73 65 74 20 6d 61 74 63 68 20 22 5c 22 24 71 75 set match "\"$qu
2d00: 65 72 79 5c 22 22 0a 20 20 20 20 20 20 64 6f 5f ery\"". do_
2d10: 6f 72 64 65 72 62 79 64 6f 63 69 64 5f 74 65 73 orderbydocid_tes
2d20: 74 20 35 2e 24 69 20 7b 0a 20 20 20 20 20 20 20 t 5.$i {.
2d30: 20 53 45 4c 45 43 54 20 64 6f 63 69 64 20 46 52 SELECT docid FR
2d40: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d OM t1 WHERE t1 M
2d50: 41 54 43 48 20 24 6d 61 74 63 68 0a 20 20 20 20 ATCH $match.
2d60: 20 20 7d 20 5b 73 69 6d 70 6c 65 5f 70 68 72 61 } [simple_phra
2d70: 73 65 20 24 71 75 65 72 79 5d 0a 20 20 20 20 7d se $query]. }
2d80: 0a 0a 20 20 20 20 23 20 41 20 4e 45 41 52 20 71 .. # A NEAR q
2d90: 75 65 72 79 20 77 69 74 68 20 74 65 72 6d 73 20 uery with terms
2da0: 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 as the arguments
2db0: 3a 0a 20 20 20 20 23 0a 20 20 20 20 23 20 20 20 :. #. #
2dc0: 20 20 2e 2e 2e 20 4d 41 54 43 48 20 27 24 74 65 ... MATCH '$te
2dd0: 72 6d 31 20 4e 45 41 52 20 24 74 65 72 6d 32 27 rm1 NEAR $term2'
2de0: 20 2e 2e 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 .... #. f
2df0: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 or {set i 0} {$i
2e00: 20 3c 20 24 6e 52 65 70 7d 20 7b 69 6e 63 72 20 < $nRep} {incr
2e10: 69 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 74 i} {. set t
2e20: 65 72 6d 73 20 5b 6c 69 73 74 20 5b 72 61 6e 64 erms [list [rand
2e30: 6f 6d 5f 74 65 72 6d 5d 20 5b 72 61 6e 64 6f 6d om_term] [random
2e40: 5f 74 65 72 6d 5d 5d 0a 20 20 20 20 20 20 73 65 _term]]. se
2e50: 74 20 6d 61 74 63 68 20 5b 6a 6f 69 6e 20 24 74 t match [join $t
2e60: 65 72 6d 73 20 22 20 4e 45 41 52 20 22 5d 0a 20 erms " NEAR "].
2e70: 20 20 20 20 20 64 6f 5f 6f 72 64 65 72 62 79 64 do_orderbyd
2e80: 6f 63 69 64 5f 74 65 73 74 20 36 2e 24 69 20 7b ocid_test 6.$i {
2e90: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 . SELECT
2ea0: 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 20 57 48 docid FROM t1 WH
2eb0: 45 52 45 20 74 31 20 4d 41 54 43 48 20 24 6d 61 ERE t1 MATCH $ma
2ec0: 74 63 68 20 0a 20 20 20 20 20 20 7d 20 5b 73 69 tch . } [si
2ed0: 6d 70 6c 65 5f 6e 65 61 72 20 24 74 65 72 6d 73 mple_near $terms
2ee0: 20 31 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 10]. }..
2ef0: 23 20 41 20 33 2d 77 61 79 20 4e 45 41 52 20 71 # A 3-way NEAR q
2f00: 75 65 72 79 20 77 69 74 68 20 74 65 72 6d 73 20 uery with terms
2f10: 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 as the arguments
2f20: 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 6f 72 20 .. #. for
2f30: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 {set i 0} {$i <
2f40: 24 6e 52 65 70 7d 20 7b 69 6e 63 72 20 69 7d 20 $nRep} {incr i}
2f50: 7b 0a 20 20 20 20 20 20 73 65 74 20 74 65 72 6d {. set term
2f60: 73 20 5b 6c 69 73 74 20 5b 72 61 6e 64 6f 6d 5f s [list [random_
2f70: 74 65 72 6d 5d 20 5b 72 61 6e 64 6f 6d 5f 74 65 term] [random_te
2f80: 72 6d 5d 20 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d rm] [random_term
2f90: 5d 5d 0a 20 20 20 20 20 20 73 65 74 20 6e 4e 65 ]]. set nNe
2fa0: 61 72 20 31 31 0a 20 20 20 20 20 20 73 65 74 20 ar 11. set
2fb0: 6d 61 74 63 68 20 5b 6a 6f 69 6e 20 24 74 65 72 match [join $ter
2fc0: 6d 73 20 22 20 4e 45 41 52 2f 24 6e 4e 65 61 72 ms " NEAR/$nNear
2fd0: 20 22 5d 0a 20 20 20 20 20 20 64 6f 5f 6f 72 64 "]. do_ord
2fe0: 65 72 62 79 64 6f 63 69 64 5f 74 65 73 74 20 37 erbydocid_test 7
2ff0: 2e 24 69 20 7b 0a 20 20 20 20 20 20 20 20 53 45 .$i {. SE
3000: 4c 45 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 LECT docid FROM
3010: 74 31 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 t1 WHERE t1 MATC
3020: 48 20 24 6d 61 74 63 68 0a 20 20 20 20 20 20 7d H $match. }
3030: 20 5b 73 69 6d 70 6c 65 5f 6e 65 61 72 20 24 74 [simple_near $t
3040: 65 72 6d 73 20 24 6e 4e 65 61 72 5d 0a 20 20 20 erms $nNear].
3050: 20 7d 0a 20 20 20 20 0a 20 20 20 20 23 20 53 65 }. . # Se
3060: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 t operations on
3070: 73 69 6d 70 6c 65 20 74 65 72 6d 20 71 75 65 72 simple term quer
3080: 69 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 ies.. #. f
3090: 6f 72 65 61 63 68 20 7b 74 6e 20 6f 70 20 70 72 oreach {tn op pr
30a0: 6f 63 7d 20 7b 0a 20 20 20 20 20 20 38 20 20 4f oc} {. 8 O
30b0: 52 20 20 73 65 74 6f 70 5f 6f 72 0a 20 20 20 20 R setop_or.
30c0: 20 20 39 20 20 4e 4f 54 20 73 65 74 6f 70 5f 6e 9 NOT setop_n
30d0: 6f 74 0a 20 20 20 20 20 20 31 30 20 41 4e 44 20 ot. 10 AND
30e0: 73 65 74 6f 70 5f 61 6e 64 0a 20 20 20 20 7d 20 setop_and. }
30f0: 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 {. for {set
3100: 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 i 0} {$i < $nRe
3110: 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 p} {incr i} {.
3120: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 31 20 set term1
3130: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 [random_term].
3140: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 32 20 set term2
3150: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 [random_term].
3160: 20 20 20 20 20 20 73 65 74 20 6d 61 74 63 68 20 set match
3170: 22 24 74 65 72 6d 31 20 24 6f 70 20 24 74 65 72 "$term1 $op $ter
3180: 6d 32 22 0a 20 20 20 20 20 20 20 20 64 6f 5f 6f m2". do_o
3190: 72 64 65 72 62 79 64 6f 63 69 64 5f 74 65 73 74 rderbydocid_test
31a0: 20 24 74 6e 2e 24 69 20 7b 0a 20 20 20 20 20 20 $tn.$i {.
31b0: 20 20 20 20 53 45 4c 45 43 54 20 64 6f 63 69 64 SELECT docid
31c0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 74 FROM t1 WHERE t
31d0: 31 20 4d 41 54 43 48 20 24 6d 61 74 63 68 0a 20 1 MATCH $match.
31e0: 20 20 20 20 20 20 20 7d 20 5b 24 70 72 6f 63 20 } [$proc
31f0: 5b 73 69 6d 70 6c 65 5f 70 68 72 61 73 65 20 24 [simple_phrase $
3200: 74 65 72 6d 31 5d 20 5b 73 69 6d 70 6c 65 5f 70 term1] [simple_p
3210: 68 72 61 73 65 20 24 74 65 72 6d 32 5d 5d 0a 20 hrase $term2]].
3220: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 }. }. .
3230: 20 20 20 23 20 53 65 74 20 6f 70 65 72 61 74 69 # Set operati
3240: 6f 6e 73 20 6f 6e 20 4e 45 41 52 20 71 75 65 72 ons on NEAR quer
3250: 69 65 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 66 ies.. #. f
3260: 6f 72 65 61 63 68 20 7b 74 6e 20 6f 70 20 70 72 oreach {tn op pr
3270: 6f 63 7d 20 7b 0a 20 20 20 20 20 20 31 31 20 4f oc} {. 11 O
3280: 52 20 20 73 65 74 6f 70 5f 6f 72 0a 20 20 20 20 R setop_or.
3290: 20 20 31 32 20 4e 4f 54 20 73 65 74 6f 70 5f 6e 12 NOT setop_n
32a0: 6f 74 0a 20 20 20 20 20 20 31 33 20 41 4e 44 20 ot. 13 AND
32b0: 73 65 74 6f 70 5f 61 6e 64 0a 20 20 20 20 7d 20 setop_and. }
32c0: 7b 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 {. for {set
32d0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 24 6e 52 65 i 0} {$i < $nRe
32e0: 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 p} {incr i} {.
32f0: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 31 20 set term1
3300: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 [random_term].
3310: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 32 20 set term2
3320: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 [random_term].
3330: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 33 20 set term3
3340: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 [random_term].
3350: 20 20 20 20 20 20 73 65 74 20 74 65 72 6d 34 20 set term4
3360: 5b 72 61 6e 64 6f 6d 5f 74 65 72 6d 5d 0a 20 20 [random_term].
3370: 20 20 20 20 20 20 73 65 74 20 6d 61 74 63 68 20 set match
3380: 22 24 74 65 72 6d 31 20 4e 45 41 52 20 24 74 65 "$term1 NEAR $te
3390: 72 6d 32 20 24 6f 70 20 24 74 65 72 6d 33 20 4e rm2 $op $term3 N
33a0: 45 41 52 20 24 74 65 72 6d 34 22 0a 20 20 20 20 EAR $term4".
33b0: 20 20 20 20 64 6f 5f 6f 72 64 65 72 62 79 64 6f do_orderbydo
33c0: 63 69 64 5f 74 65 73 74 20 24 74 6e 2e 24 69 20 cid_test $tn.$i
33d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 {. SELE
33e0: 43 54 20 64 6f 63 69 64 20 46 52 4f 4d 20 74 31 CT docid FROM t1
33f0: 20 57 48 45 52 45 20 74 31 20 4d 41 54 43 48 20 WHERE t1 MATCH
3400: 24 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 7d $match. }
3410: 20 5b 24 70 72 6f 63 20 20 20 20 20 20 20 20 20 [$proc
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3430: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 \.
3440: 20 20 20 20 20 20 20 5b 73 69 6d 70 6c 65 5f 6e [simple_n
3450: 65 61 72 20 5b 6c 69 73 74 20 24 74 65 72 6d 31 ear [list $term1
3460: 20 24 74 65 72 6d 32 5d 20 31 30 5d 20 5c 0a 20 $term2] 10] \.
3470: 20 20 20 20 20 20 20 20 20 20 20 5b 73 69 6d 70 [simp
3480: 6c 65 5f 6e 65 61 72 20 5b 6c 69 73 74 20 24 74 le_near [list $t
3490: 65 72 6d 33 20 24 74 65 72 6d 34 5d 20 31 30 5d erm3 $term4] 10]
34a0: 0a 20 20 20 20 20 20 20 20 20 20 5d 0a 20 20 20 . ].
34b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
34c0: 63 61 74 63 68 73 71 6c 20 43 4f 4d 4d 49 54 0a catchsql COMMIT.
34d0: 20 20 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 }.}..finish_te
34e0: 73 74 0a st.