/ Hex Artifact Content
Login

Artifact 719c35cbbcc04dde8e5a54a6f69851a0af9ed1f2:


0000: 23 20 32 30 31 31 20 4a 61 6e 75 61 72 79 20 32  # 2011 January 2
0010: 37 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  7.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
0180: 20 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74   regression test
0190: 73 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62  s for SQLite lib
01a0: 72 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63  rary.  The.# foc
01b0: 75 73 20 6f 66 20 74 68 69 73 20 73 63 72 69 70  us of this scrip
01c0: 74 20 69 73 20 74 65 73 74 69 6e 67 20 74 68 65  t is testing the
01d0: 20 46 54 53 33 20 6d 6f 64 75 6c 65 2e 0a 23 0a   FTS3 module..#.
01e0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
01f0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0200: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0210: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69 66  ir/tester.tcl.if
0220: 63 61 70 61 62 6c 65 20 21 66 74 73 33 20 7b 20  capable !fts3 { 
0230: 66 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65  finish_test ; re
0240: 74 75 72 6e 20 7d 0a 73 65 74 20 3a 3a 74 65 73  turn }.set ::tes
0250: 74 70 72 65 66 69 78 20 66 74 73 33 61 75 78 31  tprefix fts3aux1
0260: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0270: 74 20 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  t 1.1 {.  CREATE
0280: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
0290: 31 20 55 53 49 4e 47 20 66 74 73 34 3b 0a 20 20  1 USING fts4;.  
02a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
02b0: 41 4c 55 45 53 28 27 6f 6e 65 20 74 77 6f 20 74  ALUES('one two t
02c0: 68 72 65 65 20 66 6f 75 72 27 29 3b 0a 20 20 49  hree four');.  I
02d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
02e0: 4c 55 45 53 28 27 74 68 72 65 65 20 66 6f 75 72  LUES('three four
02f0: 20 66 69 76 65 20 73 69 78 27 29 3b 0a 20 20 49   five six');.  I
0300: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0310: 4c 55 45 53 28 27 6f 6e 65 20 74 68 72 65 65 20  LUES('one three 
0320: 66 69 76 65 20 73 65 76 65 6e 27 29 3b 0a 0a 20  five seven');.. 
0330: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
0340: 54 41 42 4c 45 20 74 65 72 6d 73 20 55 53 49 4e  TABLE terms USIN
0350: 47 20 66 74 73 34 61 75 78 28 74 31 29 3b 0a 20  G fts4aux(t1);. 
0360: 20 53 45 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f   SELECT term, do
0370: 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65  cuments, occurre
0380: 6e 63 65 73 20 46 52 4f 4d 20 74 65 72 6d 73 20  nces FROM terms 
0390: 57 48 45 52 45 20 63 6f 6c 20 3d 20 27 2a 27 3b  WHERE col = '*';
03a0: 0a 7d 20 7b 0a 20 20 66 69 76 65 20 20 32 20 32  .} {.  five  2 2
03b0: 20 20 20 20 20 66 6f 75 72 20 20 32 20 32 20 20       four  2 2  
03c0: 20 20 20 6f 6e 65 20 20 20 32 20 32 20 20 20 20     one   2 2    
03d0: 20 73 65 76 65 6e 20 31 20 31 20 0a 20 20 73 69   seven 1 1 .  si
03e0: 78 20 20 20 31 20 31 20 20 20 20 20 74 68 72 65  x   1 1     thre
03f0: 65 20 33 20 33 20 20 20 20 20 74 77 6f 20 20 20  e 3 3     two   
0400: 31 20 31 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  1 1.}..do_execsq
0410: 6c 5f 74 65 73 74 20 31 2e 32 20 7b 0a 20 20 49  l_test 1.2 {.  I
0420: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0430: 4c 55 45 53 28 27 6f 6e 65 20 6f 6e 65 20 6f 6e  LUES('one one on
0440: 65 20 74 68 72 65 65 20 74 68 72 65 65 20 74 68  e three three th
0450: 72 65 65 27 29 3b 0a 20 20 53 45 4c 45 43 54 20  ree');.  SELECT 
0460: 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73 2c  term, documents,
0470: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52 4f   occurrences FRO
0480: 4d 20 74 65 72 6d 73 20 57 48 45 52 45 20 63 6f  M terms WHERE co
0490: 6c 20 3d 20 27 2a 27 3b 0a 7d 20 7b 20 0a 20 20  l = '*';.} { .  
04a0: 66 69 76 65 20 20 32 20 32 20 20 20 20 20 66 6f  five  2 2     fo
04b0: 75 72 20 20 32 20 32 20 20 20 20 20 6f 6e 65 20  ur  2 2     one 
04c0: 20 20 33 20 35 20 20 20 20 20 73 65 76 65 6e 20    3 5     seven 
04d0: 31 20 31 20 0a 20 20 73 69 78 20 20 20 31 20 31  1 1 .  six   1 1
04e0: 20 20 20 20 20 74 68 72 65 65 20 34 20 36 20 20       three 4 6  
04f0: 20 20 20 74 77 6f 20 20 20 31 20 31 0a 7d 0a 0a     two   1 1.}..
0500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0510: 31 2e 33 20 7b 0a 20 20 44 45 4c 45 54 45 20 46  1.3 {.  DELETE F
0520: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
0530: 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73   term, documents
0540: 2c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52  , occurrences FR
0550: 4f 4d 20 74 65 72 6d 73 20 57 48 45 52 45 20 63  OM terms WHERE c
0560: 6f 6c 20 3d 20 27 2a 27 3b 0a 7d 20 7b 7d 0a 0a  ol = '*';.} {}..
0570: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0580: 31 2e 34 20 7b 0a 20 20 49 4e 53 45 52 54 20 49  1.4 {.  INSERT I
0590: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61  NTO t1 VALUES('a
05a0: 20 62 20 61 20 62 20 61 20 62 20 61 27 29 3b 0a   b a b a b a');.
05b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
05c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
05d0: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
05e0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
05f0: 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49  M t1;.  INSERT I
0600: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
0610: 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52  FROM t1;.  INSER
0620: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
0630: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e   * FROM t1;.  IN
0640: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0650: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
0660: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0670: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0680: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0690: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
06a0: 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   t1;.  INSERT IN
06b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
06c0: 52 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54  ROM t1;.  SELECT
06d0: 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73   term, documents
06e0: 2c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52  , occurrences FR
06f0: 4f 4d 20 74 65 72 6d 73 20 57 48 45 52 45 20 63  OM terms WHERE c
0700: 6f 6c 20 3d 20 27 2a 27 3b 0a 7d 20 7b 61 20 32  ol = '*';.} {a 2
0710: 35 36 20 31 30 32 34 20 20 20 20 62 20 32 35 36  56 1024    b 256
0720: 20 37 36 38 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   768}..#--------
0730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
0780: 67 20 74 65 73 74 73 20 76 65 72 69 66 79 20 74  g tests verify t
0790: 68 61 74 20 74 68 65 20 66 74 73 34 61 75 78 20  hat the fts4aux 
07a0: 6d 6f 64 75 6c 65 20 75 73 65 73 20 74 68 65 20  module uses the 
07b0: 66 75 6c 6c 2d 74 65 78 74 0a 23 20 69 6e 64 65  full-text.# inde
07c0: 78 20 74 6f 20 72 65 64 75 63 65 20 74 68 65 20  x to reduce the 
07d0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 73  number of rows s
07e0: 63 61 6e 6e 65 64 20 69 6e 20 74 68 65 20 66 6f  canned in the fo
07f0: 6c 6c 6f 77 69 6e 67 20 63 69 72 63 75 6d 73 74  llowing circumst
0800: 61 6e 63 65 73 3a 0a 23 0a 23 20 20 20 2a 20 77  ances:.#.#   * w
0810: 68 65 6e 20 74 68 65 72 65 20 69 73 20 65 71 75  hen there is equ
0820: 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
0830: 20 61 67 61 69 6e 73 74 20 74 68 65 20 74 65 72   against the ter
0840: 6d 20 63 6f 6c 75 6d 6e 20 75 73 69 6e 67 20 74  m column using t
0850: 68 65 20 0a 23 20 20 20 20 20 42 49 4e 41 52 59  he .#     BINARY
0860: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0870: 6e 63 65 2e 20 0a 23 0a 23 20 20 20 2a 20 77 68  nce. .#.#   * wh
0880: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 72 61  en there is a ra
0890: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  nge constraint o
08a0: 6e 20 74 68 65 20 74 65 72 6d 20 63 6f 6c 75 6d  n the term colum
08b0: 6e 20 75 73 69 6e 67 20 74 68 65 20 42 49 4e 41  n using the BINA
08c0: 52 59 20 0a 23 20 20 20 20 20 63 6f 6c 6c 61 74  RY .#     collat
08d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 0a 23  ing sequence. .#
08e0: 0a 23 20 41 6e 64 20 61 6c 73 6f 20 75 73 65 73  .# And also uses
08f0: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
0900: 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65  ndex to optimize
0910: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0920: 73 20 6f 66 20 74 68 65 20 0a 23 20 66 6f 72 6d  s of the .# form
0930: 20 22 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20   "ORDER BY term 
0940: 41 53 43 22 20 6f 72 20 65 71 75 69 76 61 6c 65  ASC" or equivale
0950: 6e 74 2e 0a 23 0a 23 20 54 65 73 74 20 6f 72 67  nt..#.# Test org
0960: 61 6e 69 7a 61 74 69 6f 6e 20 69 73 3a 0a 23 0a  anization is:.#.
0970: 23 20 20 20 66 74 73 33 61 75 78 31 2d 32 2e 31  #   fts3aux1-2.1
0980: 2e 2a 3a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  .*: equality con
0990: 73 74 72 61 69 6e 74 73 2e 0a 23 20 20 20 66 74  straints..#   ft
09a0: 73 33 61 75 78 31 2d 32 2e 32 2e 2a 3a 20 72 61  s3aux1-2.2.*: ra
09b0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  nge constraints.
09c0: 0a 23 20 20 20 66 74 73 33 61 75 78 31 2d 32 2e  .#   fts3aux1-2.
09d0: 33 2e 2a 3a 20 4f 52 44 45 52 20 42 59 20 6f 70  3.*: ORDER BY op
09e0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 23 20 0a 0a  timization..# ..
09f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0a00: 32 2e 30 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  2.0 {.  DROP TAB
0a10: 4c 45 20 74 31 3b 0a 20 20 44 52 4f 50 20 54 41  LE t1;.  DROP TA
0a20: 42 4c 45 20 74 65 72 6d 73 3b 0a 0a 20 20 43 52  BLE terms;..  CR
0a30: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
0a40: 4c 45 20 78 31 20 55 53 49 4e 47 20 66 74 73 34  LE x1 USING fts4
0a50: 28 78 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (x);.  INSERT IN
0a60: 54 4f 20 78 31 28 78 31 29 20 56 41 4c 55 45 53  TO x1(x1) VALUES
0a70: 28 27 6e 6f 64 65 73 69 7a 65 3d 32 34 27 29 3b  ('nodesize=24');
0a80: 0a 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41  .  CREATE VIRTUA
0a90: 4c 20 54 41 42 4c 45 20 74 65 72 6d 73 20 55 53  L TABLE terms US
0aa0: 49 4e 47 20 66 74 73 34 61 75 78 28 78 31 29 3b  ING fts4aux(x1);
0ab0: 0a 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20  ..  CREATE VIEW 
0ac0: 74 65 72 6d 73 5f 76 20 41 53 20 0a 20 20 53 45  terms_v AS .  SE
0ad0: 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d  LECT term, docum
0ae0: 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e 63 65  ents, occurrence
0af0: 73 20 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45  s FROM terms WHE
0b00: 52 45 20 63 6f 6c 20 3d 20 27 2a 27 3b 0a 0a 20  RE col = '*';.. 
0b10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
0b20: 56 41 4c 55 45 53 28 27 62 72 61 65 73 20 62 72  VALUES('braes br
0b30: 61 67 20 62 72 61 67 67 65 64 20 62 72 61 67 67  ag bragged bragg
0b40: 65 72 20 62 72 61 67 67 69 6e 67 27 29 3b 0a 20  er bragging');. 
0b50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
0b60: 56 41 4c 55 45 53 28 27 62 72 61 67 73 20 62 72  VALUES('brags br
0b70: 61 69 64 20 62 72 61 69 64 65 64 20 62 72 61 69  aid braided brai
0b80: 64 69 6e 67 20 62 72 61 69 64 73 27 29 3b 0a 20  ding braids');. 
0b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20   INSERT INTO x1 
0ba0: 56 41 4c 55 45 53 28 27 62 72 61 69 6e 20 62 72  VALUES('brain br
0bb0: 61 69 6e 63 68 69 6c 64 20 62 72 61 69 6e 65 64  ainchild brained
0bc0: 20 62 72 61 69 6e 69 6e 67 20 62 72 61 69 6e 73   braining brains
0bd0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
0be0: 4f 20 78 31 20 56 41 4c 55 45 53 28 27 62 72 61  O x1 VALUES('bra
0bf0: 69 6e 73 74 65 6d 20 62 72 61 69 6e 73 74 65 6d  instem brainstem
0c00: 73 20 62 72 61 69 6e 73 74 6f 72 6d 20 62 72 61  s brainstorm bra
0c10: 69 6e 73 74 6f 72 6d 73 27 29 3b 20 0a 7d 0a 0a  instorms'); .}..
0c20: 70 72 6f 63 20 72 65 63 20 7b 76 61 72 6e 61 6d  proc rec {varnam
0c30: 65 20 78 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20  e x} {.  global 
0c40: 24 76 61 72 6e 61 6d 65 0a 20 20 69 6e 63 72 20  $varname.  incr 
0c50: 24 76 61 72 6e 61 6d 65 0a 20 20 72 65 74 75 72  $varname.  retur
0c60: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 72 65  n 1.}.db func re
0c70: 63 20 72 65 63 0a 0a 23 20 55 73 65 20 45 51 50  c rec..# Use EQP
0c80: 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74 68   to show that th
0c90: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
0ca0: 6f 6e 20 22 74 65 72 6d 3d 27 62 72 61 69 64 27  on "term='braid'
0cb0: 22 20 75 73 65 73 20 61 20 64 69 66 66 65 72 65  " uses a differe
0cc0: 6e 74 0a 23 20 69 6e 64 65 78 20 6e 75 6d 62 65  nt.# index numbe
0cd0: 72 20 28 31 29 20 74 68 61 6e 20 22 2b 74 65 72  r (1) than "+ter
0ce0: 6d 3d 27 62 72 61 69 64 27 22 20 28 30 29 2e 0a  m='braid'" (0)..
0cf0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
0d00: 74 20 32 2e 31 2e 31 2e 31 20 7b 0a 20 20 45 58  t 2.1.1.1 {.  EX
0d10: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0d20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0d30: 65 72 6d 73 20 57 48 45 52 45 20 74 65 72 6d 3d  erms WHERE term=
0d40: 27 62 72 61 69 64 27 0a 7d 20 7b 20 30 20 30 20  'braid'.} { 0 0 
0d50: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 65  0 {SCAN TABLE te
0d60: 72 6d 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c  rms VIRTUAL TABL
0d70: 45 20 49 4e 44 45 58 20 31 3a 20 28 7e 30 20 72  E INDEX 1: (~0 r
0d80: 6f 77 73 29 7d 20 7d 0a 64 6f 5f 65 78 65 63 73  ows)} }.do_execs
0d90: 71 6c 5f 74 65 73 74 20 32 2e 31 2e 31 2e 32 20  ql_test 2.1.1.2 
0da0: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
0db0: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20  Y PLAN SELECT * 
0dc0: 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45 52 45  FROM terms WHERE
0dd0: 20 2b 74 65 72 6d 3d 27 62 72 61 69 64 27 0a 7d   +term='braid'.}
0de0: 20 7b 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41   {0 0 0 {SCAN TA
0df0: 42 4c 45 20 74 65 72 6d 73 20 56 49 52 54 55 41  BLE terms VIRTUA
0e00: 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a  L TABLE INDEX 0:
0e10: 20 28 7e 30 20 72 6f 77 73 29 7d 7d 0a 0a 23 20   (~0 rows)}}..# 
0e20: 4e 6f 77 20 73 68 6f 77 20 74 68 61 74 20 75 73  Now show that us
0e30: 69 6e 67 20 22 74 65 72 6d 3d 27 62 72 61 69 64  ing "term='braid
0e40: 27 22 20 6d 65 61 6e 73 20 74 68 65 20 76 69 72  '" means the vir
0e50: 74 75 61 6c 20 74 61 62 6c 65 20 72 65 74 75 72  tual table retur
0e60: 6e 73 0a 23 20 6f 6e 6c 79 20 31 20 72 6f 77 20  ns.# only 1 row 
0e70: 74 6f 20 53 51 4c 69 74 65 2c 20 62 75 74 20 22  to SQLite, but "
0e80: 2b 74 65 72 6d 3d 27 62 72 61 69 64 27 22 20 6d  +term='braid'" m
0e90: 65 61 6e 73 20 61 6c 6c 20 31 39 20 61 72 65 20  eans all 19 are 
0ea0: 72 65 74 75 72 6e 65 64 2e 0a 23 0a 64 6f 5f 74  returned..#.do_t
0eb0: 65 73 74 20 32 2e 31 2e 32 2e 31 20 7b 0a 20 20  est 2.1.2.1 {.  
0ec0: 73 65 74 20 63 6e 74 20 30 0a 20 20 65 78 65 63  set cnt 0.  exec
0ed0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0ee0: 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57 48 45 52  ROM terms_v WHER
0ef0: 45 20 72 65 63 28 27 63 6e 74 27 2c 20 74 65 72  E rec('cnt', ter
0f00: 6d 29 20 41 4e 44 20 74 65 72 6d 3d 27 62 72 61  m) AND term='bra
0f10: 69 64 27 20 7d 0a 20 20 73 65 74 20 63 6e 74 0a  id' }.  set cnt.
0f20: 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 32 2e  } {2}.do_test 2.
0f30: 31 2e 32 2e 32 20 7b 0a 20 20 73 65 74 20 63 6e  1.2.2 {.  set cn
0f40: 74 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  t 0.  execsql { 
0f50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
0f60: 72 6d 73 5f 76 20 57 48 45 52 45 20 72 65 63 28  rms_v WHERE rec(
0f70: 27 63 6e 74 27 2c 20 74 65 72 6d 29 20 41 4e 44  'cnt', term) AND
0f80: 20 2b 74 65 72 6d 3d 27 62 72 61 69 64 27 20 7d   +term='braid' }
0f90: 0a 20 20 73 65 74 20 63 6e 74 0a 7d 20 7b 33 38  .  set cnt.} {38
0fa0: 7d 0a 0a 23 20 53 69 6d 69 6c 61 72 20 74 6f 20  }..# Similar to 
0fb0: 74 68 65 20 74 65 73 74 20 69 6d 6d 65 64 69 61  the test immedia
0fc0: 74 65 6c 79 20 61 62 6f 76 65 2c 20 62 75 74 20  tely above, but 
0fd0: 75 73 69 6e 67 20 61 20 74 65 72 6d 20 28 22 62  using a term ("b
0fe0: 72 65 61 6b 66 61 73 74 22 29 20 74 68 61 74 20  reakfast") that 
0ff0: 0a 23 20 69 73 20 6e 6f 74 20 66 65 61 74 75 72  .# is not featur
1000: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 73 65  ed in the datase
1010: 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 32 2e 31  t..#.do_test 2.1
1020: 2e 33 2e 31 20 7b 0a 20 20 73 65 74 20 63 6e 74  .3.1 {.  set cnt
1030: 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   0.  execsql { S
1040: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72  ELECT * FROM ter
1050: 6d 73 5f 76 20 57 48 45 52 45 20 72 65 63 28 27  ms_v WHERE rec('
1060: 63 6e 74 27 2c 20 74 65 72 6d 29 20 41 4e 44 20  cnt', term) AND 
1070: 74 65 72 6d 3d 27 62 72 65 61 6b 66 61 73 74 27  term='breakfast'
1080: 20 7d 0a 20 20 73 65 74 20 63 6e 74 0a 7d 20 7b   }.  set cnt.} {
1090: 30 7d 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 33  0}.do_test 2.1.3
10a0: 2e 32 20 7b 0a 20 20 73 65 74 20 63 6e 74 20 30  .2 {.  set cnt 0
10b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
10c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72 6d 73  ECT * FROM terms
10d0: 5f 76 20 57 48 45 52 45 20 72 65 63 28 27 63 6e  _v WHERE rec('cn
10e0: 74 27 2c 20 74 65 72 6d 29 20 41 4e 44 20 2b 74  t', term) AND +t
10f0: 65 72 6d 3d 27 62 72 65 61 6b 66 61 73 74 27 20  erm='breakfast' 
1100: 7d 0a 20 20 73 65 74 20 63 6e 74 0a 7d 20 7b 33  }.  set cnt.} {3
1110: 38 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  8}..do_execsql_t
1120: 65 73 74 20 32 2e 31 2e 34 2e 31 20 7b 20 53 45  est 2.1.4.1 { SE
1130: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72 6d  LECT * FROM term
1140: 73 5f 76 20 57 48 45 52 45 20 74 65 72 6d 3d 27  s_v WHERE term='
1150: 62 72 61 69 64 27 20 7d 20 7b 62 72 61 69 64 20  braid' } {braid 
1160: 31 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  1 1}.do_execsql_
1170: 74 65 73 74 20 32 2e 31 2e 34 2e 32 20 7b 20 53  test 2.1.4.2 { S
1180: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72  ELECT * FROM ter
1190: 6d 73 5f 76 20 57 48 45 52 45 20 2b 74 65 72 6d  ms_v WHERE +term
11a0: 3d 27 62 72 61 69 64 27 7d 20 7b 62 72 61 69 64  ='braid'} {braid
11b0: 20 31 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   1 1}.do_execsql
11c0: 5f 74 65 73 74 20 32 2e 31 2e 34 2e 33 20 7b 20  _test 2.1.4.3 { 
11d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
11e0: 72 6d 73 5f 76 20 57 48 45 52 45 20 74 65 72 6d  rms_v WHERE term
11f0: 3d 27 62 72 65 61 6b 66 61 73 74 27 20 20 7d 20  ='breakfast'  } 
1200: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
1210: 73 74 20 32 2e 31 2e 34 2e 34 20 7b 20 53 45 4c  st 2.1.4.4 { SEL
1220: 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72 6d 73  ECT * FROM terms
1230: 5f 76 20 57 48 45 52 45 20 2b 74 65 72 6d 3d 27  _v WHERE +term='
1240: 62 72 65 61 6b 66 61 73 74 27 20 7d 20 7b 7d 0a  breakfast' } {}.
1250: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1260: 20 32 2e 31 2e 34 2e 35 20 7b 20 53 45 4c 45 43   2.1.4.5 { SELEC
1270: 54 20 2a 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76  T * FROM terms_v
1280: 20 57 48 45 52 45 20 74 65 72 6d 3d 27 63 62 61   WHERE term='cba
1290: 27 20 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73  '  } {}.do_execs
12a0: 71 6c 5f 74 65 73 74 20 32 2e 31 2e 34 2e 36 20  ql_test 2.1.4.6 
12b0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
12c0: 74 65 72 6d 73 5f 76 20 57 48 45 52 45 20 2b 74  terms_v WHERE +t
12d0: 65 72 6d 3d 27 63 62 61 27 20 7d 20 7b 7d 0a 64  erm='cba' } {}.d
12e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
12f0: 2e 31 2e 34 2e 37 20 7b 20 53 45 4c 45 43 54 20  .1.4.7 { SELECT 
1300: 2a 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57  * FROM terms_v W
1310: 48 45 52 45 20 74 65 72 6d 3d 27 61 62 63 27 20  HERE term='abc' 
1320: 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   } {}.do_execsql
1330: 5f 74 65 73 74 20 32 2e 31 2e 34 2e 38 20 7b 20  _test 2.1.4.8 { 
1340: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
1350: 72 6d 73 5f 76 20 57 48 45 52 45 20 2b 74 65 72  rms_v WHERE +ter
1360: 6d 3d 27 61 62 63 27 20 7d 20 7b 7d 0a 0a 23 20  m='abc' } {}..# 
1370: 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 74 65  Special case: te
1380: 72 6d 3d 4e 55 4c 4c 0a 23 0a 64 6f 5f 65 78 65  rm=NULL.#.do_exe
1390: 63 73 71 6c 5f 74 65 73 74 20 32 2e 31 2e 35 20  csql_test 2.1.5 
13a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
13b0: 74 65 72 6d 73 20 57 48 45 52 45 20 74 65 72 6d  terms WHERE term
13c0: 3d 4e 55 4c 4c 20 7d 20 7b 7d 0a 0a 64 6f 5f 65  =NULL } {}..do_e
13d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e  xecsql_test 2.2.
13e0: 31 2e 31 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  1.1 {.  EXPLAIN 
13f0: 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
1400: 54 20 2a 20 46 52 4f 4d 20 74 65 72 6d 73 20 57  T * FROM terms W
1410: 48 45 52 45 20 74 65 72 6d 3e 27 62 72 61 69 6e  HERE term>'brain
1420: 27 0a 7d 20 7b 20 30 20 30 20 30 20 7b 53 43 41  '.} { 0 0 0 {SCA
1430: 4e 20 54 41 42 4c 45 20 74 65 72 6d 73 20 56 49  N TABLE terms VI
1440: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
1450: 58 20 32 3a 20 28 7e 30 20 72 6f 77 73 29 7d 20  X 2: (~0 rows)} 
1460: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1470: 74 20 32 2e 32 2e 31 2e 32 20 7b 0a 20 20 45 58  t 2.2.1.2 {.  EX
1480: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1490: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14a0: 65 72 6d 73 20 57 48 45 52 45 20 2b 74 65 72 6d  erms WHERE +term
14b0: 3e 27 62 72 61 69 6e 27 0a 7d 20 7b 20 30 20 30  >'brain'.} { 0 0
14c0: 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74   0 {SCAN TABLE t
14d0: 65 72 6d 73 20 56 49 52 54 55 41 4c 20 54 41 42  erms VIRTUAL TAB
14e0: 4c 45 20 49 4e 44 45 58 20 30 3a 20 28 7e 30 20  LE INDEX 0: (~0 
14f0: 72 6f 77 73 29 7d 20 7d 0a 0a 64 6f 5f 65 78 65  rows)} }..do_exe
1500: 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e 31 2e  csql_test 2.2.1.
1510: 33 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  3 {.  EXPLAIN QU
1520: 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20  ERY PLAN SELECT 
1530: 2a 20 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45  * FROM terms WHE
1540: 52 45 20 74 65 72 6d 3c 27 62 72 61 69 6e 27 0a  RE term<'brain'.
1550: 7d 20 7b 20 30 20 30 20 30 20 7b 53 43 41 4e 20  } { 0 0 0 {SCAN 
1560: 54 41 42 4c 45 20 74 65 72 6d 73 20 56 49 52 54  TABLE terms VIRT
1570: 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
1580: 34 3a 20 28 7e 30 20 72 6f 77 73 29 7d 20 7d 0a  4: (~0 rows)} }.
1590: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
15a0: 32 2e 32 2e 31 2e 34 20 7b 0a 20 20 45 58 50 4c  2.2.1.4 {.  EXPL
15b0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
15c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72  ELECT * FROM ter
15d0: 6d 73 20 57 48 45 52 45 20 2b 74 65 72 6d 3c 27  ms WHERE +term<'
15e0: 62 72 61 69 6e 27 0a 7d 20 7b 20 30 20 30 20 30  brain'.} { 0 0 0
15f0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 65 72   {SCAN TABLE ter
1600: 6d 73 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  ms VIRTUAL TABLE
1610: 20 49 4e 44 45 58 20 30 3a 20 28 7e 30 20 72 6f   INDEX 0: (~0 ro
1620: 77 73 29 7d 20 7d 0a 0a 64 6f 5f 65 78 65 63 73  ws)} }..do_execs
1630: 71 6c 5f 74 65 73 74 20 32 2e 32 2e 31 2e 35 20  ql_test 2.2.1.5 
1640: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
1650: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 2a 20  Y PLAN SELECT * 
1660: 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45 52 45  FROM terms WHERE
1670: 20 74 65 72 6d 20 42 45 54 57 45 45 4e 20 27 62   term BETWEEN 'b
1680: 72 61 67 73 27 20 41 4e 44 20 27 62 72 61 69 6e  rags' AND 'brain
1690: 27 0a 7d 20 7b 20 30 20 30 20 30 20 7b 53 43 41  '.} { 0 0 0 {SCA
16a0: 4e 20 54 41 42 4c 45 20 74 65 72 6d 73 20 56 49  N TABLE terms VI
16b0: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
16c0: 58 20 36 3a 20 28 7e 30 20 72 6f 77 73 29 7d 20  X 6: (~0 rows)} 
16d0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
16e0: 74 20 32 2e 32 2e 31 2e 36 20 7b 0a 20 20 45 58  t 2.2.1.6 {.  EX
16f0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
1700: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1710: 65 72 6d 73 20 57 48 45 52 45 20 2b 74 65 72 6d  erms WHERE +term
1720: 20 42 45 54 57 45 45 4e 20 27 62 72 61 67 73 27   BETWEEN 'brags'
1730: 20 41 4e 44 20 27 62 72 61 69 6e 27 0a 7d 20 7b   AND 'brain'.} {
1740: 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42   0 0 0 {SCAN TAB
1750: 4c 45 20 74 65 72 6d 73 20 56 49 52 54 55 41 4c  LE terms VIRTUAL
1760: 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 20   TABLE INDEX 0: 
1770: 28 7e 30 20 72 6f 77 73 29 7d 20 7d 0a 0a 64 6f  (~0 rows)} }..do
1780: 5f 74 65 73 74 20 32 2e 32 2e 32 2e 31 20 7b 0a  _test 2.2.2.1 {.
1790: 20 20 73 65 74 20 63 6e 74 20 30 0a 20 20 65 78    set cnt 0.  ex
17a0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
17b0: 20 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45 52   FROM terms WHER
17c0: 45 20 72 65 63 28 27 63 6e 74 27 2c 20 74 65 72  E rec('cnt', ter
17d0: 6d 29 20 41 4e 44 20 74 65 72 6d 3e 27 62 72 61  m) AND term>'bra
17e0: 69 6e 27 20 7d 0a 20 20 73 65 74 20 63 6e 74 0a  in' }.  set cnt.
17f0: 7d 20 7b 31 38 7d 0a 64 6f 5f 74 65 73 74 20 32  } {18}.do_test 2
1800: 2e 32 2e 32 2e 32 20 7b 0a 20 20 73 65 74 20 63  .2.2.2 {.  set c
1810: 6e 74 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b  nt 0.  execsql {
1820: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1830: 65 72 6d 73 20 57 48 45 52 45 20 72 65 63 28 27  erms WHERE rec('
1840: 63 6e 74 27 2c 20 74 65 72 6d 29 20 41 4e 44 20  cnt', term) AND 
1850: 2b 74 65 72 6d 3e 27 62 72 61 69 6e 27 20 7d 0a  +term>'brain' }.
1860: 20 20 73 65 74 20 63 6e 74 0a 7d 20 7b 33 38 7d    set cnt.} {38}
1870: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1880: 20 32 2e 32 2e 32 2e 33 20 7b 0a 20 20 53 45 4c   2.2.2.3 {.  SEL
1890: 45 43 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65  ECT term, docume
18a0: 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e 63 65 73  nts, occurrences
18b0: 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57 48   FROM terms_v WH
18c0: 45 52 45 20 74 65 72 6d 3e 27 62 72 61 69 6e 27  ERE term>'brain'
18d0: 0a 7d 20 7b 0a 20 20 62 72 61 69 6e 63 68 69 6c  .} {.  brainchil
18e0: 64 20 31 20 31 20 62 72 61 69 6e 65 64 20 31 20  d 1 1 brained 1 
18f0: 31 20 62 72 61 69 6e 69 6e 67 20 31 20 31 20 62  1 braining 1 1 b
1900: 72 61 69 6e 73 20 31 20 31 20 0a 20 20 62 72 61  rains 1 1 .  bra
1910: 69 6e 73 74 65 6d 20 31 20 31 20 62 72 61 69 6e  instem 1 1 brain
1920: 73 74 65 6d 73 20 31 20 31 20 62 72 61 69 6e 73  stems 1 1 brains
1930: 74 6f 72 6d 20 31 20 31 20 62 72 61 69 6e 73 74  torm 1 1 brainst
1940: 6f 72 6d 73 20 31 20 31 0a 7d 0a 64 6f 5f 65 78  orms 1 1.}.do_ex
1950: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e 32  ecsql_test 2.2.2
1960: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 65  .4 {.  SELECT te
1970: 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6f  rm, documents, o
1980: 63 63 75 72 72 65 6e 63 65 73 20 46 52 4f 4d 20  ccurrences FROM 
1990: 74 65 72 6d 73 5f 76 20 57 48 45 52 45 20 2b 74  terms_v WHERE +t
19a0: 65 72 6d 3e 27 62 72 61 69 6e 27 0a 7d 20 7b 0a  erm>'brain'.} {.
19b0: 20 20 62 72 61 69 6e 63 68 69 6c 64 20 31 20 31    brainchild 1 1
19c0: 20 62 72 61 69 6e 65 64 20 31 20 31 20 62 72 61   brained 1 1 bra
19d0: 69 6e 69 6e 67 20 31 20 31 20 62 72 61 69 6e 73  ining 1 1 brains
19e0: 20 31 20 31 20 0a 20 20 62 72 61 69 6e 73 74 65   1 1 .  brainste
19f0: 6d 20 31 20 31 20 62 72 61 69 6e 73 74 65 6d 73  m 1 1 brainstems
1a00: 20 31 20 31 20 62 72 61 69 6e 73 74 6f 72 6d 20   1 1 brainstorm 
1a10: 31 20 31 20 62 72 61 69 6e 73 74 6f 72 6d 73 20  1 1 brainstorms 
1a20: 31 20 31 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  1 1.}.do_execsql
1a30: 5f 74 65 73 74 20 32 2e 32 2e 32 2e 35 20 7b 0a  _test 2.2.2.5 {.
1a40: 20 20 53 45 4c 45 43 54 20 74 65 72 6d 2c 20 64    SELECT term, d
1a50: 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72  ocuments, occurr
1a60: 65 6e 63 65 73 20 46 52 4f 4d 20 74 65 72 6d 73  ences FROM terms
1a70: 5f 76 20 57 48 45 52 45 20 74 65 72 6d 3e 3d 27  _v WHERE term>='
1a80: 62 72 61 69 6e 27 0a 7d 20 7b 0a 20 20 62 72 61  brain'.} {.  bra
1a90: 69 6e 20 31 20 31 0a 20 20 62 72 61 69 6e 63 68  in 1 1.  brainch
1aa0: 69 6c 64 20 31 20 31 20 62 72 61 69 6e 65 64 20  ild 1 1 brained 
1ab0: 31 20 31 20 62 72 61 69 6e 69 6e 67 20 31 20 31  1 1 braining 1 1
1ac0: 20 62 72 61 69 6e 73 20 31 20 31 20 0a 20 20 62   brains 1 1 .  b
1ad0: 72 61 69 6e 73 74 65 6d 20 31 20 31 20 62 72 61  rainstem 1 1 bra
1ae0: 69 6e 73 74 65 6d 73 20 31 20 31 20 62 72 61 69  instems 1 1 brai
1af0: 6e 73 74 6f 72 6d 20 31 20 31 20 62 72 61 69 6e  nstorm 1 1 brain
1b00: 73 74 6f 72 6d 73 20 31 20 31 0a 7d 0a 64 6f 5f  storms 1 1.}.do_
1b10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
1b20: 2e 32 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.6 {.  SELECT 
1b30: 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73 2c  term, documents,
1b40: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52 4f   occurrences FRO
1b50: 4d 20 74 65 72 6d 73 5f 76 20 57 48 45 52 45 20  M terms_v WHERE 
1b60: 2b 74 65 72 6d 3e 3d 27 62 72 61 69 6e 27 0a 7d  +term>='brain'.}
1b70: 20 7b 0a 20 20 62 72 61 69 6e 20 31 20 31 0a 20   {.  brain 1 1. 
1b80: 20 62 72 61 69 6e 63 68 69 6c 64 20 31 20 31 20   brainchild 1 1 
1b90: 62 72 61 69 6e 65 64 20 31 20 31 20 62 72 61 69  brained 1 1 brai
1ba0: 6e 69 6e 67 20 31 20 31 20 62 72 61 69 6e 73 20  ning 1 1 brains 
1bb0: 31 20 31 20 0a 20 20 62 72 61 69 6e 73 74 65 6d  1 1 .  brainstem
1bc0: 20 31 20 31 20 62 72 61 69 6e 73 74 65 6d 73 20   1 1 brainstems 
1bd0: 31 20 31 20 62 72 61 69 6e 73 74 6f 72 6d 20 31  1 1 brainstorm 1
1be0: 20 31 20 62 72 61 69 6e 73 74 6f 72 6d 73 20 31   1 brainstorms 1
1bf0: 20 31 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   1.}..do_execsql
1c00: 5f 74 65 73 74 20 32 2e 32 2e 32 2e 37 20 7b 0a  _test 2.2.2.7 {.
1c10: 20 20 53 45 4c 45 43 54 20 74 65 72 6d 2c 20 64    SELECT term, d
1c20: 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72  ocuments, occurr
1c30: 65 6e 63 65 73 20 46 52 4f 4d 20 74 65 72 6d 73  ences FROM terms
1c40: 5f 76 20 57 48 45 52 45 20 74 65 72 6d 3e 3d 27  _v WHERE term>='
1c50: 61 62 63 27 0a 7d 20 7b 0a 20 20 62 72 61 65 73  abc'.} {.  braes
1c60: 20 31 20 31 20 62 72 61 67 20 31 20 31 20 62 72   1 1 brag 1 1 br
1c70: 61 67 67 65 64 20 31 20 31 20 62 72 61 67 67 65  agged 1 1 bragge
1c80: 72 20 31 20 31 20 0a 20 20 62 72 61 67 67 69 6e  r 1 1 .  braggin
1c90: 67 20 31 20 31 20 62 72 61 67 73 20 31 20 31 20  g 1 1 brags 1 1 
1ca0: 62 72 61 69 64 20 31 20 31 20 62 72 61 69 64 65  braid 1 1 braide
1cb0: 64 20 31 20 31 20 0a 20 20 62 72 61 69 64 69 6e  d 1 1 .  braidin
1cc0: 67 20 31 20 31 20 62 72 61 69 64 73 20 31 20 31  g 1 1 braids 1 1
1cd0: 20 62 72 61 69 6e 20 31 20 31 20 62 72 61 69 6e   brain 1 1 brain
1ce0: 63 68 69 6c 64 20 31 20 31 20 0a 20 20 62 72 61  child 1 1 .  bra
1cf0: 69 6e 65 64 20 31 20 31 20 62 72 61 69 6e 69 6e  ined 1 1 brainin
1d00: 67 20 31 20 31 20 62 72 61 69 6e 73 20 31 20 31  g 1 1 brains 1 1
1d10: 20 62 72 61 69 6e 73 74 65 6d 20 31 20 31 20 0a   brainstem 1 1 .
1d20: 20 20 62 72 61 69 6e 73 74 65 6d 73 20 31 20 31    brainstems 1 1
1d30: 20 62 72 61 69 6e 73 74 6f 72 6d 20 31 20 31 20   brainstorm 1 1 
1d40: 62 72 61 69 6e 73 74 6f 72 6d 73 20 31 20 31 0a  brainstorms 1 1.
1d50: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1d60: 74 20 32 2e 32 2e 32 2e 38 20 7b 0a 20 20 53 45  t 2.2.2.8 {.  SE
1d70: 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d  LECT term, docum
1d80: 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e 63 65  ents, occurrence
1d90: 73 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57  s FROM terms_v W
1da0: 48 45 52 45 20 2b 74 65 72 6d 3e 3d 27 61 62 63  HERE +term>='abc
1db0: 27 0a 7d 20 7b 0a 20 20 62 72 61 65 73 20 31 20  '.} {.  braes 1 
1dc0: 31 20 62 72 61 67 20 31 20 31 20 62 72 61 67 67  1 brag 1 1 bragg
1dd0: 65 64 20 31 20 31 20 62 72 61 67 67 65 72 20 31  ed 1 1 bragger 1
1de0: 20 31 20 0a 20 20 62 72 61 67 67 69 6e 67 20 31   1 .  bragging 1
1df0: 20 31 20 62 72 61 67 73 20 31 20 31 20 62 72 61   1 brags 1 1 bra
1e00: 69 64 20 31 20 31 20 62 72 61 69 64 65 64 20 31  id 1 1 braided 1
1e10: 20 31 20 0a 20 20 62 72 61 69 64 69 6e 67 20 31   1 .  braiding 1
1e20: 20 31 20 62 72 61 69 64 73 20 31 20 31 20 62 72   1 braids 1 1 br
1e30: 61 69 6e 20 31 20 31 20 62 72 61 69 6e 63 68 69  ain 1 1 brainchi
1e40: 6c 64 20 31 20 31 20 0a 20 20 62 72 61 69 6e 65  ld 1 1 .  braine
1e50: 64 20 31 20 31 20 62 72 61 69 6e 69 6e 67 20 31  d 1 1 braining 1
1e60: 20 31 20 62 72 61 69 6e 73 20 31 20 31 20 62 72   1 brains 1 1 br
1e70: 61 69 6e 73 74 65 6d 20 31 20 31 20 0a 20 20 62  ainstem 1 1 .  b
1e80: 72 61 69 6e 73 74 65 6d 73 20 31 20 31 20 62 72  rainstems 1 1 br
1e90: 61 69 6e 73 74 6f 72 6d 20 31 20 31 20 62 72 61  ainstorm 1 1 bra
1ea0: 69 6e 73 74 6f 72 6d 73 20 31 20 31 0a 7d 0a 0a  instorms 1 1.}..
1eb0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1ec0: 32 2e 32 2e 32 2e 39 20 7b 0a 20 20 53 45 4c 45  2.2.2.9 {.  SELE
1ed0: 43 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e  CT term, documen
1ee0: 74 73 2c 20 6f 63 63 75 72 72 65 6e 63 65 73 20  ts, occurrences 
1ef0: 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57 48 45  FROM terms_v WHE
1f00: 52 45 20 74 65 72 6d 3e 3d 27 62 72 61 69 6e 73  RE term>='brains
1f10: 74 6f 72 6d 73 27 0a 7d 20 7b 62 72 61 69 6e 73  torms'.} {brains
1f20: 74 6f 72 6d 73 20 31 20 31 7d 0a 64 6f 5f 65 78  torms 1 1}.do_ex
1f30: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e 32  ecsql_test 2.2.2
1f40: 2e 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 74  .10 {.  SELECT t
1f50: 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73 2c 20  erm, documents, 
1f60: 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52 4f 4d  occurrences FROM
1f70: 20 74 65 72 6d 73 5f 76 20 57 48 45 52 45 20 74   terms_v WHERE t
1f80: 65 72 6d 3e 3d 27 62 72 61 69 6e 73 74 6f 72 6d  erm>='brainstorm
1f90: 73 27 0a 7d 20 7b 62 72 61 69 6e 73 74 6f 72 6d  s'.} {brainstorm
1fa0: 73 20 31 20 31 7d 0a 64 6f 5f 65 78 65 63 73 71  s 1 1}.do_execsq
1fb0: 6c 5f 74 65 73 74 20 32 2e 32 2e 32 2e 31 31 20  l_test 2.2.2.11 
1fc0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
1fd0: 74 65 72 6d 73 5f 76 20 57 48 45 52 45 20 74 65  terms_v WHERE te
1fe0: 72 6d 3e 27 62 72 61 69 6e 73 74 6f 72 6d 73 27  rm>'brainstorms'
1ff0: 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   } {}.do_execsql
2000: 5f 74 65 73 74 20 32 2e 32 2e 32 2e 31 32 20 7b  _test 2.2.2.12 {
2010: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2020: 65 72 6d 73 5f 76 20 57 48 45 52 45 20 74 65 72  erms_v WHERE ter
2030: 6d 3e 27 62 72 61 69 6e 73 74 6f 72 6d 73 27 20  m>'brainstorms' 
2040: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
2050: 5f 74 65 73 74 20 32 2e 32 2e 32 2e 31 33 20 7b  _test 2.2.2.13 {
2060: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2070: 65 72 6d 73 5f 76 20 57 48 45 52 45 20 74 65 72  erms_v WHERE ter
2080: 6d 3e 27 63 62 61 27 20 7d 20 7b 7d 0a 64 6f 5f  m>'cba' } {}.do_
2090: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
20a0: 2e 32 2e 31 34 20 7b 20 53 45 4c 45 43 54 20 2a  .2.14 { SELECT *
20b0: 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57 48   FROM terms_v WH
20c0: 45 52 45 20 74 65 72 6d 3e 27 63 62 61 27 20 7d  ERE term>'cba' }
20d0: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 32   {}..do_test 2.2
20e0: 2e 33 2e 31 20 7b 0a 20 20 73 65 74 20 63 6e 74  .3.1 {.  set cnt
20f0: 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   0.  execsql { S
2100: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 72  ELECT * FROM ter
2110: 6d 73 20 57 48 45 52 45 20 72 65 63 28 27 63 6e  ms WHERE rec('cn
2120: 74 27 2c 20 74 65 72 6d 29 20 41 4e 44 20 74 65  t', term) AND te
2130: 72 6d 3c 27 62 72 61 69 6e 27 20 7d 0a 20 20 73  rm<'brain' }.  s
2140: 65 74 20 63 6e 74 0a 7d 20 7b 32 32 7d 0a 64 6f  et cnt.} {22}.do
2150: 5f 74 65 73 74 20 32 2e 32 2e 33 2e 32 20 7b 0a  _test 2.2.3.2 {.
2160: 20 20 73 65 74 20 63 6e 74 20 30 0a 20 20 65 78    set cnt 0.  ex
2170: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
2180: 20 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45 52   FROM terms WHER
2190: 45 20 72 65 63 28 27 63 6e 74 27 2c 20 74 65 72  E rec('cnt', ter
21a0: 6d 29 20 41 4e 44 20 2b 74 65 72 6d 3c 27 62 72  m) AND +term<'br
21b0: 61 69 6e 27 20 7d 0a 20 20 73 65 74 20 63 6e 74  ain' }.  set cnt
21c0: 0a 7d 20 7b 33 38 7d 0a 64 6f 5f 65 78 65 63 73  .} {38}.do_execs
21d0: 71 6c 5f 74 65 73 74 20 32 2e 32 2e 33 2e 33 20  ql_test 2.2.3.3 
21e0: 7b 0a 20 20 53 45 4c 45 43 54 20 74 65 72 6d 2c  {.  SELECT term,
21f0: 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75   documents, occu
2200: 72 72 65 6e 63 65 73 20 46 52 4f 4d 20 74 65 72  rrences FROM ter
2210: 6d 73 5f 76 20 57 48 45 52 45 20 74 65 72 6d 3c  ms_v WHERE term<
2220: 27 62 72 61 69 6e 27 0a 7d 20 7b 0a 20 20 62 72  'brain'.} {.  br
2230: 61 65 73 20 31 20 31 20 62 72 61 67 20 31 20 31  aes 1 1 brag 1 1
2240: 20 62 72 61 67 67 65 64 20 31 20 31 20 62 72 61   bragged 1 1 bra
2250: 67 67 65 72 20 31 20 31 20 62 72 61 67 67 69 6e  gger 1 1 braggin
2260: 67 20 31 20 31 20 0a 20 20 62 72 61 67 73 20 31  g 1 1 .  brags 1
2270: 20 31 20 62 72 61 69 64 20 31 20 31 20 62 72 61   1 braid 1 1 bra
2280: 69 64 65 64 20 31 20 31 20 62 72 61 69 64 69 6e  ided 1 1 braidin
2290: 67 20 31 20 31 20 62 72 61 69 64 73 20 31 20 31  g 1 1 braids 1 1
22a0: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
22b0: 73 74 20 32 2e 32 2e 33 2e 34 20 7b 0a 20 20 53  st 2.2.3.4 {.  S
22c0: 45 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f 63 75  ELECT term, docu
22d0: 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e 63  ments, occurrenc
22e0: 65 73 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20  es FROM terms_v 
22f0: 57 48 45 52 45 20 2b 74 65 72 6d 3c 27 62 72 61  WHERE +term<'bra
2300: 69 6e 27 0a 7d 20 7b 0a 20 20 62 72 61 65 73 20  in'.} {.  braes 
2310: 31 20 31 20 62 72 61 67 20 31 20 31 20 62 72 61  1 1 brag 1 1 bra
2320: 67 67 65 64 20 31 20 31 20 62 72 61 67 67 65 72  gged 1 1 bragger
2330: 20 31 20 31 20 62 72 61 67 67 69 6e 67 20 31 20   1 1 bragging 1 
2340: 31 20 0a 20 20 62 72 61 67 73 20 31 20 31 20 62  1 .  brags 1 1 b
2350: 72 61 69 64 20 31 20 31 20 62 72 61 69 64 65 64  raid 1 1 braided
2360: 20 31 20 31 20 62 72 61 69 64 69 6e 67 20 31 20   1 1 braiding 1 
2370: 31 20 62 72 61 69 64 73 20 31 20 31 0a 7d 0a 64  1 braids 1 1.}.d
2380: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
2390: 2e 32 2e 33 2e 35 20 7b 0a 20 20 53 45 4c 45 43  .2.3.5 {.  SELEC
23a0: 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74  T term, document
23b0: 73 2c 20 6f 63 63 75 72 72 65 6e 63 65 73 20 46  s, occurrences F
23c0: 52 4f 4d 20 74 65 72 6d 73 5f 76 20 57 48 45 52  ROM terms_v WHER
23d0: 45 20 74 65 72 6d 3c 3d 27 62 72 61 69 6e 27 0a  E term<='brain'.
23e0: 7d 20 7b 0a 20 20 62 72 61 65 73 20 31 20 31 20  } {.  braes 1 1 
23f0: 62 72 61 67 20 31 20 31 20 62 72 61 67 67 65 64  brag 1 1 bragged
2400: 20 31 20 31 20 62 72 61 67 67 65 72 20 31 20 31   1 1 bragger 1 1
2410: 20 62 72 61 67 67 69 6e 67 20 31 20 31 20 0a 20   bragging 1 1 . 
2420: 20 62 72 61 67 73 20 31 20 31 20 62 72 61 69 64   brags 1 1 braid
2430: 20 31 20 31 20 62 72 61 69 64 65 64 20 31 20 31   1 1 braided 1 1
2440: 20 62 72 61 69 64 69 6e 67 20 31 20 31 20 62 72   braiding 1 1 br
2450: 61 69 64 73 20 31 20 31 0a 20 20 62 72 61 69 6e  aids 1 1.  brain
2460: 20 31 20 31 0a 7d 0a 64 6f 5f 65 78 65 63 73 71   1 1.}.do_execsq
2470: 6c 5f 74 65 73 74 20 32 2e 32 2e 33 2e 36 20 7b  l_test 2.2.3.6 {
2480: 0a 20 20 53 45 4c 45 43 54 20 74 65 72 6d 2c 20  .  SELECT term, 
2490: 64 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72  documents, occur
24a0: 72 65 6e 63 65 73 20 46 52 4f 4d 20 74 65 72 6d  rences FROM term
24b0: 73 5f 76 20 57 48 45 52 45 20 2b 74 65 72 6d 3c  s_v WHERE +term<
24c0: 3d 27 62 72 61 69 6e 27 0a 7d 20 7b 0a 20 20 62  ='brain'.} {.  b
24d0: 72 61 65 73 20 31 20 31 20 62 72 61 67 20 31 20  raes 1 1 brag 1 
24e0: 31 20 62 72 61 67 67 65 64 20 31 20 31 20 62 72  1 bragged 1 1 br
24f0: 61 67 67 65 72 20 31 20 31 20 62 72 61 67 67 69  agger 1 1 braggi
2500: 6e 67 20 31 20 31 20 0a 20 20 62 72 61 67 73 20  ng 1 1 .  brags 
2510: 31 20 31 20 62 72 61 69 64 20 31 20 31 20 62 72  1 1 braid 1 1 br
2520: 61 69 64 65 64 20 31 20 31 20 62 72 61 69 64 69  aided 1 1 braidi
2530: 6e 67 20 31 20 31 20 62 72 61 69 64 73 20 31 20  ng 1 1 braids 1 
2540: 31 0a 20 20 62 72 61 69 6e 20 31 20 31 0a 7d 0a  1.  brain 1 1.}.
2550: 0a 64 6f 5f 74 65 73 74 20 32 2e 32 2e 34 2e 31  .do_test 2.2.4.1
2560: 20 7b 0a 20 20 73 65 74 20 63 6e 74 20 30 0a 20   {.  set cnt 0. 
2570: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
2580: 53 45 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f 63  SELECT term, doc
2590: 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e  uments, occurren
25a0: 63 65 73 20 46 52 4f 4d 20 74 65 72 6d 73 20 0a  ces FROM terms .
25b0: 20 20 20 20 57 48 45 52 45 20 72 65 63 28 27 63      WHERE rec('c
25c0: 6e 74 27 2c 20 74 65 72 6d 29 20 41 4e 44 20 74  nt', term) AND t
25d0: 65 72 6d 20 42 45 54 57 45 45 4e 20 27 62 72 61  erm BETWEEN 'bra
25e0: 67 73 27 20 41 4e 44 20 27 62 72 61 69 6e 27 20  gs' AND 'brain' 
25f0: 0a 20 20 7d 0a 20 20 73 65 74 20 63 6e 74 0a 7d  .  }.  set cnt.}
2600: 20 7b 31 32 7d 0a 64 6f 5f 74 65 73 74 20 32 2e   {12}.do_test 2.
2610: 32 2e 34 2e 32 20 7b 0a 20 20 73 65 74 20 63 6e  2.4.2 {.  set cn
2620: 74 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  t 0.  execsql { 
2630: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 65 72 6d  .    SELECT term
2640: 2c 20 64 6f 63 75 6d 65 6e 74 73 2c 20 6f 63 63  , documents, occ
2650: 75 72 72 65 6e 63 65 73 20 46 52 4f 4d 20 74 65  urrences FROM te
2660: 72 6d 73 20 0a 20 20 20 20 57 48 45 52 45 20 72  rms .    WHERE r
2670: 65 63 28 27 63 6e 74 27 2c 20 74 65 72 6d 29 20  ec('cnt', term) 
2680: 41 4e 44 20 2b 74 65 72 6d 20 42 45 54 57 45 45  AND +term BETWEE
2690: 4e 20 27 62 72 61 67 73 27 20 41 4e 44 20 27 62  N 'brags' AND 'b
26a0: 72 61 69 6e 27 20 0a 20 20 7d 0a 20 20 73 65 74  rain' .  }.  set
26b0: 20 63 6e 74 0a 7d 20 7b 33 38 7d 0a 64 6f 5f 65   cnt.} {38}.do_e
26c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e  xecsql_test 2.2.
26d0: 34 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 74  4.3 {.  SELECT t
26e0: 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73 2c 20  erm, documents, 
26f0: 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52 4f 4d  occurrences FROM
2700: 20 74 65 72 6d 73 5f 76 20 0a 20 20 57 48 45 52   terms_v .  WHER
2710: 45 20 72 65 63 28 27 63 6e 74 27 2c 20 74 65 72  E rec('cnt', ter
2720: 6d 29 20 41 4e 44 20 74 65 72 6d 20 42 45 54 57  m) AND term BETW
2730: 45 45 4e 20 27 62 72 61 67 73 27 20 41 4e 44 20  EEN 'brags' AND 
2740: 27 62 72 61 69 6e 27 20 0a 7d 20 7b 0a 20 20 62  'brain' .} {.  b
2750: 72 61 67 73 20 31 20 31 20 62 72 61 69 64 20 31  rags 1 1 braid 1
2760: 20 31 20 62 72 61 69 64 65 64 20 31 20 31 20 62   1 braided 1 1 b
2770: 72 61 69 64 69 6e 67 20 31 20 31 20 62 72 61 69  raiding 1 1 brai
2780: 64 73 20 31 20 31 20 62 72 61 69 6e 20 31 20 31  ds 1 1 brain 1 1
2790: 20 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   .}.do_execsql_t
27a0: 65 73 74 20 32 2e 32 2e 34 2e 34 20 7b 0a 20 20  est 2.2.4.4 {.  
27b0: 53 45 4c 45 43 54 20 74 65 72 6d 2c 20 64 6f 63  SELECT term, doc
27c0: 75 6d 65 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e  uments, occurren
27d0: 63 65 73 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76  ces FROM terms_v
27e0: 20 0a 20 20 57 48 45 52 45 20 72 65 63 28 27 63   .  WHERE rec('c
27f0: 6e 74 27 2c 20 74 65 72 6d 29 20 41 4e 44 20 2b  nt', term) AND +
2800: 74 65 72 6d 20 42 45 54 57 45 45 4e 20 27 62 72  term BETWEEN 'br
2810: 61 67 73 27 20 41 4e 44 20 27 62 72 61 69 6e 27  ags' AND 'brain'
2820: 20 0a 7d 20 7b 0a 20 20 62 72 61 67 73 20 31 20   .} {.  brags 1 
2830: 31 20 62 72 61 69 64 20 31 20 31 20 62 72 61 69  1 braid 1 1 brai
2840: 64 65 64 20 31 20 31 20 62 72 61 69 64 69 6e 67  ded 1 1 braiding
2850: 20 31 20 31 20 62 72 61 69 64 73 20 31 20 31 20   1 1 braids 1 1 
2860: 62 72 61 69 6e 20 31 20 31 20 0a 7d 0a 64 6f 5f  brain 1 1 .}.do_
2870: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
2880: 2e 34 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.5 {.  SELECT 
2890: 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74 73 2c  term, documents,
28a0: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 46 52 4f   occurrences FRO
28b0: 4d 20 74 65 72 6d 73 5f 76 20 0a 20 20 57 48 45  M terms_v .  WHE
28c0: 52 45 20 72 65 63 28 27 63 6e 74 27 2c 20 74 65  RE rec('cnt', te
28d0: 72 6d 29 20 41 4e 44 20 74 65 72 6d 20 3e 20 27  rm) AND term > '
28e0: 62 72 61 67 73 27 20 41 4e 44 20 74 65 72 6d 20  brags' AND term 
28f0: 3c 20 27 62 72 61 69 6e 27 20 0a 7d 20 7b 0a 20  < 'brain' .} {. 
2900: 20 62 72 61 69 64 20 31 20 31 20 62 72 61 69 64   braid 1 1 braid
2910: 65 64 20 31 20 31 20 62 72 61 69 64 69 6e 67 20  ed 1 1 braiding 
2920: 31 20 31 20 62 72 61 69 64 73 20 31 20 31 0a 7d  1 1 braids 1 1.}
2930: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2940: 20 32 2e 32 2e 34 2e 36 20 7b 0a 20 20 53 45 4c   2.2.4.6 {.  SEL
2950: 45 43 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65  ECT term, docume
2960: 6e 74 73 2c 20 6f 63 63 75 72 72 65 6e 63 65 73  nts, occurrences
2970: 20 46 52 4f 4d 20 74 65 72 6d 73 5f 76 20 0a 20   FROM terms_v . 
2980: 20 57 48 45 52 45 20 72 65 63 28 27 63 6e 74 27   WHERE rec('cnt'
2990: 2c 20 74 65 72 6d 29 20 41 4e 44 20 2b 74 65 72  , term) AND +ter
29a0: 6d 20 3e 20 27 62 72 61 67 73 27 20 41 4e 44 20  m > 'brags' AND 
29b0: 2b 74 65 72 6d 20 3c 20 27 62 72 61 69 6e 27 20  +term < 'brain' 
29c0: 0a 7d 20 7b 0a 20 20 62 72 61 69 64 20 31 20 31  .} {.  braid 1 1
29d0: 20 62 72 61 69 64 65 64 20 31 20 31 20 62 72 61   braided 1 1 bra
29e0: 69 64 69 6e 67 20 31 20 31 20 62 72 61 69 64 73  iding 1 1 braids
29f0: 20 31 20 31 0a 7d 0a 0a 23 20 43 68 65 63 6b 20   1 1.}..# Check 
2a00: 74 68 61 74 20 22 4f 52 44 45 52 20 42 59 20 74  that "ORDER BY t
2a10: 65 72 6d 20 41 53 43 22 20 61 6e 64 20 65 71 75  erm ASC" and equ
2a20: 69 76 61 6c 65 6e 74 73 20 61 72 65 20 73 6f 72  ivalents are sor
2a30: 74 65 64 20 62 79 20 74 68 65 0a 23 20 76 69 72  ted by the.# vir
2a40: 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65  tual table imple
2a50: 6d 65 6e 74 61 74 69 6f 6e 2e 20 41 6e 79 20 6f  mentation. Any o
2a60: 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 63 6c  ther ORDER BY cl
2a70: 61 75 73 65 20 72 65 71 75 69 72 65 73 0a 23 20  ause requires.# 
2a80: 53 51 4c 69 74 65 20 74 6f 20 73 6f 72 74 20 72  SQLite to sort r
2a90: 65 73 75 6c 74 73 20 75 73 69 6e 67 20 61 20 74  esults using a t
2aa0: 65 6d 70 6f 72 61 72 79 20 62 2d 74 72 65 65 2e  emporary b-tree.
2ab0: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  .#.foreach {tn s
2ac0: 6f 72 74 20 6f 72 64 65 72 62 79 7d 20 7b 0a 20  ort orderby} {. 
2ad0: 20 31 20 20 20 20 30 20 20 20 20 22 4f 52 44 45   1    0    "ORDE
2ae0: 52 20 42 59 20 74 65 72 6d 20 41 53 43 22 0a 20  R BY term ASC". 
2af0: 20 32 20 20 20 20 30 20 20 20 20 22 4f 52 44 45   2    0    "ORDE
2b00: 52 20 42 59 20 74 65 72 6d 22 0a 20 20 33 20 20  R BY term".  3  
2b10: 20 20 31 20 20 20 20 22 4f 52 44 45 52 20 42 59    1    "ORDER BY
2b20: 20 74 65 72 6d 20 44 45 53 43 22 0a 20 20 34 20   term DESC".  4 
2b30: 20 20 20 31 20 20 20 20 22 4f 52 44 45 52 20 42     1    "ORDER B
2b40: 59 20 64 6f 63 75 6d 65 6e 74 73 20 41 53 43 22  Y documents ASC"
2b50: 0a 20 20 35 20 20 20 20 31 20 20 20 20 22 4f 52  .  5    1    "OR
2b60: 44 45 52 20 42 59 20 64 6f 63 75 6d 65 6e 74 73  DER BY documents
2b70: 22 0a 20 20 36 20 20 20 20 31 20 20 20 20 22 4f  ".  6    1    "O
2b80: 52 44 45 52 20 42 59 20 64 6f 63 75 6d 65 6e 74  RDER BY document
2b90: 73 20 44 45 53 43 22 0a 20 20 37 20 20 20 20 31  s DESC".  7    1
2ba0: 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 6f 63      "ORDER BY oc
2bb0: 63 75 72 72 65 6e 63 65 73 20 41 53 43 22 0a 20  currences ASC". 
2bc0: 20 38 20 20 20 20 31 20 20 20 20 22 4f 52 44 45   8    1    "ORDE
2bd0: 52 20 42 59 20 6f 63 63 75 72 72 65 6e 63 65 73  R BY occurrences
2be0: 22 0a 20 20 39 20 20 20 20 31 20 20 20 20 22 4f  ".  9    1    "O
2bf0: 52 44 45 52 20 42 59 20 6f 63 63 75 72 72 65 6e  RDER BY occurren
2c00: 63 65 73 20 44 45 53 43 22 0a 7d 20 7b 0a 0a 20  ces DESC".} {.. 
2c10: 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 20 30   set res [list 0
2c20: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
2c30: 20 74 65 72 6d 73 20 56 49 52 54 55 41 4c 20 54   terms VIRTUAL T
2c40: 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 20 28 7e  ABLE INDEX 0: (~
2c50: 30 20 72 6f 77 73 29 7d 5d 0a 20 20 69 66 20 7b  0 rows)}].  if {
2c60: 24 73 6f 72 74 7d 20 7b 20 6c 61 70 70 65 6e 64  $sort} { lappend
2c70: 20 72 65 73 20 30 20 30 20 30 20 7b 55 53 45 20   res 0 0 0 {USE 
2c80: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
2c90: 4f 52 44 45 52 20 42 59 7d 20 7d 0a 0a 20 20 73  ORDER BY} }..  s
2ca0: 65 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 2a  et sql "SELECT *
2cb0: 20 46 52 4f 4d 20 74 65 72 6d 73 20 24 6f 72 64   FROM terms $ord
2cc0: 65 72 62 79 22 0a 20 20 64 6f 5f 65 78 65 63 73  erby".  do_execs
2cd0: 71 6c 5f 74 65 73 74 20 32 2e 33 2e 31 2e 24 74  ql_test 2.3.1.$t
2ce0: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
2cf0: 20 50 4c 41 4e 20 24 73 71 6c 22 20 24 72 65 73   PLAN $sql" $res
2d00: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2d50: 20 54 68 65 20 6e 65 78 74 20 73 65 74 20 6f 66   The next set of
2d60: 20 74 65 73 74 73 2c 20 66 74 73 33 61 75 78 31   tests, fts3aux1
2d70: 2d 33 2e 2a 2c 20 74 65 73 74 20 65 72 72 6f 72  -3.*, test error
2d80: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 6e 20 74   conditions in t
2d90: 68 65 20 0a 23 20 66 74 73 34 61 75 78 20 6d 6f  he .# fts4aux mo
2da0: 64 75 6c 65 2e 20 45 78 63 65 70 74 2c 20 66 61  dule. Except, fa
2db0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 74 65  ult injection te
2dc0: 73 74 69 6e 67 20 28 4f 4f 4d 2c 20 49 4f 20 65  sting (OOM, IO e
2dd0: 72 72 6f 72 20 65 74 63 2e 29 20 69 73 20 0a 23  rror etc.) is .#
2de0: 20 64 6f 6e 65 20 69 6e 20 66 74 73 33 66 61 75   done in fts3fau
2df0: 6c 74 32 2e 74 65 73 74 0a 23 0a 0a 64 6f 5f 65  lt2.test.#..do_e
2e00: 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 31 2e  xecsql_test 3.1.
2e10: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  1 {.  CREATE VIR
2e20: 54 55 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53  TUAL TABLE t2 US
2e30: 49 4e 47 20 66 74 73 34 3b 0a 7d 0a 0a 64 6f 5f  ING fts4;.}..do_
2e40: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e  catchsql_test 3.
2e50: 31 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20 56  1.2 {.  CREATE V
2e60: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 72  IRTUAL TABLE ter
2e70: 6d 73 32 20 55 53 49 4e 47 20 66 74 73 34 61 75  ms2 USING fts4au
2e80: 78 3b 0a 7d 20 7b 31 20 7b 77 72 6f 6e 67 20 6e  x;.} {1 {wrong n
2e90: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2ea0: 74 73 20 74 6f 20 66 74 73 34 61 75 78 20 63 6f  ts to fts4aux co
2eb0: 6e 73 74 72 75 63 74 6f 72 7d 7d 0a 64 6f 5f 63  nstructor}}.do_c
2ec0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 31  atchsql_test 3.1
2ed0: 2e 33 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .3 {.  CREATE VI
2ee0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 72 6d  RTUAL TABLE term
2ef0: 73 32 20 55 53 49 4e 47 20 66 74 73 34 61 75 78  s2 USING fts4aux
2f00: 28 74 32 2c 20 74 32 29 3b 0a 7d 20 7b 31 20 7b  (t2, t2);.} {1 {
2f10: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
2f20: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 74 73  arguments to fts
2f30: 34 61 75 78 20 63 6f 6e 73 74 72 75 63 74 6f 72  4aux constructor
2f40: 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }}..do_execsql_t
2f50: 65 73 74 20 33 2e 32 2e 31 20 7b 0a 20 20 43 52  est 3.2.1 {.  CR
2f60: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
2f70: 4c 45 20 74 65 72 6d 73 33 20 55 53 49 4e 47 20  LE terms3 USING 
2f80: 66 74 73 34 61 75 78 28 64 6f 65 73 5f 6e 6f 74  fts4aux(does_not
2f90: 5f 65 78 69 73 74 29 0a 7d 0a 64 6f 5f 63 61 74  _exist).}.do_cat
2fa0: 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 32 2e 32  chsql_test 3.2.2
2fb0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
2fc0: 4f 4d 20 74 65 72 6d 73 33 0a 7d 20 7b 31 20 7b  OM terms3.} {1 {
2fd0: 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20  SQL logic error 
2fe0: 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62  or missing datab
2ff0: 61 73 65 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ase}}.do_catchsq
3000: 6c 5f 74 65 73 74 20 33 2e 32 2e 33 20 7b 0a 20  l_test 3.2.3 {. 
3010: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3020: 65 72 6d 73 33 20 57 48 45 52 45 20 74 65 72 6d  erms3 WHERE term
3030: 20 3d 20 27 61 62 63 27 0a 7d 20 7b 31 20 7b 53   = 'abc'.} {1 {S
3040: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
3050: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
3060: 73 65 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71  se}}..do_catchsq
3070: 6c 5f 74 65 73 74 20 33 2e 33 2e 31 20 7b 0a 20  l_test 3.3.1 {. 
3080: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 72   INSERT INTO ter
3090: 6d 73 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29  ms VALUES(1,2,3)
30a0: 3b 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74 65  ;.} {1 {table te
30b0: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 6d  rms may not be m
30c0: 6f 64 69 66 69 65 64 7d 7d 0a 64 6f 5f 63 61 74  odified}}.do_cat
30d0: 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 33 2e 32  chsql_test 3.3.2
30e0: 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d   {.  DELETE FROM
30f0: 20 74 65 72 6d 73 0a 7d 20 7b 31 20 7b 74 61 62   terms.} {1 {tab
3100: 6c 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74  le terms may not
3110: 20 62 65 20 6d 6f 64 69 66 69 65 64 7d 7d 0a 64   be modified}}.d
3120: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
3130: 33 2e 33 2e 33 20 7b 0a 20 20 55 50 44 41 54 45  3.3.3 {.  UPDATE
3140: 20 74 65 72 6d 73 20 73 65 74 20 64 6f 63 75 6d   terms set docum
3150: 65 6e 74 73 20 3d 20 64 6f 63 75 6d 65 6e 74 73  ents = documents
3160: 2b 31 3b 0a 7d 20 7b 31 20 7b 74 61 62 6c 65 20  +1;.} {1 {table 
3170: 74 65 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65  terms may not be
3180: 20 6d 6f 64 69 66 69 65 64 7d 7d 0a 0a 0a 23 2d   modified}}...#-
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
31e0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
31f0: 20 66 74 73 34 61 75 78 2d 34 2e 2a 20 2d 20 74   fts4aux-4.* - t
3200: 65 73 74 20 74 68 61 74 20 6a 6f 69 6e 73 20 77  est that joins w
3210: 6f 72 6b 20 77 69 74 68 20 66 74 73 34 61 75 78  ork with fts4aux
3220: 0a 23 20 74 61 62 6c 65 73 2e 20 41 6e 64 20 74  .# tables. And t
3230: 68 61 74 20 66 74 73 34 61 75 78 20 70 72 6f 76  hat fts4aux prov
3240: 69 64 65 73 20 72 65 61 73 6f 6e 61 62 6c 79 20  ides reasonably 
3250: 73 61 6e 65 20 63 6f 73 74 20 69 6e 66 6f 72 6d  sane cost inform
3260: 61 74 69 6f 6e 20 76 69 61 0a 23 20 78 42 65 73  ation via.# xBes
3270: 74 49 6e 64 65 78 20 74 6f 20 74 68 65 20 71 75  tIndex to the qu
3280: 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 23 0a 64  ery planner..#.d
3290: 62 20 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c  b close.forcedel
32a0: 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69  ete test.db.sqli
32b0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
32c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
32d0: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49  .1 {.  CREATE VI
32e0: 52 54 55 41 4c 20 54 41 42 4c 45 20 78 31 20 55  RTUAL TABLE x1 U
32f0: 53 49 4e 47 20 66 74 73 34 28 78 29 3b 0a 20 20  SING fts4(x);.  
3300: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
3310: 41 42 4c 45 20 74 65 72 6d 73 20 55 53 49 4e 47  ABLE terms USING
3320: 20 66 74 73 34 61 75 78 28 78 31 29 3b 0a 20 20   fts4aux(x1);.  
3330: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 32 28  CREATE TABLE x2(
3340: 79 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  y);.  CREATE TAB
3350: 4c 45 20 78 33 28 79 29 3b 0a 20 20 43 52 45 41  LE x3(y);.  CREA
3360: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 78  TE INDEX i1 ON x
3370: 33 28 79 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  3(y);..  INSERT 
3380: 49 4e 54 4f 20 78 31 20 56 41 4c 55 45 53 28 27  INTO x1 VALUES('
3390: 61 20 62 20 63 20 64 20 65 27 29 3b 0a 20 20 49  a b c d e');.  I
33a0: 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56 41  NSERT INTO x1 VA
33b0: 4c 55 45 53 28 27 66 20 67 20 68 20 69 20 6a 27  LUES('f g h i j'
33c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
33d0: 20 78 31 20 56 41 4c 55 45 53 28 27 6b 20 6b 20   x1 VALUES('k k 
33e0: 6c 20 6c 20 61 27 29 3b 0a 0a 20 20 49 4e 53 45  l l a');..  INSE
33f0: 52 54 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  RT INTO x2 SELEC
3400: 54 20 74 65 72 6d 20 46 52 4f 4d 20 74 65 72 6d  T term FROM term
3410: 73 20 57 48 45 52 45 20 63 6f 6c 20 3d 20 27 2a  s WHERE col = '*
3420: 27 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  ';.  INSERT INTO
3430: 20 78 33 20 53 45 4c 45 43 54 20 74 65 72 6d 20   x3 SELECT term 
3440: 46 52 4f 4d 20 74 65 72 6d 73 20 57 48 45 52 45  FROM terms WHERE
3450: 20 63 6f 6c 20 3d 20 27 2a 27 3b 0a 7d 0a 0a 70   col = '*';.}..p
3460: 72 6f 63 20 64 6f 5f 70 6c 61 6e 73 71 6c 5f 74  roc do_plansql_t
3470: 65 73 74 20 7b 74 6e 20 73 71 6c 20 72 7d 20 7b  est {tn sql r} {
3480: 0a 20 20 75 70 6c 65 76 65 6c 20 64 6f 5f 65 78  .  uplevel do_ex
3490: 65 63 73 71 6c 5f 74 65 73 74 20 24 74 6e 20 5b  ecsql_test $tn [
34a0: 6c 69 73 74 20 22 45 58 50 4c 41 49 4e 20 51 55  list "EXPLAIN QU
34b0: 45 52 59 20 50 4c 41 4e 20 24 73 71 6c 20 3b 20  ERY PLAN $sql ; 
34c0: 24 73 71 6c 22 5d 20 5b 6c 69 73 74 20 24 72 5d  $sql"] [list $r]
34d0: 0a 7d 0a 0a 64 6f 5f 70 6c 61 6e 73 71 6c 5f 74  .}..do_plansql_t
34e0: 65 73 74 20 34 2e 32 20 7b 0a 20 20 53 45 4c 45  est 4.2 {.  SELE
34f0: 43 54 20 79 20 46 52 4f 4d 20 78 32 2c 20 74 65  CT y FROM x2, te
3500: 72 6d 73 20 57 48 45 52 45 20 79 20 3d 20 74 65  rms WHERE y = te
3510: 72 6d 20 41 4e 44 20 63 6f 6c 20 3d 20 27 2a 27  rm AND col = '*'
3520: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
3530: 41 4e 20 54 41 42 4c 45 20 78 32 20 28 7e 31 30  AN TABLE x2 (~10
3540: 30 30 30 30 30 20 72 6f 77 73 29 7d 20 0a 20 20  00000 rows)} .  
3550: 30 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42 4c  0 1 1 {SCAN TABL
3560: 45 20 74 65 72 6d 73 20 56 49 52 54 55 41 4c 20  E terms VIRTUAL 
3570: 54 41 42 4c 45 20 49 4e 44 45 58 20 31 3a 20 28  TABLE INDEX 1: (
3580: 7e 30 20 72 6f 77 73 29 7d 20 0a 20 20 61 20 62  ~0 rows)} .  a b
3590: 20 63 20 64 20 65 20 66 20 67 20 68 20 69 20 6a   c d e f g h i j
35a0: 20 6b 20 6c 0a 7d 0a 0a 64 6f 5f 70 6c 61 6e 73   k l.}..do_plans
35b0: 71 6c 5f 74 65 73 74 20 34 2e 33 20 7b 0a 20 20  ql_test 4.3 {.  
35c0: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 65  SELECT y FROM te
35d0: 72 6d 73 2c 20 78 32 20 57 48 45 52 45 20 79 20  rms, x2 WHERE y 
35e0: 3d 20 74 65 72 6d 20 41 4e 44 20 63 6f 6c 20 3d  = term AND col =
35f0: 20 27 2a 27 0a 7d 20 7b 0a 20 20 30 20 30 20 31   '*'.} {.  0 0 1
3600: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 78 32 20   {SCAN TABLE x2 
3610: 28 7e 31 30 30 30 30 30 30 20 72 6f 77 73 29 7d  (~1000000 rows)}
3620: 20 0a 20 20 30 20 31 20 30 20 7b 53 43 41 4e 20   .  0 1 0 {SCAN 
3630: 54 41 42 4c 45 20 74 65 72 6d 73 20 56 49 52 54  TABLE terms VIRT
3640: 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
3650: 31 3a 20 28 7e 30 20 72 6f 77 73 29 7d 20 0a 20  1: (~0 rows)} . 
3660: 20 61 20 62 20 63 20 64 20 65 20 66 20 67 20 68   a b c d e f g h
3670: 20 69 20 6a 20 6b 20 6c 0a 7d 0a 0a 64 6f 5f 70   i j k l.}..do_p
3680: 6c 61 6e 73 71 6c 5f 74 65 73 74 20 34 2e 34 20  lansql_test 4.4 
3690: 7b 0a 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f  {.  SELECT y FRO
36a0: 4d 20 78 33 2c 20 74 65 72 6d 73 20 57 48 45 52  M x3, terms WHER
36b0: 45 20 79 20 3d 20 74 65 72 6d 20 41 4e 44 20 63  E y = term AND c
36c0: 6f 6c 20 3d 20 27 2a 27 0a 7d 20 7b 0a 20 20 30  ol = '*'.} {.  0
36d0: 20 30 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 1 {SCAN TABLE
36e0: 20 74 65 72 6d 73 20 56 49 52 54 55 41 4c 20 54   terms VIRTUAL T
36f0: 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 20 28 7e  ABLE INDEX 0: (~
3700: 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 31 20  0 rows)} .  0 1 
3710: 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  0 {SEARCH TABLE 
3720: 78 33 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e  x3 USING COVERIN
3730: 47 20 49 4e 44 45 58 20 69 31 20 28 79 3d 3f 29  G INDEX i1 (y=?)
3740: 20 28 7e 31 30 20 72 6f 77 73 29 7d 0a 20 20 61   (~10 rows)}.  a
3750: 20 62 20 63 20 64 20 65 20 66 20 67 20 68 20 69   b c d e f g h i
3760: 20 6a 20 6b 20 6c 0a 7d 0a 0a 64 6f 5f 70 6c 61   j k l.}..do_pla
3770: 6e 73 71 6c 5f 74 65 73 74 20 34 2e 35 20 7b 0a  nsql_test 4.5 {.
3780: 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
3790: 74 65 72 6d 73 2c 20 78 33 20 57 48 45 52 45 20  terms, x3 WHERE 
37a0: 79 20 3d 20 74 65 72 6d 20 41 4e 44 20 6f 63 63  y = term AND occ
37b0: 75 72 72 65 6e 63 65 73 3e 31 20 41 4e 44 20 63  urrences>1 AND c
37c0: 6f 6c 20 3d 20 27 2a 27 0a 7d 20 7b 0a 20 20 30  ol = '*'.} {.  0
37d0: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
37e0: 20 74 65 72 6d 73 20 56 49 52 54 55 41 4c 20 54   terms VIRTUAL T
37f0: 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 20 28 7e  ABLE INDEX 0: (~
3800: 30 20 72 6f 77 73 29 7d 20 0a 20 20 30 20 31 20  0 rows)} .  0 1 
3810: 31 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45 20  1 {SEARCH TABLE 
3820: 78 33 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e  x3 USING COVERIN
3830: 47 20 49 4e 44 45 58 20 69 31 20 28 79 3d 3f 29  G INDEX i1 (y=?)
3840: 20 28 7e 31 30 20 72 6f 77 73 29 7d 0a 20 20 61   (~10 rows)}.  a
3850: 20 6b 20 6c 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   k l.}..#-------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
38b0: 6e 67 20 74 65 73 74 73 20 63 68 65 63 6b 20 74  ng tests check t
38c0: 68 61 74 20 66 74 73 34 61 75 78 20 63 61 6e 20  hat fts4aux can 
38d0: 68 61 6e 64 6c 65 20 61 6e 20 66 74 73 20 74 61  handle an fts ta
38e0: 62 6c 65 20 77 69 74 68 20 61 6e 0a 23 20 6f 64  ble with an.# od
38f0: 64 20 6e 61 6d 65 20 28 6f 6e 65 20 74 68 61 74  d name (one that
3900: 20 72 65 71 75 69 72 65 73 20 71 75 6f 74 69 6e   requires quotin
3910: 67 20 66 6f 72 20 75 73 65 20 69 6e 20 53 51 4c  g for use in SQL
3920: 20 73 74 61 74 65 6d 65 6e 74 73 29 2e 20 41 6e   statements). An
3930: 64 20 74 68 61 74 0a 23 20 74 68 65 20 61 72 67  d that.# the arg
3940: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 74 73  ument to the fts
3950: 34 61 75 78 20 63 6f 6e 73 74 72 75 63 74 6f 72  4aux constructor
3960: 20 69 73 20 70 72 6f 70 65 72 6c 79 20 64 65 71   is properly deq
3970: 75 6f 74 65 64 20 62 65 66 6f 72 65 20 75 73 65  uoted before use
3980: 2e 0a 23 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ..#.#.do_execsql
3990: 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 43 52  _test 5.1 {.  CR
39a0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
39b0: 4c 45 20 22 61 62 63 20 27 21 27 20 64 65 66 22  LE "abc '!' def"
39c0: 20 55 53 49 4e 47 20 66 74 73 34 28 78 2c 20 79   USING fts4(x, y
39d0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
39e0: 20 22 61 62 63 20 27 21 27 20 64 65 66 22 20 56   "abc '!' def" V
39f0: 41 4c 55 45 53 28 27 58 58 27 2c 20 27 59 59 27  ALUES('XX', 'YY'
3a00: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 56 49 52  );..  CREATE VIR
3a10: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 72 6d 73  TUAL TABLE terms
3a20: 33 20 55 53 49 4e 47 20 66 74 73 34 61 75 78 28  3 USING fts4aux(
3a30: 22 61 62 63 20 27 21 27 20 64 65 66 22 29 3b 0a  "abc '!' def");.
3a40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3a50: 74 65 72 6d 73 33 3b 0a 7d 20 7b 78 78 20 2a 20  terms3;.} {xx * 
3a60: 31 20 31 20 78 78 20 30 20 31 20 31 20 79 79 20  1 1 xx 0 1 1 yy 
3a70: 2a 20 31 20 31 20 79 79 20 31 20 31 20 31 7d 0a  * 1 1 yy 1 1 1}.
3a80: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3a90: 20 35 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20   5.2 {.  CREATE 
3aa0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 22 25  VIRTUAL TABLE "%
3ab0: 25 5e 5e 25 25 22 20 55 53 49 4e 47 20 66 74 73  %^^%%" USING fts
3ac0: 34 61 75 78 28 27 61 62 63 20 27 27 21 27 27 20  4aux('abc ''!'' 
3ad0: 64 65 66 27 29 3b 0a 20 20 53 45 4c 45 43 54 20  def');.  SELECT 
3ae0: 2a 20 46 52 4f 4d 20 22 25 25 5e 5e 25 25 22 3b  * FROM "%%^^%%";
3af0: 0a 7d 20 7b 78 78 20 2a 20 31 20 31 20 78 78 20  .} {xx * 1 1 xx 
3b00: 30 20 31 20 31 20 79 79 20 2a 20 31 20 31 20 79  0 1 1 yy * 1 1 y
3b10: 79 20 31 20 31 20 31 7d 0a 0a 0a 66 69 6e 69 73  y 1 1 1}...finis
3b20: 68 5f 74 65 73 74 0a                             h_test.