/ Hex Artifact Content
Login

Artifact 014e2bef603dd3c46d99f36dea614e05a2ae75ae02c0ba8519ecb1d2d0c6ee22:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 4f 63 74 20 31  /*.** 2006 Oct 1
0010: 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  0.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 69 73 20 61 6e 20 53 51 4c 69 74 65 20 6d 6f   is an SQLite mo
0190: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  dule implementin
01a0: 67 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61 72  g full-text sear
01b0: 63 68 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  ch..*/../*.** Th
01c0: 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  e code in this f
01d0: 69 6c 65 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70  ile is only comp
01e0: 69 6c 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  iled if:.**.**  
01f0: 20 20 20 2a 20 54 68 65 20 46 54 53 33 20 6d 6f     * The FTS3 mo
0200: 64 75 6c 65 20 69 73 20 62 65 69 6e 67 20 62 75  dule is being bu
0210: 69 6c 74 20 61 73 20 61 6e 20 65 78 74 65 6e 73  ilt as an extens
0220: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 28 69 6e  ion.**       (in
0230: 20 77 68 69 63 68 20 63 61 73 65 20 53 51 4c 49   which case SQLI
0240: 54 45 5f 43 4f 52 45 20 69 73 20 6e 6f 74 20 64  TE_CORE is not d
0250: 65 66 69 6e 65 64 29 2c 20 6f 72 0a 2a 2a 0a 2a  efined), or.**.*
0260: 2a 20 20 20 20 20 2a 20 54 68 65 20 46 54 53 33  *     * The FTS3
0270: 20 6d 6f 64 75 6c 65 20 69 73 20 62 65 69 6e 67   module is being
0280: 20 62 75 69 6c 74 20 69 6e 74 6f 20 74 68 65 20   built into the 
0290: 63 6f 72 65 20 6f 66 0a 2a 2a 20 20 20 20 20 20  core of.**      
02a0: 20 53 51 4c 69 74 65 20 28 69 6e 20 77 68 69 63   SQLite (in whic
02b0: 68 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4e  h case SQLITE_EN
02c0: 41 42 4c 45 5f 46 54 53 33 20 69 73 20 64 65 66  ABLE_FTS3 is def
02d0: 69 6e 65 64 29 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68  ined)..*/../* Th
02e0: 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
02f0: 78 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  x is stored in a
0300: 20 73 65 72 69 65 73 20 6f 66 20 62 2b 74 72 65   series of b+tre
0310: 65 20 28 2d 6c 69 6b 65 29 0a 2a 2a 20 73 74 72  e (-like).** str
0320: 75 63 74 75 72 65 73 20 63 61 6c 6c 65 64 20 73  uctures called s
0330: 65 67 6d 65 6e 74 73 20 77 68 69 63 68 20 6d 61  egments which ma
0340: 70 20 74 65 72 6d 73 20 74 6f 20 64 6f 63 6c 69  p terms to docli
0350: 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 73 74 72  sts.  The.** str
0360: 75 63 74 75 72 65 73 20 61 72 65 20 6c 69 6b 65  uctures are like
0370: 20 62 2b 74 72 65 65 73 20 69 6e 20 6c 61 79 6f   b+trees in layo
0380: 75 74 2c 20 62 75 74 20 61 72 65 20 63 6f 6e 73  ut, but are cons
0390: 74 72 75 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tructed from the
03a0: 0a 2a 2a 20 62 6f 74 74 6f 6d 20 75 70 20 69 6e  .** bottom up in
03b0: 20 6f 70 74 69 6d 61 6c 20 66 61 73 68 69 6f 6e   optimal fashion
03c0: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75 70 64   and are not upd
03d0: 61 74 61 62 6c 65 2e 20 20 53 69 6e 63 65 20 74  atable.  Since t
03e0: 72 65 65 73 0a 2a 2a 20 61 72 65 20 62 75 69 6c  rees.** are buil
03f0: 74 20 66 72 6f 6d 20 74 68 65 20 62 6f 74 74 6f  t from the botto
0400: 6d 20 75 70 2c 20 74 68 69 6e 67 73 20 77 69 6c  m up, things wil
0410: 6c 20 62 65 20 64 65 73 63 72 69 62 65 64 20 66  l be described f
0420: 72 6f 6d 20 74 68 65 0a 2a 2a 20 62 6f 74 74 6f  rom the.** botto
0430: 6d 20 75 70 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 2a 2a  m up..**.**.****
0440: 20 56 61 72 69 6e 74 73 20 2a 2a 2a 2a 0a 2a 2a   Varints ****.**
0450: 20 54 68 65 20 62 61 73 69 63 20 75 6e 69 74 20   The basic unit 
0460: 6f 66 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 61  of encoding is a
0470: 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74 68   variable-length
0480: 20 69 6e 74 65 67 65 72 20 63 61 6c 6c 65 64 20   integer called 
0490: 61 0a 2a 2a 20 76 61 72 69 6e 74 2e 20 20 57 65  a.** varint.  We
04a0: 20 65 6e 63 6f 64 65 20 76 61 72 69 61 62 6c 65   encode variable
04b0: 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 73  -length integers
04c0: 20 69 6e 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61   in little-endia
04d0: 6e 20 6f 72 64 65 72 0a 2a 2a 20 75 73 69 6e 67  n order.** using
04e0: 20 73 65 76 65 6e 20 62 69 74 73 20 2a 20 70 65   seven bits * pe
04f0: 72 20 62 79 74 65 20 61 73 20 66 6f 6c 6c 6f 77  r byte as follow
0500: 73 3a 0a 2a 2a 0a 2a 2a 20 4b 45 59 3a 0a 2a 2a  s:.**.** KEY:.**
0510: 20 20 20 20 20 20 20 20 20 41 20 3d 20 30 78 78           A = 0xx
0520: 78 78 78 78 78 20 20 20 20 37 20 62 69 74 73 20  xxxxx    7 bits 
0530: 6f 66 20 64 61 74 61 20 61 6e 64 20 6f 6e 65 20  of data and one 
0540: 66 6c 61 67 20 62 69 74 0a 2a 2a 20 20 20 20 20  flag bit.**     
0550: 20 20 20 20 42 20 3d 20 31 78 78 78 78 78 78 78      B = 1xxxxxxx
0560: 20 20 20 20 37 20 62 69 74 73 20 6f 66 20 64 61      7 bits of da
0570: 74 61 20 61 6e 64 20 6f 6e 65 20 66 6c 61 67 20  ta and one flag 
0580: 62 69 74 0a 2a 2a 0a 2a 2a 20 20 37 20 62 69 74  bit.**.**  7 bit
0590: 73 20 2d 20 41 0a 2a 2a 20 31 34 20 62 69 74 73  s - A.** 14 bits
05a0: 20 2d 20 42 41 0a 2a 2a 20 32 31 20 62 69 74 73   - BA.** 21 bits
05b0: 20 2d 20 42 42 41 0a 2a 2a 20 61 6e 64 20 73 6f   - BBA.** and so
05c0: 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   on..**.** This 
05d0: 69 73 20 73 69 6d 69 6c 61 72 20 69 6e 20 63 6f  is similar in co
05e0: 6e 63 65 70 74 20 74 6f 20 68 6f 77 20 73 71 6c  ncept to how sql
05f0: 69 74 65 20 65 6e 63 6f 64 65 73 20 22 76 61 72  ite encodes "var
0600: 69 6e 74 73 22 20 62 75 74 0a 2a 2a 20 74 68 65  ints" but.** the
0610: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 6e 6f 74   encoding is not
0620: 20 74 68 65 20 73 61 6d 65 2e 20 20 53 51 4c 69   the same.  SQLi
0630: 74 65 20 76 61 72 69 6e 74 73 20 61 72 65 20 62  te varints are b
0640: 69 67 2d 65 6e 64 69 61 6e 0a 2a 2a 20 61 72 65  ig-endian.** are
0650: 20 61 72 65 20 6c 69 6d 69 74 65 64 20 74 6f 20   are limited to 
0660: 39 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  9 bytes in lengt
0670: 68 20 77 68 65 72 65 61 73 20 46 54 53 33 20 76  h whereas FTS3 v
0680: 61 72 69 6e 74 73 20 61 72 65 0a 2a 2a 20 6c 69  arints are.** li
0690: 74 74 6c 65 2d 65 6e 64 69 61 6e 20 61 6e 64 20  ttle-endian and 
06a0: 63 61 6e 20 62 65 20 75 70 20 74 6f 20 31 30 20  can be up to 10 
06b0: 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 20  bytes in length 
06c0: 28 69 6e 20 74 68 65 6f 72 79 29 2e 0a 2a 2a 0a  (in theory)..**.
06d0: 2a 2a 20 45 78 61 6d 70 6c 65 20 65 6e 63 6f 64  ** Example encod
06e0: 69 6e 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ings:.**.**     
06f0: 31 3a 20 20 20 20 30 78 30 31 0a 2a 2a 20 20 20  1:    0x01.**   
0700: 31 32 37 3a 20 20 20 20 30 78 37 66 0a 2a 2a 20  127:    0x7f.** 
0710: 20 20 31 32 38 3a 20 20 20 20 30 78 38 31 20 30    128:    0x81 0
0720: 78 30 30 0a 2a 2a 0a 2a 2a 0a 2a 2a 2a 2a 20 44  x00.**.**.**** D
0730: 6f 63 75 6d 65 6e 74 20 6c 69 73 74 73 20 2a 2a  ocument lists **
0740: 2a 2a 0a 2a 2a 20 41 20 64 6f 63 6c 69 73 74 20  **.** A doclist 
0750: 28 64 6f 63 75 6d 65 6e 74 20 6c 69 73 74 29 20  (document list) 
0760: 68 6f 6c 64 73 20 61 20 64 6f 63 69 64 2d 73 6f  holds a docid-so
0770: 72 74 65 64 20 6c 69 73 74 20 6f 66 20 68 69 74  rted list of hit
0780: 73 20 66 6f 72 20 61 0a 2a 2a 20 67 69 76 65 6e  s for a.** given
0790: 20 74 65 72 6d 2e 20 20 44 6f 63 6c 69 73 74 73   term.  Doclists
07a0: 20 68 6f 6c 64 20 64 6f 63 69 64 73 20 61 6e 64   hold docids and
07b0: 20 61 73 73 6f 63 69 61 74 65 64 20 74 6f 6b 65   associated toke
07c0: 6e 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 2a 2a 20  n positions..** 
07d0: 41 20 64 6f 63 69 64 20 69 73 20 74 68 65 20 75  A docid is the u
07e0: 6e 69 71 75 65 20 69 6e 74 65 67 65 72 20 69 64  nique integer id
07f0: 65 6e 74 69 66 69 65 72 20 66 6f 72 20 61 20 73  entifier for a s
0800: 69 6e 67 6c 65 20 64 6f 63 75 6d 65 6e 74 2e 0a  ingle document..
0810: 2a 2a 20 41 20 70 6f 73 69 74 69 6f 6e 20 69 73  ** A position is
0820: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
0830: 77 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65 20  word within the 
0840: 64 6f 63 75 6d 65 6e 74 2e 20 20 54 68 65 20 66  document.  The f
0850: 69 72 73 74 20 0a 2a 2a 20 77 6f 72 64 20 6f 66  irst .** word of
0860: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 68 61   the document ha
0870: 73 20 61 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  s a position of 
0880: 30 2e 0a 2a 2a 0a 2a 2a 20 46 54 53 33 20 75 73  0..**.** FTS3 us
0890: 65 64 20 74 6f 20 6f 70 74 69 6f 6e 61 6c 6c 79  ed to optionally
08a0: 20 73 74 6f 72 65 20 63 68 61 72 61 63 74 65 72   store character
08b0: 20 6f 66 66 73 65 74 73 20 75 73 69 6e 67 20 61   offsets using a
08c0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
08d0: 20 6f 70 74 69 6f 6e 2e 20 20 42 75 74 20 74 68   option.  But th
08e0: 61 74 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  at functionality
08f0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 73 75   is no longer su
0900: 70 70 6f 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  pported..**.** A
0910: 20 64 6f 63 6c 69 73 74 20 69 73 20 73 74 6f 72   doclist is stor
0920: 65 64 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ed like this:.**
0930: 0a 2a 2a 20 61 72 72 61 79 20 7b 0a 2a 2a 20 20  .** array {.**  
0940: 20 76 61 72 69 6e 74 20 64 6f 63 69 64 3b 20 20   varint docid;  
0950: 20 20 20 20 20 20 20 20 28 64 65 6c 74 61 20 66          (delta f
0960: 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 64 6f 63  rom previous doc
0970: 6c 69 73 74 29 0a 2a 2a 20 20 20 61 72 72 61 79  list).**   array
0980: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
0990: 20 20 28 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74    (position list
09a0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 30 29 0a 2a   for column 0).*
09b0: 2a 20 20 20 20 20 76 61 72 69 6e 74 20 70 6f 73  *     varint pos
09c0: 69 74 69 6f 6e 3b 20 20 20 20 20 28 32 20 6d 6f  ition;     (2 mo
09d0: 72 65 20 74 68 61 6e 20 74 68 65 20 64 65 6c 74  re than the delt
09e0: 61 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20  a from previous 
09f0: 70 6f 73 69 74 69 6f 6e 29 0a 2a 2a 20 20 20 7d  position).**   }
0a00: 0a 2a 2a 20 20 20 61 72 72 61 79 20 7b 0a 2a 2a  .**   array {.**
0a10: 20 20 20 20 20 76 61 72 69 6e 74 20 50 4f 53 5f       varint POS_
0a20: 43 4f 4c 55 4d 4e 3b 20 20 20 28 6d 61 72 6b 73  COLUMN;   (marks
0a30: 20 73 74 61 72 74 20 6f 66 20 70 6f 73 69 74 69   start of positi
0a40: 6f 6e 20 6c 69 73 74 20 66 6f 72 20 6e 65 77 20  on list for new 
0a50: 63 6f 6c 75 6d 6e 29 0a 2a 2a 20 20 20 20 20 76  column).**     v
0a60: 61 72 69 6e 74 20 63 6f 6c 75 6d 6e 3b 20 20 20  arint column;   
0a70: 20 20 20 20 28 69 6e 64 65 78 20 6f 66 20 6e 65      (index of ne
0a80: 77 20 63 6f 6c 75 6d 6e 29 0a 2a 2a 20 20 20 20  w column).**    
0a90: 20 61 72 72 61 79 20 7b 0a 2a 2a 20 20 20 20 20   array {.**     
0aa0: 20 20 76 61 72 69 6e 74 20 70 6f 73 69 74 69 6f    varint positio
0ab0: 6e 3b 20 20 20 28 32 20 6d 6f 72 65 20 74 68 61  n;   (2 more tha
0ac0: 6e 20 74 68 65 20 64 65 6c 74 61 20 66 72 6f 6d  n the delta from
0ad0: 20 70 72 65 76 69 6f 75 73 20 70 6f 73 69 74 69   previous positi
0ae0: 6f 6e 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  on).**     }.** 
0af0: 20 20 7d 0a 2a 2a 20 20 20 76 61 72 69 6e 74 20    }.**   varint 
0b00: 50 4f 53 5f 45 4e 44 3b 20 20 20 20 20 20 20 20  POS_END;        
0b10: 28 6d 61 72 6b 73 20 65 6e 64 20 6f 66 20 70 6f  (marks end of po
0b20: 73 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  sitions for this
0b30: 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 7d 0a   document..** }.
0b40: 2a 2a 0a 2a 2a 20 48 65 72 65 2c 20 61 72 72 61  **.** Here, arra
0b50: 79 20 7b 20 58 20 7d 20 6d 65 61 6e 73 20 7a 65  y { X } means ze
0b60: 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72  ro or more occur
0b70: 72 65 6e 63 65 73 20 6f 66 20 58 2c 20 61 64 6a  rences of X, adj
0b80: 61 63 65 6e 74 20 69 6e 0a 2a 2a 20 6d 65 6d 6f  acent in.** memo
0b90: 72 79 2e 20 20 41 20 22 70 6f 73 69 74 69 6f 6e  ry.  A "position
0ba0: 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 66  " is an index of
0bb0: 20 61 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20   a token in the 
0bc0: 74 6f 6b 65 6e 20 73 74 72 65 61 6d 0a 2a 2a 20  token stream.** 
0bd0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
0be0: 20 74 6f 6b 65 6e 69 7a 65 72 2e 20 4e 6f 74 65   tokenizer. Note
0bf0: 20 74 68 61 74 20 50 4f 53 5f 45 4e 44 20 61 6e   that POS_END an
0c00: 64 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 63 63  d POS_COLUMN occ
0c10: 75 72 20 0a 2a 2a 20 69 6e 20 74 68 65 20 73 61  ur .** in the sa
0c20: 6d 65 20 6c 6f 67 69 63 61 6c 20 70 6c 61 63 65  me logical place
0c30: 20 61 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   as the position
0c40: 20 65 6c 65 6d 65 6e 74 2c 20 61 6e 64 20 61 63   element, and ac
0c50: 74 20 61 73 20 73 65 6e 74 69 6e 61 6c 73 0a 2a  t as sentinals.*
0c60: 2a 20 65 6e 64 69 6e 67 20 61 20 70 6f 73 69 74  * ending a posit
0c70: 69 6f 6e 20 6c 69 73 74 20 61 72 72 61 79 2e 20  ion list array. 
0c80: 20 50 4f 53 5f 45 4e 44 20 69 73 20 30 2e 20 20   POS_END is 0.  
0c90: 50 4f 53 5f 43 4f 4c 55 4d 4e 20 69 73 20 31 2e  POS_COLUMN is 1.
0ca0: 0a 2a 2a 20 54 68 65 20 70 6f 73 69 74 69 6f 6e  .** The position
0cb0: 73 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6e 6f  s numbers are no
0cc0: 74 20 73 74 6f 72 65 64 20 6c 69 74 65 72 61 6c  t stored literal
0cd0: 6c 79 20 62 75 74 20 72 61 74 68 65 72 20 61 73  ly but rather as
0ce0: 20 74 77 6f 20 6d 6f 72 65 0a 2a 2a 20 74 68 61   two more.** tha
0cf0: 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  n the difference
0d00: 20 66 72 6f 6d 20 74 68 65 20 70 72 69 6f 72 20   from the prior 
0d10: 70 6f 73 69 74 69 6f 6e 2c 20 6f 72 20 74 68 65  position, or the
0d20: 20 6a 75 73 74 20 74 68 65 20 70 6f 73 69 74 69   just the positi
0d30: 6f 6e 20 70 6c 75 73 0a 2a 2a 20 32 20 66 6f 72  on plus.** 2 for
0d40: 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74   the first posit
0d50: 69 6f 6e 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ion.  Example:.*
0d60: 2a 0a 2a 2a 20 20 20 6c 61 62 65 6c 3a 20 20 20  *.**   label:   
0d70: 20 20 20 20 41 20 42 20 43 20 44 20 45 20 20 46      A B C D E  F
0d80: 20 20 47 20 48 20 20 20 49 20 20 4a 20 4b 0a 2a    G H   I  J K.*
0d90: 2a 20 20 20 76 61 6c 75 65 3a 20 20 20 20 20 31  *   value:     1
0da0: 32 33 20 35 20 39 20 31 20 31 20 31 34 20 33 35  23 5 9 1 1 14 35
0db0: 20 30 20 32 33 34 20 37 32 20 30 0a 2a 2a 0a 2a   0 234 72 0.**.*
0dc0: 2a 20 54 68 65 20 31 32 33 20 76 61 6c 75 65 20  * The 123 value 
0dd0: 69 73 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  is the first doc
0de0: 69 64 2e 20 20 46 6f 72 20 63 6f 6c 75 6d 6e 20  id.  For column 
0df0: 7a 65 72 6f 20 69 6e 20 74 68 69 73 20 64 6f 63  zero in this doc
0e00: 75 6d 65 6e 74 0a 2a 2a 20 74 68 65 72 65 20 61  ument.** there a
0e10: 72 65 20 74 77 6f 20 6d 61 74 63 68 65 73 20 61  re two matches a
0e20: 74 20 70 6f 73 69 74 69 6f 6e 73 20 33 20 61 6e  t positions 3 an
0e30: 64 20 31 30 20 28 35 2d 32 20 61 6e 64 20 39 2d  d 10 (5-2 and 9-
0e40: 32 2b 33 29 2e 20 20 54 68 65 20 31 0a 2a 2a 20  2+3).  The 1.** 
0e50: 61 74 20 44 20 73 69 67 6e 61 6c 73 20 74 68 65  at D signals the
0e60: 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
0e70: 63 6f 6c 75 6d 6e 3b 20 74 68 65 20 31 20 61 74  column; the 1 at
0e80: 20 45 20 69 6e 64 69 63 61 74 65 73 20 74 68 61   E indicates tha
0e90: 74 20 74 68 65 0a 2a 2a 20 6e 65 77 20 63 6f 6c  t the.** new col
0ea0: 75 6d 6e 20 69 73 20 63 6f 6c 75 6d 6e 20 6e 75  umn is column nu
0eb0: 6d 62 65 72 20 31 2e 20 20 54 68 65 72 65 20 61  mber 1.  There a
0ec0: 72 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 73  re two positions
0ed0: 20 61 74 20 31 32 20 61 6e 64 20 34 35 0a 2a 2a   at 12 and 45.**
0ee0: 20 28 31 34 2d 32 20 61 6e 64 20 33 35 2d 32 2b   (14-2 and 35-2+
0ef0: 31 32 29 2e 20 20 54 68 65 20 30 20 61 74 20 48  12).  The 0 at H
0f00: 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 65 6e   indicate the en
0f10: 64 2d 6f 66 2d 64 6f 63 75 6d 65 6e 74 2e 20 20  d-of-document.  
0f20: 54 68 65 0a 2a 2a 20 32 33 34 20 61 74 20 49 20  The.** 234 at I 
0f30: 69 73 20 74 68 65 20 64 65 6c 74 61 20 74 6f 20  is the delta to 
0f40: 6e 65 78 74 20 64 6f 63 69 64 20 28 33 35 37 29  next docid (357)
0f50: 2e 20 20 49 74 20 68 61 73 20 6f 6e 65 20 70 6f  .  It has one po
0f60: 73 69 74 69 6f 6e 20 37 30 0a 2a 2a 20 28 37 32  sition 70.** (72
0f70: 2d 32 29 20 61 6e 64 20 74 68 65 6e 20 74 65 72  -2) and then ter
0f80: 6d 69 6e 61 74 65 73 20 77 69 74 68 20 74 68 65  minates with the
0f90: 20 30 20 61 74 20 4b 2e 0a 2a 2a 0a 2a 2a 20 41   0 at K..**.** A
0fa0: 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 22   "position-list"
0fb0: 20 69 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20   is the list of 
0fc0: 70 6f 73 69 74 69 6f 6e 73 20 66 6f 72 20 6d 75  positions for mu
0fd0: 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e 73 20 66  ltiple columns f
0fe0: 6f 72 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 64  or.** a single d
0ff0: 6f 63 69 64 2e 20 20 41 20 22 63 6f 6c 75 6d 6e  ocid.  A "column
1000: 2d 6c 69 73 74 22 20 69 73 20 74 68 65 20 73 65  -list" is the se
1010: 74 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20 66  t of positions f
1020: 6f 72 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 63  or a single.** c
1030: 6f 6c 75 6d 6e 2e 20 20 48 65 6e 63 65 2c 20 61  olumn.  Hence, a
1040: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
1050: 6f 6e 73 69 73 74 73 20 6f 66 20 6f 6e 65 20 6f  onsists of one o
1060: 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 2d 6c 69  r more column-li
1070: 73 74 73 2c 0a 2a 2a 20 61 20 64 6f 63 75 6d 65  sts,.** a docume
1080: 6e 74 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  nt record consis
1090: 74 73 20 6f 66 20 61 20 64 6f 63 69 64 20 66 6f  ts of a docid fo
10a0: 6c 6c 6f 77 65 64 20 62 79 20 61 20 70 6f 73 69  llowed by a posi
10b0: 74 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion-list and.**
10c0: 20 61 20 64 6f 63 6c 69 73 74 20 63 6f 6e 73 69   a doclist consi
10d0: 73 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  sts of one or mo
10e0: 72 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f  re document reco
10f0: 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 62 61 72  rds..**.** A bar
1100: 65 20 64 6f 63 6c 69 73 74 20 6f 6d 69 74 73 20  e doclist omits 
1110: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  the position inf
1120: 6f 72 6d 61 74 69 6f 6e 2c 20 62 65 63 6f 6d 69  ormation, becomi
1130: 6e 67 20 61 6e 20 0a 2a 2a 20 61 72 72 61 79 20  ng an .** array 
1140: 6f 66 20 76 61 72 69 6e 74 2d 65 6e 63 6f 64 65  of varint-encode
1150: 64 20 64 6f 63 69 64 73 2e 0a 2a 2a 0a 2a 2a 2a  d docids..**.***
1160: 2a 20 53 65 67 6d 65 6e 74 20 6c 65 61 66 20 6e  * Segment leaf n
1170: 6f 64 65 73 20 2a 2a 2a 2a 0a 2a 2a 20 53 65 67  odes ****.** Seg
1180: 6d 65 6e 74 20 6c 65 61 66 20 6e 6f 64 65 73 20  ment leaf nodes 
1190: 73 74 6f 72 65 20 74 65 72 6d 73 20 61 6e 64 20  store terms and 
11a0: 64 6f 63 6c 69 73 74 73 2c 20 6f 72 64 65 72 65  doclists, ordere
11b0: 64 20 62 79 20 74 65 72 6d 2e 20 20 4c 65 61 66  d by term.  Leaf
11c0: 0a 2a 2a 20 6e 6f 64 65 73 20 61 72 65 20 77 72  .** nodes are wr
11d0: 69 74 74 65 6e 20 75 73 69 6e 67 20 4c 65 61 66  itten using Leaf
11e0: 57 72 69 74 65 72 2c 20 61 6e 64 20 72 65 61 64  Writer, and read
11f0: 20 75 73 69 6e 67 20 4c 65 61 66 52 65 61 64 65   using LeafReade
1200: 72 20 28 74 6f 0a 2a 2a 20 69 74 65 72 61 74 65  r (to.** iterate
1210: 20 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c   through a singl
1220: 65 20 6c 65 61 66 20 6e 6f 64 65 27 73 20 64 61  e leaf node's da
1230: 74 61 29 20 61 6e 64 20 4c 65 61 76 65 73 52 65  ta) and LeavesRe
1240: 61 64 65 72 20 28 74 6f 0a 2a 2a 20 69 74 65 72  ader (to.** iter
1250: 61 74 65 20 74 68 72 6f 75 67 68 20 61 20 73 65  ate through a se
1260: 67 6d 65 6e 74 27 73 20 65 6e 74 69 72 65 20 6c  gment's entire l
1270: 65 61 66 20 6c 61 79 65 72 29 2e 20 20 4c 65 61  eaf layer).  Lea
1280: 66 20 6e 6f 64 65 73 20 68 61 76 65 0a 2a 2a 20  f nodes have.** 
1290: 74 68 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  the format:.**.*
12a0: 2a 20 76 61 72 69 6e 74 20 69 48 65 69 67 68 74  * varint iHeight
12b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 28 68  ;             (h
12c0: 65 69 67 68 74 20 66 72 6f 6d 20 6c 65 61 66 20  eight from leaf 
12d0: 6c 65 76 65 6c 2c 20 61 6c 77 61 79 73 20 30 29  level, always 0)
12e0: 0a 2a 2a 20 76 61 72 69 6e 74 20 6e 54 65 72 6d  .** varint nTerm
12f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1300: 28 6c 65 6e 67 74 68 20 6f 66 20 66 69 72 73 74  (length of first
1310: 20 74 65 72 6d 29 0a 2a 2a 20 63 68 61 72 20 70   term).** char p
1320: 54 65 72 6d 5b 6e 54 65 72 6d 5d 3b 20 20 20 20  Term[nTerm];    
1330: 20 20 20 20 20 20 28 63 6f 6e 74 65 6e 74 20 6f        (content o
1340: 66 20 66 69 72 73 74 20 74 65 72 6d 29 0a 2a 2a  f first term).**
1350: 20 76 61 72 69 6e 74 20 6e 44 6f 63 6c 69 73 74   varint nDoclist
1360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65  ;            (le
1370: 6e 67 74 68 20 6f 66 20 74 65 72 6d 27 73 20 61  ngth of term's a
1380: 73 73 6f 63 69 61 74 65 64 20 64 6f 63 6c 69 73  ssociated doclis
1390: 74 29 0a 2a 2a 20 63 68 61 72 20 70 44 6f 63 6c  t).** char pDocl
13a0: 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d 3b 20 20  ist[nDoclist];  
13b0: 20 20 28 63 6f 6e 74 65 6e 74 20 6f 66 20 64 6f    (content of do
13c0: 63 6c 69 73 74 29 0a 2a 2a 20 61 72 72 61 79 20  clist).** array 
13d0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  {.**            
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 28 66 75 72 74 68 65 72 20 74 65 72 6d 73 20   (further terms 
1400: 61 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65  are delta-encode
1410: 64 29 0a 2a 2a 20 20 20 76 61 72 69 6e 74 20 6e  d).**   varint n
1420: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
1430: 20 20 28 6c 65 6e 67 74 68 20 6f 66 20 70 72 65    (length of pre
1440: 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68 20  fix shared with 
1450: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 29 0a 2a  previous term).*
1460: 2a 20 20 20 76 61 72 69 6e 74 20 6e 53 75 66 66  *   varint nSuff
1470: 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 28 6c  ix;           (l
1480: 65 6e 67 74 68 20 6f 66 20 75 6e 73 68 61 72 65  ength of unshare
1490: 64 20 73 75 66 66 69 78 29 0a 2a 2a 20 20 20 63  d suffix).**   c
14a0: 68 61 72 20 70 54 65 72 6d 53 75 66 66 69 78 5b  har pTermSuffix[
14b0: 6e 53 75 66 66 69 78 5d 3b 28 75 6e 73 68 61 72  nSuffix];(unshar
14c0: 65 64 20 73 75 66 66 69 78 20 6f 66 20 6e 65 78  ed suffix of nex
14d0: 74 20 74 65 72 6d 29 0a 2a 2a 20 20 20 76 61 72  t term).**   var
14e0: 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20  int nDoclist;   
14f0: 20 20 20 20 20 20 20 28 6c 65 6e 67 74 68 20 6f         (length o
1500: 66 20 74 65 72 6d 27 73 20 61 73 73 6f 63 69 61  f term's associa
1510: 74 65 64 20 64 6f 63 6c 69 73 74 29 0a 2a 2a 20  ted doclist).** 
1520: 20 20 63 68 61 72 20 70 44 6f 63 6c 69 73 74 5b    char pDoclist[
1530: 6e 44 6f 63 6c 69 73 74 5d 3b 20 20 28 63 6f 6e  nDoclist];  (con
1540: 74 65 6e 74 20 6f 66 20 64 6f 63 6c 69 73 74 29  tent of doclist)
1550: 0a 2a 2a 20 7d 0a 2a 2a 0a 2a 2a 20 48 65 72 65  .** }.**.** Here
1560: 2c 20 61 72 72 61 79 20 7b 20 58 20 7d 20 6d 65  , array { X } me
1570: 61 6e 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ans zero or more
1580: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
1590: 58 2c 20 61 64 6a 61 63 65 6e 74 20 69 6e 0a 2a  X, adjacent in.*
15a0: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  * memory..**.** 
15b0: 4c 65 61 66 20 6e 6f 64 65 73 20 61 72 65 20 62  Leaf nodes are b
15c0: 72 6f 6b 65 6e 20 69 6e 74 6f 20 62 6c 6f 63 6b  roken into block
15d0: 73 20 77 68 69 63 68 20 61 72 65 20 73 74 6f 72  s which are stor
15e0: 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  ed contiguously 
15f0: 69 6e 0a 2a 2a 20 74 68 65 20 25 5f 73 65 67 6d  in.** the %_segm
1600: 65 6e 74 73 20 74 61 62 6c 65 20 69 6e 20 73 6f  ents table in so
1610: 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69  rted order.  Thi
1620: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  s means that whe
1630: 6e 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  n the end.** of 
1640: 61 20 6e 6f 64 65 20 69 73 20 72 65 61 63 68 65  a node is reache
1650: 64 2c 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  d, the next term
1660: 20 69 73 20 69 6e 20 74 68 65 20 6e 6f 64 65 20   is in the node 
1670: 77 69 74 68 20 74 68 65 20 6e 65 78 74 0a 2a 2a  with the next.**
1680: 20 67 72 65 61 74 65 72 20 6e 6f 64 65 20 69 64   greater node id
1690: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 77 20 64 61 74 61  ..**.** New data
16a0: 20 69 73 20 73 70 69 6c 6c 65 64 20 74 6f 20 61   is spilled to a
16b0: 20 6e 65 77 20 6c 65 61 66 20 6e 6f 64 65 20 77   new leaf node w
16c0: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
16d0: 6e 6f 64 65 0a 2a 2a 20 65 78 63 65 65 64 73 20  node.** exceeds 
16e0: 4c 45 41 46 5f 4d 41 58 20 62 79 74 65 73 20 28  LEAF_MAX bytes (
16f0: 64 65 66 61 75 6c 74 20 32 30 34 38 29 2e 20 20  default 2048).  
1700: 4e 65 77 20 64 61 74 61 20 77 68 69 63 68 20 69  New data which i
1710: 74 73 65 6c 66 20 69 73 0a 2a 2a 20 6c 61 72 67  tself is.** larg
1720: 65 72 20 74 68 61 6e 20 53 54 41 4e 44 41 4c 4f  er than STANDALO
1730: 4e 45 5f 4d 49 4e 20 28 64 65 66 61 75 6c 74 20  NE_MIN (default 
1740: 31 30 32 34 29 20 69 73 20 70 6c 61 63 65 64 20  1024) is placed 
1750: 69 6e 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 0a  in a standalone.
1760: 2a 2a 20 6e 6f 64 65 20 28 61 20 6c 65 61 66 20  ** node (a leaf 
1770: 6e 6f 64 65 20 77 69 74 68 20 61 20 73 69 6e 67  node with a sing
1780: 6c 65 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c  le term and docl
1790: 69 73 74 29 2e 20 20 54 68 65 20 67 6f 61 6c 20  ist).  The goal 
17a0: 6f 66 0a 2a 2a 20 74 68 65 73 65 20 73 65 74 74  of.** these sett
17b0: 69 6e 67 73 20 69 73 20 74 6f 20 70 61 63 6b 20  ings is to pack 
17c0: 74 6f 67 65 74 68 65 72 20 67 72 6f 75 70 73 20  together groups 
17d0: 6f 66 20 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74  of small doclist
17e0: 73 20 77 68 69 6c 65 0a 2a 2a 20 6d 61 6b 69 6e  s while.** makin
17f0: 67 20 69 74 20 65 66 66 69 63 69 65 6e 74 20 74  g it efficient t
1800: 6f 20 64 69 72 65 63 74 6c 79 20 61 63 63 65 73  o directly acces
1810: 73 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74 73  s large doclists
1820: 2e 20 20 54 68 65 0a 2a 2a 20 61 73 73 75 6d 70  .  The.** assump
1830: 74 69 6f 6e 20 69 73 20 74 68 61 74 20 6c 61 72  tion is that lar
1840: 67 65 20 64 6f 63 6c 69 73 74 73 20 72 65 70 72  ge doclists repr
1850: 65 73 65 6e 74 20 74 65 72 6d 73 20 77 68 69 63  esent terms whic
1860: 68 20 61 72 65 20 6d 6f 72 65 0a 2a 2a 20 6c 69  h are more.** li
1870: 6b 65 6c 79 20 74 6f 20 62 65 20 71 75 65 72 79  kely to be query
1880: 20 74 61 72 67 65 74 73 2e 0a 2a 2a 0a 2a 2a 20   targets..**.** 
1890: 54 4f 44 4f 28 73 68 65 73 73 29 20 49 74 20 6d  TODO(shess) It m
18a0: 61 79 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72  ay be useful for
18b0: 20 62 6c 6f 63 6b 69 6e 67 20 64 65 63 69 73 69   blocking decisi
18c0: 6f 6e 73 20 74 6f 20 62 65 20 6d 6f 72 65 0a 2a  ons to be more.*
18d0: 2a 20 64 79 6e 61 6d 69 63 2e 20 20 46 6f 72 20  * dynamic.  For 
18e0: 69 6e 73 74 61 6e 63 65 2c 20 69 74 20 6d 61 79  instance, it may
18f0: 20 6d 61 6b 65 20 6d 6f 72 65 20 73 65 6e 73 65   make more sense
1900: 20 74 6f 20 68 61 76 65 20 61 20 32 2e 35 6b 20   to have a 2.5k 
1910: 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 20 72 61 74  leaf.** node rat
1920: 68 65 72 20 74 68 61 6e 20 73 70 6c 69 74 74 69  her than splitti
1930: 6e 67 20 69 6e 74 6f 20 32 6b 20 61 6e 64 20 2e  ng into 2k and .
1940: 35 6b 20 6e 6f 64 65 73 2e 20 20 4d 79 20 69 6e  5k nodes.  My in
1950: 74 75 69 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  tuition is.** th
1960: 61 74 20 74 68 69 73 20 6d 69 67 68 74 20 65 78  at this might ex
1970: 74 65 6e 64 20 74 68 72 6f 75 67 68 20 32 78 20  tend through 2x 
1980: 6f 72 20 34 78 20 74 68 65 20 70 61 67 65 73 69  or 4x the pagesi
1990: 7a 65 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 2a 2a 20 53  ze..**.**.**** S
19a0: 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f 72 20  egment interior 
19b0: 6e 6f 64 65 73 20 2a 2a 2a 2a 0a 2a 2a 20 53 65  nodes ****.** Se
19c0: 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e  gment interior n
19d0: 6f 64 65 73 20 73 74 6f 72 65 20 62 6c 6f 63 6b  odes store block
19e0: 69 64 73 20 66 6f 72 20 73 75 62 74 72 65 65 20  ids for subtree 
19f0: 6e 6f 64 65 73 20 61 6e 64 20 74 65 72 6d 73 0a  nodes and terms.
1a00: 2a 2a 20 74 6f 20 64 65 73 63 72 69 62 65 20 77  ** to describe w
1a10: 68 61 74 20 64 61 74 61 20 69 73 20 73 74 6f 72  hat data is stor
1a20: 65 64 20 62 79 20 74 68 65 20 65 61 63 68 20 73  ed by the each s
1a30: 75 62 74 72 65 65 2e 20 20 49 6e 74 65 72 69 6f  ubtree.  Interio
1a40: 72 0a 2a 2a 20 6e 6f 64 65 73 20 61 72 65 20 77  r.** nodes are w
1a50: 72 69 74 74 65 6e 20 75 73 69 6e 67 20 49 6e 74  ritten using Int
1a60: 65 72 69 6f 72 57 72 69 74 65 72 2c 20 61 6e 64  eriorWriter, and
1a70: 20 72 65 61 64 20 75 73 69 6e 67 0a 2a 2a 20 49   read using.** I
1a80: 6e 74 65 72 69 6f 72 52 65 61 64 65 72 2e 20 20  nteriorReader.  
1a90: 49 6e 74 65 72 69 6f 72 57 72 69 74 65 72 73 20  InteriorWriters 
1aa0: 61 72 65 20 63 72 65 61 74 65 64 20 61 73 20 6e  are created as n
1ab0: 65 65 64 65 64 20 77 68 65 6e 0a 2a 2a 20 53 65  eeded when.** Se
1ac0: 67 6d 65 6e 74 57 72 69 74 65 72 20 63 72 65 61  gmentWriter crea
1ad0: 74 65 73 20 6e 65 77 20 6c 65 61 66 20 6e 6f 64  tes new leaf nod
1ae0: 65 73 2c 20 6f 72 20 77 68 65 6e 20 61 6e 20 69  es, or when an i
1af0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 0a 2a 2a 20  nterior node.** 
1b00: 69 74 73 65 6c 66 20 67 72 6f 77 73 20 74 6f 6f  itself grows too
1b10: 20 62 69 67 20 61 6e 64 20 6d 75 73 74 20 62 65   big and must be
1b20: 20 73 70 6c 69 74 2e 20 20 54 68 65 20 66 6f 72   split.  The for
1b30: 6d 61 74 20 6f 66 20 69 6e 74 65 72 69 6f 72 0a  mat of interior.
1b40: 2a 2a 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ** nodes:.**.** 
1b50: 76 61 72 69 6e 74 20 69 48 65 69 67 68 74 3b 20  varint iHeight; 
1b60: 20 20 20 20 20 20 20 20 20 20 28 68 65 69 67 68            (heigh
1b70: 74 20 66 72 6f 6d 20 6c 65 61 66 20 6c 65 76 65  t from leaf leve
1b80: 6c 2c 20 61 6c 77 61 79 73 20 3e 30 29 0a 2a 2a  l, always >0).**
1b90: 20 76 61 72 69 6e 74 20 69 42 6c 6f 63 6b 69 64   varint iBlockid
1ba0: 3b 20 20 20 20 20 20 20 20 20 20 28 62 6c 6f 63  ;          (bloc
1bb0: 6b 20 69 64 20 6f 66 20 6e 6f 64 65 27 73 20 6c  k id of node's l
1bc0: 65 66 74 6d 6f 73 74 20 73 75 62 74 72 65 65 29  eftmost subtree)
1bd0: 0a 2a 2a 20 6f 70 74 69 6f 6e 61 6c 20 7b 0a 2a  .** optional {.*
1be0: 2a 20 20 20 76 61 72 69 6e 74 20 6e 54 65 72 6d  *   varint nTerm
1bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 6e  ;           (len
1c00: 67 74 68 20 6f 66 20 66 69 72 73 74 20 74 65 72  gth of first ter
1c10: 6d 29 0a 2a 2a 20 20 20 63 68 61 72 20 70 54 65  m).**   char pTe
1c20: 72 6d 5b 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20  rm[nTerm];      
1c30: 28 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73  (content of firs
1c40: 74 20 74 65 72 6d 29 0a 2a 2a 20 20 20 61 72 72  t term).**   arr
1c50: 61 79 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ay {.**         
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 28 66 75 72 74 68 65 72 20         (further 
1c80: 74 65 72 6d 73 20 61 72 65 20 64 65 6c 74 61 2d  terms are delta-
1c90: 65 6e 63 6f 64 65 64 29 0a 2a 2a 20 20 20 20 20  encoded).**     
1ca0: 76 61 72 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  varint nPrefix; 
1cb0: 20 20 20 20 20 20 20 20 20 20 20 28 6c 65 6e 67             (leng
1cc0: 74 68 20 6f 66 20 73 68 61 72 65 64 20 70 72 65  th of shared pre
1cd0: 66 69 78 20 77 69 74 68 20 70 72 65 76 69 6f 75  fix with previou
1ce0: 73 20 74 65 72 6d 29 0a 2a 2a 20 20 20 20 20 76  s term).**     v
1cf0: 61 72 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20  arint nSuffix;  
1d00: 20 20 20 20 20 20 20 20 20 20 28 6c 65 6e 67 74            (lengt
1d10: 68 20 6f 66 20 75 6e 73 68 61 72 65 64 20 73 75  h of unshared su
1d20: 66 66 69 78 29 0a 2a 2a 20 20 20 20 20 63 68 61  ffix).**     cha
1d30: 72 20 70 54 65 72 6d 53 75 66 66 69 78 5b 6e 53  r pTermSuffix[nS
1d40: 75 66 66 69 78 5d 3b 20 28 75 6e 73 68 61 72 65  uffix]; (unshare
1d50: 64 20 73 75 66 66 69 78 20 6f 66 20 6e 65 78 74  d suffix of next
1d60: 20 74 65 72 6d 29 0a 2a 2a 20 20 20 7d 0a 2a 2a   term).**   }.**
1d70: 20 7d 0a 2a 2a 0a 2a 2a 20 48 65 72 65 2c 20 6f   }.**.** Here, o
1d80: 70 74 69 6f 6e 61 6c 20 7b 20 58 20 7d 20 6d 65  ptional { X } me
1d90: 61 6e 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ans an optional 
1da0: 65 6c 65 6d 65 6e 74 2c 20 77 68 69 6c 65 20 61  element, while a
1db0: 72 72 61 79 20 7b 20 58 20 7d 0a 2a 2a 20 6d 65  rray { X }.** me
1dc0: 61 6e 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ans zero or more
1dd0: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
1de0: 58 2c 20 61 64 6a 61 63 65 6e 74 20 69 6e 20 6d  X, adjacent in m
1df0: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  emory..**.** An 
1e00: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 65 6e  interior node en
1e10: 63 6f 64 65 73 20 6e 20 74 65 72 6d 73 20 73 65  codes n terms se
1e20: 70 61 72 61 74 69 6e 67 20 6e 2b 31 20 73 75 62  parating n+1 sub
1e30: 74 72 65 65 73 2e 20 20 54 68 65 0a 2a 2a 20 73  trees.  The.** s
1e40: 75 62 74 72 65 65 20 62 6c 6f 63 6b 73 20 61 72  ubtree blocks ar
1e50: 65 20 63 6f 6e 74 69 67 75 6f 75 73 2c 20 73 6f  e contiguous, so
1e60: 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1e70: 73 75 62 74 72 65 65 27 73 20 62 6c 6f 63 6b 69  subtree's blocki
1e80: 64 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64 2e  d.** is encoded.
1e90: 20 20 54 68 65 20 73 75 62 74 72 65 65 20 61 74    The subtree at
1ea0: 20 69 42 6c 6f 63 6b 69 64 20 77 69 6c 6c 20 63   iBlockid will c
1eb0: 6f 6e 74 61 69 6e 20 61 6c 6c 20 74 65 72 6d 73  ontain all terms
1ec0: 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
1ed0: 65 20 66 69 72 73 74 20 74 65 72 6d 20 65 6e 63  e first term enc
1ee0: 6f 64 65 64 20 28 6f 72 20 61 6c 6c 20 74 65 72  oded (or all ter
1ef0: 6d 73 20 69 66 20 6e 6f 20 74 65 72 6d 20 69 73  ms if no term is
1f00: 20 65 6e 63 6f 64 65 64 29 2e 0a 2a 2a 20 4f 74   encoded)..** Ot
1f10: 68 65 72 77 69 73 65 2c 20 66 6f 72 20 74 65 72  herwise, for ter
1f20: 6d 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ms greater than 
1f30: 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 54 65 72  or equal to pTer
1f40: 6d 5b 69 5d 20 62 75 74 20 6c 65 73 73 0a 2a 2a  m[i] but less.**
1f50: 20 74 68 61 6e 20 70 54 65 72 6d 5b 69 2b 31 5d   than pTerm[i+1]
1f60: 2c 20 74 68 65 20 73 75 62 74 72 65 65 20 66 6f  , the subtree fo
1f70: 72 20 74 68 61 74 20 74 65 72 6d 20 77 69 6c 6c  r that term will
1f80: 20 62 65 20 72 6f 6f 74 65 64 20 61 74 0a 2a 2a   be rooted at.**
1f90: 20 69 42 6c 6f 63 6b 69 64 2b 69 2e 20 20 49 6e   iBlockid+i.  In
1fa0: 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 6f 6e 6c  terior nodes onl
1fb0: 79 20 73 74 6f 72 65 20 65 6e 6f 75 67 68 20 74  y store enough t
1fc0: 65 72 6d 20 64 61 74 61 20 74 6f 0a 2a 2a 20 64  erm data to.** d
1fd0: 69 73 74 69 6e 67 75 69 73 68 20 61 64 6a 61 63  istinguish adjac
1fe0: 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 28 69 66  ent children (if
1ff0: 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 74   the rightmost t
2000: 65 72 6d 20 6f 66 20 74 68 65 20 6c 65 66 74 0a  erm of the left.
2010: 2a 2a 20 63 68 69 6c 64 20 69 73 20 22 73 6f 6d  ** child is "som
2020: 65 74 68 69 6e 67 22 2c 20 61 6e 64 20 74 68 65  ething", and the
2030: 20 6c 65 66 74 6d 6f 73 74 20 74 65 72 6d 20 6f   leftmost term o
2040: 66 20 74 68 65 20 72 69 67 68 74 20 63 68 69 6c  f the right chil
2050: 64 20 69 73 0a 2a 2a 20 22 77 69 63 6b 65 64 22  d is.** "wicked"
2060: 2c 20 6f 6e 6c 79 20 22 77 22 20 69 73 20 73 74  , only "w" is st
2070: 6f 72 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 65 77  ored)..**.** New
2080: 20 64 61 74 61 20 69 73 20 73 70 69 6c 6c 65 64   data is spilled
2090: 20 74 6f 20 61 20 6e 65 77 20 69 6e 74 65 72 69   to a new interi
20a0: 6f 72 20 6e 6f 64 65 20 61 74 20 74 68 65 20 73  or node at the s
20b0: 61 6d 65 20 68 65 69 67 68 74 20 77 68 65 6e 0a  ame height when.
20c0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  ** the current n
20d0: 6f 64 65 20 65 78 63 65 65 64 73 20 49 4e 54 45  ode exceeds INTE
20e0: 52 49 4f 52 5f 4d 41 58 20 62 79 74 65 73 20 28  RIOR_MAX bytes (
20f0: 64 65 66 61 75 6c 74 20 32 30 34 38 29 2e 0a 2a  default 2048)..*
2100: 2a 20 49 4e 54 45 52 49 4f 52 5f 4d 49 4e 5f 54  * INTERIOR_MIN_T
2110: 45 52 4d 53 20 28 64 65 66 61 75 6c 74 20 37 29  ERMS (default 7)
2120: 20 6b 65 65 70 73 20 6c 61 72 67 65 20 74 65 72   keeps large ter
2130: 6d 73 20 66 72 6f 6d 20 6d 6f 6e 6f 70 6f 6c 69  ms from monopoli
2140: 7a 69 6e 67 0a 2a 2a 20 69 6e 74 65 72 69 6f 72  zing.** interior
2150: 20 6e 6f 64 65 73 20 61 6e 64 20 6d 61 6b 69 6e   nodes and makin
2160: 67 20 74 68 65 20 74 72 65 65 20 74 6f 6f 20 73  g the tree too s
2170: 6b 69 6e 6e 79 2e 20 20 54 68 65 20 69 6e 74 65  kinny.  The inte
2180: 72 69 6f 72 20 6e 6f 64 65 73 0a 2a 2a 20 61 74  rior nodes.** at
2190: 20 61 20 67 69 76 65 6e 20 68 65 69 67 68 74 20   a given height 
21a0: 61 72 65 20 6e 61 74 75 72 61 6c 6c 79 20 74 72  are naturally tr
21b0: 61 63 6b 65 64 20 62 79 20 69 6e 74 65 72 69 6f  acked by interio
21c0: 72 20 6e 6f 64 65 73 20 61 74 0a 2a 2a 20 68 65  r nodes at.** he
21d0: 69 67 68 74 2b 31 2c 20 61 6e 64 20 73 6f 20 6f  ight+1, and so o
21e0: 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 2a 2a 20 53 65  n..**.**.**** Se
21f0: 67 6d 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20  gment directory 
2200: 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 67 6d  ****.** The segm
2210: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 69 6e  ent directory in
2220: 20 74 61 62 6c 65 20 25 5f 73 65 67 64 69 72 20   table %_segdir 
2230: 73 74 6f 72 65 73 20 6d 65 74 61 2d 69 6e 66 6f  stores meta-info
2240: 72 6d 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d  rmation for.** m
2250: 65 72 67 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  erging and delet
2260: 69 6e 67 20 73 65 67 6d 65 6e 74 73 2c 20 61 6e  ing segments, an
2270: 64 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20  d also the root 
2280: 6e 6f 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 73  node of the.** s
2290: 65 67 6d 65 6e 74 27 73 20 74 72 65 65 2e 0a 2a  egment's tree..*
22a0: 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 6e 6f  *.** The root no
22b0: 64 65 20 69 73 20 74 68 65 20 74 6f 70 20 6e 6f  de is the top no
22c0: 64 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  de of the segmen
22d0: 74 27 73 20 74 72 65 65 20 61 66 74 65 72 20 65  t's tree after e
22e0: 6e 63 6f 64 69 6e 67 0a 2a 2a 20 74 68 65 20 65  ncoding.** the e
22f0: 6e 74 69 72 65 20 73 65 67 6d 65 6e 74 2c 20 72  ntire segment, r
2300: 65 73 74 72 69 63 74 65 64 20 74 6f 20 52 4f 4f  estricted to ROO
2310: 54 5f 4d 41 58 20 62 79 74 65 73 20 28 64 65 66  T_MAX bytes (def
2320: 61 75 6c 74 20 31 30 32 34 29 2e 0a 2a 2a 20 54  ault 1024)..** T
2330: 68 69 73 20 63 6f 75 6c 64 20 62 65 20 65 69 74  his could be eit
2340: 68 65 72 20 61 20 6c 65 61 66 20 6e 6f 64 65 20  her a leaf node 
2350: 6f 72 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 6e  or an interior n
2360: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 74 6f 70  ode.  If the top
2370: 0a 2a 2a 20 6e 6f 64 65 20 72 65 71 75 69 72 65  .** node require
2380: 73 20 6d 6f 72 65 20 74 68 61 6e 20 52 4f 4f 54  s more than ROOT
2390: 5f 4d 41 58 20 62 79 74 65 73 2c 20 69 74 20 69  _MAX bytes, it i
23a0: 73 20 66 6c 75 73 68 65 64 20 74 6f 20 25 5f 73  s flushed to %_s
23b0: 65 67 6d 65 6e 74 73 0a 2a 2a 20 61 6e 64 20 61  egments.** and a
23c0: 20 6e 65 77 20 72 6f 6f 74 20 69 6e 74 65 72 69   new root interi
23d0: 6f 72 20 6e 6f 64 65 20 69 73 20 67 65 6e 65 72  or node is gener
23e0: 61 74 65 64 20 28 77 68 69 63 68 20 73 68 6f 75  ated (which shou
23f0: 6c 64 20 61 6c 77 61 79 73 20 66 69 74 0a 2a 2a  ld always fit.**
2400: 20 77 69 74 68 69 6e 20 52 4f 4f 54 5f 4d 41 58   within ROOT_MAX
2410: 20 62 65 63 61 75 73 65 20 69 74 20 6f 6e 6c 79   because it only
2420: 20 6e 65 65 64 73 20 73 70 61 63 65 20 66 6f 72   needs space for
2430: 20 32 20 76 61 72 69 6e 74 73 2c 20 74 68 65 0a   2 varints, the.
2440: 2a 2a 20 68 65 69 67 68 74 20 61 6e 64 20 74 68  ** height and th
2450: 65 20 62 6c 6f 63 6b 69 64 20 6f 66 20 74 68 65  e blockid of the
2460: 20 70 72 65 76 69 6f 75 73 20 72 6f 6f 74 29 2e   previous root).
2470: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 65 74 61 2d  .**.** The meta-
2480: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
2490: 68 65 20 73 65 67 6d 65 6e 74 20 64 69 72 65 63  he segment direc
24a0: 74 6f 72 79 20 69 73 3a 0a 2a 2a 20 20 20 6c 65  tory is:.**   le
24b0: 76 65 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  vel             
24c0: 20 20 2d 20 73 65 67 6d 65 6e 74 20 6c 65 76 65    - segment leve
24d0: 6c 20 28 73 65 65 20 62 65 6c 6f 77 29 0a 2a 2a  l (see below).**
24e0: 20 20 20 69 64 78 20 20 20 20 20 20 20 20 20 20     idx          
24f0: 20 20 20 20 20 20 20 2d 20 69 6e 64 65 78 20 77         - index w
2500: 69 74 68 69 6e 20 6c 65 76 65 6c 0a 2a 2a 20 20  ithin level.**  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 20 20 20 2d 20 28 6c 65 76 65 6c 2c 69 64       - (level,id
2530: 78 20 75 6e 69 71 75 65 6c 79 20 69 64 65 6e 74  x uniquely ident
2540: 69 66 79 20 61 20 73 65 67 6d 65 6e 74 29 0a 2a  ify a segment).*
2550: 2a 20 20 20 73 74 61 72 74 5f 62 6c 6f 63 6b 20  *   start_block 
2560: 20 20 20 20 20 20 20 20 2d 20 66 69 72 73 74 20          - first 
2570: 6c 65 61 66 20 6e 6f 64 65 0a 2a 2a 20 20 20 6c  leaf node.**   l
2580: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20  eaves_end_block 
2590: 20 20 20 2d 20 6c 61 73 74 20 6c 65 61 66 20 6e     - last leaf n
25a0: 6f 64 65 0a 2a 2a 20 20 20 65 6e 64 5f 62 6c 6f  ode.**   end_blo
25b0: 63 6b 20 20 20 20 20 20 20 20 20 20 20 2d 20 6c  ck           - l
25c0: 61 73 74 20 62 6c 6f 63 6b 20 28 69 6e 63 6c 75  ast block (inclu
25d0: 64 69 6e 67 20 69 6e 74 65 72 69 6f 72 20 6e 6f  ding interior no
25e0: 64 65 73 29 0a 2a 2a 20 20 20 72 6f 6f 74 20 20  des).**   root  
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
2600: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 72 6f 6f 74  contents of root
2610: 20 6e 6f 64 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74   node.**.** If t
2620: 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 69 73 20  he root node is 
2630: 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 74 68 65  a leaf node, the
2640: 6e 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 0a 2a  n start_block,.*
2650: 2a 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f  * leaves_end_blo
2660: 63 6b 2c 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63  ck, and end_bloc
2670: 6b 20 61 72 65 20 61 6c 6c 20 30 2e 0a 2a 2a 0a  k are all 0..**.
2680: 2a 2a 0a 2a 2a 2a 2a 20 53 65 67 6d 65 6e 74 20  **.**** Segment 
2690: 6d 65 72 67 69 6e 67 20 2a 2a 2a 2a 0a 2a 2a 20  merging ****.** 
26a0: 54 6f 20 61 6d 6f 72 74 69 7a 65 20 75 70 64 61  To amortize upda
26b0: 74 65 20 63 6f 73 74 73 2c 20 73 65 67 6d 65 6e  te costs, segmen
26c0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
26d0: 6e 74 6f 20 6c 65 76 65 6c 73 20 61 6e 64 0a 2a  nto levels and.*
26e0: 2a 20 6d 65 72 67 65 64 20 69 6e 20 62 61 74 63  * merged in batc
26f0: 68 65 73 2e 20 20 45 61 63 68 20 69 6e 63 72 65  hes.  Each incre
2700: 61 73 65 20 69 6e 20 6c 65 76 65 6c 20 72 65 70  ase in level rep
2710: 72 65 73 65 6e 74 73 20 65 78 70 6f 6e 65 6e 74  resents exponent
2720: 69 61 6c 6c 79 0a 2a 2a 20 6d 6f 72 65 20 64 6f  ially.** more do
2730: 63 75 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 4e  cuments..**.** N
2740: 65 77 20 64 6f 63 75 6d 65 6e 74 73 20 28 61 63  ew documents (ac
2750: 74 75 61 6c 6c 79 2c 20 64 6f 63 75 6d 65 6e 74  tually, document
2760: 20 75 70 64 61 74 65 73 29 20 61 72 65 20 74 6f   updates) are to
2770: 6b 65 6e 69 7a 65 64 20 61 6e 64 0a 2a 2a 20 77  kenized and.** w
2780: 72 69 74 74 65 6e 20 69 6e 64 69 76 69 64 75 61  ritten individua
2790: 6c 6c 79 20 28 75 73 69 6e 67 20 4c 65 61 66 57  lly (using LeafW
27a0: 72 69 74 65 72 29 20 74 6f 20 61 20 6c 65 76 65  riter) to a leve
27b0: 6c 20 30 20 73 65 67 6d 65 6e 74 2c 20 77 69 74  l 0 segment, wit
27c0: 68 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 69 6e  h.** incrementin
27d0: 67 20 69 64 78 2e 20 20 57 68 65 6e 20 69 64 78  g idx.  When idx
27e0: 20 72 65 61 63 68 65 73 20 4d 45 52 47 45 5f 43   reaches MERGE_C
27f0: 4f 55 4e 54 20 28 64 65 66 61 75 6c 74 20 31 36  OUNT (default 16
2800: 29 2c 20 61 6c 6c 0a 2a 2a 20 6c 65 76 65 6c 20  ), all.** level 
2810: 30 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6d  0 segments are m
2820: 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  erged into a sin
2830: 67 6c 65 20 6c 65 76 65 6c 20 31 20 73 65 67 6d  gle level 1 segm
2840: 65 6e 74 2e 20 20 4c 65 76 65 6c 20 31 0a 2a 2a  ent.  Level 1.**
2850: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 69   is populated li
2860: 6b 65 20 6c 65 76 65 6c 20 30 2c 20 61 6e 64 20  ke level 0, and 
2870: 65 76 65 6e 74 75 61 6c 6c 79 20 4d 45 52 47 45  eventually MERGE
2880: 5f 43 4f 55 4e 54 20 6c 65 76 65 6c 20 31 0a 2a  _COUNT level 1.*
2890: 2a 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6d  * segments are m
28a0: 65 72 67 65 64 20 74 6f 20 61 20 73 69 6e 67 6c  erged to a singl
28b0: 65 20 6c 65 76 65 6c 20 32 20 73 65 67 6d 65 6e  e level 2 segmen
28c0: 74 20 28 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  t (representing.
28d0: 2a 2a 20 4d 45 52 47 45 5f 43 4f 55 4e 54 5e 32  ** MERGE_COUNT^2
28e0: 20 75 70 64 61 74 65 73 29 2c 20 61 6e 64 20 73   updates), and s
28f0: 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 65  o on..**.** A se
2900: 67 6d 65 6e 74 20 6d 65 72 67 65 20 74 72 61 76  gment merge trav
2910: 65 72 73 65 73 20 61 6c 6c 20 73 65 67 6d 65 6e  erses all segmen
2920: 74 73 20 61 74 20 61 20 67 69 76 65 6e 20 6c 65  ts at a given le
2930: 76 65 6c 20 69 6e 0a 2a 2a 20 70 61 72 61 6c 6c  vel in.** parall
2940: 65 6c 2c 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  el, performing a
2950: 20 73 74 72 61 69 67 68 74 66 6f 72 77 61 72 64   straightforward
2960: 20 73 6f 72 74 65 64 20 6d 65 72 67 65 2e 20 20   sorted merge.  
2970: 53 69 6e 63 65 20 73 65 67 6d 65 6e 74 0a 2a 2a  Since segment.**
2980: 20 6c 65 61 66 20 6e 6f 64 65 73 20 61 72 65 20   leaf nodes are 
2990: 77 72 69 74 74 65 6e 20 69 6e 20 74 6f 20 74 68  written in to th
29a0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62  e %_segments tab
29b0: 6c 65 20 69 6e 20 6f 72 64 65 72 2c 20 74 68 69  le in order, thi
29c0: 73 0a 2a 2a 20 6d 65 72 67 65 20 74 72 61 76 65  s.** merge trave
29d0: 72 73 65 73 20 74 68 65 20 75 6e 64 65 72 6c 79  rses the underly
29e0: 69 6e 67 20 73 71 6c 69 74 65 20 64 69 73 6b 20  ing sqlite disk 
29f0: 73 74 72 75 63 74 75 72 65 73 20 65 66 66 69 63  structures effic
2a00: 69 65 6e 74 6c 79 2e 0a 2a 2a 20 41 66 74 65 72  iently..** After
2a10: 20 74 68 65 20 6d 65 72 67 65 2c 20 61 6c 6c 20   the merge, all 
2a20: 73 65 67 6d 65 6e 74 20 62 6c 6f 63 6b 73 20 66  segment blocks f
2a30: 72 6f 6d 20 74 68 65 20 6d 65 72 67 65 64 20 6c  rom the merged l
2a40: 65 76 65 6c 20 61 72 65 0a 2a 2a 20 64 65 6c 65  evel are.** dele
2a50: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4d 45 52 47 45  ted..**.** MERGE
2a60: 5f 43 4f 55 4e 54 20 63 6f 6e 74 72 6f 6c 73 20  _COUNT controls 
2a70: 68 6f 77 20 6f 66 74 65 6e 20 77 65 20 6d 65 72  how often we mer
2a80: 67 65 20 73 65 67 6d 65 6e 74 73 2e 20 20 31 36  ge segments.  16
2a90: 20 73 65 65 6d 73 20 74 6f 20 62 65 0a 2a 2a 20   seems to be.** 
2aa0: 73 6f 6d 65 77 68 61 74 20 6f 66 20 61 20 73 77  somewhat of a sw
2ab0: 65 65 74 20 73 70 6f 74 20 66 6f 72 20 69 6e 73  eet spot for ins
2ac0: 65 72 74 69 6f 6e 20 70 65 72 66 6f 72 6d 61 6e  ertion performan
2ad0: 63 65 2e 20 20 33 32 20 61 6e 64 20 36 34 20 73  ce.  32 and 64 s
2ae0: 68 6f 77 0a 2a 2a 20 76 65 72 79 20 73 69 6d 69  how.** very simi
2af0: 6c 61 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  lar performance 
2b00: 6e 75 6d 62 65 72 73 20 74 6f 20 31 36 20 6f 6e  numbers to 16 on
2b10: 20 69 6e 73 65 72 74 69 6f 6e 2c 20 74 68 6f 75   insertion, thou
2b20: 67 68 20 74 68 65 79 27 72 65 0a 2a 2a 20 61 20  gh they're.** a 
2b30: 74 69 6e 79 20 62 69 74 20 73 6c 6f 77 65 72 20  tiny bit slower 
2b40: 28 70 65 72 68 61 70 73 20 64 75 65 20 74 6f 20  (perhaps due to 
2b50: 6d 6f 72 65 20 6f 76 65 72 68 65 61 64 20 69 6e  more overhead in
2b60: 20 6d 65 72 67 65 2d 74 69 6d 65 0a 2a 2a 20 73   merge-time.** s
2b70: 6f 72 74 69 6e 67 29 2e 20 20 38 20 69 73 20 61  orting).  8 is a
2b80: 62 6f 75 74 20 32 30 25 20 73 6c 6f 77 65 72 20  bout 20% slower 
2b90: 74 68 61 6e 20 31 36 2c 20 34 20 61 62 6f 75 74  than 16, 4 about
2ba0: 20 35 30 25 20 73 6c 6f 77 65 72 20 74 68 61 6e   50% slower than
2bb0: 0a 2a 2a 20 31 36 2c 20 32 20 61 62 6f 75 74 20  .** 16, 2 about 
2bc0: 36 36 25 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  66% slower than 
2bd0: 31 36 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 71 75 65  16..**.** At que
2be0: 72 79 20 74 69 6d 65 2c 20 68 69 67 68 20 4d 45  ry time, high ME
2bf0: 52 47 45 5f 43 4f 55 4e 54 20 69 6e 63 72 65 61  RGE_COUNT increa
2c00: 73 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ses the number o
2c10: 66 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 77 68  f segments.** wh
2c20: 69 63 68 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ich need to be s
2c30: 63 61 6e 6e 65 64 20 61 6e 64 20 6d 65 72 67 65  canned and merge
2c40: 64 2e 20 20 46 6f 72 20 69 6e 73 74 61 6e 63 65  d.  For instance
2c50: 2c 20 77 69 74 68 20 31 30 30 6b 20 64 6f 63 73  , with 100k docs
2c60: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 3a 0a 2a 2a  .** inserted:.**
2c70: 0a 2a 2a 20 20 20 20 4d 45 52 47 45 5f 43 4f 55  .**    MERGE_COU
2c80: 4e 54 20 20 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  NT   segments.**
2c90: 20 20 20 20 20 20 20 31 36 20 20 20 20 20 20 20         16       
2ca0: 20 20 20 20 32 35 0a 2a 2a 20 20 20 20 20 20 20      25.**       
2cb0: 20 38 20 20 20 20 20 20 20 20 20 20 20 31 32 0a   8           12.
2cc0: 2a 2a 20 20 20 20 20 20 20 20 34 20 20 20 20 20  **        4     
2cd0: 20 20 20 20 20 20 31 30 0a 2a 2a 20 20 20 20 20        10.**     
2ce0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
2cf0: 36 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 70 70  6.**.** This app
2d00: 65 61 72 73 20 74 6f 20 68 61 76 65 20 6f 6e 6c  ears to have onl
2d10: 79 20 61 20 6d 6f 64 65 72 61 74 65 20 69 6d 70  y a moderate imp
2d20: 61 63 74 20 6f 6e 20 71 75 65 72 69 65 73 20 66  act on queries f
2d30: 6f 72 20 76 65 72 79 0a 2a 2a 20 66 72 65 71 75  or very.** frequ
2d40: 65 6e 74 20 74 65 72 6d 73 20 28 77 68 69 63 68  ent terms (which
2d50: 20 61 72 65 20 73 6f 6d 65 77 68 61 74 20 64 6f   are somewhat do
2d60: 6d 69 6e 61 74 65 64 20 62 79 20 73 65 67 6d 65  minated by segme
2d70: 6e 74 20 6d 65 72 67 65 0a 2a 2a 20 63 6f 73 74  nt merge.** cost
2d80: 73 29 2c 20 61 6e 64 20 69 6e 66 72 65 71 75 65  s), and infreque
2d90: 6e 74 20 61 6e 64 20 6e 6f 6e 2d 65 78 69 73 74  nt and non-exist
2da0: 65 6e 74 20 74 65 72 6d 73 20 73 74 69 6c 6c 20  ent terms still 
2db0: 73 65 65 6d 20 74 6f 20 62 65 20 66 61 73 74 0a  seem to be fast.
2dc0: 2a 2a 20 65 76 65 6e 20 77 69 74 68 20 6d 61 6e  ** even with man
2dd0: 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  y segments..**.*
2de0: 2a 20 54 4f 44 4f 28 73 68 65 73 73 29 20 54 68  * TODO(shess) Th
2df0: 61 74 20 73 61 69 64 2c 20 69 74 20 77 6f 75 6c  at said, it woul
2e00: 64 20 62 65 20 6e 69 63 65 20 74 6f 20 68 61 76  d be nice to hav
2e10: 65 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  e a better query
2e20: 2d 73 69 64 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  -side.** argumen
2e30: 74 20 66 6f 72 20 4d 45 52 47 45 5f 43 4f 55 4e  t for MERGE_COUN
2e40: 54 20 6f 66 20 31 36 2e 20 20 41 6c 73 6f 2c 20  T of 16.  Also, 
2e50: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 2f 6c  it is possible/l
2e60: 69 6b 65 6c 79 20 74 68 61 74 0a 2a 2a 20 6f 70  ikely that.** op
2e70: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 74  timizations to t
2e80: 68 69 6e 67 73 20 6c 69 6b 65 20 64 6f 63 6c 69  hings like docli
2e90: 73 74 20 6d 65 72 67 69 6e 67 20 77 69 6c 6c 20  st merging will 
2ea0: 73 77 69 6e 67 20 74 68 65 20 73 77 65 65 74 0a  swing the sweet.
2eb0: 2a 2a 20 73 70 6f 74 20 61 72 6f 75 6e 64 2e 0a  ** spot around..
2ec0: 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a 2a 2a 2a 20 48 61  **.**.**.**** Ha
2ed0: 6e 64 6c 69 6e 67 20 6f 66 20 64 65 6c 65 74 69  ndling of deleti
2ee0: 6f 6e 73 20 61 6e 64 20 75 70 64 61 74 65 73 20  ons and updates 
2ef0: 2a 2a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 77 65  ****.** Since we
2f00: 27 72 65 20 75 73 69 6e 67 20 61 20 73 65 67 6d  're using a segm
2f10: 65 6e 74 65 64 20 73 74 72 75 63 74 75 72 65 2c  ented structure,
2f20: 20 77 69 74 68 20 6e 6f 20 64 6f 63 69 64 2d 6f   with no docid-o
2f30: 72 69 65 6e 74 65 64 0a 2a 2a 20 69 6e 64 65 78  riented.** index
2f40: 20 69 6e 74 6f 20 74 68 65 20 74 65 72 6d 20 69   into the term i
2f50: 6e 64 65 78 2c 20 77 65 20 63 6c 65 61 72 6c 79  ndex, we clearly
2f60: 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 75   cannot simply u
2f70: 70 64 61 74 65 20 74 68 65 20 74 65 72 6d 0a 2a  pdate the term.*
2f80: 2a 20 69 6e 64 65 78 20 77 68 65 6e 20 61 20 64  * index when a d
2f90: 6f 63 75 6d 65 6e 74 20 69 73 20 64 65 6c 65 74  ocument is delet
2fa0: 65 64 20 6f 72 20 75 70 64 61 74 65 64 2e 20 20  ed or updated.  
2fb0: 46 6f 72 20 64 65 6c 65 74 69 6f 6e 73 2c 20 77  For deletions, w
2fc0: 65 0a 2a 2a 20 77 72 69 74 65 20 61 6e 20 65 6d  e.** write an em
2fd0: 70 74 79 20 64 6f 63 6c 69 73 74 20 28 76 61 72  pty doclist (var
2fe0: 69 6e 74 28 64 6f 63 69 64 29 20 76 61 72 69 6e  int(docid) varin
2ff0: 74 28 50 4f 53 5f 45 4e 44 29 29 2c 20 66 6f 72  t(POS_END)), for
3000: 20 75 70 64 61 74 65 73 0a 2a 2a 20 77 65 20 73   updates.** we s
3010: 69 6d 70 6c 79 20 77 72 69 74 65 20 74 68 65 20  imply write the 
3020: 6e 65 77 20 64 6f 63 6c 69 73 74 2e 20 20 53 65  new doclist.  Se
3030: 67 6d 65 6e 74 20 6d 65 72 67 65 73 20 6f 76 65  gment merges ove
3040: 72 77 72 69 74 65 20 6f 6c 64 65 72 0a 2a 2a 20  rwrite older.** 
3050: 64 61 74 61 20 66 6f 72 20 61 20 70 61 72 74 69  data for a parti
3060: 63 75 6c 61 72 20 64 6f 63 69 64 20 77 69 74 68  cular docid with
3070: 20 6e 65 77 65 72 20 64 61 74 61 2c 20 73 6f 20   newer data, so 
3080: 64 65 6c 65 74 65 73 20 6f 72 20 75 70 64 61 74  deletes or updat
3090: 65 73 0a 2a 2a 20 77 69 6c 6c 20 65 76 65 6e 74  es.** will event
30a0: 75 61 6c 6c 79 20 6f 76 65 72 74 61 6b 65 20 74  ually overtake t
30b0: 68 65 20 65 61 72 6c 69 65 72 20 64 61 74 61 20  he earlier data 
30c0: 61 6e 64 20 6b 6e 6f 63 6b 20 69 74 20 6f 75 74  and knock it out
30d0: 2e 20 20 54 68 65 0a 2a 2a 20 71 75 65 72 79 20  .  The.** query 
30e0: 6c 6f 67 69 63 20 6c 69 6b 65 77 69 73 65 20 6d  logic likewise m
30f0: 65 72 67 65 73 20 64 6f 63 6c 69 73 74 73 20 73  erges doclists s
3100: 6f 20 74 68 61 74 20 6e 65 77 65 72 20 64 61 74  o that newer dat
3110: 61 20 6b 6e 6f 63 6b 73 20 6f 75 74 0a 2a 2a 20  a knocks out.** 
3120: 6f 6c 64 65 72 20 64 61 74 61 2e 0a 2a 2f 0a 0a  older data..*/..
3130: 23 69 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e  #include "fts3In
3140: 74 2e 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65  t.h".#if !define
3150: 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
3160: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
3170: 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23  _ENABLE_FTS3)..#
3180: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3190: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26  E_ENABLE_FTS3) &
31a0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
31b0: 45 5f 43 4f 52 45 29 0a 23 20 64 65 66 69 6e 65  E_CORE).# define
31c0: 20 53 51 4c 49 54 45 5f 43 4f 52 45 20 31 0a 23   SQLITE_CORE 1.#
31d0: 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20  endif..#include 
31e0: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
31f0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
3200: 69 6e 63 6c 75 64 65 20 3c 73 74 64 64 65 66 2e  include <stddef.
3210: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
3220: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
3230: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
3240: 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 23  de <stdarg.h>..#
3250: 69 6e 63 6c 75 64 65 20 22 66 74 73 33 2e 68 22  include "fts3.h"
3260: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3270: 43 4f 52 45 20 0a 23 20 69 6e 63 6c 75 64 65 20  CORE .# include 
3280: 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20  "sqlite3ext.h". 
3290: 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f   SQLITE_EXTENSIO
32a0: 4e 5f 49 4e 49 54 31 0a 23 65 6e 64 69 66 0a 0a  N_INIT1.#endif..
32b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
32c0: 76 61 6c 4e 65 78 74 28 46 74 73 33 43 75 72 73  valNext(Fts3Curs
32d0: 6f 72 20 2a 70 43 73 72 29 3b 0a 73 74 61 74 69  or *pCsr);.stati
32e0: 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 53 74  c int fts3EvalSt
32f0: 61 72 74 28 46 74 73 33 43 75 72 73 6f 72 20 2a  art(Fts3Cursor *
3300: 70 43 73 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  pCsr);.static in
3310: 74 20 66 74 73 33 54 65 72 6d 53 65 67 52 65 61  t fts3TermSegRea
3320: 64 65 72 43 75 72 73 6f 72 28 0a 20 20 20 20 46  derCursor(.    F
3330: 74 73 33 43 75 72 73 6f 72 20 2a 2c 20 63 6f 6e  ts3Cursor *, con
3340: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  st char *, int, 
3350: 69 6e 74 2c 20 46 74 73 33 4d 75 6c 74 69 53 65  int, Fts3MultiSe
3360: 67 52 65 61 64 65 72 20 2a 2a 29 3b 0a 0a 23 69  gReader **);..#i
3370: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
3380: 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 69 66 20 64  LGAMATION.# if d
3390: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
33a0: 42 55 47 29 0a 69 6e 74 20 73 71 6c 69 74 65 33  BUG).int sqlite3
33b0: 46 74 73 33 41 6c 77 61 79 73 28 69 6e 74 20 62  Fts3Always(int b
33c0: 29 20 7b 20 61 73 73 65 72 74 28 20 62 20 29 3b  ) { assert( b );
33d0: 20 72 65 74 75 72 6e 20 62 3b 20 7d 0a 69 6e 74   return b; }.int
33e0: 20 73 71 6c 69 74 65 33 46 74 73 33 4e 65 76 65   sqlite3Fts3Neve
33f0: 72 28 69 6e 74 20 62 29 20 20 7b 20 61 73 73 65  r(int b)  { asse
3400: 72 74 28 20 21 62 20 29 3b 20 72 65 74 75 72 6e  rt( !b ); return
3410: 20 62 3b 20 7d 0a 23 20 65 6e 64 69 66 0a 23 65   b; }.# endif.#e
3420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
3430: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
3440: 20 74 6f 20 66 61 6c 73 65 20 77 68 65 6e 20 72   to false when r
3450: 75 6e 6e 69 6e 67 20 74 65 73 74 73 20 66 6f 72  unning tests for
3460: 20 77 68 69 63 68 20 74 68 65 20 6f 6e 20 64 69   which the on di
3470: 73 6b 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73  sk.** structures
3480: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
3490: 6f 72 72 75 70 74 2e 20 4f 74 68 65 72 77 69 73  orrupt. Otherwis
34a0: 65 2c 20 74 72 75 65 2e 20 49 66 20 69 74 20 69  e, true. If it i
34b0: 73 20 66 61 6c 73 65 2c 20 65 78 74 72 61 0a 2a  s false, extra.*
34c0: 2a 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69  * assert() condi
34d0: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 74 73  tions in the fts
34e0: 33 20 63 6f 64 65 20 61 72 65 20 61 63 74 69 76  3 code are activ
34f0: 61 74 65 64 20 2d 20 63 6f 6e 64 69 74 69 6f 6e  ated - condition
3500: 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 6f 6e  s that are.** on
3510: 6c 79 20 74 72 75 65 20 69 66 20 69 74 20 69 73  ly true if it is
3520: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
3530: 20 74 68 65 20 66 74 73 33 20 64 61 74 61 62 61   the fts3 databa
3540: 73 65 20 69 73 20 6e 6f 74 20 63 6f 72 72 75 70  se is not corrup
3550: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
3560: 33 5f 66 74 73 33 5f 6d 61 79 5f 62 65 5f 63 6f  3_fts3_may_be_co
3570: 72 72 75 70 74 20 3d 20 31 3b 0a 0a 2f 2a 20 0a  rrupt = 1;../* .
3580: 2a 2a 20 57 72 69 74 65 20 61 20 36 34 2d 62 69  ** Write a 64-bi
3590: 74 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  t variable-lengt
35a0: 68 20 69 6e 74 65 67 65 72 20 74 6f 20 6d 65 6d  h integer to mem
35b0: 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61 74 20  ory starting at 
35c0: 70 5b 30 5d 2e 0a 2a 2a 20 54 68 65 20 6c 65 6e  p[0]..** The len
35d0: 67 74 68 20 6f 66 20 64 61 74 61 20 77 72 69 74  gth of data writ
35e0: 74 65 6e 20 77 69 6c 6c 20 62 65 20 62 65 74 77  ten will be betw
35f0: 65 65 6e 20 31 20 61 6e 64 20 46 54 53 33 5f 56  een 1 and FTS3_V
3600: 41 52 49 4e 54 5f 4d 41 58 20 62 79 74 65 73 2e  ARINT_MAX bytes.
3610: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
3620: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
3630: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
3640: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 50  int sqlite3Fts3P
3650: 75 74 56 61 72 69 6e 74 28 63 68 61 72 20 2a 70  utVarint(char *p
3660: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 76  , sqlite_int64 v
3670: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
3680: 61 72 20 2a 71 20 3d 20 28 75 6e 73 69 67 6e 65  ar *q = (unsigne
3690: 64 20 63 68 61 72 20 2a 29 20 70 3b 0a 20 20 73  d char *) p;.  s
36a0: 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 76 75 20  qlite_uint64 vu 
36b0: 3d 20 76 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 2a  = v;.  do{.    *
36c0: 71 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  q++ = (unsigned 
36d0: 63 68 61 72 29 20 28 28 76 75 20 26 20 30 78 37  char) ((vu & 0x7
36e0: 66 29 20 7c 20 30 78 38 30 29 3b 0a 20 20 20 20  f) | 0x80);.    
36f0: 76 75 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69  vu >>= 7;.  }whi
3700: 6c 65 28 20 76 75 21 3d 30 20 29 3b 0a 20 20 71  le( vu!=0 );.  q
3710: 5b 2d 31 5d 20 26 3d 20 30 78 37 66 3b 20 20 2f  [-1] &= 0x7f;  /
3720: 2a 20 74 75 72 6e 20 6f 66 66 20 68 69 67 68 20  * turn off high 
3730: 62 69 74 20 69 6e 20 66 69 6e 61 6c 20 62 79 74  bit in final byt
3740: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 71  e */.  assert( q
3750: 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   - (unsigned cha
3760: 72 20 2a 29 70 20 3c 3d 20 46 54 53 33 5f 56 41  r *)p <= FTS3_VA
3770: 52 49 4e 54 5f 4d 41 58 20 29 3b 0a 20 20 72 65  RINT_MAX );.  re
3780: 74 75 72 6e 20 28 69 6e 74 29 20 28 71 20 2d 20  turn (int) (q - 
3790: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
37a0: 29 70 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  )p);.}..#define 
37b0: 47 45 54 56 41 52 49 4e 54 5f 53 54 45 50 28 76  GETVARINT_STEP(v
37c0: 2c 20 70 74 72 2c 20 73 68 69 66 74 2c 20 6d 61  , ptr, shift, ma
37d0: 73 6b 31 2c 20 6d 61 73 6b 32 2c 20 76 61 72 2c  sk1, mask2, var,
37e0: 20 72 65 74 29 20 5c 0a 20 20 76 20 3d 20 28 76   ret) \.  v = (v
37f0: 20 26 20 6d 61 73 6b 31 29 20 7c 20 28 20 28 2a   & mask1) | ( (*
3800: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
3810: 63 68 61 72 2a 29 28 70 74 72 2b 2b 29 29 20 3c  char*)(ptr++)) <
3820: 3c 20 73 68 69 66 74 20 29 3b 20 20 5c 0a 20 20  < shift );  \.  
3830: 69 66 28 20 28 76 20 26 20 6d 61 73 6b 32 29 3d  if( (v & mask2)=
3840: 3d 30 20 29 7b 20 76 61 72 20 3d 20 76 3b 20 72  =0 ){ var = v; r
3850: 65 74 75 72 6e 20 72 65 74 3b 20 7d 0a 23 64 65  eturn ret; }.#de
3860: 66 69 6e 65 20 47 45 54 56 41 52 49 4e 54 5f 49  fine GETVARINT_I
3870: 4e 49 54 28 76 2c 20 70 74 72 2c 20 73 68 69 66  NIT(v, ptr, shif
3880: 74 2c 20 6d 61 73 6b 31 2c 20 6d 61 73 6b 32 2c  t, mask1, mask2,
3890: 20 76 61 72 2c 20 72 65 74 29 20 5c 0a 20 20 76   var, ret) \.  v
38a0: 20 3d 20 28 2a 70 74 72 2b 2b 29 3b 20 20 20 20   = (*ptr++);    
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
38e0: 66 28 20 28 76 20 26 20 6d 61 73 6b 32 29 3d 3d  f( (v & mask2)==
38f0: 30 20 29 7b 20 76 61 72 20 3d 20 76 3b 20 72 65  0 ){ var = v; re
3900: 74 75 72 6e 20 72 65 74 3b 20 7d 0a 0a 2f 2a 20  turn ret; }../* 
3910: 0a 2a 2a 20 52 65 61 64 20 61 20 36 34 2d 62 69  .** Read a 64-bi
3920: 74 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e 67 74  t variable-lengt
3930: 68 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 6d  h integer from m
3940: 65 6d 6f 72 79 20 73 74 61 72 74 69 6e 67 20 61  emory starting a
3950: 74 20 70 5b 30 5d 2e 0a 2a 2a 20 52 65 74 75 72  t p[0]..** Retur
3960: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3970: 62 79 74 65 73 20 72 65 61 64 2c 20 6f 72 20 30  bytes read, or 0
3980: 20 6f 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68   on error..** Th
3990: 65 20 76 61 6c 75 65 20 69 73 20 73 74 6f 72 65  e value is store
39a0: 64 20 69 6e 20 2a 76 2e 0a 2a 2f 0a 69 6e 74 20  d in *v..*/.int 
39b0: 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
39c0: 72 69 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20  rint(const char 
39d0: 2a 70 42 75 66 2c 20 73 71 6c 69 74 65 5f 69 6e  *pBuf, sqlite_in
39e0: 74 36 34 20 2a 76 29 7b 0a 20 20 63 6f 6e 73 74  t64 *v){.  const
39f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
3a00: 70 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  p = (const unsig
3a10: 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 3b 0a  ned char*)pBuf;.
3a20: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
3a30: 20 63 68 61 72 20 2a 70 53 74 61 72 74 20 3d 20   char *pStart = 
3a40: 70 3b 0a 20 20 75 33 32 20 61 3b 0a 20 20 75 36  p;.  u32 a;.  u6
3a50: 34 20 62 3b 0a 20 20 69 6e 74 20 73 68 69 66 74  4 b;.  int shift
3a60: 3b 0a 0a 20 20 47 45 54 56 41 52 49 4e 54 5f 49  ;..  GETVARINT_I
3a70: 4e 49 54 28 61 2c 20 70 2c 20 30 2c 20 20 30 78  NIT(a, p, 0,  0x
3a80: 30 30 2c 20 20 20 20 20 30 78 38 30 2c 20 2a 76  00,     0x80, *v
3a90: 2c 20 31 29 3b 0a 20 20 47 45 54 56 41 52 49 4e  , 1);.  GETVARIN
3aa0: 54 5f 53 54 45 50 28 61 2c 20 70 2c 20 37 2c 20  T_STEP(a, p, 7, 
3ab0: 20 30 78 37 46 2c 20 20 20 20 20 30 78 34 30 30   0x7F,     0x400
3ac0: 30 2c 20 2a 76 2c 20 32 29 3b 0a 20 20 47 45 54  0, *v, 2);.  GET
3ad0: 56 41 52 49 4e 54 5f 53 54 45 50 28 61 2c 20 70  VARINT_STEP(a, p
3ae0: 2c 20 31 34 2c 20 30 78 33 46 46 46 2c 20 20 20  , 14, 0x3FFF,   
3af0: 30 78 32 30 30 30 30 30 2c 20 2a 76 2c 20 33 29  0x200000, *v, 3)
3b00: 3b 0a 20 20 47 45 54 56 41 52 49 4e 54 5f 53 54  ;.  GETVARINT_ST
3b10: 45 50 28 61 2c 20 70 2c 20 32 31 2c 20 30 78 31  EP(a, p, 21, 0x1
3b20: 46 46 46 46 46 2c 20 30 78 31 30 30 30 30 30 30  FFFFF, 0x1000000
3b30: 30 2c 20 2a 76 2c 20 34 29 3b 0a 20 20 62 20 3d  0, *v, 4);.  b =
3b40: 20 28 61 20 26 20 30 78 30 46 46 46 46 46 46 46   (a & 0x0FFFFFFF
3b50: 20 29 3b 0a 0a 20 20 66 6f 72 28 73 68 69 66 74   );..  for(shift
3b60: 3d 32 38 3b 20 73 68 69 66 74 3c 3d 36 33 3b 20  =28; shift<=63; 
3b70: 73 68 69 66 74 2b 3d 37 29 7b 0a 20 20 20 20 75  shift+=7){.    u
3b80: 36 34 20 63 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20  64 c = *p++;.   
3b90: 20 62 20 2b 3d 20 28 63 26 30 78 37 46 29 20 3c   b += (c&0x7F) <
3ba0: 3c 20 73 68 69 66 74 3b 0a 20 20 20 20 69 66 28  < shift;.    if(
3bb0: 20 28 63 20 26 20 30 78 38 30 29 3d 3d 30 20 29   (c & 0x80)==0 )
3bc0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 76   break;.  }.  *v
3bd0: 20 3d 20 62 3b 0a 20 20 72 65 74 75 72 6e 20 28   = b;.  return (
3be0: 69 6e 74 29 28 70 20 2d 20 70 53 74 61 72 74 29  int)(p - pStart)
3bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c  ;.}../*.** Simil
3c00: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ar to sqlite3Fts
3c10: 33 47 65 74 56 61 72 69 6e 74 28 29 2c 20 65 78  3GetVarint(), ex
3c20: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6f 75  cept that the ou
3c30: 74 70 75 74 20 69 73 20 74 72 75 6e 63 61 74 65  tput is truncate
3c40: 64 20 74 6f 20 0a 2a 2a 20 61 20 6e 6f 6e 2d 6e  d to .** a non-n
3c50: 65 67 61 74 69 76 65 20 33 32 2d 62 69 74 20 69  egative 32-bit i
3c60: 6e 74 65 67 65 72 20 62 65 66 6f 72 65 20 69 74  nteger before it
3c70: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
3c80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
3c90: 47 65 74 56 61 72 69 6e 74 33 32 28 63 6f 6e 73  GetVarint32(cons
3ca0: 74 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 2a  t char *p, int *
3cb0: 70 69 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  pi){.  const uns
3cc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20  igned char *ptr 
3cd0: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
3ce0: 64 20 63 68 61 72 2a 29 70 3b 0a 20 20 75 33 32  d char*)p;.  u32
3cf0: 20 61 3b 0a 0a 23 69 66 6e 64 65 66 20 66 74 73   a;..#ifndef fts
3d00: 33 47 65 74 56 61 72 69 6e 74 33 32 0a 20 20 47  3GetVarint32.  G
3d10: 45 54 56 41 52 49 4e 54 5f 49 4e 49 54 28 61 2c  ETVARINT_INIT(a,
3d20: 20 70 74 72 2c 20 30 2c 20 20 30 78 30 30 2c 20   ptr, 0,  0x00, 
3d30: 20 20 20 20 30 78 38 30 2c 20 2a 70 69 2c 20 31      0x80, *pi, 1
3d40: 29 3b 0a 23 65 6c 73 65 0a 20 20 61 20 3d 20 28  );.#else.  a = (
3d50: 2a 70 74 72 2b 2b 29 3b 0a 20 20 61 73 73 65 72  *ptr++);.  asser
3d60: 74 28 20 61 20 26 20 30 78 38 30 20 29 3b 0a 23  t( a & 0x80 );.#
3d70: 65 6e 64 69 66 0a 0a 20 20 47 45 54 56 41 52 49  endif..  GETVARI
3d80: 4e 54 5f 53 54 45 50 28 61 2c 20 70 74 72 2c 20  NT_STEP(a, ptr, 
3d90: 37 2c 20 20 30 78 37 46 2c 20 20 20 20 20 30 78  7,  0x7F,     0x
3da0: 34 30 30 30 2c 20 2a 70 69 2c 20 32 29 3b 0a 20  4000, *pi, 2);. 
3db0: 20 47 45 54 56 41 52 49 4e 54 5f 53 54 45 50 28   GETVARINT_STEP(
3dc0: 61 2c 20 70 74 72 2c 20 31 34 2c 20 30 78 33 46  a, ptr, 14, 0x3F
3dd0: 46 46 2c 20 20 20 30 78 32 30 30 30 30 30 2c 20  FF,   0x200000, 
3de0: 2a 70 69 2c 20 33 29 3b 0a 20 20 47 45 54 56 41  *pi, 3);.  GETVA
3df0: 52 49 4e 54 5f 53 54 45 50 28 61 2c 20 70 74 72  RINT_STEP(a, ptr
3e00: 2c 20 32 31 2c 20 30 78 31 46 46 46 46 46 2c 20  , 21, 0x1FFFFF, 
3e10: 30 78 31 30 30 30 30 30 30 30 2c 20 2a 70 69 2c  0x10000000, *pi,
3e20: 20 34 29 3b 0a 20 20 61 20 3d 20 28 61 20 26 20   4);.  a = (a & 
3e30: 30 78 30 46 46 46 46 46 46 46 20 29 3b 0a 20 20  0x0FFFFFFF );.  
3e40: 2a 70 69 20 3d 20 28 69 6e 74 29 28 61 20 7c 20  *pi = (int)(a | 
3e50: 28 28 75 33 32 29 28 2a 70 74 72 20 26 20 30 78  ((u32)(*ptr & 0x
3e60: 30 37 29 20 3c 3c 20 32 38 29 29 3b 0a 20 20 61  07) << 28));.  a
3e70: 73 73 65 72 74 28 20 30 3d 3d 28 61 20 26 20 30  ssert( 0==(a & 0
3e80: 78 38 30 30 30 30 30 30 30 29 20 29 3b 0a 20 20  x80000000) );.  
3e90: 61 73 73 65 72 74 28 20 2a 70 69 3e 3d 30 20 29  assert( *pi>=0 )
3ea0: 3b 0a 20 20 72 65 74 75 72 6e 20 35 3b 0a 7d 0a  ;.  return 5;.}.
3eb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3ec0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
3ed0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e  s required to en
3ee0: 63 6f 64 65 20 76 20 61 73 20 61 20 76 61 72 69  code v as a vari
3ef0: 6e 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  nt.*/.int sqlite
3f00: 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 73  3Fts3VarintLen(s
3f10: 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 76 29  qlite3_uint64 v)
3f20: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
3f30: 20 64 6f 7b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20   do{.    i++;.  
3f40: 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68    v >>= 7;.  }wh
3f50: 69 6c 65 28 20 76 21 3d 30 20 29 3b 0a 20 20 72  ile( v!=0 );.  r
3f60: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
3f70: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 53 51 4c  * Convert an SQL
3f80: 2d 73 74 79 6c 65 20 71 75 6f 74 65 64 20 73 74  -style quoted st
3f90: 72 69 6e 67 20 69 6e 74 6f 20 61 20 6e 6f 72 6d  ring into a norm
3fa0: 61 6c 20 73 74 72 69 6e 67 20 62 79 20 72 65 6d  al string by rem
3fb0: 6f 76 69 6e 67 0a 2a 2a 20 74 68 65 20 71 75 6f  oving.** the quo
3fc0: 74 65 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  te characters.  
3fd0: 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  The conversion i
3fe0: 73 20 64 6f 6e 65 20 69 6e 2d 70 6c 61 63 65 2e  s done in-place.
3ff0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75    If the.** inpu
4000: 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
4010: 20 77 69 74 68 20 61 20 71 75 6f 74 65 20 63 68   with a quote ch
4020: 61 72 61 63 74 65 72 2c 20 74 68 65 6e 20 74 68  aracter, then th
4030: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
4040: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
4050: 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
4060: 20 20 20 20 22 61 62 63 22 20 20 20 62 65 63 6f      "abc"   beco
4070: 6d 65 73 20 20 20 61 62 63 0a 2a 2a 20 20 20 20  mes   abc.**    
4080: 20 27 78 79 7a 27 20 20 20 62 65 63 6f 6d 65 73   'xyz'   becomes
4090: 20 20 20 78 79 7a 0a 2a 2a 20 20 20 20 20 5b 70     xyz.**     [p
40a0: 71 72 5d 20 20 20 62 65 63 6f 6d 65 73 20 20 20  qr]   becomes   
40b0: 70 71 72 0a 2a 2a 20 20 20 20 20 60 6d 6e 6f 60  pqr.**     `mno`
40c0: 20 20 20 62 65 63 6f 6d 65 73 20 20 20 6d 6e 6f     becomes   mno
40d0: 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .**.*/.void sqli
40e0: 74 65 33 46 74 73 33 44 65 71 75 6f 74 65 28 63  te3Fts3Dequote(c
40f0: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20  har *z){.  char 
4100: 71 75 6f 74 65 3b 20 20 20 20 20 20 20 20 20 20  quote;          
4110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
4120: 6f 74 65 20 63 68 61 72 61 63 74 65 72 20 28 69  ote character (i
4130: 66 20 61 6e 79 20 29 20 2a 2f 0a 0a 20 20 71 75  f any ) */..  qu
4140: 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66  ote = z[0];.  if
4150: 28 20 71 75 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20  ( quote=='[' || 
4160: 71 75 6f 74 65 3d 3d 27 5c 27 27 20 7c 7c 20 71  quote=='\'' || q
4170: 75 6f 74 65 3d 3d 27 22 27 20 7c 7c 20 71 75 6f  uote=='"' || quo
4180: 74 65 3d 3d 27 60 27 20 29 7b 0a 20 20 20 20 69  te=='`' ){.    i
4190: 6e 74 20 69 49 6e 20 3d 20 31 3b 20 20 20 20 20  nt iIn = 1;     
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41b0: 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 62 79  Index of next by
41c0: 74 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  te to read from 
41d0: 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  input */.    int
41e0: 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   iOut = 0;      
41f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4200: 64 65 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65  dex of next byte
4210: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 6f 75 74   to write to out
4220: 70 75 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  put */..    /* I
4230: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
4240: 20 77 61 73 20 61 20 27 5b 27 2c 20 74 68 65 6e   was a '[', then
4250: 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f 74 65   the close-quote
4260: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 61 20   character is a 
4270: 27 5d 27 20 2a 2f 0a 20 20 20 20 69 66 28 20 71  ']' */.    if( q
4280: 75 6f 74 65 3d 3d 27 5b 27 20 29 20 71 75 6f 74  uote=='[' ) quot
4290: 65 20 3d 20 27 5d 27 3b 20 20 0a 0a 20 20 20 20  e = ']';  ..    
42a0: 77 68 69 6c 65 28 20 7a 5b 69 49 6e 5d 20 29 7b  while( z[iIn] ){
42b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e  .      if( z[iIn
42c0: 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  ]==quote ){.    
42d0: 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b 31 5d      if( z[iIn+1]
42e0: 21 3d 71 75 6f 74 65 20 29 20 62 72 65 61 6b 3b  !=quote ) break;
42f0: 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f 75 74 2b  .        z[iOut+
4300: 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20  +] = quote;.    
4310: 20 20 20 20 69 49 6e 20 2b 3d 20 32 3b 0a 20 20      iIn += 2;.  
4320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4330: 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a     z[iOut++] = z
4340: 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 20 20 7d  [iIn++];.      }
4350: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 69 4f 75  .    }.    z[iOu
4360: 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d  t] = '\0';.  }.}
4370: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
4380: 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66 72 6f  ingle varint fro
4390: 6d 20 74 68 65 20 64 6f 63 6c 69 73 74 20 61 74  m the doclist at
43a0: 20 2a 70 70 20 61 6e 64 20 61 64 76 61 6e 63 65   *pp and advance
43b0: 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a   *pp to point.**
43c0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
43d0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
43e0: 6f 66 20 74 68 65 20 76 61 72 69 6e 74 2e 20 20  of the varint.  
43f0: 41 64 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Add the value of
4400: 20 74 68 65 20 76 61 72 69 6e 74 0a 2a 2a 20 74   the varint.** t
4410: 6f 20 2a 70 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74  o *pVal..*/.stat
4420: 69 63 20 76 6f 69 64 20 66 74 73 33 47 65 74 44  ic void fts3GetD
4430: 65 6c 74 61 56 61 72 69 6e 74 28 63 68 61 72 20  eltaVarint(char 
4440: 2a 2a 70 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  **pp, sqlite3_in
4450: 74 36 34 20 2a 70 56 61 6c 29 7b 0a 20 20 73 71  t64 *pVal){.  sq
4460: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c  lite3_int64 iVal
4470: 3b 0a 20 20 2a 70 70 20 2b 3d 20 73 71 6c 69 74  ;.  *pp += sqlit
4480: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
4490: 2a 70 70 2c 20 26 69 56 61 6c 29 3b 0a 20 20 2a  *pp, &iVal);.  *
44a0: 70 56 61 6c 20 2b 3d 20 69 56 61 6c 3b 0a 7d 0a  pVal += iVal;.}.
44b0: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
44c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
44d0: 6c 65 64 2c 20 2a 70 70 20 70 6f 69 6e 74 73 20  led, *pp points 
44e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
44f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 0a 2a 2a  e following a.**
4500: 20 76 61 72 69 6e 74 20 74 68 61 74 20 69 73 20   varint that is 
4510: 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  part of a doclis
4520: 74 20 28 6f 72 20 70 6f 73 69 74 69 6f 6e 2d 6c  t (or position-l
4530: 69 73 74 2c 20 6f 72 20 61 6e 79 20 6f 74 68 65  ist, or any othe
4540: 72 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 76 61 72  r list.** of var
4550: 69 6e 74 73 29 2e 20 54 68 69 73 20 66 75 6e 63  ints). This func
4560: 74 69 6f 6e 20 6d 6f 76 65 73 20 2a 70 70 20 74  tion moves *pp t
4570: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  o point to the s
4580: 74 61 72 74 20 6f 66 20 74 68 61 74 20 76 61 72  tart of that var
4590: 69 6e 74 2c 0a 2a 2a 20 61 6e 64 20 73 65 74 73  int,.** and sets
45a0: 20 2a 70 56 61 6c 20 62 79 20 74 68 65 20 76 61   *pVal by the va
45b0: 72 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  rint value..**.*
45c0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74 61 72  * Argument pStar
45d0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
45e0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
45f0: 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 74  e doclist that t
4600: 68 65 0a 2a 2a 20 76 61 72 69 6e 74 20 69 73 20  he.** varint is 
4610: 70 61 72 74 20 6f 66 2e 0a 2a 2f 0a 73 74 61 74  part of..*/.stat
4620: 69 63 20 76 6f 69 64 20 66 74 73 33 47 65 74 52  ic void fts3GetR
4630: 65 76 65 72 73 65 56 61 72 69 6e 74 28 0a 20 20  everseVarint(.  
4640: 63 68 61 72 20 2a 2a 70 70 2c 20 0a 20 20 63 68  char **pp, .  ch
4650: 61 72 20 2a 70 53 74 61 72 74 2c 20 0a 20 20 73  ar *pStart, .  s
4660: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 56  qlite3_int64 *pV
4670: 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  al.){.  sqlite3_
4680: 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20 63 68  int64 iVal;.  ch
4690: 61 72 20 2a 70 3b 0a 0a 20 20 2f 2a 20 50 6f 69  ar *p;..  /* Poi
46a0: 6e 74 65 72 20 70 20 6e 6f 77 20 70 6f 69 6e 74  nter p now point
46b0: 73 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  s at the first b
46c0: 79 74 65 20 70 61 73 74 20 74 68 65 20 76 61 72  yte past the var
46d0: 69 6e 74 20 77 65 20 61 72 65 20 0a 20 20 2a 2a  int we are .  **
46e0: 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e 2e 20   interested in. 
46f0: 53 6f 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 64  So, unless the d
4700: 6f 63 6c 69 73 74 20 69 73 20 63 6f 72 72 75 70  oclist is corrup
4710: 74 2c 20 74 68 65 20 30 78 38 30 20 62 69 74 20  t, the 0x80 bit 
4720: 69 73 0a 20 20 2a 2a 20 63 6c 65 61 72 20 6f 6e  is.  ** clear on
4730: 20 63 68 61 72 61 63 74 65 72 20 70 5b 2d 31 5d   character p[-1]
4740: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 20 3d 20 28  . */.  for(p = (
4750: 2a 70 70 29 2d 32 3b 20 70 3e 3d 70 53 74 61 72  *pp)-2; p>=pStar
4760: 74 20 26 26 20 2a 70 26 30 78 38 30 3b 20 70 2d  t && *p&0x80; p-
4770: 2d 29 3b 0a 20 20 70 2b 2b 3b 0a 20 20 2a 70 70  -);.  p++;.  *pp
4780: 20 3d 20 70 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = p;..  sqlite3
4790: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c  Fts3GetVarint(p,
47a0: 20 26 69 56 61 6c 29 3b 0a 20 20 2a 70 56 61 6c   &iVal);.  *pVal
47b0: 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iVal;.}../*.*
47c0: 2a 20 54 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  * The xDisconnec
47d0: 74 28 29 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t() virtual tabl
47e0: 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61  e method..*/.sta
47f0: 74 69 63 20 69 6e 74 20 66 74 73 33 44 69 73 63  tic int fts3Disc
4800: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 73 71 6c  onnectMethod(sql
4810: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
4820: 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
4830: 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  p = (Fts3Table *
4840: 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  )pVtab;.  int i;
4850: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ..  assert( p->n
4860: 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
4870: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
4880: 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a  Segments==0 );..
4890: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 70 72    /* Free any pr
48a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
48b0: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 73 71 6c 69  s held */.  sqli
48c0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
48d0: 70 53 65 65 6b 53 74 6d 74 29 3b 0a 20 20 66 6f  pSeekStmt);.  fo
48e0: 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41  r(i=0; i<SizeofA
48f0: 72 72 61 79 28 70 2d 3e 61 53 74 6d 74 29 3b 20  rray(p->aStmt); 
4900: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
4910: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 61 53  3_finalize(p->aS
4920: 74 6d 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73  tmt[i]);.  }.  s
4930: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
4940: 53 65 67 6d 65 6e 74 73 54 62 6c 29 3b 0a 20 20  SegmentsTbl);.  
4950: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
4960: 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a  zReadExprlist);.
4970: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
4980: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74  ->zWriteExprlist
4990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
49a0: 65 28 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c  e(p->zContentTbl
49b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
49c0: 65 28 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  e(p->zLanguageid
49d0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
49e0: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20 64 65  the tokenizer de
49f0: 73 74 72 75 63 74 6f 72 20 74 6f 20 66 72 65 65  structor to free
4a00: 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 2e 20   the tokenizer. 
4a10: 2a 2f 0a 20 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a  */.  p->pTokeniz
4a20: 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65  er->pModule->xDe
4a30: 73 74 72 6f 79 28 70 2d 3e 70 54 6f 6b 65 6e 69  stroy(p->pTokeni
4a40: 7a 65 72 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  zer);..  sqlite3
4a50: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
4a60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
4a70: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
4a80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
4a90: 74 6f 20 2a 70 7a 45 72 72 0a 2a 2f 0a 76 6f 69  to *pzErr.*/.voi
4aa0: 64 20 73 71 6c 69 74 65 33 46 74 73 33 45 72 72  d sqlite3Fts3Err
4ab0: 4d 73 67 28 63 68 61 72 20 2a 2a 70 7a 45 72 72  Msg(char **pzErr
4ac0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
4ad0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
4ae0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c  a_list ap;.  sql
4af0: 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 45 72 72  ite3_free(*pzErr
4b00: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
4b10: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 2a 70  , zFormat);.  *p
4b20: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  zErr = sqlite3_v
4b30: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
4b40: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
4b50: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  p);.}../*.** Con
4b60: 73 74 72 75 63 74 20 6f 6e 65 20 6f 72 20 6d 6f  struct one or mo
4b70: 72 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  re SQL statement
4b80: 73 20 66 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61  s from the forma
4b90: 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e 0a 2a  t string given.*
4ba0: 2a 20 61 6e 64 20 74 68 65 6e 20 65 76 61 6c 75  * and then evalu
4bb0: 61 74 65 20 74 68 6f 73 65 20 73 74 61 74 65 6d  ate those statem
4bc0: 65 6e 74 73 2e 20 54 68 65 20 73 75 63 63 65 73  ents. The succes
4bd0: 73 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  s code is writte
4be0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 63 2e 0a  n.** into *pRc..
4bf0: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
4c00: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
4c10: 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ero then this ro
4c20: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c40: 20 66 74 73 33 44 62 45 78 65 63 28 0a 20 20 69   fts3DbExec(.  i
4c50: 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
4c60: 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73        /* Success
4c70: 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
4c80: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
4c90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
4ca0: 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51   which to run SQ
4cb0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
4cc0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a  r *zFormat,   /*
4cd0: 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66   Format string f
4ce0: 6f 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20  or SQL */.  ... 
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
4d10: 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74  to the format st
4d20: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f  ring */.){.  va_
4d30: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
4d40: 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52  *zSql;.  if( *pR
4d50: 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  c ) return;.  va
4d60: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
4d70: 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  at);.  zSql = sq
4d80: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
4d90: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
4da0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
4db0: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
4dc0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
4dd0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
4de0: 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33    *pRc = sqlite3
4df0: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
4e00: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
4e10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4e20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
4e30: 68 65 20 78 44 65 73 74 72 6f 79 28 29 20 76 69  he xDestroy() vi
4e40: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65 74 68  rtual table meth
4e50: 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
4e60: 74 20 66 74 73 33 44 65 73 74 72 6f 79 4d 65 74  t fts3DestroyMet
4e70: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
4e80: 20 2a 70 56 74 61 62 29 7b 0a 20 20 46 74 73 33   *pVtab){.  Fts3
4e90: 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
4ea0: 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20  Table *)pVtab;. 
4eb0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ec0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
4ed0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
4ee0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4ef0: 20 2a 7a 44 62 20 3d 20 70 2d 3e 7a 44 62 3b 20   *zDb = p->zDb; 
4f00: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4f10: 66 20 64 61 74 61 62 61 73 65 20 28 65 2e 67 2e  f database (e.g.
4f20: 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 29   "main", "temp")
4f30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
4f40: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
4f50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4f60: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  se handle */..  
4f70: 2f 2a 20 44 72 6f 70 20 74 68 65 20 73 68 61 64  /* Drop the shad
4f80: 6f 77 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 66  ow tables */.  f
4f90: 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
4fa0: 62 2c 20 0a 20 20 20 20 22 44 52 4f 50 20 54 41  b, .    "DROP TA
4fb0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 25 51  BLE IF EXISTS %Q
4fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 3b 22  .'%q_segments';"
4fd0: 0a 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45  .    "DROP TABLE
4fe0: 20 49 46 20 45 58 49 53 54 53 20 25 51 2e 27 25   IF EXISTS %Q.'%
4ff0: 71 5f 73 65 67 64 69 72 27 3b 22 0a 20 20 20 20  q_segdir';".    
5000: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
5010: 58 49 53 54 53 20 25 51 2e 27 25 71 5f 64 6f 63  XISTS %Q.'%q_doc
5020: 73 69 7a 65 27 3b 22 0a 20 20 20 20 22 44 52 4f  size';".    "DRO
5030: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
5040: 53 20 25 51 2e 27 25 71 5f 73 74 61 74 27 3b 22  S %Q.'%q_stat';"
5050: 0a 20 20 20 20 22 25 73 20 44 52 4f 50 20 54 41  .    "%s DROP TA
5060: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 25 51  BLE IF EXISTS %Q
5070: 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 3b 22 2c  .'%q_content';",
5080: 0a 20 20 20 20 7a 44 62 2c 20 70 2d 3e 7a 4e 61  .    zDb, p->zNa
5090: 6d 65 2c 0a 20 20 20 20 7a 44 62 2c 20 70 2d 3e  me,.    zDb, p->
50a0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 7a 44 62 2c 20  zName,.    zDb, 
50b0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 7a 44  p->zName,.    zD
50c0: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  b, p->zName,.   
50d0: 20 28 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c   (p->zContentTbl
50e0: 20 3f 20 22 2d 2d 22 20 3a 20 22 22 29 2c 20 7a   ? "--" : ""), z
50f0: 44 62 2c 70 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b  Db,p->zName.  );
5100: 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74  ..  /* If everyt
5110: 68 69 6e 67 20 68 61 73 20 77 6f 72 6b 65 64 2c  hing has worked,
5120: 20 69 6e 76 6f 6b 65 20 66 74 73 33 44 69 73 63   invoke fts3Disc
5130: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 29 20 74  onnectMethod() t
5140: 6f 20 66 72 65 65 20 74 68 65 0a 20 20 2a 2a 20  o free the.  ** 
5150: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
5160: 64 20 77 69 74 68 20 74 68 65 20 46 74 73 33 54  d with the Fts3T
5170: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61  able structure a
5180: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
5190: 5f 4f 4b 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  _OK..  ** Otherw
51a0: 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  ise, return an S
51b0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
51c0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
51d0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
51e0: 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d   fts3DisconnectM
51f0: 65 74 68 6f 64 28 70 56 74 61 62 29 20 3a 20 72  ethod(pVtab) : r
5200: 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  c);.}.../*.** In
5210: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 65 63  voke sqlite3_dec
5220: 6c 61 72 65 5f 76 74 61 62 28 29 20 74 6f 20 64  lare_vtab() to d
5230: 65 63 6c 61 72 65 20 74 68 65 20 73 63 68 65 6d  eclare the schem
5240: 61 20 66 6f 72 20 74 68 65 20 46 54 53 33 20 74  a for the FTS3 t
5250: 61 62 6c 65 0a 2a 2a 20 70 61 73 73 65 64 20 61  able.** passed a
5260: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5270: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 64 6f  ment. This is do
5280: 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ne as part of th
5290: 65 20 78 43 6f 6e 6e 65 63 74 28 29 0a 2a 2a 20  e xConnect().** 
52a0: 61 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d 65  and xCreate() me
52b0: 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  thods..**.** If 
52c0: 2a 70 52 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  *pRc is non-zero
52d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
52e0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
52f0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a 2a  t is a no-op. .*
5300: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
5310: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
5320: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5330: 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64 20   code is stored 
5340: 69 6e 20 2a 70 52 63 0a 2a 2a 20 62 65 66 6f 72  in *pRc.** befor
5350: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
5360: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
5370: 44 65 63 6c 61 72 65 56 74 61 62 28 69 6e 74 20  DeclareVtab(int 
5380: 2a 70 52 63 2c 20 46 74 73 33 54 61 62 6c 65 20  *pRc, Fts3Table 
5390: 2a 70 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  *p){.  if( *pRc=
53a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
53b0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
53e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  able */.    int 
53f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
5410: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
5420: 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5440: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70   SQL statement p
5450: 61 73 73 65 64 20 74 6f 20 64 65 63 6c 61 72 65  assed to declare
5460: 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20 20 20 63  _vtab() */.    c
5470: 68 61 72 20 2a 7a 43 6f 6c 73 3b 20 20 20 20 20  har *zCols;     
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5490: 4c 69 73 74 20 6f 66 20 75 73 65 72 20 64 65 66  List of user def
54a0: 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  ined columns */.
54b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
54c0: 7a 4c 61 6e 67 75 61 67 65 69 64 3b 0a 0a 20 20  zLanguageid;..  
54d0: 20 20 7a 4c 61 6e 67 75 61 67 65 69 64 20 3d 20    zLanguageid = 
54e0: 28 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20  (p->zLanguageid 
54f0: 3f 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  ? p->zLanguageid
5500: 20 3a 20 22 5f 5f 6c 61 6e 67 69 64 22 29 3b 0a   : "__langid");.
5510: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
5520: 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 53  _config(p->db, S
5530: 51 4c 49 54 45 5f 56 54 41 42 5f 43 4f 4e 53 54  QLITE_VTAB_CONST
5540: 52 41 49 4e 54 5f 53 55 50 50 4f 52 54 2c 20 31  RAINT_SUPPORT, 1
5550: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
5560: 65 20 61 20 6c 69 73 74 20 6f 66 20 75 73 65 72  e a list of user
5570: 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65   columns for the
5580: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
5590: 2f 0a 20 20 20 20 7a 43 6f 6c 73 20 3d 20 73 71  /.    zCols = sq
55a0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
55b0: 51 2c 20 22 2c 20 70 2d 3e 61 7a 43 6f 6c 75 6d  Q, ", p->azColum
55c0: 6e 5b 30 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  n[0]);.    for(i
55d0: 3d 31 3b 20 7a 43 6f 6c 73 20 26 26 20 69 3c 70  =1; zCols && i<p
55e0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
55f0: 0a 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20 73  .      zCols = s
5600: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5610: 25 7a 25 51 2c 20 22 2c 20 7a 43 6f 6c 73 2c 20  %z%Q, ", zCols, 
5620: 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 29 3b  p->azColumn[i]);
5630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5640: 72 65 61 74 65 20 74 68 65 20 77 68 6f 6c 65 20  reate the whole 
5650: 22 43 52 45 41 54 45 20 54 41 42 4c 45 22 20 73  "CREATE TABLE" s
5660: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 61 73 73  tatement to pass
5670: 20 74 6f 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20   to SQLite */.  
5680: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5690: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
56a0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
56b0: 78 28 25 73 20 25 51 20 48 49 44 44 45 4e 2c 20  x(%s %Q HIDDEN, 
56c0: 64 6f 63 69 64 20 48 49 44 44 45 4e 2c 20 25 51  docid HIDDEN, %Q
56d0: 20 48 49 44 44 45 4e 29 22 2c 20 0a 20 20 20 20   HIDDEN)", .    
56e0: 20 20 20 20 7a 43 6f 6c 73 2c 20 70 2d 3e 7a 4e      zCols, p->zN
56f0: 61 6d 65 2c 20 7a 4c 61 6e 67 75 61 67 65 69 64  ame, zLanguageid
5700: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
5710: 21 7a 43 6f 6c 73 20 7c 7c 20 21 7a 53 71 6c 20  !zCols || !zSql 
5720: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
5730: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
5750: 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
5760: 65 5f 76 74 61 62 28 70 2d 3e 64 62 2c 20 7a 53  e_vtab(p->db, zS
5770: 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ql);.    }..    
5780: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
5790: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
57a0: 66 72 65 65 28 7a 43 6f 6c 73 29 3b 0a 20 20 20  free(zCols);.   
57b0: 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a   *pRc = rc;.  }.
57c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
57d0: 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65  the %_stat table
57e0: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
57f0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
5800: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
5810: 73 33 43 72 65 61 74 65 53 74 61 74 54 61 62 6c  s3CreateStatTabl
5820: 65 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 33  e(int *pRc, Fts3
5830: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 66 74 73  Table *p){.  fts
5840: 33 44 62 45 78 65 63 28 70 52 63 2c 20 70 2d 3e  3DbExec(pRc, p->
5850: 64 62 2c 20 0a 20 20 20 20 20 20 22 43 52 45 41  db, .      "CREA
5860: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
5870: 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73 74  EXISTS %Q.'%q_st
5880: 61 74 27 22 0a 20 20 20 20 20 20 20 20 20 20 22  at'".          "
5890: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
58a0: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42  ARY KEY, value B
58b0: 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20 70 2d  LOB);",.      p-
58c0: 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20  >zDb, p->zName. 
58d0: 20 29 3b 0a 20 20 69 66 28 20 28 2a 70 52 63 29   );.  if( (*pRc)
58e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
58f0: 3e 62 48 61 73 53 74 61 74 20 3d 20 31 3b 0a 7d  >bHasStat = 1;.}
5900: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
5910: 68 65 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65  he backing store
5920: 20 74 61 62 6c 65 73 20 28 25 5f 63 6f 6e 74 65   tables (%_conte
5930: 6e 74 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20 61  nt, %_segments a
5940: 6e 64 20 25 5f 73 65 67 64 69 72 29 0a 2a 2a 20  nd %_segdir).** 
5950: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
5960: 46 54 53 33 20 74 61 62 6c 65 20 70 61 73 73 65  FTS3 table passe
5970: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
5980: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
5990: 64 6f 6e 65 0a 2a 2a 20 61 73 20 70 61 72 74 20  done.** as part 
59a0: 6f 66 20 74 68 65 20 76 74 61 62 20 78 43 72 65  of the vtab xCre
59b0: 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ate() method..**
59c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d 3e 62 48  .** If the p->bH
59d0: 61 73 44 6f 63 73 69 7a 65 20 62 6f 6f 6c 65 61  asDocsize boolea
59e0: 6e 20 69 73 20 74 72 75 65 20 28 69 6e 64 69 63  n is true (indic
59f0: 61 74 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  ating that this 
5a00: 69 73 20 61 6e 0a 2a 2a 20 46 54 53 34 20 74 61  is an.** FTS4 ta
5a10: 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 46 54 53 33  ble, not an FTS3
5a20: 20 74 61 62 6c 65 29 20 74 68 65 6e 20 61 6c 73   table) then als
5a30: 6f 20 63 72 65 61 74 65 20 74 68 65 20 25 5f 64  o create the %_d
5a40: 6f 63 73 69 7a 65 20 61 6e 64 0a 2a 2a 20 25 5f  ocsize and.** %_
5a50: 73 74 61 74 20 74 61 62 6c 65 73 20 72 65 71 75  stat tables requ
5a60: 69 72 65 64 20 62 79 20 46 54 53 34 2e 0a 2a 2f  ired by FTS4..*/
5a70: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
5a80: 43 72 65 61 74 65 54 61 62 6c 65 73 28 46 74 73  CreateTables(Fts
5a90: 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e  3Table *p){.  in
5aa0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5ac0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
5ad0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
5b00: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  riable */.  sqli
5b10: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5b30: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
5b40: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28  ection */..  if(
5b50: 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d   p->zContentTbl=
5b60: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
5b70: 63 68 61 72 20 2a 7a 4c 61 6e 67 75 61 67 65 69  char *zLanguagei
5b80: 64 20 3d 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65  d = p->zLanguage
5b90: 69 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  id;.    char *zC
5ba0: 6f 6e 74 65 6e 74 43 6f 6c 73 3b 20 20 20 20 20  ontentCols;     
5bb0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73        /* Columns
5bc0: 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61   of %_content ta
5bd0: 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ble */..    /* C
5be0: 72 65 61 74 65 20 61 20 6c 69 73 74 20 6f 66 20  reate a list of 
5bf0: 75 73 65 72 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  user columns for
5c00: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
5c10: 6c 65 20 2a 2f 0a 20 20 20 20 7a 43 6f 6e 74 65  le */.    zConte
5c20: 6e 74 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33  ntCols = sqlite3
5c30: 5f 6d 70 72 69 6e 74 66 28 22 64 6f 63 69 64 20  _mprintf("docid 
5c40: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
5c50: 4b 45 59 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  KEY");.    for(i
5c60: 3d 30 3b 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73  =0; zContentCols
5c70: 20 26 26 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e   && i<p->nColumn
5c80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
5c90: 61 72 20 2a 7a 20 3d 20 70 2d 3e 61 7a 43 6f 6c  ar *z = p->azCol
5ca0: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43  umn[i];.      zC
5cb0: 6f 6e 74 65 6e 74 43 6f 6c 73 20 3d 20 73 71 6c  ontentCols = sql
5cc0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
5cd0: 2c 20 27 63 25 64 25 71 27 22 2c 20 7a 43 6f 6e  , 'c%d%q'", zCon
5ce0: 74 65 6e 74 43 6f 6c 73 2c 20 69 2c 20 7a 29 3b  tentCols, i, z);
5cf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
5d00: 4c 61 6e 67 75 61 67 65 69 64 20 26 26 20 7a 43  Languageid && zC
5d10: 6f 6e 74 65 6e 74 43 6f 6c 73 20 29 7b 0a 20 20  ontentCols ){.  
5d20: 20 20 20 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73      zContentCols
5d30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
5d40: 74 66 28 22 25 7a 2c 20 6c 61 6e 67 69 64 22 2c  tf("%z, langid",
5d50: 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 2c 20 7a   zContentCols, z
5d60: 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a 20 20 20  Languageid);.   
5d70: 20 7d 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e 74   }.    if( zCont
5d80: 65 6e 74 43 6f 6c 73 3d 3d 30 20 29 20 72 63 20  entCols==0 ) rc 
5d90: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
5da0: 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
5db0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62   the content tab
5dc0: 6c 65 20 2a 2f 0a 20 20 20 20 66 74 73 33 44 62  le */.    fts3Db
5dd0: 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a 20  Exec(&rc, db, . 
5de0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
5df0: 42 4c 45 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65  BLE %Q.'%q_conte
5e00: 6e 74 27 28 25 73 29 22 2c 0a 20 20 20 20 20 20  nt'(%s)",.      
5e10: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
5e20: 65 2c 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 0a  e, zContentCols.
5e30: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
5e40: 65 33 5f 66 72 65 65 28 7a 43 6f 6e 74 65 6e 74  e3_free(zContent
5e50: 43 6f 6c 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cols);.  }..  /*
5e60: 20 43 72 65 61 74 65 20 6f 74 68 65 72 20 74 61   Create other ta
5e70: 62 6c 65 73 20 2a 2f 0a 20 20 66 74 73 33 44 62  bles */.  fts3Db
5e80: 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a 20  Exec(&rc, db, . 
5e90: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
5ea0: 4c 45 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e  LE %Q.'%q_segmen
5eb0: 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45  ts'(blockid INTE
5ec0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
5ed0: 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b 22 2c 0a   block BLOB);",.
5ee0: 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d        p->zDb, p-
5ef0: 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 66 74  >zName.  );.  ft
5f00: 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
5f10: 2c 20 0a 20 20 20 20 20 20 22 43 52 45 41 54 45  , .      "CREATE
5f20: 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 65   TABLE %Q.'%q_se
5f30: 67 64 69 72 27 28 22 0a 20 20 20 20 20 20 20 20  gdir'(".        
5f40: 22 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 22  "level INTEGER,"
5f50: 0a 20 20 20 20 20 20 20 20 22 69 64 78 20 49 4e  .        "idx IN
5f60: 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20 20  TEGER,".        
5f70: 22 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49 4e 54  "start_block INT
5f80: 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20 20 22  EGER,".        "
5f90: 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b  leaves_end_block
5fa0: 20 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20   INTEGER,".     
5fb0: 20 20 20 22 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e     "end_block IN
5fc0: 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20 20  TEGER,".        
5fd0: 22 72 6f 6f 74 20 42 4c 4f 42 2c 22 0a 20 20 20  "root BLOB,".   
5fe0: 20 20 20 20 20 22 50 52 49 4d 41 52 59 20 4b 45       "PRIMARY KE
5ff0: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 22 0a 20  Y(level, idx)". 
6000: 20 20 20 20 20 22 29 3b 22 2c 0a 20 20 20 20 20       ");",.     
6010: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
6020: 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  e.  );.  if( p->
6030: 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20  bHasDocsize ){. 
6040: 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72     fts3DbExec(&r
6050: 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 20 20  c, db, .        
6060: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
6070: 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 28 64 6f  .'%q_docsize'(do
6080: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  cid INTEGER PRIM
6090: 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 20 42 4c  ARY KEY, size BL
60a0: 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 70  OB);",.        p
60b0: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a  ->zDb, p->zName.
60c0: 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73      );.  }.  ass
60d0: 65 72 74 28 20 70 2d 3e 62 48 61 73 53 74 61 74  ert( p->bHasStat
60e0: 3d 3d 70 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20  ==p->bFts4 );.  
60f0: 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 20  if( p->bHasStat 
6100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
6110: 73 33 43 72 65 61 74 65 53 74 61 74 54 61 62 6c  s3CreateStatTabl
6120: 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 7d 0a 20  e(&rc, p);.  }. 
6130: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6140: 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20 63  *.** Store the c
6150: 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
6160: 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 62 79 74  page-size in byt
6170: 65 73 20 69 6e 20 70 2d 3e 6e 50 67 73 7a 2e 0a  es in p->nPgsz..
6180: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
6190: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
61a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
61b0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
61c0: 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
61d0: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
61e0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
61f0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
6200: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 52 63  s stored in *pRc
6210: 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
6220: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
6230: 76 6f 69 64 20 66 74 73 33 44 61 74 61 62 61 73  void fts3Databas
6240: 65 50 61 67 65 53 69 7a 65 28 69 6e 74 20 2a 70  ePageSize(int *p
6250: 52 63 2c 20 46 74 73 33 54 61 62 6c 65 20 2a 70  Rc, Fts3Table *p
6260: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
6270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6280: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
62a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
62b0: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 2f 2a 20 53 51 4c 20 74 65 78 74 20 22 50    /* SQL text "P
62e0: 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f 73 69  RAGMA %Q.page_si
62f0: 7a 65 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ze" */.    sqlit
6300: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
6310: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
6320: 69 6c 65 64 20 22 50 52 41 47 4d 41 20 25 51 2e  iled "PRAGMA %Q.
6330: 70 61 67 65 5f 73 69 7a 65 22 20 73 74 61 74 65  page_size" state
6340: 6d 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 20 20 7a  ment */.  .    z
6350: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
6360: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25 51  rintf("PRAGMA %Q
6370: 2e 70 61 67 65 5f 73 69 7a 65 22 2c 20 70 2d 3e  .page_size", p->
6380: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  zDb);.    if( !z
6390: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
63a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
63b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
63c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
63d0: 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 53 71  epare(p->db, zSq
63e0: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
63f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
6400: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
6420: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
6430: 20 20 20 70 2d 3e 6e 50 67 73 7a 20 3d 20 73 71     p->nPgsz = sq
6440: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
6450: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
6460: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6470: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6490: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 55 54  ( rc==SQLITE_AUT
64a0: 48 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  H ){.        p->
64b0: 6e 50 67 73 7a 20 3d 20 31 30 32 34 3b 0a 20 20  nPgsz = 1024;.  
64c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
64d0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
64e0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
64f0: 70 2d 3e 6e 50 67 73 7a 3e 30 20 7c 7c 20 72 63  p->nPgsz>0 || rc
6500: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
6510: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6520: 7a 53 71 6c 29 3b 0a 20 20 20 20 2a 70 52 63 20  zSql);.    *pRc 
6530: 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = rc;.  }.}../*.
6540: 2a 2a 20 22 53 70 65 63 69 61 6c 22 20 46 54 53  ** "Special" FTS
6550: 34 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  4 arguments are 
6560: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 61  column specifica
6570: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 6c  tions of the fol
6580: 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
6590: 2a 2a 20 20 20 3c 6b 65 79 3e 20 3d 20 3c 76 61  **   <key> = <va
65a0: 6c 75 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  lue>.**.** There
65b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 68 69 74   may not be whit
65c0: 65 73 70 61 63 65 20 73 75 72 72 6f 75 6e 64 69  espace surroundi
65d0: 6e 67 20 74 68 65 20 22 3d 22 20 63 68 61 72 61  ng the "=" chara
65e0: 63 74 65 72 2e 20 54 68 65 20 3c 76 61 6c 75 65  cter. The <value
65f0: 3e 20 0a 2a 2a 20 74 65 72 6d 20 6d 61 79 20 62  > .** term may b
6600: 65 20 71 75 6f 74 65 64 2c 20 62 75 74 20 74 68  e quoted, but th
6610: 65 20 3c 6b 65 79 3e 20 6d 61 79 20 6e 6f 74 2e  e <key> may not.
6620: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
6630: 74 73 33 49 73 53 70 65 63 69 61 6c 43 6f 6c 75  ts3IsSpecialColu
6640: 6d 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mn(.  const char
6650: 20 2a 7a 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 4b   *z, .  int *pnK
6660: 65 79 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 56  ey,.  char **pzV
6670: 61 6c 75 65 0a 29 7b 0a 20 20 63 68 61 72 20 2a  alue.){.  char *
6680: 7a 56 61 6c 75 65 3b 0a 20 20 63 6f 6e 73 74 20  zValue;.  const 
6690: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 3b 0a  char *zCsr = z;.
66a0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 43 73 72 21  .  while( *zCsr!
66b0: 3d 27 3d 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='=' ){.    if( 
66c0: 2a 7a 43 73 72 3d 3d 27 5c 30 27 20 29 20 72 65  *zCsr=='\0' ) re
66d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 43 73 72  turn 0;.    zCsr
66e0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 4b 65  ++;.  }..  *pnKe
66f0: 79 20 3d 20 28 69 6e 74 29 28 7a 43 73 72 2d 7a  y = (int)(zCsr-z
6700: 29 3b 0a 20 20 7a 56 61 6c 75 65 20 3d 20 73 71  );.  zValue = sq
6710: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
6720: 73 22 2c 20 26 7a 43 73 72 5b 31 5d 29 3b 0a 20  s", &zCsr[1]);. 
6730: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20   if( zValue ){. 
6740: 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 44 65     sqlite3Fts3De
6750: 71 75 6f 74 65 28 7a 56 61 6c 75 65 29 3b 0a 20  quote(zValue);. 
6760: 20 7d 0a 20 20 2a 70 7a 56 61 6c 75 65 20 3d 20   }.  *pzValue = 
6770: 7a 56 61 6c 75 65 3b 0a 20 20 72 65 74 75 72 6e  zValue;.  return
6780: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   1;.}../*.** App
6790: 65 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 6f  end the output o
67a0: 66 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79  f a printf() sty
67b0: 6c 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 6f  le formatting to
67c0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 74 72   an existing str
67d0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
67e0: 6f 69 64 20 66 74 73 33 41 70 70 65 6e 64 66 28  oid fts3Appendf(
67f0: 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6810: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72     /* IN/OUT: Er
6820: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  ror code */.  ch
6830: 61 72 20 2a 2a 70 7a 2c 20 20 20 20 20 20 20 20  ar **pz,        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6850: 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72   IN/OUT: Pointer
6860: 20 74 6f 20 73 74 72 69 6e 67 20 62 75 66 66 65   to string buffe
6870: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
6880: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20  r *zFormat,     
6890: 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 66         /* Printf
68a0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74   format string t
68b0: 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 2e 2e  o append */.  ..
68c0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
68e0: 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 70   Arguments for p
68f0: 72 69 6e 74 66 20 66 6f 72 6d 61 74 20 73 74 72  rintf format str
6900: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ing */.){.  if( 
6910: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
6920: 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  ){.    va_list a
6930: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  p;.    char *z;.
6940: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
6950: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 7a   zFormat);.    z
6960: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
6970: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
6980: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6990: 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20 2a  ;.    if( z && *
69a0: 70 7a 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  pz ){.      char
69b0: 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d   *z2 = sqlite3_m
69c0: 70 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20 2a  printf("%s%s", *
69d0: 70 7a 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  pz, z);.      sq
69e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
69f0: 20 20 20 20 20 7a 20 3d 20 7a 32 3b 0a 20 20 20       z = z2;.   
6a00: 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20   }.    if( z==0 
6a10: 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f  ) *pRc = SQLITE_
6a20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74  NOMEM;.    sqlit
6a30: 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20 20  e3_free(*pz);.  
6a40: 20 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20 7d 0a 7d    *pz = z;.  }.}
6a50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6a60: 20 63 6f 70 79 20 6f 66 20 69 6e 70 75 74 20 73   copy of input s
6a70: 74 72 69 6e 67 20 7a 49 6e 70 75 74 20 65 6e 63  tring zInput enc
6a80: 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d  losed in double-
6a90: 71 75 6f 74 65 73 20 28 22 29 20 61 6e 64 0a 2a  quotes (") and.*
6aa0: 2a 20 77 69 74 68 20 61 6c 6c 20 64 6f 75 62 6c  * with all doubl
6ab0: 65 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  e quote characte
6ac0: 72 73 20 65 73 63 61 70 65 64 2e 20 46 6f 72 20  rs escaped. For 
6ad0: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
6ae0: 20 20 20 66 74 73 33 51 75 6f 74 65 49 64 28 22     fts3QuoteId("
6af0: 75 6e 20 5c 22 7a 69 70 5c 22 22 29 20 20 20 2d  un \"zip\"")   -
6b00: 3e 20 20 20 20 22 75 6e 20 5c 22 5c 22 7a 69 70  >    "un \"\"zip
6b10: 5c 22 5c 22 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20  \"\"".**.** The 
6b20: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
6b30: 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72   points to memor
6b40: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
6b50: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
6b60: 2e 20 49 74 0a 2a 2a 20 69 73 20 74 68 65 20 63  . It.** is the c
6b70: 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62  allers responsib
6b80: 69 6c 69 74 79 20 74 6f 20 63 61 6c 6c 20 73 71  ility to call sq
6b90: 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
6ba0: 72 65 6c 65 61 73 65 20 74 68 69 73 0a 2a 2a 20  release this.** 
6bb0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
6bc0: 63 20 63 68 61 72 20 2a 66 74 73 33 51 75 6f 74  c char *fts3Quot
6bd0: 65 49 64 28 63 68 61 72 20 63 6f 6e 73 74 20 2a  eId(char const *
6be0: 7a 49 6e 70 75 74 29 7b 0a 20 20 73 71 6c 69 74  zInput){.  sqlit
6bf0: 65 33 5f 69 6e 74 36 34 20 6e 52 65 74 3b 0a 20  e3_int64 nRet;. 
6c00: 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 6e   char *zRet;.  n
6c10: 52 65 74 20 3d 20 32 20 2b 20 28 69 6e 74 29 73  Ret = 2 + (int)s
6c20: 74 72 6c 65 6e 28 7a 49 6e 70 75 74 29 2a 32 20  trlen(zInput)*2 
6c30: 2b 20 31 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71  + 1;.  zRet = sq
6c40: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
6c50: 52 65 74 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  Ret);.  if( zRet
6c60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6c70: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65     char *z = zRe
6c80: 74 3b 0a 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20  t;.    *(z++) = 
6c90: 27 22 27 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  '"';.    for(i=0
6ca0: 3b 20 7a 49 6e 70 75 74 5b 69 5d 3b 20 69 2b 2b  ; zInput[i]; i++
6cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  ){.      if( zIn
6cc0: 70 75 74 5b 69 5d 3d 3d 27 22 27 20 29 20 2a 28  put[i]=='"' ) *(
6cd0: 7a 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  z++) = '"';.    
6ce0: 20 20 2a 28 7a 2b 2b 29 20 3d 20 7a 49 6e 70 75    *(z++) = zInpu
6cf0: 74 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t[i];.    }.    
6d00: 2a 28 7a 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20  *(z++) = '"';.  
6d10: 20 20 2a 28 7a 2b 2b 29 20 3d 20 27 5c 30 27 3b    *(z++) = '\0';
6d20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
6d30: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  et;.}../*.** Ret
6d40: 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 63 6f  urn a list of co
6d50: 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 53 51  mma separated SQ
6d60: 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
6d70: 64 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  d a FROM clause 
6d80: 74 68 61 74 20 0a 2a 2a 20 63 6f 75 6c 64 20 62  that .** could b
6d90: 65 20 75 73 65 64 20 69 6e 20 61 20 53 45 4c 45  e used in a SELE
6da0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73 75 63  CT statement suc
6db0: 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h as the followi
6dc0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ng:.**.**     SE
6dd0: 4c 45 43 54 20 3c 6c 69 73 74 20 6f 66 20 65 78  LECT <list of ex
6de0: 70 72 65 73 73 69 6f 6e 73 3e 20 46 52 4f 4d 20  pressions> FROM 
6df0: 25 5f 63 6f 6e 74 65 6e 74 20 41 53 20 78 20 2e  %_content AS x .
6e00: 2e 2e 0a 2a 2a 0a 2a 2a 20 74 6f 20 72 65 74 75  ...**.** to retu
6e10: 72 6e 20 74 68 65 20 64 6f 63 69 64 2c 20 66 6f  rn the docid, fo
6e20: 6c 6c 6f 77 65 64 20 62 79 20 65 61 63 68 20 63  llowed by each c
6e30: 6f 6c 75 6d 6e 20 6f 66 20 74 65 78 74 20 64 61  olumn of text da
6e40: 74 61 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  ta in order.** f
6e50: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 77 72 69 74  rom left to writ
6e60: 65 2e 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  e. If parameter 
6e70: 7a 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  zFunc is not NUL
6e80: 4c 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20  L, then instead 
6e90: 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 74 75  of.** being retu
6ea0: 72 6e 65 64 20 64 69 72 65 63 74 6c 79 20 65 61  rned directly ea
6eb0: 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 65 78  ch column of tex
6ec0: 74 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  t data is passed
6ed0: 20 74 6f 20 61 6e 20 53 51 4c 0a 2a 2a 20 66 75   to an SQL.** fu
6ee0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 7a 46 75  nction named zFu
6ef0: 6e 63 20 66 69 72 73 74 2e 20 46 6f 72 20 65 78  nc first. For ex
6f00: 61 6d 70 6c 65 2c 20 69 66 20 7a 46 75 6e 63 20  ample, if zFunc 
6f10: 69 73 20 22 75 6e 7a 69 70 22 20 61 6e 64 20 74  is "unzip" and t
6f20: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 68 61 73 20  he.** table has 
6f30: 74 68 65 20 74 68 72 65 65 20 75 73 65 72 2d 64  the three user-d
6f40: 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 22  efined columns "
6f50: 61 22 2c 20 22 62 22 2c 20 61 6e 64 20 22 63 22  a", "b", and "c"
6f60: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
6f70: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 72 65 74  ** string is ret
6f80: 75 72 6e 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  urned:.**.**    
6f90: 20 22 64 6f 63 69 64 2c 20 75 6e 7a 69 70 28 78   "docid, unzip(x
6fa0: 2e 27 61 27 29 2c 20 75 6e 7a 69 70 28 78 2e 27  .'a'), unzip(x.'
6fb0: 62 27 29 2c 20 75 6e 7a 69 70 28 78 2e 27 63 27  b'), unzip(x.'c'
6fc0: 29 20 46 52 4f 4d 20 25 5f 63 6f 6e 74 65 6e 74  ) FROM %_content
6fd0: 20 41 53 20 78 22 0a 2a 2a 0a 2a 2a 20 54 68 65   AS x".**.** The
6fe0: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
6ff0: 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  d points to a bu
7000: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
7010: 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  y sqlite3_malloc
7020: 28 29 2e 20 49 74 0a 2a 2a 20 69 73 20 74 68 65  (). It.** is the
7030: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
7040: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
7050: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
7060: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70   it..**.** If *p
7070: 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
7080: 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
7090: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
70a0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  , it is a no-op 
70b0: 28 61 6e 64 0a 2a 2a 20 61 20 4e 55 4c 4c 20 70  (and.** a NULL p
70c0: 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e  ointer is return
70d0: 65 64 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ed). Otherwise, 
70e0: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
70f0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
7100: 2a 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  * by this functi
7110: 6f 6e 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  on, NULL is retu
7120: 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 69 73  rned and *pRc is
7130: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
7140: 4f 4d 45 4d 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  OMEM. If.** no e
7150: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52  rror occurs, *pR
7160: 63 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  c is left unmodi
7170: 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
7180: 63 68 61 72 20 2a 66 74 73 33 52 65 61 64 45 78  char *fts3ReadEx
7190: 70 72 4c 69 73 74 28 46 74 73 33 54 61 62 6c 65  prList(Fts3Table
71a0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
71b0: 2a 7a 46 75 6e 63 2c 20 69 6e 74 20 2a 70 52 63  *zFunc, int *pRc
71c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
71d0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 72  = 0;.  char *zFr
71e0: 65 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ee = 0;.  char *
71f0: 7a 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 69 6e 74  zFunction;.  int
7200: 20 69 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43   i;..  if( p->zC
7210: 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a  ontentTbl==0 ){.
7220: 20 20 20 20 69 66 28 20 21 7a 46 75 6e 63 20 29      if( !zFunc )
7230: 7b 0a 20 20 20 20 20 20 7a 46 75 6e 63 74 69 6f  {.      zFunctio
7240: 6e 20 3d 20 22 22 3b 0a 20 20 20 20 7d 65 6c 73  n = "";.    }els
7250: 65 7b 0a 20 20 20 20 20 20 7a 46 72 65 65 20 3d  e{.      zFree =
7260: 20 7a 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73   zFunction = fts
7270: 33 51 75 6f 74 65 49 64 28 7a 46 75 6e 63 29 3b  3QuoteId(zFunc);
7280: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 41  .    }.    fts3A
7290: 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a 52 65  ppendf(pRc, &zRe
72a0: 74 2c 20 22 64 6f 63 69 64 22 29 3b 0a 20 20 20  t, "docid");.   
72b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
72c0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
72d0: 20 20 20 20 66 74 73 33 41 70 70 65 6e 64 66 28      fts3Appendf(
72e0: 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 2c 25 73  pRc, &zRet, ",%s
72f0: 28 78 2e 27 63 25 64 25 71 27 29 22 2c 20 7a 46  (x.'c%d%q')", zF
7300: 75 6e 63 74 69 6f 6e 2c 20 69 2c 20 70 2d 3e 61  unction, i, p->a
7310: 7a 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20  zColumn[i]);.   
7320: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 4c   }.    if( p->zL
7330: 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20 20 20  anguageid ){.   
7340: 20 20 20 66 74 73 33 41 70 70 65 6e 64 66 28 70     fts3Appendf(p
7350: 52 63 2c 20 26 7a 52 65 74 2c 20 22 2c 20 78 2e  Rc, &zRet, ", x.
7360: 25 51 22 2c 20 22 6c 61 6e 67 69 64 22 29 3b 0a  %Q", "langid");.
7370: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7380: 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20  3_free(zFree);. 
7390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 33   }else{.    fts3
73a0: 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a 52  Appendf(pRc, &zR
73b0: 65 74 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  et, "rowid");.  
73c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
73d0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
73e0: 20 20 20 20 20 66 74 73 33 41 70 70 65 6e 64 66       fts3Appendf
73f0: 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 2c 20  (pRc, &zRet, ", 
7400: 78 2e 27 25 71 27 22 2c 20 70 2d 3e 61 7a 43 6f  x.'%q'", p->azCo
7410: 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  lumn[i]);.    }.
7420: 20 20 20 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67      if( p->zLang
7430: 75 61 67 65 69 64 20 29 7b 0a 20 20 20 20 20 20  uageid ){.      
7440: 66 74 73 33 41 70 70 65 6e 64 66 28 70 52 63 2c  fts3Appendf(pRc,
7450: 20 26 7a 52 65 74 2c 20 22 2c 20 78 2e 25 51 22   &zRet, ", x.%Q"
7460: 2c 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  , p->zLanguageid
7470: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
7480: 74 73 33 41 70 70 65 6e 64 66 28 70 52 63 2c 20  ts3Appendf(pRc, 
7490: 26 7a 52 65 74 2c 20 22 20 46 52 4f 4d 20 27 25  &zRet, " FROM '%
74a0: 71 27 2e 27 25 71 25 73 27 20 41 53 20 78 22 2c  q'.'%q%s' AS x",
74b0: 20 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 0a   .      p->zDb,.
74c0: 20 20 20 20 20 20 28 70 2d 3e 7a 43 6f 6e 74 65        (p->zConte
74d0: 6e 74 54 62 6c 20 3f 20 70 2d 3e 7a 43 6f 6e 74  ntTbl ? p->zCont
74e0: 65 6e 74 54 62 6c 20 3a 20 70 2d 3e 7a 4e 61 6d  entTbl : p->zNam
74f0: 65 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e 7a 43  e),.      (p->zC
7500: 6f 6e 74 65 6e 74 54 62 6c 20 3f 20 22 22 20 3a  ontentTbl ? "" :
7510: 20 22 5f 63 6f 6e 74 65 6e 74 22 29 0a 20 20 29   "_content").  )
7520: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ;.  return zRet;
7530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7540: 20 61 20 6c 69 73 74 20 6f 66 20 4e 20 63 6f 6d   a list of N com
7550: 6d 61 20 73 65 70 61 72 61 74 65 64 20 71 75 65  ma separated que
7560: 73 74 69 6f 6e 20 6d 61 72 6b 73 2c 20 77 68 65  stion marks, whe
7570: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
7580: 65 72 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73  er.** of columns
7590: 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e   in the %_conten
75a0: 74 20 74 61 62 6c 65 20 28 6f 6e 65 20 66 6f 72  t table (one for
75b0: 20 74 68 65 20 64 6f 63 69 64 20 70 6c 75 73 20   the docid plus 
75c0: 6f 6e 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  one for each.** 
75d0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 74 65 78  user-defined tex
75e0: 74 20 63 6f 6c 75 6d 6e 29 2e 0a 2a 2a 0a 2a 2a  t column)..**.**
75f0: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 46 75   If argument zFu
7600: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
7610: 74 68 65 6e 20 61 6c 6c 20 62 75 74 20 74 68 65  then all but the
7620: 20 66 69 72 73 74 20 71 75 65 73 74 69 6f 6e 20   first question 
7630: 6d 61 72 6b 0a 2a 2a 20 69 73 20 70 72 65 63 65  mark.** is prece
7640: 64 65 64 20 62 79 20 7a 46 75 6e 63 20 61 6e 64  ded by zFunc and
7650: 20 61 6e 20 6f 70 65 6e 20 62 72 61 63 6b 65 74   an open bracket
7660: 2c 20 61 6e 64 20 66 6f 6c 6c 6f 77 65 64 20 62  , and followed b
7670: 79 20 61 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 72  y a closed.** br
7680: 61 63 6b 65 74 2e 20 46 6f 72 20 65 78 61 6d 70  acket. For examp
7690: 6c 65 2c 20 69 66 20 7a 46 75 6e 63 20 69 73 20  le, if zFunc is 
76a0: 22 7a 69 70 22 20 61 6e 64 20 74 68 65 20 46 54  "zip" and the FT
76b0: 53 33 20 74 61 62 6c 65 20 68 61 73 20 74 68 72  S3 table has thr
76c0: 65 65 20 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69  ee .** user-defi
76d0: 6e 65 64 20 74 65 78 74 20 63 6f 6c 75 6d 6e 73  ned text columns
76e0: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
76f0: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
7700: 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 3f  ed:.**.**     "?
7710: 2c 20 7a 69 70 28 3f 29 2c 20 7a 69 70 28 3f 29  , zip(?), zip(?)
7720: 2c 20 7a 69 70 28 3f 29 22 0a 2a 2a 0a 2a 2a 20  , zip(?)".**.** 
7730: 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
7740: 72 6e 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  rned points to a
7750: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
7760: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c  d by sqlite3_mal
7770: 6c 6f 63 28 29 2e 20 49 74 0a 2a 2a 20 69 73 20  loc(). It.** is 
7780: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
7790: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
77a0: 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   to eventually f
77b0: 72 65 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ree it..**.** If
77c0: 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
77d0: 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
77e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
77f0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
7800: 6f 70 20 28 61 6e 64 0a 2a 2a 20 61 20 4e 55 4c  op (and.** a NUL
7810: 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74  L pointer is ret
7820: 75 72 6e 65 64 29 2e 20 4f 74 68 65 72 77 69 73  urned). Otherwis
7830: 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72  e, if an OOM err
7840: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
7850: 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 66 75 6e  d.** by this fun
7860: 63 74 69 6f 6e 2c 20 4e 55 4c 4c 20 69 73 20 72  ction, NULL is r
7870: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 52 63  eturned and *pRc
7880: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
7890: 45 5f 4e 4f 4d 45 4d 2e 20 49 66 0a 2a 2a 20 6e  E_NOMEM. If.** n
78a0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
78b0: 2a 70 52 63 20 69 73 20 6c 65 66 74 20 75 6e 6d  *pRc is left unm
78c0: 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
78d0: 69 63 20 63 68 61 72 20 2a 66 74 73 33 57 72 69  ic char *fts3Wri
78e0: 74 65 45 78 70 72 4c 69 73 74 28 46 74 73 33 54  teExprList(Fts3T
78f0: 61 62 6c 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  able *p, const c
7900: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 69 6e 74 20  har *zFunc, int 
7910: 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pRc){.  char *z
7920: 52 65 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Ret = 0;.  char 
7930: 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20 63 68  *zFree = 0;.  ch
7940: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 3b 0a 20  ar *zFunction;. 
7950: 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 21   int i;..  if( !
7960: 7a 46 75 6e 63 20 29 7b 0a 20 20 20 20 7a 46 75  zFunc ){.    zFu
7970: 6e 63 74 69 6f 6e 20 3d 20 22 22 3b 0a 20 20 7d  nction = "";.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 7a 46 72 65 65 20  else{.    zFree 
7990: 3d 20 7a 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74  = zFunction = ft
79a0: 73 33 51 75 6f 74 65 49 64 28 7a 46 75 6e 63 29  s3QuoteId(zFunc)
79b0: 3b 0a 20 20 7d 0a 20 20 66 74 73 33 41 70 70 65  ;.  }.  fts3Appe
79c0: 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20  ndf(pRc, &zRet, 
79d0: 22 3f 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  "?");.  for(i=0;
79e0: 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69   i<p->nColumn; i
79f0: 2b 2b 29 7b 0a 20 20 20 20 66 74 73 33 41 70 70  ++){.    fts3App
7a00: 65 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c  endf(pRc, &zRet,
7a10: 20 22 2c 25 73 28 3f 29 22 2c 20 7a 46 75 6e 63   ",%s(?)", zFunc
7a20: 74 69 6f 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tion);.  }.  if(
7a30: 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20   p->zLanguageid 
7a40: 29 7b 0a 20 20 20 20 66 74 73 33 41 70 70 65 6e  ){.    fts3Appen
7a50: 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22  df(pRc, &zRet, "
7a60: 2c 20 3f 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  , ?");.  }.  sql
7a70: 69 74 65 33 5f 66 72 65 65 28 7a 46 72 65 65 29  ite3_free(zFree)
7a80: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ;.  return zRet;
7a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
7aa0: 75 6e 63 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  unction interpre
7ab0: 74 73 20 74 68 65 20 73 74 72 69 6e 67 20 61 74  ts the string at
7ac0: 20 28 2a 70 70 29 20 61 73 20 61 20 6e 6f 6e 2d   (*pp) as a non-
7ad0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
7ae0: 0a 2a 2a 20 76 61 6c 75 65 2e 20 49 74 20 72 65  .** value. It re
7af0: 61 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  ads the integer 
7b00: 61 6e 64 20 73 65 74 73 20 2a 70 6e 4f 75 74 20  and sets *pnOut 
7b10: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
7b20: 64 2c 20 74 68 65 6e 20 0a 2a 2a 20 73 65 74 73  d, then .** sets
7b30: 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
7b40: 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   the byte immedi
7b50: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
7b60: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
7b70: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20  .** the integer 
7b80: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  value..**.** Onl
7b90: 79 20 64 65 63 69 6d 61 6c 20 64 69 67 69 74 73  y decimal digits
7ba0: 20 28 27 30 27 2e 2e 27 39 27 29 20 6d 61 79 20   ('0'..'9') may 
7bb0: 62 65 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e  be part of an in
7bc0: 74 65 67 65 72 20 76 61 6c 75 65 2e 20 0a 2a 2a  teger value. .**
7bd0: 0a 2a 2a 20 49 66 20 2a 70 70 20 64 6f 65 73 20  .** If *pp does 
7be0: 6e 6f 74 20 62 65 69 6e 67 20 77 69 74 68 20 61  not being with a
7bf0: 20 64 65 63 69 6d 61 6c 20 64 69 67 69 74 20 53   decimal digit S
7c00: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 73 20 72  QLITE_ERROR is r
7c10: 65 74 75 72 6e 65 64 20 61 6e 64 0a 2a 2a 20 74  eturned and.** t
7c20: 68 65 20 6f 75 74 70 75 74 20 76 61 6c 75 65 20  he output value 
7c30: 75 6e 64 65 66 69 6e 65 64 2e 20 4f 74 68 65 72  undefined. Other
7c40: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 20 69  wise SQLITE_OK i
7c50: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
7c60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7c70: 69 73 20 75 73 65 64 20 77 68 65 6e 20 70 61 72  is used when par
7c80: 73 69 6e 67 20 74 68 65 20 22 70 72 65 66 69 78  sing the "prefix
7c90: 3d 22 20 46 54 53 34 20 70 61 72 61 6d 65 74 65  =" FTS4 paramete
7ca0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
7cb0: 20 66 74 73 33 47 6f 62 62 6c 65 49 6e 74 28 63   fts3GobbleInt(c
7cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 70 2c 20  onst char **pp, 
7cd0: 69 6e 74 20 2a 70 6e 4f 75 74 29 7b 0a 20 20 63  int *pnOut){.  c
7ce0: 6f 6e 73 74 20 69 6e 74 20 4d 41 58 5f 4e 50 52  onst int MAX_NPR
7cf0: 45 46 49 58 20 3d 20 31 30 30 30 30 30 30 30 3b  EFIX = 10000000;
7d00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
7d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d20: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 70     /* Iterator p
7d30: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
7d40: 6e 49 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  nInt = 0;       
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7d60: 75 74 70 75 74 20 76 61 6c 75 65 20 2a 2f 0a 0a  utput value */..
7d70: 20 20 66 6f 72 28 70 3d 2a 70 70 3b 20 70 5b 30    for(p=*pp; p[0
7d80: 5d 3e 3d 27 30 27 20 26 26 20 70 5b 30 5d 3c 3d  ]>='0' && p[0]<=
7d90: 27 39 27 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 6e  '9'; p++){.    n
7da0: 49 6e 74 20 3d 20 6e 49 6e 74 20 2a 20 31 30 20  Int = nInt * 10 
7db0: 2b 20 28 70 5b 30 5d 20 2d 20 27 30 27 29 3b 0a  + (p[0] - '0');.
7dc0: 20 20 20 20 69 66 28 20 6e 49 6e 74 3e 4d 41 58      if( nInt>MAX
7dd0: 5f 4e 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20  _NPREFIX ){.    
7de0: 20 20 6e 49 6e 74 20 3d 20 30 3b 0a 20 20 20 20    nInt = 0;.    
7df0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7e00: 20 7d 0a 20 20 69 66 28 20 70 3d 3d 2a 70 70 20   }.  if( p==*pp 
7e10: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7e20: 45 52 52 4f 52 3b 0a 20 20 2a 70 6e 4f 75 74 20  ERROR;.  *pnOut 
7e30: 3d 20 6e 49 6e 74 3b 0a 20 20 2a 70 70 20 3d 20  = nInt;.  *pp = 
7e40: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
7e50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7e60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7e70: 20 63 61 6c 6c 65 64 20 74 6f 20 61 6c 6c 6f 63   called to alloc
7e80: 61 74 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ate an array of 
7e90: 46 74 73 33 49 6e 64 65 78 20 73 74 72 75 63 74  Fts3Index struct
7ea0: 75 72 65 73 0a 2a 2a 20 72 65 70 72 65 73 65 6e  ures.** represen
7eb0: 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 73  ting the indexes
7ec0: 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
7ed0: 68 65 20 63 75 72 72 65 6e 74 20 46 54 53 20 74  he current FTS t
7ee0: 61 62 6c 65 2e 20 46 54 53 20 74 61 62 6c 65 73  able. FTS tables
7ef0: 0a 2a 2a 20 61 6c 77 61 79 73 20 6d 61 69 6e 74  .** always maint
7f00: 61 69 6e 20 74 68 65 20 6d 61 69 6e 20 22 74 65  ain the main "te
7f10: 72 6d 73 22 20 69 6e 64 65 78 2c 20 62 75 74 20  rms" index, but 
7f20: 6d 61 79 20 61 6c 73 6f 20 6d 61 69 6e 74 61 69  may also maintai
7f30: 6e 20 6f 6e 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  n one or.** more
7f40: 20 22 70 72 65 66 69 78 22 20 69 6e 64 65 78 65   "prefix" indexe
7f50: 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  s, depending on 
7f60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
7f70: 20 22 70 72 65 66 69 78 3d 22 20 70 61 72 61 6d   "prefix=" param
7f80: 65 74 65 72 0a 2a 2a 20 28 69 66 20 61 6e 79 29  eter.** (if any)
7f90: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61   specified as pa
7fa0: 72 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  rt of the CREATE
7fb0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 73   VIRTUAL TABLE s
7fc0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
7fd0: 41 72 67 75 6d 65 6e 74 20 7a 50 61 72 61 6d 20  Argument zParam 
7fe0: 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61  is passed the va
7ff0: 6c 75 65 20 6f 66 20 74 68 65 20 22 70 72 65 66  lue of the "pref
8000: 69 78 3d 22 20 6f 70 74 69 6f 6e 20 69 66 20 6f  ix=" option if o
8010: 6e 65 20 77 61 73 0a 2a 2a 20 73 70 65 63 69 66  ne was.** specif
8020: 69 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 6f 74 68  ied, or NULL oth
8030: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
8040: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
8050: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
8060: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 61 70 49  eturned and *apI
8070: 6e 64 65 78 20 73 65 74 20 74 6f 20 70 6f 69 6e  ndex set to poin
8080: 74 20 74 6f 0a 2a 2a 20 74 68 65 20 61 6c 6c 6f  t to.** the allo
8090: 63 61 74 65 64 20 61 72 72 61 79 2e 20 2a 70 6e  cated array. *pn
80a0: 49 6e 64 65 78 20 69 73 20 73 65 74 20 74 6f 20  Index is set to 
80b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
80c0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 0a 2a 2a  ements in the.**
80d0: 20 61 72 72 61 79 2e 20 49 66 20 61 6e 20 65 72   array. If an er
80e0: 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
80f0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
8100: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8110: 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
8120: 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
8130: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
8140: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
8150: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
8160: 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61  ity.** of the ca
8170: 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 73 71 6c  ller to call sql
8180: 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20 74  ite3_free() on t
8190: 68 65 20 6f 75 74 70 75 74 20 61 72 72 61 79 20  he output array 
81a0: 74 6f 20 66 72 65 65 20 69 74 2e 0a 2a 2f 0a 73  to free it..*/.s
81b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 72  tatic int fts3Pr
81c0: 65 66 69 78 50 61 72 61 6d 65 74 65 72 28 0a 20  efixParameter(. 
81d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
81e0: 72 61 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  ram,            
81f0: 20 2f 2a 20 41 42 43 20 69 6e 20 70 72 65 66 69   /* ABC in prefi
8200: 78 3d 41 42 43 20 70 61 72 61 6d 65 74 65 72 20  x=ABC parameter 
8210: 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e  to parse */.  in
8220: 74 20 2a 70 6e 49 6e 64 65 78 2c 20 20 20 20 20  t *pnIndex,     
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8240: 20 4f 55 54 3a 20 73 69 7a 65 20 6f 66 20 2a 61   OUT: size of *a
8250: 70 49 6e 64 65 78 5b 5d 20 61 72 72 61 79 20 2a  pIndex[] array *
8260: 2f 0a 20 20 73 74 72 75 63 74 20 46 74 73 33 49  /.  struct Fts3I
8270: 6e 64 65 78 20 2a 2a 61 70 49 6e 64 65 78 20 20  ndex **apIndex  
8280: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61      /* OUT: Arra
8290: 79 20 6f 66 20 69 6e 64 65 78 65 73 20 66 6f 72  y of indexes for
82a0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29   this table */.)
82b0: 7b 0a 20 20 73 74 72 75 63 74 20 46 74 73 33 49  {.  struct Fts3I
82c0: 6e 64 65 78 20 2a 61 49 6e 64 65 78 3b 20 20 20  ndex *aIndex;   
82d0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
82e0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
82f0: 6e 49 6e 64 65 78 20 3d 20 31 3b 20 20 20 20 20  nIndex = 1;     
8300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8310: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
8320: 20 69 6e 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20   in array */..  
8330: 69 66 28 20 7a 50 61 72 61 6d 20 26 26 20 7a 50  if( zParam && zP
8340: 61 72 61 6d 5b 30 5d 20 29 7b 0a 20 20 20 20 63  aram[0] ){.    c
8350: 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 0a 20 20  onst char *p;.  
8360: 20 20 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20 20 20    nIndex++;.    
8370: 66 6f 72 28 70 3d 7a 50 61 72 61 6d 3b 20 2a 70  for(p=zParam; *p
8380: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; p++){.      if
8390: 28 20 2a 70 3d 3d 27 2c 27 20 29 20 6e 49 6e 64  ( *p==',' ) nInd
83a0: 65 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ex++;.    }.  }.
83b0: 0a 20 20 61 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  aIndex = sqli
83c0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a  te3_malloc64(siz
83d0: 65 6f 66 28 73 74 72 75 63 74 20 46 74 73 33 49  eof(struct Fts3I
83e0: 6e 64 65 78 29 20 2a 20 6e 49 6e 64 65 78 29 3b  ndex) * nIndex);
83f0: 0a 20 20 2a 61 70 49 6e 64 65 78 20 3d 20 61 49  .  *apIndex = aI
8400: 6e 64 65 78 3b 0a 20 20 69 66 28 20 21 61 49 6e  ndex;.  if( !aIn
8410: 64 65 78 20 29 7b 0a 20 20 20 20 72 65 74 75 72  dex ){.    retur
8420: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8430: 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 61 49    }..  memset(aI
8440: 6e 64 65 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ndex, 0, sizeof(
8450: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78  struct Fts3Index
8460: 29 20 2a 20 6e 49 6e 64 65 78 29 3b 0a 20 20 69  ) * nIndex);.  i
8470: 66 28 20 7a 50 61 72 61 6d 20 29 7b 0a 20 20 20  f( zParam ){.   
8480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 20 3d   const char *p =
8490: 20 7a 50 61 72 61 6d 3b 0a 20 20 20 20 69 6e 74   zParam;.    int
84a0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
84b0: 20 69 3c 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b   i<nIndex; i++){
84c0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 66  .      int nPref
84d0: 69 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ix = 0;.      if
84e0: 28 20 66 74 73 33 47 6f 62 62 6c 65 49 6e 74 28  ( fts3GobbleInt(
84f0: 26 70 2c 20 26 6e 50 72 65 66 69 78 29 20 29 20  &p, &nPrefix) ) 
8500: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
8510: 52 4f 52 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ROR;.      asser
8520: 74 28 20 6e 50 72 65 66 69 78 3e 3d 30 20 29 3b  t( nPrefix>=0 );
8530: 0a 20 20 20 20 20 20 69 66 28 20 6e 50 72 65 66  .      if( nPref
8540: 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ix==0 ){.       
8550: 20 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20 20 20 20   nIndex--;.     
8560: 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 7d 65     i--;.      }e
8570: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 49 6e  lse{.        aIn
8580: 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78 20 3d  dex[i].nPrefix =
8590: 20 6e 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   nPrefix;.      
85a0: 7d 0a 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20 20  }.      p++;.   
85b0: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 6e 49 6e 64   }.  }..  *pnInd
85c0: 65 78 20 3d 20 6e 49 6e 64 65 78 3b 0a 20 20 72  ex = nIndex;.  r
85d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
85e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
85f0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
8600: 64 20 77 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a  d when initializ
8610: 69 6e 67 20 61 6e 20 46 54 53 34 20 74 61 62 6c  ing an FTS4 tabl
8620: 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 0a  e that uses the.
8630: 2a 2a 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f  ** content=xxx o
8640: 70 74 69 6f 6e 2e 20 49 74 20 64 65 74 65 72 6d  ption. It determ
8650: 69 6e 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ines the number 
8660: 6f 66 20 61 6e 64 20 6e 61 6d 65 73 20 6f 66 20  of and names of 
8670: 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  the columns.** o
8680: 66 20 74 68 65 20 6e 65 77 20 46 54 53 34 20 74  f the new FTS4 t
8690: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
86a0: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 70  third argument p
86b0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
86c0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 76 61  nction is the va
86d0: 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  lue passed to th
86e0: 65 0a 2a 2a 20 63 6f 6e 66 69 67 3d 78 78 78 20  e.** config=xxx 
86f0: 6f 70 74 69 6f 6e 20 28 69 2e 65 2e 20 22 78 78  option (i.e. "xx
8700: 78 22 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  x"). This functi
8710: 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65 20 64  on queries the d
8720: 61 74 61 62 61 73 65 20 66 6f 72 0a 2a 2a 20 61  atabase for.** a
8730: 20 74 61 62 6c 65 20 6f 66 20 74 68 61 74 20 6e   table of that n
8740: 61 6d 65 2e 20 49 66 20 66 6f 75 6e 64 2c 20 74  ame. If found, t
8750: 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
8760: 6c 65 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65  les are populate
8770: 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d.** as follows:
8780: 0a 2a 2a 0a 2a 2a 20 20 20 2a 70 6e 43 6f 6c 3a  .**.**   *pnCol:
8790: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 6e 75     Set to the nu
87a0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
87b0: 74 61 62 6c 65 20 78 78 78 20 68 61 73 2c 0a 2a  table xxx has,.*
87c0: 2a 0a 2a 2a 20 20 20 2a 70 6e 53 74 72 3a 20 20  *.**   *pnStr:  
87d0: 20 53 65 74 20 74 6f 20 74 68 65 20 74 6f 74 61   Set to the tota
87e0: 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  l amount of spac
87f0: 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
8800: 6f 72 65 20 61 20 63 6f 70 79 0a 2a 2a 20 20 20  ore a copy.**   
8810: 20 20 20 20 20 20 20 20 20 20 6f 66 20 65 61 63            of eac
8820: 68 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 2c 20  h columns name, 
8830: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75  including the nu
8840: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a  l-terminator..**
8850: 0a 2a 2a 20 20 20 2a 70 61 7a 43 6f 6c 3a 20 20  .**   *pazCol:  
8860: 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  Set to point to 
8870: 61 6e 20 61 72 72 61 79 20 6f 66 20 2a 70 6e 43  an array of *pnC
8880: 6f 6c 20 73 74 72 69 6e 67 73 2e 20 45 61 63 68  ol strings. Each
8890: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 20 20   string is.**   
88a0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 6e 61            the na
88b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73  me of the corres
88c0: 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 69  ponding column i
88d0: 6e 20 74 61 62 6c 65 20 78 78 78 2e 20 54 68 65  n table xxx. The
88e0: 20 61 72 72 61 79 0a 2a 2a 20 20 20 20 20 20 20   array.**       
88f0: 20 20 20 20 20 20 61 6e 64 20 69 74 73 20 63 6f        and its co
8900: 6e 74 65 6e 74 73 20 61 72 65 20 61 6c 6c 6f 63  ntents are alloc
8910: 61 74 65 64 20 75 73 69 6e 67 20 61 20 73 69 6e  ated using a sin
8920: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  gle allocation. 
8930: 49 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  It.**           
8940: 20 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73    is the respons
8950: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
8960: 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68  aller to free th
8970: 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  is allocation.**
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79 20               by 
8990: 65 76 65 6e 74 75 61 6c 6c 79 20 70 61 73 73 69  eventually passi
89a0: 6e 67 20 74 68 65 20 2a 70 61 7a 43 6f 6c 20 76  ng the *pazCol v
89b0: 61 6c 75 65 20 74 6f 20 73 71 6c 69 74 65 33 5f  alue to sqlite3_
89c0: 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  free()..**.** If
89d0: 20 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e 6f   the table canno
89e0: 74 20 62 65 20 66 6f 75 6e 64 2c 20 61 6e 20 65  t be found, an e
89f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8a00: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75  urned and the ou
8a10: 74 70 75 74 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tput.** variable
8a20: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
8a30: 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 69   Or, if an OOM i
8a40: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 53  s encountered, S
8a50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 0a 2a  QLITE_NOMEM is.*
8a60: 2a 20 72 65 74 75 72 6e 65 64 20 28 61 6e 64 20  * returned (and 
8a70: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
8a80: 62 6c 65 73 20 61 72 65 20 75 6e 64 65 66 69 6e  bles are undefin
8a90: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
8aa0: 6e 74 20 66 74 73 33 43 6f 6e 74 65 6e 74 43 6f  nt fts3ContentCo
8ab0: 6c 75 6d 6e 73 28 0a 20 20 73 71 6c 69 74 65 33  lumns(.  sqlite3
8ac0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
8ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8ae0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
8af0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
8b00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8b10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 62 20 28   /* Name of db (
8b20: 69 2e 65 2e 20 22 6d 61 69 6e 22 2c 20 22 74 65  i.e. "main", "te
8b30: 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 63  mp" etc.) */.  c
8b40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c  onst char *zTbl,
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6e 74 65 6e  * Name of conten
8b70: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e  t table */.  con
8b80: 73 74 20 63 68 61 72 20 2a 2a 2a 70 61 7a 43 6f  st char ***pazCo
8b90: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l,           /* 
8ba0: 4f 55 54 3a 20 4d 61 6c 6c 6f 63 27 64 20 61 72  OUT: Malloc'd ar
8bb0: 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61  ray of column na
8bc0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  mes */.  int *pn
8bd0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
8be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
8bf0: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 2a   Size of array *
8c00: 70 61 7a 43 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20  pazCol */.  int 
8c10: 2a 70 6e 53 74 72 2c 20 20 20 20 20 20 20 20 20  *pnStr,         
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8c30: 55 54 3a 20 42 79 74 65 73 20 6f 66 20 73 74 72  UT: Bytes of str
8c40: 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ing content */. 
8c50: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 2f 2a 20 4f 55 54 3a 20 65 72 72 6f 72 20 6d   /* OUT: error m
8c80: 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  essage */.){.  i
8c90: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8ca0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
8cb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
8cc0: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  .  char *zSql;  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 2f 2a 20 22 53 45 4c 45 43 54 20 2a 22     /* "SELECT *"
8cf0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 7a 54   statement on zT
8d00: 62 6c 20 2a 2f 20 20 0a 20 20 73 71 6c 69 74 65  bl */  .  sqlite
8d10: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
8d20: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  0;        /* Com
8d30: 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
8d40: 20 7a 53 71 6c 20 2a 2f 0a 0a 20 20 7a 53 71 6c   zSql */..  zSql
8d50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
8d60: 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
8d70: 4d 20 25 51 2e 25 51 22 2c 20 7a 44 62 2c 20 7a  M %Q.%Q", zDb, z
8d80: 54 62 6c 29 3b 0a 20 20 69 66 28 20 21 7a 53 71  Tbl);.  if( !zSq
8d90: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
8da0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
8db0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
8dc0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
8dd0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
8de0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
8df0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8e00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
8e10: 73 33 45 72 72 4d 73 67 28 70 7a 45 72 72 2c 20  s3ErrMsg(pzErr, 
8e20: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
8e30: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
8e40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
8e50: 72 65 65 28 7a 53 71 6c 29 3b 0a 0a 20 20 69 66  ree(zSql);..  if
8e60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8e70: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
8e80: 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20 20 20 20  r **azCol;      
8e90: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 61       /* Output a
8ea0: 72 72 61 79 20 2a 2f 0a 20 20 20 20 73 71 6c 69  rray */.    sqli
8eb0: 74 65 33 5f 69 6e 74 36 34 20 6e 53 74 72 20 3d  te3_int64 nStr =
8ec0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a   0;       /* Siz
8ed0: 65 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  e of all column 
8ee0: 6e 61 6d 65 73 20 28 69 6e 63 6c 2e 20 30 78 30  names (incl. 0x0
8ef0: 30 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  0) */.    int nC
8f00: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
8f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8f20: 72 20 6f 66 20 74 61 62 6c 65 20 63 6f 6c 75 6d  r of table colum
8f30: 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ns */.    int i;
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
8f60: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
8f70: 67 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20  gh columns */.. 
8f80: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
8f90: 67 68 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  gh the returned 
8fa0: 63 6f 6c 75 6d 6e 73 2e 20 53 65 74 20 6e 53 74  columns. Set nSt
8fb0: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
8fc0: 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
8fd0: 2a 2a 20 73 70 61 63 65 20 72 65 71 75 69 72 65  ** space require
8fe0: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  d to store a cop
8ff0: 79 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  y of each column
9000: 20 6e 61 6d 65 2c 20 69 6e 63 6c 75 64 69 6e 67   name, including
9010: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6c 2d   the.    ** nul-
9020: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 2e  terminator byte.
9030: 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6c 20 3d 20    */.    nCol = 
9040: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
9050: 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
9060: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
9070: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
9080: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
9090: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
90a0: 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a  name(pStmt, i);.
90b0: 20 20 20 20 20 20 6e 53 74 72 20 2b 3d 20 73 74        nStr += st
90c0: 72 6c 65 6e 28 7a 43 6f 6c 29 20 2b 20 31 3b 0a  rlen(zCol) + 1;.
90d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
90e0: 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
90f0: 61 74 65 20 74 68 65 20 61 72 72 61 79 20 74 6f  ate the array to
9100: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 20 20   return. */.    
9110: 61 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  azCol = (const c
9120: 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d  har **)sqlite3_m
9130: 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 63  alloc64(sizeof(c
9140: 68 61 72 20 2a 29 20 2a 20 6e 43 6f 6c 20 2b 20  har *) * nCol + 
9150: 6e 53 74 72 29 3b 0a 20 20 20 20 69 66 28 20 61  nStr);.    if( a
9160: 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCol==0 ){.     
9170: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9180: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
9190: 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28       char *p = (
91a0: 63 68 61 72 20 2a 29 26 61 7a 43 6f 6c 5b 6e 43  char *)&azCol[nC
91b0: 6f 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ol];.      for(i
91c0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
91d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
91e0: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c  char *zCol = sql
91f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
9200: 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
9210: 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
9220: 29 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 2b 31 3b  )strlen(zCol)+1;
9230: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
9240: 70 2c 20 7a 43 6f 6c 2c 20 6e 29 3b 0a 20 20 20  p, zCol, n);.   
9250: 20 20 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20       azCol[i] = 
9260: 70 3b 0a 20 20 20 20 20 20 20 20 70 20 2b 3d 20  p;.        p += 
9270: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
9280: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
9290: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20  alize(pStmt);.. 
92a0: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75     /* Set the ou
92b0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20  tput variables. 
92c0: 2a 2f 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  */.    *pnCol = 
92d0: 6e 43 6f 6c 3b 0a 20 20 20 20 2a 70 6e 53 74 72  nCol;.    *pnStr
92e0: 20 3d 20 6e 53 74 72 3b 0a 20 20 20 20 2a 70 61   = nStr;.    *pa
92f0: 7a 43 6f 6c 20 3d 20 61 7a 43 6f 6c 3b 0a 20 20  zCol = azCol;.  
9300: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
9310: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
9320: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d  nction is the im
9330: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
9340: 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63  both the xConnec
9350: 74 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a  t and xCreate.**
9360: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
9370: 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62  FTS3 virtual tab
9380: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72  le..**.** The ar
9390: 67 76 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  gv[] array conta
93a0: 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ins the followin
93b0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b  g:.**.**   argv[
93c0: 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e  0]   -> module n
93d0: 61 6d 65 20 20 28 22 66 74 73 33 22 20 6f 72 20  ame  ("fts3" or 
93e0: 22 66 74 73 34 22 29 0a 2a 2a 20 20 20 61 72 67  "fts4").**   arg
93f0: 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61  v[1]   -> databa
9400: 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  se name.**   arg
9410: 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20  v[2]   -> table 
9420: 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e  name.**   argv[.
9430: 2e 2e 5d 20 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e  ..] -> "column n
9440: 61 6d 65 22 20 61 6e 64 20 6f 74 68 65 72 20 6d  ame" and other m
9450: 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 20 66  odule argument f
9460: 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ields..*/.static
9470: 20 69 6e 74 20 66 74 73 33 49 6e 69 74 56 74 61   int fts3InitVta
9480: 62 28 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  b(.  int isCreat
9490: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
94a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
94b0: 20 78 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20   xCreate, false 
94c0: 66 6f 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a  for xConnect */.
94d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 2f 2a 20 54 68 65 20 53 51 4c 69 74 65 20    /* The SQLite 
9500: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9510: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
9520: 41 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Aux,            
9530: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
9540: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
9550: 67 20 74 6f 6b 65 6e 69 7a 65 72 73 20 2a 2f 0a  g tokenizers */.
9560: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
9590: 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20  lements in argv 
95a0: 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  array */.  const
95b0: 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61   char * const *a
95c0: 72 67 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43  rgv,       /* xC
95d0: 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61  reate/xConnect a
95e0: 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f  rgument array */
95f0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
9600: 2a 2a 70 70 56 54 61 62 2c 20 20 20 20 20 20 20  **ppVTab,       
9610: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
9620: 72 65 73 75 6c 74 69 6e 67 20 76 74 61 62 20 73  resulting vtab s
9630: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
9640: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20  .  char **pzErr 
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6e 79 20     /* Write any 
9670: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65  error message he
9680: 72 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 48  re */.){.  Fts3H
9690: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 28 46 74  ash *pHash = (Ft
96a0: 73 33 48 61 73 68 20 2a 29 70 41 75 78 3b 0a 20  s3Hash *)pAux;. 
96b0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
96c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
96d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
96e0: 6c 6c 6f 63 61 74 65 64 20 76 74 61 62 20 2a 2f  llocated vtab */
96f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9700: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
9710: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
9720: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
9750: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
9760: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
9770: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
9780: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f   /* Size of allo
9790: 63 61 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20  cation used for 
97a0: 2a 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  *p */.  int iCol
97b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
97c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
97d0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  n index */.  int
97e0: 20 6e 53 74 72 69 6e 67 20 3d 20 30 3b 20 20 20   nString = 0;   
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9800: 42 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  Bytes required t
9810: 6f 20 68 6f 6c 64 20 61 6c 6c 20 63 6f 6c 75 6d  o hold all colum
9820: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
9830: 20 6e 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20   nCol = 0;      
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9850: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
9860: 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
9870: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  le */.  char *zC
9880: 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
9890: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
98a0: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6c   for holding col
98b0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
98c0: 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98e0: 2a 20 42 79 74 65 73 20 72 65 71 75 69 72 65 64  * Bytes required
98f0: 20 74 6f 20 68 6f 6c 64 20 64 61 74 61 62 61 73   to hold databas
9900: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
9910: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
9920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
9930: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
9940: 20 68 6f 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65   hold table name
9950: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 74 73 34   */.  int isFts4
9960: 20 3d 20 28 61 72 67 76 5b 30 5d 5b 33 5d 3d 3d   = (argv[0][3]==
9970: 27 34 27 29 3b 20 2f 2a 20 54 72 75 65 20 66 6f  '4'); /* True fo
9980: 72 20 46 54 53 34 2c 20 66 61 6c 73 65 20 66 6f  r FTS4, false fo
9990: 72 20 46 54 53 33 20 2a 2f 0a 20 20 63 6f 6e 73  r FTS3 */.  cons
99a0: 74 20 63 68 61 72 20 2a 2a 61 43 6f 6c 3b 20 20  t char **aCol;  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
99c0: 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  rray of column n
99d0: 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ames */.  sqlite
99e0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  3_tokenizer *pTo
99f0: 6b 65 6e 69 7a 65 72 20 3d 20 30 3b 20 20 20 20  kenizer = 0;    
9a00: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72      /* Tokenizer
9a10: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
9a20: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78  */..  int nIndex
9a30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a40: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9a50: 20 61 49 6e 64 65 78 5b 5d 20 61 72 72 61 79 20   aIndex[] array 
9a60: 2a 2f 0a 20 20 73 74 72 75 63 74 20 46 74 73 33  */.  struct Fts3
9a70: 49 6e 64 65 78 20 2a 61 49 6e 64 65 78 20 3d 20  Index *aIndex = 
9a80: 30 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  0;   /* Array of
9a90: 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74 68 69   indexes for thi
9aa0: 73 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  s table */..  /*
9ab0: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
9ac0: 70 61 72 73 69 6e 67 20 73 75 70 70 6f 72 74 65  parsing supporte
9ad0: 64 20 46 54 53 34 20 6b 65 79 3d 76 61 6c 75 65  d FTS4 key=value
9ae0: 20 6f 70 74 69 6f 6e 73 3a 20 2a 2f 0a 20 20 69   options: */.  i
9af0: 6e 74 20 62 4e 6f 44 6f 63 73 69 7a 65 20 3d 20  nt bNoDocsize = 
9b00: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
9b10: 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 25  * True to omit %
9b20: 5f 64 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 2a  _docsize table *
9b30: 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49 64 78  /.  int bDescIdx
9b40: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9b50: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
9b60: 74 6f 72 65 20 64 65 73 63 65 6e 64 69 6e 67 20  tore descending 
9b70: 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 63 68 61  indexes */.  cha
9b80: 72 20 2a 7a 50 72 65 66 69 78 20 3d 20 30 3b 20  r *zPrefix = 0; 
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ba0: 50 72 65 66 69 78 20 70 61 72 61 6d 65 74 65 72  Prefix parameter
9bb0: 20 76 61 6c 75 65 20 28 6f 72 20 4e 55 4c 4c 29   value (or NULL)
9bc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d   */.  char *zCom
9bd0: 70 72 65 73 73 20 3d 20 30 3b 20 20 20 20 20 20  press = 0;      
9be0: 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 72 65 73        /* compres
9bf0: 73 3d 3f 20 70 61 72 61 6d 65 74 65 72 20 28 6f  s=? parameter (o
9c00: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61  r NULL) */.  cha
9c10: 72 20 2a 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d  r *zUncompress =
9c20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
9c30: 75 6e 63 6f 6d 70 72 65 73 73 3d 3f 20 70 61 72  uncompress=? par
9c40: 61 6d 65 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29  ameter (or NULL)
9c50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
9c60: 74 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  tent = 0;       
9c70: 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 6e 74        /* content
9c80: 3d 3f 20 70 61 72 61 6d 65 74 65 72 20 28 6f 72  =? parameter (or
9c90: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72   NULL) */.  char
9ca0: 20 2a 7a 4c 61 6e 67 75 61 67 65 69 64 20 3d 20   *zLanguageid = 
9cb0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c  0;          /* l
9cc0: 61 6e 67 75 61 67 65 69 64 3d 3f 20 70 61 72 61  anguageid=? para
9cd0: 6d 65 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20  meter (or NULL) 
9ce0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e 6f  */.  char **azNo
9cf0: 74 69 6e 64 65 78 65 64 20 3d 20 30 3b 20 20 20  tindexed = 0;   
9d00: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 74 20       /* The set 
9d10: 6f 66 20 6e 6f 74 69 6e 64 65 78 65 64 3d 20 63  of notindexed= c
9d20: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  olumns */.  int 
9d30: 6e 4e 6f 74 69 6e 64 65 78 65 64 20 3d 20 30 3b  nNotindexed = 0;
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9d50: 69 7a 65 20 6f 66 20 61 7a 4e 6f 74 69 6e 64 65  ize of azNotinde
9d60: 78 65 64 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 0a  xed[] array */..
9d70: 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e    assert( strlen
9d80: 28 61 72 67 76 5b 30 5d 29 3d 3d 34 20 29 3b 0a  (argv[0])==4 );.
9d90: 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74    assert( (sqlit
9da0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76  e3_strnicmp(argv
9db0: 5b 30 5d 2c 20 22 66 74 73 34 22 2c 20 34 29 3d  [0], "fts4", 4)=
9dc0: 3d 30 20 26 26 20 69 73 46 74 73 34 29 0a 20 20  =0 && isFts4).  
9dd0: 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
9de0: 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76 5b 30  _strnicmp(argv[0
9df0: 5d 2c 20 22 66 74 73 33 22 2c 20 34 29 3d 3d 30  ], "fts3", 4)==0
9e00: 20 26 26 20 21 69 73 46 74 73 34 29 0a 20 20 29   && !isFts4).  )
9e10: 3b 0a 0a 20 20 6e 44 62 20 3d 20 28 69 6e 74 29  ;..  nDb = (int)
9e20: 73 74 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 20  strlen(argv[1]) 
9e30: 2b 20 31 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28  + 1;.  nName = (
9e40: 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b  int)strlen(argv[
9e50: 32 5d 29 20 2b 20 31 3b 0a 0a 20 20 6e 42 79 74  2]) + 1;..  nByt
9e60: 65 20 3d 20 73 69 7a 65 6f 66 28 63 6f 6e 73 74  e = sizeof(const
9e70: 20 63 68 61 72 20 2a 29 20 2a 20 28 61 72 67 63   char *) * (argc
9e80: 2d 32 29 3b 0a 20 20 61 43 6f 6c 20 3d 20 28 63  -2);.  aCol = (c
9e90: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 73 71 6c  onst char **)sql
9ea0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42  ite3_malloc64(nB
9eb0: 79 74 65 29 3b 0a 20 20 69 66 28 20 61 43 6f 6c  yte);.  if( aCol
9ec0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 28   ){.    memset((
9ed0: 76 6f 69 64 2a 29 61 43 6f 6c 2c 20 30 2c 20 6e  void*)aCol, 0, n
9ee0: 42 79 74 65 29 3b 0a 20 20 20 20 61 7a 4e 6f 74  Byte);.    azNot
9ef0: 69 6e 64 65 78 65 64 20 3d 20 28 63 68 61 72 20  indexed = (char 
9f00: 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  **)sqlite3_mallo
9f10: 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  c64(nByte);.  }.
9f20: 20 20 69 66 28 20 61 7a 4e 6f 74 69 6e 64 65 78    if( azNotindex
9f30: 65 64 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  ed ){.    memset
9f40: 28 61 7a 4e 6f 74 69 6e 64 65 78 65 64 2c 20 30  (azNotindexed, 0
9f50: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
9f60: 69 66 28 20 21 61 43 6f 6c 20 7c 7c 20 21 61 7a  if( !aCol || !az
9f70: 4e 6f 74 69 6e 64 65 78 65 64 20 29 7b 0a 20 20  Notindexed ){.  
9f80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
9f90: 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 74  MEM;.    goto ft
9fa0: 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 20 20 7d  s3_init_out;.  }
9fb0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
9fc0: 75 67 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ugh all of the a
9fd0: 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
9fe0: 62 79 20 74 68 65 20 75 73 65 72 20 74 6f 20 74  by the user to t
9ff0: 68 65 20 46 54 53 33 2f 34 0a 20 20 2a 2a 20 6d  he FTS3/4.  ** m
a000: 6f 64 75 6c 65 20 28 69 2e 65 2e 20 61 6c 6c 20  odule (i.e. all 
a010: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
a020: 20 61 6e 64 20 73 70 65 63 69 61 6c 20 61 72 67   and special arg
a030: 75 6d 65 6e 74 73 29 2e 20 54 68 69 73 20 6c 6f  uments). This lo
a040: 6f 70 0a 20 20 2a 2a 20 64 6f 65 73 20 74 68 65  op.  ** does the
a050: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
a060: 0a 20 20 2a 2a 20 20 20 2b 20 46 69 67 75 72 65  .  **   + Figure
a070: 73 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  s out the number
a080: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20   of columns the 
a090: 46 54 53 58 20 74 61 62 6c 65 20 77 69 6c 6c 20  FTSX table will 
a0a0: 68 61 76 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 20  have, and.  **  
a0b0: 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66     the number of
a0c0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
a0d0: 74 68 61 74 20 6d 75 73 74 20 62 65 20 61 6c 6c  that must be all
a0e0: 6f 63 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  ocated to store 
a0f0: 63 6f 70 69 65 73 0a 20 20 2a 2a 20 20 20 20 20  copies.  **     
a100: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  of the column na
a110: 6d 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mes..  **.  **  
a120: 20 2b 20 49 66 20 74 68 65 72 65 20 69 73 20 61   + If there is a
a130: 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65 63 69   tokenizer speci
a140: 66 69 63 61 74 69 6f 6e 20 69 6e 63 6c 75 64 65  fication include
a150: 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d in the argumen
a160: 74 73 2c 0a 20 20 2a 2a 20 20 20 20 20 69 6e 69  ts,.  **     ini
a170: 74 69 61 6c 69 7a 65 73 20 74 68 65 20 74 6f 6b  tializes the tok
a180: 65 6e 69 7a 65 72 20 70 54 6f 6b 65 6e 69 7a 65  enizer pTokenize
a190: 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  r..  */.  for(i=
a1a0: 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  3; rc==SQLITE_OK
a1b0: 20 26 26 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29   && i<argc; i++)
a1c0: 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  {.    char const
a1d0: 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20   *z = argv[i];. 
a1e0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
a1f0: 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20   char *zVal;..  
a200: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
a210: 69 73 20 69 73 20 61 20 74 6f 6b 65 6e 69 7a 65  is is a tokenize
a220: 72 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  r specification 
a230: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 54 6f 6b  */.    if( !pTok
a240: 65 6e 69 7a 65 72 20 0a 20 20 20 20 20 26 26 20  enizer .     && 
a250: 73 74 72 6c 65 6e 28 7a 29 3e 38 0a 20 20 20 20  strlen(z)>8.    
a260: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73   && 0==sqlite3_s
a270: 74 72 6e 69 63 6d 70 28 7a 2c 20 22 74 6f 6b 65  trnicmp(z, "toke
a280: 6e 69 7a 65 22 2c 20 38 29 20 0a 20 20 20 20 20  nize", 8) .     
a290: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
a2a0: 33 49 73 49 64 43 68 61 72 28 7a 5b 38 5d 29 0a  3IsIdChar(z[8]).
a2b0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
a2c0: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  = sqlite3Fts3Ini
a2d0: 74 54 6f 6b 65 6e 69 7a 65 72 28 70 48 61 73 68  tTokenizer(pHash
a2e0: 2c 20 26 7a 5b 39 5d 2c 20 26 70 54 6f 6b 65 6e  , &z[9], &pToken
a2f0: 69 7a 65 72 2c 20 70 7a 45 72 72 29 3b 0a 20 20  izer, pzErr);.  
a300: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
a310: 6b 20 69 66 20 69 74 20 69 73 20 61 6e 20 46 54  k if it is an FT
a320: 53 34 20 73 70 65 63 69 61 6c 20 61 72 67 75 6d  S4 special argum
a330: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ent. */.    else
a340: 20 69 66 28 20 69 73 46 74 73 34 20 26 26 20 66   if( isFts4 && f
a350: 74 73 33 49 73 53 70 65 63 69 61 6c 43 6f 6c 75  ts3IsSpecialColu
a360: 6d 6e 28 7a 2c 20 26 6e 4b 65 79 2c 20 26 7a 56  mn(z, &nKey, &zV
a370: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72  al) ){.      str
a380: 75 63 74 20 46 74 73 34 4f 70 74 69 6f 6e 20 7b  uct Fts4Option {
a390: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
a3a0: 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 20  har *zOpt;.     
a3b0: 20 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 20     int nOpt;.   
a3c0: 20 20 20 7d 20 61 46 74 73 34 4f 70 74 5b 5d 20     } aFts4Opt[] 
a3d0: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 22 6d  = {.        { "m
a3e0: 61 74 63 68 69 6e 66 6f 22 2c 20 20 20 39 20 7d  atchinfo",   9 }
a3f0: 2c 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 4d 41  ,     /* 0 -> MA
a400: 54 43 48 49 4e 46 4f 20 2a 2f 0a 20 20 20 20 20  TCHINFO */.     
a410: 20 20 20 7b 20 22 70 72 65 66 69 78 22 2c 20 20     { "prefix",  
a420: 20 20 20 20 36 20 7d 2c 20 20 20 20 20 2f 2a 20      6 },     /* 
a430: 31 20 2d 3e 20 50 52 45 46 49 58 20 2a 2f 0a 20  1 -> PREFIX */. 
a440: 20 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 72 65         { "compre
a450: 73 73 22 2c 20 20 20 20 38 20 7d 2c 20 20 20 20  ss",    8 },    
a460: 20 2f 2a 20 32 20 2d 3e 20 43 4f 4d 50 52 45 53   /* 2 -> COMPRES
a470: 53 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 22  S */.        { "
a480: 75 6e 63 6f 6d 70 72 65 73 73 22 2c 20 31 30 20  uncompress", 10 
a490: 7d 2c 20 20 20 20 20 2f 2a 20 33 20 2d 3e 20 55  },     /* 3 -> U
a4a0: 4e 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20 20 20  NCOMPRESS */.   
a4b0: 20 20 20 20 20 7b 20 22 6f 72 64 65 72 22 2c 20       { "order", 
a4c0: 20 20 20 20 20 20 35 20 7d 2c 20 20 20 20 20 2f        5 },     /
a4d0: 2a 20 34 20 2d 3e 20 4f 52 44 45 52 20 2a 2f 0a  * 4 -> ORDER */.
a4e0: 20 20 20 20 20 20 20 20 7b 20 22 63 6f 6e 74 65          { "conte
a4f0: 6e 74 22 2c 20 20 20 20 20 37 20 7d 2c 20 20 20  nt",     7 },   
a500: 20 20 2f 2a 20 35 20 2d 3e 20 43 4f 4e 54 45 4e    /* 5 -> CONTEN
a510: 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 22  T */.        { "
a520: 6c 61 6e 67 75 61 67 65 69 64 22 2c 20 31 30 20  languageid", 10 
a530: 7d 2c 20 20 20 20 20 2f 2a 20 36 20 2d 3e 20 4c  },     /* 6 -> L
a540: 41 4e 47 55 41 47 45 49 44 20 2a 2f 0a 20 20 20  ANGUAGEID */.   
a550: 20 20 20 20 20 7b 20 22 6e 6f 74 69 6e 64 65 78       { "notindex
a560: 65 64 22 2c 20 31 30 20 7d 20 20 20 20 20 20 2f  ed", 10 }      /
a570: 2a 20 37 20 2d 3e 20 4e 4f 54 49 4e 44 45 58 45  * 7 -> NOTINDEXE
a580: 44 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a 0a 20  D */.      };.. 
a590: 20 20 20 20 20 69 6e 74 20 69 4f 70 74 3b 0a 20       int iOpt;. 
a5a0: 20 20 20 20 20 69 66 28 20 21 7a 56 61 6c 20 29       if( !zVal )
a5b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
a5c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a5d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5e0: 20 20 66 6f 72 28 69 4f 70 74 3d 30 3b 20 69 4f    for(iOpt=0; iO
a5f0: 70 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 61  pt<SizeofArray(a
a600: 46 74 73 34 4f 70 74 29 3b 20 69 4f 70 74 2b 2b  Fts4Opt); iOpt++
a610: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
a620: 75 63 74 20 46 74 73 34 4f 70 74 69 6f 6e 20 2a  uct Fts4Option *
a630: 70 4f 70 20 3d 20 26 61 46 74 73 34 4f 70 74 5b  pOp = &aFts4Opt[
a640: 69 4f 70 74 5d 3b 0a 20 20 20 20 20 20 20 20 20  iOpt];.         
a650: 20 69 66 28 20 6e 4b 65 79 3d 3d 70 4f 70 2d 3e   if( nKey==pOp->
a660: 6e 4f 70 74 20 26 26 20 21 73 71 6c 69 74 65 33  nOpt && !sqlite3
a670: 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 70 4f 70  _strnicmp(z, pOp
a680: 2d 3e 7a 4f 70 74 2c 20 70 4f 70 2d 3e 6e 4f 70  ->zOpt, pOp->nOp
a690: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
a6a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a6b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a6c0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 69         switch( i
a6d0: 4f 70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Opt ){.         
a6e0: 20 63 61 73 65 20 30 3a 20 20 20 20 20 20 20 20   case 0:        
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4d 41 54 43 48 49         /* MATCHI
a700: 4e 46 4f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  NFO */.         
a710: 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 56     if( strlen(zV
a720: 61 6c 29 21 3d 34 20 7c 7c 20 73 71 6c 69 74 65  al)!=4 || sqlite
a730: 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c  3_strnicmp(zVal,
a740: 20 22 66 74 73 33 22 2c 20 34 29 20 29 7b 0a 20   "fts3", 4) ){. 
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a760: 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 70  ite3Fts3ErrMsg(p
a770: 7a 45 72 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  zErr, "unrecogni
a780: 7a 65 64 20 6d 61 74 63 68 69 6e 66 6f 3a 20 25  zed matchinfo: %
a790: 73 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  s", zVal);.     
a7a0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
a7b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a7c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a7d0: 20 20 20 20 20 20 62 4e 6f 44 6f 63 73 69 7a 65        bNoDocsize
a7e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
a7f0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
a800: 20 20 20 20 63 61 73 65 20 31 3a 20 20 20 20 20      case 1:     
a810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 45            /* PRE
a820: 46 49 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  FIX */.         
a830: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a840: 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20 20 20  zPrefix);.      
a850: 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20        zPrefix = 
a860: 7a 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  zVal;.          
a870: 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    zVal = 0;.    
a880: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
a890: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 32            case 2
a8a0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a8b0: 2f 2a 20 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20  /* COMPRESS */. 
a8c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a8d0: 65 33 5f 66 72 65 65 28 7a 43 6f 6d 70 72 65 73  e3_free(zCompres
a8e0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
a8f0: 7a 43 6f 6d 70 72 65 73 73 20 3d 20 7a 56 61 6c  zCompress = zVal
a900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 56  ;.            zV
a910: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
a920: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a930: 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 20 20        case 3:   
a940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
a950: 4e 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20 20 20  NCOMPRESS */.   
a960: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a970: 5f 66 72 65 65 28 7a 55 6e 63 6f 6d 70 72 65 73  _free(zUncompres
a980: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
a990: 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20 7a 56  zUncompress = zV
a9a0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
a9b0: 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zVal = 0;.      
a9c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a9d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 20          case 4: 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9f0: 20 4f 52 44 45 52 20 2a 2f 0a 20 20 20 20 20 20   ORDER */.      
aa00: 20 20 20 20 20 20 69 66 28 20 28 73 74 72 6c 65        if( (strle
aa10: 6e 28 7a 56 61 6c 29 21 3d 33 20 7c 7c 20 73 71  n(zVal)!=3 || sq
aa20: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
aa30: 56 61 6c 2c 20 22 61 73 63 22 2c 20 33 29 29 20  Val, "asc", 3)) 
aa40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
aa50: 20 28 73 74 72 6c 65 6e 28 7a 56 61 6c 29 21 3d   (strlen(zVal)!=
aa60: 34 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  4 || sqlite3_str
aa70: 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 64 65 73  nicmp(zVal, "des
aa80: 63 22 2c 20 34 29 29 20 0a 20 20 20 20 20 20 20  c", 4)) .       
aa90: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
aaa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
aab0: 33 45 72 72 4d 73 67 28 70 7a 45 72 72 2c 20 22  3ErrMsg(pzErr, "
aac0: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 72 64  unrecognized ord
aad0: 65 72 3a 20 25 73 22 2c 20 7a 56 61 6c 29 3b 0a  er: %s", zVal);.
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
aaf0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
ab00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
ab10: 20 20 20 20 20 20 20 20 20 20 20 62 44 65 73 63             bDesc
ab20: 49 64 78 20 3d 20 28 7a 56 61 6c 5b 30 5d 3d 3d  Idx = (zVal[0]==
ab30: 27 64 27 20 7c 7c 20 7a 56 61 6c 5b 30 5d 3d 3d  'd' || zVal[0]==
ab40: 27 44 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  'D');.          
ab50: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
ab60: 20 20 20 20 63 61 73 65 20 35 3a 20 20 20 20 20      case 5:     
ab70: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54           /* CONT
ab80: 45 4e 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ENT */.         
ab90: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
aba0: 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  zContent);.     
abb0: 20 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 20         zContent 
abc0: 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = zVal;.        
abd0: 20 20 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20      zVal = 0;.  
abe0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
abf0: 0a 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ..          case
ac00: 20 36 3a 20 20 20 20 20 20 20 20 20 20 20 20 20   6:             
ac10: 20 2f 2a 20 4c 41 4e 47 55 41 47 45 49 44 20 2a   /* LANGUAGEID *
ac20: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  /.            as
ac30: 73 65 72 74 28 20 69 4f 70 74 3d 3d 36 20 29 3b  sert( iOpt==6 );
ac40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ac50: 69 74 65 33 5f 66 72 65 65 28 7a 4c 61 6e 67 75  ite3_free(zLangu
ac60: 61 67 65 69 64 29 3b 0a 20 20 20 20 20 20 20 20  ageid);.        
ac70: 20 20 20 20 7a 4c 61 6e 67 75 61 67 65 69 64 20      zLanguageid 
ac80: 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = zVal;.        
ac90: 20 20 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20      zVal = 0;.  
aca0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
acb0: 0a 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ..          case
acc0: 20 37 3a 20 20 20 20 20 20 20 20 20 20 20 20 20   7:             
acd0: 20 2f 2a 20 4e 4f 54 49 4e 44 45 58 45 44 20 2a   /* NOTINDEXED *
ace0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  /.            az
acf0: 4e 6f 74 69 6e 64 65 78 65 64 5b 6e 4e 6f 74 69  Notindexed[nNoti
ad00: 6e 64 65 78 65 64 2b 2b 5d 20 3d 20 7a 56 61 6c  ndexed++] = zVal
ad10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 56  ;.            zV
ad20: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
ad30: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
ad40: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
ad50: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
ad60: 74 28 20 69 4f 70 74 3d 3d 53 69 7a 65 6f 66 41  t( iOpt==SizeofA
ad70: 72 72 61 79 28 61 46 74 73 34 4f 70 74 29 20 29  rray(aFts4Opt) )
ad80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
ad90: 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28  lite3Fts3ErrMsg(
ada0: 70 7a 45 72 72 2c 20 22 75 6e 72 65 63 6f 67 6e  pzErr, "unrecogn
adb0: 69 7a 65 64 20 70 61 72 61 6d 65 74 65 72 3a 20  ized parameter: 
adc0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
add0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ade0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
adf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ae00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
ae10: 69 74 65 33 5f 66 72 65 65 28 7a 56 61 6c 29 3b  ite3_free(zVal);
ae20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ae30: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
ae40: 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  , the argument i
ae50: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  s a column name.
ae60: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
ae70: 20 20 20 20 20 6e 53 74 72 69 6e 67 20 2b 3d 20       nString += 
ae80: 28 69 6e 74 29 28 73 74 72 6c 65 6e 28 7a 29 20  (int)(strlen(z) 
ae90: 2b 20 31 29 3b 0a 20 20 20 20 20 20 61 43 6f 6c  + 1);.      aCol
aea0: 5b 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a 3b 0a 20 20  [nCol++] = z;.  
aeb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
aec0: 20 61 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f   a content=xxx o
aed0: 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66  ption was specif
aee0: 69 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ied, the followi
aef0: 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
af00: 31 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 63 6f  1. Ignore any co
af10: 6d 70 72 65 73 73 3d 20 61 6e 64 20 75 6e 63 6f  mpress= and unco
af20: 6d 70 72 65 73 73 3d 20 6f 70 74 69 6f 6e 73 2e  mpress= options.
af30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
af40: 49 66 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  If no column nam
af50: 65 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  es were specifie
af60: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
af70: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 0a   CREATE VIRTUAL.
af80: 20 20 2a 2a 20 20 20 20 20 20 54 41 42 4c 45 20    **      TABLE 
af90: 73 74 61 74 65 6d 65 6e 74 2c 20 75 73 65 20 61  statement, use a
afa0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  ll columns from 
afb0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
afc0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
afd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
afe0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 73  Content ){.    s
aff0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6d  qlite3_free(zCom
b000: 70 72 65 73 73 29 3b 20 0a 20 20 20 20 73 71 6c  press); .    sql
b010: 69 74 65 33 5f 66 72 65 65 28 7a 55 6e 63 6f 6d  ite3_free(zUncom
b020: 70 72 65 73 73 29 3b 20 0a 20 20 20 20 7a 43 6f  press); .    zCo
b030: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  mpress = 0;.    
b040: 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b  zUncompress = 0;
b050: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
b060: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b070: 33 5f 66 72 65 65 28 28 76 6f 69 64 2a 29 61 43  3_free((void*)aC
b080: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 61 43 6f 6c  ol); .      aCol
b090: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
b0a0: 20 66 74 73 33 43 6f 6e 74 65 6e 74 43 6f 6c 75   fts3ContentColu
b0b0: 6d 6e 73 28 64 62 2c 20 61 72 67 76 5b 31 5d 2c  mns(db, argv[1],
b0c0: 20 7a 43 6f 6e 74 65 6e 74 2c 26 61 43 6f 6c 2c   zContent,&aCol,
b0d0: 26 6e 43 6f 6c 2c 26 6e 53 74 72 69 6e 67 2c 70  &nCol,&nString,p
b0e0: 7a 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  zErr);..      /*
b0f0: 20 49 66 20 61 20 6c 61 6e 67 75 61 67 65 69 64   If a languageid
b100: 3d 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 70 65  = option was spe
b110: 63 69 66 69 65 64 2c 20 72 65 6d 6f 76 65 20 74  cified, remove t
b120: 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 0a 20  he language id. 
b130: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 66       ** column f
b140: 72 6f 6d 20 74 68 65 20 61 43 6f 6c 5b 5d 20 61  rom the aCol[] a
b150: 72 72 61 79 2e 20 2a 2f 20 0a 20 20 20 20 20 20  rray. */ .      
b160: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
b170: 4b 20 26 26 20 7a 4c 61 6e 67 75 61 67 65 69 64  K && zLanguageid
b180: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b190: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
b1a0: 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29  =0; j<nCol; j++)
b1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
b1c0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
b1d0: 7a 4c 61 6e 67 75 61 67 65 69 64 2c 20 61 43 6f  zLanguageid, aCo
b1e0: 6c 5b 6a 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  l[j])==0 ){.    
b1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
b200: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
b210: 3d 6a 3b 20 6b 3c 6e 43 6f 6c 3b 20 6b 2b 2b 29  =j; k<nCol; k++)
b220: 20 61 43 6f 6c 5b 6b 5d 20 3d 20 61 43 6f 6c 5b   aCol[k] = aCol[
b230: 6b 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  k+1];.          
b240: 20 20 6e 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20    nCol--;.      
b250: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b270: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b280: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
b290: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b2a0: 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 0a  fts3_init_out;..
b2b0: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 7b    if( nCol==0 ){
b2c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74  .    assert( nSt
b2d0: 72 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ring==0 );.    a
b2e0: 43 6f 6c 5b 30 5d 20 3d 20 22 63 6f 6e 74 65 6e  Col[0] = "conten
b2f0: 74 22 3b 0a 20 20 20 20 6e 53 74 72 69 6e 67 20  t";.    nString 
b300: 3d 20 38 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  = 8;.    nCol = 
b310: 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  1;.  }..  if( pT
b320: 6f 6b 65 6e 69 7a 65 72 3d 3d 30 20 29 7b 0a 20  okenizer==0 ){. 
b330: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
b340: 74 73 33 49 6e 69 74 54 6f 6b 65 6e 69 7a 65 72  ts3InitTokenizer
b350: 28 70 48 61 73 68 2c 20 22 73 69 6d 70 6c 65 22  (pHash, "simple"
b360: 2c 20 26 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 70  , &pTokenizer, p
b370: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
b380: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b390: 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75  oto fts3_init_ou
b3a0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
b3b0: 20 70 54 6f 6b 65 6e 69 7a 65 72 20 29 3b 0a 0a   pTokenizer );..
b3c0: 20 20 72 63 20 3d 20 66 74 73 33 50 72 65 66 69    rc = fts3Prefi
b3d0: 78 50 61 72 61 6d 65 74 65 72 28 7a 50 72 65 66  xParameter(zPref
b3e0: 69 78 2c 20 26 6e 49 6e 64 65 78 2c 20 26 61 49  ix, &nIndex, &aI
b3f0: 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 72 63 3d  ndex);.  if( rc=
b400: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b  =SQLITE_ERROR ){
b410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 72  .    assert( zPr
b420: 65 66 69 78 20 29 3b 0a 20 20 20 20 73 71 6c 69  efix );.    sqli
b430: 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 70 7a  te3Fts3ErrMsg(pz
b440: 45 72 72 2c 20 22 65 72 72 6f 72 20 70 61 72 73  Err, "error pars
b450: 69 6e 67 20 70 72 65 66 69 78 20 70 61 72 61 6d  ing prefix param
b460: 65 74 65 72 3a 20 25 73 22 2c 20 7a 50 72 65 66  eter: %s", zPref
b470: 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ix);.  }.  if( r
b480: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b490: 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75  oto fts3_init_ou
b4a0: 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
b4b0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
b4c0: 68 65 20 46 74 73 33 54 61 62 6c 65 20 73 74 72  he Fts3Table str
b4d0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 6e 42 79  ucture. */.  nBy
b4e0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
b4f0: 54 61 62 6c 65 29 20 2b 20 20 20 20 20 20 20 20  Table) +        
b500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
b510: 33 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  3Table */.      
b520: 20 20 20 20 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f      nCol * sizeo
b530: 66 28 63 68 61 72 20 2a 29 20 2b 20 20 20 20 20  f(char *) +     
b540: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 43 6f           /* azCo
b550: 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
b560: 20 20 6e 49 6e 64 65 78 20 2a 20 73 69 7a 65 6f    nIndex * sizeo
b570: 66 28 73 74 72 75 63 74 20 46 74 73 33 49 6e 64  f(struct Fts3Ind
b580: 65 78 29 20 2b 20 20 2f 2a 20 61 49 6e 64 65 78  ex) +  /* aIndex
b590: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 43   */.          nC
b5a0: 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 75 38 29 20  ol * sizeof(u8) 
b5b0: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
b5c0: 20 20 20 2f 2a 20 61 62 4e 6f 74 69 6e 64 65 78     /* abNotindex
b5d0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
b5e0: 6e 4e 61 6d 65 20 2b 20 20 20 20 20 20 20 20 20  nName +         
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
b610: 0a 20 20 20 20 20 20 20 20 20 20 6e 44 62 20 2b  .          nDb +
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 2f 2a 20 7a 44 62 20 2a 2f 0a 20 20 20 20 20 20  /* zDb */.      
b650: 20 20 20 20 6e 53 74 72 69 6e 67 3b 20 20 20 20      nString;    
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
b680: 65 20 66 6f 72 20 61 7a 43 6f 6c 75 6d 6e 20 73  e for azColumn s
b690: 74 72 69 6e 67 73 20 2a 2f 0a 20 20 70 20 3d 20  trings */.  p = 
b6a0: 28 46 74 73 33 54 61 62 6c 65 2a 29 73 71 6c 69  (Fts3Table*)sqli
b6b0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
b6c0: 74 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  te);.  if( p==0 
b6d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
b6e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
b6f0: 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74  to fts3_init_out
b700: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
b710: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  , 0, nByte);.  p
b720: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 2d 3e  ->db = db;.  p->
b730: 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
b740: 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
b750: 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 7a 43 6f  a = 0;.  p->azCo
b760: 6c 75 6d 6e 20 3d 20 28 63 68 61 72 20 2a 2a 29  lumn = (char **)
b770: 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 54 6f 6b  &p[1];.  p->pTok
b780: 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69  enizer = pTokeni
b790: 7a 65 72 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65  zer;.  p->nMaxPe
b7a0: 6e 64 69 6e 67 44 61 74 61 20 3d 20 46 54 53 33  ndingData = FTS3
b7b0: 5f 4d 41 58 5f 50 45 4e 44 49 4e 47 5f 44 41 54  _MAX_PENDING_DAT
b7c0: 41 3b 0a 20 20 70 2d 3e 62 48 61 73 44 6f 63 73  A;.  p->bHasDocs
b7d0: 69 7a 65 20 3d 20 28 69 73 46 74 73 34 20 26 26  ize = (isFts4 &&
b7e0: 20 62 4e 6f 44 6f 63 73 69 7a 65 3d 3d 30 29 3b   bNoDocsize==0);
b7f0: 0a 20 20 70 2d 3e 62 48 61 73 53 74 61 74 20 3d  .  p->bHasStat =
b800: 20 28 75 38 29 69 73 46 74 73 34 3b 0a 20 20 70   (u8)isFts4;.  p
b810: 2d 3e 62 46 74 73 34 20 3d 20 28 75 38 29 69 73  ->bFts4 = (u8)is
b820: 46 74 73 34 3b 0a 20 20 70 2d 3e 62 44 65 73 63  Fts4;.  p->bDesc
b830: 49 64 78 20 3d 20 28 75 38 29 62 44 65 73 63 49  Idx = (u8)bDescI
b840: 64 78 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f 69 6e  dx;.  p->nAutoin
b850: 63 72 6d 65 72 67 65 20 3d 20 30 78 66 66 3b 20  crmerge = 0xff; 
b860: 20 20 2f 2a 20 30 78 66 66 20 6d 65 61 6e 73 20    /* 0xff means 
b870: 73 65 74 74 69 6e 67 20 75 6e 6b 6e 6f 77 6e 20  setting unknown 
b880: 2a 2f 0a 20 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  */.  p->zContent
b890: 54 62 6c 20 3d 20 7a 43 6f 6e 74 65 6e 74 3b 0a  Tbl = zContent;.
b8a0: 20 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64    p->zLanguageid
b8b0: 20 3d 20 7a 4c 61 6e 67 75 61 67 65 69 64 3b 0a   = zLanguageid;.
b8c0: 20 20 7a 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a    zContent = 0;.
b8d0: 20 20 7a 4c 61 6e 67 75 61 67 65 69 64 20 3d 20    zLanguageid = 
b8e0: 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70  0;.  TESTONLY( p
b8f0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
b900: 3d 20 2d 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e  = -1 );.  TESTON
b910: 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69  LY( p->mxSavepoi
b920: 6e 74 20 3d 20 2d 31 20 29 3b 0a 0a 20 20 70 2d  nt = -1 );..  p-
b930: 3e 61 49 6e 64 65 78 20 3d 20 28 73 74 72 75 63  >aIndex = (struc
b940: 74 20 46 74 73 33 49 6e 64 65 78 20 2a 29 26 70  t Fts3Index *)&p
b950: 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->azColumn[nCol]
b960: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 49  ;.  memcpy(p->aI
b970: 6e 64 65 78 2c 20 61 49 6e 64 65 78 2c 20 73 69  ndex, aIndex, si
b980: 7a 65 6f 66 28 73 74 72 75 63 74 20 46 74 73 33  zeof(struct Fts3
b990: 49 6e 64 65 78 29 20 2a 20 6e 49 6e 64 65 78 29  Index) * nIndex)
b9a0: 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 78 20 3d 20  ;.  p->nIndex = 
b9b0: 6e 49 6e 64 65 78 3b 0a 20 20 66 6f 72 28 69 3d  nIndex;.  for(i=
b9c0: 30 3b 20 69 3c 6e 49 6e 64 65 78 3b 20 69 2b 2b  0; i<nIndex; i++
b9d0: 29 7b 0a 20 20 20 20 66 74 73 33 48 61 73 68 49  ){.    fts3HashI
b9e0: 6e 69 74 28 26 70 2d 3e 61 49 6e 64 65 78 5b 69  nit(&p->aIndex[i
b9f0: 5d 2e 68 50 65 6e 64 69 6e 67 2c 20 46 54 53 33  ].hPending, FTS3
ba00: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29  _HASH_STRING, 1)
ba10: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 62 4e 6f 74  ;.  }.  p->abNot
ba20: 69 6e 64 65 78 65 64 20 3d 20 28 75 38 20 2a 29  indexed = (u8 *)
ba30: 26 70 2d 3e 61 49 6e 64 65 78 5b 6e 49 6e 64 65  &p->aIndex[nInde
ba40: 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  x];..  /* Fill i
ba50: 6e 20 74 68 65 20 7a 4e 61 6d 65 20 61 6e 64 20  n the zName and 
ba60: 7a 44 62 20 66 69 65 6c 64 73 20 6f 66 20 74 68  zDb fields of th
ba70: 65 20 76 74 61 62 20 73 74 72 75 63 74 75 72 65  e vtab structure
ba80: 2e 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 63  . */.  zCsr = (c
ba90: 68 61 72 20 2a 29 26 70 2d 3e 61 62 4e 6f 74 69  har *)&p->abNoti
baa0: 6e 64 65 78 65 64 5b 6e 43 6f 6c 5d 3b 0a 20 20  ndexed[nCol];.  
bab0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 43 73 72 3b  p->zName = zCsr;
bac0: 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73 72 2c 20  .  memcpy(zCsr, 
bad0: 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b  argv[2], nName);
bae0: 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 4e 61 6d 65  .  zCsr += nName
baf0: 3b 0a 20 20 70 2d 3e 7a 44 62 20 3d 20 7a 43 73  ;.  p->zDb = zCs
bb00: 72 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73 72  r;.  memcpy(zCsr
bb10: 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29 3b  , argv[1], nDb);
bb20: 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 44 62 3b 0a  .  zCsr += nDb;.
bb30: 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
bb40: 65 20 61 7a 43 6f 6c 75 6d 6e 20 61 72 72 61 79  e azColumn array
bb50: 20 2a 2f 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30   */.  for(iCol=0
bb60: 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f  ; iCol<nCol; iCo
bb70: 6c 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  l++){.    char *
bb80: 7a 3b 20 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  z; .    int n = 
bb90: 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
bba0: 20 2a 29 73 71 6c 69 74 65 33 46 74 73 33 4e 65   *)sqlite3Fts3Ne
bbb0: 78 74 54 6f 6b 65 6e 28 61 43 6f 6c 5b 69 43 6f  xtToken(aCol[iCo
bbc0: 6c 5d 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  l], &n);.    if(
bbd0: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65   n>0 ){.      me
bbe0: 6d 63 70 79 28 7a 43 73 72 2c 20 7a 2c 20 6e 29  mcpy(zCsr, z, n)
bbf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
bc00: 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [n] = '\0';.    
bc10: 73 71 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f  sqlite3Fts3Dequo
bc20: 74 65 28 7a 43 73 72 29 3b 0a 20 20 20 20 70 2d  te(zCsr);.    p-
bc30: 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 20  >azColumn[iCol] 
bc40: 3d 20 7a 43 73 72 3b 0a 20 20 20 20 7a 43 73 72  = zCsr;.    zCsr
bc50: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 61 73 73   += n+1;.    ass
bc60: 65 72 74 28 20 7a 43 73 72 20 3c 3d 20 26 28 28  ert( zCsr <= &((
bc70: 63 68 61 72 20 2a 29 70 29 5b 6e 42 79 74 65 5d  char *)p)[nByte]
bc80: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   );.  }..  /* Fi
bc90: 6c 6c 20 69 6e 20 74 68 65 20 61 62 4e 6f 74 69  ll in the abNoti
bca0: 6e 64 65 78 65 64 20 61 72 72 61 79 20 2a 2f 0a  ndexed array */.
bcb0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
bcc0: 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  ol<nCol; iCol++)
bcd0: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69  {.    int n = (i
bce0: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 61 7a 43  nt)strlen(p->azC
bcf0: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 29 3b 0a 20 20  olumn[iCol]);.  
bd00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 6f    for(i=0; i<nNo
bd10: 74 69 6e 64 65 78 65 64 3b 20 69 2b 2b 29 7b 0a  tindexed; i++){.
bd20: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 6f 74        char *zNot
bd30: 20 3d 20 61 7a 4e 6f 74 69 6e 64 65 78 65 64 5b   = azNotindexed[
bd40: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  i];.      if( zN
bd50: 6f 74 20 26 26 20 6e 3d 3d 28 69 6e 74 29 73 74  ot && n==(int)st
bd60: 72 6c 65 6e 28 7a 4e 6f 74 29 0a 20 20 20 20 20  rlen(zNot).     
bd70: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f    && 0==sqlite3_
bd80: 73 74 72 6e 69 63 6d 70 28 70 2d 3e 61 7a 43 6f  strnicmp(p->azCo
bd90: 6c 75 6d 6e 5b 69 43 6f 6c 5d 2c 20 7a 4e 6f 74  lumn[iCol], zNot
bda0: 2c 20 6e 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  , n) .      ){. 
bdb0: 20 20 20 20 20 20 20 70 2d 3e 61 62 4e 6f 74 69         p->abNoti
bdc0: 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 20 3d 20 31  ndexed[iCol] = 1
bdd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bde0: 33 5f 66 72 65 65 28 7a 4e 6f 74 29 3b 0a 20 20  3_free(zNot);.  
bdf0: 20 20 20 20 20 20 61 7a 4e 6f 74 69 6e 64 65 78        azNotindex
be00: 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ed[i] = 0;.     
be10: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
be20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 6f 74 69 6e  or(i=0; i<nNotin
be30: 64 65 78 65 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  dexed; i++){.   
be40: 20 69 66 28 20 61 7a 4e 6f 74 69 6e 64 65 78 65   if( azNotindexe
be50: 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  d[i] ){.      sq
be60: 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28  lite3Fts3ErrMsg(
be70: 70 7a 45 72 72 2c 20 22 6e 6f 20 73 75 63 68 20  pzErr, "no such 
be80: 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 61 7a 4e  column: %s", azN
be90: 6f 74 69 6e 64 65 78 65 64 5b 69 5d 29 3b 0a 20  otindexed[i]);. 
bea0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
beb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
bec0: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
bed0: 49 54 45 5f 4f 4b 20 26 26 20 28 7a 43 6f 6d 70  ITE_OK && (zComp
bee0: 72 65 73 73 3d 3d 30 29 21 3d 28 7a 55 6e 63 6f  ress==0)!=(zUnco
bef0: 6d 70 72 65 73 73 3d 3d 30 29 20 29 7b 0a 20 20  mpress==0) ){.  
bf00: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
bf10: 69 73 73 20 3d 20 28 7a 43 6f 6d 70 72 65 73 73  iss = (zCompress
bf20: 3d 3d 30 20 3f 20 22 63 6f 6d 70 72 65 73 73 22  ==0 ? "compress"
bf30: 20 3a 20 22 75 6e 63 6f 6d 70 72 65 73 73 22 29   : "uncompress")
bf40: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
bf50: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
bf60: 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 70  ite3Fts3ErrMsg(p
bf70: 7a 45 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 25  zErr, "missing %
bf80: 73 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 66  s parameter in f
bf90: 74 73 34 20 63 6f 6e 73 74 72 75 63 74 6f 72 22  ts4 constructor"
bfa0: 2c 20 7a 4d 69 73 73 29 3b 0a 20 20 7d 0a 20 20  , zMiss);.  }.  
bfb0: 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74  p->zReadExprlist
bfc0: 20 3d 20 66 74 73 33 52 65 61 64 45 78 70 72 4c   = fts3ReadExprL
bfd0: 69 73 74 28 70 2c 20 7a 55 6e 63 6f 6d 70 72 65  ist(p, zUncompre
bfe0: 73 73 2c 20 26 72 63 29 3b 0a 20 20 70 2d 3e 7a  ss, &rc);.  p->z
bff0: 57 72 69 74 65 45 78 70 72 6c 69 73 74 20 3d 20  WriteExprlist = 
c000: 66 74 73 33 57 72 69 74 65 45 78 70 72 4c 69 73  fts3WriteExprLis
c010: 74 28 70 2c 20 7a 43 6f 6d 70 72 65 73 73 2c 20  t(p, zCompress, 
c020: 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  &rc);.  if( rc!=
c030: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
c040: 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a   fts3_init_out;.
c050: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
c060: 20 61 6e 20 78 43 72 65 61 74 65 20 63 61 6c 6c   an xCreate call
c070: 2c 20 63 72 65 61 74 65 20 74 68 65 20 75 6e 64  , create the und
c080: 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 73 20 69  erlying tables i
c090: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
c0a0: 62 61 73 65 2e 20 54 4f 44 4f 3a 20 46 6f 72 20  base. TODO: For 
c0b0: 78 43 6f 6e 6e 65 63 74 28 29 2c 20 69 74 20 63  xConnect(), it c
c0c0: 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68 61 74  ould verify that
c0d0: 20 73 61 69 64 20 74 61 62 6c 65 73 20 65 78 69   said tables exi
c0e0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  st..  */.  if( i
c0f0: 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 72  sCreate ){.    r
c100: 63 20 3d 20 66 74 73 33 43 72 65 61 74 65 54 61  c = fts3CreateTa
c110: 62 6c 65 73 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  bles(p);.  }..  
c120: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
c130: 69 66 20 61 20 6c 65 67 61 63 79 20 66 74 73 33  if a legacy fts3
c140: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
c150: 22 75 70 67 72 61 64 65 64 22 20 62 79 20 74 68  "upgraded" by th
c160: 65 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 20  e.  ** addition 
c170: 6f 66 20 61 20 25 5f 73 74 61 74 20 74 61 62 6c  of a %_stat tabl
c180: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  e so that it can
c190: 20 75 73 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   use incremental
c1a0: 20 6d 65 72 67 65 2e 0a 20 20 2a 2f 0a 20 20 69   merge..  */.  i
c1b0: 66 28 20 21 69 73 46 74 73 34 20 26 26 20 21 69  f( !isFts4 && !i
c1c0: 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70  sCreate ){.    p
c1d0: 2d 3e 62 48 61 73 53 74 61 74 20 3d 20 32 3b 0a  ->bHasStat = 2;.
c1e0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
c1f0: 20 6f 75 74 20 74 68 65 20 70 61 67 65 2d 73 69   out the page-si
c200: 7a 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ze for the datab
c210: 61 73 65 2e 20 54 68 69 73 20 69 73 20 72 65 71  ase. This is req
c220: 75 69 72 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uired in order t
c230: 6f 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  o.  ** estimate 
c240: 74 68 65 20 63 6f 73 74 20 6f 66 20 6c 6f 61 64  the cost of load
c250: 69 6e 67 20 6c 61 72 67 65 20 64 6f 63 6c 69 73  ing large doclis
c260: 74 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ts from the data
c270: 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 74 73 33  base.  */.  fts3
c280: 44 61 74 61 62 61 73 65 50 61 67 65 53 69 7a 65  DatabasePageSize
c290: 28 26 72 63 2c 20 70 29 3b 0a 20 20 70 2d 3e 6e  (&rc, p);.  p->n
c2a0: 4e 6f 64 65 53 69 7a 65 20 3d 20 70 2d 3e 6e 50  NodeSize = p->nP
c2b0: 67 73 7a 2d 33 35 3b 0a 0a 20 20 2f 2a 20 44 65  gsz-35;..  /* De
c2c0: 63 6c 61 72 65 20 74 68 65 20 74 61 62 6c 65 20  clare the table 
c2d0: 73 63 68 65 6d 61 20 74 6f 20 53 51 4c 69 74 65  schema to SQLite
c2e0: 2e 20 2a 2f 0a 20 20 66 74 73 33 44 65 63 6c 61  . */.  fts3Decla
c2f0: 72 65 56 74 61 62 28 26 72 63 2c 20 70 29 3b 0a  reVtab(&rc, p);.
c300: 0a 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3a 0a  .fts3_init_out:.
c310: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c320: 50 72 65 66 69 78 29 3b 0a 20 20 73 71 6c 69 74  Prefix);.  sqlit
c330: 65 33 5f 66 72 65 65 28 61 49 6e 64 65 78 29 3b  e3_free(aIndex);
c340: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c350: 7a 43 6f 6d 70 72 65 73 73 29 3b 0a 20 20 73 71  zCompress);.  sq
c360: 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 6e 63 6f  lite3_free(zUnco
c370: 6d 70 72 65 73 73 29 3b 0a 20 20 73 71 6c 69 74  mpress);.  sqlit
c380: 65 33 5f 66 72 65 65 28 7a 43 6f 6e 74 65 6e 74  e3_free(zContent
c390: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c3a0: 65 28 7a 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a  e(zLanguageid);.
c3b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 6f    for(i=0; i<nNo
c3c0: 74 69 6e 64 65 78 65 64 3b 20 69 2b 2b 29 20 73  tindexed; i++) s
c3d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 4e 6f  qlite3_free(azNo
c3e0: 74 69 6e 64 65 78 65 64 5b 69 5d 29 3b 0a 20 20  tindexed[i]);.  
c3f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f  sqlite3_free((vo
c400: 69 64 20 2a 29 61 43 6f 6c 29 3b 0a 20 20 73 71  id *)aCol);.  sq
c410: 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
c420: 20 2a 29 61 7a 4e 6f 74 69 6e 64 65 78 65 64 29   *)azNotindexed)
c430: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
c440: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
c450: 20 70 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33   p ){.      fts3
c460: 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  DisconnectMethod
c470: 28 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  ((sqlite3_vtab *
c480: 29 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )p);.    }else i
c490: 66 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 29 7b  f( pTokenizer ){
c4a0: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 69 7a 65  .      pTokenize
c4b0: 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73  r->pModule->xDes
c4c0: 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a 65 72 29  troy(pTokenizer)
c4d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
c4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c4f0: 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a  pSegments==0 );.
c500: 20 20 20 20 2a 70 70 56 54 61 62 20 3d 20 26 70      *ppVTab = &p
c510: 2d 3e 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65  ->base;.  }.  re
c520: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c530: 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 28 29  * The xConnect()
c540: 20 61 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d   and xCreate() m
c550: 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65 20 76  ethods for the v
c560: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 41 6c  irtual table. Al
c570: 6c 20 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69 73  l the.** work is
c580: 20 64 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69 6f   done in functio
c590: 6e 20 66 74 73 33 49 6e 69 74 56 74 61 62 28 29  n fts3InitVtab()
c5a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c5b0: 66 74 73 33 43 6f 6e 6e 65 63 74 4d 65 74 68 6f  fts3ConnectMetho
c5c0: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
c5d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c5e0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c5f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c600: 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20   void *pAux,    
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
c630: 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61  okenizer hash ta
c640: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  ble */.  int arg
c650: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c660: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c670: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
c680: 6e 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a  n argv array */.
c690: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63    const char * c
c6a0: 6f 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20  onst *argv,     
c6b0: 20 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f    /* xCreate/xCo
c6c0: 6e 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61  nnect argument a
c6d0: 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rray */.  sqlite
c6e0: 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
c6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
c700: 3a 20 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74  : New sqlite3_vt
c710: 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  ab object */.  c
c720: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c740: 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d  * OUT: sqlite3_m
c750: 61 6c 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65  alloc'd error me
c760: 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  ssage */.){.  re
c770: 74 75 72 6e 20 66 74 73 33 49 6e 69 74 56 74 61  turn fts3InitVta
c780: 62 28 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61  b(0, db, pAux, a
c790: 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61  rgc, argv, ppVta
c7a0: 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61  b, pzErr);.}.sta
c7b0: 74 69 63 20 69 6e 74 20 66 74 73 33 43 72 65 61  tic int fts3Crea
c7c0: 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  teMethod(.  sqli
c7d0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c7f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c800: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
c810: 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
c820: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
c830: 65 72 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20  er to tokenizer 
c840: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
c850: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
c880: 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72  ments in argv ar
c890: 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ray */.  const c
c8a0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67  har * const *arg
c8b0: 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65  v,       /* xCre
c8c0: 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67  ate/xConnect arg
c8d0: 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
c8e0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
c8f0: 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20  ppVtab,         
c900: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c   /* OUT: New sql
c910: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
c920: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
c930: 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
c940: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71        /* OUT: sq
c950: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65  lite3_malloc'd e
c960: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
c970: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33  ){.  return fts3
c980: 49 6e 69 74 56 74 61 62 28 31 2c 20 64 62 2c 20  InitVtab(1, db, 
c990: 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76  pAux, argc, argv
c9a0: 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29  , ppVtab, pzErr)
c9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
c9c0: 68 65 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  he pIdxInfo->est
c9d0: 69 6d 61 74 65 64 52 6f 77 73 20 76 61 72 69 61  imatedRows varia
c9e0: 62 6c 65 20 74 6f 20 6e 52 6f 77 2e 20 55 6e 6c  ble to nRow. Unl
c9f0: 65 73 73 20 74 68 69 73 0a 2a 2a 20 65 78 74 65  ess this.** exte
ca00: 6e 73 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  nsion is current
ca10: 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
ca20: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51   a version of SQ
ca30: 4c 69 74 65 20 74 6f 6f 20 6f 6c 64 20 74 6f 0a  Lite too old to.
ca40: 2a 2a 20 73 75 70 70 6f 72 74 20 65 73 74 69 6d  ** support estim
ca50: 61 74 65 64 52 6f 77 73 2e 20 49 6e 20 74 68 61  atedRows. In tha
ca60: 74 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  t case this func
ca70: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
ca80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca90: 66 74 73 33 53 65 74 45 73 74 69 6d 61 74 65 64  fts3SetEstimated
caa0: 52 6f 77 73 28 73 71 6c 69 74 65 33 5f 69 6e 64  Rows(sqlite3_ind
cab0: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
cac0: 6f 2c 20 69 36 34 20 6e 52 6f 77 29 7b 0a 23 69  o, i64 nRow){.#i
cad0: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
cae0: 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 38 30 30 32  _NUMBER>=3008002
caf0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6c  .  if( sqlite3_l
cb00: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
cb10: 28 29 3e 3d 33 30 30 38 30 30 32 20 29 7b 0a 20  ()>=3008002 ){. 
cb20: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
cb30: 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52 6f  imatedRows = nRo
cb40: 77 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  w;.  }.#endif.}.
cb50: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  ./*.** Set the S
cb60: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
cb70: 5f 55 4e 49 51 55 45 20 66 6c 61 67 20 69 6e 20  _UNIQUE flag in 
cb80: 70 49 64 78 49 6e 66 6f 2d 3e 66 6c 61 67 73 2e  pIdxInfo->flags.
cb90: 20 55 6e 6c 65 73 73 20 74 68 69 73 0a 2a 2a 20   Unless this.** 
cba0: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 75 72  extension is cur
cbb0: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
cbc0: 64 20 62 79 20 61 20 76 65 72 73 69 6f 6e 20 6f  d by a version o
cbd0: 66 20 53 51 4c 69 74 65 20 74 6f 6f 20 6f 6c 64  f SQLite too old
cbe0: 20 74 6f 0a 2a 2a 20 73 75 70 70 6f 72 74 20 69   to.** support i
cbf0: 6e 64 65 78 2d 69 6e 66 6f 20 66 6c 61 67 73 2e  ndex-info flags.
cc00: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 74 68   In that case th
cc10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
cc20: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
cc30: 63 20 76 6f 69 64 20 66 74 73 33 53 65 74 55 6e  c void fts3SetUn
cc40: 69 71 75 65 46 6c 61 67 28 73 71 6c 69 74 65 33  iqueFlag(sqlite3
cc50: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
cc60: 78 49 6e 66 6f 29 7b 0a 23 69 66 20 53 51 4c 49  xInfo){.#if SQLI
cc70: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
cc80: 52 3e 3d 33 30 30 38 30 31 32 0a 20 20 69 66 28  R>=3008012.  if(
cc90: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
cca0: 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 3e 3d 33 30  ion_number()>=30
ccb0: 30 38 30 31 32 20 29 7b 0a 20 20 20 20 70 49 64  08012 ){.    pId
ccc0: 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
ccd0: 7c 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  |= SQLITE_INDEX_
cce0: 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 7d  SCAN_UNIQUE;.  }
ccf0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a  .#endif.}../* .*
cd00: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
cd10: 20 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   of the xBestInd
cd20: 65 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 46 54  ex method for FT
cd30: 53 33 20 74 61 62 6c 65 73 2e 20 54 68 65 72 65  S3 tables. There
cd40: 0a 2a 2a 20 61 72 65 20 74 68 72 65 65 20 70 6f  .** are three po
cd50: 73 73 69 62 6c 65 20 73 74 72 61 74 65 67 69 65  ssible strategie
cd60: 73 2c 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 70  s, in order of p
cd70: 72 65 66 65 72 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a  reference:.**.**
cd80: 20 20 20 31 2e 20 44 69 72 65 63 74 20 6c 6f 6f     1. Direct loo
cd90: 6b 75 70 20 62 79 20 72 6f 77 69 64 20 6f 72 20  kup by rowid or 
cda0: 64 6f 63 69 64 2e 20 0a 2a 2a 20 20 20 32 2e 20  docid. .**   2. 
cdb0: 46 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68  Full-text search
cdc0: 20 75 73 69 6e 67 20 61 20 4d 41 54 43 48 20 6f   using a MATCH o
cdd0: 70 65 72 61 74 6f 72 20 6f 6e 20 61 20 6e 6f 6e  perator on a non
cde0: 2d 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a  -docid column..*
cdf0: 2a 20 20 20 33 2e 20 4c 69 6e 65 61 72 20 73 63  *   3. Linear sc
ce00: 61 6e 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20  an of %_content 
ce10: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
ce20: 20 69 6e 74 20 66 74 73 33 42 65 73 74 49 6e 64   int fts3BestInd
ce30: 65 78 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  exMethod(sqlite3
ce40: 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71  _vtab *pVTab, sq
ce50: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
ce60: 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73 33   *pInfo){.  Fts3
ce70: 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
ce80: 54 61 62 6c 65 20 2a 29 70 56 54 61 62 3b 0a 20  Table *)pVTab;. 
ce90: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
cec0: 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  iable */.  int i
ced0: 43 6f 6e 73 20 3d 20 2d 31 3b 20 20 20 20 20 20  Cons = -1;      
cee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
cef0: 64 65 78 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  dex of constrain
cf00: 74 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 69  t to use */..  i
cf10: 6e 74 20 69 4c 61 6e 67 69 64 43 6f 6e 73 20 3d  nt iLangidCons =
cf20: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f   -1;           /
cf30: 2a 20 49 6e 64 65 78 20 6f 66 20 6c 61 6e 67 69  * Index of langi
cf40: 64 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  d=x constraint, 
cf50: 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  if present */.  
cf60: 69 6e 74 20 69 44 6f 63 69 64 47 65 20 3d 20 2d  int iDocidGe = -
cf70: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
cf80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 6f 63 69  /* Index of doci
cf90: 64 3e 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74 2c  d>=x constraint,
cfa0: 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   if present */. 
cfb0: 20 69 6e 74 20 69 44 6f 63 69 64 4c 65 20 3d 20   int iDocidLe = 
cfc0: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
cfd0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 6f 63   /* Index of doc
cfe0: 69 64 3c 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74  id<=x constraint
cff0: 2c 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a  , if present */.
d000: 20 20 69 6e 74 20 69 49 64 78 3b 0a 0a 20 20 2f    int iIdx;..  /
d010: 2a 20 42 79 20 64 65 66 61 75 6c 74 20 75 73 65  * By default use
d020: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
d030: 61 6e 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  an. This is an e
d040: 78 70 65 6e 73 69 76 65 20 6f 70 74 69 6f 6e 2c  xpensive option,
d050: 0a 20 20 2a 2a 20 73 6f 20 73 65 61 72 63 68 20  .  ** so search 
d060: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 73  through the cons
d070: 74 72 61 69 6e 74 73 20 74 6f 20 73 65 65 20 69  traints to see i
d080: 66 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65  f a more efficie
d090: 6e 74 20 0a 20 20 2a 2a 20 73 74 72 61 74 65 67  nt .  ** strateg
d0a0: 79 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20  y is possible.. 
d0b0: 20 2a 2f 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78   */.  pInfo->idx
d0c0: 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 53  Num = FTS3_FULLS
d0d0: 43 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 70 49  CAN_SEARCH;.  pI
d0e0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
d0f0: 73 74 20 3d 20 35 30 30 30 30 30 30 3b 0a 20 20  st = 5000000;.  
d100: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 66 6f  for(i=0; i<pInfo
d110: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
d120: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 62 44 6f  ++){.    int bDo
d130: 63 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  cid;            
d140: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
d150: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
d160: 69 73 20 6f 6e 20 64 6f 63 69 64 20 2a 2f 0a 20  is on docid */. 
d170: 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
d180: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
d190: 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49 6e  nt *pCons = &pIn
d1a0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
d1b0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  i];.    if( pCon
d1c0: 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 7b 0a  s->usable==0 ){.
d1d0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
d1e0: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
d1f0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
d200: 43 48 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CH ){.        /*
d210: 20 54 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   There exists an
d220: 20 75 6e 75 73 61 62 6c 65 20 4d 41 54 43 48 20   unusable MATCH 
d230: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73  constraint. This
d240: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 0a 20   means that if. 
d250: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
d260: 61 6e 6e 65 72 20 64 6f 65 73 20 65 6c 65 63 74  anner does elect
d270: 20 74 6f 20 75 73 65 20 74 68 65 20 72 65 73 75   to use the resu
d280: 6c 74 73 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  lts of this call
d290: 20 61 73 20 70 61 72 74 0a 20 20 20 20 20 20 20   as part.       
d2a0: 20 2a 2a 20 6f 66 20 74 68 65 20 6f 76 65 72 61   ** of the overa
d2b0: 6c 6c 20 71 75 65 72 79 20 70 6c 61 6e 20 74 68  ll query plan th
d2c0: 65 20 75 73 65 72 20 77 69 6c 6c 20 73 65 65 20  e user will see 
d2d0: 61 6e 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73  an "unable to us
d2e0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  e.        ** fun
d2f0: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
d300: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
d310: 74 65 78 74 22 20 65 72 72 6f 72 2e 20 54 6f 20  text" error. To 
d320: 64 69 73 63 6f 75 72 61 67 65 0a 20 20 20 20 20  discourage.     
d330: 20 20 20 2a 2a 20 74 68 69 73 2c 20 72 65 74 75     ** this, retu
d340: 72 6e 20 61 20 76 65 72 79 20 68 69 67 68 20 63  rn a very high c
d350: 6f 73 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  ost here.  */.  
d360: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
d370: 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 53  Num = FTS3_FULLS
d380: 43 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 20 20  CAN_SEARCH;.    
d390: 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d      pInfo->estim
d3a0: 61 74 65 64 43 6f 73 74 20 3d 20 31 65 35 30 3b  atedCost = 1e50;
d3b0: 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 74  .        fts3Set
d3c0: 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28 70 49  EstimatedRows(pI
d3d0: 6e 66 6f 2c 20 28 28 73 71 6c 69 74 65 33 5f 69  nfo, ((sqlite3_i
d3e0: 6e 74 36 34 29 31 29 20 3c 3c 20 35 30 29 3b 0a  nt64)1) << 50);.
d3f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d400: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
d410: 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
d420: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 44 6f  ;.    }..    bDo
d430: 63 69 64 20 3d 20 28 70 43 6f 6e 73 2d 3e 69 43  cid = (pCons->iC
d440: 6f 6c 75 6d 6e 3c 30 20 7c 7c 20 70 43 6f 6e 73  olumn<0 || pCons
d450: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43  ->iColumn==p->nC
d460: 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20 2f  olumn+1);..    /
d470: 2a 20 41 20 64 69 72 65 63 74 20 6c 6f 6f 6b 75  * A direct looku
d480: 70 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  p on the rowid o
d490: 72 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 20  r docid column. 
d4a0: 41 73 73 69 67 6e 20 61 20 63 6f 73 74 20 6f 66  Assign a cost of
d4b0: 20 31 2e 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28   1.0. */.    if(
d4c0: 20 69 43 6f 6e 73 3c 30 20 26 26 20 70 43 6f 6e   iCons<0 && pCon
d4d0: 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  s->op==SQLITE_IN
d4e0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
d4f0: 51 20 26 26 20 62 44 6f 63 69 64 20 29 7b 0a 20  Q && bDocid ){. 
d500: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e       pInfo->idxN
d510: 75 6d 20 3d 20 46 54 53 33 5f 44 4f 43 49 44 5f  um = FTS3_DOCID_
d520: 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 70 49  SEARCH;.      pI
d530: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
d540: 73 74 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  st = 1.0;.      
d550: 69 43 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 7d  iCons = i;.    }
d560: 0a 0a 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48  ..    /* A MATCH
d570: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 55 73 65   constraint. Use
d580: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61   a full-text sea
d590: 72 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rch..    **.    
d5a0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  ** If there is m
d5b0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 4d 41 54  ore than one MAT
d5c0: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 76  CH constraint av
d5d0: 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65  ailable, use the
d5e0: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 6f 6e   first.    ** on
d5f0: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 49  e encountered. I
d600: 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
d610: 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69  a MATCH constrai
d620: 6e 74 20 61 6e 64 20 61 20 64 69 72 65 63 74 0a  nt and a direct.
d630: 20 20 20 20 2a 2a 20 72 6f 77 69 64 2f 64 6f 63      ** rowid/doc
d640: 69 64 20 6c 6f 6f 6b 75 70 2c 20 70 72 65 66 65  id lookup, prefe
d650: 72 20 74 68 65 20 4d 41 54 43 48 20 73 74 72 61  r the MATCH stra
d660: 74 65 67 79 2e 20 54 68 69 73 20 69 73 20 64 6f  tegy. This is do
d670: 6e 65 20 65 76 65 6e 20 0a 20 20 20 20 2a 2a 20  ne even .    ** 
d680: 74 68 6f 75 67 68 20 74 68 65 20 72 6f 77 69 64  though the rowid
d690: 2f 64 6f 63 69 64 20 6c 6f 6f 6b 75 70 20 69 73  /docid lookup is
d6a0: 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20 4d   faster than a M
d6b0: 41 54 43 48 20 71 75 65 72 79 2c 20 73 65 6c 65  ATCH query, sele
d6c0: 63 74 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 20  cting.    ** it 
d6d0: 77 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 6e  would lead to an
d6e0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
d6f0: 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69  function MATCH i
d700: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
d710: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 78 74 22  .    ** context"
d720: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
d730: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70     if( pCons->op
d740: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
d750: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
d760: 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 2d 3e  .     && pCons->
d770: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 43  iColumn>=0 && pC
d780: 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3c 3d 70 2d  ons->iColumn<=p-
d790: 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
d7a0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
d7b0: 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 54  Num = FTS3_FULLT
d7c0: 45 58 54 5f 53 45 41 52 43 48 20 2b 20 70 43 6f  EXT_SEARCH + pCo
d7d0: 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ns->iColumn;.   
d7e0: 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61     pInfo->estima
d7f0: 74 65 64 43 6f 73 74 20 3d 20 32 2e 30 3b 0a 20  tedCost = 2.0;. 
d800: 20 20 20 20 20 69 43 6f 6e 73 20 3d 20 69 3b 0a       iCons = i;.
d810: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 71      }..    /* Eq
d820: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
d830: 74 20 6f 6e 20 74 68 65 20 6c 61 6e 67 69 64 20  t on the langid 
d840: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 69 66  column */.    if
d850: 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c  ( pCons->op==SQL
d860: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
d870: 41 49 4e 54 5f 45 51 20 0a 20 20 20 20 20 26 26  AINT_EQ .     &&
d880: 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3d   pCons->iColumn=
d890: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 0a  =p->nColumn + 2.
d8a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4c 61      ){.      iLa
d8b0: 6e 67 69 64 43 6f 6e 73 20 3d 20 69 3b 0a 20 20  ngidCons = i;.  
d8c0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 44 6f    }..    if( bDo
d8d0: 63 69 64 20 29 7b 0a 20 20 20 20 20 20 73 77 69  cid ){.      swi
d8e0: 74 63 68 28 20 70 43 6f 6e 73 2d 3e 6f 70 20 29  tch( pCons->op )
d8f0: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  {.        case S
d900: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
d910: 54 52 41 49 4e 54 5f 47 45 3a 0a 20 20 20 20 20  TRAINT_GE:.     
d920: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
d930: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
d940: 47 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69 44  GT:.          iD
d950: 6f 63 69 64 47 65 20 3d 20 69 3b 0a 20 20 20 20  ocidGe = i;.    
d960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
d970: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d980: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
d990: 4e 54 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20 63  NT_LE:.        c
d9a0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
d9b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a 0a  _CONSTRAINT_LT:.
d9c0: 20 20 20 20 20 20 20 20 20 20 69 44 6f 63 69 64            iDocid
d9d0: 4c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  Le = i;.        
d9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d9f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
da00: 20 49 66 20 75 73 69 6e 67 20 61 20 64 6f 63 69   If using a doci
da10: 64 3d 3f 20 6f 72 20 72 6f 77 69 64 3d 3f 20 73  d=? or rowid=? s
da20: 74 72 61 74 65 67 79 2c 20 73 65 74 20 74 68 65  trategy, set the
da30: 20 55 4e 49 51 55 45 20 66 6c 61 67 2e 20 2a 2f   UNIQUE flag. */
da40: 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 69 64  .  if( pInfo->id
da50: 78 4e 75 6d 3d 3d 46 54 53 33 5f 44 4f 43 49 44  xNum==FTS3_DOCID
da60: 5f 53 45 41 52 43 48 20 29 20 66 74 73 33 53 65  _SEARCH ) fts3Se
da70: 74 55 6e 69 71 75 65 46 6c 61 67 28 70 49 6e 66  tUniqueFlag(pInf
da80: 6f 29 3b 0a 0a 20 20 69 49 64 78 20 3d 20 31 3b  o);..  iIdx = 1;
da90: 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20  .  if( iCons>=0 
daa0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  ){.    pInfo->aC
dab0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
dac0: 43 6f 6e 73 5d 2e 61 72 67 76 49 6e 64 65 78 20  Cons].argvIndex 
dad0: 3d 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 70 49  = iIdx++;.    pI
dae0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
daf0: 55 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 6f 6d 69  Usage[iCons].omi
db00: 74 20 3d 20 31 3b 0a 20 20 7d 20 0a 20 20 69 66  t = 1;.  } .  if
db10: 28 20 69 4c 61 6e 67 69 64 43 6f 6e 73 3e 3d 30  ( iLangidCons>=0
db20: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69   ){.    pInfo->i
db30: 64 78 4e 75 6d 20 7c 3d 20 46 54 53 33 5f 48 41  dxNum |= FTS3_HA
db40: 56 45 5f 4c 41 4e 47 49 44 3b 0a 20 20 20 20 70  VE_LANGID;.    p
db50: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
db60: 74 55 73 61 67 65 5b 69 4c 61 6e 67 69 64 43 6f  tUsage[iLangidCo
db70: 6e 73 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  ns].argvIndex = 
db80: 69 49 64 78 2b 2b 3b 0a 20 20 7d 20 0a 20 20 69  iIdx++;.  } .  i
db90: 66 28 20 69 44 6f 63 69 64 47 65 3e 3d 30 20 29  f( iDocidGe>=0 )
dba0: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78  {.    pInfo->idx
dbb0: 4e 75 6d 20 7c 3d 20 46 54 53 33 5f 48 41 56 45  Num |= FTS3_HAVE
dbc0: 5f 44 4f 43 49 44 5f 47 45 3b 0a 20 20 20 20 70  _DOCID_GE;.    p
dbd0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
dbe0: 74 55 73 61 67 65 5b 69 44 6f 63 69 64 47 65 5d  tUsage[iDocidGe]
dbf0: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 49 64  .argvIndex = iId
dc00: 78 2b 2b 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20  x++;.  } .  if( 
dc10: 69 44 6f 63 69 64 4c 65 3e 3d 30 20 29 7b 0a 20  iDocidLe>=0 ){. 
dc20: 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d     pInfo->idxNum
dc30: 20 7c 3d 20 46 54 53 33 5f 48 41 56 45 5f 44 4f   |= FTS3_HAVE_DO
dc40: 43 49 44 5f 4c 45 3b 0a 20 20 20 20 70 49 6e 66  CID_LE;.    pInf
dc50: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
dc60: 61 67 65 5b 69 44 6f 63 69 64 4c 65 5d 2e 61 72  age[iDocidLe].ar
dc70: 67 76 49 6e 64 65 78 20 3d 20 69 49 64 78 2b 2b  gvIndex = iIdx++
dc80: 3b 0a 20 20 7d 20 0a 0a 20 20 2f 2a 20 52 65 67  ;.  } ..  /* Reg
dc90: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
dca0: 74 72 61 74 65 67 79 20 73 65 6c 65 63 74 65 64  trategy selected
dcb0: 2c 20 46 54 53 20 63 61 6e 20 64 65 6c 69 76 65  , FTS can delive
dcc0: 72 20 72 6f 77 73 20 69 6e 20 72 6f 77 69 64 20  r rows in rowid 
dcd0: 28 6f 72 0a 20 20 2a 2a 20 64 6f 63 69 64 29 20  (or.  ** docid) 
dce0: 6f 72 64 65 72 2e 20 42 6f 74 68 20 61 73 63 65  order. Both asce
dcf0: 6e 64 69 6e 67 20 61 6e 64 20 64 65 73 63 65 6e  nding and descen
dd00: 64 69 6e 67 20 61 72 65 20 70 6f 73 73 69 62 6c  ding are possibl
dd10: 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e. .  */.  if( p
dd20: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d  Info->nOrderBy==
dd30: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
dd40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
dd50: 64 65 72 62 79 20 2a 70 4f 72 64 65 72 20 3d 20  derby *pOrder = 
dd60: 26 70 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  &pInfo->aOrderBy
dd70: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  [0];.    if( pOr
dd80: 64 65 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 7c  der->iColumn<0 |
dd90: 7c 20 70 4f 72 64 65 72 2d 3e 69 43 6f 6c 75 6d  | pOrder->iColum
dda0: 6e 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 20  n==p->nColumn+1 
ddb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ){.      if( pOr
ddc0: 64 65 72 2d 3e 64 65 73 63 20 29 7b 0a 20 20 20  der->desc ){.   
ddd0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 53       pInfo->idxS
dde0: 74 72 20 3d 20 22 44 45 53 43 22 3b 0a 20 20 20  tr = "DESC";.   
ddf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
de00: 20 20 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20    pInfo->idxStr 
de10: 3d 20 22 41 53 43 22 3b 0a 20 20 20 20 20 20 7d  = "ASC";.      }
de20: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6f 72  .      pInfo->or
de30: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
de40: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
de50: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d  assert( p->pSegm
de60: 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ents==0 );.  ret
de70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
de80: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
de90: 74 61 74 69 6f 6e 20 6f 66 20 78 4f 70 65 6e 20  tation of xOpen 
dea0: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
deb0: 63 20 69 6e 74 20 66 74 73 33 4f 70 65 6e 4d 65  c int fts3OpenMe
dec0: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
ded0: 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
dee0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
def0: 70 70 43 73 72 29 7b 0a 20 20 73 71 6c 69 74 65  ppCsr){.  sqlite
df00: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
df10: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
df20: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
df30: 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 55 4e 55  cursor */..  UNU
df40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
df50: 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  Tab);..  /* Allo
df60: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 6c 61  cate a buffer la
df70: 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
df80: 6e 20 46 74 73 33 43 75 72 73 6f 72 20 73 74 72  n Fts3Cursor str
df90: 75 63 74 75 72 65 2e 20 49 66 20 74 68 65 0a 20  ucture. If the. 
dfa0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   ** allocation s
dfb0: 75 63 63 65 65 64 73 2c 20 7a 65 72 6f 20 69 74  ucceeds, zero it
dfc0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
dfd0: 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
dfe0: 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61  , .  ** if the a
dff0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
e000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e010: 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  OMEM..  */.  *pp
e020: 43 73 72 20 3d 20 70 43 73 72 20 3d 20 28 73 71  Csr = pCsr = (sq
e030: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
e040: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
e050: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 43 75  oc(sizeof(Fts3Cu
e060: 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 21 70  rsor));.  if( !p
e070: 43 73 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Csr ){.    retur
e080: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e090: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 73    }.  memset(pCs
e0a0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
e0b0: 33 43 75 72 73 6f 72 29 29 3b 0a 20 20 72 65 74  3Cursor));.  ret
e0c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e0d0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
e0e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
e0f0: 61 6e 64 6c 65 20 61 74 20 70 43 73 72 2d 3e 70  andle at pCsr->p
e100: 53 74 6d 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  Stmt..**.** Or, 
e110: 69 66 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  if that statemen
e120: 74 20 68 61 6e 64 6c 65 20 69 73 20 6f 6e 65 20  t handle is one 
e130: 63 72 65 61 74 65 64 20 62 79 20 66 74 73 33 43  created by fts3C
e140: 75 72 73 6f 72 53 65 65 6b 53 74 6d 74 28 29 2c  ursorSeekStmt(),
e150: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 46 74 73 33  .** and the Fts3
e160: 54 61 62 6c 65 2e 70 53 65 65 6b 53 74 6d 74 20  Table.pSeekStmt 
e170: 73 6c 6f 74 20 69 73 20 63 75 72 72 65 6e 74 6c  slot is currentl
e180: 79 20 4e 55 4c 4c 2c 20 73 61 76 65 20 74 68 65  y NULL, save the
e190: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 70 6f   statement.** po
e1a0: 69 6e 74 65 72 20 74 68 65 72 65 20 69 6e 73 74  inter there inst
e1b0: 65 61 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  ead of finalizin
e1c0: 67 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  g it..*/.static 
e1d0: 76 6f 69 64 20 66 74 73 33 43 75 72 73 6f 72 46  void fts3CursorF
e1e0: 69 6e 61 6c 69 7a 65 53 74 6d 74 28 46 74 73 33  inalizeStmt(Fts3
e1f0: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
e200: 20 69 66 28 20 70 43 73 72 2d 3e 62 53 65 65 6b   if( pCsr->bSeek
e210: 53 74 6d 74 20 29 7b 0a 20 20 20 20 46 74 73 33  Stmt ){.    Fts3
e220: 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
e230: 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
e240: 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 69 66  se.pVtab;.    if
e250: 28 20 70 2d 3e 70 53 65 65 6b 53 74 6d 74 3d 3d  ( p->pSeekStmt==
e260: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53  0 ){.      p->pS
e270: 65 65 6b 53 74 6d 74 20 3d 20 70 43 73 72 2d 3e  eekStmt = pCsr->
e280: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  pStmt;.      sql
e290: 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
e2a0: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70  >pStmt);.      p
e2b0: 43 73 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  Csr->pStmt = 0;.
e2c0: 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e      }.    pCsr->
e2d0: 62 53 65 65 6b 53 74 6d 74 20 3d 20 30 3b 0a 20  bSeekStmt = 0;. 
e2e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
e2f0: 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d  alize(pCsr->pStm
e300: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  t);.}../*.** Fre
e310: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20  e all resources 
e320: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
e330: 79 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  y the cursor pas
e340: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
e350: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
e360: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
e370: 43 6c 65 61 72 43 75 72 73 6f 72 28 46 74 73 33  ClearCursor(Fts3
e380: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
e390: 20 66 74 73 33 43 75 72 73 6f 72 46 69 6e 61 6c   fts3CursorFinal
e3a0: 69 7a 65 53 74 6d 74 28 70 43 73 72 29 3b 0a 20  izeStmt(pCsr);. 
e3b0: 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65   sqlite3Fts3Free
e3c0: 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 70  DeferredTokens(p
e3d0: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Csr);.  sqlite3_
e3e0: 66 72 65 65 28 70 43 73 72 2d 3e 61 44 6f 63 6c  free(pCsr->aDocl
e3f0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ist);.  sqlite3F
e400: 74 73 33 4d 49 42 75 66 66 65 72 46 72 65 65 28  ts3MIBufferFree(
e410: 70 43 73 72 2d 3e 70 4d 49 42 75 66 66 65 72 29  pCsr->pMIBuffer)
e420: 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 45  ;.  sqlite3Fts3E
e430: 78 70 72 46 72 65 65 28 70 43 73 72 2d 3e 70 45  xprFree(pCsr->pE
e440: 78 70 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xpr);.  memset(&
e450: 28 26 70 43 73 72 2d 3e 62 61 73 65 29 5b 31 5d  (&pCsr->base)[1]
e460: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
e470: 43 75 72 73 6f 72 29 2d 73 69 7a 65 6f 66 28 73  Cursor)-sizeof(s
e480: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e490: 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  or));.}../*.** C
e4a0: 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
e4b0: 20 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c    For additional
e4c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65 65   information see
e4d0: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
e4e0: 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43 6c  on.** on the xCl
e4f0: 6f 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ose method of th
e500: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
e510: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
e520: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6c 6f  atic int fts3Clo
e530: 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  seMethod(sqlite3
e540: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
e550: 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 43 75  ursor){.  Fts3Cu
e560: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
e570: 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73  s3Cursor *)pCurs
e580: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  or;.  assert( ((
e590: 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
e5a0: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e 70  ->base.pVtab)->p
e5b0: 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20  Segments==0 );. 
e5c0: 20 66 74 73 33 43 6c 65 61 72 43 75 72 73 6f 72   fts3ClearCursor
e5d0: 28 70 43 73 72 29 3b 0a 20 20 61 73 73 65 72 74  (pCsr);.  assert
e5e0: 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
e5f0: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
e600: 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  )->pSegments==0 
e610: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
e620: 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
e630: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e640: 2f 2a 0a 2a 2a 20 49 66 20 70 43 73 72 2d 3e 70  /*.** If pCsr->p
e650: 53 74 6d 74 20 68 61 73 20 6e 6f 74 20 62 65 65  Stmt has not bee
e660: 6e 20 70 72 65 70 61 72 65 64 20 28 69 2e 65 2e  n prepared (i.e.
e670: 20 69 66 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d   if pCsr->pStmt=
e680: 3d 30 29 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6d  =0), then.** com
e690: 70 6f 73 65 20 61 6e 64 20 70 72 65 70 61 72 65  pose and prepare
e6a0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
e6b0: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  t of the form:.*
e6c0: 2a 0a 2a 2a 20 20 20 20 22 53 45 4c 45 43 54 20  *.**    "SELECT 
e6d0: 3c 63 6f 6c 75 6d 6e 73 3e 20 46 52 4f 4d 20 25  <columns> FROM %
e6e0: 5f 63 6f 6e 74 65 6e 74 20 57 48 45 52 45 20 72  _content WHERE r
e6f0: 6f 77 69 64 20 3d 20 3f 22 0a 2a 2a 0a 2a 2a 20  owid = ?".**.** 
e700: 28 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65  (or the equivale
e710: 6e 74 20 66 6f 72 20 61 20 63 6f 6e 74 65 6e 74  nt for a content
e720: 3d 78 78 78 20 74 61 62 6c 65 29 20 61 6e 64 20  =xxx table) and 
e730: 73 65 74 20 70 43 73 72 2d 3e 70 53 74 6d 74 20  set pCsr->pStmt 
e740: 74 6f 0a 2a 2a 20 69 74 2e 20 49 66 20 61 6e 20  to.** it. If an 
e750: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
e760: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
e770: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
e780: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 75 72  atic int fts3Cur
e790: 73 6f 72 53 65 65 6b 53 74 6d 74 28 46 74 73 33  sorSeekStmt(Fts3
e7a0: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
e7b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e7c0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  _OK;.  if( pCsr-
e7d0: 3e 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  >pStmt==0 ){.   
e7e0: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
e7f0: 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
e800: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
e810: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
e820: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 65 6b 53     if( p->pSeekS
e830: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73  tmt ){.      pCs
e840: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 2d 3e 70 53  r->pStmt = p->pS
e850: 65 65 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 70  eekStmt;.      p
e860: 2d 3e 70 53 65 65 6b 53 74 6d 74 20 3d 20 30 3b  ->pSeekStmt = 0;
e870: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e880: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
e890: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
e8a0: 20 25 73 20 57 48 45 52 45 20 72 6f 77 69 64 20   %s WHERE rowid 
e8b0: 3d 20 3f 22 2c 20 70 2d 3e 7a 52 65 61 64 45 78  = ?", p->zReadEx
e8c0: 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69  prlist);.      i
e8d0: 66 28 20 21 7a 53 71 6c 20 29 20 72 65 74 75 72  f( !zSql ) retur
e8e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e8f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e900: 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 70 2d  e3_prepare_v3(p-
e910: 3e 64 62 2c 20 7a 53 71 6c 2c 2d 31 2c 53 51 4c  >db, zSql,-1,SQL
e920: 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52 53  ITE_PREPARE_PERS
e930: 49 53 54 45 4e 54 2c 26 70 43 73 72 2d 3e 70 53  ISTENT,&pCsr->pS
e940: 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 73 71  tmt,0);.      sq
e950: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
e960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e970: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
e980: 70 43 73 72 2d 3e 62 53 65 65 6b 53 74 6d 74 20  pCsr->bSeekStmt 
e990: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
e9a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
e9b0: 6f 73 69 74 69 6f 6e 20 74 68 65 20 70 43 73 72  osition the pCsr
e9c0: 2d 3e 70 53 74 6d 74 20 73 74 61 74 65 6d 65 6e  ->pStmt statemen
e9d0: 74 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  t so that it is 
e9e0: 6f 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 6f 66  on the row.** of
e9f0: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
ea00: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
ea10: 6e 73 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63  ns the last matc
ea20: 68 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51  h.  Return.** SQ
ea30: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
ea40: 73 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ss.  .*/.static 
ea50: 69 6e 74 20 66 74 73 33 43 75 72 73 6f 72 53 65  int fts3CursorSe
ea60: 65 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ek(sqlite3_conte
ea70: 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 46 74  xt *pContext, Ft
ea80: 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  s3Cursor *pCsr){
ea90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
eaa0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73  TE_OK;.  if( pCs
eab0: 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b  r->isRequireSeek
eac0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
ead0: 33 43 75 72 73 6f 72 53 65 65 6b 53 74 6d 74 28  3CursorSeekStmt(
eae0: 70 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCsr);.    if( r
eaf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
eb00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
eb10: 6e 64 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70  nd_int64(pCsr->p
eb20: 53 74 6d 74 2c 20 31 2c 20 70 43 73 72 2d 3e 69  Stmt, 1, pCsr->i
eb30: 50 72 65 76 49 64 29 3b 0a 20 20 20 20 20 20 70  PrevId);.      p
eb40: 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65  Csr->isRequireSe
eb50: 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ek = 0;.      if
eb60: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
eb70: 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
eb80: 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
eb90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
eba0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
ebb0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ebc0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73  qlite3_reset(pCs
ebd0: 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  r->pStmt);.     
ebe0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ebf0: 45 5f 4f 4b 20 26 26 20 28 28 46 74 73 33 54 61  E_OK && ((Fts3Ta
ec00: 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
ec10: 2e 70 56 74 61 62 29 2d 3e 7a 43 6f 6e 74 65 6e  .pVtab)->zConten
ec20: 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tTbl==0 ){.     
ec30: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 72 6f       /* If no ro
ec40: 77 20 77 61 73 20 66 6f 75 6e 64 20 61 6e 64 20  w was found and 
ec50: 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
ec60: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
ec70: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 20 20 20 20  %_content.      
ec80: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 73 20      ** table is 
ec90: 6d 69 73 73 69 6e 67 20 61 20 72 6f 77 20 74 68  missing a row th
eca0: 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  at is present in
ecb0: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
ecc0: 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
ecd0: 2a 2a 20 54 68 65 20 64 61 74 61 20 73 74 72 75  ** The data stru
ece0: 63 74 75 72 65 73 20 61 72 65 20 63 6f 72 72 75  ctures are corru
ecf0: 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  pt.  */.        
ed00: 20 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55    rc = FTS_CORRU
ed10: 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 20  PT_VTAB;.       
ed20: 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d     pCsr->isEof =
ed30: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ed40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ed50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ed60: 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 74 65 78 74  E_OK && pContext
ed70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ed80: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
ed90: 65 28 70 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b  e(pContext, rc);
eda0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
edb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
edc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
edd0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
ede0: 6e 67 6c 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f  ngle interior no
edf0: 64 65 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  de when searchin
ee00: 67 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 66 6f  g.** a b-tree fo
ee10: 72 20 61 20 74 65 72 6d 20 6f 72 20 74 65 72 6d  r a term or term
ee20: 20 70 72 65 66 69 78 2e 20 54 68 65 20 6e 6f 64   prefix. The nod
ee30: 65 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  e data is passed
ee40: 20 74 6f 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e   to this .** fun
ee50: 63 74 69 6f 6e 20 76 69 61 20 74 68 65 20 7a 4e  ction via the zN
ee60: 6f 64 65 2f 6e 4e 6f 64 65 20 70 61 72 61 6d 65  ode/nNode parame
ee70: 74 65 72 73 2e 20 54 68 65 20 74 65 72 6d 20 74  ters. The term t
ee80: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 69 73 0a  o search for is.
ee90: 2a 2a 20 70 61 73 73 65 64 20 69 6e 20 7a 54 65  ** passed in zTe
eea0: 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  rm/nTerm..**.** 
eeb0: 49 66 20 70 69 46 69 72 73 74 20 69 73 20 6e 6f  If piFirst is no
eec0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  t NULL, then thi
eed0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
eee0: 2a 70 69 46 69 72 73 74 20 74 6f 20 74 68 65 20  *piFirst to the 
eef0: 62 6c 6f 63 6b 69 64 0a 2a 2a 20 6f 66 20 74 68  blockid.** of th
ef00: 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 74 68 61  e child node tha
ef10: 74 20 68 65 61 64 73 20 74 68 65 20 73 75 62 2d  t heads the sub-
ef20: 74 72 65 65 20 74 68 61 74 20 6d 61 79 20 63 6f  tree that may co
ef30: 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 2e 0a  ntain the term..
ef40: 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c 61 73 74 20  **.** If piLast 
ef50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
ef60: 6e 20 2a 70 69 4c 61 73 74 20 69 73 20 73 65 74  n *piLast is set
ef70: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ef80: 73 74 20 63 68 69 6c 64 20 6e 6f 64 65 0a 2a 2a  st child node.**
ef90: 20 74 68 61 74 20 68 65 61 64 73 20 61 20 73 75   that heads a su
efa0: 62 2d 74 72 65 65 20 74 68 61 74 20 6d 61 79 20  b-tree that may 
efb0: 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20 66  contain a term f
efc0: 6f 72 20 77 68 69 63 68 20 7a 54 65 72 6d 2f 6e  or which zTerm/n
efd0: 54 65 72 6d 20 69 73 0a 2a 2a 20 61 20 70 72 65  Term is.** a pre
efe0: 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  fix..**.** If an
eff0: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
f000: 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
f010: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
f020: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
f030: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
f040: 20 66 74 73 33 53 63 61 6e 49 6e 74 65 72 69 6f   fts3ScanInterio
f050: 72 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  rNode(.  const c
f060: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
f070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
f080: 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61 76 65   to select leave
f090: 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  s for */.  int n
f0a0: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
f0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
f0c0: 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d  ze of term zTerm
f0d0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
f0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 64 65  onst char *zNode
f0f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f100: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
f110: 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e 74 65  ing segment inte
f120: 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rior node */.  i
f130: 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f150: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
f160: 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73   at zNode */.  s
f170: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
f180: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 2f  First,         /
f190: 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64 20  * OUT: Selected 
f1a0: 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 20 20  child node */.  
f1b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
f1c0: 69 4c 61 73 74 20 20 20 20 20 20 20 20 20 20 20  iLast           
f1d0: 2f 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64  /* OUT: Selected
f1e0: 20 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 29   child node */.)
f1f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f200: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
f210: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f220: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
f230: 61 72 20 2a 7a 43 73 72 20 3d 20 7a 4e 6f 64 65  ar *zCsr = zNode
f240: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ;       /* Curso
f250: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
f260: 6f 75 67 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 63  ough node */.  c
f270: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
f280: 3d 20 26 7a 43 73 72 5b 6e 4e 6f 64 65 5d 3b 2f  = &zCsr[nNode];/
f290: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 69 6f  * End of interio
f2a0: 72 20 6e 6f 64 65 20 62 75 66 66 65 72 20 2a 2f  r node buffer */
f2b0: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 66 65 72  .  char *zBuffer
f2c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f2d0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
f2e0: 6c 6f 61 64 20 74 65 72 6d 73 20 69 6e 74 6f 20  load terms into 
f2f0: 2a 2f 0a 20 20 69 36 34 20 6e 41 6c 6c 6f 63 20  */.  i64 nAlloc 
f300: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f310: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f320: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
f330: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 69 72 73   */.  int isFirs
f340: 74 54 65 72 6d 20 3d 20 31 3b 20 20 20 20 20 20  tTerm = 1;      
f350: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68        /* True wh
f360: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 66 69  en processing fi
f370: 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
f380: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
f390: 74 36 34 20 69 43 68 69 6c 64 3b 20 20 20 20 20  t64 iChild;     
f3a0: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
f3b0: 64 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65 20  d of child node 
f3c0: 74 6f 20 64 65 73 63 65 6e 64 20 74 6f 20 2a 2f  to descend to */
f3d0: 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72  ..  /* Skip over
f3e0: 20 74 68 65 20 27 68 65 69 67 68 74 27 20 76 61   the 'height' va
f3f0: 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
f400: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
f410: 20 65 76 65 72 79 20 0a 20 20 2a 2a 20 69 6e 74   every .  ** int
f420: 65 72 69 6f 72 20 6e 6f 64 65 2e 20 54 68 65 6e  erior node. Then
f430: 20 6c 6f 61 64 20 74 68 65 20 62 6c 6f 63 6b 69   load the blocki
f440: 64 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 63 68  d of the left-ch
f450: 69 6c 64 20 6f 66 20 74 68 65 20 62 2d 74 72 65  ild of the b-tre
f460: 65 0a 20 20 2a 2a 20 6e 6f 64 65 20 69 6e 74 6f  e.  ** node into
f470: 20 76 61 72 69 61 62 6c 65 20 69 43 68 69 6c 64   variable iChild
f480: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  .  .  **.  ** Ev
f490: 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 20 73  en if the data s
f4a0: 74 72 75 63 74 75 72 65 20 6f 6e 20 64 69 73 6b  tructure on disk
f4b0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
f4c0: 68 69 73 20 28 72 65 61 64 69 6e 67 20 74 77 6f  his (reading two
f4d0: 0a 20 20 2a 2a 20 76 61 72 69 6e 74 73 20 66 72  .  ** varints fr
f4e0: 6f 6d 20 74 68 65 20 62 75 66 66 65 72 29 20 64  om the buffer) d
f4f0: 6f 65 73 20 6e 6f 74 20 72 69 73 6b 20 61 6e 20  oes not risk an 
f500: 6f 76 65 72 72 65 61 64 2e 20 49 66 20 7a 4e 6f  overread. If zNo
f510: 64 65 20 69 73 20 61 0a 20 20 2a 2a 20 72 6f 6f  de is a.  ** roo
f520: 74 20 6e 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  t node, then the
f530: 20 62 75 66 66 65 72 20 63 6f 6d 65 73 20 66 72   buffer comes fr
f540: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
f550: 65 6d 65 6e 74 2e 20 53 51 4c 69 74 65 20 64 6f  ement. SQLite do
f560: 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 6d 61 6b 65  es.  ** not make
f570: 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 20   this guarantee 
f580: 65 78 70 6c 69 63 69 74 6c 79 2c 20 62 75 74 20  explicitly, but 
f590: 69 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 72  in practice ther
f5a0: 65 20 61 72 65 20 61 6c 77 61 79 73 0a 20 20 2a  e are always.  *
f5b0: 2a 20 65 69 74 68 65 72 20 6d 6f 72 65 20 74 68  * either more th
f5c0: 61 6e 20 32 30 20 62 79 74 65 73 20 6f 66 20 61  an 20 bytes of a
f5d0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 66  llocated space f
f5e0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6e 4e 6f  ollowing the nNo
f5f0: 64 65 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  de bytes of.  **
f600: 20 63 6f 6e 74 65 6e 74 73 2c 20 6f 72 20 74 77   contents, or tw
f610: 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 20 4f 72  o zero bytes. Or
f620: 2c 20 69 66 20 74 68 65 20 6e 6f 64 65 20 69 73  , if the node is
f630: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
f640: 5f 73 65 67 6d 65 6e 74 73 0a 20 20 2a 2a 20 74  _segments.  ** t
f650: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 72 65  able, then there
f660: 20 61 72 65 20 61 6c 77 61 79 73 20 32 30 20 62   are always 20 b
f670: 79 74 65 73 20 6f 66 20 7a 65 72 6f 65 64 20 70  ytes of zeroed p
f680: 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
f690: 20 74 68 65 0a 20 20 2a 2a 20 6e 4e 6f 64 65 20   the.  ** nNode 
f6a0: 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  bytes of content
f6b0: 20 28 73 65 65 20 73 71 6c 69 74 65 33 46 74 73   (see sqlite3Fts
f6c0: 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 6f 72  3ReadBlock() for
f6d0: 20 64 65 74 61 69 6c 73 29 2e 0a 20 20 2a 2f 0a   details)..  */.
f6e0: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
f6f0: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 7a  3Fts3GetVarint(z
f700: 43 73 72 2c 20 26 69 43 68 69 6c 64 29 3b 0a 20  Csr, &iChild);. 
f710: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
f720: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 7a 43  Fts3GetVarint(zC
f730: 73 72 2c 20 26 69 43 68 69 6c 64 29 3b 0a 20 20  sr, &iChild);.  
f740: 69 66 28 20 7a 43 73 72 3e 7a 45 6e 64 20 29 7b  if( zCsr>zEnd ){
f750: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53 5f  .    return FTS_
f760: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
f770: 7d 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 7a 43  }.  .  while( zC
f780: 73 72 3c 7a 45 6e 64 20 26 26 20 28 70 69 46 69  sr<zEnd && (piFi
f790: 72 73 74 20 7c 7c 20 70 69 4c 61 73 74 29 20 29  rst || piLast) )
f7a0: 7b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 20 20  {.    int cmp;  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 2f 2a 20 6d 65 6d 63 6d 70 28 29 20      /* memcmp() 
f7d0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 6e  result */.    in
f7e0: 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20  t nSuffix;      
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f800: 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66  ize of term suff
f810: 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  ix */.    int nP
f820: 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20  refix = 0;      
f830: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f840: 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a  of term prefix *
f850: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 75 66 66 65  /.    int nBuffe
f860: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f870: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 65 72      /* Total ter
f880: 6d 20 73 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20  m size */.  .   
f890: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78   /* Load the nex
f8a0: 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 6f  t term on the no
f8b0: 64 65 20 69 6e 74 6f 20 7a 42 75 66 66 65 72 2e  de into zBuffer.
f8c0: 20 55 73 65 20 72 65 61 6c 6c 6f 63 28 29 20 74   Use realloc() t
f8d0: 6f 20 65 78 70 61 6e 64 0a 20 20 20 20 2a 2a 20  o expand.    ** 
f8e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 7a 42 75 66  the size of zBuf
f8f0: 66 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e  fer if required.
f900: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
f910: 46 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  FirstTerm ){.   
f920: 20 20 20 7a 43 73 72 20 2b 3d 20 66 74 73 33 47     zCsr += fts3G
f930: 65 74 56 61 72 69 6e 74 33 32 28 7a 43 73 72 2c  etVarint32(zCsr,
f940: 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20   &nPrefix);.    
f950: 7d 0a 20 20 20 20 69 73 46 69 72 73 74 54 65 72  }.    isFirstTer
f960: 6d 20 3d 20 30 3b 0a 20 20 20 20 7a 43 73 72 20  m = 0;.    zCsr 
f970: 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
f980: 33 32 28 7a 43 73 72 2c 20 26 6e 53 75 66 66 69  32(zCsr, &nSuffi
f990: 78 29 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  x);.    .    ass
f9a0: 65 72 74 28 20 6e 50 72 65 66 69 78 3e 3d 30 20  ert( nPrefix>=0 
f9b0: 26 26 20 6e 53 75 66 66 69 78 3e 3d 30 20 29 3b  && nSuffix>=0 );
f9c0: 0a 20 20 20 20 69 66 28 20 6e 50 72 65 66 69 78  .    if( nPrefix
f9d0: 3e 7a 43 73 72 2d 7a 4e 6f 64 65 20 7c 7c 20 6e  >zCsr-zNode || n
f9e0: 53 75 66 66 69 78 3e 7a 45 6e 64 2d 7a 43 73 72  Suffix>zEnd-zCsr
f9f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
fa00: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
fa10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69  .      goto fini
fa20: 73 68 5f 73 63 61 6e 3b 0a 20 20 20 20 7d 0a 20  sh_scan;.    }. 
fa30: 20 20 20 69 66 28 20 28 69 36 34 29 6e 50 72 65     if( (i64)nPre
fa40: 66 69 78 2b 6e 53 75 66 66 69 78 3e 6e 41 6c 6c  fix+nSuffix>nAll
fa50: 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  oc ){.      char
fa60: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 6e 41   *zNew;.      nA
fa70: 6c 6c 6f 63 20 3d 20 28 28 69 36 34 29 6e 50 72  lloc = ((i64)nPr
fa80: 65 66 69 78 2b 6e 53 75 66 66 69 78 29 20 2a 20  efix+nSuffix) * 
fa90: 32 3b 0a 20 20 20 20 20 20 7a 4e 65 77 20 3d 20  2;.      zNew = 
faa0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
fab0: 72 65 61 6c 6c 6f 63 36 34 28 7a 42 75 66 66 65  realloc64(zBuffe
fac0: 72 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  r, nAlloc);.    
fad0: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
fae0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
faf0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
fb00: 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f 73 63    goto finish_sc
fb10: 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  an;.      }.    
fb20: 20 20 7a 42 75 66 66 65 72 20 3d 20 7a 4e 65 77    zBuffer = zNew
fb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
fb40: 72 74 28 20 7a 42 75 66 66 65 72 20 29 3b 0a 20  rt( zBuffer );. 
fb50: 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 66     memcpy(&zBuff
fb60: 65 72 5b 6e 50 72 65 66 69 78 5d 2c 20 7a 43 73  er[nPrefix], zCs
fb70: 72 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  r, nSuffix);.   
fb80: 20 6e 42 75 66 66 65 72 20 3d 20 6e 50 72 65 66   nBuffer = nPref
fb90: 69 78 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20  ix + nSuffix;.  
fba0: 20 20 7a 43 73 72 20 2b 3d 20 6e 53 75 66 66 69    zCsr += nSuffi
fbb0: 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  x;..    /* Compa
fbc0: 72 65 20 74 68 65 20 74 65 72 6d 20 77 65 20 61  re the term we a
fbd0: 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  re searching for
fbe0: 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 6a   with the term j
fbf0: 75 73 74 20 6c 6f 61 64 65 64 20 66 72 6f 6d 0a  ust loaded from.
fc00: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72      ** the inter
fc10: 69 6f 72 20 6e 6f 64 65 2e 20 49 66 20 74 68 65  ior node. If the
fc20: 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
fc30: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
fc40: 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20  or equal.    ** 
fc50: 74 6f 20 74 68 65 20 74 65 72 6d 20 66 72 6f 6d  to the term from
fc60: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
fc70: 64 65 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  de, then all ter
fc80: 6d 73 20 6f 6e 20 74 68 65 20 73 75 62 2d 74 72  ms on the sub-tr
fc90: 65 65 20 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  ee .    ** heade
fca0: 64 20 62 79 20 6e 6f 64 65 20 69 43 68 69 6c 64  d by node iChild
fcb0: 20 61 72 65 20 73 6d 61 6c 6c 65 72 20 74 68 61   are smaller tha
fcc0: 6e 20 7a 54 65 72 6d 2e 20 4e 6f 20 6e 65 65 64  n zTerm. No need
fcd0: 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20 20 20   to search .    
fce0: 2a 2a 20 69 43 68 69 6c 64 2e 0a 20 20 20 20 2a  ** iChild..    *
fcf0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
fd00: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74 65  interior node te
fd10: 72 6d 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  rm is larger tha
fd20: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
fd30: 74 65 72 6d 2c 20 74 68 65 6e 0a 20 20 20 20 2a  term, then.    *
fd40: 2a 20 74 68 65 20 74 72 65 65 20 68 65 61 64 65  * the tree heade
fd50: 64 20 62 79 20 69 43 68 69 6c 64 20 6d 61 79 20  d by iChild may 
fd60: 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63  contain the spec
fd70: 69 66 69 65 64 20 74 65 72 6d 2e 0a 20 20 20 20  ified term..    
fd80: 2a 2f 0a 20 20 20 20 63 6d 70 20 3d 20 6d 65 6d  */.    cmp = mem
fd90: 63 6d 70 28 7a 54 65 72 6d 2c 20 7a 42 75 66 66  cmp(zTerm, zBuff
fda0: 65 72 2c 20 28 6e 42 75 66 66 65 72 3e 6e 54 65  er, (nBuffer>nTe
fdb0: 72 6d 20 3f 20 6e 54 65 72 6d 20 3a 20 6e 42 75  rm ? nTerm : nBu
fdc0: 66 66 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ffer));.    if( 
fdd0: 70 69 46 69 72 73 74 20 26 26 20 28 63 6d 70 3c  piFirst && (cmp<
fde0: 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20 26 26 20  0 || (cmp==0 && 
fdf0: 6e 42 75 66 66 65 72 3e 6e 54 65 72 6d 29 29 20  nBuffer>nTerm)) 
fe00: 29 7b 0a 20 20 20 20 20 20 2a 70 69 46 69 72 73  ){.      *piFirs
fe10: 74 20 3d 20 69 43 68 69 6c 64 3b 0a 20 20 20 20  t = iChild;.    
fe20: 20 20 70 69 46 69 72 73 74 20 3d 20 30 3b 0a 20    piFirst = 0;. 
fe30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 69     }..    if( pi
fe40: 4c 61 73 74 20 26 26 20 63 6d 70 3c 30 20 29 7b  Last && cmp<0 ){
fe50: 0a 20 20 20 20 20 20 2a 70 69 4c 61 73 74 20 3d  .      *piLast =
fe60: 20 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 70   iChild;.      p
fe70: 69 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  iLast = 0;.    }
fe80: 0a 0a 20 20 20 20 69 43 68 69 6c 64 2b 2b 3b 0a  ..    iChild++;.
fe90: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 70 69 46 69    };..  if( piFi
fea0: 72 73 74 20 29 20 2a 70 69 46 69 72 73 74 20 3d  rst ) *piFirst =
feb0: 20 69 43 68 69 6c 64 3b 0a 20 20 69 66 28 20 70   iChild;.  if( p
fec0: 69 4c 61 73 74 20 29 20 2a 70 69 4c 61 73 74 20  iLast ) *piLast 
fed0: 3d 20 69 43 68 69 6c 64 3b 0a 0a 20 66 69 6e 69  = iChild;.. fini
fee0: 73 68 5f 73 63 61 6e 3a 0a 20 20 73 71 6c 69 74  sh_scan:.  sqlit
fef0: 65 33 5f 66 72 65 65 28 7a 42 75 66 66 65 72 29  e3_free(zBuffer)
ff00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ff10: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 75 66  .../*.** The buf
ff20: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
ff30: 79 20 61 72 67 75 6d 65 6e 74 20 7a 4e 6f 64 65  y argument zNode
ff40: 20 28 73 69 7a 65 20 6e 4e 6f 64 65 20 62 79 74   (size nNode byt
ff50: 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a  es) contains an.
ff60: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ** interior node
ff70: 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 65 67   of a b-tree seg
ff80: 6d 65 6e 74 2e 20 54 68 65 20 7a 54 65 72 6d 20  ment. The zTerm 
ff90: 62 75 66 66 65 72 20 28 73 69 7a 65 20 6e 54 65  buffer (size nTe
ffa0: 72 6d 20 62 79 74 65 73 29 0a 2a 2a 20 63 6f 6e  rm bytes).** con
ffb0: 74 61 69 6e 73 20 61 20 74 65 72 6d 2e 20 54 68  tains a term. Th
ffc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
ffd0: 63 68 65 73 20 74 68 65 20 73 75 62 2d 74 72 65  ches the sub-tre
ffe0: 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20  e headed by the 
fff0: 7a 4e 6f 64 65 0a 2a 2a 20 6e 6f 64 65 20 66 6f  zNode.** node fo
10000 72 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 6c  r the range of l
10010 65 61 66 20 6e 6f 64 65 73 20 74 68 61 74 20 6d  eaf nodes that m
10020 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  ay contain the s
10030 70 65 63 69 66 69 65 64 20 74 65 72 6d 0a 2a 2a  pecified term.**
10040 20 6f 72 20 74 65 72 6d 73 20 66 6f 72 20 77 68   or terms for wh
10050 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ich the specifie
10060 64 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66  d term is a pref
10070 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c  ix..**.** If piL
10080 65 61 66 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  eaf is not NULL,
10090 20 74 68 65 6e 20 2a 70 69 4c 65 61 66 20 69 73   then *piLeaf is
100a0 20 73 65 74 20 74 6f 20 74 68 65 20 62 6c 6f 63   set to the bloc
100b0 6b 69 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6c  kid of the .** l
100c0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6e 6f  eft-most leaf no
100d0 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  de in the tree t
100e0 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  hat may contain 
100f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
10100 72 6d 2e 0a 2a 2a 20 49 66 20 70 69 4c 65 61 66  rm..** If piLeaf
10110 32 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  2 is not NULL, t
10120 68 65 6e 20 2a 70 69 4c 65 61 66 32 20 69 73 20  hen *piLeaf2 is 
10130 73 65 74 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b  set to the block
10140 69 64 20 6f 66 20 74 68 65 0a 2a 2a 20 72 69 67  id of the.** rig
10150 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6e 6f 64  ht-most leaf nod
10160 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61  e that may conta
10170 69 6e 20 61 20 74 65 72 6d 20 66 6f 72 20 77 68  in a term for wh
10180 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ich the specifie
10190 64 0a 2a 2a 20 74 65 72 6d 20 69 73 20 61 20 70  d.** term is a p
101a0 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  refix..**.** It 
101b0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
101c0 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
101d0 74 75 72 6e 65 64 20 6c 65 61 66 20 6e 6f 64 65  turned leaf node
101e0 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  s does not conta
101f0 69 6e 20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  in .** the speci
10200 66 69 65 64 20 74 65 72 6d 20 6f 72 20 61 6e 79  fied term or any
10210 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
10220 20 69 74 20 69 73 20 61 20 70 72 65 66 69 78 2e   it is a prefix.
10230 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
10240 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 64 6f 65   .** segment doe
10250 73 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 73 75  s contain any su
10260 63 68 20 74 65 72 6d 73 2c 20 74 68 65 79 20 61  ch terms, they a
10270 72 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  re stored within
10280 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 0a   the identified.
10290 2a 2a 20 72 61 6e 67 65 2e 20 42 65 63 61 75 73  ** range. Becaus
102a0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
102b0 6f 6e 6c 79 20 69 6e 73 70 65 63 74 73 20 69 6e  only inspects in
102c0 74 65 72 69 6f 72 20 73 65 67 6d 65 6e 74 20 6e  terior segment n
102d0 6f 64 65 73 20 28 61 6e 64 0a 2a 2a 20 6e 65 76  odes (and.** nev
102e0 65 72 20 6c 6f 61 64 73 20 6c 65 61 66 20 6e 6f  er loads leaf no
102f0 64 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 29  des into memory)
10300 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
10310 69 62 6c 65 20 74 6f 20 62 65 20 73 75 72 65 2e  ible to be sure.
10320 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
10330 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
10340 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
10350 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  han SQLITE_OK is
10360 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73   returned..*/ .s
10370 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
10380 6c 65 63 74 4c 65 61 66 28 0a 20 20 46 74 73 33  lectLeaf(.  Fts3
10390 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
103a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
103b0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
103c0 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
103d0 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
103e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
103f0 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61 76 65   to select leave
10400 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  s for */.  int n
10410 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
10420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10430 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d  ze of term zTerm
10440 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
10450 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 64 65  onst char *zNode
10460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10470 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
10480 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e 74 65  ing segment inte
10490 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rior node */.  i
104a0 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104c0 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
104d0 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73   at zNode */.  s
104e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
104f0 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 2f  Leaf,          /
10500 2a 20 53 65 6c 65 63 74 65 64 20 6c 65 61 66 20  * Selected leaf 
10510 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
10520 33 5f 69 6e 74 36 34 20 2a 70 69 4c 65 61 66 32  3_int64 *piLeaf2
10530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
10540 65 63 74 65 64 20 6c 65 61 66 20 6e 6f 64 65 20  ected leaf node 
10550 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
10560 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
10570 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10580 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
10590 69 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  iHeight;        
105a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
105b0 65 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f  eight of this no
105c0 64 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 0a 20  de in tree */.. 
105d0 20 61 73 73 65 72 74 28 20 70 69 4c 65 61 66 20   assert( piLeaf 
105e0 7c 7c 20 70 69 4c 65 61 66 32 20 29 3b 0a 0a 20  || piLeaf2 );.. 
105f0 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
10600 28 7a 4e 6f 64 65 2c 20 26 69 48 65 69 67 68 74  (zNode, &iHeight
10610 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 63  );.  rc = fts3Sc
10620 61 6e 49 6e 74 65 72 69 6f 72 4e 6f 64 65 28 7a  anInteriorNode(z
10630 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 4e 6f  Term, nTerm, zNo
10640 64 65 2c 20 6e 4e 6f 64 65 2c 20 70 69 4c 65 61  de, nNode, piLea
10650 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a 20 20 61  f, piLeaf2);.  a
10660 73 73 65 72 74 28 20 21 70 69 4c 65 61 66 32 20  ssert( !piLeaf2 
10670 7c 7c 20 21 70 69 4c 65 61 66 20 7c 7c 20 72 63  || !piLeaf || rc
10680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
10690 2a 70 69 4c 65 61 66 3c 3d 2a 70 69 4c 65 61 66  *piLeaf<=*piLeaf
106a0 32 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  2) );..  if( rc=
106b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 48  =SQLITE_OK && iH
106c0 65 69 67 68 74 3e 31 20 29 7b 0a 20 20 20 20 63  eight>1 ){.    c
106d0 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 30 3b 20  har *zBlob = 0; 
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106f0 42 6c 6f 62 20 72 65 61 64 20 66 72 6f 6d 20 25  Blob read from %
10700 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
10710 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62  */.    int nBlob
10720 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10730 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10740 7a 42 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a  zBlob in bytes *
10750 2f 0a 0a 20 20 20 20 69 66 28 20 70 69 4c 65 61  /..    if( piLea
10760 66 20 26 26 20 70 69 4c 65 61 66 32 20 26 26 20  f && piLeaf2 && 
10770 28 2a 70 69 4c 65 61 66 21 3d 2a 70 69 4c 65 61  (*piLeaf!=*piLea
10780 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f2) ){.      rc 
10790 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
107a0 64 42 6c 6f 63 6b 28 70 2c 20 2a 70 69 4c 65 61  dBlock(p, *piLea
107b0 66 2c 20 26 7a 42 6c 6f 62 2c 20 26 6e 42 6c 6f  f, &zBlob, &nBlo
107c0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  b, 0);.      if(
107d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
107e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
107f0 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c  ts3SelectLeaf(p,
10800 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a   zTerm, nTerm, z
10810 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 69 4c  Blob, nBlob, piL
10820 65 61 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  eaf, 0);.      }
10830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10840 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20 20 20 20  ree(zBlob);.    
10850 20 20 70 69 4c 65 61 66 20 3d 20 30 3b 0a 20 20    piLeaf = 0;.  
10860 20 20 20 20 7a 42 6c 6f 62 20 3d 20 30 3b 0a 20      zBlob = 0;. 
10870 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
10880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
108a0 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
108b0 2c 20 70 69 4c 65 61 66 3f 2a 70 69 4c 65 61 66  , piLeaf?*piLeaf
108c0 3a 2a 70 69 4c 65 61 66 32 2c 20 26 7a 42 6c 6f  :*piLeaf2, &zBlo
108d0 62 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20  b, &nBlob, 0);. 
108e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
108f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10900 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 6c      rc = fts3Sel
10910 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72 6d  ectLeaf(p, zTerm
10920 2c 20 6e 54 65 72 6d 2c 20 7a 42 6c 6f 62 2c 20  , nTerm, zBlob, 
10930 6e 42 6c 6f 62 2c 20 70 69 4c 65 61 66 2c 20 70  nBlob, piLeaf, p
10940 69 4c 65 61 66 32 29 3b 0a 20 20 20 20 7d 0a 20  iLeaf2);.    }. 
10950 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10960 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72  zBlob);.  }..  r
10970 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10980 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10990 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
109a0 74 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64  te delta-encoded
109b0 20 73 65 72 69 61 6c 69 7a 65 64 20 6c 69 73 74   serialized list
109c0 73 20 6f 66 20 46 54 53 33 20 0a 2a 2a 20 76 61  s of FTS3 .** va
109d0 72 69 6e 74 73 2e 20 45 61 63 68 20 63 61 6c 6c  rints. Each call
109e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
109f0 6e 20 61 70 70 65 6e 64 73 20 61 20 73 69 6e 67  n appends a sing
10a00 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20 6c  le varint to a l
10a10 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
10a20 6f 69 64 20 66 74 73 33 50 75 74 44 65 6c 74 61  oid fts3PutDelta
10a30 56 61 72 69 6e 74 28 0a 20 20 63 68 61 72 20 2a  Varint(.  char *
10a40 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
10a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
10a60 4f 55 54 3a 20 4f 75 74 70 75 74 20 70 6f 69 6e  OUT: Output poin
10a70 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
10a80 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76 2c 20  _int64 *piPrev, 
10a90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
10aa0 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76 61 6c  UT: Previous val
10ab0 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 69  ue written to li
10ac0 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
10ad0 69 6e 74 36 34 20 69 56 61 6c 20 20 20 20 20 20  int64 iVal      
10ae0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
10af0 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 74   this value to t
10b00 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  he list */.){.  
10b10 61 73 73 65 72 74 28 20 69 56 61 6c 2d 2a 70 69  assert( iVal-*pi
10b20 50 72 65 76 20 3e 20 30 20 7c 7c 20 28 2a 70 69  Prev > 0 || (*pi
10b30 50 72 65 76 3d 3d 30 20 26 26 20 69 56 61 6c 3d  Prev==0 && iVal=
10b40 3d 30 29 20 29 3b 0a 20 20 2a 70 70 20 2b 3d 20  =0) );.  *pp += 
10b50 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
10b60 72 69 6e 74 28 2a 70 70 2c 20 69 56 61 6c 2d 2a  rint(*pp, iVal-*
10b70 70 69 50 72 65 76 29 3b 0a 20 20 2a 70 69 50 72  piPrev);.  *piPr
10b80 65 76 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a  ev = iVal;.}../*
10b90 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
10ba0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
10bb0 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 69 73 20  , *ppPoslist is 
10bc0 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
10bd0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 74 61 72   to the .** star
10be0 74 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 2d  t of a position-
10bf0 6c 69 73 74 2e 20 41 66 74 65 72 20 69 74 20 72  list. After it r
10c00 65 74 75 72 6e 73 2c 20 2a 70 70 50 6f 73 6c 69  eturns, *ppPosli
10c10 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  st points to the
10c20 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 61  .** first byte a
10c30 66 74 65 72 20 74 68 65 20 70 6f 73 69 74 69 6f  fter the positio
10c40 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  n-list..**.** A 
10c50 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73  position list is
10c60 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74 69 6f   list of positio
10c70 6e 73 20 28 64 65 6c 74 61 20 65 6e 63 6f 64 65  ns (delta encode
10c80 64 29 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 66  d) and columns f
10c90 6f 72 20 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  or .** a single 
10ca0 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f 72 64 20  document record 
10cb0 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 20 53  of a doclist.  S
10cc0 6f 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  o, in other word
10cd0 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  s, this.** routi
10ce0 6e 65 20 61 64 76 61 6e 63 65 73 20 2a 70 70 50  ne advances *ppP
10cf0 6f 73 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69  oslist so that i
10d00 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
10d10 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 0a 2a 2a  next docid in.**
10d20 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 6f 72   the doclist, or
10d30 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
10d40 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
10d50 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  of the doclist..
10d60 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20 6e  **.** If pp is n
10d70 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
10d80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10d90 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
10da0 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f  are copied.** to
10db0 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74   *pp. *pp is set
10dc0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10dd0 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
10de0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63   the last byte c
10df0 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  opied.** before 
10e00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10e10 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
10e20 20 76 6f 69 64 20 66 74 73 33 50 6f 73 6c 69 73   void fts3Poslis
10e30 74 43 6f 70 79 28 63 68 61 72 20 2a 2a 70 70 2c  tCopy(char **pp,
10e40 20 63 68 61 72 20 2a 2a 70 70 50 6f 73 6c 69 73   char **ppPoslis
10e50 74 29 7b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  t){.  char *pEnd
10e60 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74 3b 0a 20   = *ppPoslist;. 
10e70 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20   char c = 0;..  
10e80 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 61 20  /* The end of a 
10e90 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73  position list is
10ea0 20 6d 61 72 6b 65 64 20 62 79 20 61 20 7a 65 72   marked by a zer
10eb0 6f 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20  o encoded as an 
10ec0 46 54 53 33 20 0a 20 20 2a 2a 20 76 61 72 69 6e  FTS3 .  ** varin
10ed0 74 2e 20 41 20 73 69 6e 67 6c 65 20 50 4f 53 5f  t. A single POS_
10ee0 45 4e 44 20 28 30 29 20 62 79 74 65 2e 20 45 78  END (0) byte. Ex
10ef0 63 65 70 74 2c 20 69 66 20 74 68 65 20 30 20 62  cept, if the 0 b
10f00 79 74 65 20 69 73 20 70 72 65 63 65 64 65 64 20  yte is preceded 
10f10 62 79 0a 20 20 2a 2a 20 61 20 62 79 74 65 20 77  by.  ** a byte w
10f20 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69 74  ith the 0x80 bit
10f30 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
10f40 20 6e 6f 74 20 61 20 76 61 72 69 6e 74 20 30 2c   not a varint 0,
10f50 20 62 75 74 20 74 68 65 20 74 61 69 6c 0a 20 20   but the tail.  
10f60 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  ** of some other
10f70 2c 20 6d 75 6c 74 69 2d 62 79 74 65 2c 20 76 61  , multi-byte, va
10f80 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  lue..  **.  ** T
10f90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 69  he following whi
10fa0 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65 73 20 70 45  le-loop moves pE
10fb0 6e 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nd to point to t
10fc0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 74 68  he first byte th
10fd0 61 74 20 69 73 20 6e 6f 74 20 0a 20 20 2a 2a 20  at is not .  ** 
10fe0 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 65 63  immediately prec
10ff0 65 64 65 64 20 62 79 20 61 20 62 79 74 65 20 77  eded by a byte w
11000 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69 74  ith the 0x80 bit
11010 20 73 65 74 2e 20 54 68 65 6e 20 69 6e 63 72 65   set. Then incre
11020 6d 65 6e 74 73 0a 20 20 2a 2a 20 70 45 6e 64 20  ments.  ** pEnd 
11030 6f 6e 63 65 20 6d 6f 72 65 20 73 6f 20 74 68 61  once more so tha
11040 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
11050 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
11060 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
11070 65 0a 20 20 2a 2a 20 6c 61 73 74 20 62 79 74 65  e.  ** last byte
11080 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
11090 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 77 68  -list..  */.  wh
110a0 69 6c 65 28 20 2a 70 45 6e 64 20 7c 20 63 20 29  ile( *pEnd | c )
110b0 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64 2b  {.    c = *pEnd+
110c0 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74 65  + & 0x80;.    te
110d0 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26 20  stcase( c!=0 && 
110e0 28 2a 70 45 6e 64 29 3d 3d 30 20 29 3b 0a 20 20  (*pEnd)==0 );.  
110f0 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20 20 2f 2a 20  }.  pEnd++;  /* 
11100 41 64 76 61 6e 63 65 20 70 61 73 74 20 74 68 65  Advance past the
11110 20 50 4f 53 5f 45 4e 44 20 74 65 72 6d 69 6e 61   POS_END termina
11120 74 6f 72 20 62 79 74 65 20 2a 2f 0a 0a 20 20 69  tor byte */..  i
11130 66 28 20 70 70 20 29 7b 0a 20 20 20 20 69 6e 74  f( pp ){.    int
11140 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 20   n = (int)(pEnd 
11150 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20  - *ppPoslist);. 
11160 20 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70     char *p = *pp
11170 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
11180 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a  *ppPoslist, n);.
11190 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20      p += n;.    
111a0 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a  *pp = p;.  }.  *
111b0 70 70 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64  ppPoslist = pEnd
111c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
111d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
111e0 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f 73 6c   called, *ppPosl
111f0 69 73 74 20 69 73 20 61 73 73 75 6d 65 64 20 74  ist is assumed t
11200 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
11210 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 63 6f  ** start of a co
11220 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41 66 74 65 72  lumn-list. After
11230 20 69 74 20 72 65 74 75 72 6e 73 2c 20 2a 70 70   it returns, *pp
11240 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73 20 74  Poslist points t
11250 6f 20 74 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20  o the.** to the 
11260 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f  terminator (POS_
11270 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e  COLUMN or POS_EN
11280 44 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  D) byte of the c
11290 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a  olumn-list..**.*
112a0 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  * A column-list 
112b0 69 73 20 6c 69 73 74 20 6f 66 20 64 65 6c 74 61  is list of delta
112c0 2d 65 6e 63 6f 64 65 64 20 70 6f 73 69 74 69 6f  -encoded positio
112d0 6e 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ns for a single 
112e0 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69 74 68 69 6e  column.** within
112f0 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 75 6d 65   a single docume
11300 6e 74 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c  nt within a docl
11310 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ist..**.** The c
11320 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 74 65  olumn-list is te
11330 72 6d 69 6e 61 74 65 64 20 65 69 74 68 65 72 20  rminated either 
11340 62 79 20 61 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20  by a POS_COLUMN 
11350 76 61 72 69 6e 74 20 28 31 29 20 6f 72 0a 2a 2a  varint (1) or.**
11360 20 61 20 50 4f 53 5f 45 4e 44 20 76 61 72 69 6e   a POS_END varin
11370 74 20 28 30 29 2e 20 20 54 68 69 73 20 72 6f 75  t (0).  This rou
11380 74 69 6e 65 20 6c 65 61 76 65 73 20 2a 70 70 50  tine leaves *ppP
11390 6f 73 6c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  oslist pointing 
113a0 74 6f 0a 2a 2a 20 74 68 65 20 50 4f 53 5f 43 4f  to.** the POS_CO
113b0 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44 20  LUMN or POS_END 
113c0 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
113d0 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e  the column-list.
113e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20  .**.** If pp is 
113f0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
11400 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11410 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 61  he column-list a
11420 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f 20  re copied.** to 
11430 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74 20  *pp. *pp is set 
11440 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
11450 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
11460 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63 6f  the last byte co
11470 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 74  pied.** before t
11480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11490 75 72 6e 73 2e 20 20 54 68 65 20 50 4f 53 5f 43  urns.  The POS_C
114a0 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44  OLUMN or POS_END
114b0 20 74 65 72 6d 69 6e 61 74 6f 72 0a 2a 2a 20 69   terminator.** i
114c0 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 69 6e 74  s not copied int
114d0 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  o *pp..*/.static
114e0 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e   void fts3Column
114f0 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a 2a  listCopy(char **
11500 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f 73  pp, char **ppPos
11510 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a 70  list){.  char *p
11520 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74  End = *ppPoslist
11530 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a  ;.  char c = 0;.
11540 0a 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c  .  /* A column-l
11550 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
11560 64 20 62 79 20 65 69 74 68 65 72 20 61 20 30 78  d by either a 0x
11570 30 31 20 6f 72 20 30 78 30 30 20 62 79 74 65 20  01 or 0x00 byte 
11580 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  that is.  ** not
11590 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
115a0 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20  -byte varint..  
115b0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 30 78 46 45  */.  while( 0xFE
115c0 20 26 20 28 2a 70 45 6e 64 20 7c 20 63 29 20 29   & (*pEnd | c) )
115d0 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64 2b  {.    c = *pEnd+
115e0 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74 65  + & 0x80;.    te
115f0 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26 20  stcase( c!=0 && 
11600 28 28 2a 70 45 6e 64 29 26 30 78 66 65 29 3d 3d  ((*pEnd)&0xfe)==
11610 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0 );.  }.  if( p
11620 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  p ){.    int n =
11630 20 28 69 6e 74 29 28 70 45 6e 64 20 2d 20 2a 70   (int)(pEnd - *p
11640 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 63  pPoslist);.    c
11650 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  har *p = *pp;.  
11660 20 20 6d 65 6d 63 70 79 28 70 2c 20 2a 70 70 50    memcpy(p, *ppP
11670 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a 20 20 20 20  oslist, n);.    
11680 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 2a 70 70 20  p += n;.    *pp 
11690 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 6f  = p;.  }.  *ppPo
116a0 73 6c 69 73 74 20 3d 20 70 45 6e 64 3b 0a 7d 0a  slist = pEnd;.}.
116b0 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 75 73 65  ./*.** Value use
116c0 64 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  d to signify the
116d0 20 65 6e 64 20 6f 66 20 61 6e 20 70 6f 73 69 74   end of an posit
116e0 69 6f 6e 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ion-list. This i
116f0 73 20 73 61 66 65 20 62 65 63 61 75 73 65 0a 2a  s safe because.*
11700 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * it is not poss
11710 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 64  ible to have a d
11720 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 32 5e 33  ocument with 2^3
11730 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a 23 64 65 66  1 terms..*/.#def
11740 69 6e 65 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53  ine POSITION_LIS
11750 54 5f 45 4e 44 20 30 78 37 66 66 66 66 66 66 66  T_END 0x7fffffff
11760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11770 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
11780 20 68 65 6c 70 20 70 61 72 73 65 20 70 6f 73 69   help parse posi
11790 74 69 6f 6e 2d 6c 69 73 74 73 2e 20 57 68 65 6e  tion-lists. When
117a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
117b0 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a 70 70  s.** called, *pp
117c0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 74 68   may point to th
117d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
117e0 65 78 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68  ext varint in th
117f0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
11800 2a 2a 20 62 65 69 6e 67 20 70 61 72 73 65 64 2c  ** being parsed,
11810 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
11820 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20   to 1 byte past 
11830 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
11840 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a 2a 2a 20  osition-list.** 
11850 28 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 2a  (in which case *
11860 2a 70 70 20 77 69 6c 6c 20 62 65 20 61 20 74 65  *pp will be a te
11870 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 50  rminator bytes P
11880 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72 0a 2a 2a  OS_END (0) or.**
11890 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   (1))..**.** If 
118a0 2a 70 70 20 70 6f 69 6e 74 73 20 70 61 73 74 20  *pp points past 
118b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
118c0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d  urrent position-
118d0 6c 69 73 74 2c 20 73 65 74 20 2a 70 69 20 74 6f  list, set *pi to
118e0 20 0a 2a 2a 20 50 4f 53 49 54 49 4f 4e 5f 4c 49   .** POSITION_LI
118f0 53 54 5f 45 4e 44 20 61 6e 64 20 72 65 74 75 72  ST_END and retur
11900 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  n. Otherwise, re
11910 61 64 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  ad the next vari
11920 6e 74 20 66 72 6f 6d 20 2a 70 70 2c 0a 2a 2a 20  nt from *pp,.** 
11930 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 75  increment the cu
11940 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 2a  rrent value of *
11950 70 69 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  pi by the value 
11960 72 65 61 64 2c 20 61 6e 64 20 73 65 74 20 2a 70  read, and set *p
11970 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  p to.** point to
11980 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20   the next value 
11990 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
119a0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63  ..**.** Before c
119b0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
119c0 69 6e 65 20 2a 70 69 20 6d 75 73 74 20 62 65 20  ine *pi must be 
119d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
119e0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
119f0 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 73 69  he previous posi
11a00 74 69 6f 6e 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tion, or zero if
11a10 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
11a20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69  the first positi
11a30 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 70 6f 73  on.** in the pos
11a40 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 20 42 65 63  ition-list.  Bec
11a50 61 75 73 65 20 70 6f 73 69 74 69 6f 6e 73 20 61  ause positions a
11a60 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64  re delta-encoded
11a70 2c 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  , the value.** o
11a80 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  f the previous p
11a90 6f 73 69 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  osition is neede
11aa0 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  d in order to co
11ab0 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
11ac0 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 70  of.** the next p
11ad0 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
11ae0 69 63 20 76 6f 69 64 20 66 74 73 33 52 65 61 64  ic void fts3Read
11af0 4e 65 78 74 50 6f 73 28 0a 20 20 63 68 61 72 20  NextPos(.  char 
11b00 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
11b10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
11b20 55 54 3a 20 50 6f 69 6e 74 65 72 20 69 6e 74 6f  UT: Pointer into
11b30 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 62   position-list b
11b40 75 66 66 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  uffer */.  sqlit
11b50 65 33 5f 69 6e 74 36 34 20 2a 70 69 20 20 20 20  e3_int64 *pi    
11b60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
11b70 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
11b80 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  rom position-lis
11b90 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 2a  t */.){.  if( (*
11ba0 2a 70 70 29 26 30 78 46 45 20 29 7b 0a 20 20 20  *pp)&0xFE ){.   
11bb0 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
11bc0 69 6e 74 28 70 70 2c 20 70 69 29 3b 0a 20 20 20  int(pp, pi);.   
11bd0 20 2a 70 69 20 2d 3d 20 32 3b 0a 20 20 7d 65 6c   *pi -= 2;.  }el
11be0 73 65 7b 0a 20 20 20 20 2a 70 69 20 3d 20 50 4f  se{.    *pi = PO
11bf0 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
11c00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
11c10 20 70 61 72 61 6d 65 74 65 72 20 69 43 6f 6c 20   parameter iCol 
11c20 69 73 20 6e 6f 74 20 30 2c 20 77 72 69 74 65 20  is not 0, write 
11c30 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 28 31  an POS_COLUMN (1
11c40 29 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64 20  ) byte followed 
11c50 62 79 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  by.** the value 
11c60 6f 66 20 69 43 6f 6c 20 65 6e 63 6f 64 65 64 20  of iCol encoded 
11c70 61 73 20 61 20 76 61 72 69 6e 74 20 74 6f 20 2a  as a varint to *
11c80 70 70 2e 20 20 20 54 68 69 73 20 77 69 6c 6c 20  pp.   This will 
11c90 73 74 61 72 74 20 61 20 6e 65 77 0a 2a 2a 20 63  start a new.** c
11ca0 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  olumn list..**.*
11cb0 2a 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  * Set *pp to poi
11cc0 6e 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6a  nt to the byte j
11cd0 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6c 61  ust after the la
11ce0 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
11cf0 62 65 66 6f 72 65 20 0a 2a 2a 20 72 65 74 75 72  before .** retur
11d00 6e 69 6e 67 20 28 64 6f 20 6e 6f 74 20 6d 6f 64  ning (do not mod
11d10 69 66 79 20 69 74 20 69 66 20 69 43 6f 6c 3d 3d  ify it if iCol==
11d20 30 29 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74  0). Return the t
11d30 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
11d40 79 74 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ytes.** written 
11d50 28 30 20 69 66 20 69 43 6f 6c 3d 3d 30 29 2e 0a  (0 if iCol==0)..
11d60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11d70 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28 63  s3PutColNumber(c
11d80 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74 20 69 43  har **pp, int iC
11d90 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ol){.  int n = 0
11da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11db0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11dc0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
11dd0 6e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 20  n */.  if( iCol 
11de0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  ){.    char *p =
11df0 20 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20   *pp;           
11e00 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 70       /* Output p
11e10 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 6e 20  ointer */.    n 
11e20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = 1 + sqlite3Fts
11e30 33 50 75 74 56 61 72 69 6e 74 28 26 70 5b 31 5d  3PutVarint(&p[1]
11e40 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 20  , iCol);.    *p 
11e50 3d 20 30 78 30 31 3b 0a 20 20 20 20 2a 70 70 20  = 0x01;.    *pp 
11e60 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d 0a 20 20 72  = &p[n];.  }.  r
11e70 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
11e80 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 75 6e  * Compute the un
11e90 69 6f 6e 20 6f 66 20 74 77 6f 20 70 6f 73 69 74  ion of two posit
11ea0 69 6f 6e 20 6c 69 73 74 73 2e 20 20 54 68 65 20  ion lists.  The 
11eb0 6f 75 74 70 75 74 20 77 72 69 74 74 65 6e 0a 2a  output written.*
11ec0 2a 20 69 6e 74 6f 20 2a 70 70 20 63 6f 6e 74 61  * into *pp conta
11ed0 69 6e 73 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e  ins all position
11ee0 73 20 6f 66 20 62 6f 74 68 20 2a 70 70 31 20 61  s of both *pp1 a
11ef0 6e 64 20 2a 70 70 32 20 69 6e 20 73 6f 72 74 65  nd *pp2 in sorte
11f00 64 0a 2a 2a 20 6f 72 64 65 72 20 61 6e 64 20 77  d.** order and w
11f10 69 74 68 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ith any duplicat
11f20 65 73 20 72 65 6d 6f 76 65 64 2e 20 20 41 6c 6c  es removed.  All
11f30 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a   pointers are.**
11f40 20 75 70 64 61 74 65 64 20 61 70 70 72 6f 70 72   updated appropr
11f50 69 61 74 65 6c 79 2e 20 20 20 54 68 65 20 63 61  iately.   The ca
11f60 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
11f70 62 6c 65 20 66 6f 72 20 69 6e 73 75 72 69 6e 67  ble for insuring
11f80 0a 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69  .** that there i
11f90 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69  s enough space i
11fa0 6e 20 2a 70 70 20 74 6f 20 68 6f 6c 64 20 74 68  n *pp to hold th
11fb0 65 20 63 6f 6d 70 6c 65 74 65 20 6f 75 74 70 75  e complete outpu
11fc0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11fd0 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72 67   fts3PoslistMerg
11fe0 65 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c 20  e(.  char **pp, 
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
12010 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  uffer */.  char 
12020 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20  **pp1,          
12030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
12040 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f  ft input list */
12050 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20 20  .  char **pp2   
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 20 20 20 2f 2a 20 52 69 67 68 74 20 69 6e 70 75     /* Right inpu
12080 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  t list */.){.  c
12090 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  har *p = *pp;.  
120a0 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b  char *p1 = *pp1;
120b0 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a 70  .  char *p2 = *p
120c0 70 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70  p2;..  while( *p
120d0 31 20 7c 7c 20 2a 70 32 20 29 7b 0a 20 20 20 20  1 || *p2 ){.    
120e0 69 6e 74 20 69 43 6f 6c 31 3b 20 20 20 20 20 20  int iCol1;      
120f0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
12100 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69  t column index i
12110 6e 20 70 70 31 20 2a 2f 0a 20 20 20 20 69 6e 74  n pp1 */.    int
12120 20 69 43 6f 6c 32 3b 20 20 20 20 20 20 20 20 20   iCol2;         
12130 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63  /* The current c
12140 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 70  olumn index in p
12150 70 32 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 2a  p2 */..    if( *
12160 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29  p1==POS_COLUMN )
12170 7b 20 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  { .      fts3Get
12180 56 61 72 69 6e 74 33 32 28 26 70 31 5b 31 5d 2c  Varint32(&p1[1],
12190 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20   &iCol1);.      
121a0 69 66 28 20 69 43 6f 6c 31 3d 3d 30 20 29 20 72  if( iCol1==0 ) r
121b0 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50  eturn FTS_CORRUP
121c0 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 20 20  T_VTAB;.    }.  
121d0 20 20 65 6c 73 65 20 69 66 28 20 2a 70 31 3d 3d    else if( *p1==
121e0 50 4f 53 5f 45 4e 44 20 29 20 69 43 6f 6c 31 20  POS_END ) iCol1 
121f0 3d 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  = POSITION_LIST_
12200 45 4e 44 3b 0a 20 20 20 20 65 6c 73 65 20 69 43  END;.    else iC
12210 6f 6c 31 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ol1 = 0;..    if
12220 28 20 2a 70 32 3d 3d 50 4f 53 5f 43 4f 4c 55 4d  ( *p2==POS_COLUM
12230 4e 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 47  N ){.      fts3G
12240 65 74 56 61 72 69 6e 74 33 32 28 26 70 32 5b 31  etVarint32(&p2[1
12250 5d 2c 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20  ], &iCol2);.    
12260 20 20 69 66 28 20 69 43 6f 6c 32 3d 3d 30 20 29    if( iCol2==0 )
12270 20 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52   return FTS_CORR
12280 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a  UPT_VTAB;.    }.
12290 20 20 20 20 65 6c 73 65 20 69 66 28 20 2a 70 32      else if( *p2
122a0 3d 3d 50 4f 53 5f 45 4e 44 20 29 20 69 43 6f 6c  ==POS_END ) iCol
122b0 32 20 3d 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53  2 = POSITION_LIS
122c0 54 5f 45 4e 44 3b 0a 20 20 20 20 65 6c 73 65 20  T_END;.    else 
122d0 69 43 6f 6c 32 20 3d 20 30 3b 0a 0a 20 20 20 20  iCol2 = 0;..    
122e0 69 66 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c 32  if( iCol1==iCol2
122f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12300 33 5f 69 6e 74 36 34 20 69 31 20 3d 20 30 3b 20  3_int64 i1 = 0; 
12310 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
12320 73 69 74 69 6f 6e 20 66 72 6f 6d 20 70 70 31 20  sition from pp1 
12330 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
12340 5f 69 6e 74 36 34 20 69 32 20 3d 20 30 3b 20 20  _int64 i2 = 0;  
12350 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
12360 69 74 69 6f 6e 20 66 72 6f 6d 20 70 70 32 20 2a  ition from pp2 *
12370 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
12380 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b  int64 iPrev = 0;
12390 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 66  .      int n = f
123a0 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28  ts3PutColNumber(
123b0 26 70 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20 20  &p, iCol1);.    
123c0 20 20 70 31 20 2b 3d 20 6e 3b 0a 20 20 20 20 20    p1 += n;.     
123d0 20 70 32 20 2b 3d 20 6e 3b 0a 0a 20 20 20 20 20   p2 += n;..     
123e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
123f0 74 2c 20 62 6f 74 68 20 70 31 20 61 6e 64 20 70  t, both p1 and p
12400 32 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  2 point to the s
12410 74 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6c  tart of column-l
12420 69 73 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f  ists.      ** fo
12430 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  r the same colum
12440 6e 20 28 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69  n (the column wi
12450 74 68 20 69 6e 64 65 78 20 69 43 6f 6c 31 20 61  th index iCol1 a
12460 6e 64 20 69 43 6f 6c 32 29 2e 0a 20 20 20 20 20  nd iCol2)..     
12470 20 2a 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73   ** A column-lis
12480 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e  t is a list of n
12490 6f 6e 2d 6e 65 67 61 74 69 76 65 20 64 65 6c 74  on-negative delt
124a0 61 2d 65 6e 63 6f 64 65 64 20 76 61 72 69 6e 74  a-encoded varint
124b0 73 2c 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a  s, each .      *
124c0 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  * incremented by
124d0 20 32 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20   2 before being 
124e0 73 74 6f 72 65 64 2e 20 45 61 63 68 20 6c 69 73  stored. Each lis
124f0 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20  t is terminated 
12500 62 79 20 61 0a 20 20 20 20 20 20 2a 2a 20 50 4f  by a.      ** PO
12510 53 5f 45 4e 44 20 28 30 29 20 6f 72 20 50 4f 53  S_END (0) or POS
12520 5f 43 4f 4c 55 4d 4e 20 28 31 29 2e 20 54 68 65  _COLUMN (1). The
12530 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
12540 20 6d 65 72 67 65 73 20 74 68 65 20 74 77 6f 20   merges the two 
12550 6c 69 73 74 73 0a 20 20 20 20 20 20 2a 2a 20 61  lists.      ** a
12560 6e 64 20 77 72 69 74 65 73 20 74 68 65 20 72 65  nd writes the re
12570 73 75 6c 74 73 20 74 6f 20 62 75 66 66 65 72 20  sults to buffer 
12580 70 2e 20 70 20 69 73 20 6c 65 66 74 20 70 6f 69  p. p is left poi
12590 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 62 79 74  nting to the byt
125a0 65 0a 20 20 20 20 20 20 2a 2a 20 61 66 74 65 72  e.      ** after
125b0 20 74 68 65 20 6c 69 73 74 20 77 72 69 74 74 65   the list writte
125c0 6e 2e 20 4e 6f 20 74 65 72 6d 69 6e 61 74 6f 72  n. No terminator
125d0 20 28 50 4f 53 5f 45 4e 44 20 6f 72 20 50 4f 53   (POS_END or POS
125e0 5f 43 4f 4c 55 4d 4e 29 20 69 73 0a 20 20 20 20  _COLUMN) is.    
125f0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
12600 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20  the output..    
12610 20 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 33 47    */.      fts3G
12620 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70  etDeltaVarint(&p
12630 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 20 20 66  1, &i1);.      f
12640 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
12650 74 28 26 70 32 2c 20 26 69 32 29 3b 0a 20 20 20  t(&p2, &i2);.   
12660 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
12670 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
12680 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20 28  nt(&p, &iPrev, (
12690 69 31 3c 69 32 29 20 3f 20 69 31 20 3a 20 69 32  i1<i2) ? i1 : i2
126a0 29 3b 20 0a 20 20 20 20 20 20 20 20 69 50 72 65  ); .        iPre
126b0 76 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  v -= 2;.        
126c0 69 66 28 20 69 31 3d 3d 69 32 20 29 7b 0a 20 20  if( i1==i2 ){.  
126d0 20 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64          fts3Read
126e0 4e 65 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31  NextPos(&p1, &i1
126f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
12700 33 52 65 61 64 4e 65 78 74 50 6f 73 28 26 70 32  3ReadNextPos(&p2
12710 2c 20 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  , &i2);.        
12720 7d 65 6c 73 65 20 69 66 28 20 69 31 3c 69 32 20  }else if( i1<i2 
12730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
12740 33 52 65 61 64 4e 65 78 74 50 6f 73 28 26 70 31  3ReadNextPos(&p1
12750 2c 20 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  , &i1);.        
12760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12770 20 66 74 73 33 52 65 61 64 4e 65 78 74 50 6f 73   fts3ReadNextPos
12780 28 26 70 32 2c 20 26 69 32 29 3b 0a 20 20 20 20  (&p2, &i2);.    
12790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 77 68 69      }.      }whi
127a0 6c 65 28 20 69 31 21 3d 50 4f 53 49 54 49 4f 4e  le( i1!=POSITION
127b0 5f 4c 49 53 54 5f 45 4e 44 20 7c 7c 20 69 32 21  _LIST_END || i2!
127c0 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45  =POSITION_LIST_E
127d0 4e 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ND );.    }else 
127e0 69 66 28 20 69 43 6f 6c 31 3c 69 43 6f 6c 32 20  if( iCol1<iCol2 
127f0 29 7b 0a 20 20 20 20 20 20 70 31 20 2b 3d 20 66  ){.      p1 += f
12800 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28  ts3PutColNumber(
12810 26 70 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20 20  &p, iCol1);.    
12820 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74    fts3Columnlist
12830 43 6f 70 79 28 26 70 2c 20 26 70 31 29 3b 0a 20  Copy(&p, &p1);. 
12840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12850 70 32 20 2b 3d 20 66 74 73 33 50 75 74 43 6f 6c  p2 += fts3PutCol
12860 4e 75 6d 62 65 72 28 26 70 2c 20 69 43 6f 6c 32  Number(&p, iCol2
12870 29 3b 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c  );.      fts3Col
12880 75 6d 6e 6c 69 73 74 43 6f 70 79 28 26 70 2c 20  umnlistCopy(&p, 
12890 26 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &p2);.    }.  }.
128a0 0a 20 20 2a 70 2b 2b 20 3d 20 50 4f 53 5f 45 4e  .  *p++ = POS_EN
128b0 44 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20  D;.  *pp = p;.  
128c0 2a 70 70 31 20 3d 20 70 31 20 2b 20 31 3b 0a 20  *pp1 = p1 + 1;. 
128d0 20 2a 70 70 32 20 3d 20 70 32 20 2b 20 31 3b 0a   *pp2 = p2 + 1;.
128e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
128f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
12900 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12910 65 64 20 74 6f 20 6d 65 72 67 65 20 74 77 6f 20  ed to merge two 
12920 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 69  position lists i
12930 6e 74 6f 20 6f 6e 65 2e 20 57 68 65 6e 20 69 74  nto one. When it
12940 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a   is.** called, *
12950 70 70 31 20 61 6e 64 20 2a 70 70 32 20 6d 75 73  pp1 and *pp2 mus
12960 74 20 62 6f 74 68 20 70 6f 69 6e 74 20 74 6f 20  t both point to 
12970 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20  position lists. 
12980 41 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  A position-list 
12990 69 73 0a 2a 2a 20 74 68 65 20 70 61 72 74 20 6f  is.** the part o
129a0 66 20 61 20 64 6f 63 6c 69 73 74 20 74 68 61 74  f a doclist that
129b0 20 66 6f 6c 6c 6f 77 73 20 65 61 63 68 20 64 6f   follows each do
129c0 63 75 6d 65 6e 74 20 69 64 2e 20 46 6f 72 20 65  cument id. For e
129d0 78 61 6d 70 6c 65 2c 20 69 66 20 61 20 72 6f 77  xample, if a row
129e0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 3a 0a 2a 2a  .** contains:.**
129f0 0a 2a 2a 20 20 20 20 20 27 61 20 62 20 63 27 7c  .**     'a b c'|
12a00 27 78 20 79 20 7a 27 7c 27 61 20 62 20 62 20 61  'x y z'|'a b b a
12a10 27 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  '.**.** Then the
12a20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
12a30 6f 72 20 74 68 69 73 20 72 6f 77 20 66 6f 72 20  or this row for 
12a40 74 6f 6b 65 6e 20 27 62 27 20 77 6f 75 6c 64 20  token 'b' would 
12a50 63 6f 6e 73 69 73 74 20 6f 66 3a 0a 2a 2a 0a 2a  consist of:.**.*
12a60 2a 20 20 20 20 20 30 78 30 32 20 30 78 30 31 20  *     0x02 0x01 
12a70 30 78 30 32 20 30 78 30 33 20 30 78 30 33 20 30  0x02 0x03 0x03 0
12a80 78 30 30 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  x00.**.** When t
12a90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
12aa0 75 72 6e 73 2c 20 62 6f 74 68 20 2a 70 70 31 20  urns, both *pp1 
12ab0 61 6e 64 20 2a 70 70 32 20 61 72 65 20 6c 65 66  and *pp2 are lef
12ac0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
12ad0 65 0a 2a 2a 20 62 79 74 65 20 66 6f 6c 6c 6f 77  e.** byte follow
12ae0 69 6e 67 20 74 68 65 20 30 78 30 30 20 74 65 72  ing the 0x00 ter
12af0 6d 69 6e 61 74 6f 72 20 6f 66 20 74 68 65 69 72  minator of their
12b00 20 72 65 73 70 65 63 74 69 76 65 20 70 6f 73 69   respective posi
12b10 74 69 6f 6e 20 6c 69 73 74 73 2e 0a 2a 2a 0a 2a  tion lists..**.*
12b20 2a 20 49 66 20 69 73 53 61 76 65 4c 65 66 74 20  * If isSaveLeft 
12b30 69 73 20 30 2c 20 61 6e 20 65 6e 74 72 79 20 69  is 0, an entry i
12b40 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  s added to the o
12b50 75 74 70 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c  utput position l
12b60 69 73 74 20 66 6f 72 20 0a 2a 2a 20 65 61 63 68  ist for .** each
12b70 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 2a 70 70   position in *pp
12b80 32 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  2 for which ther
12b90 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20  e exists one or 
12ba0 6d 6f 72 65 20 70 6f 73 69 74 69 6f 6e 73 20 69  more positions i
12bb0 6e 0a 2a 2a 20 2a 70 70 31 20 73 6f 20 74 68 61  n.** *pp1 so tha
12bc0 74 20 28 70 6f 73 28 2a 70 70 32 29 3e 70 6f 73  t (pos(*pp2)>pos
12bd0 28 2a 70 70 31 29 20 26 26 20 70 6f 73 28 2a 70  (*pp1) && pos(*p
12be0 70 32 29 2d 70 6f 73 28 2a 70 70 31 29 3c 3d 6e  p2)-pos(*pp1)<=n
12bf0 54 6f 6b 65 6e 29 2e 20 69 2e 65 2e 0a 2a 2a 20  Token). i.e..** 
12c00 77 68 65 6e 20 74 68 65 20 2a 70 70 31 20 74 6f  when the *pp1 to
12c10 6b 65 6e 20 61 70 70 65 61 72 73 20 62 65 66 6f  ken appears befo
12c20 72 65 20 74 68 65 20 2a 70 70 32 20 74 6f 6b 65  re the *pp2 toke
12c30 6e 2c 20 62 75 74 20 6e 6f 74 20 6d 6f 72 65 20  n, but not more 
12c40 74 68 61 6e 20 6e 54 6f 6b 65 6e 0a 2a 2a 20 73  than nToken.** s
12c50 6c 6f 74 73 20 62 65 66 6f 72 65 20 69 74 2e 0a  lots before it..
12c60 2a 2a 0a 2a 2a 20 65 2e 67 2e 20 6e 54 6f 6b 65  **.** e.g. nToke
12c70 6e 3d 3d 31 20 73 65 61 72 63 68 65 73 20 66 6f  n==1 searches fo
12c80 72 20 61 64 6a 61 63 65 6e 74 20 70 6f 73 69 74  r adjacent posit
12c90 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
12ca0 69 6e 74 20 66 74 73 33 50 6f 73 6c 69 73 74 50  int fts3PoslistP
12cb0 68 72 61 73 65 4d 65 72 67 65 28 0a 20 20 63 68  hraseMerge(.  ch
12cc0 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  ar **pp,        
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ce0 20 49 4e 2f 4f 55 54 3a 20 50 72 65 61 6c 6c 6f   IN/OUT: Preallo
12cf0 63 61 74 65 64 20 6f 75 74 70 75 74 20 62 75 66  cated output buf
12d00 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  fer */.  int nTo
12d10 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
12d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
12d30 6d 75 6d 20 64 69 66 66 65 72 65 6e 63 65 20 69  mum difference i
12d40 6e 20 74 6f 6b 65 6e 20 70 6f 73 69 74 69 6f 6e  n token position
12d50 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  s */.  int isSav
12d60 65 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  eLeft,          
12d70 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74         /* Save t
12d80 68 65 20 6c 65 66 74 20 70 6f 73 69 74 69 6f 6e  he left position
12d90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 61 63   */.  int isExac
12da0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
12db0 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 70 31        /* If *pp1
12dc0 20 69 73 20 65 78 61 63 74 6c 79 20 6e 54 6f 6b   is exactly nTok
12dd0 65 6e 73 20 62 65 66 6f 72 65 20 2a 70 70 32 20  ens before *pp2 
12de0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 31 2c  */.  char **pp1,
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
12e10 4c 65 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20  Left input list 
12e20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20  */.  char **pp2 
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
12e50 52 69 67 68 74 20 69 6e 70 75 74 20 6c 69 73 74  Right input list
12e60 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70   */.){.  char *p
12e70 20 3d 20 2a 70 70 3b 0a 20 20 63 68 61 72 20 2a   = *pp;.  char *
12e80 70 31 20 3d 20 2a 70 70 31 3b 0a 20 20 63 68 61  p1 = *pp1;.  cha
12e90 72 20 2a 70 32 20 3d 20 2a 70 70 32 3b 0a 20 20  r *p2 = *pp2;.  
12ea0 69 6e 74 20 69 43 6f 6c 31 20 3d 20 30 3b 0a 20  int iCol1 = 0;. 
12eb0 20 69 6e 74 20 69 43 6f 6c 32 20 3d 20 30 3b 0a   int iCol2 = 0;.
12ec0 0a 20 20 2f 2a 20 4e 65 76 65 72 20 73 65 74 20  .  /* Never set 
12ed0 62 6f 74 68 20 69 73 53 61 76 65 4c 65 66 74 20  both isSaveLeft 
12ee0 61 6e 64 20 69 73 45 78 61 63 74 20 66 6f 72 20  and isExact for 
12ef0 74 68 65 20 73 61 6d 65 20 69 6e 76 6f 63 61 74  the same invocat
12f00 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
12f10 28 20 69 73 53 61 76 65 4c 65 66 74 3d 3d 30 20  ( isSaveLeft==0 
12f20 7c 7c 20 69 73 45 78 61 63 74 3d 3d 30 20 29 3b  || isExact==0 );
12f30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
12f40 20 26 26 20 2a 70 31 21 3d 30 20 26 26 20 2a 70   && *p1!=0 && *p
12f50 32 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 2a 70  2!=0 );.  if( *p
12f60 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 7b  1==POS_COLUMN ){
12f70 20 0a 20 20 20 20 70 31 2b 2b 3b 0a 20 20 20 20   .    p1++;.    
12f80 70 31 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  p1 += fts3GetVar
12f90 69 6e 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31  int32(p1, &iCol1
12fa0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a 70 32  );.  }.  if( *p2
12fb0 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 7b 20  ==POS_COLUMN ){ 
12fc0 0a 20 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 70  .    p2++;.    p
12fd0 32 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  2 += fts3GetVari
12fe0 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c 32 29  nt32(p2, &iCol2)
12ff0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
13000 31 20 29 7b 0a 20 20 20 20 69 66 28 20 69 43 6f  1 ){.    if( iCo
13010 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20 20 20  l1==iCol2 ){.   
13020 20 20 20 63 68 61 72 20 2a 70 53 61 76 65 20 3d     char *pSave =
13030 20 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   p;.      sqlite
13040 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20  3_int64 iPrev = 
13050 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
13060 5f 69 6e 74 36 34 20 69 50 6f 73 31 20 3d 20 30  _int64 iPos1 = 0
13070 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13080 69 6e 74 36 34 20 69 50 6f 73 32 20 3d 20 30 3b  int64 iPos2 = 0;
13090 0a 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ..      if( iCol
130a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 2b  1 ){.        *p+
130b0 2b 20 3d 20 50 4f 53 5f 43 4f 4c 55 4d 4e 3b 0a  + = POS_COLUMN;.
130c0 20 20 20 20 20 20 20 20 70 20 2b 3d 20 73 71 6c          p += sql
130d0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
130e0 74 28 70 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20  t(p, iCol1);.   
130f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 33     }..      fts3
13100 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26  GetDeltaVarint(&
13110 70 31 2c 20 26 69 50 6f 73 31 29 3b 20 69 50 6f  p1, &iPos1); iPo
13120 73 31 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 66  s1 -= 2;.      f
13130 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
13140 74 28 26 70 32 2c 20 26 69 50 6f 73 32 29 3b 20  t(&p2, &iPos2); 
13150 69 50 6f 73 32 20 2d 3d 20 32 3b 0a 20 20 20 20  iPos2 -= 2;.    
13160 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20 7c 7c    if( iPos1<0 ||
13170 20 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61 6b   iPos2<0 ) break
13180 3b 0a 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ;..      while( 
13190 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  1 ){.        if(
131a0 20 69 50 6f 73 32 3d 3d 69 50 6f 73 31 2b 6e 54   iPos2==iPos1+nT
131b0 6f 6b 65 6e 20 0a 20 20 20 20 20 20 20 20 20 7c  oken .         |
131c0 7c 20 28 69 73 45 78 61 63 74 3d 3d 30 20 26 26  | (isExact==0 &&
131d0 20 69 50 6f 73 32 3e 69 50 6f 73 31 20 26 26 20   iPos2>iPos1 && 
131e0 69 50 6f 73 32 3c 3d 69 50 6f 73 31 2b 6e 54 6f  iPos2<=iPos1+nTo
131f0 6b 65 6e 29 20 0a 20 20 20 20 20 20 20 20 29 7b  ken) .        ){
13200 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13210 65 33 5f 69 6e 74 36 34 20 69 53 61 76 65 3b 0a  e3_int64 iSave;.
13220 20 20 20 20 20 20 20 20 20 20 69 53 61 76 65 20            iSave 
13230 3d 20 69 73 53 61 76 65 4c 65 66 74 20 3f 20 69  = isSaveLeft ? i
13240 50 6f 73 31 20 3a 20 69 50 6f 73 32 3b 0a 20 20  Pos1 : iPos2;.  
13250 20 20 20 20 20 20 20 20 66 74 73 33 50 75 74 44          fts3PutD
13260 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c 20 26  eltaVarint(&p, &
13270 69 50 72 65 76 2c 20 69 53 61 76 65 2b 32 29 3b  iPrev, iSave+2);
13280 20 69 50 72 65 76 20 2d 3d 20 32 3b 0a 20 20 20   iPrev -= 2;.   
13290 20 20 20 20 20 20 20 70 53 61 76 65 20 3d 20 30         pSave = 0
132a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
132b0 72 74 28 20 70 20 29 3b 0a 20 20 20 20 20 20 20  rt( p );.       
132c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
132d0 21 69 73 53 61 76 65 4c 65 66 74 20 26 26 20 69  !isSaveLeft && i
132e0 50 6f 73 32 3c 3d 28 69 50 6f 73 31 2b 6e 54 6f  Pos2<=(iPos1+nTo
132f0 6b 65 6e 29 29 20 7c 7c 20 69 50 6f 73 32 3c 3d  ken)) || iPos2<=
13300 69 50 6f 73 31 20 29 7b 0a 20 20 20 20 20 20 20  iPos1 ){.       
13310 20 20 20 69 66 28 20 28 2a 70 32 26 30 78 46 45     if( (*p2&0xFE
13320 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
13330 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74 44          fts3GetD
13340 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c 20  eltaVarint(&p2, 
13350 26 69 50 6f 73 32 29 3b 20 69 50 6f 73 32 20 2d  &iPos2); iPos2 -
13360 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 2;.        }el
13370 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
13380 28 20 28 2a 70 31 26 30 78 46 45 29 3d 3d 30 20  ( (*p1&0xFE)==0 
13390 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
133a0 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56     fts3GetDeltaV
133b0 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50 6f 73  arint(&p1, &iPos
133c0 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32 3b 0a  1); iPos1 -= 2;.
133d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 61  }..      if( pSa
133f0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ve ){.        as
13400 73 65 72 74 28 20 70 70 20 26 26 20 70 20 29 3b  sert( pp && p );
13410 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 53 61  .        p = pSa
13420 76 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ve;.      }..   
13430 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
13440 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a 20  tCopy(0, &p1);. 
13450 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c       fts3Columnl
13460 69 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29 3b  istCopy(0, &p2);
13470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
13480 2a 70 31 26 30 78 46 45 29 3d 3d 30 20 26 26 20  *p1&0xFE)==0 && 
13490 28 2a 70 32 26 30 78 46 45 29 3d 3d 30 20 29 3b  (*p2&0xFE)==0 );
134a0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 70  .      if( 0==*p
134b0 31 20 7c 7c 20 30 3d 3d 2a 70 32 20 29 20 62 72  1 || 0==*p2 ) br
134c0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 31 2b 2b  eak;..      p1++
134d0 3b 0a 20 20 20 20 20 20 70 31 20 2b 3d 20 66 74  ;.      p1 += ft
134e0 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 31  s3GetVarint32(p1
134f0 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20  , &iCol1);.     
13500 20 70 32 2b 2b 3b 0a 20 20 20 20 20 20 70 32 20   p2++;.      p2 
13510 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
13520 33 32 28 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a  32(p2, &iCol2);.
13530 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
13540 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 31  vance pointer p1
13550 20 6f 72 20 70 32 20 28 77 68 69 63 68 65 76 65   or p2 (whicheve
13560 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
13570 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 6f 66 0a   the smaller of.
13580 20 20 20 20 2a 2a 20 69 43 6f 6c 31 20 61 6e 64      ** iCol1 and
13590 20 69 43 6f 6c 32 29 20 73 6f 20 74 68 61 74 20   iCol2) so that 
135a0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 65 69 74  it points to eit
135b0 68 65 72 20 74 68 65 20 30 78 30 30 20 74 68 61  her the 0x00 tha
135c0 74 20 6d 61 72 6b 73 20 74 68 65 0a 20 20 20 20  t marks the.    
135d0 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** end of the po
135e0 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20 6f 72 20  sition list, or 
135f0 74 68 65 20 30 78 30 31 20 74 68 61 74 20 70 72  the 0x01 that pr
13600 65 63 65 64 65 73 20 74 68 65 20 6e 65 78 74 20  ecedes the next 
13610 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 2d 6e  .    ** column-n
13620 75 6d 62 65 72 20 69 6e 20 74 68 65 20 70 6f 73  umber in the pos
13630 69 74 69 6f 6e 20 6c 69 73 74 2e 20 0a 20 20 20  ition list. .   
13640 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
13650 20 69 43 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a   iCol1<iCol2 ){.
13660 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e        fts3Column
13670 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29  listCopy(0, &p1)
13680 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
13690 70 31 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  p1 ) break;.    
136a0 20 20 70 31 2b 2b 3b 0a 20 20 20 20 20 20 70 31    p1++;.      p1
136b0 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e   += fts3GetVarin
136c0 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31 29 3b  t32(p1, &iCol1);
136d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
136e0 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74    fts3Columnlist
136f0 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20  Copy(0, &p2);.  
13700 20 20 20 20 69 66 28 20 30 3d 3d 2a 70 32 20 29      if( 0==*p2 )
13710 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 32   break;.      p2
13720 2b 2b 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20  ++;.      p2 += 
13730 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
13740 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20  p2, &iCol2);.   
13750 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33 50 6f   }.  }..  fts3Po
13760 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 32  slistCopy(0, &p2
13770 29 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69 73 74  );.  fts3Poslist
13780 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a 20 20  Copy(0, &p1);.  
13790 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 2a 70 70  *pp1 = p1;.  *pp
137a0 32 20 3d 20 70 32 3b 0a 20 20 69 66 28 20 2a 70  2 = p2;.  if( *p
137b0 70 3d 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75  p==p ){.    retu
137c0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 2b 2b  rn 0;.  }.  *p++
137d0 20 3d 20 30 78 30 30 3b 0a 20 20 2a 70 70 20 3d   = 0x00;.  *pp =
137e0 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   p;.  return 1;.
137f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
13800 77 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  wo position-list
13810 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
13820 20 74 68 65 20 4e 45 41 52 20 6f 70 65 72 61 74   the NEAR operat
13830 6f 72 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  or. The argument
13840 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
13850 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ts correspond to
13860 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
13870 67 68 74 20 70 68 72 61 73 65 73 20 6f 66 20 61  ght phrases of a
13880 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 2a 2a  n expression .**
13890 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   like:.**.**    
138a0 20 22 70 68 72 61 73 65 20 31 22 20 4e 45 41 52   "phrase 1" NEAR
138b0 20 22 70 68 72 61 73 65 20 6e 75 6d 62 65 72 20   "phrase number 
138c0 32 22 0a 2a 2a 0a 2a 2a 20 50 6f 73 69 74 69 6f  2".**.** Positio
138d0 6e 20 6c 69 73 74 20 2a 70 70 31 20 63 6f 72 72  n list *pp1 corr
138e0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6c  esponds to the l
138f0 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
13900 20 74 68 65 20 4e 45 41 52 20 0a 2a 2a 20 65 78   the NEAR .** ex
13910 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 2a 70 70  pression and *pp
13920 32 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20  2 to the right. 
13930 41 73 20 75 73 75 61 6c 2c 20 74 68 65 20 69 6e  As usual, the in
13940 64 65 78 65 73 20 69 6e 20 74 68 65 20 70 6f 73  dexes in the pos
13950 69 74 69 6f 6e 20 0a 2a 2a 20 6c 69 73 74 73 20  ition .** lists 
13960 61 72 65 20 74 68 65 20 6f 66 66 73 65 74 73 20  are the offsets 
13970 6f 66 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65  of the last toke
13980 6e 20 69 6e 20 65 61 63 68 20 70 68 72 61 73 65  n in each phrase
13990 20 28 74 6f 6b 65 6e 73 20 22 31 22 20 61 6e 64   (tokens "1" and
139a0 20 22 32 22 20 0a 2a 2a 20 69 6e 20 74 68 65 20   "2" .** in the 
139b0 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 29 2e 0a  example above)..
139c0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70 75 74  **.** The output
139d0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2d   position list -
139e0 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70 20   written to *pp 
139f0 2d 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 2a  - is a copy of *
13a00 70 70 32 20 77 69 74 68 20 74 68 6f 73 65 0a 2a  pp2 with those.*
13a10 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 61  * entries that a
13a20 72 65 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  re not sufficien
13a30 74 6c 79 20 4e 45 41 52 20 65 6e 74 72 69 65 73  tly NEAR entries
13a40 20 69 6e 20 2a 70 70 31 20 72 65 6d 6f 76 65 64   in *pp1 removed
13a50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a60 66 74 73 33 50 6f 73 6c 69 73 74 4e 65 61 72 4d  fts3PoslistNearM
13a70 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70  erge(.  char **p
13a80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13a90 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
13aa0 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68  t buffer */.  ch
13ab0 61 72 20 2a 61 54 6d 70 2c 20 20 20 20 20 20 20  ar *aTmp,       
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ad0 20 54 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   Temporary buffe
13ae0 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 6e 74  r space */.  int
13af0 20 6e 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   nRight,        
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b10 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e  Maximum differen
13b20 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69  ce in token posi
13b30 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
13b40 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
13b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13b60 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e 63 65  ximum difference
13b70 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69 74 69   in token positi
13b80 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ons */.  char **
13b90 70 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  pp1,            
13ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
13bb0 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74 20 6c  UT: Left input l
13bc0 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ist */.  char **
13bd0 70 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  pp2             
13be0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
13bf0 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75 74 20  UT: Right input 
13c00 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  list */.){.  cha
13c10 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b 0a 20 20  r *p1 = *pp1;.  
13c20 63 68 61 72 20 2a 70 32 20 3d 20 2a 70 70 32 3b  char *p2 = *pp2;
13c30 0a 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 31 20  ..  char *pTmp1 
13c40 3d 20 61 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a  = aTmp;.  char *
13c50 70 54 6d 70 32 3b 0a 20 20 63 68 61 72 20 2a 61  pTmp2;.  char *a
13c60 54 6d 70 32 3b 0a 20 20 69 6e 74 20 72 65 73 20  Tmp2;.  int res 
13c70 3d 20 31 3b 0a 0a 20 20 66 74 73 33 50 6f 73 6c  = 1;..  fts3Posl
13c80 69 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26  istPhraseMerge(&
13c90 70 54 6d 70 31 2c 20 6e 52 69 67 68 74 2c 20 30  pTmp1, nRight, 0
13ca0 2c 20 30 2c 20 70 70 31 2c 20 70 70 32 29 3b 0a  , 0, pp1, pp2);.
13cb0 20 20 61 54 6d 70 32 20 3d 20 70 54 6d 70 32 20    aTmp2 = pTmp2 
13cc0 3d 20 70 54 6d 70 31 3b 0a 20 20 2a 70 70 31 20  = pTmp1;.  *pp1 
13cd0 3d 20 70 31 3b 0a 20 20 2a 70 70 32 20 3d 20 70  = p1;.  *pp2 = p
13ce0 32 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69 73 74  2;.  fts3Poslist
13cf0 50 68 72 61 73 65 4d 65 72 67 65 28 26 70 54 6d  PhraseMerge(&pTm
13d00 70 32 2c 20 6e 4c 65 66 74 2c 20 31 2c 20 30 2c  p2, nLeft, 1, 0,
13d10 20 70 70 32 2c 20 70 70 31 29 3b 0a 20 20 69 66   pp2, pp1);.  if
13d20 28 20 70 54 6d 70 31 21 3d 61 54 6d 70 20 26 26  ( pTmp1!=aTmp &&
13d30 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20 29 7b   pTmp2!=aTmp2 ){
13d40 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74  .    fts3Poslist
13d50 4d 65 72 67 65 28 70 70 2c 20 26 61 54 6d 70 2c  Merge(pp, &aTmp,
13d60 20 26 61 54 6d 70 32 29 3b 0a 20 20 7d 65 6c 73   &aTmp2);.  }els
13d70 65 20 69 66 28 20 70 54 6d 70 31 21 3d 61 54 6d  e if( pTmp1!=aTm
13d80 70 20 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73  p ){.    fts3Pos
13d90 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26 61 54  listCopy(pp, &aT
13da0 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mp);.  }else if(
13db0 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20 29 7b   pTmp2!=aTmp2 ){
13dc0 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74  .    fts3Poslist
13dd0 43 6f 70 79 28 70 70 2c 20 26 61 54 6d 70 32 29  Copy(pp, &aTmp2)
13de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13df0 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  es = 0;.  }..  r
13e00 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
13e10 20 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65   .** An instance
13e20 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
13e30 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 65 72  n is used to mer
13e40 67 65 20 74 6f 67 65 74 68 65 72 20 74 68 65 20  ge together the 
13e50 28 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20  (potentially.** 
13e60 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f 66 29  large number of)
13e70 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 65 61   doclists for ea
13e80 63 68 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74  ch term that mat
13e90 63 68 65 73 20 61 20 70 72 65 66 69 78 20 71 75  ches a prefix qu
13ea0 65 72 79 2e 0a 2a 2a 20 53 65 65 20 66 75 6e 63  ery..** See func
13eb0 74 69 6f 6e 20 66 74 73 33 54 65 72 6d 53 65 6c  tion fts3TermSel
13ec0 65 63 74 4d 65 72 67 65 28 29 20 66 6f 72 20 64  ectMerge() for d
13ed0 65 74 61 69 6c 73 2e 0a 2a 2f 0a 74 79 70 65 64  etails..*/.typed
13ee0 65 66 20 73 74 72 75 63 74 20 54 65 72 6d 53 65  ef struct TermSe
13ef0 6c 65 63 74 20 54 65 72 6d 53 65 6c 65 63 74 3b  lect TermSelect;
13f00 0a 73 74 72 75 63 74 20 54 65 72 6d 53 65 6c 65  .struct TermSele
13f10 63 74 20 7b 0a 20 20 63 68 61 72 20 2a 61 61 4f  ct {.  char *aaO
13f20 75 74 70 75 74 5b 31 36 5d 3b 20 20 20 20 20 20  utput[16];      
13f30 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63         /* Malloc
13f40 27 64 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  'd output buffer
13f50 73 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 4f 75 74  s */.  int anOut
13f60 70 75 74 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  put[16];        
13f70 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 65         /* Size e
13f80 61 63 68 20 6f 75 74 70 75 74 20 62 75 66 66 65  ach output buffe
13f90 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b  r in bytes */.};
13fa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13fb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
13fc0 20 72 65 61 64 20 61 20 73 69 6e 67 6c 65 20 76   read a single v
13fd0 61 72 69 6e 74 20 66 72 6f 6d 20 61 20 62 75 66  arint from a buf
13fe0 66 65 72 2e 20 50 61 72 61 6d 65 74 65 72 0a 2a  fer. Parameter.*
13ff0 2a 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 31 20  * pEnd points 1 
14000 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
14010 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e  d of the buffer.
14020 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
14030 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
14040 2c 20 69 66 20 2a 70 70 20 70 6f 69 6e 74 73 20  , if *pp points 
14050 74 6f 20 70 45 6e 64 20 6f 72 20 67 72 65 61 74  to pEnd or great
14060 65 72 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 64  er, then the end
14070 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 0a 2a   of the buffer.*
14080 2a 20 68 61 73 20 62 65 65 6e 20 72 65 61 63 68  * has been reach
14090 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
140a0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 30   *pp is set to 0
140b0 20 61 6e 64 20 74 68 65 20 66 75 6e 63 74 69 6f   and the functio
140c0 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
140d0 20 49 66 20 2a 70 70 20 64 6f 65 73 20 6e 6f 74   If *pp does not
140e0 20 70 6f 69 6e 74 20 74 6f 20 6f 72 20 70 61 73   point to or pas
140f0 74 20 70 45 6e 64 2c 20 74 68 65 6e 20 61 20 73  t pEnd, then a s
14100 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 69 73 20  ingle varint is 
14110 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 2a 70 70  read.** from *pp
14120 2e 20 2a 70 70 20 69 73 20 74 68 65 6e 20 73 65  . *pp is then se
14130 74 20 74 6f 20 70 6f 69 6e 74 20 31 20 62 79 74  t to point 1 byt
14140 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
14150 66 20 74 68 65 20 72 65 61 64 20 76 61 72 69 6e  f the read varin
14160 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 44 65 73  t..**.** If bDes
14170 63 49 64 78 20 69 73 20 66 61 6c 73 65 2c 20 74  cIdx is false, t
14180 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 69 73  he value read is
14190 20 61 64 64 65 64 20 74 6f 20 2a 70 56 61 6c 20   added to *pVal 
141a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
141b0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 72  ..** If it is tr
141c0 75 65 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65  ue, the value re
141d0 61 64 20 69 73 20 73 75 62 74 72 61 63 74 65 64  ad is subtracted
141e0 20 66 72 6f 6d 20 2a 70 56 61 6c 20 62 65 66 6f   from *pVal befo
141f0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
14200 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tion returns..*/
14210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
14220 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3GetDeltaVarint3
14230 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 20  (.  char **pp,  
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
14260 6f 69 6e 74 20 74 6f 20 72 65 61 64 20 76 61 72  oint to read var
14270 69 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 63 68  int from */.  ch
14280 61 72 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  ar *pEnd,       
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142a0 20 45 6e 64 20 6f 66 20 62 75 66 66 65 72 20 2a   End of buffer *
142b0 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49 64 78  /.  int bDescIdx
142c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
142d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 64      /* True if d
142e0 6f 63 69 64 73 20 61 72 65 20 64 65 73 63 65 6e  ocids are descen
142f0 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ding */.  sqlite
14300 33 5f 69 6e 74 36 34 20 2a 70 56 61 6c 20 20 20  3_int64 *pVal   
14310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
14320 4f 55 54 3a 20 49 6e 74 65 67 65 72 20 76 61 6c  OUT: Integer val
14330 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a  ue */.){.  if( *
14340 70 70 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  pp>=pEnd ){.    
14350 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  *pp = 0;.  }else
14360 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
14370 74 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70  t64 iVal;.    *p
14380 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  p += sqlite3Fts3
14390 47 65 74 56 61 72 69 6e 74 28 2a 70 70 2c 20 26  GetVarint(*pp, &
143a0 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  iVal);.    if( b
143b0 44 65 73 63 49 64 78 20 29 7b 0a 20 20 20 20 20  DescIdx ){.     
143c0 20 2a 70 56 61 6c 20 2d 3d 20 69 56 61 6c 3b 0a   *pVal -= iVal;.
143d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
143e0 20 2a 70 56 61 6c 20 2b 3d 20 69 56 61 6c 3b 0a   *pVal += iVal;.
143f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14400 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14410 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69 74   is used to writ
14420 65 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e  e a single varin
14430 74 20 74 6f 20 61 20 62 75 66 66 65 72 2e 20 54  t to a buffer. T
14440 68 65 20 76 61 72 69 6e 74 0a 2a 2a 20 69 73 20  he varint.** is 
14450 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70 2e 20  written to *pp. 
14460 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
14470 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
14480 70 6f 69 6e 74 20 31 20 62 79 74 65 20 70 61 73  point 1 byte pas
14490 74 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  t the.** end of 
144a0 74 68 65 20 76 61 6c 75 65 20 77 72 69 74 74 65  the value writte
144b0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 62 46  n..**.** If *pbF
144c0 69 72 73 74 20 69 73 20 7a 65 72 6f 20 77 68 65  irst is zero whe
144d0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
144e0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 76  is called, the v
144f0 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  alue written to.
14500 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20 69 73  ** the buffer is
14510 20 74 68 61 74 20 6f 66 20 70 61 72 61 6d 65 74   that of paramet
14520 65 72 20 69 56 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er iVal. .**.** 
14530 49 66 20 2a 70 62 46 69 72 73 74 20 69 73 20 6e  If *pbFirst is n
14540 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74 68 69  on-zero when thi
14550 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14560 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76  lled, then the v
14570 61 6c 75 65 20 0a 2a 2a 20 77 72 69 74 74 65 6e  alue .** written
14580 20 69 73 20 65 69 74 68 65 72 20 28 69 56 61 6c   is either (iVal
14590 2d 2a 70 69 50 72 65 76 29 20 28 69 66 20 62 44  -*piPrev) (if bD
145a0 65 73 63 49 64 78 20 69 73 20 7a 65 72 6f 29 20  escIdx is zero) 
145b0 6f 72 20 28 2a 70 69 50 72 65 76 2d 69 56 61 6c  or (*piPrev-iVal
145c0 29 0a 2a 2a 20 28 69 66 20 62 44 65 73 63 49 64  ).** (if bDescId
145d0 78 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a  x is non-zero)..
145e0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
145f0 75 72 6e 69 6e 67 2c 20 74 68 69 73 20 66 75 6e  urning, this fun
14600 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 65 74  ction always set
14610 73 20 2a 70 62 46 69 72 73 74 20 74 6f 20 31 20  s *pbFirst to 1 
14620 61 6e 64 20 2a 70 69 50 72 65 76 0a 2a 2a 20 74  and *piPrev.** t
14630 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  o the value of p
14640 61 72 61 6d 65 74 65 72 20 69 56 61 6c 2e 0a 2a  arameter iVal..*
14650 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14660 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74  s3PutDeltaVarint
14670 33 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c 20  3(.  char **pp, 
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
146a0 4f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 2a  Output pointer *
146b0 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49 64 78  /.  int bDescIdx
146c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
146d0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
146e0 64 65 73 63 65 6e 64 69 6e 67 20 64 6f 63 69 64  descending docid
146f0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  s */.  sqlite3_i
14700 6e 74 36 34 20 2a 70 69 50 72 65 76 2c 20 20 20  nt64 *piPrev,   
14710 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
14720 3a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65  : Previous value
14730 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 69 73 74   written to list
14740 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 46 69 72   */.  int *pbFir
14750 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
14760 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
14770 20 54 72 75 65 20 61 66 74 65 72 20 66 69 72 73   True after firs
14780 74 20 69 6e 74 20 77 72 69 74 74 65 6e 20 2a 2f  t int written */
14790 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
147a0 20 69 56 61 6c 20 20 20 20 20 20 20 20 20 20 20   iVal           
147b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 69 73     /* Write this
147c0 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 6c 69   value to the li
147d0 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  st */.){.  sqlit
147e0 65 33 5f 69 6e 74 36 34 20 69 57 72 69 74 65 3b  e3_int64 iWrite;
147f0 0a 20 20 69 66 28 20 62 44 65 73 63 49 64 78 3d  .  if( bDescIdx=
14800 3d 30 20 7c 7c 20 2a 70 62 46 69 72 73 74 3d 3d  =0 || *pbFirst==
14810 30 20 29 7b 0a 20 20 20 20 69 57 72 69 74 65 20  0 ){.    iWrite 
14820 3d 20 69 56 61 6c 20 2d 20 2a 70 69 50 72 65 76  = iVal - *piPrev
14830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
14840 57 72 69 74 65 20 3d 20 2a 70 69 50 72 65 76 20  Write = *piPrev 
14850 2d 20 69 56 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  - iVal;.  }.  as
14860 73 65 72 74 28 20 2a 70 62 46 69 72 73 74 20 7c  sert( *pbFirst |
14870 7c 20 2a 70 69 50 72 65 76 3d 3d 30 20 29 3b 0a  | *piPrev==0 );.
14880 20 20 61 73 73 65 72 74 28 20 2a 70 62 46 69 72    assert( *pbFir
14890 73 74 3d 3d 30 20 7c 7c 20 69 57 72 69 74 65 3e  st==0 || iWrite>
148a0 30 20 29 3b 0a 20 20 2a 70 70 20 2b 3d 20 73 71  0 );.  *pp += sq
148b0 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
148c0 6e 74 28 2a 70 70 2c 20 69 57 72 69 74 65 29 3b  nt(*pp, iWrite);
148d0 0a 20 20 2a 70 69 50 72 65 76 20 3d 20 69 56 61  .  *piPrev = iVa
148e0 6c 3b 0a 20 20 2a 70 62 46 69 72 73 74 20 3d 20  l;.  *pbFirst = 
148f0 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
14900 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
14910 62 79 20 76 61 72 69 6f 75 73 20 66 75 6e 63 74  by various funct
14920 69 6f 6e 73 20 74 68 61 74 20 6d 65 72 67 65 20  ions that merge 
14930 64 6f 63 6c 69 73 74 73 2e 20 54 68 65 20 74 77  doclists. The tw
14940 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 61  o.** arguments a
14950 72 65 20 36 34 2d 62 69 74 20 64 6f 63 69 64 20  re 64-bit docid 
14960 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 76  values. If the v
14970 61 6c 75 65 20 6f 66 20 74 68 65 20 73 74 61 63  alue of the stac
14980 6b 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 62 44  k variable.** bD
14990 65 73 63 44 6f 63 6c 69 73 74 20 69 73 20 30 20  escDoclist is 0 
149a0 77 68 65 6e 20 74 68 69 73 20 6d 61 63 72 6f 20  when this macro 
149b0 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e  is invoked, then
149c0 20 69 74 20 72 65 74 75 72 6e 73 20 28 69 31 2d   it returns (i1-
149d0 69 32 29 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  i2). .** Otherwi
149e0 73 65 2c 20 28 69 32 2d 69 31 29 2e 0a 2a 2a 0a  se, (i2-i1)..**.
149f0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 6d 61  ** Using this ma
14a00 6b 65 73 20 69 74 20 65 61 73 69 65 72 20 74 6f  kes it easier to
14a10 20 77 72 69 74 65 20 63 6f 64 65 20 74 68 61 74   write code that
14a20 20 63 61 6e 20 6d 65 72 67 65 20 64 6f 63 6c 69   can merge docli
14a30 73 74 73 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  sts that are.** 
14a40 73 6f 72 74 65 64 20 69 6e 20 65 69 74 68 65 72  sorted in either
14a50 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65   ascending or de
14a60 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
14a70 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 43 49 44  */.#define DOCID
14a80 5f 43 4d 50 28 69 31 2c 20 69 32 29 20 28 28 62  _CMP(i1, i2) ((b
14a90 44 65 73 63 44 6f 63 6c 69 73 74 3f 2d 31 3a 31  DescDoclist?-1:1
14aa0 29 20 2a 20 28 69 31 2d 69 32 29 29 0a 0a 2f 2a  ) * (i1-i2))../*
14ab0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14ac0 6e 20 64 6f 65 73 20 61 6e 20 22 4f 52 22 20 6d  n does an "OR" m
14ad0 65 72 67 65 20 6f 66 20 74 77 6f 20 64 6f 63 6c  erge of two docl
14ae0 69 73 74 73 20 28 6f 75 74 70 75 74 20 63 6f 6e  ists (output con
14af0 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 70 6f 73  tains all.** pos
14b00 69 74 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 65 64  itions contained
14b10 20 69 6e 20 65 69 74 68 65 72 20 61 72 67 75 6d   in either argum
14b20 65 6e 74 20 64 6f 63 6c 69 73 74 29 2e 20 49 66  ent doclist). If
14b30 20 74 68 65 20 64 6f 63 69 64 73 20 69 6e 20 74   the docids in t
14b40 68 65 20 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 63  he .** input doc
14b50 6c 69 73 74 73 20 61 72 65 20 73 6f 72 74 65 64  lists are sorted
14b60 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
14b70 64 65 72 2c 20 70 61 72 61 6d 65 74 65 72 20 62  der, parameter b
14b80 44 65 73 63 44 6f 63 6c 69 73 74 0a 2a 2a 20 73  DescDoclist.** s
14b90 68 6f 75 6c 64 20 62 65 20 66 61 6c 73 65 2e 20  hould be false. 
14ba0 49 66 20 74 68 65 79 20 61 72 65 20 73 6f 72 74  If they are sort
14bb0 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
14bc0 6f 72 64 65 72 2c 20 69 74 20 73 68 6f 75 6c 64  order, it should
14bd0 20 62 65 0a 2a 2a 20 70 61 73 73 65 64 20 61 20   be.** passed a 
14be0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
14bf0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
14c00 72 20 6f 63 63 75 72 73 2c 20 2a 70 61 4f 75 74  r occurs, *paOut
14c10 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
14c20 20 61 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 6d   at an sqlite3_m
14c30 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72 0a 2a  alloc'd buffer.*
14c40 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
14c50 20 6f 75 74 70 75 74 20 64 6f 63 6c 69 73 74 20   output doclist 
14c60 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
14c70 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
14c80 69 73 20 63 61 73 65 0a 2a 2a 20 2a 70 6e 4f 75  is case.** *pnOu
14c90 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
14ca0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14cb0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 6f  in the output do
14cc0 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  clist..**.** If 
14cd0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14ce0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14cf0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
14d00 64 2e 20 54 68 65 20 6f 75 74 70 75 74 20 76 61  d. The output va
14d10 6c 75 65 73 0a 2a 2a 20 61 72 65 20 75 6e 64 65  lues.** are unde
14d20 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
14d30 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
14d40 74 20 66 74 73 33 44 6f 63 6c 69 73 74 4f 72 4d  t fts3DoclistOrM
14d50 65 72 67 65 28 0a 20 20 69 6e 74 20 62 44 65 73  erge(.  int bDes
14d60 63 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20  cDoclist,       
14d70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
14d80 69 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  if arguments are
14d90 20 64 65 73 63 20 2a 2f 0a 20 20 63 68 61 72 20   desc */.  char 
14da0 2a 61 31 2c 20 69 6e 74 20 6e 31 2c 20 20 20 20  *a1, int n1,    
14db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
14dc0 72 73 74 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20  rst doclist */. 
14dd0 20 63 68 61 72 20 2a 61 32 2c 20 69 6e 74 20 6e   char *a2, int n
14de0 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
14df0 20 2f 2a 20 53 65 63 6f 6e 64 20 64 6f 63 6c 69   /* Second docli
14e00 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  st */.  char **p
14e10 61 4f 75 74 2c 20 69 6e 74 20 2a 70 6e 4f 75 74  aOut, int *pnOut
14e20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
14e30 4d 61 6c 6c 6f 63 27 64 20 64 6f 63 6c 69 73 74  Malloc'd doclist
14e40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14e50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
14e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 31 20  qlite3_int64 i1 
14e70 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
14e80 6e 74 36 34 20 69 32 20 3d 20 30 3b 0a 20 20 73  nt64 i2 = 0;.  s
14e90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
14ea0 65 76 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ev = 0;.  char *
14eb0 70 45 6e 64 31 20 3d 20 26 61 31 5b 6e 31 5d 3b  pEnd1 = &a1[n1];
14ec0 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 32 20 3d  .  char *pEnd2 =
14ed0 20 26 61 32 5b 6e 32 5d 3b 0a 20 20 63 68 61 72   &a2[n2];.  char
14ee0 20 2a 70 31 20 3d 20 61 31 3b 0a 20 20 63 68 61   *p1 = a1;.  cha
14ef0 72 20 2a 70 32 20 3d 20 61 32 3b 0a 20 20 63 68  r *p2 = a2;.  ch
14f00 61 72 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 61  ar *p;.  char *a
14f10 4f 75 74 3b 0a 20 20 69 6e 74 20 62 46 69 72 73  Out;.  int bFirs
14f20 74 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 2a 70 61  tOut = 0;..  *pa
14f30 4f 75 74 20 3d 20 30 3b 0a 20 20 2a 70 6e 4f 75  Out = 0;.  *pnOu
14f40 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  t = 0;..  /* All
14f50 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
14f60 74 68 65 20 6f 75 74 70 75 74 2e 20 42 6f 74 68  the output. Both
14f70 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f   the input and o
14f80 75 74 70 75 74 20 64 6f 63 6c 69 73 74 73 0a 20  utput doclists. 
14f90 20 2a 2a 20 61 72 65 20 64 65 6c 74 61 20 65 6e   ** are delta en
14fa0 63 6f 64 65 64 2e 20 49 66 20 74 68 65 79 20 61  coded. If they a
14fb0 72 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  re in ascending 
14fc0 6f 72 64 65 72 20 28 62 44 65 73 63 44 6f 63 6c  order (bDescDocl
14fd0 69 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68  ist==0),.  ** th
14fe0 65 6e 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  en the first doc
14ff0 69 64 20 69 6e 20 65 61 63 68 20 6c 69 73 74 20  id in each list 
15000 69 73 20 73 69 6d 70 6c 79 20 65 6e 63 6f 64 65  is simply encode
15010 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 20 46  d as a varint. F
15020 6f 72 0a 20 20 2a 2a 20 65 61 63 68 20 73 75 62  or.  ** each sub
15030 73 65 71 75 65 6e 74 20 64 6f 63 69 64 2c 20 74  sequent docid, t
15040 68 65 20 76 61 72 69 6e 74 20 73 74 6f 72 65 64  he varint stored
15050 20 69 73 20 74 68 65 20 64 69 66 66 65 72 65 6e   is the differen
15060 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 0a 20  ce between the. 
15070 20 2a 2a 20 63 75 72 72 65 6e 74 20 61 6e 64 20   ** current and 
15080 70 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 28  previous docid (
15090 61 20 70 6f 73 69 74 69 76 65 20 6e 75 6d 62 65  a positive numbe
150a0 72 20 2d 20 73 69 6e 63 65 20 74 68 65 20 6c 69  r - since the li
150b0 73 74 20 69 73 20 69 6e 0a 20 20 2a 2a 20 61 73  st is in.  ** as
150c0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 29 2e 0a  cending order)..
150d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
150e0 72 73 74 20 64 6f 63 69 64 20 77 72 69 74 74 65  rst docid writte
150f0 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  n to the output 
15100 69 73 20 74 68 65 72 65 66 6f 72 65 20 65 6e 63  is therefore enc
15110 6f 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  oded using the .
15120 20 20 2a 2a 20 73 61 6d 65 20 6e 75 6d 62 65 72    ** same number
15130 20 6f 66 20 62 79 74 65 73 20 61 73 20 69 74 20   of bytes as it 
15140 69 73 20 69 6e 20 77 68 69 63 68 65 76 65 72 20  is in whichever 
15150 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73  of the input lis
15160 74 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  ts it is.  ** re
15170 61 64 20 66 72 6f 6d 2e 20 41 6e 64 20 65 61 63  ad from. And eac
15180 68 20 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63  h subsequent doc
15190 69 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  id read from the
151a0 20 73 61 6d 65 20 69 6e 70 75 74 20 6c 69 73 74   same input list
151b0 20 0a 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 73 20   .  ** consumes 
151c0 65 69 74 68 65 72 20 74 68 65 20 73 61 6d 65 20  either the same 
151d0 6f 72 20 6c 65 73 73 20 62 79 74 65 73 20 61 73  or less bytes as
151e0 20 69 74 20 64 69 64 20 69 6e 20 74 68 65 20 69   it did in the i
151f0 6e 70 75 74 20 28 73 69 6e 63 65 0a 20 20 2a 2a  nput (since.  **
15200 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
15210 62 65 74 77 65 65 6e 20 69 74 20 61 6e 64 20 74  between it and t
15220 68 65 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  he previous valu
15230 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
15240 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70  must.  ** be a p
15250 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 6c 65  ositive value le
15260 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
15270 20 74 6f 20 74 68 65 20 64 65 6c 74 61 20 76 61   to the delta va
15280 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 0a 20  lue read from . 
15290 20 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 6c 69   ** the input li
152a0 73 74 29 2e 20 54 68 65 20 73 61 6d 65 20 61 72  st). The same ar
152b0 67 75 6d 65 6e 74 20 61 70 70 6c 69 65 73 20 74  gument applies t
152c0 6f 20 61 6c 6c 20 62 75 74 20 74 68 65 20 66 69  o all but the fi
152d0 72 73 74 20 64 6f 63 69 64 0a 20 20 2a 2a 20 72  rst docid.  ** r
152e0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 27 6f 74  ead from the 'ot
152f0 68 65 72 27 20 6c 69 73 74 2e 20 41 6e 64 20 74  her' list. And t
15300 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
15310 66 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 20 6c  f all position l
15320 69 73 74 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  ists.  ** that w
15330 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 61 6e  ill be copied an
15340 64 20 6d 65 72 67 65 64 20 66 72 6f 6d 20 74 68  d merged from th
15350 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 6f  e input to the o
15360 75 74 70 75 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  utput..  **.  **
15370 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
15380 20 66 69 72 73 74 20 64 6f 63 69 64 20 63 6f 70   first docid cop
15390 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
153a0 74 20 69 73 20 61 20 6e 65 67 61 74 69 76 65 20  t is a negative 
153b0 6e 75 6d 62 65 72 2c 0a 20 20 2a 2a 20 74 68 65  number,.  ** the
153c0 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  n the encoding o
153d0 66 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  f the first doci
153e0 64 20 66 72 6f 6d 20 74 68 65 20 27 6f 74 68 65  d from the 'othe
153f0 72 27 20 69 6e 70 75 74 20 6c 69 73 74 20 6d 61  r' input list ma
15400 79 0a 20 20 2a 2a 20 62 65 20 6c 61 72 67 65 72  y.  ** be larger
15410 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
15420 68 61 6e 20 69 74 20 77 61 73 20 69 6e 20 74 68  han it was in th
15430 65 20 69 6e 70 75 74 20 28 73 69 6e 63 65 20 74  e input (since t
15440 68 65 20 64 65 6c 74 61 20 76 61 6c 75 65 0a 20  he delta value. 
15450 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 6c 61 72   ** may be a lar
15460 67 65 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74  ger positive int
15470 65 67 65 72 20 74 68 61 6e 20 74 68 65 20 61 63  eger than the ac
15480 74 75 61 6c 20 64 6f 63 69 64 29 2e 0a 20 20 2a  tual docid)..  *
15490 2a 0a 20 20 2a 2a 20 54 68 65 20 73 70 61 63 65  *.  ** The space
154a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
154b0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  re the output is
154c0 20 74 68 65 72 65 66 6f 72 65 20 74 68 65 20 73   therefore the s
154d0 75 6d 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  um of the.  ** s
154e0 69 7a 65 73 20 6f 66 20 74 68 65 20 74 77 6f 20  izes of the two 
154f0 69 6e 70 75 74 73 2c 20 70 6c 75 73 20 65 6e 6f  inputs, plus eno
15500 75 67 68 20 73 70 61 63 65 20 66 6f 72 20 65 78  ugh space for ex
15510 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
15520 20 69 6e 70 75 74 0a 20 20 2a 2a 20 64 6f 63 69   input.  ** doci
15530 64 73 20 74 6f 20 67 72 6f 77 2e 20 0a 20 20 2a  ds to grow. .  *
15540 2a 0a 20 20 2a 2a 20 41 20 73 79 6d 65 74 72 69  *.  ** A symetri
15550 63 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62  c argument may b
15560 65 20 6d 61 64 65 20 69 66 20 74 68 65 20 64 6f  e made if the do
15570 63 6c 69 73 74 73 20 61 72 65 20 69 6e 20 64 65  clists are in de
15580 73 63 65 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 6f  scending .  ** o
15590 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 4f 75  rder..  */.  aOu
155a0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
155b0 6f 63 36 34 28 28 69 36 34 29 6e 31 2b 6e 32 2b  oc64((i64)n1+n2+
155c0 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2d  FTS3_VARINT_MAX-
155d0 31 2b 46 54 53 33 5f 42 55 46 46 45 52 5f 50 41  1+FTS3_BUFFER_PA
155e0 44 44 49 4e 47 29 3b 0a 20 20 69 66 28 20 21 61  DDING);.  if( !a
155f0 4f 75 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Out ) return SQL
15600 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 70 20  ITE_NOMEM;..  p 
15610 3d 20 61 4f 75 74 3b 0a 20 20 66 74 73 33 47 65  = aOut;.  fts3Ge
15620 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70  tDeltaVarint3(&p
15630 31 2c 20 70 45 6e 64 31 2c 20 30 2c 20 26 69 31  1, pEnd1, 0, &i1
15640 29 3b 0a 20 20 66 74 73 33 47 65 74 44 65 6c 74  );.  fts3GetDelt
15650 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70 45  aVarint3(&p2, pE
15660 6e 64 32 2c 20 30 2c 20 26 69 32 29 3b 0a 20 20  nd2, 0, &i2);.  
15670 77 68 69 6c 65 28 20 70 31 20 7c 7c 20 70 32 20  while( p1 || p2 
15680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
15690 6e 74 36 34 20 69 44 69 66 66 20 3d 20 44 4f 43  nt64 iDiff = DOC
156a0 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29 3b 0a  ID_CMP(i1, i2);.
156b0 0a 20 20 20 20 69 66 28 20 70 32 20 26 26 20 70  .    if( p2 && p
156c0 31 20 26 26 20 69 44 69 66 66 3d 3d 30 20 29 7b  1 && iDiff==0 ){
156d0 0a 20 20 20 20 20 20 66 74 73 33 50 75 74 44 65  .      fts3PutDe
156e0 6c 74 61 56 61 72 69 6e 74 33 28 26 70 2c 20 62  ltaVarint3(&p, b
156f0 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 50  DescDoclist, &iP
15700 72 65 76 2c 20 26 62 46 69 72 73 74 4f 75 74 2c  rev, &bFirstOut,
15710 20 69 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   i1);.      rc =
15720 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72 67   fts3PoslistMerg
15730 65 28 26 70 2c 20 26 70 31 2c 20 26 70 32 29 3b  e(&p, &p1, &p2);
15740 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
15750 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73  break;.      fts
15760 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3GetDeltaVarint3
15770 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 62 44 65  (&p1, pEnd1, bDe
15780 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b  scDoclist, &i1);
15790 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65  .      fts3GetDe
157a0 6c 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20  ltaVarint3(&p2, 
157b0 70 45 6e 64 32 2c 20 62 44 65 73 63 44 6f 63 6c  pEnd2, bDescDocl
157c0 69 73 74 2c 20 26 69 32 29 3b 0a 20 20 20 20 7d  ist, &i2);.    }
157d0 65 6c 73 65 20 69 66 28 20 21 70 32 20 7c 7c 20  else if( !p2 || 
157e0 28 70 31 20 26 26 20 69 44 69 66 66 3c 30 29 20  (p1 && iDiff<0) 
157f0 29 7b 0a 20 20 20 20 20 20 66 74 73 33 50 75 74  ){.      fts3Put
15800 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 2c  DeltaVarint3(&p,
15810 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26   bDescDoclist, &
15820 69 50 72 65 76 2c 20 26 62 46 69 72 73 74 4f 75  iPrev, &bFirstOu
15830 74 2c 20 69 31 29 3b 0a 20 20 20 20 20 20 66 74  t, i1);.      ft
15840 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 26 70  s3PoslistCopy(&p
15850 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 66 74  , &p1);.      ft
15860 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
15870 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 62 44  3(&p1, pEnd1, bD
15880 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 31 29  escDoclist, &i1)
15890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
158a0 20 20 20 66 74 73 33 50 75 74 44 65 6c 74 61 56     fts3PutDeltaV
158b0 61 72 69 6e 74 33 28 26 70 2c 20 62 44 65 73 63  arint3(&p, bDesc
158c0 44 6f 63 6c 69 73 74 2c 20 26 69 50 72 65 76 2c  Doclist, &iPrev,
158d0 20 26 62 46 69 72 73 74 4f 75 74 2c 20 69 32 29   &bFirstOut, i2)
158e0 3b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  ;.      fts3Posl
158f0 69 73 74 43 6f 70 79 28 26 70 2c 20 26 70 32 29  istCopy(&p, &p2)
15900 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44  ;.      fts3GetD
15910 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c  eltaVarint3(&p2,
15920 20 70 45 6e 64 32 2c 20 62 44 65 73 63 44 6f 63   pEnd2, bDescDoc
15930 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20 20 20 20  list, &i2);.    
15940 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
15950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15960 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
15970 4f 75 74 29 3b 0a 20 20 20 20 70 20 3d 20 61 4f  Out);.    p = aO
15980 75 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ut = 0;.  }else{
15990 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
159a0 61 4f 75 74 29 3c 3d 6e 31 2b 6e 32 2b 46 54 53  aOut)<=n1+n2+FTS
159b0 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2d 31 20 29  3_VARINT_MAX-1 )
159c0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4f  ;.    memset(&aO
159d0 75 74 5b 28 70 2d 61 4f 75 74 29 5d 2c 20 30 2c  ut[(p-aOut)], 0,
159e0 20 46 54 53 33 5f 42 55 46 46 45 52 5f 50 41 44   FTS3_BUFFER_PAD
159f0 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 2a 70 61  DING);.  }.  *pa
15a00 4f 75 74 20 3d 20 61 4f 75 74 3b 0a 20 20 2a 70  Out = aOut;.  *p
15a10 6e 4f 75 74 20 3d 20 28 69 6e 74 29 28 70 2d 61  nOut = (int)(p-a
15a20 4f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Out);.  return r
15a30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
15a40 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 61   function does a
15a50 20 22 70 68 72 61 73 65 22 20 6d 65 72 67 65 20   "phrase" merge 
15a60 6f 66 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 2e  of two doclists.
15a70 20 49 6e 20 61 20 70 68 72 61 73 65 20 6d 65 72   In a phrase mer
15a80 67 65 2c 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75  ge,.** the outpu
15a90 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70  t contains a cop
15aa0 79 20 6f 66 20 65 61 63 68 20 70 6f 73 69 74 69  y of each positi
15ab0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 72 69 67 68  on from the righ
15ac0 74 2d 68 61 6e 64 20 69 6e 70 75 74 0a 2a 2a 20  t-hand input.** 
15ad0 64 6f 63 6c 69 73 74 20 66 6f 72 20 77 68 69 63  doclist for whic
15ae0 68 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 73  h there is a pos
15af0 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c 65 66  ition in the lef
15b00 74 2d 68 61 6e 64 20 69 6e 70 75 74 20 64 6f 63  t-hand input doc
15b10 6c 69 73 74 0a 2a 2a 20 65 78 61 63 74 6c 79 20  list.** exactly 
15b20 6e 44 69 73 74 20 74 6f 6b 65 6e 73 20 62 65 66  nDist tokens bef
15b30 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ore it..**.** If
15b40 20 74 68 65 20 64 6f 63 69 64 73 20 69 6e 20 74   the docids in t
15b50 68 65 20 69 6e 70 75 74 20 64 6f 63 6c 69 73 74  he input doclist
15b60 73 20 61 72 65 20 73 6f 72 74 65 64 20 69 6e 20  s are sorted in 
15b70 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c  ascending order,
15b80 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 62 44  .** parameter bD
15b90 65 73 63 44 6f 63 6c 69 73 74 20 73 68 6f 75 6c  escDoclist shoul
15ba0 64 20 62 65 20 66 61 6c 73 65 2e 20 49 66 20 74  d be false. If t
15bb0 68 65 79 20 61 72 65 20 73 6f 72 74 65 64 20 69  hey are sorted i
15bc0 6e 20 61 73 63 65 6e 64 69 6e 67 20 0a 2a 2a 20  n ascending .** 
15bd0 6f 72 64 65 72 2c 20 69 74 20 73 68 6f 75 6c 64  order, it should
15be0 20 62 65 20 70 61 73 73 65 64 20 61 20 6e 6f 6e   be passed a non
15bf0 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  -zero value..**.
15c00 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  ** The right-han
15c10 64 20 69 6e 70 75 74 20 64 6f 63 6c 69 73 74 20  d input doclist 
15c20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  is overwritten b
15c30 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
15c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15c50 74 73 33 44 6f 63 6c 69 73 74 50 68 72 61 73 65  ts3DoclistPhrase
15c60 4d 65 72 67 65 28 0a 20 20 69 6e 74 20 62 44 65  Merge(.  int bDe
15c70 73 63 44 6f 63 6c 69 73 74 2c 20 20 20 20 20 20  scDoclist,      
15c80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
15c90 20 69 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72   if arguments ar
15ca0 65 20 64 65 73 63 20 2a 2f 0a 20 20 69 6e 74 20  e desc */.  int 
15cb0 6e 44 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  nDist,          
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
15cd0 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 6c 65 66  istance from lef
15ce0 74 20 74 6f 20 72 69 67 68 74 20 28 31 3d 61 64  t to right (1=ad
15cf0 6a 61 63 65 6e 74 29 20 2a 2f 0a 20 20 63 68 61  jacent) */.  cha
15d00 72 20 2a 61 4c 65 66 74 2c 20 69 6e 74 20 6e 4c  r *aLeft, int nL
15d10 65 66 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  eft,         /* 
15d20 4c 65 66 74 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  Left doclist */.
15d30 20 20 63 68 61 72 20 2a 2a 70 61 52 69 67 68 74    char **paRight
15d40 2c 20 69 6e 74 20 2a 70 6e 52 69 67 68 74 20 20  , int *pnRight  
15d50 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 67    /* IN/OUT: Rig
15d60 68 74 2f 6f 75 74 70 75 74 20 64 6f 63 6c 69 73  ht/output doclis
15d70 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
15d80 33 5f 69 6e 74 36 34 20 69 31 20 3d 20 30 3b 0a  3_int64 i1 = 0;.
15d90 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
15da0 69 32 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i2 = 0;.  sqlite
15db0 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20  3_int64 iPrev = 
15dc0 30 3b 0a 20 20 63 68 61 72 20 2a 61 52 69 67 68  0;.  char *aRigh
15dd0 74 20 3d 20 2a 70 61 52 69 67 68 74 3b 0a 20 20  t = *paRight;.  
15de0 63 68 61 72 20 2a 70 45 6e 64 31 20 3d 20 26 61  char *pEnd1 = &a
15df0 4c 65 66 74 5b 6e 4c 65 66 74 5d 3b 0a 20 20 63  Left[nLeft];.  c
15e00 68 61 72 20 2a 70 45 6e 64 32 20 3d 20 26 61 52  har *pEnd2 = &aR
15e10 69 67 68 74 5b 2a 70 6e 52 69 67 68 74 5d 3b 0a  ight[*pnRight];.
15e20 20 20 63 68 61 72 20 2a 70 31 20 3d 20 61 4c 65    char *p1 = aLe
15e30 66 74 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d  ft;.  char *p2 =
15e40 20 61 52 69 67 68 74 3b 0a 20 20 63 68 61 72 20   aRight;.  char 
15e50 2a 70 3b 0a 20 20 69 6e 74 20 62 46 69 72 73 74  *p;.  int bFirst
15e60 4f 75 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Out = 0;.  char 
15e70 2a 61 4f 75 74 3b 0a 0a 20 20 61 73 73 65 72 74  *aOut;..  assert
15e80 28 20 6e 44 69 73 74 3e 30 20 29 3b 0a 20 20 69  ( nDist>0 );.  i
15e90 66 28 20 62 44 65 73 63 44 6f 63 6c 69 73 74 20  f( bDescDoclist 
15ea0 29 7b 0a 20 20 20 20 61 4f 75 74 20 3d 20 73 71  ){.    aOut = sq
15eb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 28  lite3_malloc64((
15ec0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2a 70  sqlite3_int64)*p
15ed0 6e 52 69 67 68 74 20 2b 20 46 54 53 33 5f 56 41  nRight + FTS3_VA
15ee0 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 69  RINT_MAX);.    i
15ef0 66 28 20 61 4f 75 74 3d 3d 30 20 29 20 72 65 74  f( aOut==0 ) ret
15f00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15f10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15f20 4f 75 74 20 3d 20 61 52 69 67 68 74 3b 0a 20 20  Out = aRight;.  
15f30 7d 0a 20 20 70 20 3d 20 61 4f 75 74 3b 0a 0a 20  }.  p = aOut;.. 
15f40 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
15f50 69 6e 74 33 28 26 70 31 2c 20 70 45 6e 64 31 2c  int3(&p1, pEnd1,
15f60 20 30 2c 20 26 69 31 29 3b 0a 20 20 66 74 73 33   0, &i1);.  fts3
15f70 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28  GetDeltaVarint3(
15f80 26 70 32 2c 20 70 45 6e 64 32 2c 20 30 2c 20 26  &p2, pEnd2, 0, &
15f90 69 32 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70  i2);..  while( p
15fa0 31 20 26 26 20 70 32 20 29 7b 0a 20 20 20 20 73  1 && p2 ){.    s
15fb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 69  qlite3_int64 iDi
15fc0 66 66 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28 69  ff = DOCID_CMP(i
15fd0 31 2c 20 69 32 29 3b 0a 20 20 20 20 69 66 28 20  1, i2);.    if( 
15fe0 69 44 69 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  iDiff==0 ){.    
15ff0 20 20 63 68 61 72 20 2a 70 53 61 76 65 20 3d 20    char *pSave = 
16000 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
16010 5f 69 6e 74 36 34 20 69 50 72 65 76 53 61 76 65  _int64 iPrevSave
16020 20 3d 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20   = iPrev;.      
16030 69 6e 74 20 62 46 69 72 73 74 4f 75 74 53 61 76  int bFirstOutSav
16040 65 20 3d 20 62 46 69 72 73 74 4f 75 74 3b 0a 0a  e = bFirstOut;..
16050 20 20 20 20 20 20 66 74 73 33 50 75 74 44 65 6c        fts3PutDel
16060 74 61 56 61 72 69 6e 74 33 28 26 70 2c 20 62 44  taVarint3(&p, bD
16070 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 50 72  escDoclist, &iPr
16080 65 76 2c 20 26 62 46 69 72 73 74 4f 75 74 2c 20  ev, &bFirstOut, 
16090 69 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  i1);.      if( 0
160a0 3d 3d 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72  ==fts3PoslistPhr
160b0 61 73 65 4d 65 72 67 65 28 26 70 2c 20 6e 44 69  aseMerge(&p, nDi
160c0 73 74 2c 20 30 2c 20 31 2c 20 26 70 31 2c 20 26  st, 0, 1, &p1, &
160d0 70 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  p2) ){.        p
160e0 20 3d 20 70 53 61 76 65 3b 0a 20 20 20 20 20 20   = pSave;.      
160f0 20 20 69 50 72 65 76 20 3d 20 69 50 72 65 76 53    iPrev = iPrevS
16100 61 76 65 3b 0a 20 20 20 20 20 20 20 20 62 46 69  ave;.        bFi
16110 72 73 74 4f 75 74 20 3d 20 62 46 69 72 73 74 4f  rstOut = bFirstO
16120 75 74 53 61 76 65 3b 0a 20 20 20 20 20 20 7d 0a  utSave;.      }.
16130 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
16140 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20 70  taVarint3(&p1, p
16150 45 6e 64 31 2c 20 62 44 65 73 63 44 6f 63 6c 69  End1, bDescDocli
16160 73 74 2c 20 26 69 31 29 3b 0a 20 20 20 20 20 20  st, &i1);.      
16170 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
16180 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32 2c 20  nt3(&p2, pEnd2, 
16190 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69  bDescDoclist, &i
161a0 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  2);.    }else if
161b0 28 20 69 44 69 66 66 3c 30 20 29 7b 0a 20 20 20  ( iDiff<0 ){.   
161c0 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f     fts3PoslistCo
161d0 70 79 28 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  py(0, &p1);.    
161e0 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
161f0 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e 64 31  rint3(&p1, pEnd1
16200 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20  , bDescDoclist, 
16210 26 69 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  &i1);.    }else{
16220 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69  .      fts3Posli
16230 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a  stCopy(0, &p2);.
16240 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c        fts3GetDel
16250 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70  taVarint3(&p2, p
16260 45 6e 64 32 2c 20 62 44 65 73 63 44 6f 63 6c 69  End2, bDescDocli
16270 73 74 2c 20 26 69 32 29 3b 0a 20 20 20 20 7d 0a  st, &i2);.    }.
16280 20 20 7d 0a 0a 20 20 2a 70 6e 52 69 67 68 74 20    }..  *pnRight 
16290 3d 20 28 69 6e 74 29 28 70 20 2d 20 61 4f 75 74  = (int)(p - aOut
162a0 29 3b 0a 20 20 69 66 28 20 62 44 65 73 63 44 6f  );.  if( bDescDo
162b0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  clist ){.    sql
162c0 69 74 65 33 5f 66 72 65 65 28 61 52 69 67 68 74  ite3_free(aRight
162d0 29 3b 0a 20 20 20 20 2a 70 61 52 69 67 68 74 20  );.    *paRight 
162e0 3d 20 61 4f 75 74 3b 0a 20 20 7d 0a 0a 20 20 72  = aOut;.  }..  r
162f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
16310 6e 74 20 70 4c 69 73 74 20 70 6f 69 6e 74 73 20  nt pList points 
16320 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  to a position li
16330 73 74 20 6e 4c 69 73 74 20 62 79 74 65 73 20 69  st nList bytes i
16340 6e 20 73 69 7a 65 2e 20 54 68 69 73 0a 2a 2a 20  n size. This.** 
16350 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
16360 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 6f  to see if the po
16370 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
16380 61 69 6e 73 20 61 6e 79 20 65 6e 74 72 69 65 73  ains any entries
16390 20 66 6f 72 0a 2a 2a 20 61 20 74 6f 6b 65 6e 20   for.** a token 
163a0 69 6e 20 70 6f 73 69 74 69 6f 6e 20 30 20 28 6f  in position 0 (o
163b0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 29 2e 20 49  f any column). I
163c0 66 20 73 6f 2c 20 69 74 20 77 72 69 74 65 73 20  f so, it writes 
163d0 61 72 67 75 6d 65 6e 74 20 69 44 65 6c 74 61 0a  argument iDelta.
163e0 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ** to the output
163f0 20 62 75 66 66 65 72 20 70 4f 75 74 2c 20 66 6f   buffer pOut, fo
16400 6c 6c 6f 77 65 64 20 62 79 20 61 20 70 6f 73 69  llowed by a posi
16410 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 73 69 73  tion list consis
16420 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 6f 66 20  ting only.** of 
16430 74 68 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  the entries from
16440 20 70 4c 69 73 74 20 61 74 20 70 6f 73 69 74 69   pList at positi
16450 6f 6e 20 30 2c 20 61 6e 64 20 74 65 72 6d 69 6e  on 0, and termin
16460 61 74 65 64 20 62 79 20 61 6e 20 30 78 30 30 20  ated by an 0x00 
16470 62 79 74 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  byte..** The val
16480 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
16490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
164a0 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 4f  es written to pO
164b0 75 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a  ut (if any)..*/.
164c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 46  int sqlite3Fts3F
164d0 69 72 73 74 46 69 6c 74 65 72 28 0a 20 20 73 71  irstFilter(.  sq
164e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
164f0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta,           /*
16500 20 56 61 72 69 6e 74 20 74 68 61 74 20 6d 61 79   Varint that may
16510 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 70   be written to p
16520 4f 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  Out */.  char *p
16530 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
16540 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
16550 74 69 6f 6e 20 6c 69 73 74 20 28 6e 6f 20 30 78  tion list (no 0x
16560 30 30 20 74 65 72 6d 29 20 2a 2f 0a 20 20 69 6e  00 term) */.  in
16570 74 20 6e 4c 69 73 74 2c 20 20 20 20 20 20 20 20  t nList,        
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16590 20 53 69 7a 65 20 6f 66 20 70 4c 69 73 74 20 69   Size of pList i
165a0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
165b0 72 20 2a 70 4f 75 74 20 20 20 20 20 20 20 20 20  r *pOut         
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
165d0 57 72 69 74 65 20 6f 75 74 70 75 74 20 68 65 72  Write output her
165e0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f  e */.){.  int nO
165f0 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 57  ut = 0;.  int bW
16600 72 69 74 74 65 6e 20 3d 20 30 3b 20 20 20 20 20  ritten = 0;     
16610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16620 65 20 6f 6e 63 65 20 69 44 65 6c 74 61 20 68 61  e once iDelta ha
16630 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 2a  s been written *
16640 2f 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 4c  /.  char *p = pL
16650 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e  ist;.  char *pEn
16660 64 20 3d 20 26 70 4c 69 73 74 5b 6e 4c 69 73 74  d = &pList[nList
16670 5d 3b 0a 0a 20 20 69 66 28 20 2a 70 21 3d 30 78  ];..  if( *p!=0x
16680 30 31 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 70  01 ){.    if( *p
16690 3d 3d 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20  ==0x02 ){.      
166a0 6e 4f 75 74 20 2b 3d 20 73 71 6c 69 74 65 33 46  nOut += sqlite3F
166b0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4f  ts3PutVarint(&pO
166c0 75 74 5b 6e 4f 75 74 5d 2c 20 69 44 65 6c 74 61  ut[nOut], iDelta
166d0 29 3b 0a 20 20 20 20 20 20 70 4f 75 74 5b 6e 4f  );.      pOut[nO
166e0 75 74 2b 2b 5d 20 3d 20 30 78 30 32 3b 0a 20 20  ut++] = 0x02;.  
166f0 20 20 20 20 62 57 72 69 74 74 65 6e 20 3d 20 31      bWritten = 1
16700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33  ;.    }.    fts3
16710 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30  ColumnlistCopy(0
16720 2c 20 26 70 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  , &p);.  }..  wh
16730 69 6c 65 28 20 70 3c 70 45 6e 64 20 29 7b 0a 20  ile( p<pEnd ){. 
16740 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
16750 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2b 2b 3b 0a   iCol;.    p++;.
16760 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33      p += sqlite3
16770 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c  Fts3GetVarint(p,
16780 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28   &iCol);.    if(
16790 20 2a 70 3d 3d 30 78 30 32 20 29 7b 0a 20 20 20   *p==0x02 ){.   
167a0 20 20 20 69 66 28 20 62 57 72 69 74 74 65 6e 3d     if( bWritten=
167b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  =0 ){.        nO
167c0 75 74 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ut += sqlite3Fts
167d0 33 50 75 74 56 61 72 69 6e 74 28 26 70 4f 75 74  3PutVarint(&pOut
167e0 5b 6e 4f 75 74 5d 2c 20 69 44 65 6c 74 61 29 3b  [nOut], iDelta);
167f0 0a 20 20 20 20 20 20 20 20 62 57 72 69 74 74 65  .        bWritte
16800 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  n = 1;.      }. 
16810 20 20 20 20 20 70 4f 75 74 5b 6e 4f 75 74 2b 2b       pOut[nOut++
16820 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 20 20  ] = 0x01;.      
16830 6e 4f 75 74 20 2b 3d 20 73 71 6c 69 74 65 33 46  nOut += sqlite3F
16840 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4f  ts3PutVarint(&pO
16850 75 74 5b 6e 4f 75 74 5d 2c 20 69 43 6f 6c 29 3b  ut[nOut], iCol);
16860 0a 20 20 20 20 20 20 70 4f 75 74 5b 6e 4f 75 74  .      pOut[nOut
16870 2b 2b 5d 20 3d 20 30 78 30 32 3b 0a 20 20 20 20  ++] = 0x02;.    
16880 7d 0a 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e  }.    fts3Column
16890 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 29 3b  listCopy(0, &p);
168a0 0a 20 20 7d 0a 20 20 69 66 28 20 62 57 72 69 74  .  }.  if( bWrit
168b0 74 65 6e 20 29 7b 0a 20 20 20 20 70 4f 75 74 5b  ten ){.    pOut[
168c0 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a  nOut++] = 0x00;.
168d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 4f    }..  return nO
168e0 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 65  ut;.}.../*.** Me
168f0 72 67 65 20 61 6c 6c 20 64 6f 63 6c 69 73 74 73  rge all doclists
16900 20 69 6e 20 74 68 65 20 54 65 72 6d 53 65 6c 65   in the TermSele
16910 63 74 2e 61 61 4f 75 74 70 75 74 5b 5d 20 61 72  ct.aaOutput[] ar
16920 72 61 79 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ray into a singl
16930 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 73 74 6f  e.** doclist sto
16940 72 65 64 20 69 6e 20 54 65 72 6d 53 65 6c 65 63  red in TermSelec
16950 74 2e 61 61 4f 75 74 70 75 74 5b 30 5d 2e 20 49  t.aaOutput[0]. I
16960 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 64 65  f successful, de
16970 6c 65 74 65 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65  lete all.** othe
16980 72 20 64 6f 63 6c 69 73 74 73 20 28 65 78 63 65  r doclists (exce
16990 70 74 20 74 68 65 20 61 61 4f 75 74 70 75 74 5b  pt the aaOutput[
169a0 30 5d 20 6f 6e 65 29 20 61 6e 64 20 72 65 74 75  0] one) and retu
169b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
169c0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
169d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
169e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
169f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
16a00 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 70 6f   is.** the respo
16a10 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
16a20 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65 20   caller to free 
16a30 61 6e 79 20 64 6f 63 6c 69 73 74 73 20 6c 65 66  any doclists lef
16a40 74 20 69 6e 20 74 68 65 0a 2a 2a 20 54 65 72 6d  t in the.** Term
16a50 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74 5b  Select.aaOutput[
16a60 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
16a70 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53  ic int fts3TermS
16a80 65 6c 65 63 74 46 69 6e 69 73 68 4d 65 72 67 65  electFinishMerge
16a90 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 54  (Fts3Table *p, T
16aa0 65 72 6d 53 65 6c 65 63 74 20 2a 70 54 53 29 7b  ermSelect *pTS){
16ab0 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 20 3d 20  .  char *aOut = 
16ac0 30 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20  0;.  int nOut = 
16ad0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
16ae0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
16af0 68 65 20 64 6f 63 6c 69 73 74 73 20 69 6e 20 74  he doclists in t
16b00 68 65 20 61 61 4f 75 74 70 75 74 5b 5d 20 61 72  he aaOutput[] ar
16b10 72 61 79 2e 20 4d 65 72 67 65 20 74 68 65 6d 20  ray. Merge them 
16b20 61 6c 6c 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 20  all.  ** into a 
16b30 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74 2e 0a  single doclist..
16b40 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
16b50 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 70 54  i<SizeofArray(pT
16b60 53 2d 3e 61 61 4f 75 74 70 75 74 29 3b 20 69 2b  S->aaOutput); i+
16b70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54 53 2d  +){.    if( pTS-
16b80 3e 61 61 4f 75 74 70 75 74 5b 69 5d 20 29 7b 0a  >aaOutput[i] ){.
16b90 20 20 20 20 20 20 69 66 28 20 21 61 4f 75 74 20        if( !aOut 
16ba0 29 7b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  ){.        aOut 
16bb0 3d 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b  = pTS->aaOutput[
16bc0 69 5d 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  i];.        nOut
16bd0 20 3d 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74   = pTS->anOutput
16be0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 53  [i];.        pTS
16bf0 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 20 3d 20  ->aaOutput[i] = 
16c00 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
16c10 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77          int nNew
16c20 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
16c30 61 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20 20 69  aNew;..        i
16c40 6e 74 20 72 63 20 3d 20 66 74 73 33 44 6f 63 6c  nt rc = fts3Docl
16c50 69 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e 62 44  istOrMerge(p->bD
16c60 65 73 63 49 64 78 2c 20 0a 20 20 20 20 20 20 20  escIdx, .       
16c70 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70       pTS->aaOutp
16c80 75 74 5b 69 5d 2c 20 70 54 53 2d 3e 61 6e 4f 75  ut[i], pTS->anOu
16c90 74 70 75 74 5b 69 5d 2c 20 61 4f 75 74 2c 20 6e  tput[i], aOut, n
16ca0 4f 75 74 2c 20 26 61 4e 65 77 2c 20 26 6e 4e 65  Out, &aNew, &nNe
16cb0 77 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  w.        );.   
16cc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16cf0 28 61 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (aOut);.        
16d00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16d10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
16d20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 53  sqlite3_free(pTS
16d30 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 29 3b 0a  ->aaOutput[i]);.
16d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16d50 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20 20  free(aOut);.    
16d60 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75      pTS->aaOutpu
16d70 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[i] = 0;.      
16d80 20 20 61 4f 75 74 20 3d 20 61 4e 65 77 3b 0a 20    aOut = aNew;. 
16d90 20 20 20 20 20 20 20 6e 4f 75 74 20 3d 20 6e 4e         nOut = nN
16da0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
16db0 7d 0a 20 20 7d 0a 0a 20 20 70 54 53 2d 3e 61 61  }.  }..  pTS->aa
16dc0 4f 75 74 70 75 74 5b 30 5d 20 3d 20 61 4f 75 74  Output[0] = aOut
16dd0 3b 0a 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75  ;.  pTS->anOutpu
16de0 74 5b 30 5d 20 3d 20 6e 4f 75 74 3b 0a 20 20 72  t[0] = nOut;.  r
16df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
16e10 74 68 65 20 64 6f 63 6c 69 73 74 20 61 44 6f 63  the doclist aDoc
16e20 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 20 69 6e  list/nDoclist in
16e30 74 6f 20 74 68 65 20 54 65 72 6d 53 65 6c 65 63  to the TermSelec
16e40 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 0a  t object passed.
16e50 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
16e60 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 6d 65  argument. The me
16e70 72 67 65 20 69 73 20 61 6e 20 22 4f 52 22 20 6d  rge is an "OR" m
16e80 65 72 67 65 20 28 73 65 65 20 66 75 6e 63 74 69  erge (see functi
16e90 6f 6e 0a 2a 2a 20 66 74 73 33 44 6f 63 6c 69 73  on.** fts3Doclis
16ea0 74 4f 72 4d 65 72 67 65 28 29 20 66 6f 72 20 64  tOrMerge() for d
16eb0 65 74 61 69 6c 73 29 2e 0a 2a 2a 0a 2a 2a 20 54  etails)..**.** T
16ec0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16ed0 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
16ee0 64 6f 63 6c 69 73 74 20 66 6f 72 20 65 61 63 68  doclist for each
16ef0 20 74 65 72 6d 20 74 68 61 74 20 6d 61 74 63 68   term that match
16f00 65 73 0a 2a 2a 20 61 20 71 75 65 72 69 65 64 20  es.** a queried 
16f10 70 72 65 66 69 78 2e 20 49 74 20 6d 65 72 67 65  prefix. It merge
16f20 73 20 61 6c 6c 20 74 68 65 73 65 20 64 6f 63 6c  s all these docl
16f30 69 73 74 73 20 69 6e 74 6f 20 6f 6e 65 2c 20 74  ists into one, t
16f40 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 66 6f  he doclist.** fo
16f50 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
16f60 70 72 65 66 69 78 2e 20 53 69 6e 63 65 20 74 68  prefix. Since th
16f70 65 72 65 20 63 61 6e 20 62 65 20 61 20 76 65 72  ere can be a ver
16f80 79 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f  y large number o
16f90 66 0a 2a 2a 20 64 6f 63 6c 69 73 74 73 20 74 6f  f.** doclists to
16fa0 20 6d 65 72 67 65 2c 20 74 68 65 20 6d 65 72 67   merge, the merg
16fb0 69 6e 67 20 69 73 20 64 6f 6e 65 20 70 61 69 72  ing is done pair
16fc0 2d 77 69 73 65 20 75 73 69 6e 67 20 74 68 65 20  -wise using the 
16fd0 54 65 72 6d 53 65 6c 65 63 74 0a 2a 2a 20 6f 62  TermSelect.** ob
16fe0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
16ff0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
17000 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  s SQLITE_OK if t
17010 68 65 20 6d 65 72 67 65 20 69 73 20 73 75 63 63  he merge is succ
17020 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 0a 2a 2a  essful, or an.**
17030 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
17040 64 65 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de (SQLITE_NOMEM
17050 29 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  ) if an error oc
17060 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
17070 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c 65  int fts3TermSele
17080 63 74 4d 65 72 67 65 28 0a 20 20 46 74 73 33 54  ctMerge(.  Fts3T
17090 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
170a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
170b0 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  S table handle *
170c0 2f 0a 20 20 54 65 72 6d 53 65 6c 65 63 74 20 2a  /.  TermSelect *
170d0 70 54 53 2c 20 20 20 20 20 20 20 20 20 20 20 20  pTS,            
170e0 20 20 20 20 2f 2a 20 54 65 72 6d 53 65 6c 65 63      /* TermSelec
170f0 74 20 6f 62 6a 65 63 74 20 74 6f 20 6d 65 72 67  t object to merg
17100 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 68 61 72  e into */.  char
17110 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20 20   *aDoclist,     
17120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17130 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
17140 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  t */.  int nDocl
17150 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
17160 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17170 66 20 61 44 6f 63 6c 69 73 74 20 69 6e 20 62 79  f aDoclist in by
17180 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  tes */.){.  if( 
17190 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d  pTS->aaOutput[0]
171a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
171b0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
171c0 73 74 20 74 65 72 6d 20 73 65 6c 65 63 74 65 64  st term selected
171d0 2c 20 63 6f 70 79 20 74 68 65 20 64 6f 63 6c 69  , copy the docli
171e0 73 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  st to the output
171f0 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 75  .    ** buffer u
17200 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 0a  sing memcpy(). .
17210 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 64      **.    ** Ad
17220 64 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  d FTS3_VARINT_MA
17230 58 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  X bytes of unuse
17240 64 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 65  d space to the e
17250 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  nd of the .    *
17260 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  * allocation. Th
17270 69 73 20 69 73 20 73 6f 20 61 73 20 74 6f 20 65  is is so as to e
17280 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
17290 75 66 66 65 72 20 69 73 20 62 69 67 20 65 6e 6f  uffer is big eno
172a0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 68 6f  ugh.    ** to ho
172b0 6c 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  ld the current d
172c0 6f 63 6c 69 73 74 20 41 4e 44 27 64 20 77 69 74  oclist AND'd wit
172d0 68 20 61 6e 79 20 6f 74 68 65 72 20 64 6f 63 6c  h any other docl
172e0 69 73 74 2e 20 49 66 20 74 68 65 0a 20 20 20 20  ist. If the.    
172f0 2a 2a 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ** doclists are 
17300 73 74 6f 72 65 64 20 69 6e 20 6f 72 64 65 72 3d  stored in order=
17310 41 53 43 20 6f 72 64 65 72 2c 20 74 68 69 73 20  ASC order, this 
17320 70 61 64 64 69 6e 67 20 77 6f 75 6c 64 20 6e 6f  padding would no
17330 74 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 71 75  t be.    ** requ
17340 69 72 65 64 20 28 73 69 6e 63 65 20 74 68 65 20  ired (since the 
17350 73 69 7a 65 20 6f 66 20 5b 64 6f 63 6c 69 73 74  size of [doclist
17360 41 20 41 4e 44 20 64 6f 63 6c 69 73 74 42 5d 20  A AND doclistB] 
17370 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 0a 20  is always less. 
17380 20 20 20 2a 2a 20 74 68 61 6e 20 6f 72 20 65 71     ** than or eq
17390 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
173a0 6f 66 20 5b 64 6f 63 6c 69 73 74 41 5d 20 69 6e  of [doclistA] in
173b0 20 74 68 61 74 20 63 61 73 65 29 2e 20 42 75 74   that case). But
173c0 20 74 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   this is.    ** 
173d0 6e 6f 74 20 74 72 75 65 20 66 6f 72 20 6f 72 64  not true for ord
173e0 65 72 3d 44 45 53 43 2e 20 46 6f 72 20 65 78 61  er=DESC. For exa
173f0 6d 70 6c 65 2c 20 61 20 64 6f 63 6c 69 73 74 20  mple, a doclist 
17400 63 6f 6e 74 61 69 6e 69 6e 67 20 28 31 2c 20 2d  containing (1, -
17410 31 29 20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  1) .    ** may b
17420 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28  e smaller than (
17430 2d 31 29 2c 20 61 73 20 69 6e 20 74 68 65 20 66  -1), as in the f
17440 69 72 73 74 20 65 78 61 6d 70 6c 65 20 74 68 65  irst example the
17450 20 2d 31 20 6d 61 79 20 62 65 20 73 74 6f 72 65   -1 may be store
17460 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 69  d.    ** as a si
17470 6e 67 6c 65 2d 62 79 74 65 20 64 65 6c 74 61 2c  ngle-byte delta,
17480 20 77 68 65 72 65 61 73 20 69 6e 20 74 68 65 20   whereas in the 
17490 73 65 63 6f 6e 64 20 69 74 20 6d 75 73 74 20 62  second it must b
174a0 65 20 73 74 6f 72 65 64 20 61 73 20 61 0a 20 20  e stored as a.  
174b0 20 20 2a 2a 20 46 54 53 33 5f 56 41 52 49 4e 54    ** FTS3_VARINT
174c0 5f 4d 41 58 20 62 79 74 65 20 76 61 72 69 6e 74  _MAX byte varint
174d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
174e0 53 69 6d 69 6c 61 72 20 70 61 64 64 69 6e 67 20  Similar padding 
174f0 69 73 20 61 64 64 65 64 20 69 6e 20 74 68 65 20  is added in the 
17500 66 74 73 33 44 6f 63 6c 69 73 74 4f 72 4d 65 72  fts3DoclistOrMer
17510 67 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  ge() function.. 
17520 20 20 20 2a 2f 0a 20 20 20 20 70 54 53 2d 3e 61     */.    pTS->a
17530 61 4f 75 74 70 75 74 5b 30 5d 20 3d 20 73 71 6c  aOutput[0] = sql
17540 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 6f 63  ite3_malloc(nDoc
17550 6c 69 73 74 20 2b 20 46 54 53 33 5f 56 41 52 49  list + FTS3_VARI
17560 4e 54 5f 4d 41 58 20 2b 20 31 29 3b 0a 20 20 20  NT_MAX + 1);.   
17570 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b 30   pTS->anOutput[0
17580 5d 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20  ] = nDoclist;.  
17590 20 20 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74    if( pTS->aaOut
175a0 70 75 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  put[0] ){.      
175b0 6d 65 6d 63 70 79 28 70 54 53 2d 3e 61 61 4f 75  memcpy(pTS->aaOu
175c0 74 70 75 74 5b 30 5d 2c 20 61 44 6f 63 6c 69 73  tput[0], aDoclis
175d0 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
175e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
175f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17600 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  EM;.    }.  }els
17610 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 4d 65  e{.    char *aMe
17620 72 67 65 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a  rge = aDoclist;.
17630 20 20 20 20 69 6e 74 20 6e 4d 65 72 67 65 20 3d      int nMerge =
17640 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69   nDoclist;.    i
17650 6e 74 20 69 4f 75 74 3b 0a 0a 20 20 20 20 66 6f  nt iOut;..    fo
17660 72 28 69 4f 75 74 3d 30 3b 20 69 4f 75 74 3c 53  r(iOut=0; iOut<S
17670 69 7a 65 6f 66 41 72 72 61 79 28 70 54 53 2d 3e  izeofArray(pTS->
17680 61 61 4f 75 74 70 75 74 29 3b 20 69 4f 75 74 2b  aaOutput); iOut+
17690 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  +){.      if( pT
176a0 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75 74  S->aaOutput[iOut
176b0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
176c0 61 73 73 65 72 74 28 20 69 4f 75 74 3e 30 20 29  assert( iOut>0 )
176d0 3b 0a 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61  ;.        pTS->a
176e0 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20  aOutput[iOut] = 
176f0 61 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  aMerge;.        
17700 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b 69 4f  pTS->anOutput[iO
17710 75 74 5d 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20  ut] = nMerge;.  
17720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17740 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 20 20    char *aNew;.  
17750 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 0a        int nNew;.
17760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
17770 3d 20 66 74 73 33 44 6f 63 6c 69 73 74 4f 72 4d  = fts3DoclistOrM
17780 65 72 67 65 28 70 2d 3e 62 44 65 73 63 49 64 78  erge(p->bDescIdx
17790 2c 20 61 4d 65 72 67 65 2c 20 6e 4d 65 72 67 65  , aMerge, nMerge
177a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
177b0 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75  TS->aaOutput[iOu
177c0 74 5d 2c 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75  t], pTS->anOutpu
177d0 74 5b 69 4f 75 74 5d 2c 20 26 61 4e 65 77 2c 20  t[iOut], &aNew, 
177e0 26 6e 4e 65 77 0a 20 20 20 20 20 20 20 20 29 3b  &nNew.        );
177f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17810 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 65 72          if( aMer
17820 67 65 21 3d 61 44 6f 63 6c 69 73 74 20 29 20 73  ge!=aDoclist ) s
17830 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4d 65 72  qlite3_free(aMer
17840 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ge);.          r
17850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17860 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
17870 20 61 4d 65 72 67 65 21 3d 61 44 6f 63 6c 69 73   aMerge!=aDoclis
17880 74 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  t ) sqlite3_free
17890 28 61 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  (aMerge);.      
178a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
178b0 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75  TS->aaOutput[iOu
178c0 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 54 53  t]);.        pTS
178d0 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d  ->aaOutput[iOut]
178e0 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 20 20 20   = 0;.  .       
178f0 20 61 4d 65 72 67 65 20 3d 20 61 4e 65 77 3b 0a   aMerge = aNew;.
17900 20 20 20 20 20 20 20 20 6e 4d 65 72 67 65 20 3d          nMerge =
17910 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 69   nNew;.        i
17920 66 28 20 28 69 4f 75 74 2b 31 29 3d 3d 53 69 7a  f( (iOut+1)==Siz
17930 65 6f 66 41 72 72 61 79 28 70 54 53 2d 3e 61 61  eofArray(pTS->aa
17940 4f 75 74 70 75 74 29 20 29 7b 0a 20 20 20 20 20  Output) ){.     
17950 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70       pTS->aaOutp
17960 75 74 5b 69 4f 75 74 5d 20 3d 20 61 4d 65 72 67  ut[iOut] = aMerg
17970 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 53  e;.          pTS
17980 2d 3e 61 6e 4f 75 74 70 75 74 5b 69 4f 75 74 5d  ->anOutput[iOut]
17990 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20   = nMerge;.     
179a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
179b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
179c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
179d0 0a 2a 2a 20 41 70 70 65 6e 64 20 53 65 67 52 65  .** Append SegRe
179e0 61 64 65 72 20 6f 62 6a 65 63 74 20 70 4e 65 77  ader object pNew
179f0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
17a00 68 65 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  he pCsr->apSegme
17a10 6e 74 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  nt[] array..*/.s
17a20 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
17a30 67 52 65 61 64 65 72 43 75 72 73 6f 72 41 70 70  gReaderCursorApp
17a40 65 6e 64 28 0a 20 20 46 74 73 33 4d 75 6c 74 69  end(.  Fts3Multi
17a50 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 2c  SegReader *pCsr,
17a60 20 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65   .  Fts3SegReade
17a70 72 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 66 28  r *pNew.){.  if(
17a80 20 28 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74   (pCsr->nSegment
17a90 25 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46  %16)==0 ){.    F
17aa0 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61  ts3SegReader **a
17ab0 70 4e 65 77 3b 0a 20 20 20 20 73 71 6c 69 74 65  pNew;.    sqlite
17ac0 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
17ad0 28 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20  (pCsr->nSegment 
17ae0 2b 20 31 36 29 2a 73 69 7a 65 6f 66 28 46 74 73  + 16)*sizeof(Fts
17af0 33 53 65 67 52 65 61 64 65 72 2a 29 3b 0a 20 20  3SegReader*);.  
17b00 20 20 61 70 4e 65 77 20 3d 20 28 46 74 73 33 53    apNew = (Fts3S
17b10 65 67 52 65 61 64 65 72 20 2a 2a 29 73 71 6c 69  egReader **)sqli
17b20 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 43  te3_realloc64(pC
17b30 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 6e  sr->apSegment, n
17b40 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
17b50 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 73  apNew ){.      s
17b60 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61  qlite3Fts3SegRea
17b70 64 65 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  derFree(pNew);. 
17b80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17b90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
17ba0 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d      pCsr->apSegm
17bb0 65 6e 74 20 3d 20 61 70 4e 65 77 3b 0a 20 20 7d  ent = apNew;.  }
17bc0 0a 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65  .  pCsr->apSegme
17bd0 6e 74 5b 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e  nt[pCsr->nSegmen
17be0 74 2b 2b 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 72  t++] = pNew;.  r
17bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 73 65  .}../*.** Add se
17c10 67 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 73  g-reader objects
17c20 20 74 6f 20 74 68 65 20 46 74 73 33 4d 75 6c 74   to the Fts3Mult
17c30 69 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  iSegReader objec
17c40 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  t passed as the.
17c50 2a 2a 20 38 74 68 20 61 72 67 75 6d 65 6e 74 2e  ** 8th argument.
17c60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17c70 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
17c80 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
17c90 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
17ca0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  te error code.**
17cb0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
17cc0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
17cd0 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a 20  gReaderCursor(. 
17ce0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20   Fts3Table *p,  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68   /* FTS3 table h
17d10 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
17d20 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20  Langid,         
17d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
17d40 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69  nguage id */.  i
17d50 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20  nt iIndex,      
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d70 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63  * Index to searc
17d80 68 20 28 66 72 6f 6d 20 30 20 74 6f 20 70 2d 3e  h (from 0 to p->
17d90 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20 69  nIndex-1) */.  i
17da0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17dc0 2a 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d 65  * Level of segme
17dd0 6e 74 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  nts to scan */. 
17de0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
17df0 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rm,             
17e00 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65 72   /* Term to quer
17e10 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
17e20 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
17e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
17e40 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
17e50 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ytes */.  int is
17e60 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20 20  Prefix,         
17e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17e80 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20 73  e for a prefix s
17e90 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69  earch */.  int i
17ea0 73 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20 20  sScan,          
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17ec0 75 65 20 74 6f 20 73 63 61 6e 20 66 72 6f 6d 20  ue to scan from 
17ed0 7a 54 65 72 6d 20 74 6f 20 45 4f 46 20 2a 2f 0a  zTerm to EOF */.
17ee0 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65    Fts3MultiSegRe
17ef0 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20 20  ader *pCsr      
17f00 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
17f10 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
17f20 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
17f30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
17f40 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
17f50 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
17f60 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
17f70 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  0;        /* Sta
17f80 74 65 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  tement to iterat
17f90 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
17fa0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b  ts */.  int rc2;
17fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17fd0 74 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73  t of sqlite3_res
17fe0 65 74 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  et() */..  /* If
17ff0 20 69 4c 65 76 65 6c 20 69 73 20 6c 65 73 73 20   iLevel is less 
18000 74 68 61 6e 20 30 20 61 6e 64 20 74 68 69 73 20  than 0 and this 
18010 69 73 20 6e 6f 74 20 61 20 73 63 61 6e 2c 20 69  is not a scan, i
18020 6e 63 6c 75 64 65 20 61 20 73 65 67 2d 72 65 61  nclude a seg-rea
18030 64 65 72 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  der .  ** for th
18040 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 2e  e pending-terms.
18050 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
18060 61 6e 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  an, then this ca
18070 6c 6c 20 6d 75 73 74 20 62 65 20 62 65 69 6e 67  ll must be being
18080 0a 20 20 2a 2a 20 6d 61 64 65 20 62 79 20 61 6e  .  ** made by an
18090 20 66 74 73 34 61 75 78 20 6d 6f 64 75 6c 65 2c   fts4aux module,
180a0 20 6e 6f 74 20 61 6e 20 46 54 53 20 74 61 62 6c   not an FTS tabl
180b0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
180c0 63 61 6c 6c 69 6e 67 0a 20 20 2a 2a 20 46 74 73  calling.  ** Fts
180d0 33 53 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e  3SegReaderPendin
180e0 67 20 6d 69 67 68 74 20 73 65 67 66 61 75 6c 74  g might segfault
180f0 2c 20 61 73 20 74 68 65 20 64 61 74 61 20 73 74  , as the data st
18100 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
18110 20 0a 20 20 2a 2a 20 66 74 73 34 61 75 78 20 61   .  ** fts4aux a
18120 72 65 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  re not completel
18130 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 53 6f 20  y populated. So 
18140 69 74 27 73 20 65 61 73 69 65 73 74 20 74 6f 20  it's easiest to 
18150 66 69 6c 74 65 72 20 74 68 65 73 65 0a 20 20 2a  filter these.  *
18160 2a 20 63 61 6c 6c 73 20 6f 75 74 20 68 65 72 65  * calls out here
18170 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76  .  */.  if( iLev
18180 65 6c 3c 30 20 26 26 20 70 2d 3e 61 49 6e 64 65  el<0 && p->aInde
18190 78 20 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67  x ){.    Fts3Seg
181a0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 30  Reader *pSeg = 0
181b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
181c0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 50  e3Fts3SegReaderP
181d0 65 6e 64 69 6e 67 28 70 2c 20 69 49 6e 64 65 78  ending(p, iIndex
181e0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
181f0 69 73 50 72 65 66 69 78 7c 7c 69 73 53 63 61 6e  isPrefix||isScan
18200 2c 20 26 70 53 65 67 29 3b 0a 20 20 20 20 69 66  , &pSeg);.    if
18210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18220 26 26 20 70 53 65 67 20 29 7b 0a 20 20 20 20 20  && pSeg ){.     
18230 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61   rc = fts3SegRea
18240 64 65 72 43 75 72 73 6f 72 41 70 70 65 6e 64 28  derCursorAppend(
18250 70 43 73 72 2c 20 70 53 65 67 29 3b 0a 20 20 20  pCsr, pSeg);.   
18260 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4c   }.  }..  if( iL
18270 65 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55  evel!=FTS3_SEGCU
18280 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a  RSOR_PENDING ){.
18290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
182a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
182b0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 41  c = sqlite3Fts3A
182c0 6c 6c 53 65 67 64 69 72 73 28 70 2c 20 69 4c 61  llSegdirs(p, iLa
182d0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c  ngid, iIndex, iL
182e0 65 76 65 6c 2c 20 26 70 53 74 6d 74 29 3b 0a 20  evel, &pStmt);. 
182f0 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
18300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18310 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72  & SQLITE_ROW==(r
18320 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
18330 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20 20 20  (pStmt)) ){.    
18340 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
18350 2a 70 53 65 67 20 3d 20 30 3b 0a 0a 20 20 20 20  *pSeg = 0;..    
18360 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
18370 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
18380 20 74 68 65 20 53 45 4c 45 43 54 20 69 6e 74 6f   the SELECT into
18390 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
183a0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
183b0 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 42  e3_int64 iStartB
183c0 6c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63  lock = sqlite3_c
183d0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
183e0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
183f0 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 76  ite3_int64 iLeav
18400 65 73 45 6e 64 42 6c 6f 63 6b 20 3d 20 73 71 6c  esEndBlock = sql
18410 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
18420 34 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  4(pStmt, 2);.   
18430 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
18440 20 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 73 71 6c   iEndBlock = sql
18450 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
18460 34 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  4(pStmt, 3);.   
18470 20 20 20 69 6e 74 20 6e 52 6f 6f 74 20 3d 20 73     int nRoot = s
18480 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
18490 74 65 73 28 70 53 74 6d 74 2c 20 34 29 3b 0a 20  tes(pStmt, 4);. 
184a0 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
184b0 2a 7a 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33  *zRoot = sqlite3
184c0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
184d0 6d 74 2c 20 34 29 3b 0a 0a 20 20 20 20 20 20 2f  mt, 4);..      /
184e0 2a 20 49 66 20 7a 54 65 72 6d 20 69 73 20 6e 6f  * If zTerm is no
184f0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 69 73  t NULL, and this
18500 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20   segment is not 
18510 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
18520 6f 6e 20 69 74 73 0a 20 20 20 20 20 20 2a 2a 20  on its.      ** 
18530 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65 20 72  root node, the r
18540 61 6e 67 65 20 6f 66 20 6c 65 61 76 65 73 20 73  ange of leaves s
18550 63 61 6e 6e 65 64 20 63 61 6e 20 62 65 20 72 65  canned can be re
18560 64 75 63 65 64 2e 20 44 6f 20 74 68 69 73 2e 20  duced. Do this. 
18570 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 53 74  */.      if( iSt
18580 61 72 74 42 6c 6f 63 6b 20 26 26 20 7a 54 65 72  artBlock && zTer
18590 6d 20 26 26 20 7a 52 6f 6f 74 20 29 7b 0a 20 20  m && zRoot ){.  
185a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
185b0 74 36 34 20 2a 70 69 20 3d 20 28 69 73 50 72 65  t64 *pi = (isPre
185c0 66 69 78 20 3f 20 26 69 4c 65 61 76 65 73 45 6e  fix ? &iLeavesEn
185d0 64 42 6c 6f 63 6b 20 3a 20 30 29 3b 0a 20 20 20  dBlock : 0);.   
185e0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
185f0 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72  lectLeaf(p, zTer
18600 6d 2c 20 6e 54 65 72 6d 2c 20 7a 52 6f 6f 74 2c  m, nTerm, zRoot,
18610 20 6e 52 6f 6f 74 2c 20 26 69 53 74 61 72 74 42   nRoot, &iStartB
18620 6c 6f 63 6b 2c 20 70 69 29 3b 0a 20 20 20 20 20  lock, pi);.     
18630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18640 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
18650 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  shed;.        if
18660 28 20 69 73 50 72 65 66 69 78 3d 3d 30 20 26 26  ( isPrefix==0 &&
18670 20 69 73 53 63 61 6e 3d 3d 30 20 29 20 69 4c 65   isScan==0 ) iLe
18680 61 76 65 73 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  avesEndBlock = i
18690 53 74 61 72 74 42 6c 6f 63 6b 3b 0a 20 20 20 20  StartBlock;.    
186a0 20 20 7d 0a 20 0a 20 20 20 20 20 20 72 63 20 3d    }. .      rc =
186b0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
186c0 65 61 64 65 72 4e 65 77 28 70 43 73 72 2d 3e 6e  eaderNew(pCsr->n
186d0 53 65 67 6d 65 6e 74 2b 31 2c 20 0a 20 20 20 20  Segment+1, .    
186e0 20 20 20 20 20 20 28 69 73 50 72 65 66 69 78 3d        (isPrefix=
186f0 3d 30 20 26 26 20 69 73 53 63 61 6e 3d 3d 30 29  =0 && isScan==0)
18700 2c 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ,.          iSta
18710 72 74 42 6c 6f 63 6b 2c 20 69 4c 65 61 76 65 73  rtBlock, iLeaves
18720 45 6e 64 42 6c 6f 63 6b 2c 20 0a 20 20 20 20 20  EndBlock, .     
18730 20 20 20 20 20 69 45 6e 64 42 6c 6f 63 6b 2c 20       iEndBlock, 
18740 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 70  zRoot, nRoot, &p
18750 53 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Seg.      );.   
18760 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18770 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
18780 73 68 65 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  shed;.      rc =
18790 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75   fts3SegReaderCu
187a0 72 73 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c  rsorAppend(pCsr,
187b0 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pSeg);.    }.  
187c0 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20  }.. finished:.  
187d0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
187e0 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
187f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
18800 45 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  E ) rc = rc2;.. 
18810 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18820 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 63 75  *.** Set up a cu
18830 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72 20  rsor object for 
18840 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
18850 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  h a full-text in
18860 64 65 78 20 6f 72 20 61 20 0a 2a 2a 20 73 69 6e  dex or a .** sin
18870 67 6c 65 20 6c 65 76 65 6c 20 74 68 65 72 65 69  gle level therei
18880 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
18890 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
188a0 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61 62 6c  rsor(.  Fts3Tabl
188b0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
188c0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
188d0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
188e0 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 2d 69 64    /* Language-id
18910 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
18920 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18940 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
18950 63 68 20 28 66 72 6f 6d 20 30 20 74 6f 20 70 2d  ch (from 0 to p-
18960 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20  >nIndex-1) */.  
18970 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d  /* Level of segm
189a0 65 6e 74 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ents to scan */.
189b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
189c0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
189d0 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65    /* Term to que
189e0 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
189f0 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
18a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18a10 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
18a20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
18a30 73 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20  sPrefix,        
18a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18a50 75 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20  ue for a prefix 
18a60 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
18a70 69 73 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20  isScan,         
18a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18a90 72 75 65 20 74 6f 20 73 63 61 6e 20 66 72 6f 6d  rue to scan from
18aa0 20 7a 54 65 72 6d 20 74 6f 20 45 4f 46 20 2a 2f   zTerm to EOF */
18ab0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
18ac0 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
18ad0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
18ae0 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
18af0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  /.){.  assert( i
18b00 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
18b10 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
18b20 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
18b30 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
18b40 5f 41 4c 4c 0a 20 20 20 20 20 20 7c 7c 20 20 69  _ALL.      ||  i
18b50 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
18b60 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 0a 20  URSOR_PENDING . 
18b70 20 20 20 20 20 7c 7c 20 20 69 4c 65 76 65 6c 3e       ||  iLevel>
18b80 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  =0.  );.  assert
18b90 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45  ( iLevel<FTS3_SE
18ba0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b  GDIR_MAXLEVEL );
18bb0 0a 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f  .  assert( FTS3_
18bc0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 3c 30 20  SEGCURSOR_ALL<0 
18bd0 26 26 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  && FTS3_SEGCURSO
18be0 52 5f 50 45 4e 44 49 4e 47 3c 30 20 29 3b 0a 20  R_PENDING<0 );. 
18bf0 20 61 73 73 65 72 74 28 20 69 73 50 72 65 66 69   assert( isPrefi
18c00 78 3d 3d 30 20 7c 7c 20 69 73 53 63 61 6e 3d 3d  x==0 || isScan==
18c10 30 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  0 );..  memset(p
18c20 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Csr, 0, sizeof(F
18c30 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
18c40 72 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  r));.  return ft
18c50 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
18c60 72 28 0a 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  r(.      p, iLan
18c70 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
18c80 76 65 6c 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  vel, zTerm, nTer
18c90 6d 2c 20 69 73 50 72 65 66 69 78 2c 20 69 73 53  m, isPrefix, isS
18ca0 63 61 6e 2c 20 70 43 73 72 0a 20 20 29 3b 0a 7d  can, pCsr.  );.}
18cb0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74  ../*.** In addit
18cc0 69 6f 6e 20 74 6f 20 69 74 73 20 63 75 72 72 65  ion to its curre
18cd0 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  nt configuration
18ce0 2c 20 68 61 76 65 20 74 68 65 20 46 74 73 33 4d  , have the Fts3M
18cf0 75 6c 74 69 53 65 67 52 65 61 64 65 72 0a 2a 2a  ultiSegReader.**
18d00 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 34   passed as the 4
18d10 74 68 20 61 72 67 75 6d 65 6e 74 20 61 6c 73 6f  th argument also
18d20 20 73 63 61 6e 20 74 68 65 20 64 6f 63 6c 69 73   scan the doclis
18d30 74 20 66 6f 72 20 74 65 72 6d 20 7a 54 65 72 6d  t for term zTerm
18d40 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 53 51  /nTerm..**.** SQ
18d50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18d60 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
18d70 6f 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73  occurs, otherwis
18d80 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
18d90 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
18da0 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
18db0 64 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f  derCursorAddZero
18dc0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
18dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18de0 20 20 20 20 2f 2a 20 46 54 53 20 76 69 72 74 75      /* FTS virtu
18df0 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
18e00 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
18e10 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18e20 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
18e30 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
18e40 63 61 6e 20 64 6f 63 6c 69 73 74 20 6f 66 20 2a  can doclist of *
18e50 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18e80 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20   bytes in zTerm 
18e90 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
18ea0 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
18eb0 20 20 20 20 20 2f 2a 20 46 74 73 33 4d 75 6c 74       /* Fts3Mult
18ec0 69 53 65 67 52 65 61 64 65 72 20 74 6f 20 6d 6f  iSegReader to mo
18ed0 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  dify */.){.  ret
18ee0 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
18ef0 72 43 75 72 73 6f 72 28 70 2c 20 0a 20 20 20 20  rCursor(p, .    
18f00 20 20 69 4c 61 6e 67 69 64 2c 20 30 2c 20 46 54    iLangid, 0, FT
18f10 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
18f20 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
18f30 30 2c 20 30 2c 70 43 73 72 0a 20 20 29 3b 0a 7d  0, 0,pCsr.  );.}
18f40 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20  ../*.** Open an 
18f50 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18f60 65 72 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  er to scan the d
18f70 6f 63 6c 69 73 74 20 66 6f 72 20 74 65 72 6d 20  oclist for term 
18f80 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 4f 72 2c  zTerm/nTerm. Or,
18f90 0a 2a 2a 20 69 66 20 69 73 50 72 65 66 69 78 20  .** if isPrefix 
18fa0 69 73 20 74 72 75 65 2c 20 74 6f 20 73 63 61 6e  is true, to scan
18fb0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
18fc0 20 61 6c 6c 20 74 65 72 6d 73 20 66 6f 72 20 77   all terms for w
18fd0 68 69 63 68 20 0a 2a 2a 20 7a 54 65 72 6d 2f 6e  hich .** zTerm/n
18fe0 54 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78  Term is a prefix
18ff0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
19000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19010 4b 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61  K and write.** a
19020 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19030 6e 65 77 20 46 74 73 33 4d 75 6c 74 69 53 65 67  new Fts3MultiSeg
19040 52 65 61 64 65 72 20 74 6f 20 2a 70 70 53 65 67  Reader to *ppSeg
19050 63 73 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  csr. Otherwise, 
19060 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c  return.** an SQL
19070 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
19080 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
19090 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
190a0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
190b0 66 72 65 65 20 74 68 69 73 20 6f 62 6a 65 63 74  free this object
190c0 20 62 79 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   by eventually.*
190d0 2a 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  * passing it to 
190e0 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  fts3SegReaderCur
190f0 73 6f 72 46 72 65 65 28 29 20 0a 2a 2a 0a 2a 2a  sorFree() .**.**
19100 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19110 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
19120 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
19130 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
19140 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 75  rror code..** Ou
19150 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
19160 70 70 53 65 67 63 73 72 20 69 73 20 73 65 74 20  ppSegcsr is set 
19170 74 6f 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72  to 0 if an error
19180 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
19190 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53  ic int fts3TermS
191a0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a  egReaderCursor(.
191b0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
191c0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
191d0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
191e0 6c 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65  le cursor handle
191f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19200 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
19210 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
19220 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
19230 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
19260 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
19270 6e 74 20 69 73 50 72 65 66 69 78 2c 20 20 20 20  nt isPrefix,    
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19290 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
192a0 66 69 78 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  fix search */.  
192b0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
192c0 65 72 20 2a 2a 70 70 53 65 67 63 73 72 20 20 20  er **ppSegcsr   
192d0 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  /* OUT: Allocate
192e0 64 20 73 65 67 2d 72 65 61 64 65 72 20 63 75 72  d seg-reader cur
192f0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  sor */.){.  Fts3
19300 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
19310 70 53 65 67 63 73 72 3b 20 20 20 20 2f 2a 20 4f  pSegcsr;    /* O
19320 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
19330 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
19340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19350 45 5f 4e 4f 4d 45 4d 3b 20 20 20 20 20 20 20 20  E_NOMEM;        
19360 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
19370 20 2a 2f 0a 0a 20 20 70 53 65 67 63 73 72 20 3d   */..  pSegcsr =
19380 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
19390 73 69 7a 65 6f 66 28 46 74 73 33 4d 75 6c 74 69  sizeof(Fts3Multi
193a0 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 69  SegReader));.  i
193b0 66 28 20 70 53 65 67 63 73 72 20 29 7b 0a 20 20  f( pSegcsr ){.  
193c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
193d0 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20   bFound = 0;    
193e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
193f0 75 65 20 6f 6e 63 65 20 61 6e 20 69 6e 64 65 78  ue once an index
19400 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20   has been found 
19410 2a 2f 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65  */.    Fts3Table
19420 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
19430 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
19440 74 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 69 73  tab;..    if( is
19450 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
19460 66 6f 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d  for(i=1; bFound=
19470 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  =0 && i<p->nInde
19480 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
19490 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69   if( p->aIndex[i
194a0 5d 2e 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d  ].nPrefix==nTerm
194b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
194c0 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
194d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
194e0 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
194f0 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
19500 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
19510 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
19520 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
19530 6d 2c 20 6e 54 65 72 6d 2c 20 30 2c 20 30 2c 20  m, nTerm, 0, 0, 
19540 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
19550 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70    );.          p
19560 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20  Segcsr->bLookup 
19570 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
19580 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
19590 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d 3d 30  r(i=1; bFound==0
195a0 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b   && i<p->nIndex;
195b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
195c0 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  f( p->aIndex[i].
195d0 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d 2b 31  nPrefix==nTerm+1
195e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
195f0 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
19600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19610 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
19620 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
19630 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
19640 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
19650 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
19660 6d 2c 20 6e 54 65 72 6d 2c 20 31 2c 20 30 2c 20  m, nTerm, 1, 0, 
19670 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
19680 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
19690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
196a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
196b0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
196c0 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f 28  erCursorAddZero(
196d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
196e0 20 70 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69   p, pCsr->iLangi
196f0 64 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  d, zTerm, nTerm,
19700 20 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20   pSegcsr.       
19710 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
19720 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19740 20 69 66 28 20 62 46 6f 75 6e 64 3d 3d 30 20 29   if( bFound==0 )
19750 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19760 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
19770 72 43 75 72 73 6f 72 28 70 2c 20 70 43 73 72 2d  rCursor(p, pCsr-
19780 3e 69 4c 61 6e 67 69 64 2c 20 0a 20 20 20 20 20  >iLangid, .     
19790 20 20 20 20 20 30 2c 20 46 54 53 33 5f 53 45 47       0, FTS3_SEG
197a0 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
197b0 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66  m, nTerm, isPref
197c0 69 78 2c 20 30 2c 20 70 53 65 67 63 73 72 0a 20  ix, 0, pSegcsr. 
197d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 53       );.      pS
197e0 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d  egcsr->bLookup =
197f0 20 21 69 73 50 72 65 66 69 78 3b 0a 20 20 20 20   !isPrefix;.    
19800 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 65 67 63  }.  }..  *ppSegc
19810 73 72 20 3d 20 70 53 65 67 63 73 72 3b 0a 20 20  sr = pSegcsr;.  
19820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19830 0a 2a 2a 20 46 72 65 65 20 61 6e 20 46 74 73 33  .** Free an Fts3
19840 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 61  MultiSegReader a
19850 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 33  llocated by fts3
19860 54 65 72 6d 53 65 67 52 65 61 64 65 72 43 75 72  TermSegReaderCur
19870 73 6f 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  sor()..*/.static
19880 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61   void fts3SegRea
19890 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 46 74  derCursorFree(Ft
198a0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
198b0 20 2a 70 53 65 67 63 73 72 29 7b 0a 20 20 73 71   *pSegcsr){.  sq
198c0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
198d0 65 72 46 69 6e 69 73 68 28 70 53 65 67 63 73 72  erFinish(pSegcsr
198e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
198f0 65 28 70 53 65 67 63 73 72 29 3b 0a 7d 0a 0a 2f  e(pSegcsr);.}../
19900 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19910 6f 6e 20 72 65 74 72 69 65 76 65 73 20 74 68 65  on retrieves the
19920 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
19930 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
19940 28 6f 72 20 74 65 72 6d 0a 2a 2a 20 70 72 65 66  (or term.** pref
19950 69 78 29 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ix) from the dat
19960 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
19970 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c   int fts3TermSel
19980 65 63 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ect(.  Fts3Table
19990 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
199a0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
199b0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
199c0 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 54 6f  /.  Fts3PhraseTo
199d0 6b 65 6e 20 2a 70 54 6f 6b 2c 20 20 20 20 20 20  ken *pTok,      
199e0 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20      /* Token to 
199f0 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
19a00 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19a20 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72  * Column to quer
19a30 79 20 28 6f 72 20 2d 76 65 20 66 6f 72 20 61 6c  y (or -ve for al
19a40 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  l columns) */.  
19a50 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20  int *pnOut,     
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
19a80 62 75 66 66 65 72 20 61 74 20 2a 70 70 4f 75 74  buffer at *ppOut
19a90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f   */.  char **ppO
19aa0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
19ab0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
19ac0 6c 6c 6f 63 65 64 20 72 65 73 75 6c 74 20 62 75  lloced result bu
19ad0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ffer */.){.  int
19ae0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b00 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19b10 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
19b20 64 65 72 20 2a 70 53 65 67 63 73 72 3b 20 20 20  der *pSegcsr;   
19b30 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 63   /* Seg-reader c
19b40 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74  ursor for this t
19b50 65 72 6d 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  erm */.  TermSel
19b60 65 63 74 20 74 73 63 3b 20 20 20 20 20 20 20 20  ect tsc;        
19b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
19b80 63 74 20 66 6f 72 20 70 61 69 72 2d 77 69 73 65  ct for pair-wise
19b90 20 64 6f 63 6c 69 73 74 20 6d 65 72 67 69 6e 67   doclist merging
19ba0 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c   */.  Fts3SegFil
19bb0 74 65 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20  ter filter;     
19bc0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
19bd0 20 74 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e   term filter con
19be0 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20  figuration */.. 
19bf0 20 70 53 65 67 63 73 72 20 3d 20 70 54 6f 6b 2d   pSegcsr = pTok-
19c00 3e 70 53 65 67 63 73 72 3b 0a 20 20 6d 65 6d 73  >pSegcsr;.  mems
19c10 65 74 28 26 74 73 63 2c 20 30 2c 20 73 69 7a 65  et(&tsc, 0, size
19c20 6f 66 28 54 65 72 6d 53 65 6c 65 63 74 29 29 3b  of(TermSelect));
19c30 0a 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ..  filter.flags
19c40 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
19c50 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 7c 20 46  IGNORE_EMPTY | F
19c60 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55  TS3_SEGMENT_REQU
19c70 49 52 45 5f 50 4f 53 0a 20 20 20 20 20 20 20 20  IRE_POS.        
19c80 7c 20 28 70 54 6f 6b 2d 3e 69 73 50 72 65 66 69  | (pTok->isPrefi
19c90 78 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  x ? FTS3_SEGMENT
19ca0 5f 50 52 45 46 49 58 20 3a 20 30 29 0a 20 20 20  _PREFIX : 0).   
19cb0 20 20 20 20 20 7c 20 28 70 54 6f 6b 2d 3e 62 46       | (pTok->bF
19cc0 69 72 73 74 20 3f 20 46 54 53 33 5f 53 45 47 4d  irst ? FTS3_SEGM
19cd0 45 4e 54 5f 46 49 52 53 54 20 3a 20 30 29 0a 20  ENT_FIRST : 0). 
19ce0 20 20 20 20 20 20 20 7c 20 28 69 43 6f 6c 75 6d         | (iColum
19cf0 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 46  n<p->nColumn ? F
19d00 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
19d10 4d 4e 5f 46 49 4c 54 45 52 20 3a 20 30 29 3b 0a  MN_FILTER : 0);.
19d20 20 20 66 69 6c 74 65 72 2e 69 43 6f 6c 20 3d 20    filter.iCol = 
19d30 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66 69 6c 74 65  iColumn;.  filte
19d40 72 2e 7a 54 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e  r.zTerm = pTok->
19d50 7a 3b 0a 20 20 66 69 6c 74 65 72 2e 6e 54 65 72  z;.  filter.nTer
19d60 6d 20 3d 20 70 54 6f 6b 2d 3e 6e 3b 0a 0a 20 20  m = pTok->n;..  
19d70 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
19d80 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70  SegReaderStart(p
19d90 2c 20 70 53 65 67 63 73 72 2c 20 26 66 69 6c 74  , pSegcsr, &filt
19da0 65 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  er);.  while( SQ
19db0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
19dc0 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d    && SQLITE_ROW=
19dd0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  =(rc = sqlite3Ft
19de0 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
19df0 70 2c 20 70 53 65 67 63 73 72 29 29 20 0a 20 20  p, pSegcsr)) .  
19e00 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
19e10 54 65 72 6d 53 65 6c 65 63 74 4d 65 72 67 65 28  TermSelectMerge(
19e20 70 2c 20 26 74 73 63 2c 20 70 53 65 67 63 73 72  p, &tsc, pSegcsr
19e30 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 53 65 67  ->aDoclist, pSeg
19e40 63 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a  csr->nDoclist);.
19e50 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
19e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19e70 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65 6c  rc = fts3TermSel
19e80 65 63 74 46 69 6e 69 73 68 4d 65 72 67 65 28 70  ectFinishMerge(p
19e90 2c 20 26 74 73 63 29 3b 0a 20 20 7d 0a 20 20 69  , &tsc);.  }.  i
19ea0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19eb0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d   ){.    *ppOut =
19ec0 20 74 73 63 2e 61 61 4f 75 74 70 75 74 5b 30 5d   tsc.aaOutput[0]
19ed0 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 74  ;.    *pnOut = t
19ee0 73 63 2e 61 6e 4f 75 74 70 75 74 5b 30 5d 3b 0a  sc.anOutput[0];.
19ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19f00 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
19f10 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 74   i<SizeofArray(t
19f20 73 63 2e 61 61 4f 75 74 70 75 74 29 3b 20 69 2b  sc.aaOutput); i+
19f30 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
19f40 33 5f 66 72 65 65 28 74 73 63 2e 61 61 4f 75 74  3_free(tsc.aaOut
19f50 70 75 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  put[i]);.    }. 
19f60 20 7d 0a 0a 20 20 66 74 73 33 53 65 67 52 65 61   }..  fts3SegRea
19f70 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70 53  derCursorFree(pS
19f80 65 67 63 73 72 29 3b 0a 20 20 70 54 6f 6b 2d 3e  egcsr);.  pTok->
19f90 70 53 65 67 63 73 72 20 3d 20 30 3b 0a 20 20 72  pSegcsr = 0;.  r
19fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19fb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19fc0 20 63 6f 75 6e 74 73 20 74 68 65 20 74 6f 74 61   counts the tota
19fd0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 69  l number of doci
19fe0 64 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ds in the doclis
19ff0 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 62  t stored.** in b
1a000 75 66 66 65 72 20 61 4c 69 73 74 5b 5d 2c 20 73  uffer aList[], s
1a010 69 7a 65 20 6e 4c 69 73 74 20 62 79 74 65 73 2e  ize nList bytes.
1a020 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
1a030 50 6f 73 6c 69 73 74 20 61 72 67 75 6d 65 6e 74  Poslist argument
1a040 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
1a050 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1a060 74 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  t the doclist.**
1a070 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 73 69   contains a posi
1a080 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 6c 6c 6f 77  tion-list follow
1a090 69 6e 67 20 65 61 63 68 20 64 6f 63 69 64 2e 20  ing each docid. 
1a0a0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
1a0b0 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68 61 74   assumed.** that
1a0c0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
1a0d0 73 69 6d 70 6c 79 20 61 20 6c 69 73 74 20 6f 66  simply a list of
1a0e0 20 64 6f 63 69 64 73 20 73 74 6f 72 65 64 20 61   docids stored a
1a0f0 73 20 64 65 6c 74 61 20 65 6e 63 6f 64 65 64 20  s delta encoded 
1a100 0a 2a 2a 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a  .** varints..*/.
1a110 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
1a120 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64  oclistCountDocid
1a130 73 28 63 68 61 72 20 2a 61 4c 69 73 74 2c 20 69  s(char *aList, i
1a140 6e 74 20 6e 4c 69 73 74 29 7b 0a 20 20 69 6e 74  nt nList){.  int
1a150 20 6e 44 6f 63 20 3d 20 30 3b 20 20 20 20 20 20   nDoc = 0;      
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a170 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1a180 20 20 69 66 28 20 61 4c 69 73 74 20 29 7b 0a 20    if( aList ){. 
1a190 20 20 20 63 68 61 72 20 2a 61 45 6e 64 20 3d 20     char *aEnd = 
1a1a0 26 61 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 20 20  &aList[nList];  
1a1b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
1a1c0 6e 65 20 62 79 74 65 20 61 66 74 65 72 20 45 4f  ne byte after EO
1a1d0 46 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 70  F */.    char *p
1a1e0 20 3d 20 61 4c 69 73 74 3b 20 20 20 20 20 20 20   = aList;       
1a1f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1a200 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1a210 3c 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e  <aEnd ){.      n
1a220 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  Doc++;.      whi
1a230 6c 65 28 20 28 2a 70 2b 2b 29 26 30 78 38 30 20  le( (*p++)&0x80 
1a240 29 3b 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 64  );     /* Skip d
1a250 6f 63 69 64 20 76 61 72 69 6e 74 20 2a 2f 0a 20  ocid varint */. 
1a260 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74       fts3Poslist
1a270 43 6f 70 79 28 30 2c 20 26 70 29 3b 20 20 20 2f  Copy(0, &p);   /
1a280 2a 20 53 6b 69 70 20 6f 76 65 72 20 70 6f 73 69  * Skip over posi
1a290 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
1a2a0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1a2b0 20 6e 44 6f 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nDoc;.}../*.** 
1a2c0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
1a2d0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
1a2e0 6f 77 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ow in the %_cont
1a2f0 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
1a300 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  * matches the se
1a310 61 72 63 68 20 63 72 69 74 65 72 69 61 2e 20 20  arch criteria.  
1a320 46 6f 72 20 61 20 4d 41 54 43 48 20 73 65 61 72  For a MATCH sear
1a330 63 68 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ch, this will be
1a340 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 72 6f 77  .** the next row
1a350 20 74 68 61 74 20 6d 61 74 63 68 65 73 2e 20 46   that matches. F
1a360 6f 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  or a full-table 
1a370 73 63 61 6e 2c 20 74 68 69 73 20 77 69 6c 6c 20  scan, this will 
1a380 62 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 74 68 65  be.** simply the
1a390 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
1a3a0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
1a3b0 2e 20 20 46 6f 72 20 61 20 64 6f 63 69 64 20 6c  .  For a docid l
1a3c0 6f 6f 6b 75 70 2c 0a 2a 2a 20 74 68 69 73 20 72  ookup,.** this r
1a3d0 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 65  outine simply se
1a3e0 74 73 20 74 68 65 20 45 4f 46 20 66 6c 61 67 2e  ts the EOF flag.
1a3f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1a400 4c 49 54 45 5f 4f 4b 20 69 66 20 6e 6f 74 68 69  LITE_OK if nothi
1a410 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
1a420 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a430 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66  urned.** even if
1a440 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
1a450 2d 66 69 6c 65 2e 20 20 54 68 65 20 66 74 73 33  -file.  The fts3
1a460 45 6f 66 4d 65 74 68 6f 64 28 29 20 77 69 6c 6c  EofMethod() will
1a470 20 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 73 75   be called.** su
1a480 62 73 65 71 75 65 6e 74 6c 79 20 74 6f 20 64 65  bsequently to de
1a490 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
1a4a0 6f 72 20 6e 6f 74 20 61 6e 20 45 4f 46 20 77 61  or not an EOF wa
1a4b0 73 20 68 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s hit..*/.static
1a4c0 20 69 6e 74 20 66 74 73 33 4e 65 78 74 4d 65 74   int fts3NextMet
1a4d0 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
1a4e0 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1a4f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
1a500 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
1a510 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
1a520 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1a530 43 73 72 2d 3e 65 53 65 61 72 63 68 3d 3d 46 54  Csr->eSearch==FT
1a540 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20  S3_DOCID_SEARCH 
1a550 7c 7c 20 70 43 73 72 2d 3e 65 53 65 61 72 63 68  || pCsr->eSearch
1a560 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  ==FTS3_FULLSCAN_
1a570 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66  SEARCH ){.    if
1a580 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
1a590 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
1a5a0 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
1a5b0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31   pCsr->isEof = 1
1a5c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a5d0 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
1a5e0 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 65 6c  >pStmt);.    }el
1a5f0 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  se{.      pCsr->
1a600 69 50 72 65 76 49 64 20 3d 20 73 71 6c 69 74 65  iPrevId = sqlite
1a610 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1a620 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
1a630 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a640 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  E_OK;.    }.  }e
1a650 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
1a660 73 33 45 76 61 6c 4e 65 78 74 28 28 46 74 73 33  s3EvalNext((Fts3
1a670 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1a680 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
1a690 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70   ((Fts3Table *)p
1a6a0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
1a6b0 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29  ->pSegments==0 )
1a6c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a6d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a6e0 6f 77 69 6e 67 20 61 72 65 20 63 6f 70 69 65 64  owing are copied
1a6f0 20 66 72 6f 6d 20 73 71 6c 69 74 65 49 6e 74 2e   from sqliteInt.
1a700 68 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  h..**.** Constan
1a710 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  ts for the large
1a720 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74 20  st and smallest 
1a730 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74 20  possible 64-bit 
1a740 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e  signed integers.
1a750 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73  .** These macros
1a760 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
1a770 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
1a780 6f 6e 20 62 6f 74 68 20 33 32 2d 62 69 74 20 61  on both 32-bit a
1a790 6e 64 20 36 34 2d 62 69 74 0a 2a 2a 20 63 6f 6d  nd 64-bit.** com
1a7a0 70 69 6c 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  pilers..*/.#ifnd
1a7b0 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
1a7c0 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  MATION.# define 
1a7d0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 20 28  LARGEST_INT64  (
1a7e0 30 78 66 66 66 66 66 66 66 66 7c 28 28 28 73 71  0xffffffff|(((sq
1a7f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 66  lite3_int64)0x7f
1a800 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a 23 20  ffffff)<<32)).# 
1a810 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54 5f  define SMALLEST_
1a820 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74 65 33  INT64 (((sqlite3
1a830 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c 41 52  _int64)-1) - LAR
1a840 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65 6e 64  GEST_INT64).#end
1a850 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1a860 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66   numeric type of
1a870 20 61 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 69   argument pVal i
1a880 73 20 22 69 6e 74 65 67 65 72 22 2c 20 74 68 65  s "integer", the
1a890 6e 20 72 65 74 75 72 6e 20 69 74 0a 2a 2a 20 63  n return it.** c
1a8a0 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 36 34  onverted to a 64
1a8b0 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1a8c0 67 65 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ger. Otherwise, 
1a8d0 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  return a copy of
1a8e0 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 70  .** the second p
1a8f0 61 72 61 6d 65 74 65 72 2c 20 69 44 65 66 61 75  arameter, iDefau
1a900 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  lt..*/.static sq
1a910 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 73 33  lite3_int64 fts3
1a920 44 6f 63 69 64 52 61 6e 67 65 28 73 71 6c 69 74  DocidRange(sqlit
1a930 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
1a940 69 36 34 20 69 44 65 66 61 75 6c 74 29 7b 0a 20  i64 iDefault){. 
1a950 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
1a960 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
1a970 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
1a980 69 63 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ic_type(pVal);. 
1a990 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
1a9a0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
1a9b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1a9c0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1a9d0 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
1a9e0 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 65 66 61  }.  return iDefa
1a9f0 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
1aa00 69 73 20 69 73 20 74 68 65 20 78 46 69 6c 74 65  is is the xFilte
1aa10 72 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  r interface for 
1aa20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1aa30 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76  e.  See.** the v
1aa40 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69  irtual table xFi
1aa50 6c 74 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75  lter method docu
1aa60 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64  mentation for ad
1aa70 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f  ditional.** info
1aa80 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
1aa90 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 46  f idxNum==FTS3_F
1aaa0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 74  ULLSCAN_SEARCH t
1aab0 68 65 6e 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  hen do a full ta
1aac0 62 6c 65 20 73 63 61 6e 20 61 67 61 69 6e 73 74  ble scan against
1aad0 0a 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  .** the %_conten
1aae0 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  t table..**.** I
1aaf0 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 44  f idxNum==FTS3_D
1ab00 4f 43 49 44 5f 53 45 41 52 43 48 20 74 68 65 6e  OCID_SEARCH then
1ab10 20 64 6f 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b   do a docid look
1ab20 75 70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  up for a single 
1ab30 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
1ab40 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1ab50 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64 78 4e 75 6d  .**.** If idxNum
1ab60 3e 3d 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f  >=FTS3_FULLTEXT_
1ab70 53 45 41 52 43 48 20 74 68 65 6e 20 75 73 65 20  SEARCH then use 
1ab80 74 68 65 20 66 75 6c 6c 20 74 65 78 74 20 69 6e  the full text in
1ab90 64 65 78 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 6c  dex.  The.** col
1aba0 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d  umn on the left-
1abb0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1abc0 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
1abd0 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d  is column.** num
1abe0 62 65 72 20 69 64 78 4e 75 6d 2d 46 54 53 33 5f  ber idxNum-FTS3_
1abf0 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2c  FULLTEXT_SEARCH,
1ac00 20 30 20 69 6e 64 65 78 65 64 2e 20 20 61 72 67   0 indexed.  arg
1ac10 76 5b 30 5d 20 69 73 20 74 68 65 20 72 69 67 68  v[0] is the righ
1ac20 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f  t-hand.** side o
1ac30 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
1ac40 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
1ac50 69 6e 74 20 66 74 73 33 46 69 6c 74 65 72 4d 65  int fts3FilterMe
1ac60 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1ac70 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1ac80 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  rsor,   /* The c
1ac90 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74  ursor used for t
1aca0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
1acb0 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20  nt idxNum,      
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1acd0 2a 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78  * Strategy index
1ace0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1acf0 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20   *idxStr,       
1ad00 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
1ad10 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ad40 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70  f elements in ap
1ad50 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Val */.  sqlite3
1ad60 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1ad70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
1ad80 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e  ments for the in
1ad90 64 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f  dexing scheme */
1ada0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1adb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
1adc0 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
1add0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ade0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  QL statement use
1adf0 64 20 74 6f 20 61 63 63 65 73 73 20 25 5f 63 6f  d to access %_co
1ae00 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntent */.  int e
1ae10 53 65 61 72 63 68 3b 0a 20 20 46 74 73 33 54 61  Search;.  Fts3Ta
1ae20 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
1ae30 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  ble *)pCursor->p
1ae40 56 74 61 62 3b 0a 20 20 46 74 73 33 43 75 72 73  Vtab;.  Fts3Curs
1ae50 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
1ae60 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1ae70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
1ae80 75 65 20 2a 70 43 6f 6e 73 20 3d 20 30 3b 20 20  ue *pCons = 0;  
1ae90 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 41 54 43       /* The MATC
1aea0 48 20 6f 72 20 72 6f 77 69 64 20 63 6f 6e 73 74  H or rowid const
1aeb0 72 61 69 6e 74 2c 20 69 66 20 61 6e 79 20 2a 2f  raint, if any */
1aec0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1aed0 20 2a 70 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20   *pLangid = 0;  
1aee0 20 20 20 2f 2a 20 54 68 65 20 22 6c 61 6e 67 69     /* The "langi
1aef0 64 20 3d 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e  d = ?" constrain
1af00 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 73  t, if any */.  s
1af10 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44  qlite3_value *pD
1af20 6f 63 69 64 47 65 20 3d 20 30 3b 20 20 20 20 2f  ocidGe = 0;    /
1af30 2a 20 54 68 65 20 22 64 6f 63 69 64 20 3e 3d 20  * The "docid >= 
1af40 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69  ?" constraint, i
1af50 66 20 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74  f any */.  sqlit
1af60 65 33 5f 76 61 6c 75 65 20 2a 70 44 6f 63 69 64  e3_value *pDocid
1af70 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68  Le = 0;    /* Th
1af80 65 20 22 64 6f 63 69 64 20 3c 3d 20 3f 22 20 63  e "docid <= ?" c
1af90 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 61 6e  onstraint, if an
1afa0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  y */.  int iIdx;
1afb0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1afc0 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20  ETER(idxStr);.  
1afd0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1afe0 28 6e 56 61 6c 29 3b 0a 0a 20 20 65 53 65 61 72  (nVal);..  eSear
1aff0 63 68 20 3d 20 28 69 64 78 4e 75 6d 20 26 20 30  ch = (idxNum & 0
1b000 78 30 30 30 30 46 46 46 46 29 3b 0a 20 20 61 73  x0000FFFF);.  as
1b010 73 65 72 74 28 20 65 53 65 61 72 63 68 3e 3d 30  sert( eSearch>=0
1b020 20 26 26 20 65 53 65 61 72 63 68 3c 3d 28 46 54   && eSearch<=(FT
1b030 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
1b040 43 48 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  CH+p->nColumn) )
1b050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1b060 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a  Segments==0 );..
1b070 20 20 2f 2a 20 43 6f 6c 6c 65 63 74 20 61 72 67    /* Collect arg
1b080 75 6d 65 6e 74 73 20 69 6e 74 6f 20 6c 6f 63 61  uments into loca
1b090 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  l variables */. 
1b0a0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 69 66 28   iIdx = 0;.  if(
1b0b0 20 65 53 65 61 72 63 68 21 3d 46 54 53 33 5f 46   eSearch!=FTS3_F
1b0c0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 29  ULLSCAN_SEARCH )
1b0d0 20 70 43 6f 6e 73 20 3d 20 61 70 56 61 6c 5b 69   pCons = apVal[i
1b0e0 49 64 78 2b 2b 5d 3b 0a 20 20 69 66 28 20 69 64  Idx++];.  if( id
1b0f0 78 4e 75 6d 20 26 20 46 54 53 33 5f 48 41 56 45  xNum & FTS3_HAVE
1b100 5f 4c 41 4e 47 49 44 20 29 20 70 4c 61 6e 67 69  _LANGID ) pLangi
1b110 64 20 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b  d = apVal[iIdx++
1b120 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20  ];.  if( idxNum 
1b130 26 20 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49  & FTS3_HAVE_DOCI
1b140 44 5f 47 45 20 29 20 70 44 6f 63 69 64 47 65 20  D_GE ) pDocidGe 
1b150 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b  = apVal[iIdx++];
1b160 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20  .  if( idxNum & 
1b170 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f  FTS3_HAVE_DOCID_
1b180 4c 45 20 29 20 70 44 6f 63 69 64 4c 65 20 3d 20  LE ) pDocidLe = 
1b190 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b 0a 20  apVal[iIdx++];. 
1b1a0 20 61 73 73 65 72 74 28 20 69 49 64 78 3d 3d 6e   assert( iIdx==n
1b1b0 56 61 6c 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  Val );..  /* In 
1b1c0 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
1b1d0 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 65  has been used be
1b1e0 66 6f 72 65 2c 20 63 6c 65 61 72 20 69 74 20 6e  fore, clear it n
1b1f0 6f 77 2e 20 2a 2f 0a 20 20 66 74 73 33 43 6c 65  ow. */.  fts3Cle
1b200 61 72 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  arCursor(pCsr);.
1b210 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 6f  .  /* Set the lo
1b220 77 65 72 20 61 6e 64 20 75 70 70 65 72 20 62 6f  wer and upper bo
1b230 75 6e 64 73 20 6f 6e 20 64 6f 63 69 64 73 20 74  unds on docids t
1b240 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 70 43  o return */.  pC
1b250 73 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 20 3d 20  sr->iMinDocid = 
1b260 66 74 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70  fts3DocidRange(p
1b270 44 6f 63 69 64 47 65 2c 20 53 4d 41 4c 4c 45 53  DocidGe, SMALLES
1b280 54 5f 49 4e 54 36 34 29 3b 0a 20 20 70 43 73 72  T_INT64);.  pCsr
1b290 2d 3e 69 4d 61 78 44 6f 63 69 64 20 3d 20 66 74  ->iMaxDocid = ft
1b2a0 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70 44 6f  s3DocidRange(pDo
1b2b0 63 69 64 4c 65 2c 20 4c 41 52 47 45 53 54 5f 49  cidLe, LARGEST_I
1b2c0 4e 54 36 34 29 3b 0a 0a 20 20 69 66 28 20 69 64  NT64);..  if( id
1b2d0 78 53 74 72 20 29 7b 0a 20 20 20 20 70 43 73 72  xStr ){.    pCsr
1b2e0 2d 3e 62 44 65 73 63 20 3d 20 28 69 64 78 53 74  ->bDesc = (idxSt
1b2f0 72 5b 30 5d 3d 3d 27 44 27 29 3b 0a 20 20 7d 65  r[0]=='D');.  }e
1b300 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 2d 3e 62  lse{.    pCsr->b
1b310 44 65 73 63 20 3d 20 70 2d 3e 62 44 65 73 63 49  Desc = p->bDescI
1b320 64 78 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e  dx;.  }.  pCsr->
1b330 65 53 65 61 72 63 68 20 3d 20 28 69 31 36 29 65  eSearch = (i16)e
1b340 53 65 61 72 63 68 3b 0a 0a 20 20 69 66 28 20 65  Search;..  if( e
1b350 53 65 61 72 63 68 21 3d 46 54 53 33 5f 44 4f 43  Search!=FTS3_DOC
1b360 49 44 5f 53 45 41 52 43 48 20 26 26 20 65 53 65  ID_SEARCH && eSe
1b370 61 72 63 68 21 3d 46 54 53 33 5f 46 55 4c 4c 53  arch!=FTS3_FULLS
1b380 43 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a 20 20  CAN_SEARCH ){.  
1b390 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 65 53 65    int iCol = eSe
1b3a0 61 72 63 68 2d 46 54 53 33 5f 46 55 4c 4c 54 45  arch-FTS3_FULLTE
1b3b0 58 54 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 63  XT_SEARCH;.    c
1b3c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
1b3d0 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y = (const char 
1b3e0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1b3f0 74 65 78 74 28 70 43 6f 6e 73 29 3b 0a 0a 20 20  text(pCons);..  
1b400 20 20 69 66 28 20 7a 51 75 65 72 79 3d 3d 30 20    if( zQuery==0 
1b410 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
1b420 5f 74 79 70 65 28 70 43 6f 6e 73 29 21 3d 53 51  _type(pCons)!=SQ
1b430 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
1b440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
1b460 20 20 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69 64     pCsr->iLangid
1b470 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1b480 61 6e 67 69 64 20 29 20 70 43 73 72 2d 3e 69 4c  angid ) pCsr->iL
1b490 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
1b4a0 76 61 6c 75 65 5f 69 6e 74 28 70 4c 61 6e 67 69  value_int(pLangi
1b4b0 64 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  d);..    assert(
1b4c0 20 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67   p->base.zErrMsg
1b4d0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1b4e0 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 50  sqlite3Fts3ExprP
1b4f0 61 72 73 65 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a  arse(p->pTokeniz
1b500 65 72 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69  er, pCsr->iLangi
1b510 64 2c 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 7a  d,.        p->az
1b520 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 62 46 74 73 34  Column, p->bFts4
1b530 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 69 43  , p->nColumn, iC
1b540 6f 6c 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  ol, zQuery, -1, 
1b550 26 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 0a 20  &pCsr->pExpr, . 
1b560 20 20 20 20 20 20 20 26 70 2d 3e 62 61 73 65 2e         &p->base.
1b570 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20  zErrMsg.    );. 
1b580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1b5a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1b5b0 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76 61      rc = fts3Eva
1b5c0 6c 53 74 61 72 74 28 70 43 73 72 29 3b 0a 20 20  lStart(pCsr);.  
1b5d0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1b5e0 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
1b5f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b600 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b610 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65 78  ;.    pCsr->pNex
1b620 74 49 64 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63  tId = pCsr->aDoc
1b630 6c 69 73 74 3b 0a 20 20 20 20 70 43 73 72 2d 3e  list;.    pCsr->
1b640 69 50 72 65 76 49 64 20 3d 20 30 3b 0a 20 20 7d  iPrevId = 0;.  }
1b650 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 20 61  ..  /* Compile a
1b660 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b670 74 20 66 6f 72 20 74 68 69 73 20 63 75 72 73 6f  t for this curso
1b680 72 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d 74 61  r. For a full-ta
1b690 62 6c 65 2d 73 63 61 6e 2c 20 74 68 65 0a 20 20  ble-scan, the.  
1b6a0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f 6f  ** statement loo
1b6b0 70 73 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72  ps through all r
1b6c0 6f 77 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e  ows of the %_con
1b6d0 74 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20  tent table. For 
1b6e0 61 0a 20 20 2a 2a 20 66 75 6c 6c 2d 74 65 78 74  a.  ** full-text
1b6f0 20 71 75 65 72 79 20 6f 72 20 64 6f 63 69 64 20   query or docid 
1b700 6c 6f 6f 6b 75 70 2c 20 74 68 65 20 73 74 61 74  lookup, the stat
1b710 65 6d 65 6e 74 20 72 65 74 72 69 65 76 65 73 20  ement retrieves 
1b720 61 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 72 6f  a single.  ** ro
1b730 77 20 62 79 20 64 6f 63 69 64 2e 0a 20 20 2a 2f  w by docid..  */
1b740 0a 20 20 69 66 28 20 65 53 65 61 72 63 68 3d 3d  .  if( eSearch==
1b750 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45  FTS3_FULLSCAN_SE
1b760 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66 28 20  ARCH ){.    if( 
1b770 70 44 6f 63 69 64 47 65 20 7c 7c 20 70 44 6f 63  pDocidGe || pDoc
1b780 69 64 4c 65 20 29 7b 0a 20 20 20 20 20 20 7a 53  idLe ){.      zS
1b790 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1b7a0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
1b7b0 22 53 45 4c 45 43 54 20 25 73 20 57 48 45 52 45  "SELECT %s WHERE
1b7c0 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 25   rowid BETWEEN %
1b7d0 6c 6c 64 20 41 4e 44 20 25 6c 6c 64 20 4f 52 44  lld AND %lld ORD
1b7e0 45 52 20 42 59 20 72 6f 77 69 64 20 25 73 22 2c  ER BY rowid %s",
1b7f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 52  .          p->zR
1b800 65 61 64 45 78 70 72 6c 69 73 74 2c 20 70 43 73  eadExprlist, pCs
1b810 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 2c 20 70 43  r->iMinDocid, pC
1b820 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 2c 0a 20  sr->iMaxDocid,. 
1b830 20 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e           (pCsr->
1b840 62 44 65 73 63 20 3f 20 22 44 45 53 43 22 20 3a  bDesc ? "DESC" :
1b850 20 22 41 53 43 22 29 0a 20 20 20 20 20 20 29 3b   "ASC").      );
1b860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b870 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1b880 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
1b890 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77   %s ORDER BY row
1b8a0 69 64 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20  id %s", .       
1b8b0 20 20 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c     p->zReadExprl
1b8c0 69 73 74 2c 20 28 70 43 73 72 2d 3e 62 44 65 73  ist, (pCsr->bDes
1b8d0 63 20 3f 20 22 44 45 53 43 22 20 3a 20 22 41 53  c ? "DESC" : "AS
1b8e0 43 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  C").      );.   
1b8f0 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20   }.    if( zSql 
1b900 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1b910 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33  lite3_prepare_v3
1b920 28 70 2d 3e 64 62 2c 7a 53 71 6c 2c 2d 31 2c 53  (p->db,zSql,-1,S
1b930 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45  QLITE_PREPARE_PE
1b940 52 53 49 53 54 45 4e 54 2c 26 70 43 73 72 2d 3e  RSISTENT,&pCsr->
1b950 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20  pStmt,0);.      
1b960 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1b970 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1b980 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b990 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1b9a0 7d 65 6c 73 65 20 69 66 28 20 65 53 65 61 72 63  }else if( eSearc
1b9b0 68 3d 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45  h==FTS3_DOCID_SE
1b9c0 41 52 43 48 20 29 7b 0a 20 20 20 20 72 63 20 3d  ARCH ){.    rc =
1b9d0 20 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 53   fts3CursorSeekS
1b9e0 74 6d 74 28 70 43 73 72 29 3b 0a 20 20 20 20 69  tmt(pCsr);.    i
1b9f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ba00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ba10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
1ba20 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31  e(pCsr->pStmt, 1
1ba30 2c 20 70 43 6f 6e 73 29 3b 0a 20 20 20 20 7d 0a  , pCons);.    }.
1ba40 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1ba50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1ba60 20 72 63 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66   rc;..  return f
1ba70 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28 70 43  ts3NextMethod(pC
1ba80 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ursor);.}../* .*
1ba90 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
1baa0 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  of method of the
1bab0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1bac0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
1bad0 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  s .** routine to
1bae0 20 66 69 6e 64 20 6f 75 74 20 69 66 20 69 74 20   find out if it 
1baf0 68 61 73 20 72 65 61 63 68 65 64 20 74 68 65 20  has reached the 
1bb00 65 6e 64 20 6f 66 20 61 20 72 65 73 75 6c 74 20  end of a result 
1bb10 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1bb20 6e 74 20 66 74 73 33 45 6f 66 4d 65 74 68 6f 64  nt fts3EofMethod
1bb30 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1bb40 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
1bb50 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1bb60 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f 72  sr = (Fts3Cursor
1bb70 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  *)pCursor;.  if(
1bb80 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 29 7b 0a   pCsr->isEof ){.
1bb90 20 20 20 20 66 74 73 33 43 6c 65 61 72 43 75 72      fts3ClearCur
1bba0 73 6f 72 28 70 43 73 72 29 3b 0a 20 20 20 20 70  sor(pCsr);.    p
1bbb0 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a  Csr->isEof = 1;.
1bbc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 73    }.  return pCs
1bbd0 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f 2a 20  r->isEof;.}../* 
1bbe0 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1bbf0 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20 54  xRowid method. T
1bc00 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63  he SQLite core c
1bc10 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1bc20 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76 65  e to.** retrieve
1bc30 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
1bc40 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1bc50 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1bc60 2e 20 66 74 73 33 0a 2a 2a 20 65 78 70 6f 73 65  . fts3.** expose
1bc70 73 20 25 5f 63 6f 6e 74 65 6e 74 2e 64 6f 63 69  s %_content.doci
1bc80 64 20 61 73 20 74 68 65 20 72 6f 77 69 64 20 66  d as the rowid f
1bc90 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
1bca0 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 77  able. The.** row
1bcb0 69 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  id should be wri
1bcc0 74 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e  tten to *pRowid.
1bcd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bce0 74 73 33 52 6f 77 69 64 4d 65 74 68 6f 64 28 73  ts3RowidMethod(s
1bcf0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
1bd00 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c  or *pCursor, sql
1bd10 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
1bd20 64 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72  d){.  Fts3Cursor
1bd30 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43 75   *pCsr = (Fts3Cu
1bd40 72 73 6f 72 20 2a 29 20 70 43 75 72 73 6f 72 3b  rsor *) pCursor;
1bd50 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73  .  *pRowid = pCs
1bd60 72 2d 3e 69 50 72 65 76 49 64 3b 0a 20 20 72 65  r->iPrevId;.  re
1bd70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bd80 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69  }../* .** This i
1bd90 73 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  s the xColumn me
1bda0 74 68 6f 64 2c 20 63 61 6c 6c 65 64 20 62 79 20  thod, called by 
1bdb0 53 51 4c 69 74 65 20 74 6f 20 72 65 71 75 65 73  SQLite to reques
1bdc0 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a  t a value from.*
1bdd0 2a 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  * the row that t
1bde0 68 65 20 73 75 70 70 6c 69 65 64 20 63 75 72 73  he supplied curs
1bdf0 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1be00 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  nts to..**.** If
1be10 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 69 43 6f 6c 20  :.**.**   (iCol 
1be20 3c 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 20  <  p->nColumn)  
1be30 20 2d 3e 20 54 68 65 20 76 61 6c 75 65 20 6f 66   -> The value of
1be40 20 74 68 65 20 69 43 6f 6c 27 74 68 20 75 73 65   the iCol'th use
1be50 72 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 28  r column..**   (
1be60 69 43 6f 6c 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75  iCol == p->nColu
1be70 6d 6e 29 20 20 20 2d 3e 20 4d 61 67 69 63 20 63  mn)   -> Magic c
1be80 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68 65 20 73  olumn with the s
1be90 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
1bea0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28 69 43 6f  table..**   (iCo
1beb0 6c 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  l == p->nColumn+
1bec0 31 29 20 2d 3e 20 44 6f 63 69 64 20 63 6f 6c 75  1) -> Docid colu
1bed0 6d 6e 0a 2a 2a 20 20 20 28 69 43 6f 6c 20 3d 3d  mn.**   (iCol ==
1bee0 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 29 20 2d   p->nColumn+2) -
1bef0 3e 20 4c 61 6e 67 69 64 20 63 6f 6c 75 6d 6e 0a  > Langid column.
1bf00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1bf10 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a  s3ColumnMethod(.
1bf20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
1bf30 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
1bf40 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
1bf50 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72  etrieve value fr
1bf60 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  om */.  sqlite3_
1bf70 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
1bf80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1bf90 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  xt for sqlite3_r
1bfa0 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c  esult_xxx() call
1bfb0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bfe0 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  of column to rea
1bff0 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  d value from */.
1c000 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1c010 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1c020 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1c030 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 43 75 72  ode */.  Fts3Cur
1c040 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
1c050 33 43 75 72 73 6f 72 20 2a 29 20 70 43 75 72 73  3Cursor *) pCurs
1c060 6f 72 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  or;.  Fts3Table 
1c070 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
1c080 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  *)pCursor->pVtab
1c090 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ;..  /* The colu
1c0a0 6d 6e 20 76 61 6c 75 65 20 73 75 70 70 6c 69 65  mn value supplie
1c0b0 64 20 62 79 20 53 51 4c 69 74 65 20 6d 75 73 74  d by SQLite must
1c0c0 20 62 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f   be in range. */
1c0d0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1c0e0 3d 30 20 26 26 20 69 43 6f 6c 3c 3d 70 2d 3e 6e  =0 && iCol<=p->n
1c0f0 43 6f 6c 75 6d 6e 2b 32 20 29 3b 0a 0a 20 20 73  Column+2 );..  s
1c100 77 69 74 63 68 28 20 69 43 6f 6c 2d 70 2d 3e 6e  witch( iCol-p->n
1c110 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 63 61  Column ){.    ca
1c120 73 65 20 30 3a 0a 20 20 20 20 20 20 2f 2a 20 54  se 0:.      /* T
1c130 68 65 20 73 70 65 63 69 61 6c 20 27 74 61 62 6c  he special 'tabl
1c140 65 2d 6e 61 6d 65 27 20 63 6f 6c 75 6d 6e 20 2a  e-name' column *
1c150 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
1c160 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72 28 70  result_pointer(p
1c170 43 74 78 2c 20 70 43 73 72 2c 20 22 66 74 73 33  Ctx, pCsr, "fts3
1c180 63 75 72 73 6f 72 22 2c 20 30 29 3b 0a 20 20 20  cursor", 0);.   
1c190 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1c1a0 61 73 65 20 31 3a 0a 20 20 20 20 20 20 2f 2a 20  ase 1:.      /* 
1c1b0 54 68 65 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e  The docid column
1c1c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1c1d0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
1c1e0 43 74 78 2c 20 70 43 73 72 2d 3e 69 50 72 65 76  Ctx, pCsr->iPrev
1c1f0 49 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Id);.      break
1c200 3b 0a 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  ;..    case 2:. 
1c210 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70       if( pCsr->p
1c220 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1c230 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1c240 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d  nt64(pCtx, pCsr-
1c250 3e 69 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 20  >iLangid);.     
1c260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c270 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4c 61  }else if( p->zLa
1c280 6e 67 75 61 67 65 69 64 3d 3d 30 20 29 7b 0a 20  nguageid==0 ){. 
1c290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
1c2a0 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
1c2b0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
1c2c0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
1c2d0 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1c2e0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
1c2f0 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1c300 67 68 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 0a 20  gh */.      }.. 
1c310 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1c320 20 20 2f 2a 20 41 20 75 73 65 72 20 63 6f 6c 75    /* A user colu
1c330 6d 6e 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  mn. Or, if this 
1c340 69 73 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  is a full-table 
1c350 73 63 61 6e 2c 20 70 6f 73 73 69 62 6c 79 20 74  scan, possibly t
1c360 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 6e 67  he.      ** lang
1c370 75 61 67 65 2d 69 64 20 63 6f 6c 75 6d 6e 2e 20  uage-id column. 
1c380 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 2e  Seek the cursor.
1c390 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66   */.      rc = f
1c3a0 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 30 2c  ts3CursorSeek(0,
1c3b0 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66   pCsr);.      if
1c3c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c3d0 26 26 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  && sqlite3_data_
1c3e0 63 6f 75 6e 74 28 70 43 73 72 2d 3e 70 53 74 6d  count(pCsr->pStm
1c3f0 74 29 2d 31 3e 69 43 6f 6c 20 29 7b 0a 20 20 20  t)-1>iCol ){.   
1c400 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1c410 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
1c420 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
1c430 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74 6d 74  alue(pCsr->pStmt
1c440 2c 20 69 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  , iCol+1));.    
1c450 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c460 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1c470 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43  ((Fts3Table *)pC
1c480 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d  sr->base.pVtab)-
1c490 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1c4a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c4b0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1c4c0 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70  ction is the imp
1c4d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1c4e0 68 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 62  he xUpdate callb
1c4f0 61 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  ack used by .** 
1c500 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62  FTS3 virtual tab
1c510 6c 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f 6b  les. It is invok
1c520 65 64 20 62 79 20 53 51 4c 69 74 65 20 65 61 63  ed by SQLite eac
1c530 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
1c540 74 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65  to be.** inserte
1c550 64 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64 65  d, updated or de
1c560 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
1c570 20 69 6e 74 20 66 74 73 33 55 70 64 61 74 65 4d   int fts3UpdateM
1c580 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
1c590 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20  _vtab *pVtab,   
1c5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
1c5b0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
1c5c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c5f0 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
1c600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1c610 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20  ue **apVal,     
1c620 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1c630 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1c640 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
1c650 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
1c660 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65  /* OUT: The affe
1c670 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65  cted (or effecte
1c680 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20  d) rowid */.){. 
1c690 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
1c6a0 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28  ts3UpdateMethod(
1c6b0 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70 56  pVtab, nArg, apV
1c6c0 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 7d 0a 0a  al, pRowid);.}..
1c6d0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1c6e0 74 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20  tion of xSync() 
1c6f0 6d 65 74 68 6f 64 2e 20 46 6c 75 73 68 20 74 68  method. Flush th
1c700 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1c710 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 0a  e pending-terms.
1c720 2a 2a 20 68 61 73 68 2d 74 61 62 6c 65 20 74 6f  ** hash-table to
1c730 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1c740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1c750 33 53 79 6e 63 4d 65 74 68 6f 64 28 73 71 6c 69  3SyncMethod(sqli
1c760 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
1c770 7b 0a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  {..  /* Followin
1c780 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
1c790 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
1c7a0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
1c7b0 74 68 65 20 69 6e 70 75 74 0a 20 20 2a 2a 20 73  the input.  ** s
1c7c0 65 67 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  egments are not 
1c7d0 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 73 75  completely consu
1c7e0 6d 65 64 20 28 74 68 65 20 75 73 75 61 6c 20 63  med (the usual c
1c7f0 61 73 65 29 2c 20 74 68 65 79 20 61 72 65 20 75  ase), they are u
1c800 70 64 61 74 65 64 0a 20 20 2a 2a 20 69 6e 20 70  pdated.  ** in p
1c810 6c 61 63 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  lace to remove t
1c820 68 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  he entries that 
1c830 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1c840 6e 20 6d 65 72 67 65 64 2e 20 54 68 69 73 0a 20  n merged. This. 
1c850 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 75 70 64   ** involves upd
1c860 61 74 69 6e 67 20 74 68 65 20 6c 65 61 66 20 62  ating the leaf b
1c870 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 74 61 69  lock that contai
1c880 6e 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ns the smallest 
1c890 75 6e 6d 65 72 67 65 64 0a 20 20 2a 2a 20 65 6e  unmerged.  ** en
1c8a0 74 72 79 20 61 6e 64 20 65 61 63 68 20 62 6c 6f  try and each blo
1c8b0 63 6b 20 28 69 66 20 61 6e 79 29 20 62 65 74 77  ck (if any) betw
1c8c0 65 65 6e 20 74 68 65 20 6c 65 61 66 20 61 6e 64  een the leaf and
1c8d0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
1c8e0 53 6f 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 68  So.  ** if the h
1c8f0 65 69 67 68 74 20 6f 66 20 74 68 65 20 69 6e 70  eight of the inp
1c900 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
1c910 65 73 20 69 73 20 4e 2c 20 61 6e 64 20 69 6e 70  es is N, and inp
1c920 75 74 20 73 65 67 6d 65 6e 74 73 0a 20 20 2a 2a  ut segments.  **
1c930 20 61 72 65 20 6d 65 72 67 65 64 20 65 69 67 68   are merged eigh
1c940 74 20 61 74 20 61 20 74 69 6d 65 2c 20 75 70 64  t at a time, upd
1c950 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ating the input 
1c960 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65 20  segments at the 
1c970 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 61 6e 20 69  end.  ** of an i
1c980 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
1c990 20 72 65 71 75 69 72 65 73 20 77 72 69 74 69 6e   requires writin
1c9a0 67 20 28 38 2a 28 31 2b 4e 29 29 20 62 6c 6f 63  g (8*(1+N)) bloc
1c9b0 6b 73 2e 20 4e 20 69 73 20 75 73 75 61 6c 6c 79  ks. N is usually
1c9c0 0a 20 20 2a 2a 20 73 6d 61 6c 6c 20 2d 20 6f 66  .  ** small - of
1c9d0 74 65 6e 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ten between 0 an
1c9e0 64 20 32 2e 20 53 6f 20 74 68 65 20 6f 76 65 72  d 2. So the over
1c9f0 68 65 61 64 20 6f 66 20 74 68 65 20 69 6e 63 72  head of the incr
1ca00 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 6d 65 72  emental.  ** mer
1ca10 67 65 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  ge is somewhere 
1ca20 62 65 74 77 65 65 6e 20 38 20 61 6e 64 20 32 34  between 8 and 24
1ca30 20 62 6c 6f 63 6b 73 2e 20 54 6f 20 61 76 6f 69   blocks. To avoi
1ca40 64 20 74 68 69 73 20 6f 76 65 72 68 65 61 64 0a  d this overhead.
1ca50 20 20 2a 2a 20 64 77 61 72 66 69 6e 67 20 74 68    ** dwarfing th
1ca60 65 20 61 63 74 75 61 6c 20 70 72 6f 64 75 63 74  e actual product
1ca70 69 76 65 20 77 6f 72 6b 20 61 63 63 6f 6d 70 6c  ive work accompl
1ca80 69 73 68 65 64 2c 20 74 68 65 20 69 6e 63 72 65  ished, the incre
1ca90 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a 20 20 2a  mental merge.  *
1caa0 2a 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  * is only attemp
1cab0 74 65 64 20 69 66 20 69 74 20 77 69 6c 6c 20 77  ted if it will w
1cac0 72 69 74 65 20 61 74 20 6c 65 61 73 74 20 36 34  rite at least 64
1cad0 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 20 48 65   leaf blocks. He
1cae0 6e 63 65 0a 20 20 2a 2a 20 6e 4d 69 6e 4d 65 72  nce.  ** nMinMer
1caf0 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  ge..  **.  ** Of
1cb00 20 63 6f 75 72 73 65 2c 20 75 70 64 61 74 69 6e   course, updatin
1cb10 67 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  g the input segm
1cb20 65 6e 74 73 20 61 6c 73 6f 20 69 6e 76 6f 6c 76  ents also involv
1cb30 65 73 20 64 65 6c 65 74 69 6e 67 20 61 20 62 75  es deleting a bu
1cb40 6e 63 68 0a 20 20 2a 2a 20 6f 66 20 62 6c 6f 63  nch.  ** of bloc
1cb50 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ks from the segm
1cb60 65 6e 74 73 20 74 61 62 6c 65 2e 20 42 75 74 20  ents table. But 
1cb70 74 68 69 73 20 69 73 20 6e 6f 74 20 63 6f 6e 73  this is not cons
1cb80 69 64 65 72 65 64 20 6f 76 65 72 68 65 61 64 0a  idered overhead.
1cb90 20 20 2a 2a 20 61 73 20 69 74 20 77 6f 75 6c 64    ** as it would
1cba0 20 61 6c 73 6f 20 62 65 20 72 65 71 75 69 72 65   also be require
1cbb0 64 20 62 79 20 61 20 63 72 69 73 69 73 2d 6d 65  d by a crisis-me
1cbc0 72 67 65 20 74 68 61 74 20 75 73 65 64 20 74 68  rge that used th
1cbd0 65 20 73 61 6d 65 20 69 6e 70 75 74 20 0a 20 20  e same input .  
1cbe0 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 20 20 2a  ** segments..  *
1cbf0 2f 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6e 4d  /.  const u32 nM
1cc00 69 6e 4d 65 72 67 65 20 3d 20 36 34 3b 20 20 20  inMerge = 64;   
1cc10 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61      /* Minimum a
1cc20 6d 6f 75 6e 74 20 6f 66 20 69 6e 63 72 2d 6d 65  mount of incr-me
1cc30 72 67 65 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a  rge work to do *
1cc40 2f 0a 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  /..  Fts3Table *
1cc50 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29  p = (Fts3Table*)
1cc60 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pVtab;.  int rc;
1cc70 0a 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69  .  i64 iLastRowi
1cc80 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
1cc90 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
1cca0 3e 64 62 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  >db);..  rc = sq
1ccb0 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1ccc0 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
1ccd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cce0 4f 4b 20 0a 20 20 20 26 26 20 70 2d 3e 6e 4c 65  OK .   && p->nLe
1ccf0 61 66 41 64 64 3e 28 6e 4d 69 6e 4d 65 72 67 65  afAdd>(nMinMerge
1cd00 2f 31 36 29 20 0a 20 20 20 26 26 20 70 2d 3e 6e  /16) .   && p->n
1cd10 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 26 26  Autoincrmerge &&
1cd20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1cd30 67 65 21 3d 30 78 66 66 0a 20 20 29 7b 0a 20 20  ge!=0xff.  ){.  
1cd40 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20    int mxLevel = 
1cd50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cd60 2f 2a 20 4d 61 78 69 6d 75 6d 20 72 65 6c 61 74  /* Maximum relat
1cd70 69 76 65 20 6c 65 76 65 6c 20 76 61 6c 75 65 20  ive level value 
1cd80 69 6e 20 64 62 20 2a 2f 0a 20 20 20 20 69 6e 74  in db */.    int
1cd90 20 41 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   A;             
1cda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1cdb0 63 72 2d 6d 65 72 67 65 20 70 61 72 61 6d 65 74  cr-merge paramet
1cdc0 65 72 20 41 20 2a 2f 0a 0a 20 20 20 20 72 63 20  er A */..    rc 
1cdd0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 78  = sqlite3Fts3Max
1cde0 4c 65 76 65 6c 28 70 2c 20 26 6d 78 4c 65 76 65  Level(p, &mxLeve
1cdf0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
1ce00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1ce10 20 6d 78 4c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20   mxLevel==0 );. 
1ce20 20 20 20 41 20 3d 20 70 2d 3e 6e 4c 65 61 66 41     A = p->nLeafA
1ce30 64 64 20 2a 20 6d 78 4c 65 76 65 6c 3b 0a 20 20  dd * mxLevel;.  
1ce40 20 20 41 20 2b 3d 20 28 41 2f 32 29 3b 0a 20 20    A += (A/2);.  
1ce50 20 20 69 66 28 20 41 3e 28 69 6e 74 29 6e 4d 69    if( A>(int)nMi
1ce60 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 73 71  nMerge ) rc = sq
1ce70 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
1ce80 67 65 28 70 2c 20 41 2c 20 70 2d 3e 6e 41 75 74  ge(p, A, p->nAut
1ce90 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20 7d  oincrmerge);.  }
1cea0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1ceb0 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
1cec0 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61    sqlite3_set_la
1ced0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
1cee0 70 2d 3e 64 62 2c 20 69 4c 61 73 74 52 6f 77 69  p->db, iLastRowi
1cef0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
1cf00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  .}../*.** If it 
1cf10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6b  is currently unk
1cf20 6e 6f 77 6e 20 77 68 65 74 68 65 72 20 6f 72 20  nown whether or 
1cf30 6e 6f 74 20 74 68 65 20 46 54 53 20 74 61 62 6c  not the FTS tabl
1cf40 65 20 68 61 73 20 61 6e 20 25 5f 73 74 61 74 0a  e has an %_stat.
1cf50 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 70 2d 3e  ** table (if p->
1cf60 62 48 61 73 53 74 61 74 3d 3d 32 29 2c 20 61 74  bHasStat==2), at
1cf70 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
1cf80 6e 65 20 74 68 69 73 20 28 73 65 74 20 70 2d 3e  ne this (set p->
1cf90 62 48 61 73 53 74 61 74 0a 2a 2a 20 74 6f 20 30  bHasStat.** to 0
1cfa0 20 6f 72 20 31 29 2e 20 52 65 74 75 72 6e 20 53   or 1). Return S
1cfb0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1cfc0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1cfd0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
1cfe0 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** if an error o
1cff0 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
1d000 20 69 6e 74 20 66 74 73 33 53 65 74 48 61 73 53   int fts3SetHasS
1d010 74 61 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70  tat(Fts3Table *p
1d020 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1d030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1d040 2d 3e 62 48 61 73 53 74 61 74 3d 3d 32 20 29 7b  ->bHasStat==2 ){
1d050 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 62 6c 20  .    char *zTbl 
1d060 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1d070 66 28 22 25 73 5f 73 74 61 74 22 2c 20 70 2d 3e  f("%s_stat", p->
1d080 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
1d090 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  zTbl ){.      in
1d0a0 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  t res = sqlite3_
1d0b0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1d0c0 61 64 61 74 61 28 70 2d 3e 64 62 2c 20 70 2d 3e  adata(p->db, p->
1d0d0 7a 44 62 2c 20 7a 54 62 6c 2c 20 30 2c 30 2c 30  zDb, zTbl, 0,0,0
1d0e0 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 73  ,0,0,0);.      s
1d0f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 62 6c  qlite3_free(zTbl
1d100 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 48 61 73  );.      p->bHas
1d110 53 74 61 74 20 3d 20 28 72 65 73 3d 3d 53 51 4c  Stat = (res==SQL
1d120 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 7d 65 6c  ITE_OK);.    }el
1d130 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1d140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1d150 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1d170 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1d180 42 65 67 69 6e 28 29 20 6d 65 74 68 6f 64 2e 20  Begin() method. 
1d190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d1a0 74 73 33 42 65 67 69 6e 4d 65 74 68 6f 64 28 73  ts3BeginMethod(s
1d1b0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1d1c0 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  ab){.  Fts3Table
1d1d0 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
1d1e0 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53 45  *)pVtab;.  UNUSE
1d1f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61  D_PARAMETER(pVta
1d200 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  b);.  assert( p-
1d210 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1d220 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50  .  assert( p->nP
1d230 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
1d240 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1d250 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 31 20 29  Transaction!=1 )
1d260 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1d270 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1d280 20 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   1 );.  TESTONLY
1d290 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74  ( p->mxSavepoint
1d2a0 20 3d 20 2d 31 3b 20 29 3b 0a 20 20 70 2d 3e 6e   = -1; );.  p->n
1d2b0 4c 65 61 66 41 64 64 20 3d 20 30 3b 0a 20 20 72  LeafAdd = 0;.  r
1d2c0 65 74 75 72 6e 20 66 74 73 33 53 65 74 48 61 73  eturn fts3SetHas
1d2d0 53 74 61 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat(p);.}../*.*
1d2e0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1d2f0 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29 20 6d 65   of xCommit() me
1d300 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20 61 20  thod. This is a 
1d310 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f 6e 74 65  no-op. The conte
1d320 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 65  nts of.** the pe
1d330 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
1d340 2d 74 61 62 6c 65 20 68 61 76 65 20 61 6c 72 65  -table have alre
1d350 61 64 79 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ady been flushed
1d360 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1d370 73 65 0a 2a 2a 20 62 79 20 66 74 73 33 53 79 6e  se.** by fts3Syn
1d380 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a 73 74  cMethod()..*/.st
1d390 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6d  atic int fts3Com
1d3a0 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  mitMethod(sqlite
1d3b0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
1d3c0 20 20 54 45 53 54 4f 4e 4c 59 28 20 46 74 73 33    TESTONLY( Fts3
1d3d0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1d3e0 54 61 62 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a  Table*)pVtab );.
1d3f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d400 45 52 28 70 56 74 61 62 29 3b 0a 20 20 61 73 73  ER(pVtab);.  ass
1d410 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  ert( p->nPending
1d420 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Data==0 );.  ass
1d430 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  ert( p->inTransa
1d440 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73  ction!=0 );.  as
1d450 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d 65 6e  sert( p->pSegmen
1d460 74 73 3d 3d 30 20 29 3b 0a 20 20 54 45 53 54 4f  ts==0 );.  TESTO
1d470 4e 4c 59 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  NLY( p->inTransa
1d480 63 74 69 6f 6e 20 3d 20 30 20 29 3b 0a 20 20 54  ction = 0 );.  T
1d490 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d 78 53 61  ESTONLY( p->mxSa
1d4a0 76 65 70 6f 69 6e 74 20 3d 20 2d 31 3b 20 29 3b  vepoint = -1; );
1d4b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d4c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
1d4d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1d4e0 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73  xRollback(). Dis
1d4f0 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1d500 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
1d510 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74  -terms.** hash-t
1d520 61 62 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65  able. Any change
1d530 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
1d540 74 61 62 61 73 65 20 61 72 65 20 72 65 76 65 72  tabase are rever
1d550 74 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a  ted by SQLite..*
1d560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1d570 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28  3RollbackMethod(
1d580 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1d590 74 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  tab){.  Fts3Tabl
1d5a0 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
1d5b0 65 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  e*)pVtab;.  sqli
1d5c0 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
1d5d0 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 61  rmsClear(p);.  a
1d5e0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1d5f0 73 61 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  saction!=0 );.  
1d600 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 69 6e 54  TESTONLY( p->inT
1d610 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 20 29  ransaction = 0 )
1d620 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1d630 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 2d  >mxSavepoint = -
1d640 31 3b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  1; );.  return S
1d650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d660 2a 2a 20 57 68 65 6e 20 63 61 6c 6c 65 64 2c 20  ** When called, 
1d670 2a 70 70 50 6f 73 6c 69 73 74 20 6d 75 73 74 20  *ppPoslist must 
1d680 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74  point to the byt
1d690 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
1d6a0 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
1d6b0 6e 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e  nd of a position
1d6c0 2d 6c 69 73 74 2e 20 69 2e 65 2e 20 28 20 28 2a  -list. i.e. ( (*
1d6d0 70 70 50 6f 73 6c 69 73 74 29 5b 2d 31 5d 3d 3d  ppPoslist)[-1]==
1d6e0 50 4f 53 5f 45 4e 44 20 29 2e 20 54 68 69 73 20  POS_END ). This 
1d6f0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 6f 76 65  function.** move
1d700 73 20 2a 70 70 50 6f 73 6c 69 73 74 20 73 6f 20  s *ppPoslist so 
1d710 74 68 61 74 20 69 74 20 69 6e 73 74 65 61 64 20  that it instead 
1d720 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
1d730 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 0a  rst byte of the.
1d740 2a 2a 20 73 61 6d 65 20 70 6f 73 69 74 69 6f 6e  ** same position
1d750 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1d760 20 76 6f 69 64 20 66 74 73 33 52 65 76 65 72 73   void fts3Revers
1d770 65 50 6f 73 6c 69 73 74 28 63 68 61 72 20 2a 70  ePoslist(char *p
1d780 53 74 61 72 74 2c 20 63 68 61 72 20 2a 2a 70 70  Start, char **pp
1d790 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72  Poslist){.  char
1d7a0 20 2a 70 20 3d 20 26 28 2a 70 70 50 6f 73 6c 69   *p = &(*ppPosli
1d7b0 73 74 29 5b 2d 32 5d 3b 0a 20 20 63 68 61 72 20  st)[-2];.  char 
1d7c0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 6b 69  c = 0;..  /* Ski
1d7d0 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 73  p backwards pass
1d7e0 65 64 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ed any trailing 
1d7f0 30 78 30 30 20 62 79 74 65 73 20 61 64 64 65 64  0x00 bytes added
1d800 20 62 79 20 4e 65 61 72 54 72 69 6d 28 29 20 2a   by NearTrim() *
1d810 2f 0a 20 20 77 68 69 6c 65 28 20 70 3e 70 53 74  /.  while( p>pSt
1d820 61 72 74 20 26 26 20 28 63 3d 2a 70 2d 2d 29 3d  art && (c=*p--)=
1d830 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  =0 );..  /* Sear
1d840 63 68 20 62 61 63 6b 77 61 72 64 73 20 66 6f 72  ch backwards for
1d850 20 61 20 76 61 72 69 6e 74 20 77 69 74 68 20 76   a varint with v
1d860 61 6c 75 65 20 7a 65 72 6f 20 28 74 68 65 20 65  alue zero (the e
1d870 6e 64 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  nd of the previo
1d880 75 73 20 0a 20 20 2a 2a 20 70 6f 73 6c 69 73 74  us .  ** poslist
1d890 29 2e 20 54 68 69 73 20 69 73 20 61 6e 20 30 78  ). This is an 0x
1d8a0 30 30 20 62 79 74 65 20 70 72 65 63 65 64 65 64  00 byte preceded
1d8b0 20 62 79 20 73 6f 6d 65 20 62 79 74 65 20 74 68   by some byte th
1d8c0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1d8d0 20 68 61 76 65 20 74 68 65 20 30 78 38 30 20 62   have the 0x80 b
1d8e0 69 74 20 73 65 74 2e 20 20 2a 2f 0a 20 20 77 68  it set.  */.  wh
1d8f0 69 6c 65 28 20 70 3e 70 53 74 61 72 74 20 26 26  ile( p>pStart &&
1d900 20 28 2a 70 20 26 20 30 78 38 30 29 20 7c 20 63   (*p & 0x80) | c
1d910 20 29 7b 20 0a 20 20 20 20 63 20 3d 20 2a 70 2d   ){ .    c = *p-
1d920 2d 3b 20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  -; .  }.  assert
1d930 28 20 70 3d 3d 70 53 74 61 72 74 20 7c 7c 20 63  ( p==pStart || c
1d940 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20  ==0 );..  /* At 
1d950 74 68 69 73 20 70 6f 69 6e 74 20 70 20 70 6f 69  this point p poi
1d960 6e 74 73 20 74 6f 20 74 68 61 74 20 70 72 65 63  nts to that prec
1d970 65 64 69 6e 67 20 62 79 74 65 20 77 69 74 68 6f  eding byte witho
1d980 75 74 20 74 68 65 20 30 78 38 30 20 62 69 74 0a  ut the 0x80 bit.
1d990 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 6f 20    ** set. So to 
1d9a0 66 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f  find the start o
1d9b0 66 20 74 68 65 20 70 6f 73 6c 69 73 74 2c 20 73  f the poslist, s
1d9c0 6b 69 70 20 66 6f 72 77 61 72 64 20 32 20 62 79  kip forward 2 by
1d9d0 74 65 73 20 74 68 65 6e 0a 20 20 2a 2a 20 6f 76  tes then.  ** ov
1d9e0 65 72 20 61 20 76 61 72 69 6e 74 2e 20 0a 20 20  er a varint. .  
1d9f0 2a 2a 0a 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  **.  ** Normally
1da00 2e 20 54 68 65 20 6f 74 68 65 72 20 63 61 73 65  . The other case
1da10 20 69 73 20 74 68 61 74 20 70 3d 3d 70 53 74 61   is that p==pSta
1da20 72 74 20 61 6e 64 20 74 68 65 20 70 6f 73 6c 69  rt and the posli
1da30 73 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  st to return.  *
1da40 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  * is the first i
1da50 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 49  n the doclist. I
1da60 6e 20 74 68 69 73 20 63 61 73 65 20 64 6f 20 6e  n this case do n
1da70 6f 74 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20  ot skip forward 
1da80 32 20 62 79 74 65 73 2e 0a 20 20 2a 2a 20 54 68  2 bytes..  ** Th
1da90 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  e second part of
1daa0 20 74 68 65 20 69 66 20 63 6f 6e 64 69 74 69 6f   the if conditio
1dab0 6e 20 28 63 3d 3d 30 20 26 26 20 2a 70 70 50 6f  n (c==0 && *ppPo
1dac0 73 6c 69 73 74 3e 26 70 5b 32 5d 29 0a 20 20 2a  slist>&p[2]).  *
1dad0 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  * is required fo
1dae0 72 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  r cases where th
1daf0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
1db00 61 20 64 6f 63 6c 69 73 74 20 61 6e 64 20 74 68  a doclist and th
1db10 65 0a 20 20 2a 2a 20 64 6f 63 6c 69 73 74 20 69  e.  ** doclist i
1db20 73 20 65 6d 70 74 79 2e 20 46 6f 72 20 65 78 61  s empty. For exa
1db30 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 66 69 72  mple, if the fir
1db40 73 74 20 64 6f 63 69 64 20 69 73 20 31 30 2c 20  st docid is 10, 
1db50 61 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 74  a doclist.  ** t
1db60 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 3a  hat begins with:
1db70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 30 78 30  .  **.  **   0x0
1db80 41 20 30 78 30 30 20 3c 6e 65 78 74 20 64 6f 63  A 0x00 <next doc
1db90 69 64 20 64 65 6c 74 61 20 76 61 72 69 6e 74 3e  id delta varint>
1dba0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3e 70 53  .  */.  if( p>pS
1dbb0 74 61 72 74 20 7c 7c 20 28 63 3d 3d 30 20 26 26  tart || (c==0 &&
1dbc0 20 2a 70 70 50 6f 73 6c 69 73 74 3e 26 70 5b 32   *ppPoslist>&p[2
1dbd0 5d 29 20 29 7b 20 70 20 3d 20 26 70 5b 32 5d 3b  ]) ){ p = &p[2];
1dbe0 20 7d 0a 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b   }.  while( *p++
1dbf0 26 30 78 38 30 20 29 3b 0a 20 20 2a 70 70 50 6f  &0x80 );.  *ppPo
1dc00 73 6c 69 73 74 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  slist = p;.}../*
1dc10 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
1dc20 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
1dc30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1dc40 66 20 74 68 65 20 6f 76 65 72 6c 6f 61 64 65 64  f the overloaded
1dc50 20 73 6e 69 70 70 65 74 28 29 2c 0a 2a 2a 20 6f   snippet(),.** o
1dc60 66 66 73 65 74 73 28 29 20 61 6e 64 20 6f 70 74  ffsets() and opt
1dc70 69 6d 69 7a 65 28 29 20 53 51 4c 20 66 75 6e 63  imize() SQL func
1dc80 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tions..**.** If 
1dc90 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
1dca0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
1dcb0 67 75 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 62  gument is a blob
1dcc0 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 73 69 7a 65   of size.** size
1dcd0 6f 66 28 46 74 73 33 43 75 72 73 6f 72 2a 29 2c  of(Fts3Cursor*),
1dce0 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 62 20 63   then the blob c
1dcf0 6f 6e 74 65 6e 74 73 20 61 72 65 20 63 6f 70 69  ontents are copi
1dd00 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6f 75  ed to the .** ou
1dd10 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
1dd20 70 43 73 72 20 61 6e 64 20 53 51 4c 49 54 45 5f  pCsr and SQLITE_
1dd30 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1dd40 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1dd50 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
1dd60 73 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f 6e  s written to con
1dd70 74 65 78 74 20 70 43 6f 6e 74 65 78 74 20 61 6e  text pContext an
1dd80 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72  d SQLITE_ERROR r
1dd90 65 74 75 72 6e 65 64 2e 20 54 68 65 0a 2a 2a 20  eturned. The.** 
1dda0 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 76 69  string passed vi
1ddb0 61 20 7a 46 75 6e 63 20 69 73 20 75 73 65 64 20  a zFunc is used 
1ddc0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 65  as part of the e
1ddd0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
1dde0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1ddf0 46 75 6e 63 74 69 6f 6e 41 72 67 28 0a 20 20 73  FunctionArg(.  s
1de00 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1de10 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f  pContext,      /
1de20 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  * SQL function c
1de30 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
1de40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
1de50 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1de60 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61 6d   /* Function nam
1de70 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
1de80 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20  alue *pVal,     
1de90 20 20 20 20 20 20 20 2f 2a 20 61 72 67 76 5b 30         /* argv[0
1dea0 5d 20 70 61 73 73 65 64 20 74 6f 20 66 75 6e 63  ] passed to func
1deb0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 43 75  tion */.  Fts3Cu
1dec0 72 73 6f 72 20 2a 2a 70 70 43 73 72 20 20 20 20  rsor **ppCsr    
1ded0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1dee0 3a 20 53 74 6f 72 65 20 63 75 72 73 6f 72 20 68  : Store cursor h
1def0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 29 7b  andle here */.){
1df00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70  .  int rc;.  *pp
1df10 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f  Csr = (Fts3Curso
1df20 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1df30 5f 70 6f 69 6e 74 65 72 28 70 56 61 6c 2c 20 22  _pointer(pVal, "
1df40 66 74 73 33 63 75 72 73 6f 72 22 29 3b 0a 20 20  fts3cursor");.  
1df50 69 66 28 20 28 2a 70 70 43 73 72 29 21 3d 30 20  if( (*ppCsr)!=0 
1df60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1df70 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1df80 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
1df90 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1dfa0 28 22 69 6c 6c 65 67 61 6c 20 66 69 72 73 74 20  ("illegal first 
1dfb0 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c  argument to %s",
1dfc0 20 7a 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c   zFunc);.    sql
1dfd0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1dfe0 72 28 70 43 6f 6e 74 65 78 74 2c 20 7a 45 72 72  r(pContext, zErr
1dff0 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
1e000 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
1e010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1e020 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1e030 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e040 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1e050 66 20 74 68 65 20 73 6e 69 70 70 65 74 28 29 20  f the snippet() 
1e060 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54 53  function for FTS
1e070 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  3.*/.static void
1e080 20 66 74 73 33 53 6e 69 70 70 65 74 46 75 6e 63   fts3SnippetFunc
1e090 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1e0a0 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  ext *pContext,  
1e0b0 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 75      /* SQLite fu
1e0c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
1e0d0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ext */.  int nVa
1e0e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1e100 20 6f 66 20 61 70 56 61 6c 5b 5d 20 61 72 72 61   of apVal[] arra
1e110 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  y */.  sqlite3_v
1e120 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
1e130 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1e140 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1e150 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  ){.  Fts3Cursor 
1e160 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
1e170 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68       /* Cursor h
1e180 61 6e 64 6c 65 20 70 61 73 73 65 64 20 74 68 72  andle passed thr
1e190 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f  ough apVal[0] */
1e1a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e1b0 53 74 61 72 74 20 3d 20 22 3c 62 3e 22 3b 0a 20  Start = "<b>";. 
1e1c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
1e1d0 64 20 3d 20 22 3c 2f 62 3e 22 3b 0a 20 20 63 6f  d = "</b>";.  co
1e1e0 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 6c 69 70  nst char *zEllip
1e1f0 73 69 73 20 3d 20 22 3c 62 3e 2e 2e 2e 3c 2f 62  sis = "<b>...</b
1e200 3e 22 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  >";.  int iCol =
1e210 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   -1;.  int nToke
1e220 6e 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  n = 15;         
1e230 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
1e240 74 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  t number of toke
1e250 6e 73 20 69 6e 20 73 6e 69 70 70 65 74 20 2a 2f  ns in snippet */
1e260 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73  ..  /* There mus
1e270 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
1e280 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
1e290 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1e2a0 6f 6e 20 28 6f 74 68 65 72 77 69 73 65 0a 20 20  on (otherwise.  
1e2b0 2a 2a 20 74 68 65 20 6e 6f 6e 2d 6f 76 65 72 6c  ** the non-overl
1e2c0 6f 61 64 65 64 20 76 65 72 73 69 6f 6e 20 77 6f  oaded version wo
1e2d0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 63 61  uld have been ca
1e2e0 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  lled instead of 
1e2f0 74 68 69 73 20 6f 6e 65 29 2e 0a 20 20 2a 2f 0a  this one)..  */.
1e300 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3e 3d    assert( nVal>=
1e310 31 20 29 3b 0a 0a 20 20 69 66 28 20 6e 56 61 6c  1 );..  if( nVal
1e320 3e 36 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >6 ){.    sqlite
1e330 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
1e340 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
1e350 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20    "wrong number 
1e360 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
1e370 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65 74  function snippet
1e380 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ()", -1);.    re
1e390 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1e3a0 66 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28  fts3FunctionArg(
1e3b0 70 43 6f 6e 74 65 78 74 2c 20 22 73 6e 69 70 70  pContext, "snipp
1e3c0 65 74 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26  et", apVal[0], &
1e3d0 70 43 73 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  pCsr) ) return;.
1e3e0 0a 20 20 73 77 69 74 63 68 28 20 6e 56 61 6c 20  .  switch( nVal 
1e3f0 29 7b 0a 20 20 20 20 63 61 73 65 20 36 3a 20 6e  ){.    case 6: n
1e400 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  Token = sqlite3_
1e410 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1e420 35 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 35 3a  5]);.    case 5:
1e430 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iCol = sqlite3_
1e440 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1e450 34 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  4]);.    case 4:
1e460 20 7a 45 6c 6c 69 70 73 69 73 20 3d 20 28 63 6f   zEllipsis = (co
1e470 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1e480 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1e490 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 63 61 73 65  al[3]);.    case
1e4a0 20 33 3a 20 7a 45 6e 64 20 3d 20 28 63 6f 6e 73   3: zEnd = (cons
1e4b0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e4c0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e4d0 5b 32 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 32  [2]);.    case 2
1e4e0 3a 20 7a 53 74 61 72 74 20 3d 20 28 63 6f 6e 73  : zStart = (cons
1e4f0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e500 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e510 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [1]);.  }.  if( 
1e520 21 7a 45 6c 6c 69 70 73 69 73 20 7c 7c 20 21 7a  !zEllipsis || !z
1e530 45 6e 64 20 7c 7c 20 21 7a 53 74 61 72 74 20 29  End || !zStart )
1e540 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e550 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1e560 28 70 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  (pContext);.  }e
1e570 6c 73 65 20 69 66 28 20 6e 54 6f 6b 65 6e 3d 3d  lse if( nToken==
1e580 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1e590 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f  _result_text(pCo
1e5a0 6e 74 65 78 74 2c 20 22 22 2c 20 2d 31 2c 20 53  ntext, "", -1, S
1e5b0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1e5c0 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
1e5d0 45 5f 4f 4b 3d 3d 66 74 73 33 43 75 72 73 6f 72  E_OK==fts3Cursor
1e5e0 53 65 65 6b 28 70 43 6f 6e 74 65 78 74 2c 20 70  Seek(pContext, p
1e5f0 43 73 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Csr) ){.    sqli
1e600 74 65 33 46 74 73 33 53 6e 69 70 70 65 74 28 70  te3Fts3Snippet(p
1e610 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a  Context, pCsr, z
1e620 53 74 61 72 74 2c 20 7a 45 6e 64 2c 20 7a 45 6c  Start, zEnd, zEl
1e630 6c 69 70 73 69 73 2c 20 69 43 6f 6c 2c 20 6e 54  lipsis, iCol, nT
1e640 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
1e650 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1e660 6f 6e 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  on of the offset
1e670 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  s() function for
1e680 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20   FTS3.*/.static 
1e690 76 6f 69 64 20 66 74 73 33 4f 66 66 73 65 74 73  void fts3Offsets
1e6a0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e6b0 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
1e6c0 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
1e6d0 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1e6e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e6f0 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e710 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
1e720 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
1e730 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1e740 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1e750 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
1e760 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75  s */.){.  Fts3Cu
1e770 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
1e780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1e790 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65  sor handle passe
1e7a0 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b  d through apVal[
1e7b0 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  0] */..  UNUSED_
1e7c0 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
1e7d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1e7e0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 66 74 73  ==1 );.  if( fts
1e7f0 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f  3FunctionArg(pCo
1e800 6e 74 65 78 74 2c 20 22 6f 66 66 73 65 74 73 22  ntext, "offsets"
1e810 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73  , apVal[0], &pCs
1e820 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  r) ) return;.  a
1e830 73 73 65 72 74 28 20 70 43 73 72 20 29 3b 0a 20  ssert( pCsr );. 
1e840 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1e850 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 70  fts3CursorSeek(p
1e860 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29 20 29  Context, pCsr) )
1e870 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1e880 33 4f 66 66 73 65 74 73 28 70 43 6f 6e 74 65 78  3Offsets(pContex
1e890 74 2c 20 70 43 73 72 29 3b 0a 20 20 7d 0a 7d 0a  t, pCsr);.  }.}.
1e8a0 0a 2f 2a 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ./* .** Implemen
1e8b0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  tation of the sp
1e8c0 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a 65 28 29  ecial optimize()
1e8d0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54   function for FT
1e8e0 53 33 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  S3. This .** fun
1e8f0 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 61 6c 6c  ction merges all
1e900 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
1e910 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 73   database to a s
1e920 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  ingle segment..*
1e930 2a 20 45 78 61 6d 70 6c 65 20 75 73 61 67 65 20  * Example usage 
1e940 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  is:.**.**   SELE
1e950 43 54 20 6f 70 74 69 6d 69 7a 65 28 74 29 20 46  CT optimize(t) F
1e960 52 4f 4d 20 74 20 4c 49 4d 49 54 20 31 3b 0a 2a  ROM t LIMIT 1;.*
1e970 2a 0a 2a 2a 20 77 68 65 72 65 20 27 74 27 20 69  *.** where 't' i
1e980 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
1e990 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a   FTS3 table..*/.
1e9a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1e9b0 4f 70 74 69 6d 69 7a 65 46 75 6e 63 28 0a 20 20  OptimizeFunc(.  
1e9c0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e9d0 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1e9e0 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1e9f0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1ea00 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ea30 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1ea40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1ea50 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1ea60 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1ea70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1ea80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1eab0 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
1eac0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1ead0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1eae0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1eaf0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
1eb00 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
1eb10 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e     /* Cursor han
1eb20 64 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  dle passed throu
1eb30 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a  gh apVal[0] */..
1eb40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1eb50 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73 73  ER(nVal);..  ass
1eb60 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  ert( nVal==1 );.
1eb70 20 20 69 66 28 20 66 74 73 33 46 75 6e 63 74 69    if( fts3Functi
1eb80 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c 20  onArg(pContext, 
1eb90 22 6f 70 74 69 6d 69 7a 65 22 2c 20 61 70 56 61  "optimize", apVa
1eba0 6c 5b 30 5d 2c 20 26 70 43 75 72 73 6f 72 29 20  l[0], &pCursor) 
1ebb0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1ebc0 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 75  (Fts3Table *)pCu
1ebd0 72 73 6f 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  rsor->base.pVtab
1ebe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
1ebf0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1ec00 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 70 29 3b  Fts3Optimize(p);
1ec10 0a 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ..  switch( rc )
1ec20 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1ec30 45 5f 4f 4b 3a 0a 20 20 20 20 20 20 73 71 6c 69  E_OK:.      sqli
1ec40 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1ec50 70 43 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78  pContext, "Index
1ec60 20 6f 70 74 69 6d 69 7a 65 64 22 2c 20 2d 31 2c   optimized", -1,
1ec70 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1ec80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ec90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1eca0 4e 45 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NE:.      sqlite
1ecb0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
1ecc0 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78 20 61  ontext, "Index a
1ecd0 6c 72 65 61 64 79 20 6f 70 74 69 6d 61 6c 22 2c  lready optimal",
1ece0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1ecf0 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
1ed00 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1ed10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1ed20 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
1ed30 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  Context, rc);.  
1ed40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
1ed50 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1ed60 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  tation of the ma
1ed70 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69  tchinfo() functi
1ed80 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a 73  on for FTS3.*/.s
1ed90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4d  tatic void fts3M
1eda0 61 74 63 68 69 6e 66 6f 46 75 6e 63 28 0a 20 20  atchinfoFunc(.  
1edb0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1edc0 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1edd0 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1ede0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1edf0 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ee20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1ee30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1ee40 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1ee50 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1ee60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1ee70 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1ee80 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
1ee90 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64    /* Cursor hand
1eea0 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  le passed throug
1eeb0 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20  h apVal[0] */.  
1eec0 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20  assert( nVal==1 
1eed0 7c 7c 20 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20  || nVal==2 );.  
1eee0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66  if( SQLITE_OK==f
1eef0 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70  ts3FunctionArg(p
1ef00 43 6f 6e 74 65 78 74 2c 20 22 6d 61 74 63 68 69  Context, "matchi
1ef10 6e 66 6f 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20  nfo", apVal[0], 
1ef20 26 70 43 73 72 29 20 29 7b 0a 20 20 20 20 63 6f  &pCsr) ){.    co
1ef30 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
1ef40 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 6c   0;.    if( nVal
1ef50 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67  >1 ){.      zArg
1ef60 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1ef70 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1ef80 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
1ef90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1efa0 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 28 70 43  Fts3Matchinfo(pC
1efb0 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a 41  ontext, pCsr, zA
1efc0 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
1efd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1efe0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 78 46  mplements the xF
1eff0 69 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68  indFunction meth
1f000 6f 64 20 66 6f 72 20 74 68 65 20 46 54 53 33 0a  od for the FTS3.
1f010 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1f020 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f030 66 74 73 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  fts3FindFunction
1f040 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
1f050 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
1f060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
1f070 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
1f080 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f0b0 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1f0c0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f0d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1f0e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f0f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66  /* Name of SQL f
1f100 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1f110 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
1f120 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
1f130 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
1f140 2a 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75  *), /* OUT: Resu
1f150 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  lt */.  void **p
1f160 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
1f170 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
1f180 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
1f190 20 4f 76 65 72 6c 6f 61 64 65 64 20 7b 0a 20 20   Overloaded {.  
1f1a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1f1b0 61 6d 65 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a  ame;.    void (*
1f1c0 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
1f1d0 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
1f1e0 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20  te3_value**);.  
1f1f0 7d 20 61 4f 76 65 72 6c 6f 61 64 5b 5d 20 3d 20  } aOverload[] = 
1f200 7b 0a 20 20 20 20 7b 20 22 73 6e 69 70 70 65 74  {.    { "snippet
1f210 22 2c 20 66 74 73 33 53 6e 69 70 70 65 74 46 75  ", fts3SnippetFu
1f220 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 66 66  nc },.    { "off
1f230 73 65 74 73 22 2c 20 66 74 73 33 4f 66 66 73 65  sets", fts3Offse
1f240 74 73 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  tsFunc },.    { 
1f250 22 6f 70 74 69 6d 69 7a 65 22 2c 20 66 74 73 33  "optimize", fts3
1f260 4f 70 74 69 6d 69 7a 65 46 75 6e 63 20 7d 2c 0a  OptimizeFunc },.
1f270 20 20 20 20 7b 20 22 6d 61 74 63 68 69 6e 66 6f      { "matchinfo
1f280 22 2c 20 66 74 73 33 4d 61 74 63 68 69 6e 66 6f  ", fts3Matchinfo
1f290 46 75 6e 63 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  Func },.  };.  i
1f2a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f2c0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
1f2d0 62 6c 65 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  ble */..  UNUSED
1f2e0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61 62  _PARAMETER(pVtab
1f2f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f300 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f310 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f320 70 70 41 72 67 29 3b 0a 0a 20 20 66 6f 72 28 69  ppArg);..  for(i
1f330 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72 61  =0; i<SizeofArra
1f340 79 28 61 4f 76 65 72 6c 6f 61 64 29 3b 20 69 2b  y(aOverload); i+
1f350 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
1f360 6d 70 28 7a 4e 61 6d 65 2c 20 61 4f 76 65 72 6c  mp(zName, aOverl
1f370 6f 61 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  oad[i].zName)==0
1f380 20 29 7b 0a 20 20 20 20 20 20 2a 70 78 46 75 6e   ){.      *pxFun
1f390 63 20 3d 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d  c = aOverload[i]
1f3a0 2e 78 46 75 6e 63 3b 0a 20 20 20 20 20 20 72 65  .xFunc;.      re
1f3b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f3c0 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 66 75 6e 63 74  }..  /* No funct
1f3d0 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
1f3e0 66 69 65 64 20 6e 61 6d 65 20 77 61 73 20 66 6f  fied name was fo
1f3f0 75 6e 64 2e 20 52 65 74 75 72 6e 20 30 2e 20 2a  und. Return 0. *
1f400 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1f410 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1f420 61 74 69 6f 6e 20 6f 66 20 46 54 53 33 20 78 52  ation of FTS3 xR
1f430 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 52 65  ename method. Re
1f440 6e 61 6d 65 20 61 6e 20 66 74 73 33 20 74 61 62  name an fts3 tab
1f450 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1f460 74 20 66 74 73 33 52 65 6e 61 6d 65 4d 65 74 68  t fts3RenameMeth
1f470 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
1f480 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20  ab *pVtab,      
1f490 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1f4a0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1f4b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f4c0 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
1f4d0 20 20 20 2f 2a 20 4e 65 77 20 6e 61 6d 65 20 6f     /* New name o
1f4e0 66 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  f table */.){.  
1f4f0 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
1f500 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61  Fts3Table *)pVta
1f510 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
1f520 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
1f530 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1f540 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f550 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f570 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f580 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
1f590 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62   point it must b
1f5a0 65 20 6b 6e 6f 77 6e 20 69 66 20 74 68 65 20 25  e known if the %
1f5b0 5f 73 74 61 74 20 74 61 62 6c 65 20 65 78 69 73  _stat table exis
1f5c0 74 73 20 6f 72 20 6e 6f 74 2e 0a 20 20 2a 2a 20  ts or not..  ** 
1f5d0 53 6f 20 62 48 61 73 53 74 61 74 20 6d 61 79 20  So bHasStat may 
1f5e0 6e 6f 74 20 62 65 20 32 2e 20 20 2a 2f 0a 20 20  not be 2.  */.  
1f5f0 72 63 20 3d 20 66 74 73 33 53 65 74 48 61 73 53  rc = fts3SetHasS
1f600 74 61 74 28 70 29 3b 0a 20 20 0a 20 20 2f 2a 20  tat(p);.  .  /* 
1f610 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
1f620 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  he pending terms
1f630 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
1f640 20 65 6d 70 74 79 20 68 65 72 65 2e 20 54 68 69   empty here. Thi
1f650 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73  s is.  ** becaus
1f660 65 20 61 6e 20 22 41 4c 54 45 52 20 54 41 42 4c  e an "ALTER TABL
1f670 45 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 22 20  E RENAME TABLE" 
1f680 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65  statement inside
1f690 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1f6a0 20 20 2a 2a 20 61 6c 77 61 79 73 20 6f 70 65 6e    ** always open
1f6b0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  s a savepoint tr
1f6c0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 6e 64 20 74  ansaction. And t
1f6d0 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29 20  he xSavepoint() 
1f6e0 6d 65 74 68 6f 64 20 0a 20 20 2a 2a 20 66 6c 75  method .  ** flu
1f6f0 73 68 65 73 20 74 68 65 20 70 65 6e 64 69 6e 67  shes the pending
1f700 20 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 42 75   terms table. Bu
1f710 74 20 6c 65 61 76 65 20 74 68 65 20 28 6e 6f 2d  t leave the (no-
1f720 6f 70 29 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  op) call to.  **
1f730 20 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75   PendingTermsFlu
1f740 73 68 28 29 20 69 6e 20 69 6e 20 63 61 73 65 20  sh() in in case 
1f750 74 68 61 74 20 63 68 61 6e 67 65 73 2e 0a 20 20  that changes..  
1f760 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1f770 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1f780 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1f7a0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 65   = sqlite3Fts3Pe
1f7b0 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28  ndingTermsFlush(
1f7c0 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
1f7d0 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
1f7e0 20 29 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78   ){.    fts3DbEx
1f7f0 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
1f800 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
1f810 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 20  Q.'%q_content'  
1f820 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 63 6f  RENAME TO '%q_co
1f830 6e 74 65 6e 74 27 3b 22 2c 0a 20 20 20 20 20 20  ntent';",.      
1f840 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f850 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
1f860 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61   }..  if( p->bHa
1f870 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
1f880 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20  fts3DbExec(&rc, 
1f890 64 62 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52  db,.      "ALTER
1f8a0 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 64 6f   TABLE %Q.'%q_do
1f8b0 63 73 69 7a 65 27 20 20 52 45 4e 41 4d 45 20 54  csize'  RENAME T
1f8c0 4f 20 27 25 71 5f 64 6f 63 73 69 7a 65 27 3b 22  O '%q_docsize';"
1f8d0 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20  ,.      p->zDb, 
1f8e0 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a  p->zName, zName.
1f8f0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
1f900 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
1f910 20 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26      fts3DbExec(&
1f920 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 22 41  rc, db,.      "A
1f930 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25  LTER TABLE %Q.'%
1f940 71 5f 73 74 61 74 27 20 20 52 45 4e 41 4d 45 20  q_stat'  RENAME 
1f950 54 4f 20 27 25 71 5f 73 74 61 74 27 3b 22 2c 0a  TO '%q_stat';",.
1f960 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d        p->zDb, p-
1f970 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20  >zName, zName.  
1f980 20 20 29 3b 0a 20 20 7d 0a 20 20 66 74 73 33 44    );.  }.  fts3D
1f990 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
1f9a0 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20     "ALTER TABLE 
1f9b0 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
1f9c0 20 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73   RENAME TO '%q_s
1f9d0 65 67 6d 65 6e 74 73 27 3b 22 2c 0a 20 20 20 20  egments';",.    
1f9e0 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f9f0 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 66  , zName.  );.  f
1fa00 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
1fa10 62 2c 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  b,.    "ALTER TA
1fa20 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69  BLE %Q.'%q_segdi
1fa30 72 27 20 20 20 52 45 4e 41 4d 45 20 54 4f 20 27  r'   RENAME TO '
1fa40 25 71 5f 73 65 67 64 69 72 27 3b 22 2c 0a 20 20  %q_segdir';",.  
1fa50 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
1fa60 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20  me, zName.  );. 
1fa70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fa80 2a 0a 2a 2a 20 54 68 65 20 78 53 61 76 65 70 6f  *.** The xSavepo
1fa90 69 6e 74 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a  int() method..**
1faa0 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1fab0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
1fac0 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c  nding-terms tabl
1fad0 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  e to disk..*/.st
1fae0 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 61 76  atic int fts3Sav
1faf0 65 70 6f 69 6e 74 4d 65 74 68 6f 64 28 73 71 6c  epointMethod(sql
1fb00 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1fb10 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1fb20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1fb30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45  LITE_OK;.  UNUSE
1fb40 44 5f 50 41 52 41 4d 45 54 45 52 28 69 53 61 76  D_PARAMETER(iSav
1fb50 65 70 6f 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  epoint);.  asser
1fb60 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a  t( ((Fts3Table *
1fb70 29 70 56 74 61 62 29 2d 3e 69 6e 54 72 61 6e 73  )pVtab)->inTrans
1fb80 61 63 74 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65  action );.  asse
1fb90 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20  rt( ((Fts3Table 
1fba0 2a 29 70 56 74 61 62 29 2d 3e 6d 78 53 61 76 65  *)pVtab)->mxSave
1fbb0 70 6f 69 6e 74 20 3c 3d 20 69 53 61 76 65 70 6f  point <= iSavepo
1fbc0 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  int );.  TESTONL
1fbd0 59 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a  Y( ((Fts3Table *
1fbe0 29 70 56 74 61 62 29 2d 3e 6d 78 53 61 76 65 70  )pVtab)->mxSavep
1fbf0 6f 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e  oint = iSavepoin
1fc00 74 20 29 3b 0a 20 20 69 66 28 20 28 28 46 74 73  t );.  if( ((Fts
1fc10 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29 2d  3Table *)pVtab)-
1fc20 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e  >bIgnoreSavepoin
1fc30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
1fc40 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 28   fts3SyncMethod(
1fc50 70 56 74 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65  pVtab);.  }.  re
1fc60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1fc70 2a 20 54 68 65 20 78 52 65 6c 65 61 73 65 28 29  * The xRelease()
1fc80 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54   method..**.** T
1fc90 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1fca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1fcb0 73 33 52 65 6c 65 61 73 65 4d 65 74 68 6f 64 28  s3ReleaseMethod(
1fcc0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1fcd0 74 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f  tab, int iSavepo
1fce0 69 6e 74 29 7b 0a 20 20 54 45 53 54 4f 4e 4c 59  int){.  TESTONLY
1fcf0 28 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d  ( Fts3Table *p =
1fd00 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 56 74   (Fts3Table*)pVt
1fd10 61 62 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ab );.  UNUSED_P
1fd20 41 52 41 4d 45 54 45 52 28 69 53 61 76 65 70 6f  ARAMETER(iSavepo
1fd30 69 6e 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  int);.  UNUSED_P
1fd40 41 52 41 4d 45 54 45 52 28 70 56 74 61 62 29 3b  ARAMETER(pVtab);
1fd50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1fd60 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1fd70 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 78 53 61   assert( p->mxSa
1fd80 76 65 70 6f 69 6e 74 20 3e 3d 20 69 53 61 76 65  vepoint >= iSave
1fd90 70 6f 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f  point );.  TESTO
1fda0 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f  NLY( p->mxSavepo
1fdb0 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  int = iSavepoint
1fdc0 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  -1 );.  return S
1fdd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1fde0 2a 2a 20 54 68 65 20 78 52 6f 6c 6c 62 61 63 6b  ** The xRollback
1fdf0 54 6f 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  To() method..**.
1fe00 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  ** Discard the c
1fe10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
1fe20 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 74 61 62  ending terms tab
1fe30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fe40 74 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54 6f  t fts3RollbackTo
1fe50 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
1fe60 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20  tab *pVtab, int 
1fe70 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 46  iSavepoint){.  F
1fe80 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
1fe90 74 73 33 54 61 62 6c 65 2a 29 70 56 74 61 62 3b  ts3Table*)pVtab;
1fea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1feb0 54 45 52 28 69 53 61 76 65 70 6f 69 6e 74 29 3b  TER(iSavepoint);
1fec0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1fed0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1fee0 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d 78   TESTONLY( p->mx
1fef0 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53 61 76  Savepoint = iSav
1ff00 65 70 6f 69 6e 74 20 29 3b 0a 20 20 73 71 6c 69  epoint );.  sqli
1ff10 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
1ff20 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 72  rmsClear(p);.  r
1ff30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ff40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ff50 20 74 72 75 65 20 69 66 20 7a 4e 61 6d 65 20 69   true if zName i
1ff60 73 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20  s the extension 
1ff70 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 68  on one of the sh
1ff80 61 64 6f 77 20 74 61 62 6c 65 73 20 75 73 65 64  adow tables used
1ff90 0a 2a 2a 20 62 79 20 74 68 69 73 20 6d 6f 64 75  .** by this modu
1ffa0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ffb0 74 20 66 74 73 33 53 68 61 64 6f 77 4e 61 6d 65  t fts3ShadowName
1ffc0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
1ffd0 6d 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  me){.  static co
1ffe0 6e 73 74 20 63 68 61 72 20 2a 61 7a 4e 61 6d 65  nst char *azName
1fff0 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 63 6f 6e 74  [] = {.    "cont
20000 65 6e 74 22 2c 20 22 64 6f 63 73 69 7a 65 22 2c  ent", "docsize",
20010 20 22 73 65 67 64 69 72 22 2c 20 22 73 65 67 6d   "segdir", "segm
20020 65 6e 74 73 22 2c 20 22 73 74 61 74 22 2c 20 0a  ents", "stat", .
20030 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
20040 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
20050 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 4e 61 6d  ; i<sizeof(azNam
20060 65 29 2f 73 69 7a 65 6f 66 28 61 7a 4e 61 6d 65  e)/sizeof(azName
20070 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
20080 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
20090 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 7a 4e 61 6d  cmp(zName, azNam
200a0 65 5b 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72  e[i])==0 ) retur
200b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
200c0 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  n 0;.}..static c
200d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
200e0 75 6c 65 20 66 74 73 33 4d 6f 64 75 6c 65 20 3d  ule fts3Module =
200f0 20 7b 0a 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e   {.  /* iVersion
20100 20 20 20 20 20 20 2a 2f 20 33 2c 0a 20 20 2f 2a        */ 3,.  /*
20110 20 78 43 72 65 61 74 65 20 20 20 20 20 20 20 2a   xCreate       *
20120 2f 20 66 74 73 33 43 72 65 61 74 65 4d 65 74 68  / fts3CreateMeth
20130 6f 64 2c 0a 20 20 2f 2a 20 78 43 6f 6e 6e 65 63  od,.  /* xConnec
20140 74 20 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6f  t      */ fts3Co
20150 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 0a 20 20 2f  nnectMethod,.  /
20160 2a 20 78 42 65 73 74 49 6e 64 65 78 20 20 20 20  * xBestIndex    
20170 2a 2f 20 66 74 73 33 42 65 73 74 49 6e 64 65 78  */ fts3BestIndex
20180 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 44 69  Method,.  /* xDi
20190 73 63 6f 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74  sconnect   */ ft
201a0 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  s3DisconnectMeth
201b0 6f 64 2c 0a 20 20 2f 2a 20 78 44 65 73 74 72 6f  od,.  /* xDestro
201c0 79 20 20 20 20 20 20 2a 2f 20 66 74 73 33 44 65  y      */ fts3De
201d0 73 74 72 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 2f  stroyMethod,.  /
201e0 2a 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20  * xOpen         
201f0 2a 2f 20 66 74 73 33 4f 70 65 6e 4d 65 74 68 6f  */ fts3OpenMetho
20200 64 2c 0a 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20  d,.  /* xClose  
20210 20 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6c 6f        */ fts3Clo
20220 73 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  seMethod,.  /* x
20230 46 69 6c 74 65 72 20 20 20 20 20 20 20 2a 2f 20  Filter       */ 
20240 66 74 73 33 46 69 6c 74 65 72 4d 65 74 68 6f 64  fts3FilterMethod
20250 2c 0a 20 20 2f 2a 20 78 4e 65 78 74 20 20 20 20  ,.  /* xNext    
20260 20 20 20 20 20 2a 2f 20 66 74 73 33 4e 65 78 74       */ fts3Next
20270 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 45 6f  Method,.  /* xEo
20280 66 20 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74  f          */ ft
20290 73 33 45 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 2f  s3EofMethod,.  /
202a0 2a 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  * xColumn       
202b0 2a 2f 20 66 74 73 33 43 6f 6c 75 6d 6e 4d 65 74  */ fts3ColumnMet
202c0 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 77 69 64  hod,.  /* xRowid
202d0 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 52          */ fts3R
202e0 6f 77 69 64 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a  owidMethod,.  /*
202f0 20 78 55 70 64 61 74 65 20 20 20 20 20 20 20 2a   xUpdate       *
20300 2f 20 66 74 73 33 55 70 64 61 74 65 4d 65 74 68  / fts3UpdateMeth
20310 6f 64 2c 0a 20 20 2f 2a 20 78 42 65 67 69 6e 20  od,.  /* xBegin 
20320 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 42 65         */ fts3Be
20330 67 69 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  ginMethod,.  /* 
20340 78 53 79 6e 63 20 20 20 20 20 20 20 20 20 2a 2f  xSync         */
20350 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 2c   fts3SyncMethod,
20360 0a 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 20 20  .  /* xCommit   
20370 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6d 6d 69      */ fts3Commi
20380 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52  tMethod,.  /* xR
20390 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a 2f 20 66  ollback     */ f
203a0 74 73 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f  ts3RollbackMetho
203b0 64 2c 0a 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e  d,.  /* xFindFun
203c0 63 74 69 6f 6e 20 2a 2f 20 66 74 73 33 46 69 6e  ction */ fts3Fin
203d0 64 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c  dFunctionMethod,
203e0 0a 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f  .  /* xRename */
203f0 20 20 20 20 20 20 20 66 74 73 33 52 65 6e 61 6d         fts3Renam
20400 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53  eMethod,.  /* xS
20410 61 76 65 70 6f 69 6e 74 20 20 20 20 2a 2f 20 66  avepoint    */ f
20420 74 73 33 53 61 76 65 70 6f 69 6e 74 4d 65 74 68  ts3SavepointMeth
20430 6f 64 2c 0a 20 20 2f 2a 20 78 52 65 6c 65 61 73  od,.  /* xReleas
20440 65 20 20 20 20 20 20 2a 2f 20 66 74 73 33 52 65  e      */ fts3Re
20450 6c 65 61 73 65 4d 65 74 68 6f 64 2c 0a 20 20 2f  leaseMethod,.  /
20460 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 20 20  * xRollbackTo   
20470 2a 2f 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54  */ fts3RollbackT
20480 6f 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53  oMethod,.  /* xS
20490 68 61 64 6f 77 4e 61 6d 65 20 20 20 2a 2f 20 66  hadowName   */ f
204a0 74 73 33 53 68 61 64 6f 77 4e 61 6d 65 2c 0a 7d  ts3ShadowName,.}
204b0 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ;../*.** This fu
204c0 6e 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74  nction is regist
204d0 65 72 65 64 20 61 73 20 74 68 65 20 6d 6f 64 75  ered as the modu
204e0 6c 65 20 64 65 73 74 72 75 63 74 6f 72 20 28 63  le destructor (c
204f0 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 0a 2a 2a  alled when an.**
20500 20 46 54 53 33 20 65 6e 61 62 6c 65 64 20 64 61   FTS3 enabled da
20510 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20520 6e 20 69 73 20 63 6c 6f 73 65 64 29 2e 20 49 74  n is closed). It
20530 20 66 72 65 65 73 20 74 68 65 20 6d 65 6d 6f 72   frees the memor
20540 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 66  y.** allocated f
20550 6f 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  or the tokenizer
20560 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a   hash table..*/.
20570 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 73 68  static void hash
20580 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70 29  Destroy(void *p)
20590 7b 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70 48  {.  Fts3Hash *pH
205a0 61 73 68 20 3d 20 28 46 74 73 33 48 61 73 68 20  ash = (Fts3Hash 
205b0 2a 29 70 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  *)p;.  sqlite3Ft
205c0 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73  s3HashClear(pHas
205d0 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  h);.  sqlite3_fr
205e0 65 65 28 70 48 61 73 68 29 3b 0a 7d 0a 0a 2f 2a  ee(pHash);.}../*
205f0 0a 2a 2a 20 54 68 65 20 66 74 73 33 20 62 75 69  .** The fts3 bui
20600 6c 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 73  lt-in tokenizers
20610 20 2d 20 22 73 69 6d 70 6c 65 22 2c 20 22 70 6f   - "simple", "po
20620 72 74 65 72 22 20 61 6e 64 20 22 69 63 75 22 2d  rter" and "icu"-
20630 20 61 72 65 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65   are .** impleme
20640 6e 74 65 64 20 69 6e 20 66 69 6c 65 73 20 66 74  nted in files ft
20650 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 31 2e 63 2c  s3_tokenizer1.c,
20660 20 66 74 73 33 5f 70 6f 72 74 65 72 2e 63 20 61   fts3_porter.c a
20670 6e 64 20 66 74 73 33 5f 69 63 75 2e 63 0a 2a 2a  nd fts3_icu.c.**
20680 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 54   respectively. T
20690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
206a0 65 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  ee forward decla
206b0 72 61 74 69 6f 6e 73 20 61 72 65 20 66 6f 72 20  rations are for 
206c0 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 64 65 63  functions.** dec
206d0 6c 61 72 65 64 20 69 6e 20 74 68 65 73 65 20 66  lared in these f
206e0 69 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 74  iles used to ret
206f0 72 69 65 76 65 20 74 68 65 20 72 65 73 70 65 63  rieve the respec
20700 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
20710 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  ions..**.** Call
20720 69 6e 67 20 73 71 6c 69 74 65 33 46 74 73 33 53  ing sqlite3Fts3S
20730 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f  impleTokenizerMo
20740 64 75 6c 65 28 29 20 73 65 74 73 20 74 68 65 20  dule() sets the 
20750 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a  value pointed.**
20760 20 74 6f 20 62 79 20 74 68 65 20 61 72 67 75 6d   to by the argum
20770 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ent to point to 
20780 74 68 65 20 22 73 69 6d 70 6c 65 22 20 74 6f 6b  the "simple" tok
20790 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74  enizer implement
207a0 61 74 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 6f  ation..** And so
207b0 20 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   on..*/.void sql
207c0 69 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f  ite3Fts3SimpleTo
207d0 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71  kenizerModule(sq
207e0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
207f0 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70  module const**pp
20800 4d 6f 64 75 6c 65 29 3b 0a 76 6f 69 64 20 73 71  Module);.void sq
20810 6c 69 74 65 33 46 74 73 33 50 6f 72 74 65 72 54  lite3Fts3PorterT
20820 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73  okenizerModule(s
20830 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
20840 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70  _module const**p
20850 70 4d 6f 64 75 6c 65 29 3b 0a 23 69 66 6e 64 65  pModule);.#ifnde
20860 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
20870 5f 46 54 53 33 5f 55 4e 49 43 4f 44 45 0a 76 6f  _FTS3_UNICODE.vo
20880 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 55 6e  id sqlite3Fts3Un
20890 69 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 72 28 73  icodeTokenizer(s
208a0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
208b0 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70  _module const**p
208c0 70 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  pModule);.#endif
208d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
208e0 4e 41 42 4c 45 5f 49 43 55 0a 76 6f 69 64 20 73  NABLE_ICU.void s
208f0 71 6c 69 74 65 33 46 74 73 33 49 63 75 54 6f 6b  qlite3Fts3IcuTok
20900 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71 6c  enizerModule(sql
20910 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
20920 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70 4d  odule const**ppM
20930 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
20940 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
20950 20 74 68 65 20 66 74 73 33 20 65 78 74 65 6e 73   the fts3 extens
20960 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 65 78 74  ion. If this ext
20970 65 6e 73 69 6f 6e 20 69 73 20 62 75 69 6c 74 20  ension is built 
20980 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  as part.** of th
20990 65 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79  e sqlite library
209a0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
209b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 64  tion is called d
209c0 69 72 65 63 74 6c 79 20 62 79 0a 2a 2a 20 53 51  irectly by.** SQ
209d0 4c 69 74 65 2e 20 49 66 20 66 74 73 33 20 69 73  Lite. If fts3 is
209e0 20 62 75 69 6c 74 20 61 73 20 61 20 64 79 6e 61   built as a dyna
209f0 6d 69 63 61 6c 6c 79 20 6c 6f 61 64 61 62 6c 65  mically loadable
20a00 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69 73   extension, this
20a10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
20a20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73 71  called by the sq
20a30 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f  lite3_extension_
20a40 69 6e 69 74 28 29 20 65 6e 74 72 79 20 70 6f 69  init() entry poi
20a50 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
20a60 65 33 46 74 73 33 49 6e 69 74 28 73 71 6c 69 74  e3Fts3Init(sqlit
20a70 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
20a80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20a90 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
20aa0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71   = 0;.  const sq
20ab0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
20ac0 6d 6f 64 75 6c 65 20 2a 70 53 69 6d 70 6c 65 20  module *pSimple 
20ad0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  = 0;.  const sql
20ae0 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
20af0 6f 64 75 6c 65 20 2a 70 50 6f 72 74 65 72 20 3d  odule *pPorter =
20b00 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
20b10 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 33 5f  TE_DISABLE_FTS3_
20b20 55 4e 49 43 4f 44 45 0a 20 20 63 6f 6e 73 74 20  UNICODE.  const 
20b30 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
20b40 72 5f 6d 6f 64 75 6c 65 20 2a 70 55 6e 69 63 6f  r_module *pUnico
20b50 64 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  de = 0;.#endif..
20b60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20b70 41 42 4c 45 5f 49 43 55 0a 20 20 63 6f 6e 73 74  ABLE_ICU.  const
20b80 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
20b90 65 72 5f 6d 6f 64 75 6c 65 20 2a 70 49 63 75 20  er_module *pIcu 
20ba0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  = 0;.  sqlite3Ft
20bb0 73 33 49 63 75 54 6f 6b 65 6e 69 7a 65 72 4d 6f  s3IcuTokenizerMo
20bc0 64 75 6c 65 28 26 70 49 63 75 29 3b 0a 23 65 6e  dule(&pIcu);.#en
20bd0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
20be0 49 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 33  ITE_DISABLE_FTS3
20bf0 5f 55 4e 49 43 4f 44 45 0a 20 20 73 71 6c 69 74  _UNICODE.  sqlit
20c00 65 33 46 74 73 33 55 6e 69 63 6f 64 65 54 6f 6b  e3Fts3UnicodeTok
20c10 65 6e 69 7a 65 72 28 26 70 55 6e 69 63 6f 64 65  enizer(&pUnicode
20c20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  );.#endif..#ifde
20c30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
20c40 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
20c50 49 6e 69 74 54 65 72 6d 28 64 62 29 3b 0a 20 20  InitTerm(db);.  
20c60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20c70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  K ) return rc;.#
20c80 65 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20 73 71  endif..  rc = sq
20c90 6c 69 74 65 33 46 74 73 33 49 6e 69 74 41 75 78  lite3Fts3InitAux
20ca0 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  (db);.  if( rc!=
20cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20cc0 72 6e 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65  rn rc;..  sqlite
20cd0 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b 65 6e  3Fts3SimpleToken
20ce0 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 53 69 6d  izerModule(&pSim
20cf0 70 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ple);.  sqlite3F
20d00 74 73 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  ts3PorterTokeniz
20d10 65 72 4d 6f 64 75 6c 65 28 26 70 50 6f 72 74 65  erModule(&pPorte
20d20 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  r);..  /* Alloca
20d30 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
20d40 65 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  e the hash-table
20d50 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
20d60 6f 6b 65 6e 69 7a 65 72 73 2e 20 2a 2f 0a 20 20  okenizers. */.  
20d70 70 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33 5f  pHash = sqlite3_
20d80 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74  malloc(sizeof(Ft
20d90 73 33 48 61 73 68 29 29 3b 0a 20 20 69 66 28 20  s3Hash));.  if( 
20da0 21 70 48 61 73 68 20 29 7b 0a 20 20 20 20 72 63  !pHash ){.    rc
20db0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
20dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
20dd0 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e 69  lite3Fts3HashIni
20de0 74 28 70 48 61 73 68 2c 20 46 54 53 33 5f 48 41  t(pHash, FTS3_HA
20df0 53 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20  SH_STRING, 1);. 
20e00 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68   }..  /* Load th
20e10 65 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65 6e  e built-in token
20e20 69 7a 65 72 73 20 69 6e 74 6f 20 74 68 65 20 68  izers into the h
20e30 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ash table */.  i
20e40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20e50 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
20e60 74 65 33 46 74 73 33 48 61 73 68 49 6e 73 65 72  te3Fts3HashInser
20e70 74 28 70 48 61 73 68 2c 20 22 73 69 6d 70 6c 65  t(pHash, "simple
20e80 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a 29 70 53  ", 7, (void *)pS
20e90 69 6d 70 6c 65 29 0a 20 20 20 20 20 7c 7c 20 73  imple).     || s
20ea0 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e  qlite3Fts3HashIn
20eb0 73 65 72 74 28 70 48 61 73 68 2c 20 22 70 6f 72  sert(pHash, "por
20ec0 74 65 72 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a  ter", 7, (void *
20ed0 29 70 50 6f 72 74 65 72 29 20 0a 0a 23 69 66 6e  )pPorter) ..#ifn
20ee0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
20ef0 4c 45 5f 46 54 53 33 5f 55 4e 49 43 4f 44 45 0a  LE_FTS3_UNICODE.
20f00 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 46       || sqlite3F
20f10 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  ts3HashInsert(pH
20f20 61 73 68 2c 20 22 75 6e 69 63 6f 64 65 36 31 22  ash, "unicode61"
20f30 2c 20 31 30 2c 20 28 76 6f 69 64 20 2a 29 70 55  , 10, (void *)pU
20f40 6e 69 63 6f 64 65 29 20 0a 23 65 6e 64 69 66 0a  nicode) .#endif.
20f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20f60 41 42 4c 45 5f 49 43 55 0a 20 20 20 20 20 7c 7c  ABLE_ICU.     ||
20f70 20 28 70 49 63 75 20 26 26 20 73 71 6c 69 74 65   (pIcu && sqlite
20f80 33 46 74 73 33 48 61 73 68 49 6e 73 65 72 74 28  3Fts3HashInsert(
20f90 70 48 61 73 68 2c 20 22 69 63 75 22 2c 20 34 2c  pHash, "icu", 4,
20fa0 20 28 76 6f 69 64 20 2a 29 70 49 63 75 29 29 0a   (void *)pIcu)).
20fb0 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
20fc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20fd0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
20fe0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20ff0 54 45 53 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  TEST.  if( rc==S
21000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21010 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
21020 45 78 70 72 49 6e 69 74 54 65 73 74 49 6e 74 65  ExprInitTestInte
21030 72 66 61 63 65 28 64 62 2c 20 70 48 61 73 68 29  rface(db, pHash)
21040 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21050 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 76 69  /* Create the vi
21060 72 74 75 61 6c 20 74 61 62 6c 65 20 77 72 61 70  rtual table wrap
21070 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 68  per around the h
21080 61 73 68 2d 74 61 62 6c 65 20 61 6e 64 20 6f 76  ash-table and ov
21090 65 72 6c 6f 61 64 20 0a 20 20 2a 2a 20 74 68 65  erload .  ** the
210a0 20 66 6f 75 72 20 73 63 61 6c 61 72 20 66 75 6e   four scalar fun
210b0 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  ctions. If this 
210c0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  is successful, r
210d0 65 67 69 73 74 65 72 20 74 68 65 0a 20 20 2a 2a  egister the.  **
210e0 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 73 71 6c   module with sql
210f0 69 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ite..  */.  if( 
21100 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 0a 20  SQLITE_OK==rc . 
21110 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d    && SQLITE_OK==
21120 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  (rc = sqlite3Fts
21130 33 49 6e 69 74 48 61 73 68 54 61 62 6c 65 28 64  3InitHashTable(d
21140 62 2c 20 70 48 61 73 68 2c 20 22 66 74 73 33 5f  b, pHash, "fts3_
21150 74 6f 6b 65 6e 69 7a 65 72 22 29 29 0a 20 20 20  tokenizer")).   
21160 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
21170 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  c = sqlite3_over
21180 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62  load_function(db
21190 2c 20 22 73 6e 69 70 70 65 74 22 2c 20 2d 31 29  , "snippet", -1)
211a0 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f  ).   && SQLITE_O
211b0 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
211c0 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
211d0 6f 6e 28 64 62 2c 20 22 6f 66 66 73 65 74 73 22  on(db, "offsets"
211e0 2c 20 31 29 29 0a 20 20 20 26 26 20 53 51 4c 49  , 1)).   && SQLI
211f0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
21200 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
21210 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 61 74 63  nction(db, "matc
21220 68 69 6e 66 6f 22 2c 20 31 29 29 0a 20 20 20 26  hinfo", 1)).   &
21230 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
21240 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c   = sqlite3_overl
21250 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  oad_function(db,
21260 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 32 29   "matchinfo", 2)
21270 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f  ).   && SQLITE_O
21280 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
21290 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
212a0 6f 6e 28 64 62 2c 20 22 6f 70 74 69 6d 69 7a 65  on(db, "optimize
212b0 22 2c 20 31 29 29 0a 20 20 29 7b 0a 20 20 20 20  ", 1)).  ){.    
212c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
212d0 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 0a 20  ate_module_v2(. 
212e0 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 33         db, "fts3
212f0 22 2c 20 26 66 74 73 33 4d 6f 64 75 6c 65 2c 20  ", &fts3Module, 
21300 28 76 6f 69 64 20 2a 29 70 48 61 73 68 2c 20 68  (void *)pHash, h
21310 61 73 68 44 65 73 74 72 6f 79 0a 20 20 20 20 29  ashDestroy.    )
21320 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
21350 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 0a  eate_module_v2(.
21360 20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22 66            db, "f
21370 74 73 34 22 2c 20 26 66 74 73 33 4d 6f 64 75 6c  ts4", &fts3Modul
21380 65 2c 20 28 76 6f 69 64 20 2a 29 70 48 61 73 68  e, (void *)pHash
21390 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
213a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
213b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
213c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
213d0 73 33 49 6e 69 74 54 6f 6b 28 64 62 2c 20 28 76  s3InitTok(db, (v
213e0 6f 69 64 20 2a 29 70 48 61 73 68 29 3b 0a 20 20  oid *)pHash);.  
213f0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
21400 63 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6e  c;.  }...  /* An
21410 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
21420 72 65 64 2e 20 44 65 6c 65 74 65 20 74 68 65 20  red. Delete the 
21430 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72  hash table and r
21440 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
21450 63 6f 64 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  code. */.  asser
21460 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21470 20 29 3b 0a 20 20 69 66 28 20 70 48 61 73 68 20   );.  if( pHash 
21480 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
21490 73 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73  s3HashClear(pHas
214a0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
214b0 66 72 65 65 28 70 48 61 73 68 29 3b 0a 20 20 7d  free(pHash);.  }
214c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
214d0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
214e0 61 6e 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  an Fts3MultiSegR
214f0 65 61 64 65 72 20 66 6f 72 20 65 61 63 68 20 74  eader for each t
21500 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 78 70 72  oken in the expr
21510 65 73 73 69 6f 6e 20 68 65 61 64 65 64 0a 2a 2a  ession headed.**
21520 20 62 79 20 70 45 78 70 72 2e 20 0a 2a 2a 0a 2a   by pExpr. .**.*
21530 2a 20 41 6e 20 46 74 73 33 53 65 67 52 65 61 64  * An Fts3SegRead
21540 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 20 63  er object is a c
21550 75 72 73 6f 72 20 74 68 61 74 20 63 61 6e 20 73  ursor that can s
21560 65 65 6b 20 6f 72 20 73 63 61 6e 20 61 20 72 61  eek or scan a ra
21570 6e 67 65 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  nge of.** entrie
21580 73 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c  s within a singl
21590 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
215a0 2e 20 41 6e 20 46 74 73 33 4d 75 6c 74 69 53 65  . An Fts3MultiSe
215b0 67 52 65 61 64 65 72 20 75 73 65 73 20 6d 75 6c  gReader uses mul
215c0 74 69 70 6c 65 0a 2a 2a 20 46 74 73 33 53 65 67  tiple.** Fts3Seg
215d0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69  Reader objects i
215e0 6e 74 65 72 6e 61 6c 6c 79 20 74 6f 20 70 72 6f  nternally to pro
215f0 76 69 64 65 20 61 6e 20 69 6e 74 65 72 66 61 63  vide an interfac
21600 65 20 74 6f 20 73 65 65 6b 20 6f 72 20 73 63 61  e to seek or sca
21610 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  n.** within the 
21620 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 65 67  union of all seg
21630 6d 65 6e 74 73 20 6f 66 20 61 20 62 2d 74 72 65  ments of a b-tre
21640 65 2e 20 48 65 6e 63 65 20 74 68 65 20 6e 61 6d  e. Hence the nam
21650 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
21660 61 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 4d 75  allocated Fts3Mu
21670 6c 74 69 53 65 67 52 65 61 64 65 72 20 6a 75 73  ltiSegReader jus
21680 74 20 73 65 65 6b 73 20 74 6f 20 61 20 73 69 6e  t seeks to a sin
21690 67 6c 65 20 65 6e 74 72 79 20 69 6e 20 61 0a 2a  gle entry in a.*
216a0 2a 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  * segment b-tree
216b0 20 28 69 66 20 74 68 65 20 74 65 72 6d 20 69 73   (if the term is
216c0 20 6e 6f 74 20 61 20 70 72 65 66 69 78 20 6f 72   not a prefix or
216d0 20 69 74 20 69 73 20 61 20 70 72 65 66 69 78 20   it is a prefix 
216e0 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
216f0 72 65 20 65 78 69 73 74 73 20 70 72 65 66 69 78  re exists prefix
21700 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20 72   b-tree of the r
21710 69 67 68 74 20 6c 65 6e 67 74 68 29 20 74 68 65  ight length) the
21720 6e 20 69 74 20 6d 61 79 20 62 65 20 74 72 61 76  n it may be trav
21730 65 72 73 65 64 0a 2a 2a 20 61 6e 64 20 6d 65 72  ersed.** and mer
21740 67 65 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c  ged incrementall
21750 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  y. Otherwise, it
21760 20 68 61 73 20 74 6f 20 62 65 20 6d 65 72 67 65   has to be merge
21770 64 20 69 6e 74 6f 20 61 6e 20 69 6e 2d 6d 65 6d  d into an in-mem
21780 6f 72 79 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 20  ory .** doclist 
21790 61 6e 64 20 74 68 65 6e 20 74 72 61 76 65 72 73  and then travers
217a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
217b0 69 64 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63  id fts3EvalAlloc
217c0 61 74 65 52 65 61 64 65 72 73 28 0a 20 20 46 74  ateReaders(.  Ft
217d0 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
217f0 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e 64   FTS cursor hand
21800 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  le */.  Fts3Expr
21810 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
21820 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
21830 61 74 65 20 72 65 61 64 65 72 73 20 66 6f 72 20  ate readers for 
21840 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
21850 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54 6f 6b 65  */.  int *pnToke
21860 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
21870 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74       /* OUT: Tot
21880 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
21890 65 6e 73 20 69 6e 20 70 68 72 61 73 65 2e 20 2a  ens in phrase. *
218a0 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 72 2c 20 20  /.  int *pnOr,  
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
218d0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 4f 52 20 6e  l number of OR n
218e0 6f 64 65 73 20 69 6e 20 65 78 70 72 2e 20 2a 2f  odes in expr. */
218f0 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20  .  int *pRc     
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72     /* IN/OUT: Er
21920 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20  ror code */.){. 
21930 20 69 66 28 20 70 45 78 70 72 20 26 26 20 53 51   if( pExpr && SQ
21940 4c 49 54 45 5f 4f 4b 3d 3d 2a 70 52 63 20 29 7b  LITE_OK==*pRc ){
21950 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
21960 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
21970 50 48 52 41 53 45 20 29 7b 0a 20 20 20 20 20 20  PHRASE ){.      
21980 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
21990 20 6e 54 6f 6b 65 6e 20 3d 20 70 45 78 70 72 2d   nToken = pExpr-
219a0 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e  >pPhrase->nToken
219b0 3b 0a 20 20 20 20 20 20 2a 70 6e 54 6f 6b 65 6e  ;.      *pnToken
219c0 20 2b 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20   += nToken;.    
219d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 6f    for(i=0; i<nTo
219e0 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ken; i++){.     
219f0 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b     Fts3PhraseTok
21a00 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70 45  en *pToken = &pE
21a10 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54  xpr->pPhrase->aT
21a20 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  oken[i];.       
21a30 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 54 65   int rc = fts3Te
21a40 72 6d 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  rmSegReaderCurso
21a50 72 28 70 43 73 72 2c 20 0a 20 20 20 20 20 20 20  r(pCsr, .       
21a60 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20       pToken->z, 
21a70 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 54 6f 6b 65  pToken->n, pToke
21a80 6e 2d 3e 69 73 50 72 65 66 69 78 2c 20 26 70 54  n->isPrefix, &pT
21a90 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 0a 20 20  oken->pSegcsr.  
21aa0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
21ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21ad0 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRc = rc;.     
21ae0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
21af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
21b10 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 69 44 6f  pr->pPhrase->iDo
21b20 63 6c 69 73 74 54 6f 6b 65 6e 3d 3d 30 20 29 3b  clistToken==0 );
21b30 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 50  .      pExpr->pP
21b40 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54  hrase->iDoclistT
21b50 6f 6b 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  oken = -1;.    }
21b60 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 4f  else{.      *pnO
21b70 72 20 2b 3d 20 28 70 45 78 70 72 2d 3e 65 54 79  r += (pExpr->eTy
21b80 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52 29  pe==FTSQUERY_OR)
21b90 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  ;.      fts3Eval
21ba0 41 6c 6c 6f 63 61 74 65 52 65 61 64 65 72 73 28  AllocateReaders(
21bb0 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pCsr, pExpr->pLe
21bc0 66 74 2c 20 70 6e 54 6f 6b 65 6e 2c 20 70 6e 4f  ft, pnToken, pnO
21bd0 72 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 66  r, pRc);.      f
21be0 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65 52  ts3EvalAllocateR
21bf0 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 45 78  eaders(pCsr, pEx
21c00 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 6e 54 6f  pr->pRight, pnTo
21c10 6b 65 6e 2c 20 70 6e 4f 72 2c 20 70 52 63 29 3b  ken, pnOr, pRc);
21c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
21c30 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 4c  .** Arguments pL
21c40 69 73 74 2f 6e 4c 69 73 74 20 63 6f 6e 74 61 69  ist/nList contai
21c50 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  n the doclist fo
21c60 72 20 74 6f 6b 65 6e 20 69 54 6f 6b 65 6e 20 6f  r token iToken o
21c70 66 20 70 68 72 61 73 65 20 70 2e 0a 2a 2a 20 49  f phrase p..** I
21c80 74 20 69 73 20 6d 65 72 67 65 64 20 69 6e 74 6f  t is merged into
21c90 20 74 68 65 20 6d 61 69 6e 20 64 6f 63 6c 69 73   the main doclis
21ca0 74 20 73 74 6f 72 65 64 20 69 6e 20 70 2d 3e 64  t stored in p->d
21cb0 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c  oclist.aAll/nAll
21cc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
21cd0 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
21ce0 61 74 20 70 4c 69 73 74 20 70 6f 69 6e 74 73 20  at pList points 
21cf0 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  to a buffer allo
21d00 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
21d10 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
21d20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   This function t
21d30 61 6b 65 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  akes responsibil
21d40 69 74 79 20 66 6f 72 20 65 76 65 6e 74 75 61 6c  ity for eventual
21d50 6c 79 0a 2a 2a 20 66 72 65 65 69 6e 67 20 74 68  ly.** freeing th
21d60 65 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  e buffer..**.** 
21d70 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21d80 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
21d90 66 75 6c 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ful, or SQLITE_N
21da0 4f 4d 45 4d 20 69 66 20 61 6e 20 65 72 72 6f 72  OMEM if an error
21db0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
21dc0 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 50  ic int fts3EvalP
21dd0 68 72 61 73 65 4d 65 72 67 65 54 6f 6b 65 6e 28  hraseMergeToken(
21de0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54  .  Fts3Table *pT
21df0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
21e00 20 20 20 2f 2a 20 46 54 53 20 54 61 62 6c 65 20     /* FTS Table 
21e10 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 46 74 73  pointer */.  Fts
21e20 33 50 68 72 61 73 65 20 2a 70 2c 20 20 20 20 20  3Phrase *p,     
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e40 50 68 72 61 73 65 20 74 6f 20 6d 65 72 67 65 20  Phrase to merge 
21e50 70 4c 69 73 74 2f 6e 4c 69 73 74 20 69 6e 74 6f  pList/nList into
21e60 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 6b 65 6e   */.  int iToken
21e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21e80 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 70        /* Token p
21e90 4c 69 73 74 2f 6e 4c 69 73 74 20 63 6f 72 72 65  List/nList corre
21ea0 73 70 6f 6e 64 73 20 74 6f 20 2a 2f 0a 20 20 63  sponds to */.  c
21eb0 68 61 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  har *pList,     
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ed0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
21ee0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  list */.  int nL
21ef0 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ist             
21f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21f10 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
21f20 70 4c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  pList */.){.  in
21f30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21f40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 6f 6b  ;.  assert( iTok
21f50 65 6e 21 3d 70 2d 3e 69 44 6f 63 6c 69 73 74 54  en!=p->iDoclistT
21f60 6f 6b 65 6e 20 29 3b 0a 0a 20 20 69 66 28 20 70  oken );..  if( p
21f70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  List==0 ){.    s
21f80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 64  qlite3_free(p->d
21f90 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20  oclist.aAll);.  
21fa0 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c    p->doclist.aAl
21fb0 6c 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 64 6f  l = 0;.    p->do
21fc0 63 6c 69 73 74 2e 6e 41 6c 6c 20 3d 20 30 3b 0a  clist.nAll = 0;.
21fd0 20 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28 20    }..  else if( 
21fe0 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e  p->iDoclistToken
21ff0 3c 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 6f 63  <0 ){.    p->doc
22000 6c 69 73 74 2e 61 41 6c 6c 20 3d 20 70 4c 69 73  list.aAll = pLis
22010 74 3b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73  t;.    p->doclis
22020 74 2e 6e 41 6c 6c 20 3d 20 6e 4c 69 73 74 3b 0a  t.nAll = nList;.
22030 20 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28 20    }..  else if( 
22040 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3d  p->doclist.aAll=
22050 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
22060 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 20  3_free(pList);. 
22070 20 7d 0a 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20   }..  else {.   
22080 20 63 68 61 72 20 2a 70 4c 65 66 74 3b 0a 20 20   char *pLeft;.  
22090 20 20 63 68 61 72 20 2a 70 52 69 67 68 74 3b 0a    char *pRight;.
220a0 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 20      int nLeft;. 
220b0 20 20 20 69 6e 74 20 6e 52 69 67 68 74 3b 0a 20     int nRight;. 
220c0 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 0a 20     int nDiff;.. 
220d0 20 20 20 69 66 28 20 70 2d 3e 69 44 6f 63 6c 69     if( p->iDocli
220e0 73 74 54 6f 6b 65 6e 3c 69 54 6f 6b 65 6e 20 29  stToken<iToken )
220f0 7b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  {.      pLeft = 
22100 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3b  p->doclist.aAll;
22110 0a 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20 70  .      nLeft = p
22120 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 3b 0a  ->doclist.nAll;.
22130 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
22140 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 52 69 67  List;.      nRig
22150 68 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  ht = nList;.    
22160 20 20 6e 44 69 66 66 20 3d 20 69 54 6f 6b 65 6e    nDiff = iToken
22170 20 2d 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f   - p->iDoclistTo
22180 6b 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ken;.    }else{.
22190 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
221a0 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3b 0a  ->doclist.aAll;.
221b0 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 70        nRight = p
221c0 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 3b 0a  ->doclist.nAll;.
221d0 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c        pLeft = pL
221e0 69 73 74 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74  ist;.      nLeft
221f0 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
22200 6e 44 69 66 66 20 3d 20 70 2d 3e 69 44 6f 63 6c  nDiff = p->iDocl
22210 69 73 74 54 6f 6b 65 6e 20 2d 20 69 54 6f 6b 65  istToken - iToke
22220 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  n;.    }..    rc
22230 20 3d 20 66 74 73 33 44 6f 63 6c 69 73 74 50 68   = fts3DoclistPh
22240 72 61 73 65 4d 65 72 67 65 28 0a 20 20 20 20 20  raseMerge(.     
22250 20 20 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64     pTab->bDescId
22260 78 2c 20 6e 44 69 66 66 2c 20 70 4c 65 66 74 2c  x, nDiff, pLeft,
22270 20 6e 4c 65 66 74 2c 20 26 70 52 69 67 68 74 2c   nLeft, &pRight,
22280 20 26 6e 52 69 67 68 74 0a 20 20 20 20 29 3b 0a   &nRight.    );.
22290 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
222a0 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 2d 3e  (pLeft);.    p->
222b0 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 3d 20 70  doclist.aAll = p
222c0 52 69 67 68 74 3b 0a 20 20 20 20 70 2d 3e 64 6f  Right;.    p->do
222d0 63 6c 69 73 74 2e 6e 41 6c 6c 20 3d 20 6e 52 69  clist.nAll = nRi
222e0 67 68 74 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ght;.  }..  if( 
222f0 69 54 6f 6b 65 6e 3e 70 2d 3e 69 44 6f 63 6c 69  iToken>p->iDocli
22300 73 74 54 6f 6b 65 6e 20 29 20 70 2d 3e 69 44 6f  stToken ) p->iDo
22310 63 6c 69 73 74 54 6f 6b 65 6e 20 3d 20 69 54 6f  clistToken = iTo
22320 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ken;.  return rc
22330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
22340 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
22350 70 68 72 61 73 65 20 70 20 69 6e 74 6f 20 70 2d  phrase p into p-
22360 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41  >doclist.aAll/nA
22370 6c 6c 2e 20 54 68 65 20 6c 6f 61 64 65 64 20 64  ll. The loaded d
22380 6f 63 6c 69 73 74 0a 2a 2a 20 64 6f 65 73 20 6e  oclist.** does n
22390 6f 74 20 74 61 6b 65 20 64 65 66 65 72 72 65 64  ot take deferred
223a0 20 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 61 63 63   tokens into acc
223b0 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ount..**.** SQLI
223c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
223d0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
223e0 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20  curs, otherwise 
223f0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
22400 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
22410 69 6e 74 20 66 74 73 33 45 76 61 6c 50 68 72 61  int fts3EvalPhra
22420 73 65 4c 6f 61 64 28 0a 20 20 46 74 73 33 43 75  seLoad(.  Fts3Cu
22430 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
22440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
22450 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a   Cursor handle *
22460 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 20 2a  /.  Fts3Phrase *
22470 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
22480 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 6f 62      /* Phrase ob
22490 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
224a0 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  3Table *pTab = (
224b0 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
224c0 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
224d0 69 6e 74 20 69 54 6f 6b 65 6e 3b 0a 20 20 69 6e  int iToken;.  in
224e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
224f0 3b 0a 0a 20 20 66 6f 72 28 69 54 6f 6b 65 6e 3d  ;..  for(iToken=
22500 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
22510 20 26 26 20 69 54 6f 6b 65 6e 3c 70 2d 3e 6e 54   && iToken<p->nT
22520 6f 6b 65 6e 3b 20 69 54 6f 6b 65 6e 2b 2b 29 7b  oken; iToken++){
22530 0a 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54  .    Fts3PhraseT
22540 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
22550 70 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65 6e  p->aToken[iToken
22560 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
22570 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64  Token->pDeferred
22580 3d 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 70  ==0 || pToken->p
22590 53 65 67 63 73 72 3d 3d 30 20 29 3b 0a 0a 20 20  Segcsr==0 );..  
225a0 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 70 53    if( pToken->pS
225b0 65 67 63 73 72 20 29 7b 0a 20 20 20 20 20 20 69  egcsr ){.      i
225c0 6e 74 20 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt nThis = 0;.  
225d0 20 20 20 20 63 68 61 72 20 2a 70 54 68 69 73 20      char *pThis 
225e0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
225f0 66 74 73 33 54 65 72 6d 53 65 6c 65 63 74 28 70  fts3TermSelect(p
22600 54 61 62 2c 20 70 54 6f 6b 65 6e 2c 20 70 2d 3e  Tab, pToken, p->
22610 69 43 6f 6c 75 6d 6e 2c 20 26 6e 54 68 69 73 2c  iColumn, &nThis,
22620 20 26 70 54 68 69 73 29 3b 0a 20 20 20 20 20 20   &pThis);.      
22630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
22650 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65  = fts3EvalPhrase
22660 4d 65 72 67 65 54 6f 6b 65 6e 28 70 54 61 62 2c  MergeToken(pTab,
22670 20 70 2c 20 69 54 6f 6b 65 6e 2c 20 70 54 68 69   p, iToken, pThi
22680 73 2c 20 6e 54 68 69 73 29 3b 0a 20 20 20 20 20  s, nThis);.     
22690 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
226a0 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65  ert( pToken->pSe
226b0 67 63 73 72 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  gcsr==0 );.  }..
226c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
226d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
226e0 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45 46 45  ISABLE_FTS4_DEFE
226f0 52 52 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  RRED./*.** This 
22700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
22710 65 64 20 6f 6e 20 65 61 63 68 20 70 68 72 61 73  ed on each phras
22720 65 20 61 66 74 65 72 20 74 68 65 20 70 6f 73 69  e after the posi
22730 74 69 6f 6e 20 6c 69 73 74 73 20 66 6f 72 0a 2a  tion lists for.*
22740 2a 20 61 6e 79 20 64 65 66 65 72 72 65 64 20 74  * any deferred t
22750 6f 6b 65 6e 73 20 68 61 76 65 20 62 65 65 6e 20  okens have been 
22760 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
22770 72 79 2e 20 49 74 20 75 70 64 61 74 65 73 20 74  ry. It updates t
22780 68 65 20 70 68 72 61 73 65 73 0a 2a 2a 20 63 75  he phrases.** cu
22790 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
227a0 69 73 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f  ist to include o
227b0 6e 6c 79 20 74 68 6f 73 65 20 70 6f 73 69 74 69  nly those positi
227c0 6f 6e 73 20 74 68 61 74 20 61 72 65 20 72 65 61  ons that are rea
227d0 6c 6c 79 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 73  lly.** instances
227e0 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20 28   of the phrase (
227f0 61 66 74 65 72 20 63 6f 6e 73 69 64 65 72 69 6e  after considerin
22800 67 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  g deferred token
22810 73 29 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 6d  s). If this.** m
22820 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 68  eans that the ph
22830 72 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 61 70  rase does not ap
22840 70 65 61 72 20 69 6e 20 74 68 65 20 63 75 72 72  pear in the curr
22850 65 6e 74 20 72 6f 77 2c 20 64 6f 63 6c 69 73 74  ent row, doclist
22860 2e 70 4c 69 73 74 0a 2a 2a 20 61 6e 64 20 64 6f  .pList.** and do
22870 63 6c 69 73 74 2e 6e 4c 69 73 74 20 61 72 65 20  clist.nList are 
22880 62 6f 74 68 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a  both zeroed..**.
22890 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
228a0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
228b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68  rror occurs, oth
228c0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
228d0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
228e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
228f0 76 61 6c 44 65 66 65 72 72 65 64 50 68 72 61 73  valDeferredPhras
22900 65 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  e(Fts3Cursor *pC
22910 73 72 2c 20 46 74 73 33 50 68 72 61 73 65 20 2a  sr, Fts3Phrase *
22920 70 50 68 72 61 73 65 29 7b 0a 20 20 69 6e 74 20  pPhrase){.  int 
22930 69 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20  iToken;         
22940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
22950 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
22960 68 72 6f 75 67 68 20 70 68 72 61 73 65 20 74 6f  hrough phrase to
22970 6b 65 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  kens */.  char *
22980 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 20 20 20  aPoslist = 0;   
22990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
229a0 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 64  ition list for d
229b0 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 2a  eferred tokens *
229c0 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74  /.  int nPoslist
229d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
229e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
229f0 20 62 79 74 65 73 20 69 6e 20 61 50 6f 73 6c 69   bytes in aPosli
22a00 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 72 65  st */.  int iPre
22a10 76 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  v = -1;         
22a20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
22a30 20 6e 75 6d 62 65 72 20 6f 66 20 70 72 65 76 69   number of previ
22a40 6f 75 73 20 64 65 66 65 72 72 65 64 20 74 6f 6b  ous deferred tok
22a50 65 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  en */..  assert(
22a60 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
22a70 74 2e 62 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  t.bFreeList==0 )
22a80 3b 0a 0a 20 20 66 6f 72 28 69 54 6f 6b 65 6e 3d  ;..  for(iToken=
22a90 30 3b 20 69 54 6f 6b 65 6e 3c 70 50 68 72 61 73  0; iToken<pPhras
22aa0 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 54 6f 6b 65  e->nToken; iToke
22ab0 6e 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 50 68  n++){.    Fts3Ph
22ac0 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  raseToken *pToke
22ad0 6e 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54  n = &pPhrase->aT
22ae0 6f 6b 65 6e 5b 69 54 6f 6b 65 6e 5d 3b 0a 20 20  oken[iToken];.  
22af0 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 6f    Fts3DeferredTo
22b00 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64 20 3d  ken *pDeferred =
22b10 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72   pToken->pDeferr
22b20 65 64 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 65  ed;..    if( pDe
22b30 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 20 20  ferred ){.      
22b40 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20  char *pList;.   
22b50 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20     int nList;.  
22b60 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
22b70 69 74 65 33 46 74 73 33 44 65 66 65 72 72 65 64  ite3Fts3Deferred
22b80 54 6f 6b 65 6e 4c 69 73 74 28 70 44 65 66 65 72  TokenList(pDefer
22b90 72 65 64 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  red, &pList, &nL
22ba0 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
22bb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22bc0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
22bd0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
22be0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22bf0 33 5f 66 72 65 65 28 61 50 6f 73 6c 69 73 74 29  3_free(aPoslist)
22c00 3b 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73  ;.        pPhras
22c10 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
22c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
22c30 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e  hrase->doclist.n
22c40 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
22c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22c60 4f 4b 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65  OK;..      }else
22c70 20 69 66 28 20 61 50 6f 73 6c 69 73 74 3d 3d 30   if( aPoslist==0
22c80 20 29 7b 0a 20 20 20 20 20 20 20 20 61 50 6f 73   ){.        aPos
22c90 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  list = pList;.  
22ca0 20 20 20 20 20 20 6e 50 6f 73 6c 69 73 74 20 3d        nPoslist =
22cb0 20 6e 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 7d   nList;..      }
22cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
22cd0 61 72 20 2a 61 4f 75 74 20 3d 20 70 4c 69 73 74  ar *aOut = pList
22ce0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
22cf0 70 31 20 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20  p1 = aPoslist;. 
22d00 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 32 20         char *p2 
22d10 3d 20 61 4f 75 74 3b 0a 0a 20 20 20 20 20 20 20  = aOut;..       
22d20 20 61 73 73 65 72 74 28 20 69 50 72 65 76 3e 3d   assert( iPrev>=
22d30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  0 );.        fts
22d40 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65  3PoslistPhraseMe
22d50 72 67 65 28 26 61 4f 75 74 2c 20 69 54 6f 6b 65  rge(&aOut, iToke
22d60 6e 2d 69 50 72 65 76 2c 20 30 2c 20 31 2c 20 26  n-iPrev, 0, 1, &
22d70 70 31 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20  p1, &p2);.      
22d80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
22d90 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Poslist);.      
22da0 20 20 61 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69    aPoslist = pLi
22db0 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 50 6f 73  st;.        nPos
22dc0 6c 69 73 74 20 3d 20 28 69 6e 74 29 28 61 4f 75  list = (int)(aOu
22dd0 74 20 2d 20 61 50 6f 73 6c 69 73 74 29 3b 0a 20  t - aPoslist);. 
22de0 20 20 20 20 20 20 20 69 66 28 20 6e 50 6f 73 6c         if( nPosl
22df0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
22e00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22e10 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  (aPoslist);.    
22e20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
22e30 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30  oclist.pList = 0
22e40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 68 72  ;.          pPhr
22e50 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69  ase->doclist.nLi
22e60 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
22e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22e80 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
22e90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50 72 65      }.      iPre
22ea0 76 20 3d 20 69 54 6f 6b 65 6e 3b 0a 20 20 20 20  v = iToken;.    
22eb0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 50 72  }.  }..  if( iPr
22ec0 65 76 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ev>=0 ){.    int
22ed0 20 6e 4d 61 78 55 6e 64 65 66 65 72 72 65 64 20   nMaxUndeferred 
22ee0 3d 20 70 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c  = pPhrase->iDocl
22ef0 69 73 74 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66  istToken;.    if
22f00 28 20 6e 4d 61 78 55 6e 64 65 66 65 72 72 65 64  ( nMaxUndeferred
22f10 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 50 68 72  <0 ){.      pPhr
22f20 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
22f30 73 74 20 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20  st = aPoslist;. 
22f40 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f       pPhrase->do
22f50 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20 6e 50  clist.nList = nP
22f60 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 70 50  oslist;.      pP
22f70 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 69  hrase->doclist.i
22f80 44 6f 63 69 64 20 3d 20 70 43 73 72 2d 3e 69 50  Docid = pCsr->iP
22f90 72 65 76 49 64 3b 0a 20 20 20 20 20 20 70 50 68  revId;.      pPh
22fa0 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46  rase->doclist.bF
22fb0 72 65 65 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  reeList = 1;.   
22fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
22fd0 74 20 6e 44 69 73 74 61 6e 63 65 3b 0a 20 20 20  t nDistance;.   
22fe0 20 20 20 63 68 61 72 20 2a 70 31 3b 0a 20 20 20     char *p1;.   
22ff0 20 20 20 63 68 61 72 20 2a 70 32 3b 0a 20 20 20     char *p2;.   
23000 20 20 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a     char *aOut;..
23010 20 20 20 20 20 20 69 66 28 20 6e 4d 61 78 55 6e        if( nMaxUn
23020 64 65 66 65 72 72 65 64 3e 69 50 72 65 76 20 29  deferred>iPrev )
23030 7b 0a 20 20 20 20 20 20 20 20 70 31 20 3d 20 61  {.        p1 = a
23040 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Poslist;.       
23050 20 70 32 20 3d 20 70 50 68 72 61 73 65 2d 3e 64   p2 = pPhrase->d
23060 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20  oclist.pList;.  
23070 20 20 20 20 20 20 6e 44 69 73 74 61 6e 63 65 20        nDistance 
23080 3d 20 6e 4d 61 78 55 6e 64 65 66 65 72 72 65 64  = nMaxUndeferred
23090 20 2d 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20   - iPrev;.      
230a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
230b0 31 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63  1 = pPhrase->doc
230c0 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20  list.pList;.    
230d0 20 20 20 20 70 32 20 3d 20 61 50 6f 73 6c 69 73      p2 = aPoslis
230e0 74 3b 0a 20 20 20 20 20 20 20 20 6e 44 69 73 74  t;.        nDist
230f0 61 6e 63 65 20 3d 20 69 50 72 65 76 20 2d 20 6e  ance = iPrev - n
23100 4d 61 78 55 6e 64 65 66 65 72 72 65 64 3b 0a 20  MaxUndeferred;. 
23110 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 4f       }..      aO
23120 75 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ut = (char *)sql
23130 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 6f 73  ite3_malloc(nPos
23140 6c 69 73 74 2b 38 29 3b 0a 20 20 20 20 20 20 69  list+8);.      i
23150 66 28 20 21 61 4f 75 74 20 29 7b 0a 20 20 20 20  f( !aOut ){.    
23160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23170 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  (aPoslist);.    
23180 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23190 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
231a0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 70 50  .      .      pP
231b0 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
231c0 4c 69 73 74 20 3d 20 61 4f 75 74 3b 0a 20 20 20  List = aOut;.   
231d0 20 20 20 69 66 28 20 66 74 73 33 50 6f 73 6c 69     if( fts3Posli
231e0 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 61  stPhraseMerge(&a
231f0 4f 75 74 2c 20 6e 44 69 73 74 61 6e 63 65 2c 20  Out, nDistance, 
23200 30 2c 20 31 2c 20 26 70 31 2c 20 26 70 32 29 20  0, 1, &p1, &p2) 
23210 29 7b 0a 20 20 20 20 20 20 20 20 70 50 68 72 61  ){.        pPhra
23220 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65  se->doclist.bFre
23230 65 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  eList = 1;.     
23240 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c     pPhrase->docl
23250 69 73 74 2e 6e 4c 69 73 74 20 3d 20 28 69 6e 74  ist.nList = (int
23260 29 28 61 4f 75 74 20 2d 20 70 50 68 72 61 73 65  )(aOut - pPhrase
23270 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 29  ->doclist.pList)
23280 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
23290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
232a0 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20 20 20  ree(aOut);.     
232b0 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c     pPhrase->docl
232c0 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ist.pList = 0;. 
232d0 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e         pPhrase->
232e0 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20  doclist.nList = 
232f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
23300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50   sqlite3_free(aP
23310 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
23320 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
23330 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
23340 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
23350 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44  LE_FTS4_DEFERRED
23360 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d   */../*.** Maxim
23370 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  um number of tok
23380 65 6e 73 20 61 20 70 68 72 61 73 65 20 6d 61 79  ens a phrase may
23390 20 68 61 76 65 20 74 6f 20 62 65 20 63 6f 6e 73   have to be cons
233a0 69 64 65 72 65 64 20 66 6f 72 20 74 68 65 0a 2a  idered for the.*
233b0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 64 6f  * incremental do
233c0 63 6c 69 73 74 73 20 73 74 72 61 74 65 67 79 2e  clists strategy.
233d0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
233e0 49 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45  INCR_PHRASE_TOKE
233f0 4e 53 20 34 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  NS 4../*.** This
23400 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
23410 6c 65 64 20 66 6f 72 20 65 61 63 68 20 46 74 73  led for each Fts
23420 33 50 68 72 61 73 65 20 69 6e 20 61 20 66 75 6c  3Phrase in a ful
23430 6c 2d 74 65 78 74 20 71 75 65 72 79 20 0a 2a 2a  l-text query .**
23440 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
23450 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
23460 63 68 61 6e 69 73 6d 20 66 6f 72 20 72 65 74 75  chanism for retu
23470 72 6e 69 6e 67 20 72 6f 77 73 2e 20 4f 6e 63 65  rning rows. Once
23480 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
23490 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
234a0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  d successfully o
234b0 6e 20 61 6e 20 46 74 73 33 50 68 72 61 73 65 2c  n an Fts3Phrase,
234c0 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 75 73   it may be.** us
234d0 65 64 20 77 69 74 68 20 66 74 73 33 45 76 61 6c  ed with fts3Eval
234e0 50 68 72 61 73 65 4e 65 78 74 28 29 20 74 6f 20  PhraseNext() to 
234f0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
23500 74 68 65 20 6d 61 74 63 68 69 6e 67 20 64 6f 63  the matching doc
23510 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ids..**.** If pa
23520 72 61 6d 65 74 65 72 20 62 4f 70 74 4f 6b 20 69  rameter bOptOk i
23530 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
23540 20 70 68 72 61 73 65 20 6d 61 79 20 28 6f 72 20   phrase may (or 
23550 6d 61 79 20 6e 6f 74 29 20 75 73 65 20 74 68 65  may not) use the
23560 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
23570 6c 6f 61 64 69 6e 67 20 73 74 72 61 74 65 67 79  loading strategy
23580 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
23590 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
235a0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a  is loaded into.*
235b0 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  * memory within 
235c0 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  this call..**.**
235d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
235e0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
235f0 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
23600 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
23610 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
23620 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
23630 6c 50 68 72 61 73 65 53 74 61 72 74 28 46 74 73  lPhraseStart(Fts
23640 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69  3Cursor *pCsr, i
23650 6e 74 20 62 4f 70 74 4f 6b 2c 20 46 74 73 33 50  nt bOptOk, Fts3P
23660 68 72 61 73 65 20 2a 70 29 7b 0a 20 20 46 74 73  hrase *p){.  Fts
23670 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  3Table *pTab = (
23680 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
23690 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
236a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
236b0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
236c0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
236d0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
236e0 44 65 74 65 72 6d 69 6e 65 20 69 66 20 64 6f 63  Determine if doc
236f0 6c 69 73 74 73 20 6d 61 79 20 62 65 20 6c 6f 61  lists may be loa
23700 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 69 6e  ded from disk in
23710 63 72 65 6d 65 6e 74 61 6c 6c 79 2e 20 54 68 69  crementally. Thi
23720 73 20 69 73 0a 20 20 2a 2a 20 70 6f 73 73 69 62  s is.  ** possib
23730 6c 65 20 69 66 20 74 68 65 20 62 4f 70 74 4f 6b  le if the bOptOk
23740 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
23750 65 2c 20 74 68 65 20 46 54 53 20 64 6f 63 6c 69  e, the FTS docli
23760 73 74 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  sts will be.  **
23770 20 73 63 61 6e 6e 65 64 20 69 6e 20 66 6f 72 77   scanned in forw
23780 61 72 64 20 6f 72 64 65 72 2c 20 61 6e 64 20 74  ard order, and t
23790 68 65 20 70 68 72 61 73 65 20 63 6f 6e 73 69 73  he phrase consis
237a0 74 73 20 6f 66 20 0a 20 20 2a 2a 20 4d 41 58 5f  ts of .  ** MAX_
237b0 49 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45  INCR_PHRASE_TOKE
237c0 4e 53 20 6f 72 20 66 65 77 65 72 20 74 6f 6b 65  NS or fewer toke
237d0 6e 73 2c 20 6e 6f 6e 65 20 6f 66 20 77 68 69 63  ns, none of whic
237e0 68 20 61 72 65 20 61 72 65 20 22 5e 66 69 72 73  h are are "^firs
237f0 74 22 0a 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 6f  t".  ** tokens o
23800 72 20 70 72 65 66 69 78 20 74 6f 6b 65 6e 73 20  r prefix tokens 
23810 74 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20  that cannot use 
23820 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78 2e 20  a prefix-index. 
23830 20 2a 2f 0a 20 20 69 6e 74 20 62 48 61 76 65 49   */.  int bHaveI
23840 6e 63 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  ncr = 0;.  int b
23850 49 6e 63 72 4f 6b 20 3d 20 28 62 4f 70 74 4f 6b  IncrOk = (bOptOk
23860 20 0a 20 20 20 26 26 20 70 43 73 72 2d 3e 62 44   .   && pCsr->bD
23870 65 73 63 3d 3d 70 54 61 62 2d 3e 62 44 65 73 63  esc==pTab->bDesc
23880 49 64 78 20 0a 20 20 20 26 26 20 70 2d 3e 6e 54  Idx .   && p->nT
23890 6f 6b 65 6e 3c 3d 4d 41 58 5f 49 4e 43 52 5f 50  oken<=MAX_INCR_P
238a0 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20 26 26 20  HRASE_TOKENS && 
238b0 70 2d 3e 6e 54 6f 6b 65 6e 3e 30 0a 23 69 66 64  p->nToken>0.#ifd
238c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
238d0 20 20 26 26 20 70 54 61 62 2d 3e 62 4e 6f 49 6e    && pTab->bNoIn
238e0 63 72 44 6f 63 6c 69 73 74 3d 3d 30 0a 23 65 6e  crDoclist==0.#en
238f0 64 69 66 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69  dif.  );.  for(i
23900 3d 30 3b 20 62 49 6e 63 72 4f 6b 3d 3d 31 20 26  =0; bIncrOk==1 &
23910 26 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b 20 69  & i<p->nToken; i
23920 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 50 68 72  ++){.    Fts3Phr
23930 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  aseToken *pToken
23940 20 3d 20 26 70 2d 3e 61 54 6f 6b 65 6e 5b 69 5d   = &p->aToken[i]
23950 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
23960 2d 3e 62 46 69 72 73 74 20 7c 7c 20 28 70 54 6f  ->bFirst || (pTo
23970 6b 65 6e 2d 3e 70 53 65 67 63 73 72 21 3d 30 20  ken->pSegcsr!=0 
23980 26 26 20 21 70 54 6f 6b 65 6e 2d 3e 70 53 65 67  && !pToken->pSeg
23990 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 29 20 29 7b  csr->bLookup) ){
239a0 0a 20 20 20 20 20 20 62 49 6e 63 72 4f 6b 20 3d  .      bIncrOk =
239b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
239c0 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  ( pToken->pSegcs
239d0 72 20 29 20 62 48 61 76 65 49 6e 63 72 20 3d 20  r ) bHaveIncr = 
239e0 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 49  1;.  }..  if( bI
239f0 6e 63 72 4f 6b 20 26 26 20 62 48 61 76 65 49 6e  ncrOk && bHaveIn
23a00 63 72 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 65  cr ){.    /* Use
23a10 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
23a20 20 61 70 70 72 6f 61 63 68 2e 20 2a 2f 0a 20 20   approach. */.  
23a30 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 28 70 2d    int iCol = (p-
23a40 3e 69 43 6f 6c 75 6d 6e 20 3e 3d 20 70 54 61 62  >iColumn >= pTab
23a50 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a  ->nColumn ? -1 :
23a60 20 70 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20   p->iColumn);.  
23a70 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
23a80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
23a90 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20  >nToken; i++){. 
23aa0 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54       Fts3PhraseT
23ab0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
23ac0 70 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20  p->aToken[i];.  
23ad0 20 20 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67      Fts3MultiSeg
23ae0 52 65 61 64 65 72 20 2a 70 53 65 67 63 73 72 20  Reader *pSegcsr 
23af0 3d 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  = pToken->pSegcs
23b00 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  r;.      if( pSe
23b10 67 63 73 72 20 29 7b 0a 20 20 20 20 20 20 20 20  gcsr ){.        
23b20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
23b30 4d 73 72 49 6e 63 72 53 74 61 72 74 28 70 54 61  MsrIncrStart(pTa
23b40 62 2c 20 70 53 65 67 63 73 72 2c 20 69 43 6f 6c  b, pSegcsr, iCol
23b50 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
23b60 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 7d  ken->n);.      }
23b70 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 62 49  .    }.    p->bI
23b80 6e 63 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ncr = 1;.  }else
23b90 7b 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  {.    /* Load th
23ba0 65 20 66 75 6c 6c 20 64 6f 63 6c 69 73 74 20 66  e full doclist f
23bb0 6f 72 20 74 68 65 20 70 68 72 61 73 65 20 69 6e  or the phrase in
23bc0 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
23bd0 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 50    rc = fts3EvalP
23be0 68 72 61 73 65 4c 6f 61 64 28 70 43 73 72 2c 20  hraseLoad(pCsr, 
23bf0 70 29 3b 0a 20 20 20 20 70 2d 3e 62 49 6e 63 72  p);.    p->bIncr
23c00 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 0;.  }..  ass
23c10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23c20 4f 4b 20 7c 7c 20 70 2d 3e 6e 54 6f 6b 65 6e 3c  OK || p->nToken<
23c30 31 20 7c 7c 20 70 2d 3e 61 54 6f 6b 65 6e 5b 30  1 || p->aToken[0
23c40 5d 2e 70 53 65 67 63 73 72 3d 3d 30 20 7c 7c 20  ].pSegcsr==0 || 
23c50 70 2d 3e 62 49 6e 63 72 20 29 3b 0a 20 20 72 65  p->bIncr );.  re
23c60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23c70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23c80 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
23c90 74 65 20 62 61 63 6b 77 61 72 64 73 20 28 66 72  te backwards (fr
23ca0 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 20 73 74  om the end to st
23cb0 61 72 74 29 20 0a 2a 2a 20 74 68 72 6f 75 67 68  art) .** through
23cc0 20 64 6f 63 6c 69 73 74 73 2e 20 49 74 20 69 73   doclists. It is
23cd0 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6d 6f   used by this mo
23ce0 64 75 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20  dule to iterate 
23cf0 74 68 72 6f 75 67 68 20 70 68 72 61 73 65 0a 2a  through phrase.*
23d00 2a 20 64 6f 63 6c 69 73 74 73 20 69 6e 20 72 65  * doclists in re
23d10 76 65 72 73 65 20 61 6e 64 20 62 79 20 74 68 65  verse and by the
23d20 20 66 74 73 33 5f 77 72 69 74 65 2e 63 20 6d 6f   fts3_write.c mo
23d30 64 75 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20  dule to iterate 
23d40 74 68 72 6f 75 67 68 0a 2a 2a 20 70 65 6e 64 69  through.** pendi
23d50 6e 67 2d 74 65 72 6d 73 20 6c 69 73 74 73 20 77  ng-terms lists w
23d60 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 64  hen writing to d
23d70 61 74 61 62 61 73 65 73 20 77 69 74 68 20 22 6f  atabases with "o
23d80 72 64 65 72 3d 64 65 73 63 22 2e 0a 2a 2a 0a 2a  rder=desc"..**.*
23d90 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  * The doclist ma
23da0 79 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 61  y be sorted in a
23db0 73 63 65 6e 64 69 6e 67 20 28 70 61 72 61 6d 65  scending (parame
23dc0 74 65 72 20 62 44 65 73 63 49 64 78 3d 3d 30 29  ter bDescIdx==0)
23dd0 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69   or .** descendi
23de0 6e 67 20 28 70 61 72 61 6d 65 74 65 72 20 62 44  ng (parameter bD
23df0 65 73 63 49 64 78 3d 3d 31 29 20 6f 72 64 65 72  escIdx==1) order
23e00 20 6f 66 20 64 6f 63 69 64 2e 20 52 65 67 61 72   of docid. Regar
23e10 64 6c 65 73 73 2c 20 74 68 69 73 0a 2a 2a 20 66  dless, this.** f
23e20 75 6e 63 74 69 6f 6e 20 69 74 65 72 61 74 65 73  unction iterates
23e30 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
23e40 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f 20   the doclist to 
23e50 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a  the beginning..*
23e60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
23e70 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 0a 20  s3DoclistPrev(. 
23e80 20 69 6e 74 20 62 44 65 73 63 49 64 78 2c 20 20   int bDescIdx,  
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ea0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
23eb0 64 6f 63 6c 69 73 74 20 69 73 20 64 65 73 63 20  doclist is desc 
23ec0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c  */.  char *aDocl
23ed0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
23ee0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23ef0 74 6f 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  to entire doclis
23f00 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  t */.  int nDocl
23f10 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
23f20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
23f30 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 6e 20   of aDoclist in 
23f40 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
23f50 2a 2a 70 70 49 74 65 72 2c 20 20 20 20 20 20 20  **ppIter,       
23f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
23f70 2f 4f 55 54 3a 20 49 74 65 72 61 74 6f 72 20 70  /OUT: Iterator p
23f80 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ointer */.  sqli
23f90 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63  te3_int64 *piDoc
23fa0 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  id,         /* I
23fb0 4e 2f 4f 55 54 3a 20 44 6f 63 69 64 20 70 6f 69  N/OUT: Docid poi
23fc0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  nter */.  int *p
23fd0 6e 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  nList,          
23fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
23ff0 3a 20 4c 69 73 74 20 6c 65 6e 67 74 68 20 70 6f  : List length po
24000 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
24010 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
24020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24030 54 3a 20 45 6e 64 2d 6f 66 2d 66 69 6c 65 20 66  T: End-of-file f
24040 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  lag */.){.  char
24050 20 2a 70 20 3d 20 2a 70 70 49 74 65 72 3b 0a 0a   *p = *ppIter;..
24060 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c 69    assert( nDocli
24070 73 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  st>0 );.  assert
24080 28 20 2a 70 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  ( *pbEof==0 );. 
24090 20 61 73 73 65 72 74 28 20 70 20 7c 7c 20 2a 70   assert( p || *p
240a0 69 44 6f 63 69 64 3d 3d 30 20 29 3b 0a 20 20 61  iDocid==0 );.  a
240b0 73 73 65 72 74 28 20 21 70 20 7c 7c 20 28 70 3e  ssert( !p || (p>
240c0 61 44 6f 63 6c 69 73 74 20 26 26 20 70 3c 26 61  aDoclist && p<&a
240d0 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74  Doclist[nDoclist
240e0 5d 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 3d 3d  ]) );..  if( p==
240f0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
24100 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20  _int64 iDocid = 
24110 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  0;.    char *pNe
24120 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  xt = 0;.    char
24130 20 2a 70 44 6f 63 69 64 20 3d 20 61 44 6f 63 6c   *pDocid = aDocl
24140 69 73 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ist;.    char *p
24150 45 6e 64 20 3d 20 26 61 44 6f 63 6c 69 73 74 5b  End = &aDoclist[
24160 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 69  nDoclist];.    i
24170 6e 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 0a 20 20  nt iMul = 1;..  
24180 20 20 77 68 69 6c 65 28 20 70 44 6f 63 69 64 3c    while( pDocid<
24190 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  pEnd ){.      sq
241a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
241b0 74 61 3b 0a 20 20 20 20 20 20 70 44 6f 63 69 64  ta;.      pDocid
241c0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
241d0 65 74 56 61 72 69 6e 74 28 70 44 6f 63 69 64 2c  etVarint(pDocid,
241e0 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
241f0 20 69 44 6f 63 69 64 20 2b 3d 20 28 69 4d 75 6c   iDocid += (iMul
24200 20 2a 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20   * iDelta);.    
24210 20 20 70 4e 65 78 74 20 3d 20 70 44 6f 63 69 64    pNext = pDocid
24220 3b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  ;.      fts3Posl
24230 69 73 74 43 6f 70 79 28 30 2c 20 26 70 44 6f 63  istCopy(0, &pDoc
24240 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  id);.      while
24250 28 20 70 44 6f 63 69 64 3c 70 45 6e 64 20 26 26  ( pDocid<pEnd &&
24260 20 2a 70 44 6f 63 69 64 3d 3d 30 20 29 20 70 44   *pDocid==0 ) pD
24270 6f 63 69 64 2b 2b 3b 0a 20 20 20 20 20 20 69 4d  ocid++;.      iM
24280 75 6c 20 3d 20 28 62 44 65 73 63 49 64 78 20 3f  ul = (bDescIdx ?
24290 20 2d 31 20 3a 20 31 29 3b 0a 20 20 20 20 7d 0a   -1 : 1);.    }.
242a0 0a 20 20 20 20 2a 70 6e 4c 69 73 74 20 3d 20 28  .    *pnList = (
242b0 69 6e 74 29 28 70 45 6e 64 20 2d 20 70 4e 65 78  int)(pEnd - pNex
242c0 74 29 3b 0a 20 20 20 20 2a 70 70 49 74 65 72 20  t);.    *ppIter 
242d0 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 2a 70 69  = pNext;.    *pi
242e0 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
242f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
24300 20 69 4d 75 6c 20 3d 20 28 62 44 65 73 63 49 64   iMul = (bDescId
24310 78 20 3f 20 2d 31 20 3a 20 31 29 3b 0a 20 20 20  x ? -1 : 1);.   
24320 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
24330 44 65 6c 74 61 3b 0a 20 20 20 20 66 74 73 33 47  Delta;.    fts3G
24340 65 74 52 65 76 65 72 73 65 56 61 72 69 6e 74 28  etReverseVarint(
24350 26 70 2c 20 61 44 6f 63 6c 69 73 74 2c 20 26 69  &p, aDoclist, &i
24360 44 65 6c 74 61 29 3b 0a 20 20 20 20 2a 70 69 44  Delta);.    *piD
24370 6f 63 69 64 20 2d 3d 20 28 69 4d 75 6c 20 2a 20  ocid -= (iMul * 
24380 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20 20 69 66  iDelta);..    if
24390 28 20 70 3d 3d 61 44 6f 63 6c 69 73 74 20 29 7b  ( p==aDoclist ){
243a0 0a 20 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20  .      *pbEof = 
243b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
243c0 20 20 20 20 63 68 61 72 20 2a 70 53 61 76 65 20      char *pSave 
243d0 3d 20 70 3b 0a 20 20 20 20 20 20 66 74 73 33 52  = p;.      fts3R
243e0 65 76 65 72 73 65 50 6f 73 6c 69 73 74 28 61 44  eversePoslist(aD
243f0 6f 63 6c 69 73 74 2c 20 26 70 29 3b 0a 20 20 20  oclist, &p);.   
24400 20 20 20 2a 70 6e 4c 69 73 74 20 3d 20 28 69 6e     *pnList = (in
24410 74 29 28 70 53 61 76 65 20 2d 20 70 29 3b 0a 20  t)(pSave - p);. 
24420 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 74 65 72     }.    *ppIter
24430 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = p;.  }.}../*.
24440 2a 2a 20 49 74 65 72 61 74 65 20 66 6f 72 77 61  ** Iterate forwa
24450 72 64 73 20 74 68 72 6f 75 67 68 20 61 20 64 6f  rds through a do
24460 63 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  clist..*/.void s
24470 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73  qlite3Fts3Doclis
24480 74 4e 65 78 74 28 0a 20 20 69 6e 74 20 62 44 65  tNext(.  int bDe
24490 73 63 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  scIdx,          
244a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
244b0 20 69 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   if the doclist 
244c0 69 73 20 64 65 73 63 20 2a 2f 0a 20 20 63 68 61  is desc */.  cha
244d0 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20  r *aDoclist,    
244e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
244f0 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 69 72  Pointer to entir
24500 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69  e doclist */.  i
24510 6e 74 20 6e 44 6f 63 6c 69 73 74 2c 20 20 20 20  nt nDoclist,    
24520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24530 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 44 6f 63  * Length of aDoc
24540 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
24550 0a 20 20 63 68 61 72 20 2a 2a 70 70 49 74 65 72  .  char **ppIter
24560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24570 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 74     /* IN/OUT: It
24580 65 72 61 74 6f 72 20 70 6f 69 6e 74 65 72 20 2a  erator pointer *
24590 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
245a0 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20  4 *piDocid,     
245b0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44      /* IN/OUT: D
245c0 6f 63 69 64 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ocid pointer */.
245d0 20 20 75 38 20 2a 70 62 45 6f 66 20 20 20 20 20    u8 *pbEof     
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 2d 6f 66    /* OUT: End-of
24600 2d 66 69 6c 65 20 66 6c 61 67 20 2a 2f 0a 29 7b  -file flag */.){
24610 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70  .  char *p = *pp
24620 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
24630 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 3b 0a 20   nDoclist>0 );. 
24640 20 61 73 73 65 72 74 28 20 2a 70 62 45 6f 66 3d   assert( *pbEof=
24650 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
24660 70 20 7c 7c 20 2a 70 69 44 6f 63 69 64 3d 3d 30  p || *piDocid==0
24670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
24680 20 7c 7c 20 28 70 3e 3d 61 44 6f 63 6c 69 73 74   || (p>=aDoclist
24690 20 26 26 20 70 3c 3d 26 61 44 6f 63 6c 69 73 74   && p<=&aDoclist
246a0 5b 6e 44 6f 63 6c 69 73 74 5d 29 20 29 3b 0a 0a  [nDoclist]) );..
246b0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
246c0 20 20 70 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a    p = aDoclist;.
246d0 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33      p += sqlite3
246e0 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c  Fts3GetVarint(p,
246f0 20 70 69 44 6f 63 69 64 29 3b 0a 20 20 7d 65 6c   piDocid);.  }el
24700 73 65 7b 0a 20 20 20 20 66 74 73 33 50 6f 73 6c  se{.    fts3Posl
24710 69 73 74 43 6f 70 79 28 30 2c 20 26 70 29 3b 0a  istCopy(0, &p);.
24720 20 20 20 20 77 68 69 6c 65 28 20 70 3c 26 61 44      while( p<&aD
24730 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d  oclist[nDoclist]
24740 20 26 26 20 2a 70 3d 3d 30 20 29 20 70 2b 2b 3b   && *p==0 ) p++;
24750 20 0a 20 20 20 20 69 66 28 20 70 3e 3d 26 61 44   .    if( p>=&aD
24760 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d  oclist[nDoclist]
24770 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 45 6f 66   ){.      *pbEof
24780 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
24790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
247a0 6e 74 36 34 20 69 56 61 72 3b 0a 20 20 20 20 20  nt64 iVar;.     
247b0 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   p += sqlite3Fts
247c0 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69  3GetVarint(p, &i
247d0 56 61 72 29 3b 0a 20 20 20 20 20 20 2a 70 69 44  Var);.      *piD
247e0 6f 63 69 64 20 2b 3d 20 28 28 62 44 65 73 63 49  ocid += ((bDescI
247f0 64 78 20 3f 20 2d 31 20 3a 20 31 29 20 2a 20 69  dx ? -1 : 1) * i
24800 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Var);.    }.  }.
24810 0a 20 20 2a 70 70 49 74 65 72 20 3d 20 70 3b 0a  .  *ppIter = p;.
24820 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
24830 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 44   the iterator pD
24840 4c 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  L to the next en
24850 74 72 79 20 69 6e 20 70 44 4c 2d 3e 61 41 6c 6c  try in pDL->aAll
24860 2f 6e 41 6c 6c 2e 20 53 65 74 20 2a 70 62 45 6f  /nAll. Set *pbEo
24870 66 0a 2a 2a 20 74 6f 20 74 72 75 65 20 69 66 20  f.** to true if 
24880 45 4f 46 20 69 73 20 72 65 61 63 68 65 64 2e 0a  EOF is reached..
24890 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
248a0 74 73 33 45 76 61 6c 44 6c 50 68 72 61 73 65 4e  ts3EvalDlPhraseN
248b0 65 78 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ext(.  Fts3Table
248c0 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 44 6f   *pTab,.  Fts3Do
248d0 63 6c 69 73 74 20 2a 70 44 4c 2c 0a 20 20 75 38  clist *pDL,.  u8
248e0 20 2a 70 62 45 6f 66 0a 29 7b 0a 20 20 63 68 61   *pbEof.){.  cha
248f0 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
24900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24910 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
24920 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
24930 61 41 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  aAll */.  char *
24940 70 45 6e 64 20 3d 20 26 70 44 4c 2d 3e 61 41 6c  pEnd = &pDL->aAl
24950 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c 5d 3b 20 20 20  l[pDL->nAll];   
24960 20 20 2f 2a 20 31 20 62 79 74 65 20 70 61 73 74    /* 1 byte past
24970 20 65 6e 64 20 6f 66 20 61 41 6c 6c 20 2a 2f 0a   end of aAll */.
24980 20 0a 20 20 69 66 28 20 70 44 4c 2d 3e 70 4e 65   .  if( pDL->pNe
24990 78 74 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 70  xtDocid ){.    p
249a0 49 74 65 72 20 3d 20 70 44 4c 2d 3e 70 4e 65 78  Iter = pDL->pNex
249b0 74 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  tDocid;.  }else{
249c0 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70 44 4c  .    pIter = pDL
249d0 2d 3e 61 41 6c 6c 3b 0a 20 20 7d 0a 0a 20 20 69  ->aAll;.  }..  i
249e0 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29  f( pIter>=pEnd )
249f0 7b 0a 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65  {.    /* We have
24a00 20 61 6c 72 65 61 64 79 20 72 65 61 63 68 65 64   already reached
24a10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
24a20 20 64 6f 63 6c 69 73 74 2e 20 45 4f 46 2e 20 2a   doclist. EOF. *
24a30 2f 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 31  /.    *pbEof = 1
24a40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
24a50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
24a60 6c 74 61 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  lta;.    pIter +
24a70 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
24a80 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 26 69  Varint(pIter, &i
24a90 44 65 6c 74 61 29 3b 0a 20 20 20 20 69 66 28 20  Delta);.    if( 
24aa0 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 3d 3d  pTab->bDescIdx==
24ab0 30 20 7c 7c 20 70 44 4c 2d 3e 70 4e 65 78 74 44  0 || pDL->pNextD
24ac0 6f 63 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ocid==0 ){.     
24ad0 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20 2b 3d 20   pDL->iDocid += 
24ae0 69 44 65 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73  iDelta;.    }els
24af0 65 7b 0a 20 20 20 20 20 20 70 44 4c 2d 3e 69 44  e{.      pDL->iD
24b00 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  ocid -= iDelta;.
24b10 20 20 20 20 7d 0a 20 20 20 20 70 44 4c 2d 3e 70      }.    pDL->p
24b20 4c 69 73 74 20 3d 20 70 49 74 65 72 3b 0a 20 20  List = pIter;.  
24b30 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
24b40 79 28 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  y(0, &pIter);.  
24b50 20 20 70 44 4c 2d 3e 6e 4c 69 73 74 20 3d 20 28    pDL->nList = (
24b60 69 6e 74 29 28 70 49 74 65 72 20 2d 20 70 44 4c  int)(pIter - pDL
24b70 2d 3e 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 2f  ->pList);..    /
24b80 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
24b90 74 73 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  ts just past the
24ba0 20 30 78 30 30 20 74 68 61 74 20 74 65 72 6d 69   0x00 that termi
24bb0 6e 61 74 65 73 20 74 68 65 20 70 6f 73 69 74 69  nates the positi
24bc0 6f 6e 2d 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  on-.    ** list 
24bd0 66 6f 72 20 64 6f 63 75 6d 65 6e 74 20 70 44 4c  for document pDL
24be0 2d 3e 69 44 6f 63 69 64 2e 20 48 6f 77 65 76 65  ->iDocid. Howeve
24bf0 72 2c 20 69 66 20 74 68 69 73 20 70 6f 73 69 74  r, if this posit
24c00 69 6f 6e 2d 6c 69 73 74 20 77 61 73 0a 20 20 20  ion-list was.   
24c10 20 2a 2a 20 65 64 69 74 65 64 20 69 6e 20 70 6c   ** edited in pl
24c20 61 63 65 20 62 79 20 66 74 73 33 45 76 61 6c 4e  ace by fts3EvalN
24c30 65 61 72 54 72 69 6d 28 29 2c 20 74 68 65 6e 20  earTrim(), then 
24c40 70 49 74 65 72 20 6d 61 79 20 6e 6f 74 20 61 63  pIter may not ac
24c50 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  tually.    ** po
24c60 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  int to the start
24c70 20 6f 66 20 74 68 65 20 6e 65 78 74 20 64 6f 63   of the next doc
24c80 69 64 20 76 61 6c 75 65 2e 20 54 68 65 20 66 6f  id value. The fo
24c90 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 20 64 65 61  llowing line dea
24ca0 6c 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ls.    ** with t
24cb0 68 69 73 20 63 61 73 65 20 62 79 20 61 64 76 61  his case by adva
24cc0 6e 63 69 6e 67 20 70 49 74 65 72 20 70 61 73 74  ncing pIter past
24cd0 20 74 68 65 20 7a 65 72 6f 2d 70 61 64 64 69 6e   the zero-paddin
24ce0 67 20 61 64 64 65 64 20 62 79 0a 20 20 20 20 2a  g added by.    *
24cf0 2a 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72  * fts3EvalNearTr
24d00 69 6d 28 29 2e 20 20 2a 2f 0a 20 20 20 20 77 68  im().  */.    wh
24d10 69 6c 65 28 20 70 49 74 65 72 3c 70 45 6e 64 20  ile( pIter<pEnd 
24d20 26 26 20 2a 70 49 74 65 72 3d 3d 30 20 29 20 70  && *pIter==0 ) p
24d30 49 74 65 72 2b 2b 3b 0a 0a 20 20 20 20 70 44 4c  Iter++;..    pDL
24d40 2d 3e 70 4e 65 78 74 44 6f 63 69 64 20 3d 20 70  ->pNextDocid = p
24d50 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
24d60 28 20 70 49 74 65 72 3e 3d 26 70 44 4c 2d 3e 61  ( pIter>=&pDL->a
24d70 41 6c 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c 5d 20 7c  All[pDL->nAll] |
24d80 7c 20 2a 70 49 74 65 72 20 29 3b 0a 20 20 20 20  | *pIter );.    
24d90 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a  *pbEof = 0;.  }.
24da0 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
24db0 74 79 70 65 20 75 73 65 64 20 62 79 20 66 74 73  type used by fts
24dc0 33 45 76 61 6c 49 6e 63 72 50 68 72 61 73 65 4e  3EvalIncrPhraseN
24dd0 65 78 74 28 29 20 61 6e 64 20 69 6e 63 72 50 68  ext() and incrPh
24de0 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28 29 2e  raseTokenNext().
24df0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
24e00 63 74 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 20  ct TokenDoclist 
24e10 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 3b 0a 73 74  TokenDoclist;.st
24e20 72 75 63 74 20 54 6f 6b 65 6e 44 6f 63 6c 69 73  ruct TokenDoclis
24e30 74 20 7b 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72  t {.  int bIgnor
24e40 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  e;.  sqlite3_int
24e50 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 63 68 61  64 iDocid;.  cha
24e60 72 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  r *pList;.  int 
24e70 6e 4c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nList;.};../*.**
24e80 20 54 6f 6b 65 6e 20 70 54 6f 6b 65 6e 20 69 73   Token pToken is
24e90 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c   an incrementall
24ea0 79 20 6c 6f 61 64 65 64 20 74 6f 6b 65 6e 20 74  y loaded token t
24eb0 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
24ec0 20 0a 2a 2a 20 6d 75 6c 74 69 2d 74 6f 6b 65 6e   .** multi-token
24ed0 20 70 68 72 61 73 65 2e 20 41 64 76 61 6e 63 65   phrase. Advance
24ee0 20 69 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20   it to the next 
24ef0 6d 61 74 63 68 69 6e 67 20 64 6f 63 75 6d 65 6e  matching documen
24f00 74 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  t in the.** data
24f10 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
24f20 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
24f30 65 20 2a 70 20 77 69 74 68 20 74 68 65 20 64 65  e *p with the de
24f40 74 61 69 6c 73 20 6f 66 20 74 68 65 20 6e 65 77  tails of the new
24f50 0a 2a 2a 20 65 6e 74 72 79 2e 20 4f 72 2c 20 69  .** entry. Or, i
24f60 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 68  f the iterator h
24f70 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2c 20  as reached EOF, 
24f80 73 65 74 20 2a 70 62 45 6f 66 20 74 6f 20 74 72  set *pbEof to tr
24f90 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ue..**.** If an 
24fa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
24fb0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
24fc0 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
24fd0 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
24fe0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
24ff0 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 50 68  tatic int incrPh
25000 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28 0a 20  raseTokenNext(. 
25010 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
25020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25030 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
25040 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
25050 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
25060 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
25070 20 50 68 72 61 73 65 20 74 6f 20 61 64 76 61 6e   Phrase to advan
25080 63 65 20 74 6f 6b 65 6e 20 6f 66 20 2a 2f 0a 20  ce token of */. 
25090 20 69 6e 74 20 69 54 6f 6b 65 6e 2c 20 20 20 20   int iToken,    
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 2f 2a 20 53 70 65 63 69 66 69 63 20 74 6f 6b   /* Specific tok
250c0 65 6e 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  en to advance */
250d0 0a 20 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 20  .  TokenDoclist 
250e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
250f0 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64     /* OUT: Docid
25100 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 66 6f 72   and doclist for
25110 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
25120 75 38 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20  u8 *pbEof       
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
25150 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
25160 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  OF */.){.  int r
25170 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25180 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 69    if( pPhrase->i
25190 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3d 3d 69 54  DoclistToken==iT
251a0 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
251b0 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65 3d 3d  rt( p->bIgnore==
251c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
251d0 20 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e   pPhrase->aToken
251e0 5b 69 54 6f 6b 65 6e 5d 2e 70 53 65 67 63 73 72  [iToken].pSegcsr
251f0 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 33 45  ==0 );.    fts3E
25200 76 61 6c 44 6c 50 68 72 61 73 65 4e 65 78 74 28  valDlPhraseNext(
25210 70 54 61 62 2c 20 26 70 50 68 72 61 73 65 2d 3e  pTab, &pPhrase->
25220 64 6f 63 6c 69 73 74 2c 20 70 62 45 6f 66 29 3b  doclist, pbEof);
25230 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20  .    p->pList = 
25240 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
25250 2e 70 4c 69 73 74 3b 0a 20 20 20 20 70 2d 3e 6e  .pList;.    p->n
25260 4c 69 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e  List = pPhrase->
25270 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3b 0a 20  doclist.nList;. 
25280 20 20 20 70 2d 3e 69 44 6f 63 69 64 20 3d 20 70     p->iDocid = p
25290 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
252a0 69 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  iDocid;.  }else{
252b0 0a 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54  .    Fts3PhraseT
252c0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
252d0 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b  pPhrase->aToken[
252e0 69 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 61 73 73  iToken];.    ass
252f0 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44 65  ert( pToken->pDe
25300 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ferred==0 );.   
25310 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
25320 3e 70 53 65 67 63 73 72 20 7c 7c 20 70 50 68 72  >pSegcsr || pPhr
25330 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ase->iDoclistTok
25340 65 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  en>=0 );.    if(
25350 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72   pToken->pSegcsr
25360 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
25370 28 20 70 2d 3e 62 49 67 6e 6f 72 65 3d 3d 30 20  ( p->bIgnore==0 
25380 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
25390 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72  lite3Fts3MsrIncr
253a0 4e 65 78 74 28 0a 20 20 20 20 20 20 20 20 20 20  Next(.          
253b0 70 54 61 62 2c 20 70 54 6f 6b 65 6e 2d 3e 70 53  pTab, pToken->pS
253c0 65 67 63 73 72 2c 20 26 70 2d 3e 69 44 6f 63 69  egcsr, &p->iDoci
253d0 64 2c 20 26 70 2d 3e 70 4c 69 73 74 2c 20 26 70  d, &p->pList, &p
253e0 2d 3e 6e 4c 69 73 74 0a 20 20 20 20 20 20 29 3b  ->nList.      );
253f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
25400 69 73 74 3d 3d 30 20 29 20 2a 70 62 45 6f 66 20  ist==0 ) *pbEof 
25410 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
25420 20 20 20 20 20 20 70 2d 3e 62 49 67 6e 6f 72 65        p->bIgnore
25430 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
25440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25450 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 68 72 61  ../*.** The phra
25460 73 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  se iterator pass
25470 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
25480 20 61 72 67 75 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a   argument:.**.**
25490 20 20 20 2a 20 66 65 61 74 75 72 65 73 20 61 74     * features at
254a0 20 6c 65 61 73 74 20 6f 6e 65 20 74 6f 6b 65 6e   least one token
254b0 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
254c0 63 72 65 6d 65 6e 74 61 6c 20 64 6f 63 6c 69 73  cremental doclis
254d0 74 2c 20 61 6e 64 20 0a 2a 2a 0a 2a 2a 20 20 20  t, and .**.**   
254e0 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  * does not conta
254f0 69 6e 20 61 6e 79 20 64 65 66 65 72 72 65 64 20  in any deferred 
25500 74 6f 6b 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 64  tokens..**.** Ad
25510 76 61 6e 63 65 20 69 74 20 74 6f 20 74 68 65 20  vance it to the 
25520 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 64 6f  next matching do
25530 63 75 6d 6e 65 6e 74 20 69 6e 20 74 68 65 20 64  cumnent in the d
25540 61 74 61 62 61 73 65 20 61 6e 64 20 70 6f 70 75  atabase and popu
25550 6c 61 74 65 0a 2a 2a 20 74 68 65 20 46 74 73 33  late.** the Fts3
25560 44 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 61 6e  Doclist.pList an
25570 64 20 6e 4c 69 73 74 20 66 69 65 6c 64 73 2e 20  d nList fields. 
25580 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
25590 69 73 20 6e 6f 20 22 6e 65 78 74 22 20 65 6e 74  is no "next" ent
255a0 72 79 20 61 6e 64 20 6e 6f 20 65 72 72 6f 72 20  ry and no error 
255b0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 62  occurs, then *pb
255c0 45 6f 66 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  Eof is set to.**
255d0 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e   1 before return
255e0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
255f0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
25600 72 73 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  rs and the itera
25610 74 6f 72 20 69 73 0a 2a 2a 20 73 75 63 63 65 73  tor is.** succes
25620 73 66 75 6c 6c 79 20 61 64 76 61 6e 63 65 64 2c  sfully advanced,
25630 20 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20 74   *pbEof is set t
25640 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  o 0..**.** If an
25650 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
25660 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
25670 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
25680 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
25690 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  * SQLITE_OK..*/.
256a0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
256b0 76 61 6c 49 6e 63 72 50 68 72 61 73 65 4e 65 78  valIncrPhraseNex
256c0 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  t(.  Fts3Cursor 
256d0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
256e0 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73       /* FTS Curs
256f0 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  or handle */.  F
25700 74 73 33 50 68 72 61 73 65 20 2a 70 2c 20 20 20  ts3Phrase *p,   
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25720 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63 74 20  * Phrase object 
25730 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
25740 78 74 20 64 6f 63 69 64 20 2a 2f 0a 20 20 75 38  xt docid */.  u8
25750 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20 20 20   *pbEof         
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25770 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 31 20 69   OUT: Set to 1 i
25780 66 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e  f EOF */.){.  in
25790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
257a0 3b 0a 20 20 46 74 73 33 44 6f 63 6c 69 73 74 20  ;.  Fts3Doclist 
257b0 2a 70 44 4c 20 3d 20 26 70 2d 3e 64 6f 63 6c 69  *pDL = &p->docli
257c0 73 74 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  st;.  Fts3Table 
257d0 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
257e0 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
257f0 70 56 74 61 62 3b 0a 20 20 75 38 20 62 45 6f 66  pVtab;.  u8 bEof
25800 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
25810 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25820 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
25830 65 65 64 20 74 68 61 74 20 74 68 65 20 70 68 72  eed that the phr
25840 61 73 65 20 68 61 73 20 61 74 20 6c 65 61 73 74  ase has at least
25850 0a 20 20 2a 2a 20 6f 6e 65 20 69 6e 63 72 65 6d  .  ** one increm
25860 65 6e 74 61 6c 20 74 6f 6b 65 6e 2e 20 49 6e 20  ental token. In 
25870 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 62  which case the b
25880 49 6e 63 72 20 66 6c 61 67 20 69 73 20 73 65 74  Incr flag is set
25890 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
258a0 2d 3e 62 49 6e 63 72 3d 3d 31 20 29 3b 0a 0a 20  ->bIncr==1 );.. 
258b0 20 69 66 28 20 70 2d 3e 6e 54 6f 6b 65 6e 3d 3d   if( p->nToken==
258c0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 ){.    rc = sq
258d0 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72  lite3Fts3MsrIncr
258e0 4e 65 78 74 28 70 54 61 62 2c 20 70 2d 3e 61 54  Next(pTab, p->aT
258f0 6f 6b 65 6e 5b 30 5d 2e 70 53 65 67 63 73 72 2c  oken[0].pSegcsr,
25900 20 0a 20 20 20 20 20 20 20 20 26 70 44 4c 2d 3e   .        &pDL->
25910 69 44 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 70 4c  iDocid, &pDL->pL
25920 69 73 74 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73 74  ist, &pDL->nList
25930 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
25940 70 44 4c 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20  pDL->pList==0 ) 
25950 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bEof = 1;.  }els
25960 65 7b 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63  e{.    int bDesc
25970 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e  Doclist = pCsr->
25980 62 44 65 73 63 3b 0a 20 20 20 20 73 74 72 75 63  bDesc;.    struc
25990 74 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 20 61  t TokenDoclist a
259a0 5b 4d 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45  [MAX_INCR_PHRASE
259b0 5f 54 4f 4b 45 4e 53 5d 3b 0a 0a 20 20 20 20 6d  _TOKENS];..    m
259c0 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
259d0 6f 66 28 61 29 29 3b 0a 20 20 20 20 61 73 73 65  of(a));.    asse
259e0 72 74 28 20 70 2d 3e 6e 54 6f 6b 65 6e 3c 3d 4d  rt( p->nToken<=M
259f0 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54  AX_INCR_PHRASE_T
25a00 4f 4b 45 4e 53 20 29 3b 0a 20 20 20 20 61 73 73  OKENS );.    ass
25a10 65 72 74 28 20 70 2d 3e 69 44 6f 63 6c 69 73 74  ert( p->iDoclist
25a20 54 6f 6b 65 6e 3c 4d 41 58 5f 49 4e 43 52 5f 50  Token<MAX_INCR_P
25a30 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20 29 3b 0a  HRASE_TOKENS );.
25a40 0a 20 20 20 20 77 68 69 6c 65 28 20 62 45 6f 66  .    while( bEof
25a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
25a60 20 62 4d 61 78 53 65 74 20 3d 20 30 3b 0a 20 20   bMaxSet = 0;.  
25a70 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
25a80 34 20 69 4d 61 78 20 3d 20 30 3b 20 20 20 20 20  4 iMax = 0;     
25a90 2f 2a 20 4c 61 72 67 65 73 74 20 64 6f 63 69 64  /* Largest docid
25aa0 20 66 6f 72 20 61 6c 6c 20 69 74 65 72 61 74 6f   for all iterato
25ab0 72 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rs */.      int 
25ac0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
25ad0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
25ae0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
25af0 67 68 20 74 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20  gh tokens */..  
25b00 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
25b10 68 65 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  he iterator for 
25b20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68  each token in th
25b30 65 20 70 68 72 61 73 65 20 6f 6e 63 65 2e 20 2a  e phrase once. *
25b40 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
25b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25b60 26 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e 20 26 26  & i<p->nToken &&
25b70 20 62 45 6f 66 3d 3d 30 3b 20 69 2b 2b 29 7b 0a   bEof==0; i++){.
25b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
25b90 72 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74  rPhraseTokenNext
25ba0 28 70 54 61 62 2c 20 70 2c 20 69 2c 20 26 61 5b  (pTab, p, i, &a[
25bb0 69 5d 2c 20 26 62 45 6f 66 29 3b 0a 20 20 20 20  i], &bEof);.    
25bc0 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 62 49 67      if( a[i].bIg
25bd0 6e 6f 72 65 3d 3d 30 20 26 26 20 28 62 4d 61 78  nore==0 && (bMax
25be0 53 65 74 3d 3d 30 20 7c 7c 20 44 4f 43 49 44 5f  Set==0 || DOCID_
25bf0 43 4d 50 28 69 4d 61 78 2c 20 61 5b 69 5d 2e 69  CMP(iMax, a[i].i
25c00 44 6f 63 69 64 29 3c 30 29 20 29 7b 0a 20 20 20  Docid)<0) ){.   
25c10 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 61 5b         iMax = a[
25c20 69 5d 2e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20  i].iDocid;.     
25c30 20 20 20 20 20 62 4d 61 78 53 65 74 20 3d 20 31       bMaxSet = 1
25c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25c50 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
25c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25c70 7c 7c 20 28 70 2d 3e 6e 54 6f 6b 65 6e 3e 3d 31  || (p->nToken>=1
25c80 20 26 26 20 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d   && a[p->nToken-
25c90 31 5d 2e 62 49 67 6e 6f 72 65 3d 3d 30 29 20 29  1].bIgnore==0) )
25ca0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
25cc0 20 62 4d 61 78 53 65 74 20 29 3b 0a 0a 20 20 20   bMaxSet );..   
25cd0 20 20 20 2f 2a 20 4b 65 65 70 20 61 64 76 61 6e     /* Keep advan
25ce0 63 69 6e 67 20 69 74 65 72 61 74 6f 72 73 20 75  cing iterators u
25cf0 6e 74 69 6c 20 74 68 65 79 20 61 6c 6c 20 70 6f  ntil they all po
25d00 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
25d10 64 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  document */.    
25d20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
25d30 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  nToken; i++){.  
25d40 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
25d50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
25d60 6f 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  of==0 .         
25d70 20 20 20 26 26 20 61 5b 69 5d 2e 62 49 67 6e 6f     && a[i].bIgno
25d80 72 65 3d 3d 30 20 26 26 20 44 4f 43 49 44 5f 43  re==0 && DOCID_C
25d90 4d 50 28 61 5b 69 5d 2e 69 44 6f 63 69 64 2c 20  MP(a[i].iDocid, 
25da0 69 4d 61 78 29 3c 30 20 0a 20 20 20 20 20 20 20  iMax)<0 .       
25db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25dc0 20 3d 20 69 6e 63 72 50 68 72 61 73 65 54 6f 6b   = incrPhraseTok
25dd0 65 6e 4e 65 78 74 28 70 54 61 62 2c 20 70 2c 20  enNext(pTab, p, 
25de0 69 2c 20 26 61 5b 69 5d 2c 20 26 62 45 6f 66 29  i, &a[i], &bEof)
25df0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25e00 44 4f 43 49 44 5f 43 4d 50 28 61 5b 69 5d 2e 69  DOCID_CMP(a[i].i
25e10 44 6f 63 69 64 2c 20 69 4d 61 78 29 3e 30 20 29  Docid, iMax)>0 )
25e20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4d  {.            iM
25e30 61 78 20 3d 20 61 5b 69 5d 2e 69 44 6f 63 69 64  ax = a[i].iDocid
25e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20  ;.            i 
25e50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
25e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25e70 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   }..      /* Che
25e80 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ck if the curren
25e90 74 20 65 6e 74 72 69 65 73 20 72 65 61 6c 6c 79  t entries really
25ea0 20 61 72 65 20 61 20 70 68 72 61 73 65 20 6d 61   are a phrase ma
25eb0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tch */.      if(
25ec0 20 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20   bEof==0 ){.    
25ed0 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20      int nList = 
25ee0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  0;.        int n
25ef0 42 79 74 65 20 3d 20 61 5b 70 2d 3e 6e 54 6f 6b  Byte = a[p->nTok
25f00 65 6e 2d 31 5d 2e 6e 4c 69 73 74 3b 0a 20 20 20  en-1].nList;.   
25f10 20 20 20 20 20 63 68 61 72 20 2a 61 44 6f 63 6c       char *aDocl
25f20 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ist = sqlite3_ma
25f30 6c 6c 6f 63 28 6e 42 79 74 65 2b 46 54 53 33 5f  lloc(nByte+FTS3_
25f40 42 55 46 46 45 52 5f 50 41 44 44 49 4e 47 29 3b  BUFFER_PADDING);
25f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 44  .        if( !aD
25f60 6f 63 6c 69 73 74 20 29 20 72 65 74 75 72 6e 20  oclist ) return 
25f70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25f80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 44 6f        memcpy(aDo
25f90 63 6c 69 73 74 2c 20 61 5b 70 2d 3e 6e 54 6f 6b  clist, a[p->nTok
25fa0 65 6e 2d 31 5d 2e 70 4c 69 73 74 2c 20 6e 42 79  en-1].pList, nBy
25fb0 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 6d  te+1);.        m
25fc0 65 6d 73 65 74 28 26 61 44 6f 63 6c 69 73 74 5b  emset(&aDoclist[
25fd0 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33 5f  nByte], 0, FTS3_
25fe0 42 55 46 46 45 52 5f 50 41 44 44 49 4e 47 29 3b  BUFFER_PADDING);
25ff0 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ..        for(i=
26000 30 3b 20 69 3c 28 70 2d 3e 6e 54 6f 6b 65 6e 2d  0; i<(p->nToken-
26010 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  1); i++){.      
26020 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 62 49 67      if( a[i].bIg
26030 6e 6f 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nore==0 ){.     
26040 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 20         char *pL 
26050 3d 20 61 5b 69 5d 2e 70 4c 69 73 74 3b 0a 20 20  = a[i].pList;.  
26060 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
26070 70 52 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20  pR = aDoclist;. 
26080 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
26090 2a 70 4f 75 74 20 3d 20 61 44 6f 63 6c 69 73 74  *pOut = aDoclist
260a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
260b0 74 20 6e 44 69 73 74 20 3d 20 70 2d 3e 6e 54 6f  t nDist = p->nTo
260c0 6b 65 6e 2d 31 2d 69 3b 0a 20 20 20 20 20 20 20  ken-1-i;.       
260d0 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66       int res = f
260e0 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65  ts3PoslistPhrase
260f0 4d 65 72 67 65 28 26 70 4f 75 74 2c 20 6e 44 69  Merge(&pOut, nDi
26100 73 74 2c 20 30 2c 20 31 2c 20 26 70 4c 2c 20 26  st, 0, 1, &pL, &
26110 70 52 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pR);.           
26120 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 62 72   if( res==0 ) br
26130 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
26140 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70   nList = (int)(p
26150 4f 75 74 20 2d 20 61 44 6f 63 6c 69 73 74 29 3b  Out - aDoclist);
26160 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26180 66 28 20 69 3d 3d 28 70 2d 3e 6e 54 6f 6b 65 6e  f( i==(p->nToken
26190 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
261a0 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20 3d 20 69   pDL->iDocid = i
261b0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Max;.          p
261c0 44 4c 2d 3e 70 4c 69 73 74 20 3d 20 61 44 6f 63  DL->pList = aDoc
261d0 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  list;.          
261e0 70 44 4c 2d 3e 6e 4c 69 73 74 20 3d 20 6e 4c 69  pDL->nList = nLi
261f0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  st;.          pD
26200 4c 2d 3e 62 46 72 65 65 4c 69 73 74 20 3d 20 31  L->bFreeList = 1
26210 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
26220 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
26230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26240 65 28 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  e(aDoclist);.   
26250 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
26260 20 20 2a 70 62 45 6f 66 20 3d 20 62 45 6f 66 3b    *pbEof = bEof;
26270 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26280 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
26290 6f 20 6d 6f 76 65 20 74 68 65 20 70 68 72 61 73  o move the phras
262a0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
262b0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
262c0 6d 61 74 63 68 69 6e 67 20 64 6f 63 69 64 2e 20  matching docid. 
262d0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
262e0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
262f0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26300 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
26310 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
26320 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
26330 68 65 72 65 20 69 73 20 6e 6f 20 22 6e 65 78 74  here is no "next
26340 22 20 65 6e 74 72 79 20 61 6e 64 20 6e 6f 20 65  " entry and no e
26350 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
26360 6e 20 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20  n *pbEof is set 
26370 74 6f 0a 2a 2a 20 31 20 62 65 66 6f 72 65 20 72  to.** 1 before r
26380 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77  eturning. Otherw
26390 69 73 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72  ise, if no error
263a0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
263b0 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 73  iterator is.** s
263c0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 64 76 61  uccessfully adva
263d0 6e 63 65 64 2c 20 2a 70 62 45 6f 66 20 69 73 20  nced, *pbEof is 
263e0 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
263f0 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c  tic int fts3Eval
26400 50 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46 74  PhraseNext(.  Ft
26410 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26430 20 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64   FTS Cursor hand
26440 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61  le */.  Fts3Phra
26450 73 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  se *p,          
26460 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
26470 65 20 6f 62 6a 65 63 74 20 74 6f 20 61 64 76 61  e object to adva
26480 6e 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69  nce to next doci
26490 64 20 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66  d */.  u8 *pbEof
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
264c0 65 74 20 74 6f 20 31 20 69 66 20 45 4f 46 20 2a  et to 1 if EOF *
264d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
264e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
264f0 33 44 6f 63 6c 69 73 74 20 2a 70 44 4c 20 3d 20  3Doclist *pDL = 
26500 26 70 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 46  &p->doclist;.  F
26510 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts3Table *pTab =
26520 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
26530 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
26540 0a 20 20 69 66 28 20 70 2d 3e 62 49 6e 63 72 20  .  if( p->bIncr 
26550 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
26560 45 76 61 6c 49 6e 63 72 50 68 72 61 73 65 4e 65  EvalIncrPhraseNe
26570 78 74 28 70 43 73 72 2c 20 70 2c 20 70 62 45 6f  xt(pCsr, p, pbEo
26580 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
26590 70 43 73 72 2d 3e 62 44 65 73 63 21 3d 70 54 61  pCsr->bDesc!=pTa
265a0 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 70  b->bDescIdx && p
265b0 44 4c 2d 3e 6e 41 6c 6c 20 29 7b 0a 20 20 20 20  DL->nAll ){.    
265c0 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
265d0 73 74 50 72 65 76 28 70 54 61 62 2d 3e 62 44 65  stPrev(pTab->bDe
265e0 73 63 49 64 78 2c 20 70 44 4c 2d 3e 61 41 6c 6c  scIdx, pDL->aAll
265f0 2c 20 70 44 4c 2d 3e 6e 41 6c 6c 2c 20 0a 20 20  , pDL->nAll, .  
26600 20 20 20 20 20 20 26 70 44 4c 2d 3e 70 4e 65 78        &pDL->pNex
26610 74 44 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 69 44  tDocid, &pDL->iD
26620 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73  ocid, &pDL->nLis
26630 74 2c 20 70 62 45 6f 66 0a 20 20 20 20 29 3b 0a  t, pbEof.    );.
26640 20 20 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d      pDL->pList =
26650 20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64   pDL->pNextDocid
26660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
26670 74 73 33 45 76 61 6c 44 6c 50 68 72 61 73 65 4e  ts3EvalDlPhraseN
26680 65 78 74 28 70 54 61 62 2c 20 70 44 4c 2c 20 70  ext(pTab, pDL, p
26690 62 45 6f 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  bEof);.  }..  re
266a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
266b0 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
266c0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
266d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
266e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
266f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
26700 68 65 72 77 69 73 65 2c 20 66 74 73 33 45 76 61  herwise, fts3Eva
26710 6c 50 68 72 61 73 65 53 74 61 72 74 28 29 20 69  lPhraseStart() i
26720 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20  s called on all 
26730 70 68 72 61 73 65 73 20 77 69 74 68 69 6e 20 74  phrases within t
26740 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
26750 2e 20 41 6c 73 6f 20 74 68 65 20 46 74 73 33 45  . Also the Fts3E
26760 78 70 72 2e 62 44 65 66 65 72 72 65 64 20 76 61  xpr.bDeferred va
26770 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
26780 20 74 72 75 65 20 66 6f 72 20 61 6e 79 0a 2a 2a   true for any.**
26790 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
267a0 20 77 68 69 63 68 20 61 6c 6c 20 64 65 73 63 65   which all desce
267b0 6e 64 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65  ndent tokens are
267c0 20 64 65 66 65 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   deferred..**.**
267d0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 62 4f   If parameter bO
267e0 70 74 4f 6b 20 69 73 20 7a 65 72 6f 2c 20 74 68  ptOk is zero, th
267f0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
26800 65 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  eed that the.** 
26810 46 74 73 33 50 68 72 61 73 65 2e 64 6f 63 6c 69  Fts3Phrase.docli
26820 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 20 76 61 72  st.aAll/nAll var
26830 69 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 20 74  iables contain t
26840 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
26850 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 70 68  t for.** each ph
26860 72 61 73 65 20 69 6e 20 74 68 65 20 65 78 70 72  rase in the expr
26870 65 73 73 69 6f 6e 20 28 73 75 62 6a 65 63 74 20  ession (subject 
26880 74 6f 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  to deferred toke
26890 6e 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 0a 2a  n processing)..*
268a0 2a 20 4f 72 2c 20 69 66 20 62 4f 70 74 4f 6b 20  * Or, if bOptOk 
268b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
268c0 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f  n one or more to
268d0 6b 65 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20  kens within the 
268e0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d 61  expression.** ma
268f0 79 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 63 72  y be loaded incr
26900 65 6d 65 6e 74 61 6c 6c 79 2c 20 6d 65 61 6e 69  ementally, meani
26910 6e 67 20 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f  ng doclist.aAll/
26920 6e 41 6c 6c 20 69 73 20 6e 6f 74 20 61 76 61 69  nAll is not avai
26930 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
26940 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26950 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
26960 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65  tion, *pRc is se
26970 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
26980 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 62 65 66  rror.** code bef
26990 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
269a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
269b0 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64 65  s3EvalStartReade
269c0 72 73 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  rs(.  Fts3Cursor
269d0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
269e0 20 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72        /* FTS Cur
269f0 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  sor handle */.  
26a00 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
26a30 20 69 6e 69 74 69 61 6c 69 7a 65 20 70 68 72 61   initialize phra
26a40 73 65 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  ses in */.  int 
26a50 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
26a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26a70 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
26a80 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  e */.){.  if( pE
26a90 78 70 72 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  xpr && SQLITE_OK
26aa0 3d 3d 2a 70 52 63 20 29 7b 0a 20 20 20 20 69 66  ==*pRc ){.    if
26ab0 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  ( pExpr->eType==
26ac0 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20  FTSQUERY_PHRASE 
26ad0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
26ae0 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70 50 68  ken = pExpr->pPh
26af0 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20  rase->nToken;.  
26b00 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
26b10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
26b20 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
26b30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29  ; i<nToken; i++)
26b40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26b50 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e  pExpr->pPhrase->
26b60 61 54 6f 6b 65 6e 5b 69 5d 2e 70 44 65 66 65 72  aToken[i].pDefer
26b70 72 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  red==0 ) break;.
26b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26b90 20 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72    pExpr->bDeferr
26ba0 65 64 20 3d 20 28 69 3d 3d 6e 54 6f 6b 65 6e 29  ed = (i==nToken)
26bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26bc0 2a 70 52 63 20 3d 20 66 74 73 33 45 76 61 6c 50  *pRc = fts3EvalP
26bd0 68 72 61 73 65 53 74 61 72 74 28 70 43 73 72 2c  hraseStart(pCsr,
26be0 20 31 2c 20 70 45 78 70 72 2d 3e 70 50 68 72 61   1, pExpr->pPhra
26bf0 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
26c00 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 53 74        fts3EvalSt
26c10 61 72 74 52 65 61 64 65 72 73 28 70 43 73 72 2c  artReaders(pCsr,
26c20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
26c30 52 63 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45  Rc);.      fts3E
26c40 76 61 6c 53 74 61 72 74 52 65 61 64 65 72 73 28  valStartReaders(
26c50 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  pCsr, pExpr->pRi
26c60 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  ght, pRc);.     
26c70 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65   pExpr->bDeferre
26c80 64 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  d = (pExpr->pLef
26c90 74 2d 3e 62 44 65 66 65 72 72 65 64 20 26 26 20  t->bDeferred && 
26ca0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 62  pExpr->pRight->b
26cb0 44 65 66 65 72 72 65 64 29 3b 0a 20 20 20 20 7d  Deferred);.    }
26cc0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
26cd0 20 61 72 72 61 79 20 6f 66 20 74 68 65 20 66 6f   array of the fo
26ce0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
26cf0 65 73 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20  es is assembled 
26d00 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  as part of the p
26d10 72 6f 63 65 73 73 0a 2a 2a 20 6f 66 20 73 65 6c  rocess.** of sel
26d20 65 63 74 69 6e 67 20 74 6f 6b 65 6e 73 20 74 6f  ecting tokens to
26d30 20 64 65 66 65 72 20 62 65 66 6f 72 65 20 74 68   defer before th
26d40 65 20 71 75 65 72 79 20 73 74 61 72 74 73 20 65  e query starts e
26d50 78 65 63 75 74 69 6e 67 20 28 61 73 20 70 61 72  xecuting (as par
26d60 74 0a 2a 2a 20 6f 66 20 74 68 65 20 78 46 69 6c  t.** of the xFil
26d70 74 65 72 28 29 20 6d 65 74 68 6f 64 29 2e 20 54  ter() method). T
26d80 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6c 65 6d  here is one elem
26d90 65 6e 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ent in the array
26da0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 74 6f 6b   for each.** tok
26db0 65 6e 20 69 6e 20 74 68 65 20 46 54 53 20 65 78  en in the FTS ex
26dc0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
26dd0 54 6f 6b 65 6e 73 20 61 72 65 20 64 69 76 69 64  Tokens are divid
26de0 65 64 20 69 6e 74 6f 20 41 4e 44 2f 4e 45 41 52  ed into AND/NEAR
26df0 20 63 6c 75 73 74 65 72 73 2e 20 41 6c 6c 20 74   clusters. All t
26e00 6f 6b 65 6e 73 20 69 6e 20 61 20 63 6c 75 73 74  okens in a clust
26e10 65 72 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  er belong.** to 
26e20 70 68 72 61 73 65 73 20 74 68 61 74 20 61 72 65  phrases that are
26e30 20 63 6f 6e 6e 65 63 74 65 64 20 6f 6e 6c 79 20   connected only 
26e40 62 79 20 41 4e 44 20 61 6e 64 20 4e 45 41 52 20  by AND and NEAR 
26e50 6f 70 65 72 61 74 6f 72 73 20 28 6e 6f 74 20 4f  operators (not O
26e60 52 20 6f 72 0a 2a 2a 20 4e 4f 54 29 2e 20 57 68  R or.** NOT). Wh
26e70 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  en determining t
26e80 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65 72 2c 20  okens to defer, 
26e90 65 61 63 68 20 41 4e 44 2f 4e 45 41 52 20 63 6c  each AND/NEAR cl
26ea0 75 73 74 65 72 20 69 73 20 63 6f 6e 73 69 64 65  uster is conside
26eb0 72 65 64 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c  red.** separatel
26ec0 79 2e 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  y. The root of a
26ed0 20 74 6f 6b 65 6e 73 20 41 4e 44 2f 4e 45 41 52   tokens AND/NEAR
26ee0 20 63 6c 75 73 74 65 72 20 69 73 20 73 74 6f 72   cluster is stor
26ef0 65 64 20 69 6e 20 0a 2a 2a 20 46 74 73 33 54 6f  ed in .** Fts3To
26f00 6b 65 6e 41 6e 64 43 6f 73 74 2e 70 52 6f 6f 74  kenAndCost.pRoot
26f10 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
26f20 75 63 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64  uct Fts3TokenAnd
26f30 43 6f 73 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e  Cost Fts3TokenAn
26f40 64 43 6f 73 74 3b 0a 73 74 72 75 63 74 20 46 74  dCost;.struct Ft
26f50 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 7b  s3TokenAndCost {
26f60 0a 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70  .  Fts3Phrase *p
26f70 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20  Phrase;         
26f80 20 20 20 2f 2a 20 54 68 65 20 70 68 72 61 73 65     /* The phrase
26f90 20 74 68 65 20 74 6f 6b 65 6e 20 62 65 6c 6f 6e   the token belon
26fa0 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  gs to */.  int i
26fb0 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20  Token;          
26fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
26fd0 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
26fe0 69 6e 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 46  in phrase */.  F
26ff0 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
27000 70 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f  pToken;        /
27010 2a 20 54 68 65 20 74 6f 6b 65 6e 20 69 74 73 65  * The token itse
27020 6c 66 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  lf */.  Fts3Expr
27030 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20 20 20   *pRoot;        
27040 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
27050 6f 66 20 4e 45 41 52 2f 41 4e 44 20 63 6c 75 73  of NEAR/AND clus
27060 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 76  ter */.  int nOv
27070 66 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fl;             
27080 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27090 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  er of overflow p
270a0 61 67 65 73 20 74 6f 20 6c 6f 61 64 20 64 6f 63  ages to load doc
270b0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  list */.  int iC
270c0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
270d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
270e0 20 63 6f 6c 75 6d 6e 20 74 68 65 20 74 6f 6b 65   column the toke
270f0 6e 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  n must match */.
27100 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
27110 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
27120 74 6f 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 61  to populate an a
27130 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 54 6f 6b  llocated Fts3Tok
27140 65 6e 41 6e 64 43 6f 73 74 20 61 72 72 61 79 2e  enAndCost array.
27150 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
27160 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
27170 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
27180 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
27190 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
271a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
271b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
271c0 72 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 2c 20  ring execution, 
271d0 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
271e0 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  n.** SQLite erro
271f0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
27200 63 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c 54  c void fts3EvalT
27210 6f 6b 65 6e 43 6f 73 74 73 28 0a 20 20 46 74 73  okenCosts(.  Fts
27220 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  3Cursor *pCsr,  
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27240 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c  FTS Cursor handl
27250 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  e */.  Fts3Expr 
27260 2a 70 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *pRoot,         
27270 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f         /* Root o
27280 66 20 63 75 72 72 65 6e 74 20 41 4e 44 2f 4e 45  f current AND/NE
27290 41 52 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20  AR cluster */.  
272a0 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
272b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272c0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
272d0 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 46   consider */.  F
272e0 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20  ts3TokenAndCost 
272f0 2a 2a 70 70 54 43 2c 20 20 20 20 20 20 20 20 2f  **ppTC,        /
27300 2a 20 57 72 69 74 65 20 6e 65 77 20 65 6e 74 72  * Write new entr
27310 69 65 73 20 74 6f 20 2a 28 2a 70 70 54 43 29 2b  ies to *(*ppTC)+
27320 2b 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  + */.  Fts3Expr 
27330 2a 2a 2a 70 70 4f 72 2c 20 20 20 20 20 20 20 20  ***ppOr,        
27340 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
27350 6e 65 77 20 4f 52 20 72 6f 6f 74 20 74 6f 20 2a  new OR root to *
27360 28 2a 70 70 4f 72 29 2b 2b 20 2a 2f 0a 20 20 69  (*ppOr)++ */.  i
27370 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27390 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
273a0 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  code */.){.  if(
273b0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
273c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
273d0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
273e0 52 59 5f 50 48 52 41 53 45 20 29 7b 0a 20 20 20  RY_PHRASE ){.   
273f0 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70     Fts3Phrase *p
27400 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e  Phrase = pExpr->
27410 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 69  pPhrase;.      i
27420 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
27430 69 3d 30 3b 20 2a 70 52 63 3d 3d 53 51 4c 49 54  i=0; *pRc==SQLIT
27440 45 5f 4f 4b 20 26 26 20 69 3c 70 50 68 72 61 73  E_OK && i<pPhras
27450 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b  e->nToken; i++){
27460 0a 20 20 20 20 20 20 20 20 46 74 73 33 54 6f 6b  .        Fts3Tok
27470 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d  enAndCost *pTC =
27480 20 28 2a 70 70 54 43 29 2b 2b 3b 0a 20 20 20 20   (*ppTC)++;.    
27490 20 20 20 20 70 54 43 2d 3e 70 50 68 72 61 73 65      pTC->pPhrase
274a0 20 3d 20 70 50 68 72 61 73 65 3b 0a 20 20 20 20   = pPhrase;.    
274b0 20 20 20 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 20      pTC->iToken 
274c0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 54 43  = i;.        pTC
274d0 2d 3e 70 52 6f 6f 74 20 3d 20 70 52 6f 6f 74 3b  ->pRoot = pRoot;
274e0 0a 20 20 20 20 20 20 20 20 70 54 43 2d 3e 70 54  .        pTC->pT
274f0 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61 73 65 2d  oken = &pPhrase-
27500 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20  >aToken[i];.    
27510 20 20 20 20 70 54 43 2d 3e 69 43 6f 6c 20 3d 20      pTC->iCol = 
27520 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e  pPhrase->iColumn
27530 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  ;.        *pRc =
27540 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f   sqlite3Fts3MsrO
27550 76 66 6c 28 70 43 73 72 2c 20 70 54 43 2d 3e 70  vfl(pCsr, pTC->p
27560 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2c 20  Token->pSegcsr, 
27570 26 70 54 43 2d 3e 6e 4f 76 66 6c 29 3b 0a 20 20  &pTC->nOvfl);.  
27580 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
27590 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65  if( pExpr->eType
275a0 21 3d 46 54 53 51 55 45 52 59 5f 4e 4f 54 20 29  !=FTSQUERY_NOT )
275b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
275c0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
275d0 53 51 55 45 52 59 5f 4f 52 0a 20 20 20 20 20 20  SQUERY_OR.      
275e0 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 65       || pExpr->e
275f0 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 41  Type==FTSQUERY_A
27600 4e 44 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ND.           ||
27610 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46   pExpr->eType==F
27620 54 53 51 55 45 52 59 5f 4e 45 41 52 0a 20 20 20  TSQUERY_NEAR.   
27630 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
27640 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
27650 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
27660 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
27670 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
27680 51 55 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20  QUERY_OR ){.    
27690 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 45 78 70      pRoot = pExp
276a0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
276b0 20 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74    **ppOr = pRoot
276c0 3b 0a 20 20 20 20 20 20 20 20 28 2a 70 70 4f 72  ;.        (*ppOr
276d0 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )++;.      }.   
276e0 20 20 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e     fts3EvalToken
276f0 43 6f 73 74 73 28 70 43 73 72 2c 20 70 52 6f 6f  Costs(pCsr, pRoo
27700 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  t, pExpr->pLeft,
27710 20 70 70 54 43 2c 20 70 70 4f 72 2c 20 70 52 63   ppTC, ppOr, pRc
27720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
27730 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
27740 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  ERY_OR ){.      
27750 20 20 70 52 6f 6f 74 20 3d 20 70 45 78 70 72 2d    pRoot = pExpr-
27760 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
27770 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74 3b   **ppOr = pRoot;
27780 0a 20 20 20 20 20 20 20 20 28 2a 70 70 4f 72 29  .        (*ppOr)
27790 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
277a0 20 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43    fts3EvalTokenC
277b0 6f 73 74 73 28 70 43 73 72 2c 20 70 52 6f 6f 74  osts(pCsr, pRoot
277c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
277d0 20 70 70 54 43 2c 20 70 70 4f 72 2c 20 70 52 63   ppTC, ppOr, pRc
277e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
277f0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
27800 74 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75  the average docu
27810 6d 65 6e 74 20 28 72 6f 77 29 20 73 69 7a 65 20  ment (row) size 
27820 69 6e 20 70 61 67 65 73 2e 20 49 66 20 73 75 63  in pages. If suc
27830 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 77 72 69 74  cessful,.** writ
27840 65 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  e this value to 
27850 2a 70 6e 50 61 67 65 20 61 6e 64 20 72 65 74 75  *pnPage and retu
27860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
27870 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a  herwise, return.
27880 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
27890 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
278a0 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d  he average docum
278b0 65 6e 74 20 73 69 7a 65 20 69 6e 20 70 61 67 65  ent size in page
278c0 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  s is calculated 
278d0 62 79 20 66 69 72 73 74 20 63 61 6c 63 75 6c 61  by first calcula
278e0 74 69 6e 67 20 0a 2a 2a 20 64 65 74 65 72 6d 69  ting .** determi
278f0 6e 69 6e 67 20 74 68 65 20 61 76 65 72 61 67 65  ning the average
27900 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2c 20   size in bytes, 
27910 42 2e 20 49 66 20 42 20 69 73 20 6c 65 73 73 20  B. If B is less 
27920 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  than the amount.
27930 2a 2a 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ** of data that 
27940 77 69 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73 69  will fit on a si
27950 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 20 6f  ngle leaf page o
27960 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  f an intkey tabl
27970 65 20 69 6e 0a 2a 2a 20 74 68 69 73 20 64 61 74  e in.** this dat
27980 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
27990 61 76 65 72 61 67 65 20 64 6f 63 73 69 7a 65 20  average docsize 
279a0 69 73 20 31 2e 20 4f 74 68 65 72 77 69 73 65 2c  is 1. Otherwise,
279b0 20 69 74 20 69 73 20 31 20 70 6c 75 73 0a 2a 2a   it is 1 plus.**
279c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
279d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 63 6f  verflow pages co
279e0 6e 73 75 6d 65 64 20 62 79 20 61 20 72 65 63 6f  nsumed by a reco
279f0 72 64 20 42 20 62 79 74 65 73 20 69 6e 20 73 69  rd B bytes in si
27a00 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
27a10 74 20 66 74 73 33 45 76 61 6c 41 76 65 72 61 67  t fts3EvalAverag
27a20 65 44 6f 63 73 69 7a 65 28 46 74 73 33 43 75 72  eDocsize(Fts3Cur
27a30 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a  sor *pCsr, int *
27a40 70 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  pnPage){.  int r
27a50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27a60 20 69 66 28 20 70 43 73 72 2d 3e 6e 52 6f 77 41   if( pCsr->nRowA
27a70 76 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  vg==0 ){.    /* 
27a80 54 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75  The average docu
27a90 6d 65 6e 74 20 73 69 7a 65 2c 20 77 68 69 63 68  ment size, which
27aa0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
27ab0 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f  calculate the co
27ac0 73 74 0a 20 20 20 20 2a 2a 20 6f 66 20 65 61 63  st.    ** of eac
27ad0 68 20 64 6f 63 6c 69 73 74 2c 20 68 61 73 20 6e  h doclist, has n
27ae0 6f 74 20 79 65 74 20 62 65 65 6e 20 64 65 74 65  ot yet been dete
27af0 72 6d 69 6e 65 64 2e 20 52 65 61 64 20 74 68 65  rmined. Read the
27b00 20 72 65 71 75 69 72 65 64 20 0a 20 20 20 20 2a   required .    *
27b10 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
27b20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 74 6f 20  %_stat table to 
27b30 63 61 6c 63 75 6c 61 74 65 20 69 74 2e 0a 20 20  calculate it..  
27b40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 74 72    **.    ** Entr
27b50 79 20 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61  y 0 of the %_sta
27b60 74 20 74 61 62 6c 65 20 69 73 20 61 20 62 6c 6f  t table is a blo
27b70 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 28 6e 43  b containing (nC
27b80 6f 6c 2b 31 29 20 46 54 53 33 20 0a 20 20 20 20  ol+1) FTS3 .    
27b90 2a 2a 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72  ** varints, wher
27ba0 65 20 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75  e nCol is the nu
27bb0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
27bc0 69 6e 20 74 68 65 20 46 54 53 33 20 74 61 62 6c  in the FTS3 tabl
27bd0 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  e..    ** The fi
27be0 72 73 74 20 76 61 72 69 6e 74 20 69 73 20 74 68  rst varint is th
27bf0 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  e number of docu
27c00 6d 65 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20  ments currently 
27c10 73 74 6f 72 65 64 20 69 6e 0a 20 20 20 20 2a 2a  stored in.    **
27c20 20 74 68 65 20 74 61 62 6c 65 2e 20 54 68 65 20   the table. The 
27c30 66 6f 6c 6c 6f 77 69 6e 67 20 6e 43 6f 6c 20 76  following nCol v
27c40 61 72 69 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74  arints contain t
27c50 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20  he total amount 
27c60 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 73  of.    ** data s
27c70 74 6f 72 65 64 20 69 6e 20 61 6c 6c 20 72 6f 77  tored in all row
27c80 73 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e  s of each column
27c90 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 66   of the table, f
27ca0 72 6f 6d 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20  rom left.    ** 
27cb0 74 6f 20 72 69 67 68 74 2e 0a 20 20 20 20 2a 2f  to right..    */
27cc0 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a  .    Fts3Table *
27cd0 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29  p = (Fts3Table*)
27ce0 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
27cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
27d00 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 73  mt *pStmt;.    s
27d10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 44 6f  qlite3_int64 nDo
27d20 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  c = 0;.    sqlit
27d30 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d  e3_int64 nByte =
27d40 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
27d50 61 72 20 2a 70 45 6e 64 3b 0a 20 20 20 20 63 6f  ar *pEnd;.    co
27d60 6e 73 74 20 63 68 61 72 20 2a 61 3b 0a 0a 20 20  nst char *a;..  
27d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27d80 73 33 53 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c  s3SelectDoctotal
27d90 28 70 2c 20 26 70 53 74 6d 74 29 3b 0a 20 20 20  (p, &pStmt);.   
27da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27db0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
27dc0 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f      a = sqlite3_
27dd0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
27de0 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  t, 0);.    asser
27df0 74 28 20 61 20 29 3b 0a 0a 20 20 20 20 70 45 6e  t( a );..    pEn
27e00 64 20 3d 20 26 61 5b 73 71 6c 69 74 65 33 5f 63  d = &a[sqlite3_c
27e10 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
27e20 74 2c 20 30 29 5d 3b 0a 20 20 20 20 61 20 2b 3d  t, 0)];.    a +=
27e30 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
27e40 61 72 69 6e 74 28 61 2c 20 26 6e 44 6f 63 29 3b  arint(a, &nDoc);
27e50 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45  .    while( a<pE
27e60 6e 64 20 29 7b 0a 20 20 20 20 20 20 61 20 2b 3d  nd ){.      a +=
27e70 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
27e80 61 72 69 6e 74 28 61 2c 20 26 6e 42 79 74 65 29  arint(a, &nByte)
27e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27ea0 6e 44 6f 63 3d 3d 30 20 7c 7c 20 6e 42 79 74 65  nDoc==0 || nByte
27eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
27ec0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
27ed0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27ee0 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  FTS_CORRUPT_VTAB
27ef0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 73  ;.    }..    pCs
27f00 72 2d 3e 6e 44 6f 63 20 3d 20 6e 44 6f 63 3b 0a  r->nDoc = nDoc;.
27f10 20 20 20 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76      pCsr->nRowAv
27f20 67 20 3d 20 28 69 6e 74 29 28 28 28 6e 42 79 74  g = (int)(((nByt
27f30 65 20 2f 20 6e 44 6f 63 29 20 2b 20 70 2d 3e 6e  e / nDoc) + p->n
27f40 50 67 73 7a 29 20 2f 20 70 2d 3e 6e 50 67 73 7a  Pgsz) / p->nPgsz
27f50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27f60 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3e 30 20 29  Csr->nRowAvg>0 )
27f70 3b 20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ; .    rc = sqli
27f80 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
27f90 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
27fa0 20 3d 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67   = pCsr->nRowAvg
27fb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27fc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27fd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27fe0 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 74 6f  to select the to
27ff0 6b 65 6e 73 20 28 69 66 20 61 6e 79 29 20 74 68  kens (if any) th
28000 61 74 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 64  at will be .** d
28010 65 66 65 72 72 65 64 2e 20 54 68 65 20 61 72 72  eferred. The arr
28020 61 79 20 61 54 43 5b 5d 20 68 61 73 20 61 6c 72  ay aTC[] has alr
28030 65 61 64 79 20 62 65 65 6e 20 70 6f 70 75 6c 61  eady been popula
28040 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 69 73  ted when this is
28050 0a 2a 2a 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a  .** called..**.*
28060 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28070 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  is called once f
28080 6f 72 20 65 61 63 68 20 41 4e 44 2f 4e 45 41 52  or each AND/NEAR
28090 20 63 6c 75 73 74 65 72 20 69 6e 20 74 68 65 20   cluster in the 
280a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
280b0 45 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20  Each invocation 
280c0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
280d0 20 74 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65 72   tokens to defer
280e0 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 63   within.** the c
280f0 6c 75 73 74 65 72 20 77 69 74 68 20 72 6f 6f 74  luster with root
28100 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 20 53 65 65   node pRoot. See
28110 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
28120 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a  the definition.*
28130 2a 20 6f 66 20 73 74 72 75 63 74 20 46 74 73 33  * of struct Fts3
28140 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 66 6f 72  TokenAndCost for
28150 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 2a   more details..*
28160 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
28170 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
28180 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
28190 6e 64 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  nd sqlite3Fts3De
281a0 66 65 72 54 6f 6b 65 6e 28 29 0a 2a 2a 20 63 61  ferToken().** ca
281b0 6c 6c 65 64 20 6f 6e 20 65 61 63 68 20 74 6f 6b  lled on each tok
281c0 65 6e 20 74 6f 20 64 65 66 65 72 2e 20 4f 74 68  en to defer. Oth
281d0 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
281e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a  e error code is.
281f0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
28200 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
28210 76 61 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65  valSelectDeferre
28220 64 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  d(.  Fts3Cursor 
28230 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
28240 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73       /* FTS Curs
28250 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  or handle */.  F
28260 74 73 33 45 78 70 72 20 2a 70 52 6f 6f 74 2c 20  ts3Expr *pRoot, 
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28280 2a 20 43 6f 6e 73 69 64 65 72 20 74 6f 6b 65 6e  * Consider token
28290 73 20 77 69 74 68 20 74 68 69 73 20 72 6f 6f 74  s with this root
282a0 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54   node */.  Fts3T
282b0 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43  okenAndCost *aTC
282c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ,          /* Ar
282d0 72 61 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ray of expressio
282e0 6e 20 74 6f 6b 65 6e 73 20 61 6e 64 20 63 6f 73  n tokens and cos
282f0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 43 20  ts */.  int nTC 
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28320 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
28330 61 54 43 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 46 74  aTC[] */.){.  Ft
28340 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s3Table *pTab = 
28350 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
28360 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
28370 20 69 6e 74 20 6e 44 6f 63 53 69 7a 65 20 3d 20   int nDocSize = 
28380 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28390 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
283a0 67 65 73 20 70 65 72 20 64 6f 63 20 6c 6f 61 64  ges per doc load
283b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ed */.  int rc =
283c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
283d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
283e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
283f0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
28400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
28410 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
28420 20 66 6f 72 20 76 61 72 69 6f 75 73 20 70 75 72   for various pur
28430 70 6f 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  poses */.  int n
28440 4f 76 66 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Ovfl = 0;       
28450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
28460 74 61 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  tal overflow pag
28470 65 73 20 75 73 65 64 20 62 79 20 64 6f 63 6c 69  es used by docli
28480 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  sts */.  int nTo
28490 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ken = 0;        
284a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
284b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  l number of toke
284c0 6e 73 20 69 6e 20 63 6c 75 73 74 65 72 20 2a 2f  ns in cluster */
284d0 0a 0a 20 20 69 6e 74 20 6e 4d 69 6e 45 73 74 20  ..  int nMinEst 
284e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
284f0 20 20 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d      /* The minim
28500 75 6d 20 63 6f 75 6e 74 20 66 6f 72 20 61 6e 79  um count for any
28510 20 70 68 72 61 73 65 20 73 6f 20 66 61 72 2e 20   phrase so far. 
28520 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 61 64 34 20  */.  int nLoad4 
28530 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
28540 20 20 20 20 20 2f 2a 20 28 50 68 72 61 73 65 73       /* (Phrases
28550 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6c 6f   that will be lo
28560 61 64 65 64 29 5e 34 2e 20 2a 2f 0a 0a 20 20 2f  aded)^4. */..  /
28570 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6e 65 76  * Tokens are nev
28580 65 72 20 64 65 66 65 72 72 65 64 20 66 6f 72 20  er deferred for 
28590 46 54 53 20 74 61 62 6c 65 73 20 63 72 65 61 74  FTS tables creat
285a0 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e  ed using the con
285b0 74 65 6e 74 3d 78 78 78 0a 20 20 2a 2a 20 6f 70  tent=xxx.  ** op
285c0 74 69 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e  tion. The reason
285d0 20 62 65 69 6e 67 20 74 68 61 74 20 69 74 20 69   being that it i
285e0 73 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  s not guaranteed
285f0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
28600 74 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 63 74  t.  ** table act
28610 75 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ually contains t
28620 68 65 20 73 61 6d 65 20 64 61 74 61 20 61 73 20  he same data as 
28630 74 68 65 20 69 6e 64 65 78 2e 20 54 6f 20 70 72  the index. To pr
28640 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
28650 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 61 6e 79    ** causing any
28660 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 65 20 64   problems, the d
28670 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 6f 70  eferred token op
28680 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
28690 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 64 69  mpletely.  ** di
286a0 73 61 62 6c 65 64 20 66 6f 72 20 63 6f 6e 74 65  sabled for conte
286b0 6e 74 3d 78 78 78 20 74 61 62 6c 65 73 2e 20 2a  nt=xxx tables. *
286c0 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 7a 43  /.  if( pTab->zC
286d0 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20  ontentTbl ){.   
286e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
286f0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75  K;.  }..  /* Cou
28700 6e 74 20 74 68 65 20 74 6f 6b 65 6e 73 20 69 6e  nt the tokens in
28710 20 74 68 69 73 20 41 4e 44 2f 4e 45 41 52 20 63   this AND/NEAR c
28720 6c 75 73 74 65 72 2e 20 49 66 20 6e 6f 6e 65 20  luster. If none 
28730 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 73 0a  of the doclists.
28740 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
28750 77 69 74 68 20 74 68 65 20 74 6f 6b 65 6e 73 20  with the tokens 
28760 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66  spill onto overf
28770 6c 6f 77 20 70 61 67 65 73 2c 20 6f 72 20 69 66  low pages, or if
28780 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
28790 6e 6c 79 20 31 20 74 6f 6b 65 6e 2c 20 65 78 69  nly 1 token, exi
287a0 74 20 65 61 72 6c 79 2e 20 4e 6f 20 74 6f 6b 65  t early. No toke
287b0 6e 73 20 74 6f 20 64 65 66 65 72 20 69 6e 20 74  ns to defer in t
287c0 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66  his case. */.  f
287d0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 43 3b  or(ii=0; ii<nTC;
287e0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
287f0 61 54 43 5b 69 69 5d 2e 70 52 6f 6f 74 3d 3d 70  aTC[ii].pRoot==p
28800 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 4f  Root ){.      nO
28810 76 66 6c 20 2b 3d 20 61 54 43 5b 69 69 5d 2e 6e  vfl += aTC[ii].n
28820 4f 76 66 6c 3b 0a 20 20 20 20 20 20 6e 54 6f 6b  Ovfl;.      nTok
28830 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en++;.    }.  }.
28840 20 20 69 66 28 20 6e 4f 76 66 6c 3d 3d 30 20 7c    if( nOvfl==0 |
28850 7c 20 6e 54 6f 6b 65 6e 3c 32 20 29 20 72 65 74  | nToken<2 ) ret
28860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
28870 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
28880 61 76 65 72 61 67 65 20 64 6f 63 73 69 7a 65 20  average docsize 
28890 28 69 6e 20 70 61 67 65 73 29 2e 20 2a 2f 0a 20  (in pages). */. 
288a0 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 41 76   rc = fts3EvalAv
288b0 65 72 61 67 65 44 6f 63 73 69 7a 65 28 70 43 73  erageDocsize(pCs
288c0 72 2c 20 26 6e 44 6f 63 53 69 7a 65 29 3b 0a 20  r, &nDocSize);. 
288d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
288e0 49 54 45 5f 4f 4b 20 7c 7c 20 6e 44 6f 63 53 69  ITE_OK || nDocSi
288f0 7a 65 3e 30 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49  ze>0 );...  /* I
28900 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
28910 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 69  ll tokens in thi
28920 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74  s AND/NEAR clust
28930 65 72 2c 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  er, in ascending
28940 20 6f 72 64 65 72 20 0a 20 20 2a 2a 20 6f 66 20   order .  ** of 
28950 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76  the number of ov
28960 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
28970 74 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64 65 64  t will be loaded
28980 20 62 79 20 74 68 65 20 70 61 67 65 72 20 6c 61   by the pager la
28990 79 65 72 20 0a 20 20 2a 2a 20 74 6f 20 72 65 74  yer .  ** to ret
289a0 72 69 65 76 65 20 74 68 65 20 65 6e 74 69 72 65  rieve the entire
289b0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
289c0 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20   token from the 
289d0 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
289e0 0a 20 20 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64  .  ** Load the d
289f0 6f 63 6c 69 73 74 73 20 66 6f 72 20 74 6f 6b 65  oclists for toke
28a00 6e 73 20 74 68 61 74 20 61 72 65 20 65 69 74 68  ns that are eith
28a10 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er:.  **.  **   
28a20 61 2e 20 54 68 65 20 63 68 65 61 70 65 73 74 20  a. The cheapest 
28a30 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 6e 74  token in the ent
28a40 69 72 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  ire query (i.e. 
28a50 74 68 65 20 6f 6e 65 20 76 69 73 69 74 65 64 20  the one visited 
28a60 62 79 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  by the.  **     
28a70 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
28a80 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 29 2c 20   of this loop), 
28a90 6f 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62  or.  **.  **   b
28aa0 2e 20 50 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  . Part of a mult
28ab0 69 2d 74 6f 6b 65 6e 20 70 68 72 61 73 65 2e 0a  i-token phrase..
28ac0 20 20 2a 2a 0a 20 20 2a 2a 20 41 66 74 65 72 20    **.  ** After 
28ad0 65 61 63 68 20 74 6f 6b 65 6e 20 64 6f 63 6c 69  each token docli
28ae0 73 74 20 69 73 20 6c 6f 61 64 65 64 2c 20 6d 65  st is loaded, me
28af0 72 67 65 20 69 74 20 77 69 74 68 20 74 68 65 20  rge it with the 
28b00 6f 74 68 65 72 73 20 66 72 6f 6d 20 74 68 65 0a  others from the.
28b10 20 20 2a 2a 20 73 61 6d 65 20 70 68 72 61 73 65    ** same phrase
28b20 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 20 6e   and count the n
28b30 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
28b40 74 73 20 74 68 61 74 20 74 68 65 20 6d 65 72 67  ts that the merg
28b50 65 64 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  ed doclist.  ** 
28b60 63 6f 6e 74 61 69 6e 73 2e 20 53 65 74 20 76 61  contains. Set va
28b70 72 69 61 62 6c 65 20 22 6e 4d 69 6e 45 73 74 22  riable "nMinEst"
28b80 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
28b90 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d   number of docum
28ba0 65 6e 74 73 20 69 6e 20 0a 20 20 2a 2a 20 61 6e  ents in .  ** an
28bb0 79 20 70 68 72 61 73 65 20 64 6f 63 6c 69 73 74  y phrase doclist
28bc0 20 66 6f 72 20 77 68 69 63 68 20 31 20 6f 72 20   for which 1 or 
28bd0 6d 6f 72 65 20 74 6f 6b 65 6e 20 64 6f 63 6c 69  more token docli
28be0 73 74 73 20 68 61 76 65 20 62 65 65 6e 20 6c 6f  sts have been lo
28bf0 61 64 65 64 2e 0a 20 20 2a 2a 20 4c 65 74 20 6e  aded..  ** Let n
28c00 4f 74 68 65 72 20 62 65 20 74 68 65 20 6e 75 6d  Other be the num
28c10 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 68 72  ber of other phr
28c20 61 73 65 73 20 66 6f 72 20 77 68 69 63 68 20 69  ases for which i
28c30 74 20 69 73 20 63 65 72 74 61 69 6e 20 74 68 61  t is certain tha
28c40 74 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  t.  ** one or mo
28c50 72 65 20 74 6f 6b 65 6e 73 20 77 69 6c 6c 20 6e  re tokens will n
28c60 6f 74 20 62 65 20 64 65 66 65 72 72 65 64 2e 0a  ot be deferred..
28c70 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 2c 20    **.  ** Then, 
28c80 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 2c 20  for each token, 
28c90 64 65 66 65 72 20 69 74 20 69 66 20 6c 6f 61 64  defer it if load
28ca0 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ing the doclist 
28cb0 77 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 0a  would result in.
28cc0 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 4e 20 6f    ** loading N o
28cd0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
28ce0 70 61 67 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72  pages into memor
28cf0 79 2c 20 77 68 65 72 65 20 4e 20 69 73 20 63 6f  y, where N is co
28d00 6d 70 75 74 65 64 20 61 73 3a 0a 20 20 2a 2a 0a  mputed as:.  **.
28d10 20 20 2a 2a 20 20 20 20 28 6e 4d 69 6e 45 73 74    **    (nMinEst
28d20 20 2b 20 34 5e 6e 4f 74 68 65 72 20 2d 20 31 29   + 4^nOther - 1)
28d30 20 2f 20 28 34 5e 6e 4f 74 68 65 72 29 0a 20 20   / (4^nOther).  
28d40 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
28d50 69 3c 6e 54 6f 6b 65 6e 20 26 26 20 72 63 3d 3d  i<nToken && rc==
28d60 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
28d70 7b 0a 20 20 20 20 69 6e 74 20 69 54 43 3b 20 20  {.    int iTC;  
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
28da0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
28db0 54 43 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  TC[] array. */. 
28dc0 20 20 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43     Fts3TokenAndC
28dd0 6f 73 74 20 2a 70 54 43 20 3d 20 30 3b 20 20 20  ost *pTC = 0;   
28de0 20 2f 2a 20 53 65 74 20 74 6f 20 63 68 65 61 70   /* Set to cheap
28df0 65 73 74 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  est remaining to
28e00 6b 65 6e 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ken. */..    /* 
28e10 53 65 74 20 70 54 43 20 74 6f 20 70 6f 69 6e 74  Set pTC to point
28e20 20 74 6f 20 74 68 65 20 63 68 65 61 70 65 73 74   to the cheapest
28e30 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 6b 65 6e   remaining token
28e40 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 43  . */.    for(iTC
28e50 3d 30 3b 20 69 54 43 3c 6e 54 43 3b 20 69 54 43  =0; iTC<nTC; iTC
28e60 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
28e70 54 43 5b 69 54 43 5d 2e 70 54 6f 6b 65 6e 20 26  TC[iTC].pToken &
28e80 26 20 61 54 43 5b 69 54 43 5d 2e 70 52 6f 6f 74  & aTC[iTC].pRoot
28e90 3d 3d 70 52 6f 6f 74 20 0a 20 20 20 20 20 20 20  ==pRoot .       
28ea0 26 26 20 28 21 70 54 43 20 7c 7c 20 61 54 43 5b  && (!pTC || aTC[
28eb0 69 54 43 5d 2e 6e 4f 76 66 6c 3c 70 54 43 2d 3e  iTC].nOvfl<pTC->
28ec0 6e 4f 76 66 6c 29 20 0a 20 20 20 20 20 20 29 7b  nOvfl) .      ){
28ed0 0a 20 20 20 20 20 20 20 20 70 54 43 20 3d 20 26  .        pTC = &
28ee0 61 54 43 5b 69 54 43 5d 3b 0a 20 20 20 20 20 20  aTC[iTC];.      
28ef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
28f00 72 74 28 20 70 54 43 20 29 3b 0a 0a 20 20 20 20  rt( pTC );..    
28f10 69 66 28 20 69 69 20 26 26 20 70 54 43 2d 3e 6e  if( ii && pTC->n
28f20 4f 76 66 6c 3e 3d 28 28 6e 4d 69 6e 45 73 74 2b  Ovfl>=((nMinEst+
28f30 28 6e 4c 6f 61 64 34 2f 34 29 2d 31 29 2f 28 6e  (nLoad4/4)-1)/(n
28f40 4c 6f 61 64 34 2f 34 29 29 2a 6e 44 6f 63 53 69  Load4/4))*nDocSi
28f50 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ze ){.      /* T
28f60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65  he number of ove
28f70 72 66 6c 6f 77 20 70 61 67 65 73 20 74 6f 20 6c  rflow pages to l
28f80 6f 61 64 20 66 6f 72 20 74 68 69 73 20 28 61 6e  oad for this (an
28f90 64 20 74 68 65 72 65 66 6f 72 65 20 61 6c 6c 0a  d therefore all.
28fa0 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75        ** subsequ
28fb0 65 6e 74 29 20 74 6f 6b 65 6e 73 20 69 73 20 67  ent) tokens is g
28fc0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
28fd0 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
28fe0 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 20   of pages .     
28ff0 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
29000 20 6c 6f 61 64 65 64 20 69 66 20 61 6c 6c 20 73   loaded if all s
29010 75 62 73 65 71 75 65 6e 74 20 74 6f 6b 65 6e 73  ubsequent tokens
29020 20 61 72 65 20 64 65 66 65 72 72 65 64 2e 0a 20   are deferred.. 
29030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 46 74       */.      Ft
29040 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
29050 54 6f 6b 65 6e 20 3d 20 70 54 43 2d 3e 70 54 6f  Token = pTC->pTo
29060 6b 65 6e 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ken;.      rc = 
29070 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72  sqlite3Fts3Defer
29080 54 6f 6b 65 6e 28 70 43 73 72 2c 20 70 54 6f 6b  Token(pCsr, pTok
29090 65 6e 2c 20 70 54 43 2d 3e 69 43 6f 6c 29 3b 0a  en, pTC->iCol);.
290a0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
290b0 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70 54  derCursorFree(pT
290c0 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 29 3b 0a  oken->pSegcsr);.
290d0 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 53        pToken->pS
290e0 65 67 63 73 72 20 3d 20 30 3b 0a 20 20 20 20 7d  egcsr = 0;.    }
290f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
29100 65 74 20 6e 4c 6f 61 64 34 20 74 6f 20 74 68 65  et nLoad4 to the
29110 20 76 61 6c 75 65 20 6f 66 20 28 34 5e 6e 4f 74   value of (4^nOt
29120 68 65 72 29 20 66 6f 72 20 74 68 65 20 6e 65 78  her) for the nex
29130 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
29140 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 2d  he.      ** for-
29150 6c 6f 6f 70 2e 20 45 78 63 65 70 74 2c 20 6c 69  loop. Except, li
29160 6d 69 74 20 74 68 65 20 76 61 6c 75 65 20 74 6f  mit the value to
29170 20 32 5e 32 34 20 74 6f 20 70 72 65 76 65 6e 74   2^24 to prevent
29180 20 69 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20   it from .      
29190 2a 2a 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 74  ** overflowing t
291a0 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  he 32-bit intege
291b0 72 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  r it is stored i
291c0 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  n. */.      if( 
291d0 69 69 3c 31 32 20 29 20 6e 4c 6f 61 64 34 20 3d  ii<12 ) nLoad4 =
291e0 20 6e 4c 6f 61 64 34 2a 34 3b 0a 0a 20 20 20 20   nLoad4*4;..    
291f0 20 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 28    if( ii==0 || (
29200 70 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54  pTC->pPhrase->nT
29210 6f 6b 65 6e 3e 31 20 26 26 20 69 69 21 3d 6e 54  oken>1 && ii!=nT
29220 6f 6b 65 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  oken-1) ){.     
29230 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69     /* Either thi
29240 73 20 69 73 20 74 68 65 20 63 68 65 61 70 65 73  s is the cheapes
29250 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65  t token in the e
29260 6e 74 69 72 65 20 71 75 65 72 79 2c 20 6f 72 20  ntire query, or 
29270 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
29280 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
29290 2d 74 6f 6b 65 6e 20 70 68 72 61 73 65 2e 20 45  -token phrase. E
292a0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
292b0 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
292c0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  ll.        ** (e
292d0 76 65 6e 74 75 61 6c 6c 79 29 20 62 65 20 6c 6f  ventually) be lo
292e0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
292f0 2e 20 49 74 20 6d 61 79 20 61 73 20 77 65 6c 6c  . It may as well
29300 20 62 65 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20   be now. */.    
29310 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
29320 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 70 54  ken *pToken = pT
29330 43 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  C->pToken;.     
29340 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30     int nList = 0
29350 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
29360 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
29370 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d     rc = fts3Term
29380 53 65 6c 65 63 74 28 70 54 61 62 2c 20 70 54 6f  Select(pTab, pTo
29390 6b 65 6e 2c 20 70 54 43 2d 3e 69 43 6f 6c 2c 20  ken, pTC->iCol, 
293a0 26 6e 4c 69 73 74 2c 20 26 70 4c 69 73 74 29 3b  &nList, &pList);
293b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
293c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
293d0 7c 20 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  | pList==0 );.  
293e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
293f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29400 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76       rc = fts3Ev
29410 61 6c 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b  alPhraseMergeTok
29420 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
29430 20 20 70 54 61 62 2c 20 70 54 43 2d 3e 70 50 68    pTab, pTC->pPh
29440 72 61 73 65 2c 20 70 54 43 2d 3e 69 54 6f 6b 65  rase, pTC->iToke
29450 6e 2c 70 4c 69 73 74 2c 6e 4c 69 73 74 0a 20 20  n,pList,nList.  
29460 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
29480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29490 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
294a0 6e 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20  nCount;.        
294b0 20 20 6e 43 6f 75 6e 74 20 3d 20 66 74 73 33 44    nCount = fts3D
294c0 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64  oclistCountDocid
294d0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s(.             
294e0 20 70 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 64   pTC->pPhrase->d
294f0 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c 20 70 54 43  oclist.aAll, pTC
29500 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  ->pPhrase->docli
29510 73 74 2e 6e 41 6c 6c 0a 20 20 20 20 20 20 20 20  st.nAll.        
29520 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
29530 66 28 20 69 69 3d 3d 30 20 7c 7c 20 6e 43 6f 75  f( ii==0 || nCou
29540 6e 74 3c 6e 4d 69 6e 45 73 74 20 29 20 6e 4d 69  nt<nMinEst ) nMi
29550 6e 45 73 74 20 3d 20 6e 43 6f 75 6e 74 3b 0a 20  nEst = nCount;. 
29560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29570 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 43 2d 3e  .    }.    pTC->
29580 70 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  pToken = 0;.  }.
29590 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
295a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
295b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
295c0 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
295d0 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 49  Filter method. I
295e0 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a  t initializes.**
295f0 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
29600 75 65 72 79 20 63 75 72 72 65 6e 74 6c 79 20 73  uery currently s
29610 74 6f 72 65 64 20 69 6e 20 70 43 73 72 2d 3e 70  tored in pCsr->p
29620 45 78 70 72 2e 20 54 6f 20 69 74 65 72 61 74 65  Expr. To iterate
29630 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20   through.** the 
29640 72 65 73 75 6c 74 73 20 6f 66 20 61 20 71 75 65  results of a que
29650 72 79 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 64  ry, the caller d
29660 6f 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 74  oes:.**.**    ft
29670 73 33 45 76 61 6c 53 74 61 72 74 28 70 43 73 72  s3EvalStart(pCsr
29680 29 3b 0a 2a 2a 20 20 20 20 77 68 69 6c 65 28 20  );.**    while( 
29690 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 66 74 73  1 ){.**      fts
296a0 33 45 76 61 6c 4e 65 78 74 28 70 43 73 72 29 3b  3EvalNext(pCsr);
296b0 0a 2a 2a 20 20 20 20 20 20 69 66 28 20 70 43 73  .**      if( pCs
296c0 72 2d 3e 62 45 6f 66 20 29 20 62 72 65 61 6b 3b  r->bEof ) break;
296d0 0a 2a 2a 20 20 20 20 20 20 2e 2e 2e 20 72 65 74  .**      ... ret
296e0 75 72 6e 20 72 6f 77 20 70 43 73 72 2d 3e 69 50  urn row pCsr->iP
296f0 72 65 76 49 64 20 74 6f 20 74 68 65 20 63 61 6c  revId to the cal
29700 6c 65 72 20 2e 2e 2e 0a 2a 2a 20 20 20 20 7d 0a  ler ....**    }.
29710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
29720 73 33 45 76 61 6c 53 74 61 72 74 28 46 74 73 33  s3EvalStart(Fts3
29730 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
29740 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
29750 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
29760 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
29770 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29780 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
29790 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oken = 0;.  int 
297a0 6e 4f 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41  nOr = 0;..  /* A
297b0 6c 6c 6f 63 61 74 65 20 61 20 4d 75 6c 74 69 53  llocate a MultiS
297c0 65 67 52 65 61 64 65 72 20 66 6f 72 20 65 61 63  egReader for eac
297d0 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65  h token in the e
297e0 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
297f0 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65  fts3EvalAllocate
29800 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 43  Readers(pCsr, pC
29810 73 72 2d 3e 70 45 78 70 72 2c 20 26 6e 54 6f 6b  sr->pExpr, &nTok
29820 65 6e 2c 20 26 6e 4f 72 2c 20 26 72 63 29 3b 0a  en, &nOr, &rc);.
29830 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
29840 77 68 69 63 68 2c 20 69 66 20 61 6e 79 2c 20 74  which, if any, t
29850 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 65 78 70  okens in the exp
29860 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  ression should b
29870 65 20 64 65 66 65 72 72 65 64 2e 20 2a 2f 0a 23  e deferred. */.#
29880 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
29890 53 41 42 4c 45 5f 46 54 53 34 5f 44 45 46 45 52  SABLE_FTS4_DEFER
298a0 52 45 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  RED.  if( rc==SQ
298b0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 54 6f 6b 65  LITE_OK && nToke
298c0 6e 3e 31 20 26 26 20 70 54 61 62 2d 3e 62 46 74  n>1 && pTab->bFt
298d0 73 34 20 29 7b 0a 20 20 20 20 46 74 73 33 54 6f  s4 ){.    Fts3To
298e0 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43 3b  kenAndCost *aTC;
298f0 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 2a  .    Fts3Expr **
29900 61 70 4f 72 3b 0a 20 20 20 20 61 54 43 20 3d 20  apOr;.    aTC = 
29910 28 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73  (Fts3TokenAndCos
29920 74 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t *)sqlite3_mall
29930 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20 73 69  oc64(.        si
29940 7a 65 6f 66 28 46 74 73 33 54 6f 6b 65 6e 41 6e  zeof(Fts3TokenAn
29950 64 43 6f 73 74 29 20 2a 20 6e 54 6f 6b 65 6e 0a  dCost) * nToken.
29960 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 46        + sizeof(F
29970 74 73 33 45 78 70 72 20 2a 29 20 2a 20 6e 4f 72  ts3Expr *) * nOr
29980 20 2a 20 32 0a 20 20 20 20 29 3b 0a 20 20 20 20   * 2.    );.    
29990 61 70 4f 72 20 3d 20 28 46 74 73 33 45 78 70 72  apOr = (Fts3Expr
299a0 20 2a 2a 29 26 61 54 43 5b 6e 54 6f 6b 65 6e 5d   **)&aTC[nToken]
299b0 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 54 43 20  ;..    if( !aTC 
299c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
299d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
299e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
299f0 20 69 69 3b 0a 20 20 20 20 20 20 46 74 73 33 54   ii;.      Fts3T
29a00 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54 43  okenAndCost *pTC
29a10 20 3d 20 61 54 43 3b 0a 20 20 20 20 20 20 46 74   = aTC;.      Ft
29a20 73 33 45 78 70 72 20 2a 2a 70 70 4f 72 20 3d 20  s3Expr **ppOr = 
29a30 61 70 4f 72 3b 0a 0a 20 20 20 20 20 20 66 74 73  apOr;..      fts
29a40 33 45 76 61 6c 54 6f 6b 65 6e 43 6f 73 74 73 28  3EvalTokenCosts(
29a50 70 43 73 72 2c 20 30 2c 20 70 43 73 72 2d 3e 70  pCsr, 0, pCsr->p
29a60 45 78 70 72 2c 20 26 70 54 43 2c 20 26 70 70 4f  Expr, &pTC, &ppO
29a70 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 6e  r, &rc);.      n
29a80 54 6f 6b 65 6e 20 3d 20 28 69 6e 74 29 28 70 54  Token = (int)(pT
29a90 43 2d 61 54 43 29 3b 0a 20 20 20 20 20 20 6e 4f  C-aTC);.      nO
29aa0 72 20 3d 20 28 69 6e 74 29 28 70 70 4f 72 2d 61  r = (int)(ppOr-a
29ab0 70 4f 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  pOr);..      if(
29ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
29ae0 74 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65 66  ts3EvalSelectDef
29af0 65 72 72 65 64 28 70 43 73 72 2c 20 30 2c 20 61  erred(pCsr, 0, a
29b00 54 43 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  TC, nToken);.   
29b10 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72       for(ii=0; r
29b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29b30 69 69 3c 6e 4f 72 3b 20 69 69 2b 2b 29 7b 0a 20  ii<nOr; ii++){. 
29b40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
29b50 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65 66 65  s3EvalSelectDefe
29b60 72 72 65 64 28 70 43 73 72 2c 20 61 70 4f 72 5b  rred(pCsr, apOr[
29b70 69 69 5d 2c 20 61 54 43 2c 20 6e 54 6f 6b 65 6e  ii], aTC, nToken
29b80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
29b90 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
29ba0 74 65 33 5f 66 72 65 65 28 61 54 43 29 3b 0a 20  te3_free(aTC);. 
29bb0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
29bc0 0a 20 20 66 74 73 33 45 76 61 6c 53 74 61 72 74  .  fts3EvalStart
29bd0 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 43  Readers(pCsr, pC
29be0 73 72 2d 3e 70 45 78 70 72 2c 20 26 72 63 29 3b  sr->pExpr, &rc);
29bf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29c00 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
29c10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  e the current po
29c20 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
29c30 70 68 72 61 73 65 20 70 50 68 72 61 73 65 2e 0a  phrase pPhrase..
29c40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
29c50 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61 74  ts3EvalInvalidat
29c60 65 50 6f 73 6c 69 73 74 28 46 74 73 33 50 68 72  ePoslist(Fts3Phr
29c70 61 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20  ase *pPhrase){. 
29c80 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 64 6f   if( pPhrase->do
29c90 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 20  clist.bFreeList 
29ca0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
29cb0 72 65 65 28 70 50 68 72 61 73 65 2d 3e 64 6f 63  ree(pPhrase->doc
29cc0 6c 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d  list.pList);.  }
29cd0 0a 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  .  pPhrase->docl
29ce0 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ist.pList = 0;. 
29cf0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
29d00 74 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70  t.nList = 0;.  p
29d10 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
29d20 62 46 72 65 65 4c 69 73 74 20 3d 20 30 3b 0a 7d  bFreeList = 0;.}
29d30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
29d40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
29d50 74 6f 20 65 64 69 74 20 74 68 65 20 70 6f 73 69  to edit the posi
29d60 74 69 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63 69  tion list associ
29d70 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
29d80 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70   phrase object p
29d90 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 66  assed as the fif
29da0 74 68 20 61 72 67 75 6d 65 6e 74 20 61 63 63 6f  th argument acco
29db0 72 64 69 6e 67 20 74 6f 20 61 20 4e 45 41 52 0a  rding to a NEAR.
29dc0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 46 6f  ** condition. Fo
29dd0 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
29de0 20 20 20 20 20 61 62 63 20 4e 45 41 52 2f 35 20       abc NEAR/5 
29df0 22 64 65 66 20 67 68 69 22 0a 2a 2a 0a 2a 2a 20  "def ghi".**.** 
29e00 50 61 72 61 6d 65 74 65 72 20 6e 4e 65 61 72 20  Parameter nNear 
29e10 69 73 20 70 61 73 73 65 64 20 74 68 65 20 4e 45  is passed the NE
29e20 41 52 20 64 69 73 74 61 6e 63 65 20 6f 66 20 74  AR distance of t
29e30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 28 35  he expression (5
29e40 20 69 6e 0a 2a 2a 20 74 68 65 20 65 78 61 6d 70   in.** the examp
29e50 6c 65 20 61 62 6f 76 65 29 2e 20 57 68 65 6e 20  le above). When 
29e60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
29e70 20 63 61 6c 6c 65 64 2c 20 2a 70 61 50 6f 73 6c   called, *paPosl
29e80 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ist points to.**
29e90 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
29ea0 73 74 2c 20 61 6e 64 20 2a 70 6e 54 6f 6b 65 6e  st, and *pnToken
29eb0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
29ec0 66 20 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 20  f phrase tokens 
29ed0 69 6e 2c 20 74 68 65 0a 2a 2a 20 70 68 72 61 73  in, the.** phras
29ee0 65 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  e on the other s
29ef0 69 64 65 20 6f 66 20 74 68 65 20 4e 45 41 52 20  ide of the NEAR 
29f00 6f 70 65 72 61 74 6f 72 20 74 6f 20 70 50 68 72  operator to pPhr
29f10 61 73 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ase. For example
29f20 2c 0a 2a 2a 20 69 66 20 70 50 68 72 61 73 65 20  ,.** if pPhrase 
29f30 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 22 64  refers to the "d
29f40 65 66 20 67 68 69 22 20 70 68 72 61 73 65 2c 20  ef ghi" phrase, 
29f50 74 68 65 6e 20 2a 70 61 50 6f 73 6c 69 73 74 20  then *paPoslist 
29f60 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
29f70 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 61   position list a
29f80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
29f90 68 72 61 73 65 20 22 61 62 63 22 2e 0a 2a 2a 0a  hrase "abc"..**.
29fa0 2a 2a 20 41 6c 6c 20 70 6f 73 69 74 69 6f 6e 73  ** All positions
29fb0 20 69 6e 20 74 68 65 20 70 50 68 72 61 73 65 20   in the pPhrase 
29fc0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68  position list th
29fd0 61 74 20 61 72 65 20 6e 6f 74 20 73 75 66 66 69  at are not suffi
29fe0 63 69 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65  ciently.** close
29ff0 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 69   to a position i
2a000 6e 20 74 68 65 20 2a 70 61 50 6f 73 6c 69 73 74  n the *paPoslist
2a010 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 61   position list a
2a020 72 65 20 72 65 6d 6f 76 65 64 2e 20 49 66 20 74  re removed. If t
2a030 68 69 73 0a 2a 2a 20 6c 65 61 76 65 73 20 30 20  his.** leaves 0 
2a040 70 6f 73 69 74 69 6f 6e 73 2c 20 7a 65 72 6f 20  positions, zero 
2a050 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
2a060 65 72 77 69 73 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  erwise, non-zero
2a070 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
2a080 65 74 75 72 6e 69 6e 67 2c 20 2a 70 61 50 6f 73  eturning, *paPos
2a090 6c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20 70  list is set to p
2a0a0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69  oint to the posi
2a0b0 74 69 6f 6e 20 6c 73 69 74 20 0a 2a 2a 20 61 73  tion lsit .** as
2a0c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
2a0d0 68 72 61 73 65 2e 20 41 6e 64 20 2a 70 6e 54 6f  hrase. And *pnTo
2a0e0 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68  ken is set to th
2a0f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  e number of toke
2a100 6e 73 20 69 6e 0a 2a 2a 20 70 50 68 72 61 73 65  ns in.** pPhrase
2a110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a120 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d  fts3EvalNearTrim
2a130 28 0a 20 20 69 6e 74 20 6e 4e 65 61 72 2c 20 20  (.  int nNear,  
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 20 20 2f 2a 20 4e 45 41 52 20 64 69 73 74      /* NEAR dist
2a160 61 6e 63 65 2e 20 41 73 20 69 6e 20 22 4e 45 41  ance. As in "NEA
2a170 52 2f 6e 4e 65 61 72 22 2e 20 2a 2f 0a 20 20 63  R/nNear". */.  c
2a180 68 61 72 20 2a 61 54 6d 70 2c 20 20 20 20 20 20  har *aTmp,      
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1a0 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
2a1b0 65 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63 68  e to use */.  ch
2a1c0 61 72 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20  ar **paPoslist, 
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a1e0 20 49 4e 2f 4f 55 54 3a 20 50 6f 73 69 74 69 6f   IN/OUT: Positio
2a1f0 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
2a200 2a 70 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  *pnToken,       
2a210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a220 4e 2f 4f 55 54 3a 20 54 6f 6b 65 6e 73 20 69 6e  N/OUT: Tokens in
2a230 20 70 68 72 61 73 65 20 6f 66 20 2a 70 61 50 6f   phrase of *paPo
2a240 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 33 50  slist */.  Fts3P
2a250 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 20  hrase *pPhrase  
2a260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a270 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20  e phrase object 
2a280 74 6f 20 74 72 69 6d 20 74 68 65 20 64 6f 63 6c  to trim the docl
2a290 69 73 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 69  ist of */.){.  i
2a2a0 6e 74 20 6e 50 61 72 61 6d 31 20 3d 20 6e 4e 65  nt nParam1 = nNe
2a2b0 61 72 20 2b 20 70 50 68 72 61 73 65 2d 3e 6e 54  ar + pPhrase->nT
2a2c0 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 50 61 72  oken;.  int nPar
2a2d0 61 6d 32 20 3d 20 6e 4e 65 61 72 20 2b 20 2a 70  am2 = nNear + *p
2a2e0 6e 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 4e  nToken;.  int nN
2a2f0 65 77 3b 0a 20 20 63 68 61 72 20 2a 70 32 3b 20  ew;.  char *p2; 
2a300 0a 20 20 63 68 61 72 20 2a 70 4f 75 74 3b 20 0a  .  char *pOut; .
2a310 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
2a320 73 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64  sert( pPhrase->d
2a330 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 29 3b 0a  oclist.pList );.
2a340 0a 20 20 70 32 20 3d 20 70 4f 75 74 20 3d 20 70  .  p2 = pOut = p
2a350 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2a360 70 4c 69 73 74 3b 0a 20 20 72 65 73 20 3d 20 66  pList;.  res = f
2a370 74 73 33 50 6f 73 6c 69 73 74 4e 65 61 72 4d 65  ts3PoslistNearMe
2a380 72 67 65 28 0a 20 20 20 20 26 70 4f 75 74 2c 20  rge(.    &pOut, 
2a390 61 54 6d 70 2c 20 6e 50 61 72 61 6d 31 2c 20 6e  aTmp, nParam1, n
2a3a0 50 61 72 61 6d 32 2c 20 70 61 50 6f 73 6c 69 73  Param2, paPoslis
2a3b0 74 2c 20 26 70 32 0a 20 20 29 3b 0a 20 20 69 66  t, &p2.  );.  if
2a3c0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 4e 65  ( res ){.    nNe
2a3d0 77 20 3d 20 28 69 6e 74 29 28 70 4f 75 74 20 2d  w = (int)(pOut -
2a3e0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
2a3f0 74 2e 70 4c 69 73 74 29 20 2d 20 31 3b 0a 20 20  t.pList) - 1;.  
2a400 20 20 61 73 73 65 72 74 28 20 70 50 68 72 61 73    assert( pPhras
2a410 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
2a420 5b 6e 4e 65 77 5d 3d 3d 27 5c 30 27 20 29 3b 0a  [nNew]=='\0' );.
2a430 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77      assert( nNew
2a440 3c 3d 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  <=pPhrase->docli
2a450 73 74 2e 6e 4c 69 73 74 20 26 26 20 6e 4e 65 77  st.nList && nNew
2a460 3e 30 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  >0 );.    memset
2a470 28 26 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  (&pPhrase->docli
2a480 73 74 2e 70 4c 69 73 74 5b 6e 4e 65 77 5d 2c 20  st.pList[nNew], 
2a490 30 2c 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  0, pPhrase->docl
2a4a0 69 73 74 2e 6e 4c 69 73 74 20 2d 20 6e 4e 65 77  ist.nList - nNew
2a4b0 29 3b 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e  );.    pPhrase->
2a4c0 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20  doclist.nList = 
2a4d0 6e 4e 65 77 3b 0a 20 20 20 20 2a 70 61 50 6f 73  nNew;.    *paPos
2a4e0 6c 69 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e  list = pPhrase->
2a4f0 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  doclist.pList;. 
2a500 20 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 70 50     *pnToken = pP
2a510 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20  hrase->nToken;. 
2a520 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73   }..  return res
2a530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a540 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2a550 2d 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20 6f  -op if *pRc is o
2a560 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2a570 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20 63  _OK when it is c
2a580 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77  alled..** Otherw
2a590 69 73 65 2c 20 69 74 20 61 64 76 61 6e 63 65 73  ise, it advances
2a5a0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2a5b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2a5c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2a5d0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
2a5e0 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
2a5f0 6f 77 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ow in the databa
2a600 73 65 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20  se. Expressions 
2a610 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a  iterate through.
2a620 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 73  ** matching rows
2a630 20 69 6e 20 64 6f 63 69 64 20 6f 72 64 65 72 2e   in docid order.
2a640 20 41 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   Ascending order
2a650 20 69 66 20 46 74 73 33 43 75 72 73 6f 72 2e 62   if Fts3Cursor.b
2a660 44 65 73 63 20 69 73 20 7a 65 72 6f 2c 0a 2a 2a  Desc is zero,.**
2a670 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 69   or descending i
2a680 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
2a690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
2a6a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63  ror occurs, *pRc
2a6b0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51   is set to an SQ
2a6c0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
2a6d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
2a6e0 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  * successful, th
2a6f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
2a700 61 62 6c 65 73 20 69 6e 20 70 45 78 70 72 20 61  ables in pExpr a
2a710 72 65 20 73 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  re set:.**.**   
2a720 46 74 73 33 45 78 70 72 2e 62 45 6f 66 20 20 20  Fts3Expr.bEof   
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 6f               (no
2a740 6e 2d 7a 65 72 6f 20 69 66 20 45 4f 46 20 2d 20  n-zero if EOF - 
2a750 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74  there is no next
2a760 20 72 6f 77 29 0a 2a 2a 20 20 20 46 74 73 33 45   row).**   Fts3E
2a770 78 70 72 2e 69 44 6f 63 69 64 20 20 20 20 20 20  xpr.iDocid      
2a780 20 20 20 20 20 20 20 20 28 76 61 6c 69 64 20 69          (valid i
2a790 66 20 62 45 6f 66 3d 3d 30 2e 20 54 68 65 20 64  f bEof==0. The d
2a7a0 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74  ocid of the next
2a7b0 20 72 6f 77 29 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row).**.** If t
2a7c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
2a7d0 20 6f 66 20 74 79 70 65 20 46 54 53 51 55 45 52   of type FTSQUER
2a7e0 59 5f 50 48 52 41 53 45 2c 20 61 6e 64 20 74 68  Y_PHRASE, and th
2a7f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
2a800 6e 6f 74 0a 2a 2a 20 61 74 20 45 4f 46 2c 20 74  not.** at EOF, t
2a810 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
2a820 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  g variables are 
2a830 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
2a840 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
2a850 0a 2a 2a 20 66 6f 72 20 74 68 65 20 70 68 72 61  .** for the phra
2a860 73 65 20 66 6f 72 20 74 68 65 20 76 69 73 69 74  se for the visit
2a870 65 64 20 72 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20  ed row:.**.**   
2a880 46 54 73 33 45 78 70 72 2e 70 50 68 72 61 73 65  FTs3Expr.pPhrase
2a890 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20  ->doclist.nList 
2a8a0 20 20 20 20 20 20 20 28 6c 65 6e 67 74 68 20 6f         (length o
2a8b0 66 20 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73  f pList in bytes
2a8c0 29 0a 2a 2a 20 20 20 46 54 73 33 45 78 70 72 2e  ).**   FTs3Expr.
2a8d0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
2a8e0 2e 70 4c 69 73 74 20 20 20 20 20 20 20 20 28 70  .pList        (p
2a8f0 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69  ointer to positi
2a900 6f 6e 20 6c 69 73 74 29 0a 2a 2a 0a 2a 2a 20 49  on list).**.** I
2a910 74 20 73 61 79 73 20 61 62 6f 76 65 20 74 68 61  t says above tha
2a920 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
2a930 61 64 76 61 6e 63 65 73 20 74 68 65 20 65 78 70  advances the exp
2a940 72 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 20 6e  ression to the n
2a950 65 78 74 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20  ext.** matching 
2a960 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73 75  row. This is usu
2a970 61 6c 6c 79 20 74 72 75 65 2c 20 62 75 74 20 74  ally true, but t
2a980 68 65 72 65 20 61 72 65 20 74 68 65 20 66 6f 6c  here are the fol
2a990 6c 6f 77 69 6e 67 20 65 78 63 65 70 74 69 6f 6e  lowing exception
2a9a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 44 65  s:.**.**   1. De
2a9b0 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 61 72  ferred tokens ar
2a9c0 65 20 6e 6f 74 20 74 61 6b 65 6e 20 69 6e 74 6f  e not taken into
2a9d0 20 61 63 63 6f 75 6e 74 2e 20 49 66 20 61 20 70   account. If a p
2a9e0 68 72 61 73 65 20 63 6f 6e 73 69 73 74 73 0a 2a  hrase consists.*
2a9f0 2a 20 20 20 20 20 20 65 6e 74 69 72 65 6c 79 20  *      entirely 
2aa00 6f 66 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  of deferred toke
2aa10 6e 73 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ns, it is assume
2aa20 64 20 74 6f 20 6d 61 74 63 68 20 65 76 65 72 79  d to match every
2aa30 20 72 6f 77 20 69 6e 0a 2a 2a 20 20 20 20 20 20   row in.**      
2aa40 74 68 65 20 64 62 2e 20 49 6e 20 74 68 69 73 20  the db. In this 
2aa50 63 61 73 65 20 74 68 65 20 70 6f 73 69 74 69 6f  case the positio
2aa60 6e 2d 6c 69 73 74 20 69 73 20 6e 6f 74 20 70 6f  n-list is not po
2aa70 70 75 6c 61 74 65 64 20 61 74 20 61 6c 6c 2e 20  pulated at all. 
2aa80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4f 72 2c 20  .**.**      Or, 
2aa90 69 66 20 61 20 70 68 72 61 73 65 20 63 6f 6e 74  if a phrase cont
2aaa0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
2aab0 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
2aac0 20 61 6e 64 20 6f 6e 65 20 6f 72 0a 2a 2a 20 20   and one or.**  
2aad0 20 20 20 20 6d 6f 72 65 20 6e 6f 6e 2d 64 65 66      more non-def
2aae0 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c 20 74 68  erred tokens, th
2aaf0 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
2ab00 6e 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  n is advanced to
2ab10 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 6e 65   the .**      ne
2ab20 78 74 20 70 6f 73 73 69 62 6c 65 20 6d 61 74 63  xt possible matc
2ab30 68 2c 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6f  h, considering o
2ab40 6e 6c 79 20 6e 6f 6e 2d 64 65 66 65 72 72 65 64  nly non-deferred
2ab50 20 74 6f 6b 65 6e 73 2e 20 49 6e 20 6f 74 68 65   tokens. In othe
2ab60 72 0a 2a 2a 20 20 20 20 20 20 77 6f 72 64 73 2c  r.**      words,
2ab70 20 69 66 20 74 68 65 20 70 68 72 61 73 65 20 69   if the phrase i
2ab80 73 20 22 41 20 42 20 43 22 2c 20 61 6e 64 20 22  s "A B C", and "
2ab90 42 22 20 69 73 20 64 65 66 65 72 72 65 64 2c 20  B" is deferred, 
2aba0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
2abb0 2a 20 20 20 20 20 20 69 73 20 61 64 76 61 6e 63  *      is advanc
2abc0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  ed to the next r
2abd0 6f 77 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ow that contains
2abe0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2abf0 22 41 20 2a 20 43 22 2c 20 0a 2a 2a 20 20 20 20  "A * C", .**    
2ac00 20 20 77 68 65 72 65 20 22 2a 22 20 6d 61 79 20    where "*" may 
2ac10 6d 61 74 63 68 20 61 6e 79 20 73 69 6e 67 6c 65  match any single
2ac20 20 74 6f 6b 65 6e 2e 20 54 68 65 20 70 6f 73 69   token. The posi
2ac30 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 74 68 69  tion list in thi
2ac40 73 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20 69  s case.**      i
2ac50 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20 66  s populated as f
2ac60 6f 72 20 22 41 20 2a 20 43 22 20 62 65 66 6f 72  or "A * C" befor
2ac70 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2ac80 2a 2a 20 20 20 32 2e 20 4e 45 41 52 20 69 73 20  **   2. NEAR is 
2ac90 74 72 65 61 74 65 64 20 61 73 20 41 4e 44 2e 20  treated as AND. 
2aca0 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
2acb0 6e 20 69 73 20 22 78 20 4e 45 41 52 20 79 22 2c  n is "x NEAR y",
2acc0 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 20 20   it is .**      
2acd0 61 64 76 61 6e 63 65 64 20 74 6f 20 70 6f 69 6e  advanced to poin
2ace0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f  t to the next ro
2acf0 77 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 22  w that matches "
2ad00 78 20 41 4e 44 20 79 22 2e 0a 2a 2a 20 0a 2a 2a  x AND y"..** .**
2ad10 20 53 65 65 20 73 71 6c 69 74 65 33 46 74 73 33   See sqlite3Fts3
2ad20 45 76 61 6c 54 65 73 74 44 65 66 65 72 72 65 64  EvalTestDeferred
2ad30 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f  () for details o
2ad40 6e 20 74 65 73 74 69 6e 67 20 69 66 20 61 20 72  n testing if a r
2ad50 6f 77 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  ow is.** really 
2ad60 61 20 6d 61 74 63 68 2c 20 74 61 6b 69 6e 67 20  a match, taking 
2ad70 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 64 65 66  into account def
2ad80 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 61 6e 64  erred tokens and
2ad90 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 73 2e   NEAR operators.
2ada0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2adb0 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2adc0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
2add0 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
2ade0 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72     /* FTS Cursor
2adf0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
2ae00 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  3Expr *pExpr,   
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae20 45 78 70 72 2e 20 74 6f 20 61 64 76 61 6e 63 65  Expr. to advance
2ae30 20 74 6f 20 6e 65 78 74 20 6d 61 74 63 68 69 6e   to next matchin
2ae40 67 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 2a  g row */.  int *
2ae50 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
2ae60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2ae70 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
2ae80 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52   */.){.  if( *pR
2ae90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2aea0 20 20 20 20 69 6e 74 20 62 44 65 73 63 44 6f 63      int bDescDoc
2aeb0 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 62 44 65  list = pCsr->bDe
2aec0 73 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55  sc;         /* U
2aed0 73 65 64 20 62 79 20 44 4f 43 49 44 5f 43 4d 50  sed by DOCID_CMP
2aee0 28 29 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 20 20  () macro */.    
2aef0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 62  assert( pExpr->b
2af00 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45  Eof==0 );.    pE
2af10 78 70 72 2d 3e 62 53 74 61 72 74 20 3d 20 31 3b  xpr->bStart = 1;
2af20 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 45  ..    switch( pE
2af30 78 70 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  xpr->eType ){.  
2af40 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52      case FTSQUER
2af50 59 5f 4e 45 41 52 3a 0a 20 20 20 20 20 20 63 61  Y_NEAR:.      ca
2af60 73 65 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3a  se FTSQUERY_AND:
2af70 20 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 45   {.        Fts3E
2af80 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
2af90 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
2afa0 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 69     Fts3Expr *pRi
2afb0 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
2afc0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
2afd0 65 72 74 28 20 21 70 4c 65 66 74 2d 3e 62 44 65  ert( !pLeft->bDe
2afe0 66 65 72 72 65 64 20 7c 7c 20 21 70 52 69 67 68  ferred || !pRigh
2aff0 74 2d 3e 62 44 65 66 65 72 72 65 64 20 29 3b 0a  t->bDeferred );.
2b000 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
2b010 66 74 2d 3e 62 44 65 66 65 72 72 65 64 20 29 7b  ft->bDeferred ){
2b020 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48  .          /* LH
2b030 53 20 69 73 20 65 6e 74 69 72 65 6c 79 20 64 65  S is entirely de
2b040 66 65 72 72 65 64 2e 20 53 6f 20 77 65 20 61 73  ferred. So we as
2b050 73 75 6d 65 20 69 74 20 6d 61 74 63 68 65 73 20  sume it matches 
2b060 65 76 65 72 79 20 72 6f 77 2e 0a 20 20 20 20 20  every row..     
2b070 20 20 20 20 20 2a 2a 20 41 64 76 61 6e 63 65 20       ** Advance 
2b080 74 68 65 20 52 48 53 20 69 74 65 72 61 74 6f 72  the RHS iterator
2b090 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
2b0a0 74 20 72 6f 77 20 76 69 73 69 74 65 64 2e 20 2a  t row visited. *
2b0b0 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  /.          fts3
2b0c0 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2b0d0 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a  , pRight, pRc);.
2b0e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2b0f0 3e 69 44 6f 63 69 64 20 3d 20 70 52 69 67 68 74  >iDocid = pRight
2b100 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ->iDocid;.      
2b110 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20      pExpr->bEof 
2b120 3d 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 3b 0a  = pRight->bEof;.
2b130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2b140 28 20 70 52 69 67 68 74 2d 3e 62 44 65 66 65 72  ( pRight->bDefer
2b150 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  red ){.         
2b160 20 2f 2a 20 52 48 53 20 69 73 20 65 6e 74 69 72   /* RHS is entir
2b170 65 6c 79 20 64 65 66 65 72 72 65 64 2e 20 53 6f  ely deferred. So
2b180 20 77 65 20 61 73 73 75 6d 65 20 69 74 20 6d 61   we assume it ma
2b190 74 63 68 65 73 20 65 76 65 72 79 20 72 6f 77 2e  tches every row.
2b1a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 64  .          ** Ad
2b1b0 76 61 6e 63 65 20 74 68 65 20 4c 48 53 20 69 74  vance the LHS it
2b1c0 65 72 61 74 6f 72 20 74 6f 20 66 69 6e 64 20 74  erator to find t
2b1d0 68 65 20 6e 65 78 74 20 72 6f 77 20 76 69 73 69  he next row visi
2b1e0 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ted. */.        
2b1f0 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f    fts3EvalNextRo
2b200 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70  w(pCsr, pLeft, p
2b210 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Rc);.          p
2b220 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70  Expr->iDocid = p
2b230 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20  Left->iDocid;.  
2b240 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 62          pExpr->b
2b250 45 6f 66 20 3d 20 70 4c 65 66 74 2d 3e 62 45 6f  Eof = pLeft->bEo
2b260 66 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  f;.        }else
2b270 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
2b280 65 69 74 68 65 72 20 74 68 65 20 52 48 53 20 6f  either the RHS o
2b290 72 20 4c 48 53 20 61 72 65 20 64 65 66 65 72 72  r LHS are deferr
2b2a0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
2b2b0 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77   fts3EvalNextRow
2b2c0 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70 52  (pCsr, pLeft, pR
2b2d0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  c);.          ft
2b2e0 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2b2f0 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29  sr, pRight, pRc)
2b300 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
2b310 65 28 20 21 70 4c 65 66 74 2d 3e 62 45 6f 66 20  e( !pLeft->bEof 
2b320 26 26 20 21 70 52 69 67 68 74 2d 3e 62 45 6f 66  && !pRight->bEof
2b330 20 26 26 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45   && *pRc==SQLITE
2b340 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2b350 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2b360 20 69 44 69 66 66 20 3d 20 44 4f 43 49 44 5f 43   iDiff = DOCID_C
2b370 4d 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64  MP(pLeft->iDocid
2b380 2c 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64  , pRight->iDocid
2b390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2b3a0 66 28 20 69 44 69 66 66 3d 3d 30 20 29 20 62 72  f( iDiff==0 ) br
2b3b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2b3c0 20 69 66 28 20 69 44 69 66 66 3c 30 20 29 7b 0a   if( iDiff<0 ){.
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
2b3e0 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2b3f0 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b  sr, pLeft, pRc);
2b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2b410 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2b420 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f    fts3EvalNextRo
2b430 77 28 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20  w(pCsr, pRight, 
2b440 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pRc);.          
2b450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2b460 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2b470 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d  >iDocid = pLeft-
2b480 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20  >iDocid;.       
2b490 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d     pExpr->bEof =
2b4a0 20 28 70 4c 65 66 74 2d 3e 62 45 6f 66 20 7c 7c   (pLeft->bEof ||
2b4b0 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 29 3b 0a   pRight->bEof);.
2b4c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
2b4d0 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
2b4e0 55 45 52 59 5f 4e 45 41 52 20 26 26 20 70 45 78  UERY_NEAR && pEx
2b4f0 70 72 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20  pr->bEof ){.    
2b500 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b510 70 52 69 67 68 74 2d 3e 65 54 79 70 65 3d 3d 46  pRight->eType==F
2b520 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29  TSQUERY_PHRASE )
2b530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2b540 28 20 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73  ( pRight->pPhras
2b550 65 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20  e->doclist.aAll 
2b560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b570 20 46 74 73 33 44 6f 63 6c 69 73 74 20 2a 70 44   Fts3Doclist *pD
2b580 6c 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 50 68  l = &pRight->pPh
2b590 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20  rase->doclist;. 
2b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69               whi
2b5b0 6c 65 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  le( *pRc==SQLITE
2b5c0 5f 4f 4b 20 26 26 20 70 52 69 67 68 74 2d 3e 62  _OK && pRight->b
2b5d0 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
2b5e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
2b5f0 28 70 44 6c 2d 3e 70 4c 69 73 74 2c 20 30 2c 20  (pDl->pList, 0, 
2b600 70 44 6c 2d 3e 6e 4c 69 73 74 29 3b 0a 20 20 20  pDl->nList);.   
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
2b620 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2b630 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b  r, pRight, pRc);
2b640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2b650 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2b660 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b670 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 20 26 26  Left->pPhrase &&
2b680 20 70 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d   pLeft->pPhrase-
2b690 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 29 7b  >doclist.aAll ){
2b6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
2b6b0 74 73 33 44 6f 63 6c 69 73 74 20 2a 70 44 6c 20  ts3Doclist *pDl 
2b6c0 3d 20 26 70 4c 65 66 74 2d 3e 70 50 68 72 61 73  = &pLeft->pPhras
2b6d0 65 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20  e->doclist;.    
2b6e0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2b6f0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
2b700 20 26 26 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3d   && pLeft->bEof=
2b710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b720 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 44 6c        memset(pDl
2b730 2d 3e 70 4c 69 73 74 2c 20 30 2c 20 70 44 6c 2d  ->pList, 0, pDl-
2b740 3e 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  >nList);.       
2b750 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
2b760 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2b770 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  Left, pRc);.    
2b780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b7b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b7c0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
2b7d0 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 4f 52  case FTSQUERY_OR
2b7e0 3a 20 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33  : {.        Fts3
2b7f0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
2b800 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
2b810 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 52      Fts3Expr *pR
2b820 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
2b830 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 73 71  ight;.        sq
2b840 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 6d 70  lite3_int64 iCmp
2b850 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28 70 4c 65   = DOCID_CMP(pLe
2b860 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52 69 67  ft->iDocid, pRig
2b870 68 74 2d 3e 69 44 6f 63 69 64 29 3b 0a 0a 20 20  ht->iDocid);..  
2b880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
2b890 65 66 74 2d 3e 62 53 74 61 72 74 20 7c 7c 20 70  eft->bStart || p
2b8a0 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3d 3d 70 52  Left->iDocid==pR
2b8b0 69 67 68 74 2d 3e 69 44 6f 63 69 64 20 29 3b 0a  ight->iDocid );.
2b8c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b8d0 70 52 69 67 68 74 2d 3e 62 53 74 61 72 74 20 7c  pRight->bStart |
2b8e0 7c 20 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3d  | pLeft->iDocid=
2b8f0 3d 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 20  =pRight->iDocid 
2b900 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
2b910 70 52 69 67 68 74 2d 3e 62 45 6f 66 20 7c 7c 20  pRight->bEof || 
2b920 28 70 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20  (pLeft->bEof==0 
2b930 26 26 20 69 43 6d 70 3c 30 29 20 29 7b 0a 20 20  && iCmp<0) ){.  
2b940 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2b950 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4c  NextRow(pCsr, pL
2b960 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  eft, pRc);.     
2b970 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
2b980 66 74 2d 3e 62 45 6f 66 20 7c 7c 20 69 43 6d 70  ft->bEof || iCmp
2b990 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2b9a0 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2b9b0 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52  pCsr, pRight, pR
2b9c0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  c);.        }els
2b9d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
2b9e0 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2b9f0 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a  r, pLeft, pRc);.
2ba00 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
2ba10 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2ba20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
2ba30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2ba40 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 28   pExpr->bEof = (
2ba50 70 4c 65 66 74 2d 3e 62 45 6f 66 20 26 26 20 70  pLeft->bEof && p
2ba60 52 69 67 68 74 2d 3e 62 45 6f 66 29 3b 0a 20 20  Right->bEof);.  
2ba70 20 20 20 20 20 20 69 43 6d 70 20 3d 20 44 4f 43        iCmp = DOC
2ba80 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d 3e 69 44  ID_CMP(pLeft->iD
2ba90 6f 63 69 64 2c 20 70 52 69 67 68 74 2d 3e 69 44  ocid, pRight->iD
2baa0 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ocid);.        i
2bab0 66 28 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 20  f( pRight->bEof 
2bac0 7c 7c 20 28 70 4c 65 66 74 2d 3e 62 45 6f 66 3d  || (pLeft->bEof=
2bad0 3d 30 20 26 26 20 20 69 43 6d 70 3c 30 29 20 29  =0 &&  iCmp<0) )
2bae0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
2baf0 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66  r->iDocid = pLef
2bb00 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20  t->iDocid;.     
2bb10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bb20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69      pExpr->iDoci
2bb30 64 20 3d 20 70 52 69 67 68 74 2d 3e 69 44 6f 63  d = pRight->iDoc
2bb40 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  id;.        }.. 
2bb50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2bb60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
2bb70 65 20 46 54 53 51 55 45 52 59 5f 4e 4f 54 3a 20  e FTSQUERY_NOT: 
2bb80 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 45 78  {.        Fts3Ex
2bb90 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
2bba0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
2bbb0 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 69 67    Fts3Expr *pRig
2bbc0 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
2bbd0 68 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ht;..        if(
2bbe0 20 70 52 69 67 68 74 2d 3e 62 53 74 61 72 74 3d   pRight->bStart=
2bbf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2bc00 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2bc10 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52  pCsr, pRight, pR
2bc20 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  c);.          as
2bc30 73 65 72 74 28 20 2a 70 52 63 21 3d 53 51 4c 49  sert( *pRc!=SQLI
2bc40 54 45 5f 4f 4b 20 7c 7c 20 70 52 69 67 68 74 2d  TE_OK || pRight-
2bc50 3e 62 53 74 61 72 74 20 29 3b 0a 20 20 20 20 20  >bStart );.     
2bc60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
2bc70 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2bc80 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b  sr, pLeft, pRc);
2bc90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
2bca0 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  ft->bEof==0 ){. 
2bcb0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2bcc0 21 2a 70 52 63 20 0a 20 20 20 20 20 20 20 20 20  !*pRc .         
2bcd0 20 20 20 20 20 26 26 20 21 70 52 69 67 68 74 2d       && !pRight-
2bce0 3e 62 45 6f 66 20 0a 20 20 20 20 20 20 20 20 20  >bEof .         
2bcf0 20 20 20 20 20 26 26 20 44 4f 43 49 44 5f 43 4d       && DOCID_CM
2bd00 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c  P(pLeft->iDocid,
2bd10 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 29   pRight->iDocid)
2bd20 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b  >0 .          ){
2bd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2bd40 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2bd50 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b  r, pRight, pRc);
2bd60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bd70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2bd80 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70  Expr->iDocid = p
2bd90 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20  Left->iDocid;.  
2bda0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f        pExpr->bEo
2bdb0 66 20 3d 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3b  f = pLeft->bEof;
2bdc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2bdd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
2bde0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
2bdf0 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50    Fts3Phrase *pP
2be00 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70  hrase = pExpr->p
2be10 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20  Phrase;.        
2be20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61  fts3EvalInvalida
2be30 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72 61 73  tePoslist(pPhras
2be40 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 63  e);.        *pRc
2be50 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61 73   = fts3EvalPhras
2be60 65 4e 65 78 74 28 70 43 73 72 2c 20 70 50 68 72  eNext(pCsr, pPhr
2be70 61 73 65 2c 20 26 70 45 78 70 72 2d 3e 62 45 6f  ase, &pExpr->bEo
2be80 66 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  f);.        pExp
2be90 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70 50 68 72  r->iDocid = pPhr
2bea0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 69 44 6f  ase->doclist.iDo
2beb0 63 69 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65  cid;.        bre
2bec0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2bed0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2bee0 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2bef0 4c 49 54 45 5f 4f 4b 2c 20 6f 72 20 69 66 20 70  LITE_OK, or if p
2bf00 45 78 70 72 20 69 73 20 6e 6f 74 20 74 68 65 20  Expr is not the 
2bf10 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 61 20 4e  root node of a N
2bf20 45 41 52 0a 2a 2a 20 63 6c 75 73 74 65 72 2c 20  EAR.** cluster, 
2bf30 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2bf40 6f 6e 20 72 65 74 75 72 6e 73 20 31 20 69 6d 6d  on returns 1 imm
2bf50 65 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ediately..**.** 
2bf60 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 68  Otherwise, it ch
2bf70 65 63 6b 73 20 69 66 20 74 68 65 20 63 75 72 72  ecks if the curr
2bf80 65 6e 74 20 72 6f 77 20 72 65 61 6c 6c 79 20 64  ent row really d
2bf90 6f 65 73 20 6d 61 74 63 68 20 74 68 65 20 4e 45  oes match the NE
2bfa0 41 52 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  AR .** expressio
2bfb0 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 64 61 74  n, using the dat
2bfc0 61 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  a currently stor
2bfd0 65 64 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69  ed in the positi
2bfe0 6f 6e 20 6c 69 73 74 73 20 0a 2a 2a 20 28 46 74  on lists .** (Ft
2bff0 73 33 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2e  s3Expr->pPhrase.
2c000 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 2f 6e 4c  doclist.pList/nL
2c010 69 73 74 29 20 66 6f 72 20 65 61 63 68 20 70 68  ist) for each ph
2c020 72 61 73 65 20 69 6e 20 74 68 65 20 65 78 70 72  rase in the expr
2c030 65 73 73 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  ession. .**.** I
2c040 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
2c050 77 20 69 73 20 61 20 6d 61 74 63 68 2c 20 74 68  w is a match, th
2c060 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
2c070 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2c080 65 61 63 68 0a 2a 2a 20 70 68 72 61 73 65 20 69  each.** phrase i
2c090 6e 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65  n the NEAR expre
2c0a0 73 73 69 6f 6e 20 69 73 20 65 64 69 74 65 64 20  ssion is edited 
2c0b0 69 6e 20 70 6c 61 63 65 20 74 6f 20 63 6f 6e 74  in place to cont
2c0c0 61 69 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 0a 2a  ain only those.*
2c0d0 2a 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63  * phrase instanc
2c0e0 65 73 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20  es sufficiently 
2c0f0 63 6c 6f 73 65 20 74 6f 20 74 68 65 69 72 20 70  close to their p
2c100 65 65 72 73 20 74 6f 20 73 61 74 69 73 66 79 20  eers to satisfy 
2c110 61 6c 6c 20 4e 45 41 52 0a 2a 2a 20 63 6f 6e 73  all NEAR.** cons
2c120 74 72 61 69 6e 74 73 2e 20 49 6e 20 74 68 69 73  traints. In this
2c130 20 63 61 73 65 20 69 74 20 72 65 74 75 72 6e 73   case it returns
2c140 20 31 2e 20 49 66 20 74 68 65 20 4e 45 41 52 20   1. If the NEAR 
2c150 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
2c160 6e 6f 74 20 0a 2a 2a 20 6d 61 74 63 68 20 74 68  not .** match th
2c170 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 30  e current row, 0
2c180 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
2c190 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
2c1a0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 0a   may or may not.
2c1b0 2a 2a 20 62 65 20 65 64 69 74 65 64 20 69 66 20  ** be edited if 
2c1c0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
2c1d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2c1e0 33 45 76 61 6c 4e 65 61 72 54 65 73 74 28 46 74  3EvalNearTest(Ft
2c1f0 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  s3Expr *pExpr, i
2c200 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74 20  nt *pRc){.  int 
2c210 72 65 73 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54  res = 1;..  /* T
2c220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2c230 63 6b 20 72 75 6e 73 20 69 66 20 70 45 78 70 72  ck runs if pExpr
2c240 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
2c250 61 20 4e 45 41 52 20 71 75 65 72 79 2e 0a 20 20  a NEAR query..  
2c260 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
2c270 74 68 65 20 71 75 65 72 79 3a 0a 20 20 2a 2a 0a  the query:.  **.
2c280 20 20 2a 2a 20 20 20 20 20 20 20 20 20 22 77 22    **         "w"
2c290 20 4e 45 41 52 20 22 78 22 20 4e 45 41 52 20 22   NEAR "x" NEAR "
2c2a0 79 22 20 4e 45 41 52 20 22 7a 22 0a 20 20 2a 2a  y" NEAR "z".  **
2c2b0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 72  .  ** which is r
2c2c0 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 74 72  epresented in tr
2c2d0 65 65 20 66 6f 72 6d 20 61 73 3a 0a 20 20 2a 2a  ee form as:.  **
2c2e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c300 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20      |.  **      
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 20 2b 2d 2d 4e 45 41 52 2d 2d 2b 20 20      +--NEAR--+  
2c330 20 20 20 20 3c 2d 2d 20 72 6f 6f 74 20 6f 66 20      <-- root of 
2c340 4e 45 41 52 20 71 75 65 72 79 0a 20 20 2a 2a 20  NEAR query.  ** 
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
2c370 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20    |.  **        
2c380 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
2c390 4e 45 41 52 2d 2d 2b 20 20 20 22 7a 22 0a 20 20  NEAR--+   "z".  
2c3a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2c3b0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
2c3c0 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  |.  **          
2c3d0 20 20 20 20 20 20 2b 2d 2d 4e 45 41 52 2d 2d 2b        +--NEAR--+
2c3e0 20 20 20 22 79 22 0a 20 20 2a 2a 20 20 20 20 20     "y".  **     
2c3f0 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
2c400 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20      |.  **      
2c410 20 20 20 20 20 20 20 20 20 22 77 22 20 20 20 20           "w"    
2c420 20 20 22 78 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20    "x".  **.  ** 
2c430 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 63  The right-hand c
2c440 68 69 6c 64 20 6f 66 20 61 20 4e 45 41 52 20 6e  hild of a NEAR n
2c450 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ode is always a 
2c460 70 68 72 61 73 65 2e 20 54 68 65 20 0a 20 20 2a  phrase. The .  *
2c470 2a 20 6c 65 66 74 2d 68 61 6e 64 20 63 68 69 6c  * left-hand chil
2c480 64 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  d may be either 
2c490 61 20 70 68 72 61 73 65 20 6f 72 20 61 20 4e 45  a phrase or a NE
2c4a0 41 52 20 6e 6f 64 65 2e 20 54 68 65 72 65 20 61  AR node. There a
2c4b0 72 65 0a 20 20 2a 2a 20 6e 6f 20 65 78 63 65 70  re.  ** no excep
2c4c0 74 69 6f 6e 73 20 74 6f 20 74 68 69 73 20 2d 20  tions to this - 
2c4d0 69 74 27 73 20 74 68 65 20 77 61 79 20 74 68 65  it's the way the
2c4e0 20 70 61 72 73 65 72 20 69 6e 20 66 74 73 33 5f   parser in fts3_
2c4f0 65 78 70 72 2e 63 20 77 6f 72 6b 73 2e 0a 20 20  expr.c works..  
2c500 2a 2f 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  */.  if( *pRc==S
2c510 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
2c520 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
2c530 53 51 55 45 52 59 5f 4e 45 41 52 20 0a 20 20 20  SQUERY_NEAR .   
2c540 26 26 20 28 70 45 78 70 72 2d 3e 70 50 61 72 65  && (pExpr->pPare
2c550 6e 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e  nt==0 || pExpr->
2c560 70 50 61 72 65 6e 74 2d 3e 65 54 79 70 65 21 3d  pParent->eType!=
2c570 46 54 53 51 55 45 52 59 5f 4e 45 41 52 29 0a 20  FTSQUERY_NEAR). 
2c580 20 29 7b 0a 20 20 20 20 46 74 73 33 45 78 70 72   ){.    Fts3Expr
2c590 20 2a 70 3b 20 0a 20 20 20 20 73 71 6c 69 74 65   *p; .    sqlite
2c5a0 33 5f 69 6e 74 36 34 20 6e 54 6d 70 20 3d 20 30  3_int64 nTmp = 0
2c5b0 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c5c0 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 2a   of temp space *
2c5d0 2f 0a 20 20 20 20 63 68 61 72 20 2a 61 54 6d 70  /.    char *aTmp
2c5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c5f0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
2c600 65 20 66 6f 72 20 50 6f 73 6c 69 73 74 4e 65 61  e for PoslistNea
2c610 72 4d 65 72 67 65 28 29 20 2a 2f 0a 0a 20 20 20  rMerge() */..   
2c620 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 65 6d   /* Allocate tem
2c630 70 6f 72 61 72 79 20 77 6f 72 6b 69 6e 67 20 73  porary working s
2c640 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  pace. */.    for
2c650 28 70 3d 70 45 78 70 72 3b 20 70 2d 3e 70 4c 65  (p=pExpr; p->pLe
2c660 66 74 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b  ft; p=p->pLeft){
2c670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c680 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73  ->pRight->pPhras
2c690 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74  e->doclist.nList
2c6a0 3e 30 20 29 3b 0a 20 20 20 20 20 20 6e 54 6d 70  >0 );.      nTmp
2c6b0 20 2b 3d 20 70 2d 3e 70 52 69 67 68 74 2d 3e 70   += p->pRight->p
2c6c0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2c6d0 6e 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nList;.    }.   
2c6e0 20 6e 54 6d 70 20 2b 3d 20 70 2d 3e 70 50 68 72   nTmp += p->pPhr
2c6f0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69  ase->doclist.nLi
2c700 73 74 3b 0a 20 20 20 20 61 54 6d 70 20 3d 20 73  st;.    aTmp = s
2c710 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2c720 6e 54 6d 70 2a 32 29 3b 0a 20 20 20 20 69 66 28  nTmp*2);.    if(
2c730 20 21 61 54 6d 70 20 29 7b 0a 20 20 20 20 20 20   !aTmp ){.      
2c740 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
2c750 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  MEM;.      res =
2c760 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2c770 20 20 20 20 20 63 68 61 72 20 2a 61 50 6f 73 6c       char *aPosl
2c780 69 73 74 20 3d 20 70 2d 3e 70 50 68 72 61 73 65  ist = p->pPhrase
2c790 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b  ->doclist.pList;
2c7a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
2c7b0 6e 20 3d 20 70 2d 3e 70 50 68 72 61 73 65 2d 3e  n = p->pPhrase->
2c7c0 6e 54 6f 6b 65 6e 3b 0a 0a 20 20 20 20 20 20 66  nToken;..      f
2c7d0 6f 72 28 70 3d 70 2d 3e 70 50 61 72 65 6e 74 3b  or(p=p->pParent;
2c7e0 72 65 73 20 26 26 20 70 20 26 26 20 70 2d 3e 65  res && p && p->e
2c7f0 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e  Type==FTSQUERY_N
2c800 45 41 52 3b 20 70 3d 70 2d 3e 70 50 61 72 65 6e  EAR; p=p->pParen
2c810 74 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33  t){.        Fts3
2c820 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
2c830 3d 20 70 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68  = p->pRight->pPh
2c840 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  rase;.        in
2c850 74 20 6e 4e 65 61 72 20 3d 20 70 2d 3e 6e 4e 65  t nNear = p->nNe
2c860 61 72 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  ar;.        res 
2c870 3d 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72  = fts3EvalNearTr
2c880 69 6d 28 6e 4e 65 61 72 2c 20 61 54 6d 70 2c 20  im(nNear, aTmp, 
2c890 26 61 50 6f 73 6c 69 73 74 2c 20 26 6e 54 6f 6b  &aPoslist, &nTok
2c8a0 65 6e 2c 20 70 50 68 72 61 73 65 29 3b 0a 20 20  en, pPhrase);.  
2c8b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 50 6f      }..      aPo
2c8c0 73 6c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  slist = pExpr->p
2c8d0 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e  Right->pPhrase->
2c8e0 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  doclist.pList;. 
2c8f0 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 70 45       nToken = pE
2c900 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68  xpr->pRight->pPh
2c910 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20  rase->nToken;.  
2c920 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70 72 2d      for(p=pExpr-
2c930 3e 70 4c 65 66 74 3b 20 70 20 26 26 20 72 65 73  >pLeft; p && res
2c940 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20  ; p=p->pLeft){. 
2c950 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 61 72         int nNear
2c960 3b 0a 20 20 20 20 20 20 20 20 46 74 73 33 50 68  ;.        Fts3Ph
2c970 72 61 73 65 20 2a 70 50 68 72 61 73 65 3b 0a 20  rase *pPhrase;. 
2c980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2c990 2d 3e 70 50 61 72 65 6e 74 20 26 26 20 70 2d 3e  ->pParent && p->
2c9a0 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d  pParent->pLeft==
2c9b0 70 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65  p );.        nNe
2c9c0 61 72 20 3d 20 70 2d 3e 70 50 61 72 65 6e 74 2d  ar = p->pParent-
2c9d0 3e 6e 4e 65 61 72 3b 0a 20 20 20 20 20 20 20 20  >nNear;.        
2c9e0 70 50 68 72 61 73 65 20 3d 20 28 0a 20 20 20 20  pPhrase = (.    
2c9f0 20 20 20 20 20 20 20 20 70 2d 3e 65 54 79 70 65          p->eType
2ca00 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20  ==FTSQUERY_NEAR 
2ca10 3f 20 70 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68  ? p->pRight->pPh
2ca20 72 61 73 65 20 3a 20 70 2d 3e 70 50 68 72 61 73  rase : p->pPhras
2ca30 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
2ca40 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 33 45       res = fts3E
2ca50 76 61 6c 4e 65 61 72 54 72 69 6d 28 6e 4e 65 61  valNearTrim(nNea
2ca60 72 2c 20 61 54 6d 70 2c 20 26 61 50 6f 73 6c 69  r, aTmp, &aPosli
2ca70 73 74 2c 20 26 6e 54 6f 6b 65 6e 2c 20 70 50 68  st, &nToken, pPh
2ca80 72 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rase);.      }. 
2ca90 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
2caa0 33 5f 66 72 65 65 28 61 54 6d 70 29 3b 0a 20 20  3_free(aTmp);.  
2cab0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  }..  return res;
2cac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2cad0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 68 65 6c  unction is a hel
2cae0 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
2caf0 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
2cb00 54 65 73 74 44 65 66 65 72 72 65 64 28 29 2e 0a  TestDeferred()..
2cb10 2a 2a 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65  ** Assuming no e
2cb20 72 72 6f 72 20 6f 63 63 75 72 73 20 6f 72 20 68  rror occurs or h
2cb30 61 73 20 6f 63 63 75 72 72 65 64 2c 20 49 74 20  as occurred, It 
2cb40 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
2cb50 20 69 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   if the.** expre
2cb60 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
2cb70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2cb80 65 6e 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  ent matches the 
2cb90 72 6f 77 20 74 68 61 74 20 70 43 73 72 20 0a 2a  row that pCsr .*
2cba0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
2cbb0 74 73 20 74 6f 2c 20 6f 72 20 7a 65 72 6f 20 69  ts to, or zero i
2cbc0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
2cbd0 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
2cbe0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
2cbf0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2cc00 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
2cc10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 49 66  s a no-op..** If
2cc20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2cc30 20 64 75 72 69 6e 67 20 65 78 65 63 75 74 69 6f   during executio
2cc40 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  n of this functi
2cc50 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20  on, *pRc is set 
2cc60 74 6f 20 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  to .** the appro
2cc70 70 72 69 61 74 65 20 53 51 4c 69 74 65 20 65 72  priate SQLite er
2cc80 72 6f 72 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  ror code. In thi
2cc90 73 20 63 61 73 65 20 74 68 65 20 72 65 74 75 72  s case the retur
2cca0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 0a 2a 2a  ned value is .**
2ccb0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2ccc0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76  tatic int fts3Ev
2ccd0 61 6c 54 65 73 74 45 78 70 72 28 0a 20 20 46 74  alTestExpr(.  Ft
2cce0 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd00 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e 64   FTS cursor hand
2cd10 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  le */.  Fts3Expr
2cd20 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
2cd30 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
2cd40 74 6f 20 74 65 73 74 2e 20 4d 61 79 20 6f 72 20  to test. May or 
2cd50 6d 61 79 20 6e 6f 74 20 62 65 20 72 6f 6f 74 2e  may not be root.
2cd60 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20   */.  int *pRc  
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd80 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2cd90 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29   Error code */.)
2cda0 7b 0a 20 20 69 6e 74 20 62 48 69 74 20 3d 20 31  {.  int bHit = 1
2cdb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cdc0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
2cdd0 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 2a 70 52  lue */.  if( *pR
2cde0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cdf0 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
2ce00 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  r->eType ){.    
2ce10 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59 5f    case FTSQUERY_
2ce20 4e 45 41 52 3a 0a 20 20 20 20 20 20 63 61 73 65  NEAR:.      case
2ce30 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3a 0a 20   FTSQUERY_AND:. 
2ce40 20 20 20 20 20 20 20 62 48 69 74 20 3d 20 28 0a         bHit = (.
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33              fts3
2ce60 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73  EvalTestExpr(pCs
2ce70 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  r, pExpr->pLeft,
2ce80 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 20 26   pRc).         &
2ce90 26 20 66 74 73 33 45 76 61 6c 54 65 73 74 45 78  & fts3EvalTestEx
2cea0 70 72 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  pr(pCsr, pExpr->
2ceb0 70 52 69 67 68 74 2c 20 70 52 63 29 0a 20 20 20  pRight, pRc).   
2cec0 20 20 20 20 20 20 26 26 20 66 74 73 33 45 76 61        && fts3Eva
2ced0 6c 4e 65 61 72 54 65 73 74 28 70 45 78 70 72 2c  lNearTest(pExpr,
2cee0 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 29 3b   pRc).        );
2cef0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
2cf00 74 68 65 20 4e 45 41 52 20 65 78 70 72 65 73 73  the NEAR express
2cf10 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ion does not mat
2cf20 63 68 20 61 6e 79 20 72 6f 77 73 2c 20 7a 65 72  ch any rows, zer
2cf30 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  o the doclist fo
2cf40 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  r .        ** al
2cf50 6c 20 70 68 72 61 73 65 73 20 69 6e 76 6f 6c 76  l phrases involv
2cf60 65 64 20 69 6e 20 74 68 65 20 4e 45 41 52 2e 20  ed in the NEAR. 
2cf70 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
2cf80 74 68 65 20 73 6e 69 70 70 65 74 28 29 2c 0a 20  the snippet(),. 
2cf90 20 20 20 20 20 20 20 2a 2a 20 6f 66 66 73 65 74         ** offset
2cfa0 73 28 29 20 61 6e 64 20 6d 61 74 63 68 69 6e 66  s() and matchinf
2cfb0 6f 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  o() functions ar
2cfc0 65 20 6e 6f 74 20 73 75 70 70 6f 73 65 64 20 74  e not supposed t
2cfd0 6f 20 72 65 63 6f 67 6e 69 7a 65 20 0a 20 20 20  o recognize .   
2cfe0 20 20 20 20 20 2a 2a 20 61 6e 79 20 69 6e 73 74       ** any inst
2cff0 61 6e 63 65 73 20 6f 66 20 70 68 72 61 73 65 73  ances of phrases
2d000 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20 6f   that are part o
2d010 66 20 75 6e 6d 61 74 63 68 65 64 20 4e 45 41 52  f unmatched NEAR
2d020 20 71 75 65 72 69 65 73 2e 20 0a 20 20 20 20 20   queries. .     
2d030 20 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c     ** For exampl
2d040 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65 73  e if this expres
2d050 73 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 2a 2a  sion:.        **
2d060 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 2e  .        **    .
2d070 2e 2e 20 4d 41 54 43 48 20 27 61 20 4f 52 20 28  .. MATCH 'a OR (
2d080 62 20 4e 45 41 52 20 63 29 27 0a 20 20 20 20 20  b NEAR c)'.     
2d090 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2d0a0 20 69 73 20 6d 61 74 63 68 65 64 20 61 67 61 69   is matched agai
2d0b0 6e 73 74 20 61 20 72 6f 77 20 63 6f 6e 74 61 69  nst a row contai
2d0c0 6e 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  ning:.        **
2d0d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2d0e0 20 20 20 27 61 20 62 20 64 20 65 27 0a 20 20 20     'a b d e'.   
2d0f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2d100 2a 2a 20 74 68 65 6e 20 61 6e 79 20 73 6e 69 70  ** then any snip
2d110 70 65 74 28 29 20 73 68 6f 75 6c 64 20 6f 6e 79  pet() should ony
2d120 20 68 69 67 68 6c 69 67 68 74 20 74 68 65 20 22   highlight the "
2d130 61 22 20 74 65 72 6d 2c 20 6e 6f 74 20 74 68 65  a" term, not the
2d140 20 22 62 22 0a 20 20 20 20 20 20 20 20 2a 2a 20   "b".        ** 
2d150 28 61 73 20 22 62 22 20 69 73 20 70 61 72 74 20  (as "b" is part 
2d160 6f 66 20 61 20 6e 6f 6e 2d 6d 61 74 63 68 69 6e  of a non-matchin
2d170 67 20 4e 45 41 52 20 63 6c 61 75 73 65 29 2e 0a  g NEAR clause)..
2d180 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2d190 20 20 20 69 66 28 20 62 48 69 74 3d 3d 30 20 0a     if( bHit==0 .
2d1a0 20 20 20 20 20 20 20 20 20 26 26 20 70 45 78 70           && pExp
2d1b0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
2d1c0 52 59 5f 4e 45 41 52 20 0a 20 20 20 20 20 20 20  RY_NEAR .       
2d1d0 20 20 26 26 20 28 70 45 78 70 72 2d 3e 70 50 61    && (pExpr->pPa
2d1e0 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 45 78 70 72  rent==0 || pExpr
2d1f0 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54 79 70 65  ->pParent->eType
2d200 21 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 29  !=FTSQUERY_NEAR)
2d210 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2d220 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20 2a        Fts3Expr *
2d230 70 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  p;.          for
2d240 28 70 3d 70 45 78 70 72 3b 20 70 2d 3e 70 50 68  (p=pExpr; p->pPh
2d250 72 61 73 65 3d 3d 30 3b 20 70 3d 70 2d 3e 70 4c  rase==0; p=p->pL
2d260 65 66 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  eft){.          
2d270 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 2d    if( p->pRight-
2d280 3e 69 44 6f 63 69 64 3d 3d 70 43 73 72 2d 3e 69  >iDocid==pCsr->i
2d290 50 72 65 76 49 64 20 29 7b 0a 20 20 20 20 20 20  PrevId ){.      
2d2a0 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2d2b0 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73  InvalidatePoslis
2d2c0 74 28 70 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68  t(p->pRight->pPh
2d2d0 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
2d2e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2d2f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d300 2d 3e 69 44 6f 63 69 64 3d 3d 70 43 73 72 2d 3e  ->iDocid==pCsr->
2d310 69 50 72 65 76 49 64 20 29 7b 0a 20 20 20 20 20  iPrevId ){.     
2d320 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 49         fts3EvalI
2d330 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73 74  nvalidatePoslist
2d340 28 70 2d 3e 70 50 68 72 61 73 65 29 3b 0a 20 20  (p->pPhrase);.  
2d350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d360 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 62 72 65    }..        bre
2d370 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
2d380 46 54 53 51 55 45 52 59 5f 4f 52 3a 20 7b 0a 20  FTSQUERY_OR: {. 
2d390 20 20 20 20 20 20 20 69 6e 74 20 62 48 69 74 31         int bHit1
2d3a0 20 3d 20 66 74 73 33 45 76 61 6c 54 65 73 74 45   = fts3EvalTestE
2d3b0 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72 2d  xpr(pCsr, pExpr-
2d3c0 3e 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20  >pLeft, pRc);.  
2d3d0 20 20 20 20 20 20 69 6e 74 20 62 48 69 74 32 20        int bHit2 
2d3e0 3d 20 66 74 73 33 45 76 61 6c 54 65 73 74 45 78  = fts3EvalTestEx
2d3f0 70 72 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  pr(pCsr, pExpr->
2d400 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
2d410 20 20 20 20 20 20 62 48 69 74 20 3d 20 62 48 69        bHit = bHi
2d420 74 31 20 7c 7c 20 62 48 69 74 32 3b 0a 20 20 20  t1 || bHit2;.   
2d430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d440 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
2d450 46 54 53 51 55 45 52 59 5f 4e 4f 54 3a 0a 20 20  FTSQUERY_NOT:.  
2d460 20 20 20 20 20 20 62 48 69 74 20 3d 20 28 0a 20        bHit = (. 
2d470 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45             fts3E
2d480 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2d490 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
2d4a0 70 52 63 29 0a 20 20 20 20 20 20 20 20 20 26 26  pRc).         &&
2d4b0 20 21 66 74 73 33 45 76 61 6c 54 65 73 74 45 78   !fts3EvalTestEx
2d4c0 70 72 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  pr(pCsr, pExpr->
2d4d0 70 52 69 67 68 74 2c 20 70 52 63 29 0a 20 20 20  pRight, pRc).   
2d4e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2d4f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65  break;..      de
2d500 66 61 75 6c 74 3a 20 7b 0a 23 69 66 6e 64 65 66  fault: {.#ifndef
2d510 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
2d520 46 54 53 34 5f 44 45 46 45 52 52 45 44 0a 20 20  FTS4_DEFERRED.  
2d530 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e        if( pCsr->
2d540 70 44 65 66 65 72 72 65 64 20 0a 20 20 20 20 20  pDeferred .     
2d550 20 20 20 20 26 26 20 28 70 45 78 70 72 2d 3e 69      && (pExpr->i
2d560 44 6f 63 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72  Docid==pCsr->iPr
2d570 65 76 49 64 20 7c 7c 20 70 45 78 70 72 2d 3e 62  evId || pExpr->b
2d580 44 65 66 65 72 72 65 64 29 0a 20 20 20 20 20 20  Deferred).      
2d590 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46    ){.          F
2d5a0 74 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61  ts3Phrase *pPhra
2d5b0 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72  se = pExpr->pPhr
2d5c0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ase;.          a
2d5d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 62 44  ssert( pExpr->bD
2d5e0 65 66 65 72 72 65 64 20 7c 7c 20 70 50 68 72 61  eferred || pPhra
2d5f0 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65  se->doclist.bFre
2d600 65 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  eList==0 );.    
2d610 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2d620 3e 62 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20  >bDeferred ){.  
2d630 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
2d640 61 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c  alInvalidatePosl
2d650 69 73 74 28 70 50 68 72 61 73 65 29 3b 0a 20 20  ist(pPhrase);.  
2d660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d670 20 20 20 20 2a 70 52 63 20 3d 20 66 74 73 33 45      *pRc = fts3E
2d680 76 61 6c 44 65 66 65 72 72 65 64 50 68 72 61 73  valDeferredPhras
2d690 65 28 70 43 73 72 2c 20 70 50 68 72 61 73 65 29  e(pCsr, pPhrase)
2d6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 48 69 74  ;.          bHit
2d6b0 20 3d 20 28 70 50 68 72 61 73 65 2d 3e 64 6f 63   = (pPhrase->doc
2d6c0 6c 69 73 74 2e 70 4c 69 73 74 21 3d 30 29 3b 0a  list.pList!=0);.
2d6d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2d6e0 3e 69 44 6f 63 69 64 20 3d 20 70 43 73 72 2d 3e  >iDocid = pCsr->
2d6f0 69 50 72 65 76 49 64 3b 0a 20 20 20 20 20 20 20  iPrevId;.       
2d700 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2d710 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d720 20 20 62 48 69 74 20 3d 20 28 70 45 78 70 72 2d    bHit = (pExpr-
2d730 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70 45 78 70  >bEof==0 && pExp
2d740 72 2d 3e 69 44 6f 63 69 64 3d 3d 70 43 73 72 2d  r->iDocid==pCsr-
2d750 3e 69 50 72 65 76 49 64 29 3b 0a 20 20 20 20 20  >iPrevId);.     
2d760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
2d770 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2d780 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  }.  }.  return b
2d790 48 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Hit;.}../*.** Th
2d7a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2d7b0 61 6c 6c 65 64 20 61 73 20 74 68 65 20 73 65 63  alled as the sec
2d7c0 6f 6e 64 20 70 61 72 74 20 6f 66 20 65 61 63 68  ond part of each
2d7d0 20 78 4e 65 78 74 20 6f 70 65 72 61 74 69 6f 6e   xNext operation
2d7e0 20 77 68 65 6e 0a 2a 2a 20 69 74 65 72 61 74 69   when.** iterati
2d7f0 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  ng through the r
2d800 65 73 75 6c 74 73 20 6f 66 20 61 20 66 75 6c 6c  esults of a full
2d810 2d 74 65 78 74 20 71 75 65 72 79 2e 20 41 74 20  -text query. At 
2d820 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 0a 2a  this point the.*
2d830 2a 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  * cursor points 
2d840 74 6f 20 61 20 72 6f 77 20 74 68 61 74 20 6d 61  to a row that ma
2d850 74 63 68 65 73 20 74 68 65 20 71 75 65 72 79 20  tches the query 
2d860 65 78 70 72 65 73 73 69 6f 6e 2c 20 77 69 74 68  expression, with
2d870 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
2d880 67 20 63 61 76 65 61 74 73 3a 0a 2a 2a 0a 2a 2a  g caveats:.**.**
2d890 20 20 20 2a 20 55 70 20 75 6e 74 69 6c 20 74 68     * Up until th
2d8a0 69 73 20 70 6f 69 6e 74 2c 20 22 4e 45 41 52 22  is point, "NEAR"
2d8b0 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68   operators in th
2d8c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 76  e expression hav
2d8d0 65 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 74 72  e been.**     tr
2d8e0 65 61 74 65 64 20 61 73 20 22 41 4e 44 22 2e 0a  eated as "AND"..
2d8f0 2a 2a 0a 2a 2a 20 20 20 2a 20 44 65 66 65 72 72  **.**   * Deferr
2d900 65 64 20 74 6f 6b 65 6e 73 20 68 61 76 65 20 6e  ed tokens have n
2d910 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 73  ot yet been cons
2d920 69 64 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  idered..**.** If
2d930 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2d940 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2d950 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2d960 6c 65 64 2c 20 69 74 20 69 6d 6d 65 64 69 61 74  led, it immediat
2d970 65 6c 79 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30  ely.** returns 0
2d980 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2d990 74 65 73 74 73 20 77 68 65 74 68 65 72 20 6f 72  tests whether or
2d9a0 20 6e 6f 74 20 61 66 74 65 72 20 63 6f 6e 73 69   not after consi
2d9b0 64 65 72 69 6e 67 20 4e 45 41 52 0a 2a 2a 20 6f  dering NEAR.** o
2d9c0 70 65 72 61 74 6f 72 73 20 61 6e 64 20 64 65 66  perators and def
2d9d0 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 74 68 65  erred tokens the
2d9e0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
2d9f0 73 74 69 6c 6c 20 61 20 6d 61 74 63 68 20 66 6f  still a match fo
2da00 72 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  r the.** express
2da10 69 6f 6e 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ion. It returns 
2da20 31 20 69 66 20 62 6f 74 68 20 6f 66 20 74 68 65  1 if both of the
2da30 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
2da40 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  rue:.**.**   1. 
2da50 2a 70 52 63 20 69 73 20 53 51 4c 49 54 45 5f 4f  *pRc is SQLITE_O
2da60 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
2da70 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 61 6e  tion returns, an
2da80 64 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 41 66 74  d.**.**   2. Aft
2da90 65 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20  er scanning the 
2daa0 63 75 72 72 65 6e 74 20 46 54 53 20 74 61 62 6c  current FTS tabl
2dab0 65 20 72 6f 77 20 66 6f 72 20 74 68 65 20 64 65  e row for the de
2dac0 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c 0a 2a  ferred tokens,.*
2dad0 2a 20 20 20 20 20 20 69 74 20 69 73 20 64 65 74  *      it is det
2dae0 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
2daf0 20 72 6f 77 20 64 6f 65 73 20 2a 6e 6f 74 2a 20   row does *not* 
2db00 6d 61 74 63 68 20 74 68 65 20 71 75 65 72 79 2e  match the query.
2db10 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f  .**.** Or, if no
2db20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
2db30 64 20 69 74 20 73 65 65 6d 73 20 74 68 65 20 63  d it seems the c
2db40 75 72 72 65 6e 74 20 72 6f 77 20 64 6f 65 73 20  urrent row does 
2db50 6d 61 74 63 68 20 74 68 65 20 46 54 53 0a 2a 2a  match the FTS.**
2db60 20 71 75 65 72 79 2c 20 72 65 74 75 72 6e 20 30   query, return 0
2db70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2db80 46 74 73 33 45 76 61 6c 54 65 73 74 44 65 66 65  Fts3EvalTestDefe
2db90 72 72 65 64 28 46 74 73 33 43 75 72 73 6f 72 20  rred(Fts3Cursor 
2dba0 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 52 63 29  *pCsr, int *pRc)
2dbb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a 70 52  {.  int rc = *pR
2dbc0 63 3b 0a 20 20 69 6e 74 20 62 4d 69 73 73 20 3d  c;.  int bMiss =
2dbd0 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
2dbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
2dbf0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
2dc00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 65 66 65  one or more defe
2dc10 72 72 65 64 20 74 6f 6b 65 6e 73 2c 20 6c 6f 61  rred tokens, loa
2dc20 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  d the current ro
2dc30 77 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 6d 65  w into.    ** me
2dc40 6d 6f 72 79 20 61 6e 64 20 73 63 61 6e 20 69 74  mory and scan it
2dc50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
2dc60 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
2dc70 66 6f 72 20 65 61 63 68 20 64 65 66 65 72 72 65  for each deferre
2dc80 64 0a 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 2e 20  d.    ** token. 
2dc90 54 68 65 6e 2c 20 73 65 65 20 69 66 20 74 68 69  Then, see if thi
2dca0 73 20 72 6f 77 20 69 73 20 72 65 61 6c 6c 79 20  s row is really 
2dcb0 61 20 6d 61 74 63 68 2c 20 63 6f 6e 73 69 64 65  a match, conside
2dcc0 72 69 6e 67 20 64 65 66 65 72 72 65 64 0a 20 20  ring deferred.  
2dcd0 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 61 6e 64 20    ** tokens and 
2dce0 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 73 20 28  NEAR operators (
2dcf0 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
2dd00 20 77 65 72 65 20 74 61 6b 65 6e 20 69 6e 74 6f   were taken into
2dd10 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 2a 2a 20   account.    ** 
2dd20 65 61 72 6c 69 65 72 2c 20 62 79 20 66 74 73 33  earlier, by fts3
2dd30 45 76 61 6c 4e 65 78 74 52 6f 77 28 29 29 2e 20  EvalNextRow()). 
2dd40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dd50 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20  pCsr->pDeferred 
2dd60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  ){.      rc = ft
2dd70 73 33 43 75 72 73 6f 72 53 65 65 6b 28 30 2c 20  s3CursorSeek(0, 
2dd80 70 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCsr);.      if(
2dd90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2dda0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2ddb0 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 44  qlite3Fts3CacheD
2ddc0 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28  eferredDoclists(
2ddd0 70 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pCsr);.      }. 
2dde0 20 20 20 7d 0a 20 20 20 20 62 4d 69 73 73 20 3d     }.    bMiss =
2ddf0 20 28 30 3d 3d 66 74 73 33 45 76 61 6c 54 65 73   (0==fts3EvalTes
2de00 74 45 78 70 72 28 70 43 73 72 2c 20 70 43 73 72  tExpr(pCsr, pCsr
2de10 2d 3e 70 45 78 70 72 2c 20 26 72 63 29 29 3b 0a  ->pExpr, &rc));.
2de20 0a 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65  .    /* Free the
2de30 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 73 20   position-lists 
2de40 61 63 63 75 6d 75 6c 61 74 65 64 20 66 6f 72 20  accumulated for 
2de50 65 61 63 68 20 64 65 66 65 72 72 65 64 20 74 6f  each deferred to
2de60 6b 65 6e 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  ken above. */.  
2de70 20 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65    sqlite3Fts3Fre
2de80 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74  eDeferredDoclist
2de90 73 28 70 43 73 72 29 3b 0a 20 20 20 20 2a 70 52  s(pCsr);.    *pR
2dea0 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  c = rc;.  }.  re
2deb0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
2dec0 5f 4f 4b 20 26 26 20 62 4d 69 73 73 29 3b 0a 7d  _OK && bMiss);.}
2ded0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2dee0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 75  to the next docu
2def0 6d 65 6e 74 20 74 68 61 74 20 6d 61 74 63 68 65  ment that matche
2df00 73 20 74 68 65 20 46 54 53 20 65 78 70 72 65 73  s the FTS expres
2df10 73 69 6f 6e 20 69 6e 0a 2a 2a 20 46 74 73 33 43  sion in.** Fts3C
2df20 75 72 73 6f 72 2e 70 45 78 70 72 2e 0a 2a 2f 0a  ursor.pExpr..*/.
2df30 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
2df40 76 61 6c 4e 65 78 74 28 46 74 73 33 43 75 72 73  valNext(Fts3Curs
2df50 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
2df60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2df80 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2df90 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72   Fts3Expr *pExpr
2dfa0 20 3d 20 70 43 73 72 2d 3e 70 45 78 70 72 3b 0a   = pCsr->pExpr;.
2dfb0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
2dfc0 69 73 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66  isEof==0 );.  if
2dfd0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
2dfe0 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
2dff0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2e000 64 6f 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  do {.      if( p
2e010 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65  Csr->isRequireSe
2e020 65 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ek==0 ){.       
2e030 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
2e040 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  Csr->pStmt);.   
2e050 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2e060 74 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  t( sqlite3_data_
2e070 63 6f 75 6e 74 28 70 43 73 72 2d 3e 70 53 74 6d  count(pCsr->pStm
2e080 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  t)==0 );.      f
2e090 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70  ts3EvalNextRow(p
2e0a0 43 73 72 2c 20 70 45 78 70 72 2c 20 26 72 63 29  Csr, pExpr, &rc)
2e0b0 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73  ;.      pCsr->is
2e0c0 45 6f 66 20 3d 20 70 45 78 70 72 2d 3e 62 45 6f  Eof = pExpr->bEo
2e0d0 66 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69  f;.      pCsr->i
2e0e0 73 52 65 71 75 69 72 65 53 65 65 6b 20 3d 20 31  sRequireSeek = 1
2e0f0 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73  ;.      pCsr->is
2e100 4d 61 74 63 68 69 6e 66 6f 4e 65 65 64 65 64 20  MatchinfoNeeded 
2e110 3d 20 31 3b 0a 20 20 20 20 20 20 70 43 73 72 2d  = 1;.      pCsr-
2e120 3e 69 50 72 65 76 49 64 20 3d 20 70 45 78 70 72  >iPrevId = pExpr
2e130 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 7d 77  ->iDocid;.    }w
2e140 68 69 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f  hile( pCsr->isEo
2e150 66 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 46  f==0 && sqlite3F
2e160 74 73 33 45 76 61 6c 54 65 73 74 44 65 66 65 72  ts3EvalTestDefer
2e170 72 65 64 28 70 43 73 72 2c 20 26 72 63 29 20 29  red(pCsr, &rc) )
2e180 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
2e190 6b 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  k if the cursor 
2e1a0 69 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  is past the end 
2e1b0 6f 66 20 74 68 65 20 64 6f 63 69 64 20 72 61 6e  of the docid ran
2e1c0 67 65 20 73 70 65 63 69 66 69 65 64 0a 20 20 2a  ge specified.  *
2e1d0 2a 20 62 79 20 46 74 73 33 43 75 72 73 6f 72 2e  * by Fts3Cursor.
2e1e0 69 4d 69 6e 44 6f 63 69 64 2f 69 4d 61 78 44 6f  iMinDocid/iMaxDo
2e1f0 63 69 64 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  cid. If so, set 
2e200 74 68 65 20 45 4f 46 20 66 6c 61 67 2e 20 20 2a  the EOF flag.  *
2e210 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e220 54 45 5f 4f 4b 20 26 26 20 28 0a 20 20 20 20 20  TE_OK && (.     
2e230 20 20 20 28 70 43 73 72 2d 3e 62 44 65 73 63 3d     (pCsr->bDesc=
2e240 3d 30 20 26 26 20 70 43 73 72 2d 3e 69 50 72 65  =0 && pCsr->iPre
2e250 76 49 64 3e 70 43 73 72 2d 3e 69 4d 61 78 44 6f  vId>pCsr->iMaxDo
2e260 63 69 64 29 0a 20 20 20 20 20 7c 7c 20 28 70 43  cid).     || (pC
2e270 73 72 2d 3e 62 44 65 73 63 21 3d 30 20 26 26 20  sr->bDesc!=0 && 
2e280 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3c 70 43  pCsr->iPrevId<pC
2e290 73 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 29 0a 20  sr->iMinDocid). 
2e2a0 20 29 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69   )){.    pCsr->i
2e2b0 73 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  sEof = 1;.  }.. 
2e2c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e2d0 2a 0a 2a 2a 20 52 65 73 74 61 72 74 20 69 6e 74  *.** Restart int
2e2e0 65 72 61 74 69 6f 6e 20 66 6f 72 20 65 78 70 72  eration for expr
2e2f0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 73 6f 20  ession pExpr so 
2e300 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 63 61  that the next ca
2e310 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 33 45 76 61  ll to.** fts3Eva
2e320 6c 4e 65 78 74 28 29 20 76 69 73 69 74 73 20 74  lNext() visits t
2e330 68 65 20 66 69 72 73 74 20 72 6f 77 2e 20 44 6f  he first row. Do
2e340 20 6e 6f 74 20 61 6c 6c 6f 77 20 69 6e 63 72 65   not allow incre
2e350 6d 65 6e 74 61 6c 20 0a 2a 2a 20 6c 6f 61 64 69  mental .** loadi
2e360 6e 67 20 6f 72 20 6d 65 72 67 69 6e 67 20 6f 66  ng or merging of
2e370 20 70 68 72 61 73 65 20 64 6f 63 6c 69 73 74 73   phrase doclists
2e380 20 66 6f 72 20 74 68 69 73 20 69 74 65 72 61 74   for this iterat
2e390 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  ion..**.** If *p
2e3a0 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61 6e  Rc is other than
2e3b0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2e3c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2e3d0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 0a 2a   called, it is.*
2e3e0 2a 20 61 20 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e  * a no-op. If an
2e3f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
2e400 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
2e410 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20  on, *pRc is set 
2e420 74 6f 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  to an.** SQLite 
2e430 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72  error code befor
2e440 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
2e450 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
2e460 45 76 61 6c 52 65 73 74 61 72 74 28 0a 20 20 46  EvalRestart(.  F
2e470 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
2e480 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78  .  Fts3Expr *pEx
2e490 70 72 2c 0a 20 20 69 6e 74 20 2a 70 52 63 0a 29  pr,.  int *pRc.)
2e4a0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  {.  if( pExpr &&
2e4b0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
2e4c0 20 29 7b 0a 20 20 20 20 46 74 73 33 50 68 72 61   ){.    Fts3Phra
2e4d0 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45  se *pPhrase = pE
2e4e0 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20  xpr->pPhrase;.. 
2e4f0 20 20 20 69 66 28 20 70 50 68 72 61 73 65 20 29     if( pPhrase )
2e500 7b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  {.      fts3Eval
2e510 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73  InvalidatePoslis
2e520 74 28 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20  t(pPhrase);.    
2e530 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 62    if( pPhrase->b
2e540 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Incr ){.        
2e550 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
2e560 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72 61 73  or(i=0; i<pPhras
2e570 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b  e->nToken; i++){
2e580 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50  .          Fts3P
2e590 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b  hraseToken *pTok
2e5a0 65 6e 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  en = &pPhrase->a
2e5b0 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  Token[i];.      
2e5c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
2e5d0 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d 3d 30  en->pDeferred==0
2e5e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2e5f0 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  ( pToken->pSegcs
2e600 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
2e610 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
2e620 6e 63 72 52 65 73 74 61 72 74 28 70 54 6f 6b 65  ncrRestart(pToke
2e630 6e 2d 3e 70 53 65 67 63 73 72 29 3b 0a 20 20 20  n->pSegcsr);.   
2e640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e650 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20   }.        *pRc 
2e660 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65  = fts3EvalPhrase
2e670 53 74 61 72 74 28 70 43 73 72 2c 20 30 2c 20 70  Start(pCsr, 0, p
2e680 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  Phrase);.      }
2e690 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
2e6a0 64 6f 63 6c 69 73 74 2e 70 4e 65 78 74 44 6f 63  doclist.pNextDoc
2e6b0 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  id = 0;.      pP
2e6c0 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 69  hrase->doclist.i
2e6d0 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Docid = 0;.     
2e6e0 20 70 50 68 72 61 73 65 2d 3e 70 4f 72 50 6f 73   pPhrase->pOrPos
2e6f0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  list = 0;.    }.
2e700 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63  .    pExpr->iDoc
2e710 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 45 78 70  id = 0;.    pExp
2e720 72 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  r->bEof = 0;.   
2e730 20 70 45 78 70 72 2d 3e 62 53 74 61 72 74 20 3d   pExpr->bStart =
2e740 20 30 3b 0a 0a 20 20 20 20 66 74 73 33 45 76 61   0;..    fts3Eva
2e750 6c 52 65 73 74 61 72 74 28 70 43 73 72 2c 20 70  lRestart(pCsr, p
2e760 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63  Expr->pLeft, pRc
2e770 29 3b 0a 20 20 20 20 66 74 73 33 45 76 61 6c 52  );.    fts3EvalR
2e780 65 73 74 61 72 74 28 70 43 73 72 2c 20 70 45 78  estart(pCsr, pEx
2e790 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 52 63 29  pr->pRight, pRc)
2e7a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
2e7b0 66 74 65 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20  fter allocating 
2e7c0 74 68 65 20 46 74 73 33 45 78 70 72 2e 61 4d 49  the Fts3Expr.aMI
2e7d0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63  [] array for eac
2e7e0 68 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  h phrase in the 
2e7f0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72  .** expression r
2e800 6f 6f 74 65 64 20 61 74 20 70 45 78 70 72 2c 20  ooted at pExpr, 
2e810 74 68 65 20 63 75 72 73 6f 72 20 69 74 65 72 61  the cursor itera
2e820 74 65 73 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  tes through all 
2e830 72 6f 77 73 20 6d 61 74 63 68 65 64 0a 2a 2a 20  rows matched.** 
2e840 62 79 20 70 45 78 70 72 2c 20 63 61 6c 6c 69 6e  by pExpr, callin
2e850 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
2e860 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 20 54 68  for each row. Th
2e870 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  is function incr
2e880 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 65 20 76 61  ements.** the va
2e890 6c 75 65 73 20 69 6e 20 46 74 73 33 45 78 70 72  lues in Fts3Expr
2e8a0 2e 61 4d 49 5b 5d 20 61 63 63 6f 72 64 69 6e 67  .aMI[] according
2e8b0 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
2e8c0 2d 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 0a  -list currently.
2e8d0 2a 2a 20 66 6f 75 6e 64 20 69 6e 20 46 74 73 33  ** found in Fts3
2e8e0 45 78 70 72 2e 70 50 68 72 61 73 65 2d 3e 64 6f  Expr.pPhrase->do
2e8f0 63 6c 69 73 74 2e 70 4c 69 73 74 20 66 6f 72 20  clist.pList for 
2e900 65 61 63 68 20 6f 66 20 74 68 65 20 70 68 72 61  each of the phra
2e910 73 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  se .** expressio
2e920 6e 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  n nodes..*/.stat
2e930 69 63 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c  ic void fts3Eval
2e940 55 70 64 61 74 65 43 6f 75 6e 74 73 28 46 74 73  UpdateCounts(Fts
2e950 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  3Expr *pExpr, in
2e960 74 20 6e 43 6f 6c 29 7b 0a 20 20 69 66 28 20 70  t nCol){.  if( p
2e970 45 78 70 72 20 29 7b 0a 20 20 20 20 46 74 73 33  Expr ){.    Fts3
2e980 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
2e990 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  = pExpr->pPhrase
2e9a0 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73  ;.    if( pPhras
2e9b0 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e 64 6f  e && pPhrase->do
2e9c0 63 6c 69 73 74 2e 70 4c 69 73 74 20 29 7b 0a 20  clist.pList ){. 
2e9d0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
2e9e0 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  0;.      char *p
2e9f0 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   = pPhrase->docl
2ea00 69 73 74 2e 70 4c 69 73 74 3b 0a 0a 20 20 20 20  ist.pList;..    
2ea10 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 75 38    do{.        u8
2ea20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
2ea30 69 6e 74 20 69 43 6e 74 20 3d 20 30 3b 0a 20 20  int iCnt = 0;.  
2ea40 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 46        while( 0xF
2ea50 45 20 26 20 28 2a 70 20 7c 20 63 29 20 29 7b 0a  E & (*p | c) ){.
2ea60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 63            if( (c
2ea70 26 30 78 38 30 29 3d 3d 30 20 29 20 69 43 6e 74  &0x80)==0 ) iCnt
2ea80 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
2ea90 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20  = *p++ & 0x80;. 
2eaa0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2eab0 20 20 2f 2a 20 61 4d 49 5b 69 43 6f 6c 2a 33 20    /* aMI[iCol*3 
2eac0 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66  + 1] = Number of
2ead0 20 6f 63 63 75 72 72 65 6e 63 65 73 0a 20 20 20   occurrences.   
2eae0 20 20 20 20 20 2a 2a 20 61 4d 49 5b 69 43 6f 6c       ** aMI[iCol
2eaf0 2a 33 20 2b 20 32 5d 20 3d 20 4e 75 6d 62 65 72  *3 + 2] = Number
2eb00 20 6f 66 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e   of rows contain
2eb10 69 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ing at least one
2eb20 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 20 20   instance.      
2eb30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78    */.        pEx
2eb40 70 72 2d 3e 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b  pr->aMI[iCol*3 +
2eb50 20 31 5d 20 2b 3d 20 69 43 6e 74 3b 0a 20 20 20   1] += iCnt;.   
2eb60 20 20 20 20 20 70 45 78 70 72 2d 3e 61 4d 49 5b       pExpr->aMI[
2eb70 69 43 6f 6c 2a 33 20 2b 20 32 5d 20 2b 3d 20 28  iCol*3 + 2] += (
2eb80 69 43 6e 74 3e 30 29 3b 0a 20 20 20 20 20 20 20  iCnt>0);.       
2eb90 20 69 66 28 20 2a 70 3d 3d 30 78 30 30 20 29 20   if( *p==0x00 ) 
2eba0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70  break;.        p
2ebb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 20 2b 3d  ++;.        p +=
2ebc0 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
2ebd0 28 70 2c 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20  (p, &iCol);.    
2ebe0 20 20 7d 77 68 69 6c 65 28 20 69 43 6f 6c 3c 6e    }while( iCol<n
2ebf0 43 6f 6c 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Col );.    }..  
2ec00 20 20 66 74 73 33 45 76 61 6c 55 70 64 61 74 65    fts3EvalUpdate
2ec10 43 6f 75 6e 74 73 28 70 45 78 70 72 2d 3e 70 4c  Counts(pExpr->pL
2ec20 65 66 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  eft, nCol);.    
2ec30 66 74 73 33 45 76 61 6c 55 70 64 61 74 65 43 6f  fts3EvalUpdateCo
2ec40 75 6e 74 73 28 70 45 78 70 72 2d 3e 70 52 69 67  unts(pExpr->pRig
2ec50 68 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  ht, nCol);.  }.}
2ec60 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
2ec70 6f 6e 20 70 45 78 70 72 20 6d 75 73 74 20 62 65  on pExpr must be
2ec80 20 6f 66 20 74 79 70 65 20 46 54 53 51 55 45 52   of type FTSQUER
2ec90 59 5f 50 48 52 41 53 45 2e 0a 2a 2a 0a 2a 2a 20  Y_PHRASE..**.** 
2eca0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
2ecb0 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  eady allocated a
2ecc0 6e 64 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  nd populated, th
2ecd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
2ece0 63 61 74 65 73 20 61 6e 64 0a 2a 2a 20 70 6f 70  cates and.** pop
2ecf0 75 6c 61 74 65 73 20 74 68 65 20 46 74 73 33 45  ulates the Fts3E
2ed00 78 70 72 2e 61 4d 49 5b 5d 20 61 72 72 61 79 20  xpr.aMI[] array 
2ed10 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70  for expression p
2ed20 45 78 70 72 2e 20 49 66 20 70 45 78 70 72 20 69  Expr. If pExpr i
2ed30 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4e  s part.** of a N
2ed40 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  EAR expression, 
2ed50 74 68 65 6e 20 69 74 20 61 6c 73 6f 20 61 6c 6c  then it also all
2ed60 6f 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c  ocates and popul
2ed70 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 61 72  ates the same ar
2ed80 72 61 79 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ray.** for all o
2ed90 74 68 65 72 20 70 68 72 61 73 65 73 20 74 68 61  ther phrases tha
2eda0 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68  t are part of th
2edb0 65 20 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f  e NEAR expressio
2edc0 6e 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  n..**.** SQLITE_
2edd0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2ede0 66 20 74 68 65 20 61 4d 49 5b 5d 20 61 72 72 61  f the aMI[] arra
2edf0 79 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  y is successfull
2ee00 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a  y allocated and.
2ee10 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2e 20 4f 74  ** populated. Ot
2ee20 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
2ee30 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2ee40 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2ee50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2ee60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2ee70 33 45 76 61 6c 47 61 74 68 65 72 53 74 61 74 73  3EvalGatherStats
2ee80 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  (.  Fts3Cursor *
2ee90 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
2eea0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62      /* Cursor ob
2eeb0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 45 78  ject */.  Fts3Ex
2eec0 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
2eed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2eee0 51 55 45 52 59 5f 50 48 52 41 53 45 20 65 78 70  QUERY_PHRASE exp
2eef0 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  ression */.){.  
2ef00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ef10 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2ef20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ef30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  /..  assert( pEx
2ef40 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
2ef50 45 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20  ERY_PHRASE );.  
2ef60 69 66 28 20 70 45 78 70 72 2d 3e 61 4d 49 3d 3d  if( pExpr->aMI==
2ef70 30 20 29 7b 0a 20 20 20 20 46 74 73 33 54 61 62  0 ){.    Fts3Tab
2ef80 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33  le *pTab = (Fts3
2ef90 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
2efa0 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 46 74  se.pVtab;.    Ft
2efb0 73 33 45 78 70 72 20 2a 70 52 6f 6f 74 3b 20 20  s3Expr *pRoot;  
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2efd0 20 52 6f 6f 74 20 6f 66 20 4e 45 41 52 20 65 78   Root of NEAR ex
2efe0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
2eff0 46 74 73 33 45 78 70 72 20 2a 70 3b 20 20 20 20  Fts3Expr *p;    
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
2f020 20 66 6f 72 20 73 65 76 65 72 61 6c 20 70 75 72   for several pur
2f030 70 6f 73 65 73 20 2a 2f 0a 0a 20 20 20 20 73 71  poses */..    sq
2f040 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65  lite3_int64 iPre
2f050 76 49 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65  vId = pCsr->iPre
2f060 76 49 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vId;.    sqlite3
2f070 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 20  _int64 iDocid;. 
2f080 20 20 20 75 38 20 62 45 6f 66 3b 0a 0a 20 20 20     u8 bEof;..   
2f090 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 72 6f 6f   /* Find the roo
2f0a0 74 20 6f 66 20 74 68 65 20 4e 45 41 52 20 65 78  t of the NEAR ex
2f0b0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
2f0c0 70 52 6f 6f 74 20 3d 20 70 45 78 70 72 3b 0a 20  pRoot = pExpr;. 
2f0d0 20 20 20 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d     while( pRoot-
2f0e0 3e 70 50 61 72 65 6e 74 20 26 26 20 70 52 6f 6f  >pParent && pRoo
2f0f0 74 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54 79 70  t->pParent->eTyp
2f100 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52  e==FTSQUERY_NEAR
2f110 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20   ){.      pRoot 
2f120 3d 20 70 52 6f 6f 74 2d 3e 70 50 61 72 65 6e 74  = pRoot->pParent
2f130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 6f 63  ;.    }.    iDoc
2f140 69 64 20 3d 20 70 52 6f 6f 74 2d 3e 69 44 6f 63  id = pRoot->iDoc
2f150 69 64 3b 0a 20 20 20 20 62 45 6f 66 20 3d 20 70  id;.    bEof = p
2f160 52 6f 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  Root->bEof;.    
2f170 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62  assert( pRoot->b
2f180 53 74 61 72 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  Start );..    /*
2f190 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2f1a0 66 6f 72 20 74 68 65 20 61 4d 53 49 5b 5d 20 61  for the aMSI[] a
2f1b0 72 72 61 79 20 6f 66 20 65 61 63 68 20 46 54 53  rray of each FTS
2f1c0 51 55 45 52 59 5f 50 48 52 41 53 45 20 6e 6f 64  QUERY_PHRASE nod
2f1d0 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70  e */.    for(p=p
2f1e0 52 6f 6f 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c  Root; p; p=p->pL
2f1f0 65 66 74 29 7b 0a 20 20 20 20 20 20 46 74 73 33  eft){.      Fts3
2f200 45 78 70 72 20 2a 70 45 20 3d 20 28 70 2d 3e 65  Expr *pE = (p->e
2f210 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50  Type==FTSQUERY_P
2f220 48 52 41 53 45 3f 70 3a 70 2d 3e 70 52 69 67 68  HRASE?p:p->pRigh
2f230 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
2f240 28 20 70 45 2d 3e 61 4d 49 3d 3d 30 20 29 3b 0a  ( pE->aMI==0 );.
2f250 20 20 20 20 20 20 70 45 2d 3e 61 4d 49 20 3d 20        pE->aMI = 
2f260 28 75 33 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d  (u32 *)sqlite3_m
2f270 61 6c 6c 6f 63 36 34 28 70 54 61 62 2d 3e 6e 43  alloc64(pTab->nC
2f280 6f 6c 75 6d 6e 20 2a 20 33 20 2a 20 73 69 7a 65  olumn * 3 * size
2f290 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20 20 20  of(u32));.      
2f2a0 69 66 28 20 21 70 45 2d 3e 61 4d 49 20 29 20 72  if( !pE->aMI ) r
2f2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f2c0 45 4d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  EM;.      memset
2f2d0 28 70 45 2d 3e 61 4d 49 2c 20 30 2c 20 70 54 61  (pE->aMI, 0, pTa
2f2e0 62 2d 3e 6e 43 6f 6c 75 6d 6e 20 2a 20 33 20 2a  b->nColumn * 3 *
2f2f0 20 73 69 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20   sizeof(u32));. 
2f300 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 45 76     }..    fts3Ev
2f310 61 6c 52 65 73 74 61 72 74 28 70 43 73 72 2c 20  alRestart(pCsr, 
2f320 70 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 0a 20 20  pRoot, &rc);..  
2f330 20 20 77 68 69 6c 65 28 20 70 43 73 72 2d 3e 69    while( pCsr->i
2f340 73 45 6f 66 3d 3d 30 20 26 26 20 72 63 3d 3d 53  sEof==0 && rc==S
2f350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
2f360 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
2f370 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 25 5f  /* Ensure the %_
2f380 63 6f 6e 74 65 6e 74 20 73 74 61 74 65 6d 65 6e  content statemen
2f390 74 20 69 73 20 72 65 73 65 74 2e 20 2a 2f 0a 20  t is reset. */. 
2f3a0 20 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d         if( pCsr-
2f3b0 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d  >isRequireSeek==
2f3c0 30 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 65  0 ) sqlite3_rese
2f3d0 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a  t(pCsr->pStmt);.
2f3e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f3f0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
2f400 6e 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3d  nt(pCsr->pStmt)=
2f410 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  =0 );..        /
2f420 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
2f430 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 2a   next document *
2f440 2f 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76  /.        fts3Ev
2f450 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2f460 70 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20  pRoot, &rc);.   
2f470 20 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66       pCsr->isEof
2f480 20 3d 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 3b 0a   = pRoot->bEof;.
2f490 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73          pCsr->is
2f4a0 52 65 71 75 69 72 65 53 65 65 6b 20 3d 20 31 3b  RequireSeek = 1;
2f4b0 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69  .        pCsr->i
2f4c0 73 4d 61 74 63 68 69 6e 66 6f 4e 65 65 64 65 64  sMatchinfoNeeded
2f4d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2f4e0 73 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 70 52  sr->iPrevId = pR
2f4f0 6f 6f 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20  oot->iDocid;.   
2f500 20 20 20 7d 77 68 69 6c 65 28 20 70 43 73 72 2d     }while( pCsr-
2f510 3e 69 73 45 6f 66 3d 3d 30 20 0a 20 20 20 20 20  >isEof==0 .     
2f520 20 20 20 20 20 20 26 26 20 70 52 6f 6f 74 2d 3e        && pRoot->
2f530 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
2f540 4e 45 41 52 20 0a 20 20 20 20 20 20 20 20 20 20  NEAR .          
2f550 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 33 45   && sqlite3Fts3E
2f560 76 61 6c 54 65 73 74 44 65 66 65 72 72 65 64 28  valTestDeferred(
2f570 70 43 73 72 2c 20 26 72 63 29 20 0a 20 20 20 20  pCsr, &rc) .    
2f580 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
2f590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f5a0 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20   pCsr->isEof==0 
2f5b0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 45  ){.        fts3E
2f5c0 76 61 6c 55 70 64 61 74 65 43 6f 75 6e 74 73 28  valUpdateCounts(
2f5d0 70 52 6f 6f 74 2c 20 70 54 61 62 2d 3e 6e 43 6f  pRoot, pTab->nCo
2f5e0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
2f5f0 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e     }..    pCsr->
2f600 69 73 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70  isEof = 0;.    p
2f610 43 73 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 69  Csr->iPrevId = i
2f620 50 72 65 76 49 64 3b 0a 0a 20 20 20 20 69 66 28  PrevId;..    if(
2f630 20 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70   bEof ){.      p
2f640 52 6f 6f 74 2d 3e 62 45 6f 66 20 3d 20 62 45 6f  Root->bEof = bEo
2f650 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
2f660 20 20 20 20 2f 2a 20 43 61 75 74 69 6f 6e 3a 20      /* Caution: 
2f670 70 52 6f 6f 74 20 6d 61 79 20 69 74 65 72 61 74  pRoot may iterat
2f680 65 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73  e through docids
2f690 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
2f6a0 20 64 65 73 63 65 6e 64 69 6e 67 0a 20 20 20 20   descending.    
2f6b0 20 20 2a 2a 20 6f 72 64 65 72 2e 20 46 6f 72 20    ** order. For 
2f6c0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 65 76 65  this reason, eve
2f6d0 6e 20 74 68 6f 75 67 68 20 69 74 20 73 65 65 6d  n though it seem
2f6e0 73 20 6d 6f 72 65 20 64 65 66 65 6e 73 69 76 65  s more defensive
2f6f0 2c 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  , the .      ** 
2f700 64 6f 20 6c 6f 6f 70 20 63 61 6e 20 6e 6f 74 20  do loop can not 
2f710 62 65 20 77 72 69 74 74 65 6e 3a 0a 20 20 20 20  be written:.    
2f720 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
2f730 64 6f 20 7b 2e 2e 2e 7d 20 77 68 69 6c 65 28 20  do {...} while( 
2f740 70 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 3c 69 44  pRoot->iDocid<iD
2f750 6f 63 69 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  ocid && rc==SQLI
2f760 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2a  TE_OK );.      *
2f770 2f 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  /.      fts3Eval
2f780 52 65 73 74 61 72 74 28 70 43 73 72 2c 20 70 52  Restart(pCsr, pR
2f790 6f 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  oot, &rc);.     
2f7a0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 66 74   do {.        ft
2f7b0 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2f7c0 73 72 2c 20 70 52 6f 6f 74 2c 20 26 72 63 29 3b  sr, pRoot, &rc);
2f7d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f7e0 20 70 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20   pRoot->bEof==0 
2f7f0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
2f800 20 70 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 21 3d   pRoot->iDocid!=
2f810 69 44 6f 63 69 64 20 26 26 20 72 63 3d 3d 53 51  iDocid && rc==SQ
2f820 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
2f830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f850 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2f860 20 62 79 20 74 68 65 20 6d 61 74 63 68 69 6e 66   by the matchinf
2f870 6f 28 29 20 6d 6f 64 75 6c 65 20 74 6f 20 71 75  o() module to qu
2f880 65 72 79 20 61 20 70 68 72 61 73 65 20 0a 2a 2a  ery a phrase .**
2f890 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2f8a0 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
2f8b0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a  ng information:.
2f8c0 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 20 74  **.**   1. The t
2f8d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
2f8e0 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74 68  ccurrences of th
2f8f0 65 20 70 68 72 61 73 65 20 69 6e 20 65 61 63 68  e phrase in each
2f900 20 63 6f 6c 75 6d 6e 20 6f 66 20 0a 2a 2a 20 20   column of .**  
2f910 20 20 20 20 74 68 65 20 46 54 53 20 74 61 62 6c      the FTS tabl
2f920 65 20 28 63 6f 6e 73 69 64 65 72 69 6e 67 20 61  e (considering a
2f930 6c 6c 20 72 6f 77 73 29 2c 20 61 6e 64 0a 2a 2a  ll rows), and.**
2f940 0a 2a 2a 20 20 20 32 2e 20 46 6f 72 20 65 61 63  .**   2. For eac
2f950 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6e 75  h column, the nu
2f960 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
2f970 74 68 65 20 74 61 62 6c 65 20 66 6f 72 20 77 68  the table for wh
2f980 69 63 68 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ich the.**      
2f990 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
2f9a0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73  at least one ins
2f9b0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72  tance of the phr
2f9c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ase..**.** If no
2f9d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
2f9e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2f9f0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2fa00 75 65 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ues for each col
2fa10 75 6d 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  umn.** written i
2fa20 6e 74 6f 20 74 68 65 20 61 72 72 61 79 20 61 69  nto the array ai
2fa30 4f 75 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  Out as follows:.
2fa40 2a 2a 0a 2a 2a 20 20 20 61 69 4f 75 74 5b 69 43  **.**   aiOut[iC
2fa50 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 4e 75 6d 62  ol*3 + 1] = Numb
2fa60 65 72 20 6f 66 20 6f 63 63 75 72 72 65 6e 63 65  er of occurrence
2fa70 73 0a 2a 2a 20 20 20 61 69 4f 75 74 5b 69 43 6f  s.**   aiOut[iCo
2fa80 6c 2a 33 20 2b 20 32 5d 20 3d 20 4e 75 6d 62 65  l*3 + 2] = Numbe
2fa90 72 20 6f 66 20 72 6f 77 73 20 63 6f 6e 74 61 69  r of rows contai
2faa0 6e 69 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e  ning at least on
2fab0 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 0a 2a 2a  e instance.**.**
2fac0 20 43 61 76 65 61 74 73 3a 0a 2a 2a 0a 2a 2a 20   Caveats:.**.** 
2fad0 20 20 2a 20 49 66 20 61 20 70 68 72 61 73 65 20    * If a phrase 
2fae0 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
2faf0 79 20 6f 66 20 64 65 66 65 72 72 65 64 20 74 6f  y of deferred to
2fb00 6b 65 6e 73 2c 20 74 68 65 6e 20 61 6c 6c 20 6f  kens, then all o
2fb10 75 74 70 75 74 20 0a 2a 2a 20 20 20 20 20 76 61  utput .**     va
2fb20 6c 75 65 73 20 61 72 65 20 73 65 74 20 74 6f 20  lues are set to 
2fb30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f  the number of do
2fb40 63 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74  cuments in the t
2fb50 61 62 6c 65 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  able. In other.*
2fb60 2a 20 20 20 20 20 77 6f 72 64 73 20 77 65 20 61  *     words we a
2fb70 73 73 75 6d 65 20 74 68 61 74 20 76 65 72 79 20  ssume that very 
2fb80 63 6f 6d 6d 6f 6e 20 74 6f 6b 65 6e 73 20 6f 63  common tokens oc
2fb90 63 75 72 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  cur exactly once
2fba0 20 69 6e 20 65 61 63 68 20 0a 2a 2a 20 20 20 20   in each .**    
2fbb0 20 63 6f 6c 75 6d 6e 20 6f 66 20 65 61 63 68 20   column of each 
2fbc0 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
2fbd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 61  ..**.**   * If a
2fbe0 20 70 68 72 61 73 65 20 63 6f 6e 74 61 69 6e 73   phrase contains
2fbf0 20 73 6f 6d 65 20 64 65 66 65 72 72 65 64 20 74   some deferred t
2fc00 6f 6b 65 6e 73 20 28 61 6e 64 20 73 6f 6d 65 20  okens (and some 
2fc10 6e 6f 6e 2d 64 65 66 65 72 72 65 64 20 0a 2a 2a  non-deferred .**
2fc20 20 20 20 20 20 74 6f 6b 65 6e 73 29 2c 20 63 6f       tokens), co
2fc30 75 6e 74 20 74 68 65 20 70 6f 74 65 6e 74 69 61  unt the potentia
2fc40 6c 20 6f 63 63 75 72 72 65 6e 63 65 20 69 64 65  l occurrence ide
2fc50 6e 74 69 66 69 65 64 20 62 79 20 63 6f 6e 73 69  ntified by consi
2fc60 64 65 72 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  dering.**     th
2fc70 65 20 6e 6f 6e 2d 64 65 66 65 72 72 65 64 20 74  e non-deferred t
2fc80 6f 6b 65 6e 73 20 69 6e 73 74 65 61 64 20 6f 66  okens instead of
2fc90 20 61 63 74 75 61 6c 20 70 68 72 61 73 65 20 6f   actual phrase o
2fca0 63 63 75 72 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  ccurrences..**.*
2fcb0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 70 68 72  *   * If the phr
2fcc0 61 73 65 20 69 73 20 70 61 72 74 20 6f 66 20 61  ase is part of a
2fcd0 20 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e   NEAR expression
2fce0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 70 68 72 61  , then only phra
2fcf0 73 65 20 69 6e 73 74 61 6e 63 65 73 0a 2a 2a 20  se instances.** 
2fd00 20 20 20 20 74 68 61 74 20 6d 65 65 74 20 74 68      that meet th
2fd10 65 20 4e 45 41 52 20 63 6f 6e 73 74 72 61 69 6e  e NEAR constrain
2fd20 74 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69  t are included i
2fd30 6e 20 74 68 65 20 63 6f 75 6e 74 73 2e 0a 2a 2f  n the counts..*/
2fd40 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2fd50 45 76 61 6c 50 68 72 61 73 65 53 74 61 74 73 28  EvalPhraseStats(
2fd60 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
2fd70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
2fd80 20 20 20 2f 2a 20 46 54 53 20 63 75 72 73 6f 72     /* FTS cursor
2fd90 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
2fda0 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  3Expr *pExpr,   
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fdc0 50 68 72 61 73 65 20 65 78 70 72 65 73 73 69 6f  Phrase expressio
2fdd0 6e 20 2a 2f 0a 20 20 75 33 32 20 2a 61 69 4f 75  n */.  u32 *aiOu
2fde0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2fdf0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
2fe00 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
2fe10 20 69 6e 74 6f 20 28 73 65 65 20 61 62 6f 76 65   into (see above
2fe20 29 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61  ) */.){.  Fts3Ta
2fe30 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73  ble *pTab = (Fts
2fe40 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62  3Table *)pCsr->b
2fe50 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74  ase.pVtab;.  int
2fe60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2fe70 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20  .  int iCol;..  
2fe80 69 66 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65  if( pExpr->bDefe
2fe90 72 72 65 64 20 26 26 20 70 45 78 70 72 2d 3e 70  rred && pExpr->p
2fea0 50 61 72 65 6e 74 2d 3e 65 54 79 70 65 21 3d 46  Parent->eType!=F
2feb0 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b 0a  TSQUERY_NEAR ){.
2fec0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
2fed0 2d 3e 6e 44 6f 63 3e 30 20 29 3b 0a 20 20 20 20  ->nDoc>0 );.    
2fee0 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
2fef0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pTab->nColumn; 
2ff00 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61  iCol++){.      a
2ff10 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d  iOut[iCol*3 + 1]
2ff20 20 3d 20 28 75 33 32 29 70 43 73 72 2d 3e 6e 44   = (u32)pCsr->nD
2ff30 6f 63 3b 0a 20 20 20 20 20 20 61 69 4f 75 74 5b  oc;.      aiOut[
2ff40 69 43 6f 6c 2a 33 20 2b 20 32 5d 20 3d 20 28 75  iCol*3 + 2] = (u
2ff50 33 32 29 70 43 73 72 2d 3e 6e 44 6f 63 3b 0a 20  32)pCsr->nDoc;. 
2ff60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ff70 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 47    rc = fts3EvalG
2ff80 61 74 68 65 72 53 74 61 74 73 28 70 43 73 72 2c  atherStats(pCsr,
2ff90 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28   pExpr);.    if(
2ffa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ffb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ffc0 70 45 78 70 72 2d 3e 61 4d 49 20 29 3b 0a 20 20  pExpr->aMI );.  
2ffd0 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
2ffe0 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75  iCol<pTab->nColu
2fff0 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  mn; iCol++){.   
30000 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a       aiOut[iCol*
30010 33 20 2b 20 31 5d 20 3d 20 70 45 78 70 72 2d 3e  3 + 1] = pExpr->
30020 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 3b  aMI[iCol*3 + 1];
30030 0a 20 20 20 20 20 20 20 20 61 69 4f 75 74 5b 69  .        aiOut[i
30040 43 6f 6c 2a 33 20 2b 20 32 5d 20 3d 20 70 45 78  Col*3 + 2] = pEx
30050 70 72 2d 3e 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b  pr->aMI[iCol*3 +
30060 20 32 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   2];.      }.   
30070 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
30080 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
30090 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
300a0 70 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  pr passed as the
300b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
300c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
300d0 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 6f 66 20  n.** must be of 
300e0 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48  type FTSQUERY_PH
300f0 52 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  RASE. .**.** The
30100 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
30110 69 73 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f  is either NULL o
30120 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
30130 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
30140 6e 67 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e  ng.** a position
30150 2d 6c 69 73 74 20 69 6e 64 69 63 61 74 69 6e 67  -list indicating
30160 20 74 68 65 20 6f 63 63 75 72 72 65 6e 63 65 73   the occurrences
30170 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20 69   of the phrase i
30180 6e 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a  n column iCol.**
30190 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
301a0 72 6f 77 2e 20 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  row. .**.** More
301b0 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
301c0 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66  he returned buff
301d0 65 72 20 63 6f 6e 74 61 69 6e 73 20 31 20 76 61  er contains 1 va
301e0 72 69 6e 74 20 66 6f 72 20 65 61 63 68 20 0a 2a  rint for each .*
301f0 2a 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  * occurrence of 
30200 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 74 68  the phrase in th
30210 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 64  e column, stored
30220 20 75 73 69 6e 67 20 74 68 65 20 6e 6f 72 6d 61   using the norma
30230 6c 20 28 64 65 6c 74 61 2b 32 29 20 0a 2a 2a 20  l (delta+2) .** 
30240 63 6f 6d 70 72 65 73 73 69 6f 6e 20 61 6e 64 20  compression and 
30250 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  is terminated by
30260 20 65 69 74 68 65 72 20 61 6e 20 30 78 30 31 20   either an 0x01 
30270 6f 72 20 30 78 30 30 20 62 79 74 65 2e 20 46 6f  or 0x00 byte. Fo
30280 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66  r example,.** if
30290 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
302a0 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 22  olumn contains "
302b0 61 20 62 20 58 20 63 20 64 20 58 20 58 22 20 61  a b X c d X X" a
302c0 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  nd the position-
302d0 6c 69 73 74 0a 2a 2a 20 66 6f 72 20 27 58 27 20  list.** for 'X' 
302e0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
302f0 65 20 62 75 66 66 65 72 20 72 65 74 75 72 6e 65  e buffer returne
30300 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 3a 0a 2a  d may contain:.*
30310 2a 0a 2a 2a 20 20 20 20 20 30 78 30 34 20 30 78  *.**     0x04 0x
30320 30 35 20 30 78 30 33 20 30 78 30 31 20 20 20 6f  05 0x03 0x01   o
30330 72 20 20 20 30 78 30 34 20 30 78 30 35 20 30 78  r   0x04 0x05 0x
30340 30 33 20 30 78 30 30 0a 2a 2a 0a 2a 2a 20 54 68  03 0x00.**.** Th
30350 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
30360 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  s regardless of 
30370 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
30380 68 65 20 70 68 72 61 73 65 20 69 73 20 64 65 66  he phrase is def
30390 65 72 72 65 64 2c 0a 2a 2a 20 69 6e 63 72 65 6d  erred,.** increm
303a0 65 6e 74 61 6c 2c 20 6f 72 20 6e 65 69 74 68 65  ental, or neithe
303b0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
303c0 33 46 74 73 33 45 76 61 6c 50 68 72 61 73 65 50  3Fts3EvalPhraseP
303d0 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 33 43 75  oslist(.  Fts3Cu
303e0 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
303f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
30400 33 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  3 cursor object 
30410 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
30420 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20  Expr,           
30430 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 74       /* Phrase t
30440 6f 20 72 65 74 75 72 6e 20 64 6f 63 6c 69 73 74  o return doclist
30450 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
30460 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
30470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
30480 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 70 6f  umn to return po
30490 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
304a0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 75  */.  char **ppOu
304b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
304c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
304d0 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
304e0 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 74   list */.){.  Ft
304f0 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
30500 65 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61  e = pExpr->pPhra
30510 73 65 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  se;.  Fts3Table 
30520 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
30530 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
30540 70 56 74 61 62 3b 0a 20 20 63 68 61 72 20 2a 70  pVtab;.  char *p
30550 49 74 65 72 3b 0a 20 20 69 6e 74 20 69 54 68 69  Iter;.  int iThi
30560 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  s;.  sqlite3_int
30570 36 34 20 69 44 6f 63 69 64 3b 0a 0a 20 20 2f 2a  64 iDocid;..  /*
30580 20 49 66 20 74 68 69 73 20 70 68 72 61 73 65 20   If this phrase 
30590 69 73 20 61 70 70 6c 69 65 73 20 73 70 65 63 69  is applies speci
305a0 66 69 63 61 6c 6c 79 20 74 6f 20 73 6f 6d 65 20  fically to some 
305b0 63 6f 6c 75 6d 6e 20 6f 74 68 65 72 20 74 68 61  column other tha
305c0 6e 20 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69  n .  ** column i
305d0 43 6f 6c 2c 20 72 65 74 75 72 6e 20 61 20 4e 55  Col, return a NU
305e0 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 20 2a 2f 0a  LL pointer.  */.
305f0 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
30600 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
30610 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
30620 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 28  olumn );.  if( (
30630 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e  pPhrase->iColumn
30640 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20 26  <pTab->nColumn &
30650 26 20 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75  & pPhrase->iColu
30660 6d 6e 21 3d 69 43 6f 6c 29 20 29 7b 0a 20 20 20  mn!=iCol) ){.   
30670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30680 4b 3b 0a 20 20 7d 0a 0a 20 20 69 44 6f 63 69 64  K;.  }..  iDocid
30690 20 3d 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64   = pExpr->iDocid
306a0 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 50 68 72  ;.  pIter = pPhr
306b0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
306c0 73 74 3b 0a 20 20 69 66 28 20 69 44 6f 63 69 64  st;.  if( iDocid
306d0 21 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20  !=pCsr->iPrevId 
306e0 7c 7c 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 29  || pExpr->bEof )
306f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  {.    int rc = S
30700 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
30710 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74 20 3d  t bDescDoclist =
30720 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 3b   pTab->bDescIdx;
30730 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 44 4f 43        /* For DOC
30740 49 44 5f 43 4d 50 20 6d 61 63 72 6f 20 2a 2f 0a  ID_CMP macro */.
30750 20 20 20 20 69 6e 74 20 62 4f 72 20 3d 20 30 3b      int bOr = 0;
30760 0a 20 20 20 20 75 38 20 62 54 72 65 65 45 6f 66  .    u8 bTreeEof
30770 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 33 45 78   = 0;.    Fts3Ex
30780 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
30790 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
307a0 74 6f 20 69 74 65 72 61 74 65 20 66 72 6f 6d 20  to iterate from 
307b0 70 45 78 70 72 20 74 6f 20 72 6f 6f 74 20 2a 2f  pExpr to root */
307c0 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70  .    Fts3Expr *p
307d0 4e 65 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  Near;           
307e0 20 20 20 2f 2a 20 4d 6f 73 74 20 73 65 6e 69 6f     /* Most senio
307f0 72 20 4e 45 41 52 20 61 6e 63 65 73 74 6f 72 20  r NEAR ancestor 
30800 28 6f 72 20 70 45 78 70 72 29 20 2a 2f 0a 20 20  (or pExpr) */.  
30810 20 20 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20    int bMatch;.. 
30820 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
30830 68 69 73 20 70 68 72 61 73 65 20 64 65 73 63 65  his phrase desce
30840 6e 64 73 20 66 72 6f 6d 20 61 6e 20 4f 52 20 65  nds from an OR e
30850 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 20  xpression node. 
30860 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 2a 2a 20  If not, .    ** 
30870 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 4f 74 68  return NULL. Oth
30880 65 72 77 69 73 65 2c 20 74 68 65 20 65 6e 74 72  erwise, the entr
30890 79 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  y that correspon
308a0 64 73 20 74 6f 20 64 6f 63 69 64 20 0a 20 20 20  ds to docid .   
308b0 20 2a 2a 20 70 43 73 72 2d 3e 69 50 72 65 76 49   ** pCsr->iPrevI
308c0 64 20 6d 61 79 20 6c 69 65 20 65 61 72 6c 69 65  d may lie earlie
308d0 72 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  r in the doclist
308e0 20 62 75 66 66 65 72 2e 20 4f 72 2c 20 69 66 20   buffer. Or, if 
308f0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  the.    ** tree 
30900 74 68 61 74 20 74 68 65 20 6e 6f 64 65 20 69 73  that the node is
30910 20 70 61 72 74 20 6f 66 20 68 61 73 20 62 65 65   part of has bee
30920 6e 20 6d 61 72 6b 65 64 20 61 73 20 45 4f 46 2c  n marked as EOF,
30930 20 62 75 74 20 74 68 65 20 6e 6f 64 65 0a 20 20   but the node.  
30940 20 20 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e    ** itself is n
30950 6f 74 20 45 4f 46 2c 20 74 68 65 6e 20 69 74 20  ot EOF, then it 
30960 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  may point to an 
30970 65 61 72 6c 69 65 72 20 65 6e 74 72 79 2e 20 2a  earlier entry. *
30980 2f 0a 20 20 20 20 70 4e 65 61 72 20 3d 20 70 45  /.    pNear = pE
30990 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  xpr;.    for(p=p
309a0 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3b 20 70  Expr->pParent; p
309b0 3b 20 70 3d 70 2d 3e 70 50 61 72 65 6e 74 29 7b  ; p=p->pParent){
309c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 54  .      if( p->eT
309d0 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52  ype==FTSQUERY_OR
309e0 20 29 20 62 4f 72 20 3d 20 31 3b 0a 20 20 20 20   ) bOr = 1;.    
309f0 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
30a00 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 20  FTSQUERY_NEAR ) 
30a10 70 4e 65 61 72 20 3d 20 70 3b 0a 20 20 20 20 20  pNear = p;.     
30a20 20 69 66 28 20 70 2d 3e 62 45 6f 66 20 29 20 62   if( p->bEof ) b
30a30 54 72 65 65 45 6f 66 20 3d 20 31 3b 0a 20 20 20  TreeEof = 1;.   
30a40 20 7d 0a 20 20 20 20 69 66 28 20 62 4f 72 3d 3d   }.    if( bOr==
30a50 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
30a60 45 5f 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  E_OK;..    /* Th
30a70 69 73 20 69 73 20 74 68 65 20 64 65 73 63 65 6e  is is the descen
30a80 64 65 6e 74 20 6f 66 20 61 6e 20 4f 52 20 6e 6f  dent of an OR no
30a90 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
30aa0 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 0a 20   we cannot use. 
30ab0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65     ** an increme
30ac0 6e 74 61 6c 20 70 68 72 61 73 65 2e 20 4c 6f 61  ntal phrase. Loa
30ad0 64 20 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63  d the entire doc
30ae0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 70 68 72  list for the phr
30af0 61 73 65 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ase.    ** into 
30b00 6d 65 6d 6f 72 79 20 69 6e 20 74 68 69 73 20 63  memory in this c
30b10 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
30b20 20 70 50 68 72 61 73 65 2d 3e 62 49 6e 63 72 20   pPhrase->bIncr 
30b30 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 45 6f  ){.      int bEo
30b40 66 53 61 76 65 20 3d 20 70 4e 65 61 72 2d 3e 62  fSave = pNear->b
30b50 45 6f 66 3b 0a 20 20 20 20 20 20 66 74 73 33 45  Eof;.      fts3E
30b60 76 61 6c 52 65 73 74 61 72 74 28 70 43 73 72 2c  valRestart(pCsr,
30b70 20 70 4e 65 61 72 2c 20 26 72 63 29 3b 0a 20 20   pNear, &rc);.  
30b80 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
30b90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 4e 65  QLITE_OK && !pNe
30ba0 61 72 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20  ar->bEof ){.    
30bb0 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74      fts3EvalNext
30bc0 52 6f 77 28 70 43 73 72 2c 20 70 4e 65 61 72 2c  Row(pCsr, pNear,
30bd0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
30be0 66 28 20 62 45 6f 66 53 61 76 65 3d 3d 30 20 26  f( bEofSave==0 &
30bf0 26 20 70 4e 65 61 72 2d 3e 69 44 6f 63 69 64 3d  & pNear->iDocid=
30c00 3d 69 44 6f 63 69 64 20 29 20 62 72 65 61 6b 3b  =iDocid ) break;
30c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
30c20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
30c30 45 5f 4f 4b 20 7c 7c 20 70 50 68 72 61 73 65 2d  E_OK || pPhrase-
30c40 3e 62 49 6e 63 72 3d 3d 30 20 29 3b 0a 20 20 20  >bIncr==0 );.   
30c50 20 7d 0a 20 20 20 20 69 66 28 20 62 54 72 65 65   }.    if( bTree
30c60 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 77 68 69  Eof ){.      whi
30c70 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
30c80 4b 20 26 26 20 21 70 4e 65 61 72 2d 3e 62 45 6f  K && !pNear->bEo
30c90 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  f ){.        fts
30ca0 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
30cb0 72 2c 20 70 4e 65 61 72 2c 20 26 72 63 29 3b 0a  r, pNear, &rc);.
30cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30cd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30ce0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
30cf0 0a 0a 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31  ..    bMatch = 1
30d00 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4e 65 61  ;.    for(p=pNea
30d10 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c 65 66 74  r; p; p=p->pLeft
30d20 29 7b 0a 20 20 20 20 20 20 75 38 20 62 45 6f 66  ){.      u8 bEof
30d30 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 33   = 0;.      Fts3
30d40 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 70 3b  Expr *pTest = p;
30d50 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73  .      Fts3Phras
30d60 65 20 2a 70 50 68 3b 0a 20 20 20 20 20 20 61 73  e *pPh;.      as
30d70 73 65 72 74 28 20 70 54 65 73 74 2d 3e 65 54 79  sert( pTest->eTy
30d80 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
30d90 52 20 7c 7c 20 70 54 65 73 74 2d 3e 65 54 79 70  R || pTest->eTyp
30da0 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41  e==FTSQUERY_PHRA
30db0 53 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  SE );.      if( 
30dc0 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54  pTest->eType==FT
30dd0 53 51 55 45 52 59 5f 4e 45 41 52 20 29 20 70 54  SQUERY_NEAR ) pT
30de0 65 73 74 20 3d 20 70 54 65 73 74 2d 3e 70 52 69  est = pTest->pRi
30df0 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
30e00 74 28 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d  t( pTest->eType=
30e10 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
30e20 20 29 3b 0a 20 20 20 20 20 20 70 50 68 20 3d 20   );.      pPh = 
30e30 70 54 65 73 74 2d 3e 70 50 68 72 61 73 65 3b 0a  pTest->pPhrase;.
30e40 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70  .      pIter = p
30e50 50 68 2d 3e 70 4f 72 50 6f 73 6c 69 73 74 3b 0a  Ph->pOrPoslist;.
30e60 20 20 20 20 20 20 69 44 6f 63 69 64 20 3d 20 70        iDocid = p
30e70 50 68 2d 3e 69 4f 72 44 6f 63 69 64 3b 0a 20 20  Ph->iOrDocid;.  
30e80 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 62 44      if( pCsr->bD
30e90 65 73 63 3d 3d 62 44 65 73 63 44 6f 63 6c 69 73  esc==bDescDoclis
30ea0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 62 45 6f  t ){.        bEo
30eb0 66 20 3d 20 21 70 50 68 2d 3e 64 6f 63 6c 69 73  f = !pPh->doclis
30ec0 74 2e 6e 41 6c 6c 20 7c 7c 0a 20 20 20 20 20 20  t.nAll ||.      
30ed0 20 20 20 20 28 70 49 74 65 72 20 3e 3d 20 28 70      (pIter >= (p
30ee0 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c  Ph->doclist.aAll
30ef0 20 2b 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e   + pPh->doclist.
30f00 6e 41 6c 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  nAll));.        
30f10 77 68 69 6c 65 28 20 28 70 49 74 65 72 3d 3d 30  while( (pIter==0
30f20 20 7c 7c 20 44 4f 43 49 44 5f 43 4d 50 28 69 44   || DOCID_CMP(iD
30f30 6f 63 69 64 2c 20 70 43 73 72 2d 3e 69 50 72 65  ocid, pCsr->iPre
30f40 76 49 64 29 3c 30 20 29 20 26 26 20 62 45 6f 66  vId)<0 ) && bEof
30f50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
30f60 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c   sqlite3Fts3Docl
30f70 69 73 74 4e 65 78 74 28 0a 20 20 20 20 20 20 20  istNext(.       
30f80 20 20 20 20 20 20 20 62 44 65 73 63 44 6f 63 6c         bDescDocl
30f90 69 73 74 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73  ist, pPh->doclis
30fa0 74 2e 61 41 6c 6c 2c 20 70 50 68 2d 3e 64 6f 63  t.aAll, pPh->doc
30fb0 6c 69 73 74 2e 6e 41 6c 6c 2c 20 0a 20 20 20 20  list.nAll, .    
30fc0 20 20 20 20 20 20 20 20 20 20 26 70 49 74 65 72            &pIter
30fd0 2c 20 26 69 44 6f 63 69 64 2c 20 26 62 45 6f 66  , &iDocid, &bEof
30fe0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
30ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
31000 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 45 6f  lse{.        bEo
31010 66 20 3d 20 21 70 50 68 2d 3e 64 6f 63 6c 69 73  f = !pPh->doclis
31020 74 2e 6e 41 6c 6c 20 7c 7c 20 28 70 49 74 65 72  t.nAll || (pIter
31030 20 26 26 20 70 49 74 65 72 3c 3d 70 50 68 2d 3e   && pIter<=pPh->
31040 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20  doclist.aAll);. 
31050 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70         while( (p
31060 49 74 65 72 3d 3d 30 20 7c 7c 20 44 4f 43 49 44  Iter==0 || DOCID
31070 5f 43 4d 50 28 69 44 6f 63 69 64 2c 20 70 43 73  _CMP(iDocid, pCs
31080 72 2d 3e 69 50 72 65 76 49 64 29 3e 30 20 29 20  r->iPrevId)>0 ) 
31090 26 26 20 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  && bEof==0 ){.  
310a0 20 20 20 20 20 20 20 20 69 6e 74 20 64 75 6d 6d          int dumm
310b0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  y;.          sql
310c0 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
310d0 72 65 76 28 0a 20 20 20 20 20 20 20 20 20 20 20  rev(.           
310e0 20 20 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c     bDescDoclist,
310f0 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 61 41   pPh->doclist.aA
31100 6c 6c 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74  ll, pPh->doclist
31110 2e 6e 41 6c 6c 2c 20 0a 20 20 20 20 20 20 20 20  .nAll, .        
31120 20 20 20 20 20 20 26 70 49 74 65 72 2c 20 26 69        &pIter, &i
31130 44 6f 63 69 64 2c 20 26 64 75 6d 6d 79 2c 20 26  Docid, &dummy, &
31140 62 45 6f 66 0a 20 20 20 20 20 20 20 20 20 20 20  bEof.           
31150 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
31160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
31170 68 2d 3e 70 4f 72 50 6f 73 6c 69 73 74 20 3d 20  h->pOrPoslist = 
31180 70 49 74 65 72 3b 0a 20 20 20 20 20 20 70 50 68  pIter;.      pPh
31190 2d 3e 69 4f 72 44 6f 63 69 64 20 3d 20 69 44 6f  ->iOrDocid = iDo
311a0 63 69 64 3b 0a 20 20 20 20 20 20 69 66 28 20 62  cid;.      if( b
311b0 45 6f 66 20 7c 7c 20 69 44 6f 63 69 64 21 3d 70  Eof || iDocid!=p
311c0 43 73 72 2d 3e 69 50 72 65 76 49 64 20 29 20 62  Csr->iPrevId ) b
311d0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d  Match = 0;.    }
311e0 0a 0a 20 20 20 20 69 66 28 20 62 4d 61 74 63 68  ..    if( bMatch
311f0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20   ){.      pIter 
31200 3d 20 70 50 68 72 61 73 65 2d 3e 70 4f 72 50 6f  = pPhrase->pOrPo
31210 73 6c 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  slist;.    }else
31220 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  {.      pIter = 
31230 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
31240 66 28 20 70 49 74 65 72 3d 3d 30 20 29 20 72 65  f( pIter==0 ) re
31250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31260 0a 20 20 69 66 28 20 2a 70 49 74 65 72 3d 3d 30  .  if( *pIter==0
31270 78 30 31 20 29 7b 0a 20 20 20 20 70 49 74 65 72  x01 ){.    pIter
31280 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  ++;.    pIter +=
31290 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
312a0 28 70 49 74 65 72 2c 20 26 69 54 68 69 73 29 3b  (pIter, &iThis);
312b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
312c0 68 69 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77  his = 0;.  }.  w
312d0 68 69 6c 65 28 20 69 54 68 69 73 3c 69 43 6f 6c  hile( iThis<iCol
312e0 20 29 7b 0a 20 20 20 20 66 74 73 33 43 6f 6c 75   ){.    fts3Colu
312f0 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
31300 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a  Iter);.    if( *
31310 70 49 74 65 72 3d 3d 30 78 30 30 20 29 20 72 65  pIter==0x00 ) re
31320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31330 20 20 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 20      pIter++;.   
31340 20 70 49 74 65 72 20 2b 3d 20 66 74 73 33 47 65   pIter += fts3Ge
31350 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
31360 20 26 69 54 68 69 73 29 3b 0a 20 20 7d 0a 20 20   &iThis);.  }.  
31370 69 66 28 20 2a 70 49 74 65 72 3d 3d 30 78 30 30  if( *pIter==0x00
31380 20 29 7b 0a 20 20 20 20 70 49 74 65 72 20 3d 20   ){.    pIter = 
31390 30 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74  0;.  }..  *ppOut
313a0 20 3d 20 28 28 69 43 6f 6c 3d 3d 69 54 68 69 73   = ((iCol==iThis
313b0 29 3f 70 49 74 65 72 3a 30 29 3b 0a 20 20 72 65  )?pIter:0);.  re
313c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
313d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
313e0 6c 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20  l components of 
313f0 74 68 65 20 46 74 73 33 50 68 72 61 73 65 20 73  the Fts3Phrase s
31400 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 65  tructure that we
31410 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  re allocated by.
31420 2a 2a 20 74 68 65 20 65 76 61 6c 20 6d 6f 64 75  ** the eval modu
31430 6c 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79  le. Specifically
31440 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74 6f 20  , this means to 
31450 66 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  free:.**.**   * 
31460 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
31470 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
31480 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 61 6e 79  , and.**   * any
31490 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
314a0 64 65 72 20 6f 62 6a 65 63 74 73 20 68 65 6c 64  der objects held
314b0 20 62 79 20 70 68 72 61 73 65 20 74 6f 6b 65 6e   by phrase token
314c0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
314d0 65 33 46 74 73 33 45 76 61 6c 50 68 72 61 73 65  e3Fts3EvalPhrase
314e0 43 6c 65 61 6e 75 70 28 46 74 73 33 50 68 72 61  Cleanup(Fts3Phra
314f0 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20  se *pPhrase){.  
31500 69 66 28 20 70 50 68 72 61 73 65 20 29 7b 0a 20  if( pPhrase ){. 
31510 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
31520 6c 69 74 65 33 5f 66 72 65 65 28 70 50 68 72 61  lite3_free(pPhra
31530 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c  se->doclist.aAll
31540 29 3b 0a 20 20 20 20 66 74 73 33 45 76 61 6c 49  );.    fts3EvalI
31550 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73 74  nvalidatePoslist
31560 28 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 6d  (pPhrase);.    m
31570 65 6d 73 65 74 28 26 70 50 68 72 61 73 65 2d 3e  emset(&pPhrase->
31580 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65  doclist, 0, size
31590 6f 66 28 46 74 73 33 44 6f 63 6c 69 73 74 29 29  of(Fts3Doclist))
315a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
315b0 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e  <pPhrase->nToken
315c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
315d0 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
315e0 72 46 72 65 65 28 70 50 68 72 61 73 65 2d 3e 61  rFree(pPhrase->a
315f0 54 6f 6b 65 6e 5b 69 5d 2e 70 53 65 67 63 73 72  Token[i].pSegcsr
31600 29 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65  );.      pPhrase
31610 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 70 53 65 67  ->aToken[i].pSeg
31620 63 73 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  csr = 0;.    }. 
31630 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   }.}.../*.** Ret
31640 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31650 50 54 5f 56 54 41 42 2e 0a 2a 2f 0a 23 69 66 64  PT_VTAB..*/.#ifd
31660 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
31670 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 43  int sqlite3Fts3C
31680 6f 72 72 75 70 74 28 29 7b 0a 20 20 72 65 74 75  orrupt(){.  retu
31690 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
316a0 54 5f 56 54 41 42 3b 0a 7d 0a 23 65 6e 64 69 66  T_VTAB;.}.#endif
316b0 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 43 4f  ..#if !SQLITE_CO
316c0 52 45 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  RE./*.** Initial
316d0 69 7a 65 20 41 50 49 20 70 6f 69 6e 74 65 72 20  ize API pointer 
316e0 74 61 62 6c 65 2c 20 69 66 20 72 65 71 75 69 72  table, if requir
316f0 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57  ed..*/.#ifdef _W
31700 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28  IN32.__declspec(
31710 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69  dllexport).#endi
31720 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  f.int sqlite3_ft
31730 73 33 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74  s3_init(.  sqlit
31740 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20  e3 *db, .  char 
31750 2a 2a 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f  **pzErrMsg,.  co
31760 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
31770 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
31780 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  {.  SQLITE_EXTEN
31790 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
317a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
317b0 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 7d  3Fts3Init(db);.}
317c0 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a  .#endif..#endif.