/ Hex Artifact Content
Login

Artifact 65b8489e35da23b127992c6dd6cfd382a486f8c87bf26dfa72876efe46e551bb:


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 20 0a 2a 2a 20 57 72 69  ndif../* .** Wri
3430: 74 65 20 61 20 36 34 2d 62 69 74 20 76 61 72 69  te a 64-bit vari
3440: 61 62 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65  able-length inte
3450: 67 65 72 20 74 6f 20 6d 65 6d 6f 72 79 20 73 74  ger to memory st
3460: 61 72 74 69 6e 67 20 61 74 20 70 5b 30 5d 2e 0a  arting at p[0]..
3470: 2a 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66  ** The length of
3480: 20 64 61 74 61 20 77 72 69 74 74 65 6e 20 77 69   data written wi
3490: 6c 6c 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  ll be between 1 
34a0: 61 6e 64 20 46 54 53 33 5f 56 41 52 49 4e 54 5f  and FTS3_VARINT_
34b0: 4d 41 58 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68  MAX bytes..** Th
34c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
34d0: 73 20 77 72 69 74 74 65 6e 20 69 73 20 72 65 74  s written is ret
34e0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
34f0: 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
3500: 6e 74 28 63 68 61 72 20 2a 70 2c 20 73 71 6c 69  nt(char *p, sqli
3510: 74 65 5f 69 6e 74 36 34 20 76 29 7b 0a 20 20 75  te_int64 v){.  u
3520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 71 20  nsigned char *q 
3530: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
3540: 20 2a 29 20 70 3b 0a 20 20 73 71 6c 69 74 65 5f   *) p;.  sqlite_
3550: 75 69 6e 74 36 34 20 76 75 20 3d 20 76 3b 0a 20  uint64 vu = v;. 
3560: 20 64 6f 7b 0a 20 20 20 20 2a 71 2b 2b 20 3d 20   do{.    *q++ = 
3570: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20  (unsigned char) 
3580: 28 28 76 75 20 26 20 30 78 37 66 29 20 7c 20 30  ((vu & 0x7f) | 0
3590: 78 38 30 29 3b 0a 20 20 20 20 76 75 20 3e 3e 3d  x80);.    vu >>=
35a0: 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28 20 76 75   7;.  }while( vu
35b0: 21 3d 30 20 29 3b 0a 20 20 71 5b 2d 31 5d 20 26  !=0 );.  q[-1] &
35c0: 3d 20 30 78 37 66 3b 20 20 2f 2a 20 74 75 72 6e  = 0x7f;  /* turn
35d0: 20 6f 66 66 20 68 69 67 68 20 62 69 74 20 69 6e   off high bit in
35e0: 20 66 69 6e 61 6c 20 62 79 74 65 20 2a 2f 0a 20   final byte */. 
35f0: 20 61 73 73 65 72 74 28 20 71 20 2d 20 28 75 6e   assert( q - (un
3600: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 20  signed char *)p 
3610: 3c 3d 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d  <= FTS3_VARINT_M
3620: 41 58 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  AX );.  return (
3630: 69 6e 74 29 20 28 71 20 2d 20 28 75 6e 73 69 67  int) (q - (unsig
3640: 6e 65 64 20 63 68 61 72 20 2a 29 70 29 3b 0a 7d  ned char *)p);.}
3650: 0a 0a 23 64 65 66 69 6e 65 20 47 45 54 56 41 52  ..#define GETVAR
3660: 49 4e 54 5f 53 54 45 50 28 76 2c 20 70 74 72 2c  INT_STEP(v, ptr,
3670: 20 73 68 69 66 74 2c 20 6d 61 73 6b 31 2c 20 6d   shift, mask1, m
3680: 61 73 6b 32 2c 20 76 61 72 2c 20 72 65 74 29 20  ask2, var, ret) 
3690: 5c 0a 20 20 76 20 3d 20 28 76 20 26 20 6d 61 73  \.  v = (v & mas
36a0: 6b 31 29 20 7c 20 28 20 28 2a 70 74 72 2b 2b 29  k1) | ( (*ptr++)
36b0: 20 3c 3c 20 73 68 69 66 74 20 29 3b 20 20 20 20   << shift );    
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 5c 0a 20 20 69 66 28 20 28 76 20 26 20 6d 61 73  \.  if( (v & mas
36e0: 6b 32 29 3d 3d 30 20 29 7b 20 76 61 72 20 3d 20  k2)==0 ){ var = 
36f0: 76 3b 20 72 65 74 75 72 6e 20 72 65 74 3b 20 7d  v; return ret; }
3700: 0a 23 64 65 66 69 6e 65 20 47 45 54 56 41 52 49  .#define GETVARI
3710: 4e 54 5f 49 4e 49 54 28 76 2c 20 70 74 72 2c 20  NT_INIT(v, ptr, 
3720: 73 68 69 66 74 2c 20 6d 61 73 6b 31 2c 20 6d 61  shift, mask1, ma
3730: 73 6b 32 2c 20 76 61 72 2c 20 72 65 74 29 20 5c  sk2, var, ret) \
3740: 0a 20 20 76 20 3d 20 28 2a 70 74 72 2b 2b 29 3b  .  v = (*ptr++);
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3780: 0a 20 20 69 66 28 20 28 76 20 26 20 6d 61 73 6b  .  if( (v & mask
3790: 32 29 3d 3d 30 20 29 7b 20 76 61 72 20 3d 20 76  2)==0 ){ var = v
37a0: 3b 20 72 65 74 75 72 6e 20 72 65 74 3b 20 7d 0a  ; return ret; }.
37b0: 0a 2f 2a 20 0a 2a 2a 20 52 65 61 64 20 61 20 36  ./* .** Read a 6
37c0: 34 2d 62 69 74 20 76 61 72 69 61 62 6c 65 2d 6c  4-bit variable-l
37d0: 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 66 72  ength integer fr
37e0: 6f 6d 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69  om memory starti
37f0: 6e 67 20 61 74 20 70 5b 30 5d 2e 0a 2a 2a 20 52  ng at p[0]..** R
3800: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
3810: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2c 20   of bytes read, 
3820: 6f 72 20 30 20 6f 6e 20 65 72 72 6f 72 2e 0a 2a  or 0 on error..*
3830: 2a 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 73  * The value is s
3840: 74 6f 72 65 64 20 69 6e 20 2a 76 2e 0a 2a 2f 0a  tored in *v..*/.
3850: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 47  int sqlite3Fts3G
3860: 65 74 56 61 72 69 6e 74 28 63 6f 6e 73 74 20 63  etVarint(const c
3870: 68 61 72 20 2a 70 42 75 66 2c 20 73 71 6c 69 74  har *pBuf, sqlit
3880: 65 5f 69 6e 74 36 34 20 2a 76 29 7b 0a 20 20 63  e_int64 *v){.  c
3890: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
38a0: 61 72 20 2a 70 20 3d 20 28 63 6f 6e 73 74 20 75  ar *p = (const u
38b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
38c0: 75 66 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  uf;.  const unsi
38d0: 67 6e 65 64 20 63 68 61 72 20 2a 70 53 74 61 72  gned char *pStar
38e0: 74 20 3d 20 70 3b 0a 20 20 75 33 32 20 61 3b 0a  t = p;.  u32 a;.
38f0: 20 20 75 36 34 20 62 3b 0a 20 20 69 6e 74 20 73    u64 b;.  int s
3900: 68 69 66 74 3b 0a 0a 20 20 47 45 54 56 41 52 49  hift;..  GETVARI
3910: 4e 54 5f 49 4e 49 54 28 61 2c 20 70 2c 20 30 2c  NT_INIT(a, p, 0,
3920: 20 20 30 78 30 30 2c 20 20 20 20 20 30 78 38 30    0x00,     0x80
3930: 2c 20 2a 76 2c 20 31 29 3b 0a 20 20 47 45 54 56  , *v, 1);.  GETV
3940: 41 52 49 4e 54 5f 53 54 45 50 28 61 2c 20 70 2c  ARINT_STEP(a, p,
3950: 20 37 2c 20 20 30 78 37 46 2c 20 20 20 20 20 30   7,  0x7F,     0
3960: 78 34 30 30 30 2c 20 2a 76 2c 20 32 29 3b 0a 20  x4000, *v, 2);. 
3970: 20 47 45 54 56 41 52 49 4e 54 5f 53 54 45 50 28   GETVARINT_STEP(
3980: 61 2c 20 70 2c 20 31 34 2c 20 30 78 33 46 46 46  a, p, 14, 0x3FFF
3990: 2c 20 20 20 30 78 32 30 30 30 30 30 2c 20 2a 76  ,   0x200000, *v
39a0: 2c 20 33 29 3b 0a 20 20 47 45 54 56 41 52 49 4e  , 3);.  GETVARIN
39b0: 54 5f 53 54 45 50 28 61 2c 20 70 2c 20 32 31 2c  T_STEP(a, p, 21,
39c0: 20 30 78 31 46 46 46 46 46 2c 20 30 78 31 30 30   0x1FFFFF, 0x100
39d0: 30 30 30 30 30 2c 20 2a 76 2c 20 34 29 3b 0a 20  00000, *v, 4);. 
39e0: 20 62 20 3d 20 28 61 20 26 20 30 78 30 46 46 46   b = (a & 0x0FFF
39f0: 46 46 46 46 20 29 3b 0a 0a 20 20 66 6f 72 28 73  FFFF );..  for(s
3a00: 68 69 66 74 3d 32 38 3b 20 73 68 69 66 74 3c 3d  hift=28; shift<=
3a10: 36 33 3b 20 73 68 69 66 74 2b 3d 37 29 7b 0a 20  63; shift+=7){. 
3a20: 20 20 20 75 36 34 20 63 20 3d 20 2a 70 2b 2b 3b     u64 c = *p++;
3a30: 0a 20 20 20 20 62 20 2b 3d 20 28 63 26 30 78 37  .    b += (c&0x7
3a40: 46 29 20 3c 3c 20 73 68 69 66 74 3b 0a 20 20 20  F) << shift;.   
3a50: 20 69 66 28 20 28 63 20 26 20 30 78 38 30 29 3d   if( (c & 0x80)=
3a60: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
3a70: 20 20 2a 76 20 3d 20 62 3b 0a 20 20 72 65 74 75    *v = b;.  retu
3a80: 72 6e 20 28 69 6e 74 29 28 70 20 2d 20 70 53 74  rn (int)(p - pSt
3a90: 61 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  art);.}../*.** S
3aa0: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
3ab0: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 29  3Fts3GetVarint()
3ac0: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
3ad0: 65 20 6f 75 74 70 75 74 20 69 73 20 74 72 75 6e  e output is trun
3ae0: 63 61 74 65 64 20 74 6f 20 0a 2a 2a 20 61 20 6e  cated to .** a n
3af0: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 33 32 2d 62  on-negative 32-b
3b00: 69 74 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72  it integer befor
3b10: 65 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  e it is returned
3b20: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3b30: 46 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  Fts3GetVarint32(
3b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69  const char *p, i
3b50: 6e 74 20 2a 70 69 29 7b 0a 20 20 75 33 32 20 61  nt *pi){.  u32 a
3b60: 3b 0a 0a 23 69 66 6e 64 65 66 20 66 74 73 33 47  ;..#ifndef fts3G
3b70: 65 74 56 61 72 69 6e 74 33 32 0a 20 20 47 45 54  etVarint32.  GET
3b80: 56 41 52 49 4e 54 5f 49 4e 49 54 28 61 2c 20 70  VARINT_INIT(a, p
3b90: 2c 20 30 2c 20 20 30 78 30 30 2c 20 20 20 20 20  , 0,  0x00,     
3ba0: 30 78 38 30 2c 20 2a 70 69 2c 20 31 29 3b 0a 23  0x80, *pi, 1);.#
3bb0: 65 6c 73 65 0a 20 20 61 20 3d 20 28 2a 70 2b 2b  else.  a = (*p++
3bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 20 26  );.  assert( a &
3bd0: 20 30 78 38 30 20 29 3b 0a 23 65 6e 64 69 66 0a   0x80 );.#endif.
3be0: 0a 20 20 47 45 54 56 41 52 49 4e 54 5f 53 54 45  .  GETVARINT_STE
3bf0: 50 28 61 2c 20 70 2c 20 37 2c 20 20 30 78 37 46  P(a, p, 7,  0x7F
3c00: 2c 20 20 20 20 20 30 78 34 30 30 30 2c 20 2a 70  ,     0x4000, *p
3c10: 69 2c 20 32 29 3b 0a 20 20 47 45 54 56 41 52 49  i, 2);.  GETVARI
3c20: 4e 54 5f 53 54 45 50 28 61 2c 20 70 2c 20 31 34  NT_STEP(a, p, 14
3c30: 2c 20 30 78 33 46 46 46 2c 20 20 20 30 78 32 30  , 0x3FFF,   0x20
3c40: 30 30 30 30 2c 20 2a 70 69 2c 20 33 29 3b 0a 20  0000, *pi, 3);. 
3c50: 20 47 45 54 56 41 52 49 4e 54 5f 53 54 45 50 28   GETVARINT_STEP(
3c60: 61 2c 20 70 2c 20 32 31 2c 20 30 78 31 46 46 46  a, p, 21, 0x1FFF
3c70: 46 46 2c 20 30 78 31 30 30 30 30 30 30 30 2c 20  FF, 0x10000000, 
3c80: 2a 70 69 2c 20 34 29 3b 0a 20 20 61 20 3d 20 28  *pi, 4);.  a = (
3c90: 61 20 26 20 30 78 30 46 46 46 46 46 46 46 20 29  a & 0x0FFFFFFF )
3ca0: 3b 0a 20 20 2a 70 69 20 3d 20 28 69 6e 74 29 28  ;.  *pi = (int)(
3cb0: 61 20 7c 20 28 28 75 33 32 29 28 2a 70 20 26 20  a | ((u32)(*p & 
3cc0: 30 78 30 37 29 20 3c 3c 20 32 38 29 29 3b 0a 20  0x07) << 28));. 
3cd0: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 61 20 26   assert( 0==(a &
3ce0: 20 30 78 38 30 30 30 30 30 30 30 29 20 29 3b 0a   0x80000000) );.
3cf0: 20 20 61 73 73 65 72 74 28 20 2a 70 69 3e 3d 30    assert( *pi>=0
3d00: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 35 3b 0a   );.  return 5;.
3d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3d20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
3d30: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
3d40: 65 6e 63 6f 64 65 20 76 20 61 73 20 61 20 76 61  encode v as a va
3d50: 72 69 6e 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rint.*/.int sqli
3d60: 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e  te3Fts3VarintLen
3d70: 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20  (sqlite3_uint64 
3d80: 76 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  v){.  int i = 0;
3d90: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 2b 2b 3b 0a  .  do{.    i++;.
3da0: 20 20 20 20 76 20 3e 3e 3d 20 37 3b 0a 20 20 7d      v >>= 7;.  }
3db0: 77 68 69 6c 65 28 20 76 21 3d 30 20 29 3b 0a 20  while( v!=0 );. 
3dc0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
3dd0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 53  .** Convert an S
3de0: 51 4c 2d 73 74 79 6c 65 20 71 75 6f 74 65 64 20  QL-style quoted 
3df0: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 6e 6f  string into a no
3e00: 72 6d 61 6c 20 73 74 72 69 6e 67 20 62 79 20 72  rmal string by r
3e10: 65 6d 6f 76 69 6e 67 0a 2a 2a 20 74 68 65 20 71  emoving.** the q
3e20: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 2e  uote characters.
3e30: 20 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e    The conversion
3e40: 20 69 73 20 64 6f 6e 65 20 69 6e 2d 70 6c 61 63   is done in-plac
3e50: 65 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 69 6e  e.  If the.** in
3e60: 70 75 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  put does not beg
3e70: 69 6e 20 77 69 74 68 20 61 20 71 75 6f 74 65 20  in with a quote 
3e80: 63 68 61 72 61 63 74 65 72 2c 20 74 68 65 6e 20  character, then 
3e90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3ea0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
3eb0: 2a 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a  * Examples:.**.*
3ec0: 2a 20 20 20 20 20 22 61 62 63 22 20 20 20 62 65  *     "abc"   be
3ed0: 63 6f 6d 65 73 20 20 20 61 62 63 0a 2a 2a 20 20  comes   abc.**  
3ee0: 20 20 20 27 78 79 7a 27 20 20 20 62 65 63 6f 6d     'xyz'   becom
3ef0: 65 73 20 20 20 78 79 7a 0a 2a 2a 20 20 20 20 20  es   xyz.**     
3f00: 5b 70 71 72 5d 20 20 20 62 65 63 6f 6d 65 73 20  [pqr]   becomes 
3f10: 20 20 70 71 72 0a 2a 2a 20 20 20 20 20 60 6d 6e    pqr.**     `mn
3f20: 6f 60 20 20 20 62 65 63 6f 6d 65 73 20 20 20 6d  o`   becomes   m
3f30: 6e 6f 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71  no.**.*/.void sq
3f40: 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f 74 65  lite3Fts3Dequote
3f50: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61  (char *z){.  cha
3f60: 72 20 71 75 6f 74 65 3b 20 20 20 20 20 20 20 20  r quote;        
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f80: 51 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 20  Quote character 
3f90: 28 69 66 20 61 6e 79 20 29 20 2a 2f 0a 0a 20 20  (if any ) */..  
3fa0: 71 75 6f 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20  quote = z[0];.  
3fb0: 69 66 28 20 71 75 6f 74 65 3d 3d 27 5b 27 20 7c  if( quote=='[' |
3fc0: 7c 20 71 75 6f 74 65 3d 3d 27 5c 27 27 20 7c 7c  | quote=='\'' ||
3fd0: 20 71 75 6f 74 65 3d 3d 27 22 27 20 7c 7c 20 71   quote=='"' || q
3fe0: 75 6f 74 65 3d 3d 27 60 27 20 29 7b 0a 20 20 20  uote=='`' ){.   
3ff0: 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b 20 20 20   int iIn = 1;   
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4010: 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
4020: 62 79 74 65 20 74 6f 20 72 65 61 64 20 66 72 6f  byte to read fro
4030: 6d 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 69  m input */.    i
4040: 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4060: 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 62 79  Index of next by
4070: 74 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 6f  te to write to o
4080: 75 74 70 75 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a  utput */..    /*
4090: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
40a0: 74 65 20 77 61 73 20 61 20 27 5b 27 2c 20 74 68  te was a '[', th
40b0: 65 6e 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f  en the close-quo
40c0: 74 65 20 63 68 61 72 61 63 74 65 72 20 69 73 20  te character is 
40d0: 61 20 27 5d 27 20 2a 2f 0a 20 20 20 20 69 66 28  a ']' */.    if(
40e0: 20 71 75 6f 74 65 3d 3d 27 5b 27 20 29 20 71 75   quote=='[' ) qu
40f0: 6f 74 65 20 3d 20 27 5d 27 3b 20 20 0a 0a 20 20  ote = ']';  ..  
4100: 20 20 77 68 69 6c 65 28 20 7a 5b 69 49 6e 5d 20    while( z[iIn] 
4110: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
4120: 49 6e 5d 3d 3d 71 75 6f 74 65 20 29 7b 0a 20 20  In]==quote ){.  
4130: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 49 6e 2b        if( z[iIn+
4140: 31 5d 21 3d 71 75 6f 74 65 20 29 20 62 72 65 61  1]!=quote ) brea
4150: 6b 3b 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f 75  k;.        z[iOu
4160: 74 2b 2b 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20  t++] = quote;.  
4170: 20 20 20 20 20 20 69 49 6e 20 2b 3d 20 32 3b 0a        iIn += 2;.
4180: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4190: 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d       z[iOut++] =
41a0: 20 7a 5b 69 49 6e 2b 2b 5d 3b 0a 20 20 20 20 20   z[iIn++];.     
41b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 69   }.    }.    z[i
41c0: 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  Out] = '\0';.  }
41d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
41e0: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
41f0: 72 6f 6d 20 74 68 65 20 64 6f 63 6c 69 73 74 20  rom the doclist 
4200: 61 74 20 2a 70 70 20 61 6e 64 20 61 64 76 61 6e  at *pp and advan
4210: 63 65 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 0a  ce *pp to point.
4220: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
4230: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
4240: 64 20 6f 66 20 74 68 65 20 76 61 72 69 6e 74 2e  d of the varint.
4250: 20 20 41 64 64 20 74 68 65 20 76 61 6c 75 65 20    Add the value 
4260: 6f 66 20 74 68 65 20 76 61 72 69 6e 74 0a 2a 2a  of the varint.**
4270: 20 74 6f 20 2a 70 56 61 6c 2e 0a 2a 2f 0a 73 74   to *pVal..*/.st
4280: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 47 65  atic void fts3Ge
4290: 74 44 65 6c 74 61 56 61 72 69 6e 74 28 63 68 61  tDeltaVarint(cha
42a0: 72 20 2a 2a 70 70 2c 20 73 71 6c 69 74 65 33 5f  r **pp, sqlite3_
42b0: 69 6e 74 36 34 20 2a 70 56 61 6c 29 7b 0a 20 20  int64 *pVal){.  
42c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56  sqlite3_int64 iV
42d0: 61 6c 3b 0a 20 20 2a 70 70 20 2b 3d 20 73 71 6c  al;.  *pp += sql
42e0: 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
42f0: 74 28 2a 70 70 2c 20 26 69 56 61 6c 29 3b 0a 20  t(*pp, &iVal);. 
4300: 20 2a 70 56 61 6c 20 2b 3d 20 69 56 61 6c 3b 0a   *pVal += iVal;.
4310: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
4320: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4330: 61 6c 6c 65 64 2c 20 2a 70 70 20 70 6f 69 6e 74  alled, *pp point
4340: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
4350: 79 74 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 0a  yte following a.
4360: 2a 2a 20 76 61 72 69 6e 74 20 74 68 61 74 20 69  ** varint that i
4370: 73 20 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c  s part of a docl
4380: 69 73 74 20 28 6f 72 20 70 6f 73 69 74 69 6f 6e  ist (or position
4390: 2d 6c 69 73 74 2c 20 6f 72 20 61 6e 79 20 6f 74  -list, or any ot
43a0: 68 65 72 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 76  her list.** of v
43b0: 61 72 69 6e 74 73 29 2e 20 54 68 69 73 20 66 75  arints). This fu
43c0: 6e 63 74 69 6f 6e 20 6d 6f 76 65 73 20 2a 70 70  nction moves *pp
43d0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
43e0: 20 73 74 61 72 74 20 6f 66 20 74 68 61 74 20 76   start of that v
43f0: 61 72 69 6e 74 2c 0a 2a 2a 20 61 6e 64 20 73 65  arint,.** and se
4400: 74 73 20 2a 70 56 61 6c 20 62 79 20 74 68 65 20  ts *pVal by the 
4410: 76 61 72 69 6e 74 20 76 61 6c 75 65 2e 0a 2a 2a  varint value..**
4420: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74  .** Argument pSt
4430: 61 72 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  art points to th
4440: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
4450: 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
4460: 20 74 68 65 0a 2a 2a 20 76 61 72 69 6e 74 20 69   the.** varint i
4470: 73 20 70 61 72 74 20 6f 66 2e 0a 2a 2f 0a 73 74  s part of..*/.st
4480: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 47 65  atic void fts3Ge
4490: 74 52 65 76 65 72 73 65 56 61 72 69 6e 74 28 0a  tReverseVarint(.
44a0: 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 0a 20 20    char **pp, .  
44b0: 63 68 61 72 20 2a 70 53 74 61 72 74 2c 20 0a 20  char *pStart, . 
44c0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
44d0: 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pVal.){.  sqlite
44e0: 33 5f 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20  3_int64 iVal;.  
44f0: 63 68 61 72 20 2a 70 3b 0a 0a 20 20 2f 2a 20 50  char *p;..  /* P
4500: 6f 69 6e 74 65 72 20 70 20 6e 6f 77 20 70 6f 69  ointer p now poi
4510: 6e 74 73 20 61 74 20 74 68 65 20 66 69 72 73 74  nts at the first
4520: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 76   byte past the v
4530: 61 72 69 6e 74 20 77 65 20 61 72 65 20 0a 20 20  arint we are .  
4540: 2a 2a 20 69 6e 74 65 72 65 73 74 65 64 20 69 6e  ** interested in
4550: 2e 20 53 6f 2c 20 75 6e 6c 65 73 73 20 74 68 65  . So, unless the
4560: 20 64 6f 63 6c 69 73 74 20 69 73 20 63 6f 72 72   doclist is corr
4570: 75 70 74 2c 20 74 68 65 20 30 78 38 30 20 62 69  upt, the 0x80 bi
4580: 74 20 69 73 0a 20 20 2a 2a 20 63 6c 65 61 72 20  t is.  ** clear 
4590: 6f 6e 20 63 68 61 72 61 63 74 65 72 20 70 5b 2d  on character p[-
45a0: 31 5d 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 20 3d  1]. */.  for(p =
45b0: 20 28 2a 70 70 29 2d 32 3b 20 70 3e 3d 70 53 74   (*pp)-2; p>=pSt
45c0: 61 72 74 20 26 26 20 2a 70 26 30 78 38 30 3b 20  art && *p&0x80; 
45d0: 70 2d 2d 29 3b 0a 20 20 70 2b 2b 3b 0a 20 20 2a  p--);.  p++;.  *
45e0: 70 70 20 3d 20 70 3b 0a 0a 20 20 73 71 6c 69 74  pp = p;..  sqlit
45f0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
4600: 70 2c 20 26 69 56 61 6c 29 3b 0a 20 20 2a 70 56  p, &iVal);.  *pV
4610: 61 6c 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a  al = iVal;.}../*
4620: 0a 2a 2a 20 54 68 65 20 78 44 69 73 63 6f 6e 6e  .** The xDisconn
4630: 65 63 74 28 29 20 76 69 72 74 75 61 6c 20 74 61  ect() virtual ta
4640: 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73  ble method..*/.s
4650: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 69  tatic int fts3Di
4660: 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 73  sconnectMethod(s
4670: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
4680: 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  ab){.  Fts3Table
4690: 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
46a0: 20 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20   *)pVtab;.  int 
46b0: 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  i;..  assert( p-
46c0: 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
46d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
46e0: 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
46f0: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
4700: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
4710: 6e 74 73 20 68 65 6c 64 20 2a 2f 0a 20 20 73 71  nts held */.  sq
4720: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
4730: 2d 3e 70 53 65 65 6b 53 74 6d 74 29 3b 0a 20 20  ->pSeekStmt);.  
4740: 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f  for(i=0; i<Sizeo
4750: 66 41 72 72 61 79 28 70 2d 3e 61 53 74 6d 74 29  fArray(p->aStmt)
4760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
4770: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
4780: 61 53 74 6d 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aStmt[i]);.  }. 
4790: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
47a0: 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c 29 3b 0a  >zSegmentsTbl);.
47b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
47c0: 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29  ->zReadExprlist)
47d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
47e0: 28 70 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69  (p->zWriteExprli
47f0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st);.  sqlite3_f
4800: 72 65 65 28 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54  ree(p->zContentT
4810: 62 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  bl);.  sqlite3_f
4820: 72 65 65 28 70 2d 3e 7a 4c 61 6e 67 75 61 67 65  ree(p->zLanguage
4830: 69 64 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  id);..  /* Invok
4840: 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  e the tokenizer 
4850: 64 65 73 74 72 75 63 74 6f 72 20 74 6f 20 66 72  destructor to fr
4860: 65 65 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  ee the tokenizer
4870: 2e 20 2a 2f 0a 20 20 70 2d 3e 70 54 6f 6b 65 6e  . */.  p->pToken
4880: 69 7a 65 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  izer->pModule->x
4890: 44 65 73 74 72 6f 79 28 70 2d 3e 70 54 6f 6b 65  Destroy(p->pToke
48a0: 6e 69 7a 65 72 29 3b 0a 0a 20 20 73 71 6c 69 74  nizer);..  sqlit
48b0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
48c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
48d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
48e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
48f0: 69 6e 74 6f 20 2a 70 7a 45 72 72 0a 2a 2f 0a 76  into *pzErr.*/.v
4900: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 45  oid sqlite3Fts3E
4910: 72 72 4d 73 67 28 63 68 61 72 20 2a 2a 70 7a 45  rrMsg(char **pzE
4920: 72 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  rr, const char *
4930: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
4940: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
4950: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 45  qlite3_free(*pzE
4960: 72 72 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  rr);.  va_start(
4970: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
4980: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
4990: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
49a0: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
49b0: 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  (ap);.}../*.** C
49c0: 6f 6e 73 74 72 75 63 74 20 6f 6e 65 20 6f 72 20  onstruct one or 
49d0: 6d 6f 72 65 20 53 51 4c 20 73 74 61 74 65 6d 65  more SQL stateme
49e0: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6f 72  nts from the for
49f0: 6d 61 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e  mat string given
4a00: 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 65 76 61  .** and then eva
4a10: 6c 75 61 74 65 20 74 68 6f 73 65 20 73 74 61 74  luate those stat
4a20: 65 6d 65 6e 74 73 2e 20 54 68 65 20 73 75 63 63  ements. The succ
4a30: 65 73 73 20 63 6f 64 65 20 69 73 20 77 72 69 74  ess code is writ
4a40: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 63  ten.** into *pRc
4a50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
4a60: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
4a70: 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
4a80: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
4a90: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
4aa0: 69 64 20 66 74 73 33 44 62 45 78 65 63 28 0a 20  id fts3DbExec(. 
4ab0: 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
4ac0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65          /* Succe
4ad0: 73 73 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ss code */.  sql
4ae0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
4af0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4b00: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20  in which to run 
4b10: 53 51 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  SQL */.  const c
4b20: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20  har *zFormat,   
4b30: 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67  /* Format string
4b40: 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e   for SQL */.  ..
4b50: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b60: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
4b70: 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20  s to the format 
4b80: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76  string */.){.  v
4b90: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
4ba0: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a  r *zSql;.  if( *
4bb0: 70 52 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRc ) return;.  
4bc0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
4bd0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
4be0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
4bf0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
4c00: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
4c10: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
4c20: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
4c30: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
4c40: 20 20 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74      *pRc = sqlit
4c50: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
4c60: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4c70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
4c80: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
4c90: 20 54 68 65 20 78 44 65 73 74 72 6f 79 28 29 20   The xDestroy() 
4ca0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65  virtual table me
4cb0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
4cc0: 69 6e 74 20 66 74 73 33 44 65 73 74 72 6f 79 4d  int fts3DestroyM
4cd0: 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
4ce0: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 46 74  ab *pVtab){.  Ft
4cf0: 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
4d00: 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 3b  s3Table *)pVtab;
4d10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4d20: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
4d30: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
4d40: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
4d50: 61 72 20 2a 7a 44 62 20 3d 20 70 2d 3e 7a 44 62  ar *zDb = p->zDb
4d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ;        /* Name
4d70: 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 65 2e   of database (e.
4d80: 67 2e 20 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  g. "main", "temp
4d90: 22 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ") */.  sqlite3 
4da0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20  *db = p->db;    
4db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4dc0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a  base handle */..
4dd0: 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 73 68    /* Drop the sh
4de0: 61 64 6f 77 20 74 61 62 6c 65 73 20 2a 2f 0a 20  adow tables */. 
4df0: 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74   if( p->zContent
4e00: 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  Tbl==0 ){.    ft
4e10: 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
4e20: 2c 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  , "DROP TABLE IF
4e30: 20 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 63   EXISTS %Q.'%q_c
4e40: 6f 6e 74 65 6e 74 27 22 2c 20 7a 44 62 2c 20 70  ontent'", zDb, p
4e50: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
4e60: 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20  fts3DbExec(&rc, 
4e70: 64 62 2c 20 22 44 52 4f 50 20 54 41 42 4c 45 20  db, "DROP TABLE 
4e80: 49 46 20 45 58 49 53 54 53 20 25 51 2e 27 25 71  IF EXISTS %Q.'%q
4e90: 5f 73 65 67 6d 65 6e 74 73 27 22 2c 20 7a 44 62  _segments'", zDb
4ea0: 2c 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74  ,p->zName);.  ft
4eb0: 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  s3DbExec(&rc, db
4ec0: 2c 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  , "DROP TABLE IF
4ed0: 20 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73   EXISTS %Q.'%q_s
4ee0: 65 67 64 69 72 27 22 2c 20 7a 44 62 2c 20 70 2d  egdir'", zDb, p-
4ef0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 74 73 33 44  >zName);.  fts3D
4f00: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22  bExec(&rc, db, "
4f10: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
4f20: 49 53 54 53 20 25 51 2e 27 25 71 5f 64 6f 63 73  ISTS %Q.'%q_docs
4f30: 69 7a 65 27 22 2c 20 7a 44 62 2c 20 70 2d 3e 7a  ize'", zDb, p->z
4f40: 4e 61 6d 65 29 3b 0a 20 20 66 74 73 33 44 62 45  Name);.  fts3DbE
4f50: 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22 44 52  xec(&rc, db, "DR
4f60: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
4f70: 54 53 20 25 51 2e 27 25 71 5f 73 74 61 74 27 22  TS %Q.'%q_stat'"
4f80: 2c 20 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  , zDb, p->zName)
4f90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65 72 79  ;..  /* If every
4fa0: 74 68 69 6e 67 20 68 61 73 20 77 6f 72 6b 65 64  thing has worked
4fb0: 2c 20 69 6e 76 6f 6b 65 20 66 74 73 33 44 69 73  , invoke fts3Dis
4fc0: 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 29 20  connectMethod() 
4fd0: 74 6f 20 66 72 65 65 20 74 68 65 0a 20 20 2a 2a  to free the.  **
4fe0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
4ff0: 65 64 20 77 69 74 68 20 74 68 65 20 46 74 73 33  ed with the Fts3
5000: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
5010: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
5020: 45 5f 4f 4b 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  E_OK..  ** Other
5030: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
5040: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
5050: 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
5060: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
5070: 3f 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74  ? fts3Disconnect
5080: 4d 65 74 68 6f 64 28 70 56 74 61 62 29 20 3a 20  Method(pVtab) : 
5090: 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  rc);.}.../*.** I
50a0: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 65  nvoke sqlite3_de
50b0: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 74 6f 20  clare_vtab() to 
50c0: 64 65 63 6c 61 72 65 20 74 68 65 20 73 63 68 65  declare the sche
50d0: 6d 61 20 66 6f 72 20 74 68 65 20 46 54 53 33 20  ma for the FTS3 
50e0: 74 61 62 6c 65 0a 2a 2a 20 70 61 73 73 65 64 20  table.** passed 
50f0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5100: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 64  ument. This is d
5110: 6f 6e 65 20 61 73 20 70 61 72 74 20 6f 66 20 74  one as part of t
5120: 68 65 20 78 43 6f 6e 6e 65 63 74 28 29 0a 2a 2a  he xConnect().**
5130: 20 61 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d   and xCreate() m
5140: 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ethods..**.** If
5150: 20 2a 70 52 63 20 69 73 20 6e 6f 6e 2d 7a 65 72   *pRc is non-zer
5160: 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  o when this func
5170: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
5180: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 0a  it is a no-op. .
5190: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
51a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
51b0: 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
51c0: 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65 64  r code is stored
51d0: 20 69 6e 20 2a 70 52 63 0a 2a 2a 20 62 65 66 6f   in *pRc.** befo
51e0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
51f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5200: 33 44 65 63 6c 61 72 65 56 74 61 62 28 69 6e 74  3DeclareVtab(int
5210: 20 2a 70 52 63 2c 20 46 74 73 33 54 61 62 6c 65   *pRc, Fts3Table
5220: 20 2a 70 29 7b 0a 20 20 69 66 28 20 2a 70 52 63   *p){.  if( *pRc
5230: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5240: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
5270: 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
5280: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
52a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
52b0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52d0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
52e0: 70 61 73 73 65 64 20 74 6f 20 64 65 63 6c 61 72  passed to declar
52f0: 65 5f 76 74 61 62 28 29 20 2a 2f 0a 20 20 20 20  e_vtab() */.    
5300: 63 68 61 72 20 2a 7a 43 6f 6c 73 3b 20 20 20 20  char *zCols;    
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5320: 20 4c 69 73 74 20 6f 66 20 75 73 65 72 20 64 65   List of user de
5330: 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f  fined columns */
5340: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5350: 2a 7a 4c 61 6e 67 75 61 67 65 69 64 3b 0a 0a 20  *zLanguageid;.. 
5360: 20 20 20 7a 4c 61 6e 67 75 61 67 65 69 64 20 3d     zLanguageid =
5370: 20 28 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64   (p->zLanguageid
5380: 20 3f 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69   ? p->zLanguagei
5390: 64 20 3a 20 22 5f 5f 6c 61 6e 67 69 64 22 29 3b  d : "__langid");
53a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
53b0: 62 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20  b_config(p->db, 
53c0: 53 51 4c 49 54 45 5f 56 54 41 42 5f 43 4f 4e 53  SQLITE_VTAB_CONS
53d0: 54 52 41 49 4e 54 5f 53 55 50 50 4f 52 54 2c 20  TRAINT_SUPPORT, 
53e0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  1);..    /* Crea
53f0: 74 65 20 61 20 6c 69 73 74 20 6f 66 20 75 73 65  te a list of use
5400: 72 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  r columns for th
5410: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
5420: 2a 2f 0a 20 20 20 20 7a 43 6f 6c 73 20 3d 20 73  */.    zCols = s
5430: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5440: 25 51 2c 20 22 2c 20 70 2d 3e 61 7a 43 6f 6c 75  %Q, ", p->azColu
5450: 6d 6e 5b 30 5d 29 3b 0a 20 20 20 20 66 6f 72 28  mn[0]);.    for(
5460: 69 3d 31 3b 20 7a 43 6f 6c 73 20 26 26 20 69 3c  i=1; zCols && i<
5470: 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  p->nColumn; i++)
5480: 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20  {.      zCols = 
5490: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
54a0: 22 25 7a 25 51 2c 20 22 2c 20 7a 43 6f 6c 73 2c  "%z%Q, ", zCols,
54b0: 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 29   p->azColumn[i])
54c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
54d0: 43 72 65 61 74 65 20 74 68 65 20 77 68 6f 6c 65  Create the whole
54e0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 22 20   "CREATE TABLE" 
54f0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 61 73  statement to pas
5500: 73 20 74 6f 20 53 51 4c 69 74 65 20 2a 2f 0a 20  s to SQLite */. 
5510: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
5520: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
5530: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
5540: 20 78 28 25 73 20 25 51 20 48 49 44 44 45 4e 2c   x(%s %Q HIDDEN,
5550: 20 64 6f 63 69 64 20 48 49 44 44 45 4e 2c 20 25   docid HIDDEN, %
5560: 51 20 48 49 44 44 45 4e 29 22 2c 20 0a 20 20 20  Q HIDDEN)", .   
5570: 20 20 20 20 20 7a 43 6f 6c 73 2c 20 70 2d 3e 7a       zCols, p->z
5580: 4e 61 6d 65 2c 20 7a 4c 61 6e 67 75 61 67 65 69  Name, zLanguagei
5590: 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  d.    );.    if(
55a0: 20 21 7a 43 6f 6c 73 20 7c 7c 20 21 7a 53 71 6c   !zCols || !zSql
55b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
55c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
55d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
55e0: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
55f0: 72 65 5f 76 74 61 62 28 70 2d 3e 64 62 2c 20 7a  re_vtab(p->db, z
5600: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Sql);.    }..   
5610: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
5620: 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ql);.    sqlite3
5630: 5f 66 72 65 65 28 7a 43 6f 6c 73 29 3b 0a 20 20  _free(zCols);.  
5640: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d    *pRc = rc;.  }
5650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
5660: 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   the %_stat tabl
5670: 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
5680: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
5690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
56a0: 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61 62  ts3CreateStatTab
56b0: 6c 65 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  le(int *pRc, Fts
56c0: 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 66 74  3Table *p){.  ft
56d0: 73 33 44 62 45 78 65 63 28 70 52 63 2c 20 70 2d  s3DbExec(pRc, p-
56e0: 3e 64 62 2c 20 0a 20 20 20 20 20 20 22 43 52 45  >db, .      "CRE
56f0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
5700: 20 45 58 49 53 54 53 20 25 51 2e 27 25 71 5f 73   EXISTS %Q.'%q_s
5710: 74 61 74 27 22 0a 20 20 20 20 20 20 20 20 20 20  tat'".          
5720: 22 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  "(id INTEGER PRI
5730: 4d 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20  MARY KEY, value 
5740: 42 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20 70  BLOB);",.      p
5750: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a  ->zDb, p->zName.
5760: 20 20 29 3b 0a 20 20 69 66 28 20 28 2a 70 52 63    );.  if( (*pRc
5770: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  )==SQLITE_OK ) p
5780: 2d 3e 62 48 61 73 53 74 61 74 20 3d 20 31 3b 0a  ->bHasStat = 1;.
5790: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
57a0: 74 68 65 20 62 61 63 6b 69 6e 67 20 73 74 6f 72  the backing stor
57b0: 65 20 74 61 62 6c 65 73 20 28 25 5f 63 6f 6e 74  e tables (%_cont
57c0: 65 6e 74 2c 20 25 5f 73 65 67 6d 65 6e 74 73 20  ent, %_segments 
57d0: 61 6e 64 20 25 5f 73 65 67 64 69 72 29 0a 2a 2a  and %_segdir).**
57e0: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
57f0: 20 46 54 53 33 20 74 61 62 6c 65 20 70 61 73 73   FTS3 table pass
5800: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
5810: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  rgument. This is
5820: 20 64 6f 6e 65 0a 2a 2a 20 61 73 20 70 61 72 74   done.** as part
5830: 20 6f 66 20 74 68 65 20 76 74 61 62 20 78 43 72   of the vtab xCr
5840: 65 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 0a 2a  eate() method..*
5850: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 2d 3e 62  *.** If the p->b
5860: 48 61 73 44 6f 63 73 69 7a 65 20 62 6f 6f 6c 65  HasDocsize boole
5870: 61 6e 20 69 73 20 74 72 75 65 20 28 69 6e 64 69  an is true (indi
5880: 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 69 73  cating that this
5890: 20 69 73 20 61 6e 0a 2a 2a 20 46 54 53 34 20 74   is an.** FTS4 t
58a0: 61 62 6c 65 2c 20 6e 6f 74 20 61 6e 20 46 54 53  able, not an FTS
58b0: 33 20 74 61 62 6c 65 29 20 74 68 65 6e 20 61 6c  3 table) then al
58c0: 73 6f 20 63 72 65 61 74 65 20 74 68 65 20 25 5f  so create the %_
58d0: 64 6f 63 73 69 7a 65 20 61 6e 64 0a 2a 2a 20 25  docsize and.** %
58e0: 5f 73 74 61 74 20 74 61 62 6c 65 73 20 72 65 71  _stat tables req
58f0: 75 69 72 65 64 20 62 79 20 46 54 53 34 2e 0a 2a  uired by FTS4..*
5900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5910: 33 43 72 65 61 74 65 54 61 62 6c 65 73 28 46 74  3CreateTables(Ft
5920: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  s3Table *p){.  i
5930: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5940: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
5950: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
5960: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
5990: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  ariable */.  sql
59a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
59b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
59c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
59d0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  nection */..  if
59e0: 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c  ( p->zContentTbl
59f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
5a00: 20 63 68 61 72 20 2a 7a 4c 61 6e 67 75 61 67 65   char *zLanguage
5a10: 69 64 20 3d 20 70 2d 3e 7a 4c 61 6e 67 75 61 67  id = p->zLanguag
5a20: 65 69 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  eid;.    char *z
5a30: 43 6f 6e 74 65 6e 74 43 6f 6c 73 3b 20 20 20 20  ContentCols;    
5a40: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5a50: 73 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20 74  s of %_content t
5a60: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  able */..    /* 
5a70: 43 72 65 61 74 65 20 61 20 6c 69 73 74 20 6f 66  Create a list of
5a80: 20 75 73 65 72 20 63 6f 6c 75 6d 6e 73 20 66 6f   user columns fo
5a90: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  r the content ta
5aa0: 62 6c 65 20 2a 2f 0a 20 20 20 20 7a 43 6f 6e 74  ble */.    zCont
5ab0: 65 6e 74 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65  entCols = sqlite
5ac0: 33 5f 6d 70 72 69 6e 74 66 28 22 64 6f 63 69 64  3_mprintf("docid
5ad0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5ae0: 20 4b 45 59 22 29 3b 0a 20 20 20 20 66 6f 72 28   KEY");.    for(
5af0: 69 3d 30 3b 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c  i=0; zContentCol
5b00: 73 20 26 26 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d  s && i<p->nColum
5b10: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  n; i++){.      c
5b20: 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 61 7a 43 6f  har *z = p->azCo
5b30: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7a  lumn[i];.      z
5b40: 43 6f 6e 74 65 6e 74 43 6f 6c 73 20 3d 20 73 71  ContentCols = sq
5b50: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
5b60: 7a 2c 20 27 63 25 64 25 71 27 22 2c 20 7a 43 6f  z, 'c%d%q'", zCo
5b70: 6e 74 65 6e 74 43 6f 6c 73 2c 20 69 2c 20 7a 29  ntentCols, i, z)
5b80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5b90: 7a 4c 61 6e 67 75 61 67 65 69 64 20 26 26 20 7a  zLanguageid && z
5ba0: 43 6f 6e 74 65 6e 74 43 6f 6c 73 20 29 7b 0a 20  ContentCols ){. 
5bb0: 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c       zContentCol
5bc0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
5bd0: 6e 74 66 28 22 25 7a 2c 20 6c 61 6e 67 69 64 22  ntf("%z, langid"
5be0: 2c 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 2c 20  , zContentCols, 
5bf0: 7a 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a 20 20  zLanguageid);.  
5c00: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e    }.    if( zCon
5c10: 74 65 6e 74 43 6f 6c 73 3d 3d 30 20 29 20 72 63  tentCols==0 ) rc
5c20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
5c30: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
5c40: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  e the content ta
5c50: 62 6c 65 20 2a 2f 0a 20 20 20 20 66 74 73 33 44  ble */.    fts3D
5c60: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a  bExec(&rc, db, .
5c70: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
5c80: 41 42 4c 45 20 25 51 2e 27 25 71 5f 63 6f 6e 74  ABLE %Q.'%q_cont
5c90: 65 6e 74 27 28 25 73 29 22 2c 0a 20 20 20 20 20  ent'(%s)",.     
5ca0: 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
5cb0: 6d 65 2c 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73  me, zContentCols
5cc0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
5cd0: 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 74 65 6e  te3_free(zConten
5ce0: 74 43 6f 6c 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tCols);.  }..  /
5cf0: 2a 20 43 72 65 61 74 65 20 6f 74 68 65 72 20 74  * Create other t
5d00: 61 62 6c 65 73 20 2a 2f 0a 20 20 66 74 73 33 44  ables */.  fts3D
5d10: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a  bExec(&rc, db, .
5d20: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
5d30: 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67 6d 65  BLE %Q.'%q_segme
5d40: 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 4e 54  nts'(blockid INT
5d50: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5d60: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b 22 2c  , block BLOB);",
5d70: 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70  .      p->zDb, p
5d80: 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 66  ->zName.  );.  f
5d90: 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
5da0: 62 2c 20 0a 20 20 20 20 20 20 22 43 52 45 41 54  b, .      "CREAT
5db0: 45 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73  E TABLE %Q.'%q_s
5dc0: 65 67 64 69 72 27 28 22 0a 20 20 20 20 20 20 20  egdir'(".       
5dd0: 20 22 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c   "level INTEGER,
5de0: 22 0a 20 20 20 20 20 20 20 20 22 69 64 78 20 49  ".        "idx I
5df0: 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20  NTEGER,".       
5e00: 20 22 73 74 61 72 74 5f 62 6c 6f 63 6b 20 49 4e   "start_block IN
5e10: 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20 20  TEGER,".        
5e20: 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63  "leaves_end_bloc
5e30: 6b 20 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20  k INTEGER,".    
5e40: 20 20 20 20 22 65 6e 64 5f 62 6c 6f 63 6b 20 49      "end_block I
5e50: 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20 20  NTEGER,".       
5e60: 20 22 72 6f 6f 74 20 42 4c 4f 42 2c 22 0a 20 20   "root BLOB,".  
5e70: 20 20 20 20 20 20 22 50 52 49 4d 41 52 59 20 4b        "PRIMARY K
5e80: 45 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 22 0a  EY(level, idx)".
5e90: 20 20 20 20 20 20 22 29 3b 22 2c 0a 20 20 20 20        ");",.    
5ea0: 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
5eb0: 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 2d  me.  );.  if( p-
5ec0: 3e 62 48 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a  >bHasDocsize ){.
5ed0: 20 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26      fts3DbExec(&
5ee0: 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 20  rc, db, .       
5ef0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
5f00: 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 28 64  Q.'%q_docsize'(d
5f10: 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ocid INTEGER PRI
5f20: 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 20 42  MARY KEY, size B
5f30: 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  LOB);",.        
5f40: 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
5f50: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 61 73  .    );.  }.  as
5f60: 73 65 72 74 28 20 70 2d 3e 62 48 61 73 53 74 61  sert( p->bHasSta
5f70: 74 3d 3d 70 2d 3e 62 46 74 73 34 20 29 3b 0a 20  t==p->bFts4 );. 
5f80: 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74   if( p->bHasStat
5f90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
5fa0: 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61 62  ts3CreateStatTab
5fb0: 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 7d 0a  le(&rc, p);.  }.
5fc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5fd0: 2f 2a 0a 2a 2a 20 53 74 6f 72 65 20 74 68 65 20  /*.** Store the 
5fe0: 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
5ff0: 20 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 62 79   page-size in by
6000: 74 65 73 20 69 6e 20 70 2d 3e 6e 50 67 73 7a 2e  tes in p->nPgsz.
6010: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
6020: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
6030: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
6040: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
6050: 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65   no-op. .** Othe
6060: 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72  rwise, if an err
6070: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
6080: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
6090: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 52  is stored in *pR
60a0: 63 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  c.** before retu
60b0: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
60c0: 20 76 6f 69 64 20 66 74 73 33 44 61 74 61 62 61   void fts3Databa
60d0: 73 65 50 61 67 65 53 69 7a 65 28 69 6e 74 20 2a  sePageSize(int *
60e0: 70 52 63 2c 20 46 74 73 33 54 61 62 6c 65 20 2a  pRc, Fts3Table *
60f0: 70 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  p){.  if( *pRc==
6100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6110: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6130: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
6140: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 20 20 20 2f 2a 20 53 51 4c 20 74 65 78 74 20 22     /* SQL text "
6170: 50 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f 73  PRAGMA %Q.page_s
6180: 69 7a 65 22 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ize" */.    sqli
6190: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
61a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
61b0: 70 69 6c 65 64 20 22 50 52 41 47 4d 41 20 25 51  piled "PRAGMA %Q
61c0: 2e 70 61 67 65 5f 73 69 7a 65 22 20 73 74 61 74  .page_size" stat
61d0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 20 20  ement */.  .    
61e0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
61f0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
6200: 51 2e 70 61 67 65 5f 73 69 7a 65 22 2c 20 70 2d  Q.page_size", p-
6210: 3e 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21  >zDb);.    if( !
6220: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
6230: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6250: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
6260: 72 65 70 61 72 65 28 70 2d 3e 64 62 2c 20 7a 53  repare(p->db, zS
6270: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
6280: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
6290: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
62a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
62b0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
62c0: 20 20 20 20 70 2d 3e 6e 50 67 73 7a 20 3d 20 73      p->nPgsz = s
62d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
62e0: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
62f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6300: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
6310: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
6320: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 55  f( rc==SQLITE_AU
6330: 54 48 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  TH ){.        p-
6340: 3e 6e 50 67 73 7a 20 3d 20 31 30 32 34 3b 0a 20  >nPgsz = 1024;. 
6350: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6360: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
6370: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
6380: 20 70 2d 3e 6e 50 67 73 7a 3e 30 20 7c 7c 20 72   p->nPgsz>0 || r
6390: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
63a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
63b0: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 2a 70 52 63  (zSql);.    *pRc
63c0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = rc;.  }.}../*
63d0: 0a 2a 2a 20 22 53 70 65 63 69 61 6c 22 20 46 54  .** "Special" FT
63e0: 53 34 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  S4 arguments are
63f0: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
6400: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ations of the fo
6410: 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
6420: 0a 2a 2a 20 20 20 3c 6b 65 79 3e 20 3d 20 3c 76  .**   <key> = <v
6430: 61 6c 75 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  alue>.**.** Ther
6440: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 68 69  e may not be whi
6450: 74 65 73 70 61 63 65 20 73 75 72 72 6f 75 6e 64  tespace surround
6460: 69 6e 67 20 74 68 65 20 22 3d 22 20 63 68 61 72  ing the "=" char
6470: 61 63 74 65 72 2e 20 54 68 65 20 3c 76 61 6c 75  acter. The <valu
6480: 65 3e 20 0a 2a 2a 20 74 65 72 6d 20 6d 61 79 20  e> .** term may 
6490: 62 65 20 71 75 6f 74 65 64 2c 20 62 75 74 20 74  be quoted, but t
64a0: 68 65 20 3c 6b 65 79 3e 20 6d 61 79 20 6e 6f 74  he <key> may not
64b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
64c0: 66 74 73 33 49 73 53 70 65 63 69 61 6c 43 6f 6c  fts3IsSpecialCol
64d0: 75 6d 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  umn(.  const cha
64e0: 72 20 2a 7a 2c 20 0a 20 20 69 6e 74 20 2a 70 6e  r *z, .  int *pn
64f0: 4b 65 79 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Key,.  char **pz
6500: 56 61 6c 75 65 0a 29 7b 0a 20 20 63 68 61 72 20  Value.){.  char 
6510: 2a 7a 56 61 6c 75 65 3b 0a 20 20 63 6f 6e 73 74  *zValue;.  const
6520: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 3b   char *zCsr = z;
6530: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 7a 43 73 72  ..  while( *zCsr
6540: 21 3d 27 3d 27 20 29 7b 0a 20 20 20 20 69 66 28  !='=' ){.    if(
6550: 20 2a 7a 43 73 72 3d 3d 27 5c 30 27 20 29 20 72   *zCsr=='\0' ) r
6560: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 43 73  eturn 0;.    zCs
6570: 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 4b  r++;.  }..  *pnK
6580: 65 79 20 3d 20 28 69 6e 74 29 28 7a 43 73 72 2d  ey = (int)(zCsr-
6590: 7a 29 3b 0a 20 20 7a 56 61 6c 75 65 20 3d 20 73  z);.  zValue = s
65a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
65b0: 25 73 22 2c 20 26 7a 43 73 72 5b 31 5d 29 3b 0a  %s", &zCsr[1]);.
65c0: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a    if( zValue ){.
65d0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 44      sqlite3Fts3D
65e0: 65 71 75 6f 74 65 28 7a 56 61 6c 75 65 29 3b 0a  equote(zValue);.
65f0: 20 20 7d 0a 20 20 2a 70 7a 56 61 6c 75 65 20 3d    }.  *pzValue =
6600: 20 7a 56 61 6c 75 65 3b 0a 20 20 72 65 74 75 72   zValue;.  retur
6610: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  n 1;.}../*.** Ap
6620: 70 65 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20  pend the output 
6630: 6f 66 20 61 20 70 72 69 6e 74 66 28 29 20 73 74  of a printf() st
6640: 79 6c 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 74  yle formatting t
6650: 6f 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 74  o an existing st
6660: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
6670: 76 6f 69 64 20 66 74 73 33 41 70 70 65 6e 64 66  void fts3Appendf
6680: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45      /* IN/OUT: E
66b0: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
66c0: 68 61 72 20 2a 2a 70 7a 2c 20 20 20 20 20 20 20  har **pz,       
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66e0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
66f0: 72 20 74 6f 20 73 74 72 69 6e 67 20 62 75 66 66  r to string buff
6700: 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
6710: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20  ar *zFormat,    
6720: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74          /* Print
6730: 66 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  f format string 
6740: 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 2e  to append */.  .
6750: 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6770: 2a 20 41 72 67 75 6d 65 6e 74 73 20 66 6f 72 20  * Arguments for 
6780: 70 72 69 6e 74 66 20 66 6f 72 6d 61 74 20 73 74  printf format st
6790: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ring */.){.  if(
67a0: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
67b0: 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
67c0: 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ap;.    char *z;
67d0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
67e0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
67f0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
6800: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
6810: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
6820: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20  );.    if( z && 
6830: 2a 70 7a 20 29 7b 0a 20 20 20 20 20 20 63 68 61  *pz ){.      cha
6840: 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f  r *z2 = sqlite3_
6850: 6d 70 72 69 6e 74 66 28 22 25 73 25 73 22 2c 20  mprintf("%s%s", 
6860: 2a 70 7a 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  *pz, z);.      s
6870: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
6880: 20 20 20 20 20 20 7a 20 3d 20 7a 32 3b 0a 20 20        z = z2;.  
6890: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30    }.    if( z==0
68a0: 20 29 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45   ) *pRc = SQLITE
68b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
68c0: 74 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20  te3_free(*pz);. 
68d0: 20 20 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20 7d 0a     *pz = z;.  }.
68e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
68f0: 61 20 63 6f 70 79 20 6f 66 20 69 6e 70 75 74 20  a copy of input 
6900: 73 74 72 69 6e 67 20 7a 49 6e 70 75 74 20 65 6e  string zInput en
6910: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
6920: 2d 71 75 6f 74 65 73 20 28 22 29 20 61 6e 64 0a  -quotes (") and.
6930: 2a 2a 20 77 69 74 68 20 61 6c 6c 20 64 6f 75 62  ** with all doub
6940: 6c 65 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  le quote charact
6950: 65 72 73 20 65 73 63 61 70 65 64 2e 20 46 6f 72  ers escaped. For
6960: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
6970: 20 20 20 20 66 74 73 33 51 75 6f 74 65 49 64 28      fts3QuoteId(
6980: 22 75 6e 20 5c 22 7a 69 70 5c 22 22 29 20 20 20  "un \"zip\"")   
6990: 2d 3e 20 20 20 20 22 75 6e 20 5c 22 5c 22 7a 69  ->    "un \"\"zi
69a0: 70 5c 22 5c 22 22 0a 2a 2a 0a 2a 2a 20 54 68 65  p\"\"".**.** The
69b0: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
69c0: 64 20 70 6f 69 6e 74 73 20 74 6f 20 6d 65 6d 6f  d points to memo
69d0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
69e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
69f0: 29 2e 20 49 74 0a 2a 2a 20 69 73 20 74 68 65 20  ). It.** is the 
6a00: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
6a10: 62 69 6c 69 74 79 20 74 6f 20 63 61 6c 6c 20 73  bility to call s
6a20: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
6a30: 20 72 65 6c 65 61 73 65 20 74 68 69 73 0a 2a 2a   release this.**
6a40: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
6a50: 69 63 20 63 68 61 72 20 2a 66 74 73 33 51 75 6f  ic char *fts3Quo
6a60: 74 65 49 64 28 63 68 61 72 20 63 6f 6e 73 74 20  teId(char const 
6a70: 2a 7a 49 6e 70 75 74 29 7b 0a 20 20 69 6e 74 20  *zInput){.  int 
6a80: 6e 52 65 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52  nRet;.  char *zR
6a90: 65 74 3b 0a 20 20 6e 52 65 74 20 3d 20 32 20 2b  et;.  nRet = 2 +
6aa0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 49 6e   (int)strlen(zIn
6ab0: 70 75 74 29 2a 32 20 2b 20 31 3b 0a 20 20 7a 52  put)*2 + 1;.  zR
6ac0: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
6ad0: 6c 6f 63 28 6e 52 65 74 29 3b 0a 20 20 69 66 28  loc(nRet);.  if(
6ae0: 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74   zRet ){.    int
6af0: 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   i;.    char *z 
6b00: 3d 20 7a 52 65 74 3b 0a 20 20 20 20 2a 28 7a 2b  = zRet;.    *(z+
6b10: 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 66 6f  +) = '"';.    fo
6b20: 72 28 69 3d 30 3b 20 7a 49 6e 70 75 74 5b 69 5d  r(i=0; zInput[i]
6b30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6b40: 28 20 7a 49 6e 70 75 74 5b 69 5d 3d 3d 27 22 27  ( zInput[i]=='"'
6b50: 20 29 20 2a 28 7a 2b 2b 29 20 3d 20 27 22 27 3b   ) *(z++) = '"';
6b60: 0a 20 20 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20  .      *(z++) = 
6b70: 7a 49 6e 70 75 74 5b 69 5d 3b 0a 20 20 20 20 7d  zInput[i];.    }
6b80: 0a 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 27 22  .    *(z++) = '"
6b90: 27 3b 0a 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20  ';.    *(z++) = 
6ba0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75  '\0';.  }.  retu
6bb0: 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zRet;.}../*.*
6bc0: 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
6bd0: 6f 66 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74  of comma separat
6be0: 65 64 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ed SQL expressio
6bf0: 6e 73 20 61 6e 64 20 61 20 46 52 4f 4d 20 63 6c  ns and a FROM cl
6c00: 61 75 73 65 20 74 68 61 74 20 0a 2a 2a 20 63 6f  ause that .** co
6c10: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 20 61  uld be used in a
6c20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6c30: 74 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  t such as the fo
6c40: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
6c50: 20 20 20 53 45 4c 45 43 54 20 3c 6c 69 73 74 20     SELECT <list 
6c60: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 3e 20  of expressions> 
6c70: 46 52 4f 4d 20 25 5f 63 6f 6e 74 65 6e 74 20 41  FROM %_content A
6c80: 53 20 78 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 6f  S x ....**.** to
6c90: 20 72 65 74 75 72 6e 20 74 68 65 20 64 6f 63 69   return the doci
6ca0: 64 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 65  d, followed by e
6cb0: 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 65  ach column of te
6cc0: 78 74 20 64 61 74 61 20 69 6e 20 6f 72 64 65 72  xt data in order
6cd0: 0a 2a 2a 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  .** from left to
6ce0: 20 77 72 69 74 65 2e 20 49 66 20 70 61 72 61 6d   write. If param
6cf0: 65 74 65 72 20 7a 46 75 6e 63 20 69 73 20 6e 6f  eter zFunc is no
6d00: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73  t NULL, then ins
6d10: 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
6d20: 20 72 65 74 75 72 6e 65 64 20 64 69 72 65 63 74   returned direct
6d30: 6c 79 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  ly each column o
6d40: 66 20 74 65 78 74 20 64 61 74 61 20 69 73 20 70  f text data is p
6d50: 61 73 73 65 64 20 74 6f 20 61 6e 20 53 51 4c 0a  assed to an SQL.
6d60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
6d70: 64 20 7a 46 75 6e 63 20 66 69 72 73 74 2e 20 46  d zFunc first. F
6d80: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a  or example, if z
6d90: 46 75 6e 63 20 69 73 20 22 75 6e 7a 69 70 22 20  Func is "unzip" 
6da0: 61 6e 64 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  and the.** table
6db0: 20 68 61 73 20 74 68 65 20 74 68 72 65 65 20 75   has the three u
6dc0: 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75  ser-defined colu
6dd0: 6d 6e 73 20 22 61 22 2c 20 22 62 22 2c 20 61 6e  mns "a", "b", an
6de0: 64 20 22 63 22 2c 20 74 68 65 20 66 6f 6c 6c 6f  d "c", the follo
6df0: 77 69 6e 67 0a 2a 2a 20 73 74 72 69 6e 67 20 69  wing.** string i
6e00: 73 20 72 65 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a  s returned:.**.*
6e10: 2a 20 20 20 20 20 22 64 6f 63 69 64 2c 20 75 6e  *     "docid, un
6e20: 7a 69 70 28 78 2e 27 61 27 29 2c 20 75 6e 7a 69  zip(x.'a'), unzi
6e30: 70 28 78 2e 27 62 27 29 2c 20 75 6e 7a 69 70 28  p(x.'b'), unzip(
6e40: 78 2e 27 63 27 29 20 46 52 4f 4d 20 25 5f 63 6f  x.'c') FROM %_co
6e50: 6e 74 65 6e 74 20 41 53 20 78 22 0a 2a 2a 0a 2a  ntent AS x".**.*
6e60: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
6e70: 74 75 72 6e 65 64 20 70 6f 69 6e 74 73 20 74 6f  turned points to
6e80: 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
6e90: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6d  ted by sqlite3_m
6ea0: 61 6c 6c 6f 63 28 29 2e 20 49 74 0a 2a 2a 20 69  alloc(). It.** i
6eb0: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
6ec0: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
6ed0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
6ee0: 20 66 72 65 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20   free it..**.** 
6ef0: 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53  If *pRc is not S
6f00: 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
6f10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6f20: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
6f30: 6f 2d 6f 70 20 28 61 6e 64 0a 2a 2a 20 61 20 4e  o-op (and.** a N
6f40: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 72  ULL pointer is r
6f50: 65 74 75 72 6e 65 64 29 2e 20 4f 74 68 65 72 77  eturned). Otherw
6f60: 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65  ise, if an OOM e
6f70: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
6f80: 72 65 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 66  red.** by this f
6f90: 75 6e 63 74 69 6f 6e 2c 20 4e 55 4c 4c 20 69 73  unction, NULL is
6fa0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
6fb0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
6fc0: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 66 0a 2a 2a  ITE_NOMEM. If.**
6fd0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
6fe0: 2c 20 2a 70 52 63 20 69 73 20 6c 65 66 74 20 75  , *pRc is left u
6ff0: 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
7000: 61 74 69 63 20 63 68 61 72 20 2a 66 74 73 33 52  atic char *fts3R
7010: 65 61 64 45 78 70 72 4c 69 73 74 28 46 74 73 33  eadExprList(Fts3
7020: 54 61 62 6c 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Table *p, const 
7030: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 69 6e 74  char *zFunc, int
7040: 20 2a 70 52 63 29 7b 0a 20 20 63 68 61 72 20 2a   *pRc){.  char *
7050: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  zRet = 0;.  char
7060: 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20 20 63   *zFree = 0;.  c
7070: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 3b 0a  har *zFunction;.
7080: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
7090: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d  p->zContentTbl==
70a0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 7a 46  0 ){.    if( !zF
70b0: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 7a 46 75  unc ){.      zFu
70c0: 6e 63 74 69 6f 6e 20 3d 20 22 22 3b 0a 20 20 20  nction = "";.   
70d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 46   }else{.      zF
70e0: 72 65 65 20 3d 20 7a 46 75 6e 63 74 69 6f 6e 20  ree = zFunction 
70f0: 3d 20 66 74 73 33 51 75 6f 74 65 49 64 28 7a 46  = fts3QuoteId(zF
7100: 75 6e 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  unc);.    }.    
7110: 66 74 73 33 41 70 70 65 6e 64 66 28 70 52 63 2c  fts3Appendf(pRc,
7120: 20 26 7a 52 65 74 2c 20 22 64 6f 63 69 64 22 29   &zRet, "docid")
7130: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7140: 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  <p->nColumn; i++
7150: 29 7b 0a 20 20 20 20 20 20 66 74 73 33 41 70 70  ){.      fts3App
7160: 65 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c  endf(pRc, &zRet,
7170: 20 22 2c 25 73 28 78 2e 27 63 25 64 25 71 27 29   ",%s(x.'c%d%q')
7180: 22 2c 20 7a 46 75 6e 63 74 69 6f 6e 2c 20 69 2c  ", zFunction, i,
7190: 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 29   p->azColumn[i])
71a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
71b0: 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29  p->zLanguageid )
71c0: 7b 0a 20 20 20 20 20 20 66 74 73 33 41 70 70 65  {.      fts3Appe
71d0: 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20  ndf(pRc, &zRet, 
71e0: 22 2c 20 78 2e 25 51 22 2c 20 22 6c 61 6e 67 69  ", x.%Q", "langi
71f0: 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  d");.    }.    s
7200: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 72 65  qlite3_free(zFre
7210: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
7220: 20 66 74 73 33 41 70 70 65 6e 64 66 28 70 52 63   fts3Appendf(pRc
7230: 2c 20 26 7a 52 65 74 2c 20 22 72 6f 77 69 64 22  , &zRet, "rowid"
7240: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
7250: 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  i<p->nColumn; i+
7260: 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 33 41 70  +){.      fts3Ap
7270: 70 65 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74  pendf(pRc, &zRet
7280: 2c 20 22 2c 20 78 2e 27 25 71 27 22 2c 20 70 2d  , ", x.'%q'", p-
7290: 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 29 3b 0a 20  >azColumn[i]);. 
72a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
72b0: 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b 0a 20  zLanguageid ){. 
72c0: 20 20 20 20 20 66 74 73 33 41 70 70 65 6e 64 66       fts3Appendf
72d0: 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 2c 20  (pRc, &zRet, ", 
72e0: 78 2e 25 51 22 2c 20 70 2d 3e 7a 4c 61 6e 67 75  x.%Q", p->zLangu
72f0: 61 67 65 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  ageid);.    }.  
7300: 7d 0a 20 20 66 74 73 33 41 70 70 65 6e 64 66 28  }.  fts3Appendf(
7310: 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 20 46 52  pRc, &zRet, " FR
7320: 4f 4d 20 27 25 71 27 2e 27 25 71 25 73 27 20 41  OM '%q'.'%q%s' A
7330: 53 20 78 22 2c 20 0a 20 20 20 20 20 20 70 2d 3e  S x", .      p->
7340: 7a 44 62 2c 0a 20 20 20 20 20 20 28 70 2d 3e 7a  zDb,.      (p->z
7350: 43 6f 6e 74 65 6e 74 54 62 6c 20 3f 20 70 2d 3e  ContentTbl ? p->
7360: 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 3a 20 70 2d  zContentTbl : p-
7370: 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 28  >zName),.      (
7380: 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 3f  p->zContentTbl ?
7390: 20 22 22 20 3a 20 22 5f 63 6f 6e 74 65 6e 74 22   "" : "_content"
73a0: 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ).  );.  return 
73b0: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  zRet;.}../*.** R
73c0: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
73d0: 4e 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  N comma separate
73e0: 64 20 71 75 65 73 74 69 6f 6e 20 6d 61 72 6b 73  d question marks
73f0: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  , where N is the
7400: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63 6f   number.** of co
7410: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 25 5f 63  lumns in the %_c
7420: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 28 6f 6e  ontent table (on
7430: 65 20 66 6f 72 20 74 68 65 20 64 6f 63 69 64 20  e for the docid 
7440: 70 6c 75 73 20 6f 6e 65 20 66 6f 72 20 65 61 63  plus one for eac
7450: 68 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65  h.** user-define
7460: 64 20 74 65 78 74 20 63 6f 6c 75 6d 6e 29 2e 0a  d text column)..
7470: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
7480: 74 20 7a 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  t zFunc is not N
7490: 55 4c 4c 2c 20 74 68 65 6e 20 61 6c 6c 20 62 75  ULL, then all bu
74a0: 74 20 74 68 65 20 66 69 72 73 74 20 71 75 65 73  t the first ques
74b0: 74 69 6f 6e 20 6d 61 72 6b 0a 2a 2a 20 69 73 20  tion mark.** is 
74c0: 70 72 65 63 65 64 65 64 20 62 79 20 7a 46 75 6e  preceded by zFun
74d0: 63 20 61 6e 64 20 61 6e 20 6f 70 65 6e 20 62 72  c and an open br
74e0: 61 63 6b 65 74 2c 20 61 6e 64 20 66 6f 6c 6c 6f  acket, and follo
74f0: 77 65 64 20 62 79 20 61 20 63 6c 6f 73 65 64 0a  wed by a closed.
7500: 2a 2a 20 62 72 61 63 6b 65 74 2e 20 46 6f 72 20  ** bracket. For 
7510: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 46 75 6e  example, if zFun
7520: 63 20 69 73 20 22 7a 69 70 22 20 61 6e 64 20 74  c is "zip" and t
7530: 68 65 20 46 54 53 33 20 74 61 62 6c 65 20 68 61  he FTS3 table ha
7540: 73 20 74 68 72 65 65 20 0a 2a 2a 20 75 73 65 72  s three .** user
7550: 2d 64 65 66 69 6e 65 64 20 74 65 78 74 20 63 6f  -defined text co
7560: 6c 75 6d 6e 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  lumns, the follo
7570: 77 69 6e 67 20 73 74 72 69 6e 67 20 69 73 20 72  wing string is r
7580: 65 74 75 72 6e 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  eturned:.**.**  
7590: 20 20 20 22 3f 2c 20 7a 69 70 28 3f 29 2c 20 7a     "?, zip(?), z
75a0: 69 70 28 3f 29 2c 20 7a 69 70 28 3f 29 22 0a 2a  ip(?), zip(?)".*
75b0: 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
75c0: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 73   returned points
75d0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c   to a buffer all
75e0: 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ocated by sqlite
75f0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 74 0a 2a  3_malloc(). It.*
7600: 2a 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  * is the respons
7610: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
7620: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
7630: 6c 6c 79 20 66 72 65 65 20 69 74 2e 0a 2a 2a 0a  lly free it..**.
7640: 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f  ** If *pRc is no
7650: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
7660: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
7670: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
7680: 61 20 6e 6f 2d 6f 70 20 28 61 6e 64 0a 2a 2a 20  a no-op (and.** 
7690: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69  a NULL pointer i
76a0: 73 20 72 65 74 75 72 6e 65 64 29 2e 20 4f 74 68  s returned). Oth
76b0: 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f  erwise, if an OO
76c0: 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
76d0: 6e 74 65 72 65 64 0a 2a 2a 20 62 79 20 74 68 69  ntered.** by thi
76e0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 4e 55 4c 4c  s function, NULL
76f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7700: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
7710: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 66  SQLITE_NOMEM. If
7720: 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  .** no error occ
7730: 75 72 73 2c 20 2a 70 52 63 20 69 73 20 6c 65 66  urs, *pRc is lef
7740: 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f  t unmodified..*/
7750: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66 74  .static char *ft
7760: 73 33 57 72 69 74 65 45 78 70 72 4c 69 73 74 28  s3WriteExprList(
7770: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 63 6f  Fts3Table *p, co
7780: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
7790: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 68   int *pRc){.  ch
77a0: 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20  ar *zRet = 0;.  
77b0: 63 68 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b  char *zFree = 0;
77c0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69  .  char *zFuncti
77d0: 6f 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  on;.  int i;..  
77e0: 69 66 28 20 21 7a 46 75 6e 63 20 29 7b 0a 20 20  if( !zFunc ){.  
77f0: 20 20 7a 46 75 6e 63 74 69 6f 6e 20 3d 20 22 22    zFunction = ""
7800: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
7810: 46 72 65 65 20 3d 20 7a 46 75 6e 63 74 69 6f 6e  Free = zFunction
7820: 20 3d 20 66 74 73 33 51 75 6f 74 65 49 64 28 7a   = fts3QuoteId(z
7830: 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  Func);.  }.  fts
7840: 33 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a  3Appendf(pRc, &z
7850: 52 65 74 2c 20 22 3f 22 29 3b 0a 20 20 66 6f 72  Ret, "?");.  for
7860: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75  (i=0; i<p->nColu
7870: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74  mn; i++){.    ft
7880: 73 33 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26  s3Appendf(pRc, &
7890: 7a 52 65 74 2c 20 22 2c 25 73 28 3f 29 22 2c 20  zRet, ",%s(?)", 
78a0: 7a 46 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 7d 0a  zFunction);.  }.
78b0: 20 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67 75 61    if( p->zLangua
78c0: 67 65 69 64 20 29 7b 0a 20 20 20 20 66 74 73 33  geid ){.    fts3
78d0: 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a 52  Appendf(pRc, &zR
78e0: 65 74 2c 20 22 2c 20 3f 22 29 3b 0a 20 20 7d 0a  et, ", ?");.  }.
78f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7900: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
7910: 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zRet;.}../*.** T
7920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 74  his function int
7930: 65 72 70 72 65 74 73 20 74 68 65 20 73 74 72 69  erprets the stri
7940: 6e 67 20 61 74 20 28 2a 70 70 29 20 61 73 20 61  ng at (*pp) as a
7950: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
7960: 74 65 67 65 72 0a 2a 2a 20 76 61 6c 75 65 2e 20  teger.** value. 
7970: 49 74 20 72 65 61 64 73 20 74 68 65 20 69 6e 74  It reads the int
7980: 65 67 65 72 20 61 6e 64 20 73 65 74 73 20 2a 70  eger and sets *p
7990: 6e 4f 75 74 20 74 6f 20 74 68 65 20 76 61 6c 75  nOut to the valu
79a0: 65 20 72 65 61 64 2c 20 74 68 65 6e 20 0a 2a 2a  e read, then .**
79b0: 20 73 65 74 73 20 2a 70 70 20 74 6f 20 70 6f 69   sets *pp to poi
79c0: 6e 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 69  nt to the byte i
79d0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
79e0: 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 62 79  wing the last by
79f0: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 69 6e 74  te of.** the int
7a00: 65 67 65 72 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  eger value..**.*
7a10: 2a 20 4f 6e 6c 79 20 64 65 63 69 6d 61 6c 20 64  * Only decimal d
7a20: 69 67 69 74 73 20 28 27 30 27 2e 2e 27 39 27 29  igits ('0'..'9')
7a30: 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f 66 20   may be part of 
7a40: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
7a50: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 70 20  . .**.** If *pp 
7a60: 64 6f 65 73 20 6e 6f 74 20 62 65 69 6e 67 20 77  does not being w
7a70: 69 74 68 20 61 20 64 65 63 69 6d 61 6c 20 64 69  ith a decimal di
7a80: 67 69 74 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  git SQLITE_ERROR
7a90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7aa0: 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 76  .** the output v
7ab0: 61 6c 75 65 20 75 6e 64 65 66 69 6e 65 64 2e 20  alue undefined. 
7ac0: 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
7ad0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
7ae0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
7af0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 77 68 65  tion is used whe
7b00: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 22 70  n parsing the "p
7b10: 72 65 66 69 78 3d 22 20 46 54 53 34 20 70 61 72  refix=" FTS4 par
7b20: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ameter..*/.stati
7b30: 63 20 69 6e 74 20 66 74 73 33 47 6f 62 62 6c 65  c int fts3Gobble
7b40: 49 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Int(const char *
7b50: 2a 70 70 2c 20 69 6e 74 20 2a 70 6e 4f 75 74 29  *pp, int *pnOut)
7b60: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 4d 41  {.  const int MA
7b70: 58 5f 4e 50 52 45 46 49 58 20 3d 20 31 30 30 30  X_NPREFIX = 1000
7b80: 30 30 30 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68  0000;.  const ch
7b90: 61 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ar *p;          
7ba0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
7bb0: 74 6f 72 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  tor pointer */. 
7bc0: 20 69 6e 74 20 6e 49 6e 74 20 3d 20 30 3b 20 20   int nInt = 0;  
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 6c 75 65   /* Output value
7bf0: 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 3d 2a 70 70   */..  for(p=*pp
7c00: 3b 20 70 5b 30 5d 3e 3d 27 30 27 20 26 26 20 70  ; p[0]>='0' && p
7c10: 5b 30 5d 3c 3d 27 39 27 3b 20 70 2b 2b 29 7b 0a  [0]<='9'; p++){.
7c20: 20 20 20 20 6e 49 6e 74 20 3d 20 6e 49 6e 74 20      nInt = nInt 
7c30: 2a 20 31 30 20 2b 20 28 70 5b 30 5d 20 2d 20 27  * 10 + (p[0] - '
7c40: 30 27 29 3b 0a 20 20 20 20 69 66 28 20 6e 49 6e  0');.    if( nIn
7c50: 74 3e 4d 41 58 5f 4e 50 52 45 46 49 58 20 29 7b  t>MAX_NPREFIX ){
7c60: 0a 20 20 20 20 20 20 6e 49 6e 74 20 3d 20 30 3b  .      nInt = 0;
7c70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7c80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d    }.  }.  if( p=
7c90: 3d 2a 70 70 20 29 20 72 65 74 75 72 6e 20 53 51  =*pp ) return SQ
7ca0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 2a 70  LITE_ERROR;.  *p
7cb0: 6e 4f 75 74 20 3d 20 6e 49 6e 74 3b 0a 20 20 2a  nOut = nInt;.  *
7cc0: 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e  pp = p;.  return
7cd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7ce0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7cf0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
7d00: 61 6c 6c 6f 63 61 74 65 20 61 6e 20 61 72 72 61  allocate an arra
7d10: 79 20 6f 66 20 46 74 73 33 49 6e 64 65 78 20 73  y of Fts3Index s
7d20: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 72 65 70  tructures.** rep
7d30: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 69 6e  resenting the in
7d40: 64 65 78 65 73 20 6d 61 69 6e 74 61 69 6e 65 64  dexes maintained
7d50: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
7d60: 46 54 53 20 74 61 62 6c 65 2e 20 46 54 53 20 74  FTS table. FTS t
7d70: 61 62 6c 65 73 0a 2a 2a 20 61 6c 77 61 79 73 20  ables.** always 
7d80: 6d 61 69 6e 74 61 69 6e 20 74 68 65 20 6d 61 69  maintain the mai
7d90: 6e 20 22 74 65 72 6d 73 22 20 69 6e 64 65 78 2c  n "terms" index,
7da0: 20 62 75 74 20 6d 61 79 20 61 6c 73 6f 20 6d 61   but may also ma
7db0: 69 6e 74 61 69 6e 20 6f 6e 65 20 6f 72 0a 2a 2a  intain one or.**
7dc0: 20 6d 6f 72 65 20 22 70 72 65 66 69 78 22 20 69   more "prefix" i
7dd0: 6e 64 65 78 65 73 2c 20 64 65 70 65 6e 64 69 6e  ndexes, dependin
7de0: 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  g on the value o
7df0: 66 20 74 68 65 20 22 70 72 65 66 69 78 3d 22 20  f the "prefix=" 
7e00: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 28 69 66  parameter.** (if
7e10: 20 61 6e 79 29 20 73 70 65 63 69 66 69 65 64 20   any) specified 
7e20: 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 43  as part of the C
7e30: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
7e40: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
7e50: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 50  *.** Argument zP
7e60: 61 72 61 6d 20 69 73 20 70 61 73 73 65 64 20 74  aram is passed t
7e70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
7e80: 22 70 72 65 66 69 78 3d 22 20 6f 70 74 69 6f 6e  "prefix=" option
7e90: 20 69 66 20 6f 6e 65 20 77 61 73 0a 2a 2a 20 73   if one was.** s
7ea0: 70 65 63 69 66 69 65 64 2c 20 6f 72 20 4e 55 4c  pecified, or NUL
7eb0: 4c 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  L otherwise..**.
7ec0: 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
7ed0: 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
7ee0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7ef0: 20 2a 61 70 49 6e 64 65 78 20 73 65 74 20 74 6f   *apIndex set to
7f00: 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
7f10: 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 79   allocated array
7f20: 2e 20 2a 70 6e 49 6e 64 65 78 20 69 73 20 73 65  . *pnIndex is se
7f30: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
7f40: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
7f50: 68 65 0a 2a 2a 20 61 72 72 61 79 2e 20 49 66 20  he.** array. If 
7f60: 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
7f70: 63 75 72 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  cur, an SQLite e
7f80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7f90: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  urned..**.** Reg
7fa0: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
7fb0: 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72  er or not an err
7fc0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  or is returned, 
7fd0: 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
7fe0: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20 74  sibility.** of t
7ff0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
8000: 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
8010: 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 61   on the output a
8020: 72 72 61 79 20 74 6f 20 66 72 65 65 20 69 74 2e  rray to free it.
8030: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
8040: 74 73 33 50 72 65 66 69 78 50 61 72 61 6d 65 74  ts3PrefixParamet
8050: 65 72 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  er(.  const char
8060: 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20   *zParam,       
8070: 20 20 20 20 20 20 2f 2a 20 41 42 43 20 69 6e 20        /* ABC in 
8080: 70 72 65 66 69 78 3d 41 42 43 20 70 61 72 61 6d  prefix=ABC param
8090: 65 74 65 72 20 74 6f 20 70 61 72 73 65 20 2a 2f  eter to parse */
80a0: 0a 20 20 69 6e 74 20 2a 70 6e 49 6e 64 65 78 2c  .  int *pnIndex,
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 2f 2a 20 4f 55 54 3a 20 73 69 7a 65 20     /* OUT: size 
80d0: 6f 66 20 2a 61 70 49 6e 64 65 78 5b 5d 20 61 72  of *apIndex[] ar
80e0: 72 61 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ray */.  struct 
80f0: 46 74 73 33 49 6e 64 65 78 20 2a 2a 61 70 49 6e  Fts3Index **apIn
8100: 64 65 78 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  dex      /* OUT:
8110: 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 78 65   Array of indexe
8120: 73 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  s for this table
8130: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
8140: 46 74 73 33 49 6e 64 65 78 20 2a 61 49 6e 64 65  Fts3Index *aInde
8150: 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  x;       /* Allo
8160: 63 61 74 65 64 20 61 72 72 61 79 20 2a 2f 0a 20  cated array */. 
8170: 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d 20 31 3b   int nIndex = 1;
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
81a0: 74 72 69 65 73 20 69 6e 20 61 72 72 61 79 20 2a  tries in array *
81b0: 2f 0a 0a 20 20 69 66 28 20 7a 50 61 72 61 6d 20  /..  if( zParam 
81c0: 26 26 20 7a 50 61 72 61 6d 5b 30 5d 20 29 7b 0a  && zParam[0] ){.
81d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
81e0: 70 3b 0a 20 20 20 20 6e 49 6e 64 65 78 2b 2b 3b  p;.    nIndex++;
81f0: 0a 20 20 20 20 66 6f 72 28 70 3d 7a 50 61 72 61  .    for(p=zPara
8200: 6d 3b 20 2a 70 3b 20 70 2b 2b 29 7b 0a 20 20 20  m; *p; p++){.   
8210: 20 20 20 69 66 28 20 2a 70 3d 3d 27 2c 27 20 29     if( *p==',' )
8220: 20 6e 49 6e 64 65 78 2b 2b 3b 0a 20 20 20 20 7d   nIndex++;.    }
8230: 0a 20 20 7d 0a 0a 20 20 61 49 6e 64 65 78 20 3d  .  }..  aIndex =
8240: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
8250: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 46 74  sizeof(struct Ft
8260: 73 33 49 6e 64 65 78 29 20 2a 20 6e 49 6e 64 65  s3Index) * nInde
8270: 78 29 3b 0a 20 20 2a 61 70 49 6e 64 65 78 20 3d  x);.  *apIndex =
8280: 20 61 49 6e 64 65 78 3b 0a 20 20 69 66 28 20 21   aIndex;.  if( !
8290: 61 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 72 65  aIndex ){.    re
82a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
82b0: 4d 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74  M;.  }..  memset
82c0: 28 61 49 6e 64 65 78 2c 20 30 2c 20 73 69 7a 65  (aIndex, 0, size
82d0: 6f 66 28 73 74 72 75 63 74 20 46 74 73 33 49 6e  of(struct Fts3In
82e0: 64 65 78 29 20 2a 20 6e 49 6e 64 65 78 29 3b 0a  dex) * nIndex);.
82f0: 20 20 69 66 28 20 7a 50 61 72 61 6d 20 29 7b 0a    if( zParam ){.
8300: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8310: 70 20 3d 20 7a 50 61 72 61 6d 3b 0a 20 20 20 20  p = zParam;.    
8320: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
8330: 3d 31 3b 20 69 3c 6e 49 6e 64 65 78 3b 20 69 2b  =1; i<nIndex; i+
8340: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  +){.      int nP
8350: 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 20  refix = 0;.     
8360: 20 69 66 28 20 66 74 73 33 47 6f 62 62 6c 65 49   if( fts3GobbleI
8370: 6e 74 28 26 70 2c 20 26 6e 50 72 65 66 69 78 29  nt(&p, &nPrefix)
8380: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
8390: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 61 73  _ERROR;.      as
83a0: 73 65 72 74 28 20 6e 50 72 65 66 69 78 3e 3d 30  sert( nPrefix>=0
83b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
83c0: 72 65 66 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20  refix==0 ){.    
83d0: 20 20 20 20 6e 49 6e 64 65 78 2d 2d 3b 0a 20 20      nIndex--;.  
83e0: 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20        i--;.     
83f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8400: 61 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69  aIndex[i].nPrefi
8410: 78 20 3d 20 6e 50 72 65 66 69 78 3b 0a 20 20 20  x = nPrefix;.   
8420: 20 20 20 7d 0a 20 20 20 20 20 20 70 2b 2b 3b 0a     }.      p++;.
8430: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 6e      }.  }..  *pn
8440: 49 6e 64 65 78 20 3d 20 6e 49 6e 64 65 78 3b 0a  Index = nIndex;.
8450: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8460: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
8470: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
8480: 6c 6c 65 64 20 77 68 65 6e 20 69 6e 69 74 69 61  lled when initia
8490: 6c 69 7a 69 6e 67 20 61 6e 20 46 54 53 34 20 74  lizing an FTS4 t
84a0: 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 74  able that uses t
84b0: 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 3d 78 78  he.** content=xx
84c0: 78 20 6f 70 74 69 6f 6e 2e 20 49 74 20 64 65 74  x option. It det
84d0: 65 72 6d 69 6e 65 73 20 74 68 65 20 6e 75 6d 62  ermines the numb
84e0: 65 72 20 6f 66 20 61 6e 64 20 6e 61 6d 65 73 20  er of and names 
84f0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 0a 2a  of the columns.*
8500: 2a 20 6f 66 20 74 68 65 20 6e 65 77 20 46 54 53  * of the new FTS
8510: 34 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  4 table..**.** T
8520: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
8530: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
8540: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
8550: 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
8560: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 69 67 3d 78   the.** config=x
8570: 78 78 20 6f 70 74 69 6f 6e 20 28 69 2e 65 2e 20  xx option (i.e. 
8580: 22 78 78 78 22 29 2e 20 54 68 69 73 20 66 75 6e  "xxx"). This fun
8590: 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
85a0: 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 0a 2a  e database for.*
85b0: 2a 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 61  * a table of tha
85c0: 74 20 6e 61 6d 65 2e 20 49 66 20 66 6f 75 6e 64  t name. If found
85d0: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  , the output var
85e0: 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
85f0: 61 74 65 64 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f  ated.** as follo
8600: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 70 6e 43  ws:.**.**   *pnC
8610: 6f 6c 3a 20 20 20 53 65 74 20 74 6f 20 74 68 65  ol:   Set to the
8620: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
8630: 6e 73 20 74 61 62 6c 65 20 78 78 78 20 68 61 73  ns table xxx has
8640: 2c 0a 2a 2a 0a 2a 2a 20 20 20 2a 70 6e 53 74 72  ,.**.**   *pnStr
8650: 3a 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 74  :   Set to the t
8660: 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 73  otal amount of s
8670: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 74 6f  pace required to
8680: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 0a 2a 2a   store a copy.**
8690: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
86a0: 65 61 63 68 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d  each columns nam
86b0: 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
86c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 2e   nul-terminator.
86d0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 70 61 7a 43 6f 6c  .**.**   *pazCol
86e0: 3a 20 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20  :  Set to point 
86f0: 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 2a  to an array of *
8700: 70 6e 43 6f 6c 20 73 74 72 69 6e 67 73 2e 20 45  pnCol strings. E
8710: 61 63 68 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a  ach string is.**
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
8730: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 72   name of the cor
8740: 72 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d  responding colum
8750: 6e 20 69 6e 20 74 61 62 6c 65 20 78 78 78 2e 20  n in table xxx. 
8760: 54 68 65 20 61 72 72 61 79 0a 2a 2a 20 20 20 20  The array.**    
8770: 20 20 20 20 20 20 20 20 20 61 6e 64 20 69 74 73           and its
8780: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 6c   contents are al
8790: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 61 20  located using a 
87a0: 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
87b0: 6e 2e 20 49 74 0a 2a 2a 20 20 20 20 20 20 20 20  n. It.**        
87c0: 20 20 20 20 20 69 73 20 74 68 65 20 72 65 73 70       is the resp
87d0: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
87e0: 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65 65  e caller to free
87f0: 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e   this allocation
8800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8810: 62 79 20 65 76 65 6e 74 75 61 6c 6c 79 20 70 61  by eventually pa
8820: 73 73 69 6e 67 20 74 68 65 20 2a 70 61 7a 43 6f  ssing the *pazCo
8830: 6c 20 76 61 6c 75 65 20 74 6f 20 73 71 6c 69 74  l value to sqlit
8840: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  e3_free()..**.**
8850: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 63 61   If the table ca
8860: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 61  nnot be found, a
8870: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8880: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
8890: 20 6f 75 74 70 75 74 0a 2a 2a 20 76 61 72 69 61   output.** varia
88a0: 62 6c 65 73 20 61 72 65 20 75 6e 64 65 66 69 6e  bles are undefin
88b0: 65 64 2e 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f  ed. Or, if an OO
88c0: 4d 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  M is encountered
88d0: 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
88e0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 61  s.** returned (a
88f0: 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  nd the output va
8900: 72 69 61 62 6c 65 73 20 61 72 65 20 75 6e 64 65  riables are unde
8910: 66 69 6e 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  fined)..*/.stati
8920: 63 20 69 6e 74 20 66 74 73 33 43 6f 6e 74 65 6e  c int fts3Conten
8930: 74 43 6f 6c 75 6d 6e 73 28 0a 20 20 73 71 6c 69  tColumns(.  sqli
8940: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
8950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
8960: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
8970: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8980: 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
8990: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
89a0: 62 20 28 69 2e 65 2e 20 22 6d 61 69 6e 22 2c 20  b (i.e. "main", 
89b0: 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a  "temp" etc.) */.
89c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
89d0: 62 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  bl,             
89e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6e    /* Name of con
89f0: 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tent table */.  
8a00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 2a 70 61  const char ***pa
8a10: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  zCol,           
8a20: 2f 2a 20 4f 55 54 3a 20 4d 61 6c 6c 6f 63 27 64  /* OUT: Malloc'd
8a30: 20 61 72 72 61 79 20 6f 66 20 63 6f 6c 75 6d 6e   array of column
8a40: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20   names */.  int 
8a50: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8a70: 55 54 3a 20 53 69 7a 65 20 6f 66 20 61 72 72 61  UT: Size of arra
8a80: 79 20 2a 70 61 7a 43 6f 6c 20 2a 2f 0a 20 20 69  y *pazCol */.  i
8a90: 6e 74 20 2a 70 6e 53 74 72 2c 20 20 20 20 20 20  nt *pnStr,      
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ab0: 2a 20 4f 55 54 3a 20 42 79 74 65 73 20 6f 66 20  * OUT: Bytes of 
8ac0: 73 74 72 69 6e 67 20 63 6f 6e 74 65 6e 74 20 2a  string content *
8ad0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  /.  char **pzErr
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 65 72 72 6f      /* OUT: erro
8b00: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a  r message */.){.
8b10: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8b20: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
8b30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8b40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   */.  char *zSql
8b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b60: 20 20 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 54        /* "SELECT
8b70: 20 2a 22 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e   *" statement on
8b80: 20 7a 54 62 6c 20 2a 2f 20 20 0a 20 20 73 71 6c   zTbl */  .  sql
8b90: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
8ba0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
8bb0: 43 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e  Compiled version
8bc0: 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 0a 20 20 7a   of zSql */..  z
8bd0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
8be0: 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20  rintf("SELECT * 
8bf0: 46 52 4f 4d 20 25 51 2e 25 51 22 2c 20 7a 44 62  FROM %Q.%Q", zDb
8c00: 2c 20 7a 54 62 6c 29 3b 0a 20 20 69 66 28 20 21  , zTbl);.  if( !
8c10: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  zSql ){.    rc =
8c20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
8c40: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
8c50: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
8c60: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
8c70: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8c80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8c90: 33 46 74 73 33 45 72 72 4d 73 67 28 70 7a 45 72  3Fts3ErrMsg(pzEr
8ca0: 72 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  r, "%s", sqlite3
8cb0: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
8cc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8cd0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 0a 20  3_free(zSql);.. 
8ce0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8cf0: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
8d00: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 3b 20 20 20  char **azCol;   
8d10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
8d20: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  t array */.    i
8d30: 6e 74 20 6e 53 74 72 20 3d 20 30 3b 20 20 20 20  nt nStr = 0;    
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8d50: 53 69 7a 65 20 6f 66 20 61 6c 6c 20 63 6f 6c 75  Size of all colu
8d60: 6d 6e 20 6e 61 6d 65 73 20 28 69 6e 63 6c 2e 20  mn names (incl. 
8d70: 30 78 30 30 29 20 2a 2f 0a 20 20 20 20 69 6e 74  0x00) */.    int
8d80: 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
8d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8da0: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20 63 6f  mber of table co
8db0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 69 6e 74  lumns */.    int
8dc0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
8dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8de0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8df0: 72 6f 75 67 68 20 63 6f 6c 75 6d 6e 73 20 2a 2f  rough columns */
8e00: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
8e10: 72 6f 75 67 68 20 74 68 65 20 72 65 74 75 72 6e  rough the return
8e20: 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 53 65 74 20  ed columns. Set 
8e30: 6e 53 74 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  nStr to the numb
8e40: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  er of bytes of. 
8e50: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
8e60: 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  ired to store a 
8e70: 63 6f 70 79 20 6f 66 20 65 61 63 68 20 63 6f 6c  copy of each col
8e80: 75 6d 6e 20 6e 61 6d 65 2c 20 69 6e 63 6c 75 64  umn name, includ
8e90: 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ing the.    ** n
8ea0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
8eb0: 74 65 2e 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6c  te.  */.    nCol
8ec0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
8ed0: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
8ee0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8ef0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
8f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
8f10: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
8f20: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
8f30: 29 3b 0a 20 20 20 20 20 20 6e 53 74 72 20 2b 3d  );.      nStr +=
8f40: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 6f   (int)strlen(zCo
8f50: 6c 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  l) + 1;.    }.. 
8f60: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61     /* Allocate a
8f70: 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  nd populate the 
8f80: 61 72 72 61 79 20 74 6f 20 72 65 74 75 72 6e 2e  array to return.
8f90: 20 2a 2f 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20   */.    azCol = 
8fa0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 73  (const char **)s
8fb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
8fc0: 7a 65 6f 66 28 63 68 61 72 20 2a 29 20 2a 20 6e  zeof(char *) * n
8fd0: 43 6f 6c 20 2b 20 6e 53 74 72 29 3b 0a 20 20 20  Col + nStr);.   
8fe0: 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b   if( azCol==0 ){
8ff0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9000: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
9010: 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
9020: 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 26 61 7a  *p = (char *)&az
9030: 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[nCol];.     
9040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
9050: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
9070: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
9080: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69 29  n_name(pStmt, i)
9090: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
90a0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43  = (int)strlen(zC
90b0: 6f 6c 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 6d  ol)+1;.        m
90c0: 65 6d 63 70 79 28 70 2c 20 7a 43 6f 6c 2c 20 6e  emcpy(p, zCol, n
90d0: 29 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6f 6c  );.        azCol
90e0: 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
90f0: 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   p += n;.      }
9100: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9110: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9120: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  t);..    /* Set 
9130: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
9140: 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 2a 70 6e  bles. */.    *pn
9150: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
9160: 2a 70 6e 53 74 72 20 3d 20 6e 53 74 72 3b 0a 20  *pnStr = nStr;. 
9170: 20 20 20 2a 70 61 7a 43 6f 6c 20 3d 20 61 7a 43     *pazCol = azC
9180: 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ol;.  }..  retur
9190: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
91a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
91b0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
91c0: 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68 65 20 78  on of both the x
91d0: 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65  Connect and xCre
91e0: 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 6f  ate.** methods o
91f0: 66 20 74 68 65 20 46 54 53 33 20 76 69 72 74 75  f the FTS3 virtu
9200: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
9210: 54 68 65 20 61 72 67 76 5b 5d 20 61 72 72 61 79  The argv[] array
9220: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f   contains the fo
9230: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
9240: 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f   argv[0]   -> mo
9250: 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 66 74 73  dule name  ("fts
9260: 33 22 20 6f 72 20 22 66 74 73 34 22 29 0a 2a 2a  3" or "fts4").**
9270: 20 20 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20     argv[1]   -> 
9280: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
9290: 20 20 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20     argv[2]   -> 
92a0: 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  table name.**   
92b0: 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20 22 63 6f  argv[...] -> "co
92c0: 6c 75 6d 6e 20 6e 61 6d 65 22 20 61 6e 64 20 6f  lumn name" and o
92d0: 74 68 65 72 20 6d 6f 64 75 6c 65 20 61 72 67 75  ther module argu
92e0: 6d 65 6e 74 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  ment fields..*/.
92f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 49  static int fts3I
9300: 6e 69 74 56 74 61 62 28 0a 20 20 69 6e 74 20 69  nitVtab(.  int i
9310: 73 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  sCreate,        
9320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9330: 75 65 20 66 6f 72 20 78 43 72 65 61 74 65 2c 20  ue for xCreate, 
9340: 66 61 6c 73 65 20 66 6f 72 20 78 43 6f 6e 6e 65  false for xConne
9350: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
9360: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
9370: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
9380: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 63  QLite database c
9390: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76  onnection */.  v
93a0: 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20 20 20  oid *pAux,      
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
93c0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 63 6f 6e  * Hash table con
93d0: 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 69 7a 65  taining tokenize
93e0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  rs */.  int argc
93f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9400: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9410: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
9420: 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a 20   argv array */. 
9430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
9440: 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20 20  nst *argv,      
9450: 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f 6e   /* xCreate/xCon
9460: 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61 72  nect argument ar
9470: 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
9480: 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 20  _vtab **ppVTab, 
9490: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
94a0: 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  e the resulting 
94b0: 76 74 61 62 20 73 74 72 75 63 74 75 72 65 20 68  vtab structure h
94c0: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ere */.  char **
94d0: 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
94e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
94f0: 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
9500: 61 67 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  age here */.){. 
9510: 20 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68   Fts3Hash *pHash
9520: 20 3d 20 28 46 74 73 33 48 61 73 68 20 2a 29 70   = (Fts3Hash *)p
9530: 41 75 78 3b 0a 20 20 46 74 73 33 54 61 62 6c 65  Aux;.  Fts3Table
9540: 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
9550: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9560: 72 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 76  r to allocated v
9570: 74 61 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  tab */.  int rc 
9580: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
9590: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
95a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
95b0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95d0: 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
95e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  e */.  int nByte
95f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9600: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9610: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 75 73 65  f allocation use
9620: 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 69 6e  d for *p */.  in
9630: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9650: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 2a 2f   Column index */
9660: 0a 20 20 69 6e 74 20 6e 53 74 72 69 6e 67 20 3d  .  int nString =
9670: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9680: 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 71 75     /* Bytes requ
9690: 69 72 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  ired to hold all
96a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
96b0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
96e0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
96f0: 54 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68  TS table */.  ch
9700: 61 72 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20  ar *zCsr;       
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9720: 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69   Space for holdi
9730: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
9740: 2a 2f 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  */.  int nDb;   
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65       /* Bytes re
9770: 71 75 69 72 65 64 20 74 6f 20 68 6f 6c 64 20 64  quired to hold d
9780: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
9790: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97b0: 20 20 2f 2a 20 42 79 74 65 73 20 72 65 71 75 69    /* Bytes requi
97c0: 72 65 64 20 74 6f 20 68 6f 6c 64 20 74 61 62 6c  red to hold tabl
97d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
97e0: 69 73 46 74 73 34 20 3d 20 28 61 72 67 76 5b 30  isFts4 = (argv[0
97f0: 5d 5b 33 5d 3d 3d 27 34 27 29 3b 20 2f 2a 20 54  ][3]=='4'); /* T
9800: 72 75 65 20 66 6f 72 20 46 54 53 34 2c 20 66 61  rue for FTS4, fa
9810: 6c 73 65 20 66 6f 72 20 46 54 53 33 20 2a 2f 0a  lse for FTS3 */.
9820: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
9830: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
9840: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
9850: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
9860: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
9870: 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 20 3d 20  r *pTokenizer = 
9880: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b  0;        /* Tok
9890: 65 6e 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  enizer for this 
98a0: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 6e 74 20  table */..  int 
98b0: 6e 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 20 20  nIndex = 0;     
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
98d0: 69 7a 65 20 6f 66 20 61 49 6e 64 65 78 5b 5d 20  ize of aIndex[] 
98e0: 61 72 72 61 79 20 2a 2f 0a 20 20 73 74 72 75 63  array */.  struc
98f0: 74 20 46 74 73 33 49 6e 64 65 78 20 2a 61 49 6e  t Fts3Index *aIn
9900: 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 41 72  dex = 0;   /* Ar
9910: 72 61 79 20 6f 66 20 69 6e 64 65 78 65 73 20 66  ray of indexes f
9920: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  or this table */
9930: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c  ..  /* The resul
9940: 74 73 20 6f 66 20 70 61 72 73 69 6e 67 20 73 75  ts of parsing su
9950: 70 70 6f 72 74 65 64 20 46 54 53 34 20 6b 65 79  pported FTS4 key
9960: 3d 76 61 6c 75 65 20 6f 70 74 69 6f 6e 73 3a 20  =value options: 
9970: 2a 2f 0a 20 20 69 6e 74 20 62 4e 6f 44 6f 63 73  */.  int bNoDocs
9980: 69 7a 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ize = 0;        
9990: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
99a0: 6f 6d 69 74 20 25 5f 64 6f 63 73 69 7a 65 20 74  omit %_docsize t
99b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44  able */.  int bD
99c0: 65 73 63 49 64 78 20 3d 20 30 3b 20 20 20 20 20  escIdx = 0;     
99d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
99e0: 65 20 74 6f 20 73 74 6f 72 65 20 64 65 73 63 65  e to store desce
99f0: 6e 64 69 6e 67 20 69 6e 64 65 78 65 73 20 2a 2f  nding indexes */
9a00: 0a 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78  .  char *zPrefix
9a10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9a20: 20 20 20 2f 2a 20 50 72 65 66 69 78 20 70 61 72     /* Prefix par
9a30: 61 6d 65 74 65 72 20 76 61 6c 75 65 20 28 6f 72  ameter value (or
9a40: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72   NULL) */.  char
9a50: 20 2a 7a 43 6f 6d 70 72 65 73 73 20 3d 20 30 3b   *zCompress = 0;
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
9a70: 6f 6d 70 72 65 73 73 3d 3f 20 70 61 72 61 6d 65  ompress=? parame
9a80: 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ter (or NULL) */
9a90: 0a 20 20 63 68 61 72 20 2a 7a 55 6e 63 6f 6d 70  .  char *zUncomp
9aa0: 72 65 73 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ress = 0;       
9ab0: 20 20 20 2f 2a 20 75 6e 63 6f 6d 70 72 65 73 73     /* uncompress
9ac0: 3d 3f 20 70 61 72 61 6d 65 74 65 72 20 28 6f 72  =? parameter (or
9ad0: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72   NULL) */.  char
9ae0: 20 2a 7a 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 20   *zContent = 0; 
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
9b00: 6f 6e 74 65 6e 74 3d 3f 20 70 61 72 61 6d 65 74  ontent=? paramet
9b10: 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  er (or NULL) */.
9b20: 20 20 63 68 61 72 20 2a 7a 4c 61 6e 67 75 61 67    char *zLanguag
9b30: 65 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eid = 0;        
9b40: 20 20 2f 2a 20 6c 61 6e 67 75 61 67 65 69 64 3d    /* languageid=
9b50: 3f 20 70 61 72 61 6d 65 74 65 72 20 28 6f 72 20  ? parameter (or 
9b60: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72 20  NULL) */.  char 
9b70: 2a 2a 61 7a 4e 6f 74 69 6e 64 65 78 65 64 20 3d  **azNotindexed =
9b80: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68   0;        /* Th
9b90: 65 20 73 65 74 20 6f 66 20 6e 6f 74 69 6e 64 65  e set of notinde
9ba0: 78 65 64 3d 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  xed= columns */.
9bb0: 20 20 69 6e 74 20 6e 4e 6f 74 69 6e 64 65 78 65    int nNotindexe
9bc0: 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
9bd0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 7a 4e    /* Size of azN
9be0: 6f 74 69 6e 64 65 78 65 64 5b 5d 20 61 72 72 61  otindexed[] arra
9bf0: 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  y */..  assert( 
9c00: 73 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 3d  strlen(argv[0])=
9c10: 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
9c20: 28 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  (sqlite3_strnicm
9c30: 70 28 61 72 67 76 5b 30 5d 2c 20 22 66 74 73 34  p(argv[0], "fts4
9c40: 22 2c 20 34 29 3d 3d 30 20 26 26 20 69 73 46 74  ", 4)==0 && isFt
9c50: 73 34 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 73  s4).       || (s
9c60: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
9c70: 61 72 67 76 5b 30 5d 2c 20 22 66 74 73 33 22 2c  argv[0], "fts3",
9c80: 20 34 29 3d 3d 30 20 26 26 20 21 69 73 46 74 73   4)==0 && !isFts
9c90: 34 29 0a 20 20 29 3b 0a 0a 20 20 6e 44 62 20 3d  4).  );..  nDb =
9ca0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 72 67   (int)strlen(arg
9cb0: 76 5b 31 5d 29 20 2b 20 31 3b 0a 20 20 6e 4e 61  v[1]) + 1;.  nNa
9cc0: 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
9cd0: 28 61 72 67 76 5b 32 5d 29 20 2b 20 31 3b 0a 0a  (argv[2]) + 1;..
9ce0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
9cf0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a  (const char *) *
9d00: 20 28 61 72 67 63 2d 32 29 3b 0a 20 20 61 43 6f   (argc-2);.  aCo
9d10: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
9d20: 2a 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  **)sqlite3_mallo
9d30: 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  c(nByte);.  if( 
9d40: 61 43 6f 6c 20 29 7b 0a 20 20 20 20 6d 65 6d 73  aCol ){.    mems
9d50: 65 74 28 28 76 6f 69 64 2a 29 61 43 6f 6c 2c 20  et((void*)aCol, 
9d60: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 61  0, nByte);.    a
9d70: 7a 4e 6f 74 69 6e 64 65 78 65 64 20 3d 20 28 63  zNotindexed = (c
9d80: 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d  har **)sqlite3_m
9d90: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
9da0: 7d 0a 20 20 69 66 28 20 61 7a 4e 6f 74 69 6e 64  }.  if( azNotind
9db0: 65 78 65 64 20 29 7b 0a 20 20 20 20 6d 65 6d 73  exed ){.    mems
9dc0: 65 74 28 61 7a 4e 6f 74 69 6e 64 65 78 65 64 2c  et(azNotindexed,
9dd0: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a   0, nByte);.  }.
9de0: 20 20 69 66 28 20 21 61 43 6f 6c 20 7c 7c 20 21    if( !aCol || !
9df0: 61 7a 4e 6f 74 69 6e 64 65 78 65 64 20 29 7b 0a  azNotindexed ){.
9e00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9e10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
9e20: 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 20  fts3_init_out;. 
9e30: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
9e40: 72 6f 75 67 68 20 61 6c 6c 20 6f 66 20 74 68 65  rough all of the
9e50: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
9e60: 64 20 62 79 20 74 68 65 20 75 73 65 72 20 74 6f  d by the user to
9e70: 20 74 68 65 20 46 54 53 33 2f 34 0a 20 20 2a 2a   the FTS3/4.  **
9e80: 20 6d 6f 64 75 6c 65 20 28 69 2e 65 2e 20 61 6c   module (i.e. al
9e90: 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  l the column nam
9ea0: 65 73 20 61 6e 64 20 73 70 65 63 69 61 6c 20 61  es and special a
9eb0: 72 67 75 6d 65 6e 74 73 29 2e 20 54 68 69 73 20  rguments). This 
9ec0: 6c 6f 6f 70 0a 20 20 2a 2a 20 64 6f 65 73 20 74  loop.  ** does t
9ed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
9ee0: 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 46 69 67 75  **.  **   + Figu
9ef0: 72 65 73 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  res out the numb
9f00: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  er of columns th
9f10: 65 20 46 54 53 58 20 74 61 62 6c 65 20 77 69 6c  e FTSX table wil
9f20: 6c 20 68 61 76 65 2c 20 61 6e 64 0a 20 20 2a 2a  l have, and.  **
9f30: 20 20 20 20 20 74 68 65 20 6e 75 6d 62 65 72 20       the number 
9f40: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
9f50: 65 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 61  e that must be a
9f60: 6c 6c 6f 63 61 74 65 64 20 74 6f 20 73 74 6f 72  llocated to stor
9f70: 65 20 63 6f 70 69 65 73 0a 20 20 2a 2a 20 20 20  e copies.  **   
9f80: 20 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20    of the column 
9f90: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  names..  **.  **
9fa0: 20 20 20 2b 20 49 66 20 74 68 65 72 65 20 69 73     + If there is
9fb0: 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65   a tokenizer spe
9fc0: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 63 6c 75  cification inclu
9fd0: 64 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ded in the argum
9fe0: 65 6e 74 73 2c 0a 20 20 2a 2a 20 20 20 20 20 69  ents,.  **     i
9ff0: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 74  nitializes the t
a000: 6f 6b 65 6e 69 7a 65 72 20 70 54 6f 6b 65 6e 69  okenizer pTokeni
a010: 7a 65 72 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  zer..  */.  for(
a020: 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=3; rc==SQLITE_
a030: 4f 4b 20 26 26 20 69 3c 61 72 67 63 3b 20 69 2b  OK && i<argc; i+
a040: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 6f 6e  +){.    char con
a050: 73 74 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b  st *z = argv[i];
a060: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
a070: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a     char *zVal;..
a080: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
a090: 74 68 69 73 20 69 73 20 61 20 74 6f 6b 65 6e 69  this is a tokeni
a0a0: 7a 65 72 20 73 70 65 63 69 66 69 63 61 74 69 6f  zer specificatio
a0b0: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 54  n */.    if( !pT
a0c0: 6f 6b 65 6e 69 7a 65 72 20 0a 20 20 20 20 20 26  okenizer .     &
a0d0: 26 20 73 74 72 6c 65 6e 28 7a 29 3e 38 0a 20 20  & strlen(z)>8.  
a0e0: 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
a0f0: 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 74 6f  _strnicmp(z, "to
a100: 6b 65 6e 69 7a 65 22 2c 20 38 29 20 0a 20 20 20  kenize", 8) .   
a110: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46    && 0==sqlite3F
a120: 74 73 33 49 73 49 64 43 68 61 72 28 7a 5b 38 5d  ts3IsIdChar(z[8]
a130: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
a140: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
a150: 6e 69 74 54 6f 6b 65 6e 69 7a 65 72 28 70 48 61  nitTokenizer(pHa
a160: 73 68 2c 20 26 7a 5b 39 5d 2c 20 26 70 54 6f 6b  sh, &z[9], &pTok
a170: 65 6e 69 7a 65 72 2c 20 70 7a 45 72 72 29 3b 0a  enizer, pzErr);.
a180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
a190: 65 63 6b 20 69 66 20 69 74 20 69 73 20 61 6e 20  eck if it is an 
a1a0: 46 54 53 34 20 73 70 65 63 69 61 6c 20 61 72 67  FTS4 special arg
a1b0: 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 65 6c  ument. */.    el
a1c0: 73 65 20 69 66 28 20 69 73 46 74 73 34 20 26 26  se if( isFts4 &&
a1d0: 20 66 74 73 33 49 73 53 70 65 63 69 61 6c 43 6f   fts3IsSpecialCo
a1e0: 6c 75 6d 6e 28 7a 2c 20 26 6e 4b 65 79 2c 20 26  lumn(z, &nKey, &
a1f0: 7a 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  zVal) ){.      s
a200: 74 72 75 63 74 20 46 74 73 34 4f 70 74 69 6f 6e  truct Fts4Option
a210: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74   {.        const
a220: 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
a230: 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20       int nOpt;. 
a240: 20 20 20 20 20 7d 20 61 46 74 73 34 4f 70 74 5b       } aFts4Opt[
a250: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
a260: 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 20 20 39  "matchinfo",   9
a270: 20 7d 2c 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20   },     /* 0 -> 
a280: 4d 41 54 43 48 49 4e 46 4f 20 2a 2f 0a 20 20 20  MATCHINFO */.   
a290: 20 20 20 20 20 7b 20 22 70 72 65 66 69 78 22 2c       { "prefix",
a2a0: 20 20 20 20 20 20 36 20 7d 2c 20 20 20 20 20 2f        6 },     /
a2b0: 2a 20 31 20 2d 3e 20 50 52 45 46 49 58 20 2a 2f  * 1 -> PREFIX */
a2c0: 0a 20 20 20 20 20 20 20 20 7b 20 22 63 6f 6d 70  .        { "comp
a2d0: 72 65 73 73 22 2c 20 20 20 20 38 20 7d 2c 20 20  ress",    8 },  
a2e0: 20 20 20 2f 2a 20 32 20 2d 3e 20 43 4f 4d 50 52     /* 2 -> COMPR
a2f0: 45 53 53 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  ESS */.        {
a300: 20 22 75 6e 63 6f 6d 70 72 65 73 73 22 2c 20 31   "uncompress", 1
a310: 30 20 7d 2c 20 20 20 20 20 2f 2a 20 33 20 2d 3e  0 },     /* 3 ->
a320: 20 55 4e 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20   UNCOMPRESS */. 
a330: 20 20 20 20 20 20 20 7b 20 22 6f 72 64 65 72 22         { "order"
a340: 2c 20 20 20 20 20 20 20 35 20 7d 2c 20 20 20 20  ,       5 },    
a350: 20 2f 2a 20 34 20 2d 3e 20 4f 52 44 45 52 20 2a   /* 4 -> ORDER *
a360: 2f 0a 20 20 20 20 20 20 20 20 7b 20 22 63 6f 6e  /.        { "con
a370: 74 65 6e 74 22 2c 20 20 20 20 20 37 20 7d 2c 20  tent",     7 }, 
a380: 20 20 20 20 2f 2a 20 35 20 2d 3e 20 43 4f 4e 54      /* 5 -> CONT
a390: 45 4e 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  ENT */.        {
a3a0: 20 22 6c 61 6e 67 75 61 67 65 69 64 22 2c 20 31   "languageid", 1
a3b0: 30 20 7d 2c 20 20 20 20 20 2f 2a 20 36 20 2d 3e  0 },     /* 6 ->
a3c0: 20 4c 41 4e 47 55 41 47 45 49 44 20 2a 2f 0a 20   LANGUAGEID */. 
a3d0: 20 20 20 20 20 20 20 7b 20 22 6e 6f 74 69 6e 64         { "notind
a3e0: 65 78 65 64 22 2c 20 31 30 20 7d 20 20 20 20 20  exed", 10 }     
a3f0: 20 2f 2a 20 37 20 2d 3e 20 4e 4f 54 49 4e 44 45   /* 7 -> NOTINDE
a400: 58 45 44 20 2a 2f 0a 20 20 20 20 20 20 7d 3b 0a  XED */.      };.
a410: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 70 74 3b  .      int iOpt;
a420: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 56 61 6c  .      if( !zVal
a430: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a440: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a450: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a460: 20 20 20 20 66 6f 72 28 69 4f 70 74 3d 30 3b 20      for(iOpt=0; 
a470: 69 4f 70 74 3c 53 69 7a 65 6f 66 41 72 72 61 79  iOpt<SizeofArray
a480: 28 61 46 74 73 34 4f 70 74 29 3b 20 69 4f 70 74  (aFts4Opt); iOpt
a490: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
a4a0: 74 72 75 63 74 20 46 74 73 34 4f 70 74 69 6f 6e  truct Fts4Option
a4b0: 20 2a 70 4f 70 20 3d 20 26 61 46 74 73 34 4f 70   *pOp = &aFts4Op
a4c0: 74 5b 69 4f 70 74 5d 3b 0a 20 20 20 20 20 20 20  t[iOpt];.       
a4d0: 20 20 20 69 66 28 20 6e 4b 65 79 3d 3d 70 4f 70     if( nKey==pOp
a4e0: 2d 3e 6e 4f 70 74 20 26 26 20 21 73 71 6c 69 74  ->nOpt && !sqlit
a4f0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 70  e3_strnicmp(z, p
a500: 4f 70 2d 3e 7a 4f 70 74 2c 20 70 4f 70 2d 3e 6e  Op->zOpt, pOp->n
a510: 4f 70 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Opt) ){.        
a520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a540: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
a550: 20 69 4f 70 74 20 29 7b 0a 20 20 20 20 20 20 20   iOpt ){.       
a560: 20 20 20 63 61 73 65 20 30 3a 20 20 20 20 20 20     case 0:      
a570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 41 54 43           /* MATC
a580: 48 49 4e 46 4f 20 2a 2f 0a 20 20 20 20 20 20 20  HINFO */.       
a590: 20 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 28       if( strlen(
a5a0: 7a 56 61 6c 29 21 3d 34 20 7c 7c 20 73 71 6c 69  zVal)!=4 || sqli
a5b0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61  te3_strnicmp(zVa
a5c0: 6c 2c 20 22 66 74 73 33 22 2c 20 34 29 20 29 7b  l, "fts3", 4) ){
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a5e0: 71 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73 67  qlite3Fts3ErrMsg
a5f0: 28 70 7a 45 72 72 2c 20 22 75 6e 72 65 63 6f 67  (pzErr, "unrecog
a600: 6e 69 7a 65 64 20 6d 61 74 63 68 69 6e 66 6f 3a  nized matchinfo:
a610: 20 25 73 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20   %s", zVal);.   
a620: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
a630: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a640: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a650: 20 20 20 20 20 20 20 20 62 4e 6f 44 6f 63 73 69          bNoDocsi
a660: 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ze = 1;.        
a670: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a680: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 20 20        case 1:   
a690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a6a0: 52 45 46 49 58 20 2a 2f 0a 20 20 20 20 20 20 20  REFIX */.       
a6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
a6c0: 65 28 7a 50 72 65 66 69 78 29 3b 0a 20 20 20 20  e(zPrefix);.    
a6d0: 20 20 20 20 20 20 20 20 7a 50 72 65 66 69 78 20          zPrefix 
a6e0: 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = zVal;.        
a6f0: 20 20 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20      zVal = 0;.  
a700: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a710: 0a 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ..          case
a720: 20 32 3a 20 20 20 20 20 20 20 20 20 20 20 20 20   2:             
a730: 20 20 2f 2a 20 43 4f 4d 50 52 45 53 53 20 2a 2f    /* COMPRESS */
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
a750: 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6d 70 72  ite3_free(zCompr
a760: 65 73 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ess);.          
a770: 20 20 7a 43 6f 6d 70 72 65 73 73 20 3d 20 7a 56    zCompress = zV
a780: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
a790: 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zVal = 0;.      
a7a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a7b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 33 3a 20          case 3: 
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 55 4e 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20   UNCOMPRESS */. 
a7e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a7f0: 65 33 5f 66 72 65 65 28 7a 55 6e 63 6f 6d 70 72  e3_free(zUncompr
a800: 65 73 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ess);.          
a810: 20 20 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20    zUncompress = 
a820: 7a 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  zVal;.          
a830: 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    zVal = 0;.    
a840: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
a850: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 34            case 4
a860: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a870: 2f 2a 20 4f 52 44 45 52 20 2a 2f 0a 20 20 20 20  /* ORDER */.    
a880: 20 20 20 20 20 20 20 20 69 66 28 20 28 73 74 72          if( (str
a890: 6c 65 6e 28 7a 56 61 6c 29 21 3d 33 20 7c 7c 20  len(zVal)!=3 || 
a8a0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
a8b0: 28 7a 56 61 6c 2c 20 22 61 73 63 22 2c 20 33 29  (zVal, "asc", 3)
a8c0: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
a8d0: 26 26 20 28 73 74 72 6c 65 6e 28 7a 56 61 6c 29  && (strlen(zVal)
a8e0: 21 3d 34 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  !=4 || sqlite3_s
a8f0: 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 64  trnicmp(zVal, "d
a900: 65 73 63 22 2c 20 34 29 29 20 0a 20 20 20 20 20  esc", 4)) .     
a910: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
a920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
a930: 74 73 33 45 72 72 4d 73 67 28 70 7a 45 72 72 2c  ts3ErrMsg(pzErr,
a940: 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f   "unrecognized o
a950: 72 64 65 72 3a 20 25 73 22 2c 20 7a 56 61 6c 29  rder: %s", zVal)
a960: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
a980: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  R;.            }
a990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 44 65  .            bDe
a9a0: 73 63 49 64 78 20 3d 20 28 7a 56 61 6c 5b 30 5d  scIdx = (zVal[0]
a9b0: 3d 3d 27 64 27 20 7c 7c 20 7a 56 61 6c 5b 30 5d  =='d' || zVal[0]
a9c0: 3d 3d 27 44 27 29 3b 0a 20 20 20 20 20 20 20 20  =='D');.        
a9d0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a9e0: 20 20 20 20 20 20 63 61 73 65 20 35 3a 20 20 20        case 5:   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 4f             /* CO
aa00: 4e 54 45 4e 54 20 2a 2f 0a 20 20 20 20 20 20 20  NTENT */.       
aa10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
aa20: 65 28 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  e(zContent);.   
aa30: 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e           zConten
aa40: 74 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  t = zVal;.      
aa50: 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 30 3b 0a        zVal = 0;.
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
aa70: 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 63 61  k;..          ca
aa80: 73 65 20 36 3a 20 20 20 20 20 20 20 20 20 20 20  se 6:           
aa90: 20 20 20 2f 2a 20 4c 41 4e 47 55 41 47 45 49 44     /* LANGUAGEID
aaa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
aab0: 61 73 73 65 72 74 28 20 69 4f 70 74 3d 3d 36 20  assert( iOpt==6 
aac0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
aad0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4c 61 6e  qlite3_free(zLan
aae0: 67 75 61 67 65 69 64 29 3b 0a 20 20 20 20 20 20  guageid);.      
aaf0: 20 20 20 20 20 20 7a 4c 61 6e 67 75 61 67 65 69        zLanguagei
ab00: 64 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  d = zVal;.      
ab10: 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 30 3b 0a        zVal = 0;.
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ab30: 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 63 61  k;..          ca
ab40: 73 65 20 37 3a 20 20 20 20 20 20 20 20 20 20 20  se 7:           
ab50: 20 20 20 2f 2a 20 4e 4f 54 49 4e 44 45 58 45 44     /* NOTINDEXED
ab60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
ab70: 61 7a 4e 6f 74 69 6e 64 65 78 65 64 5b 6e 4e 6f  azNotindexed[nNo
ab80: 74 69 6e 64 65 78 65 64 2b 2b 5d 20 3d 20 7a 56  tindexed++] = zV
ab90: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
aba0: 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zVal = 0;.      
abb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
abc0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
abd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
abe0: 65 72 74 28 20 69 4f 70 74 3d 3d 53 69 7a 65 6f  ert( iOpt==Sizeo
abf0: 66 41 72 72 61 79 28 61 46 74 73 34 4f 70 74 29  fArray(aFts4Opt)
ac00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
ac10: 73 71 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73  sqlite3Fts3ErrMs
ac20: 67 28 70 7a 45 72 72 2c 20 22 75 6e 72 65 63 6f  g(pzErr, "unreco
ac30: 67 6e 69 7a 65 64 20 70 61 72 61 6d 65 74 65 72  gnized parameter
ac40: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
ac50: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
ac60: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
ac70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
ac90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 61 6c  qlite3_free(zVal
aca0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
acb0: 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  ..    /* Otherwi
acc0: 73 65 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74  se, the argument
acd0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d   is a column nam
ace0: 65 2e 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  e. */.    else {
acf0: 0a 20 20 20 20 20 20 6e 53 74 72 69 6e 67 20 2b  .      nString +
ad00: 3d 20 28 69 6e 74 29 28 73 74 72 6c 65 6e 28 7a  = (int)(strlen(z
ad10: 29 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 61 43  ) + 1);.      aC
ad20: 6f 6c 5b 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a 3b 0a  ol[nCol++] = z;.
ad30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ad40: 49 66 20 61 20 63 6f 6e 74 65 6e 74 3d 78 78 78  If a content=xxx
ad50: 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63   option was spec
ad60: 69 66 69 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f  ified, the follo
ad70: 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
ad80: 20 20 31 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20    1. Ignore any 
ad90: 63 6f 6d 70 72 65 73 73 3d 20 61 6e 64 20 75 6e  compress= and un
ada0: 63 6f 6d 70 72 65 73 73 3d 20 6f 70 74 69 6f 6e  compress= option
adb0: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  s..  **.  **   2
adc0: 2e 20 49 66 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e  . If no column n
add0: 61 6d 65 73 20 77 65 72 65 20 73 70 65 63 69 66  ames were specif
ade0: 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  ied as part of t
adf0: 68 65 20 43 52 45 41 54 45 20 56 49 52 54 55 41  he CREATE VIRTUA
ae00: 4c 0a 20 20 2a 2a 20 20 20 20 20 20 54 41 42 4c  L.  **      TABL
ae10: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 75 73 65  E statement, use
ae20: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f   all columns fro
ae30: 6d 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61  m the content ta
ae40: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
ae50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ae60: 20 7a 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20   zContent ){.   
ae70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
ae80: 6f 6d 70 72 65 73 73 29 3b 20 0a 20 20 20 20 73  ompress); .    s
ae90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 6e 63  qlite3_free(zUnc
aea0: 6f 6d 70 72 65 73 73 29 3b 20 0a 20 20 20 20 7a  ompress); .    z
aeb0: 43 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20  Compress = 0;.  
aec0: 20 20 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20    zUncompress = 
aed0: 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d  0;.    if( nCol=
aee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
aef0: 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 2a 29  te3_free((void*)
af00: 61 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 61 43  aCol); .      aC
af10: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ol = 0;.      rc
af20: 20 3d 20 66 74 73 33 43 6f 6e 74 65 6e 74 43 6f   = fts3ContentCo
af30: 6c 75 6d 6e 73 28 64 62 2c 20 61 72 67 76 5b 31  lumns(db, argv[1
af40: 5d 2c 20 7a 43 6f 6e 74 65 6e 74 2c 26 61 43 6f  ], zContent,&aCo
af50: 6c 2c 26 6e 43 6f 6c 2c 26 6e 53 74 72 69 6e 67  l,&nCol,&nString
af60: 2c 70 7a 45 72 72 29 3b 0a 0a 20 20 20 20 20 20  ,pzErr);..      
af70: 2f 2a 20 49 66 20 61 20 6c 61 6e 67 75 61 67 65  /* If a language
af80: 69 64 3d 20 6f 70 74 69 6f 6e 20 77 61 73 20 73  id= option was s
af90: 70 65 63 69 66 69 65 64 2c 20 72 65 6d 6f 76 65  pecified, remove
afa0: 20 74 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64   the language id
afb0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
afc0: 20 66 72 6f 6d 20 74 68 65 20 61 43 6f 6c 5b 5d   from the aCol[]
afd0: 20 61 72 72 61 79 2e 20 2a 2f 20 0a 20 20 20 20   array. */ .    
afe0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
aff0: 5f 4f 4b 20 26 26 20 7a 4c 61 6e 67 75 61 67 65  _OK && zLanguage
b000: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  id ){.        in
b010: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
b020: 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b  (j=0; j<nCol; j+
b030: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
b040: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
b050: 70 28 7a 4c 61 6e 67 75 61 67 65 69 64 2c 20 61  p(zLanguageid, a
b060: 43 6f 6c 5b 6a 5d 29 3d 3d 30 20 29 7b 0a 20 20  Col[j])==0 ){.  
b070: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
b080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
b090: 28 6b 3d 6a 3b 20 6b 3c 6e 43 6f 6c 3b 20 6b 2b  (k=j; k<nCol; k+
b0a0: 2b 29 20 61 43 6f 6c 5b 6b 5d 20 3d 20 61 43 6f  +) aCol[k] = aCo
b0b0: 6c 5b 6b 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  l[k+1];.        
b0c0: 20 20 20 20 6e 43 6f 6c 2d 2d 3b 0a 20 20 20 20      nCol--;.    
b0d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b0e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b0f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b100: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
b110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b120: 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b  o fts3_init_out;
b130: 0a 0a 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20  ..  if( nCol==0 
b140: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
b150: 53 74 72 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  String==0 );.   
b160: 20 61 43 6f 6c 5b 30 5d 20 3d 20 22 63 6f 6e 74   aCol[0] = "cont
b170: 65 6e 74 22 3b 0a 20 20 20 20 6e 53 74 72 69 6e  ent";.    nStrin
b180: 67 20 3d 20 38 3b 0a 20 20 20 20 6e 43 6f 6c 20  g = 8;.    nCol 
b190: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 1;.  }..  if( 
b1a0: 70 54 6f 6b 65 6e 69 7a 65 72 3d 3d 30 20 29 7b  pTokenizer==0 ){
b1b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b1c0: 33 46 74 73 33 49 6e 69 74 54 6f 6b 65 6e 69 7a  3Fts3InitTokeniz
b1d0: 65 72 28 70 48 61 73 68 2c 20 22 73 69 6d 70 6c  er(pHash, "simpl
b1e0: 65 22 2c 20 26 70 54 6f 6b 65 6e 69 7a 65 72 2c  e", &pTokenizer,
b1f0: 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
b200: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b210: 20 67 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f   goto fts3_init_
b220: 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  out;.  }.  asser
b230: 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 29 3b  t( pTokenizer );
b240: 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 50 72 65  ..  rc = fts3Pre
b250: 66 69 78 50 61 72 61 6d 65 74 65 72 28 7a 50 72  fixParameter(zPr
b260: 65 66 69 78 2c 20 26 6e 49 6e 64 65 78 2c 20 26  efix, &nIndex, &
b270: 61 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 72  aIndex);.  if( r
b280: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
b290: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ){.    assert( z
b2a0: 50 72 65 66 69 78 20 29 3b 0a 20 20 20 20 73 71  Prefix );.    sq
b2b0: 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28  lite3Fts3ErrMsg(
b2c0: 70 7a 45 72 72 2c 20 22 65 72 72 6f 72 20 70 61  pzErr, "error pa
b2d0: 72 73 69 6e 67 20 70 72 65 66 69 78 20 70 61 72  rsing prefix par
b2e0: 61 6d 65 74 65 72 3a 20 25 73 22 2c 20 7a 50 72  ameter: %s", zPr
b2f0: 65 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  efix);.  }.  if(
b300: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b310: 20 67 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f   goto fts3_init_
b320: 6f 75 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  out;..  /* Alloc
b330: 61 74 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ate and populate
b340: 20 74 68 65 20 46 74 73 33 54 61 62 6c 65 20 73   the Fts3Table s
b350: 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 6e  tructure. */.  n
b360: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
b370: 73 33 54 61 62 6c 65 29 20 2b 20 20 20 20 20 20  s3Table) +      
b380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b390: 74 73 33 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ts3Table */.    
b3a0: 20 20 20 20 20 20 6e 43 6f 6c 20 2a 20 73 69 7a        nCol * siz
b3b0: 65 6f 66 28 63 68 61 72 20 2a 29 20 2b 20 20 20  eof(char *) +   
b3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a             /* az
b3d0: 43 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20  Column */.      
b3e0: 20 20 20 20 6e 49 6e 64 65 78 20 2a 20 73 69 7a      nIndex * siz
b3f0: 65 6f 66 28 73 74 72 75 63 74 20 46 74 73 33 49  eof(struct Fts3I
b400: 6e 64 65 78 29 20 2b 20 20 2f 2a 20 61 49 6e 64  ndex) +  /* aInd
b410: 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
b420: 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 75 38  nCol * sizeof(u8
b430: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
b440: 20 20 20 20 20 2f 2a 20 61 62 4e 6f 74 69 6e 64       /* abNotind
b450: 65 78 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  exed */.        
b460: 20 20 6e 4e 61 6d 65 20 2b 20 20 20 20 20 20 20    nName +       
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20         /* zName 
b490: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 44 62  */.          nDb
b4a0: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 2f 2a 20 7a 44 62 20 2a 2f 0a 20 20 20 20    /* zDb */.    
b4d0: 20 20 20 20 20 20 6e 53 74 72 69 6e 67 3b 20 20        nString;  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
b500: 61 63 65 20 66 6f 72 20 61 7a 43 6f 6c 75 6d 6e  ace for azColumn
b510: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 70 20   strings */.  p 
b520: 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29 73 71  = (Fts3Table*)sq
b530: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
b540: 74 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  te);.  if( p==0 
b550: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
b560: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
b570: 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74  to fts3_init_out
b580: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
b590: 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  , 0, nByte);.  p
b5a0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 2d 3e  ->db = db;.  p->
b5b0: 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
b5c0: 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
b5d0: 61 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 7a 43 6f  a = 0;.  p->azCo
b5e0: 6c 75 6d 6e 20 3d 20 28 63 68 61 72 20 2a 2a 29  lumn = (char **)
b5f0: 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 54 6f 6b  &p[1];.  p->pTok
b600: 65 6e 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69  enizer = pTokeni
b610: 7a 65 72 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65  zer;.  p->nMaxPe
b620: 6e 64 69 6e 67 44 61 74 61 20 3d 20 46 54 53 33  ndingData = FTS3
b630: 5f 4d 41 58 5f 50 45 4e 44 49 4e 47 5f 44 41 54  _MAX_PENDING_DAT
b640: 41 3b 0a 20 20 70 2d 3e 62 48 61 73 44 6f 63 73  A;.  p->bHasDocs
b650: 69 7a 65 20 3d 20 28 69 73 46 74 73 34 20 26 26  ize = (isFts4 &&
b660: 20 62 4e 6f 44 6f 63 73 69 7a 65 3d 3d 30 29 3b   bNoDocsize==0);
b670: 0a 20 20 70 2d 3e 62 48 61 73 53 74 61 74 20 3d  .  p->bHasStat =
b680: 20 28 75 38 29 69 73 46 74 73 34 3b 0a 20 20 70   (u8)isFts4;.  p
b690: 2d 3e 62 46 74 73 34 20 3d 20 28 75 38 29 69 73  ->bFts4 = (u8)is
b6a0: 46 74 73 34 3b 0a 20 20 70 2d 3e 62 44 65 73 63  Fts4;.  p->bDesc
b6b0: 49 64 78 20 3d 20 28 75 38 29 62 44 65 73 63 49  Idx = (u8)bDescI
b6c0: 64 78 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f 69 6e  dx;.  p->nAutoin
b6d0: 63 72 6d 65 72 67 65 20 3d 20 30 78 66 66 3b 20  crmerge = 0xff; 
b6e0: 20 20 2f 2a 20 30 78 66 66 20 6d 65 61 6e 73 20    /* 0xff means 
b6f0: 73 65 74 74 69 6e 67 20 75 6e 6b 6e 6f 77 6e 20  setting unknown 
b700: 2a 2f 0a 20 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  */.  p->zContent
b710: 54 62 6c 20 3d 20 7a 43 6f 6e 74 65 6e 74 3b 0a  Tbl = zContent;.
b720: 20 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64    p->zLanguageid
b730: 20 3d 20 7a 4c 61 6e 67 75 61 67 65 69 64 3b 0a   = zLanguageid;.
b740: 20 20 7a 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a    zContent = 0;.
b750: 20 20 7a 4c 61 6e 67 75 61 67 65 69 64 20 3d 20    zLanguageid = 
b760: 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70  0;.  TESTONLY( p
b770: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
b780: 3d 20 2d 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e  = -1 );.  TESTON
b790: 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69  LY( p->mxSavepoi
b7a0: 6e 74 20 3d 20 2d 31 20 29 3b 0a 0a 20 20 70 2d  nt = -1 );..  p-
b7b0: 3e 61 49 6e 64 65 78 20 3d 20 28 73 74 72 75 63  >aIndex = (struc
b7c0: 74 20 46 74 73 33 49 6e 64 65 78 20 2a 29 26 70  t Fts3Index *)&p
b7d0: 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d  ->azColumn[nCol]
b7e0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 49  ;.  memcpy(p->aI
b7f0: 6e 64 65 78 2c 20 61 49 6e 64 65 78 2c 20 73 69  ndex, aIndex, si
b800: 7a 65 6f 66 28 73 74 72 75 63 74 20 46 74 73 33  zeof(struct Fts3
b810: 49 6e 64 65 78 29 20 2a 20 6e 49 6e 64 65 78 29  Index) * nIndex)
b820: 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 78 20 3d 20  ;.  p->nIndex = 
b830: 6e 49 6e 64 65 78 3b 0a 20 20 66 6f 72 28 69 3d  nIndex;.  for(i=
b840: 30 3b 20 69 3c 6e 49 6e 64 65 78 3b 20 69 2b 2b  0; i<nIndex; i++
b850: 29 7b 0a 20 20 20 20 66 74 73 33 48 61 73 68 49  ){.    fts3HashI
b860: 6e 69 74 28 26 70 2d 3e 61 49 6e 64 65 78 5b 69  nit(&p->aIndex[i
b870: 5d 2e 68 50 65 6e 64 69 6e 67 2c 20 46 54 53 33  ].hPending, FTS3
b880: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 31 29  _HASH_STRING, 1)
b890: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 62 4e 6f 74  ;.  }.  p->abNot
b8a0: 69 6e 64 65 78 65 64 20 3d 20 28 75 38 20 2a 29  indexed = (u8 *)
b8b0: 26 70 2d 3e 61 49 6e 64 65 78 5b 6e 49 6e 64 65  &p->aIndex[nInde
b8c0: 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  x];..  /* Fill i
b8d0: 6e 20 74 68 65 20 7a 4e 61 6d 65 20 61 6e 64 20  n the zName and 
b8e0: 7a 44 62 20 66 69 65 6c 64 73 20 6f 66 20 74 68  zDb fields of th
b8f0: 65 20 76 74 61 62 20 73 74 72 75 63 74 75 72 65  e vtab structure
b900: 2e 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 63  . */.  zCsr = (c
b910: 68 61 72 20 2a 29 26 70 2d 3e 61 62 4e 6f 74 69  har *)&p->abNoti
b920: 6e 64 65 78 65 64 5b 6e 43 6f 6c 5d 3b 0a 20 20  ndexed[nCol];.  
b930: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 43 73 72 3b  p->zName = zCsr;
b940: 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73 72 2c 20  .  memcpy(zCsr, 
b950: 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65 29 3b  argv[2], nName);
b960: 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 4e 61 6d 65  .  zCsr += nName
b970: 3b 0a 20 20 70 2d 3e 7a 44 62 20 3d 20 7a 43 73  ;.  p->zDb = zCs
b980: 72 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73 72  r;.  memcpy(zCsr
b990: 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62 29 3b  , argv[1], nDb);
b9a0: 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 44 62 3b 0a  .  zCsr += nDb;.
b9b0: 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
b9c0: 65 20 61 7a 43 6f 6c 75 6d 6e 20 61 72 72 61 79  e azColumn array
b9d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30   */.  for(iCol=0
b9e0: 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f  ; iCol<nCol; iCo
b9f0: 6c 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  l++){.    char *
ba00: 7a 3b 20 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  z; .    int n = 
ba10: 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
ba20: 20 2a 29 73 71 6c 69 74 65 33 46 74 73 33 4e 65   *)sqlite3Fts3Ne
ba30: 78 74 54 6f 6b 65 6e 28 61 43 6f 6c 5b 69 43 6f  xtToken(aCol[iCo
ba40: 6c 5d 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  l], &n);.    if(
ba50: 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65   n>0 ){.      me
ba60: 6d 63 70 79 28 7a 43 73 72 2c 20 7a 2c 20 6e 29  mcpy(zCsr, z, n)
ba70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
ba80: 5b 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [n] = '\0';.    
ba90: 73 71 6c 69 74 65 33 46 74 73 33 44 65 71 75 6f  sqlite3Fts3Dequo
baa0: 74 65 28 7a 43 73 72 29 3b 0a 20 20 20 20 70 2d  te(zCsr);.    p-
bab0: 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 20  >azColumn[iCol] 
bac0: 3d 20 7a 43 73 72 3b 0a 20 20 20 20 7a 43 73 72  = zCsr;.    zCsr
bad0: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 61 73 73   += n+1;.    ass
bae0: 65 72 74 28 20 7a 43 73 72 20 3c 3d 20 26 28 28  ert( zCsr <= &((
baf0: 63 68 61 72 20 2a 29 70 29 5b 6e 42 79 74 65 5d  char *)p)[nByte]
bb00: 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   );.  }..  /* Fi
bb10: 6c 6c 20 69 6e 20 74 68 65 20 61 62 4e 6f 74 69  ll in the abNoti
bb20: 6e 64 65 78 65 64 20 61 72 72 61 79 20 2a 2f 0a  ndexed array */.
bb30: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
bb40: 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  ol<nCol; iCol++)
bb50: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69  {.    int n = (i
bb60: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 61 7a 43  nt)strlen(p->azC
bb70: 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 29 3b 0a 20 20  olumn[iCol]);.  
bb80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 6f    for(i=0; i<nNo
bb90: 74 69 6e 64 65 78 65 64 3b 20 69 2b 2b 29 7b 0a  tindexed; i++){.
bba0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 6f 74        char *zNot
bbb0: 20 3d 20 61 7a 4e 6f 74 69 6e 64 65 78 65 64 5b   = azNotindexed[
bbc0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  i];.      if( zN
bbd0: 6f 74 20 26 26 20 6e 3d 3d 28 69 6e 74 29 73 74  ot && n==(int)st
bbe0: 72 6c 65 6e 28 7a 4e 6f 74 29 0a 20 20 20 20 20  rlen(zNot).     
bbf0: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f    && 0==sqlite3_
bc00: 73 74 72 6e 69 63 6d 70 28 70 2d 3e 61 7a 43 6f  strnicmp(p->azCo
bc10: 6c 75 6d 6e 5b 69 43 6f 6c 5d 2c 20 7a 4e 6f 74  lumn[iCol], zNot
bc20: 2c 20 6e 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  , n) .      ){. 
bc30: 20 20 20 20 20 20 20 70 2d 3e 61 62 4e 6f 74 69         p->abNoti
bc40: 6e 64 65 78 65 64 5b 69 43 6f 6c 5d 20 3d 20 31  ndexed[iCol] = 1
bc50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
bc60: 33 5f 66 72 65 65 28 7a 4e 6f 74 29 3b 0a 20 20  3_free(zNot);.  
bc70: 20 20 20 20 20 20 61 7a 4e 6f 74 69 6e 64 65 78        azNotindex
bc80: 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ed[i] = 0;.     
bc90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
bca0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 6f 74 69 6e  or(i=0; i<nNotin
bcb0: 64 65 78 65 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  dexed; i++){.   
bcc0: 20 69 66 28 20 61 7a 4e 6f 74 69 6e 64 65 78 65   if( azNotindexe
bcd0: 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71  d[i] ){.      sq
bce0: 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28  lite3Fts3ErrMsg(
bcf0: 70 7a 45 72 72 2c 20 22 6e 6f 20 73 75 63 68 20  pzErr, "no such 
bd00: 63 6f 6c 75 6d 6e 3a 20 25 73 22 2c 20 61 7a 4e  column: %s", azN
bd10: 6f 74 69 6e 64 65 78 65 64 5b 69 5d 29 3b 0a 20  otindexed[i]);. 
bd20: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
bd30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
bd40: 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
bd50: 49 54 45 5f 4f 4b 20 26 26 20 28 7a 43 6f 6d 70  ITE_OK && (zComp
bd60: 72 65 73 73 3d 3d 30 29 21 3d 28 7a 55 6e 63 6f  ress==0)!=(zUnco
bd70: 6d 70 72 65 73 73 3d 3d 30 29 20 29 7b 0a 20 20  mpress==0) ){.  
bd80: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
bd90: 69 73 73 20 3d 20 28 7a 43 6f 6d 70 72 65 73 73  iss = (zCompress
bda0: 3d 3d 30 20 3f 20 22 63 6f 6d 70 72 65 73 73 22  ==0 ? "compress"
bdb0: 20 3a 20 22 75 6e 63 6f 6d 70 72 65 73 73 22 29   : "uncompress")
bdc0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
bdd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
bde0: 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 70  ite3Fts3ErrMsg(p
bdf0: 7a 45 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 25  zErr, "missing %
be00: 73 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 66  s parameter in f
be10: 74 73 34 20 63 6f 6e 73 74 72 75 63 74 6f 72 22  ts4 constructor"
be20: 2c 20 7a 4d 69 73 73 29 3b 0a 20 20 7d 0a 20 20  , zMiss);.  }.  
be30: 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74  p->zReadExprlist
be40: 20 3d 20 66 74 73 33 52 65 61 64 45 78 70 72 4c   = fts3ReadExprL
be50: 69 73 74 28 70 2c 20 7a 55 6e 63 6f 6d 70 72 65  ist(p, zUncompre
be60: 73 73 2c 20 26 72 63 29 3b 0a 20 20 70 2d 3e 7a  ss, &rc);.  p->z
be70: 57 72 69 74 65 45 78 70 72 6c 69 73 74 20 3d 20  WriteExprlist = 
be80: 66 74 73 33 57 72 69 74 65 45 78 70 72 4c 69 73  fts3WriteExprLis
be90: 74 28 70 2c 20 7a 43 6f 6d 70 72 65 73 73 2c 20  t(p, zCompress, 
bea0: 26 72 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  &rc);.  if( rc!=
beb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
bec0: 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a   fts3_init_out;.
bed0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
bee0: 20 61 6e 20 78 43 72 65 61 74 65 20 63 61 6c 6c   an xCreate call
bef0: 2c 20 63 72 65 61 74 65 20 74 68 65 20 75 6e 64  , create the und
bf00: 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 73 20 69  erlying tables i
bf10: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
bf20: 62 61 73 65 2e 20 54 4f 44 4f 3a 20 46 6f 72 20  base. TODO: For 
bf30: 78 43 6f 6e 6e 65 63 74 28 29 2c 20 69 74 20 63  xConnect(), it c
bf40: 6f 75 6c 64 20 76 65 72 69 66 79 20 74 68 61 74  ould verify that
bf50: 20 73 61 69 64 20 74 61 62 6c 65 73 20 65 78 69   said tables exi
bf60: 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  st..  */.  if( i
bf70: 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 72  sCreate ){.    r
bf80: 63 20 3d 20 66 74 73 33 43 72 65 61 74 65 54 61  c = fts3CreateTa
bf90: 62 6c 65 73 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  bles(p);.  }..  
bfa0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
bfb0: 69 66 20 61 20 6c 65 67 61 63 79 20 66 74 73 33  if a legacy fts3
bfc0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
bfd0: 22 75 70 67 72 61 64 65 64 22 20 62 79 20 74 68  "upgraded" by th
bfe0: 65 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 20  e.  ** addition 
bff0: 6f 66 20 61 20 25 5f 73 74 61 74 20 74 61 62 6c  of a %_stat tabl
c000: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  e so that it can
c010: 20 75 73 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   use incremental
c020: 20 6d 65 72 67 65 2e 0a 20 20 2a 2f 0a 20 20 69   merge..  */.  i
c030: 66 28 20 21 69 73 46 74 73 34 20 26 26 20 21 69  f( !isFts4 && !i
c040: 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 70  sCreate ){.    p
c050: 2d 3e 62 48 61 73 53 74 61 74 20 3d 20 32 3b 0a  ->bHasStat = 2;.
c060: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
c070: 20 6f 75 74 20 74 68 65 20 70 61 67 65 2d 73 69   out the page-si
c080: 7a 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ze for the datab
c090: 61 73 65 2e 20 54 68 69 73 20 69 73 20 72 65 71  ase. This is req
c0a0: 75 69 72 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uired in order t
c0b0: 6f 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  o.  ** estimate 
c0c0: 74 68 65 20 63 6f 73 74 20 6f 66 20 6c 6f 61 64  the cost of load
c0d0: 69 6e 67 20 6c 61 72 67 65 20 64 6f 63 6c 69 73  ing large doclis
c0e0: 74 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ts from the data
c0f0: 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 74 73 33  base.  */.  fts3
c100: 44 61 74 61 62 61 73 65 50 61 67 65 53 69 7a 65  DatabasePageSize
c110: 28 26 72 63 2c 20 70 29 3b 0a 20 20 70 2d 3e 6e  (&rc, p);.  p->n
c120: 4e 6f 64 65 53 69 7a 65 20 3d 20 70 2d 3e 6e 50  NodeSize = p->nP
c130: 67 73 7a 2d 33 35 3b 0a 0a 20 20 2f 2a 20 44 65  gsz-35;..  /* De
c140: 63 6c 61 72 65 20 74 68 65 20 74 61 62 6c 65 20  clare the table 
c150: 73 63 68 65 6d 61 20 74 6f 20 53 51 4c 69 74 65  schema to SQLite
c160: 2e 20 2a 2f 0a 20 20 66 74 73 33 44 65 63 6c 61  . */.  fts3Decla
c170: 72 65 56 74 61 62 28 26 72 63 2c 20 70 29 3b 0a  reVtab(&rc, p);.
c180: 0a 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3a 0a  .fts3_init_out:.
c190: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c1a0: 50 72 65 66 69 78 29 3b 0a 20 20 73 71 6c 69 74  Prefix);.  sqlit
c1b0: 65 33 5f 66 72 65 65 28 61 49 6e 64 65 78 29 3b  e3_free(aIndex);
c1c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
c1d0: 7a 43 6f 6d 70 72 65 73 73 29 3b 0a 20 20 73 71  zCompress);.  sq
c1e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 6e 63 6f  lite3_free(zUnco
c1f0: 6d 70 72 65 73 73 29 3b 0a 20 20 73 71 6c 69 74  mpress);.  sqlit
c200: 65 33 5f 66 72 65 65 28 7a 43 6f 6e 74 65 6e 74  e3_free(zContent
c210: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c220: 65 28 7a 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a  e(zLanguageid);.
c230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 6f    for(i=0; i<nNo
c240: 74 69 6e 64 65 78 65 64 3b 20 69 2b 2b 29 20 73  tindexed; i++) s
c250: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 4e 6f  qlite3_free(azNo
c260: 74 69 6e 64 65 78 65 64 5b 69 5d 29 3b 0a 20 20  tindexed[i]);.  
c270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f  sqlite3_free((vo
c280: 69 64 20 2a 29 61 43 6f 6c 29 3b 0a 20 20 73 71  id *)aCol);.  sq
c290: 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64  lite3_free((void
c2a0: 20 2a 29 61 7a 4e 6f 74 69 6e 64 65 78 65 64 29   *)azNotindexed)
c2b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
c2c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
c2d0: 20 70 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33   p ){.      fts3
c2e0: 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  DisconnectMethod
c2f0: 28 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  ((sqlite3_vtab *
c300: 29 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )p);.    }else i
c310: 66 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 29 7b  f( pTokenizer ){
c320: 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 69 7a 65  .      pTokenize
c330: 72 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 44 65 73  r->pModule->xDes
c340: 74 72 6f 79 28 70 54 6f 6b 65 6e 69 7a 65 72 29  troy(pTokenizer)
c350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
c360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
c370: 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a  pSegments==0 );.
c380: 20 20 20 20 2a 70 70 56 54 61 62 20 3d 20 26 70      *ppVTab = &p
c390: 2d 3e 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65  ->base;.  }.  re
c3a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c3b0: 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 28 29  * The xConnect()
c3c0: 20 61 6e 64 20 78 43 72 65 61 74 65 28 29 20 6d   and xCreate() m
c3d0: 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65 20 76  ethods for the v
c3e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 41 6c  irtual table. Al
c3f0: 6c 20 74 68 65 0a 2a 2a 20 77 6f 72 6b 20 69 73  l the.** work is
c400: 20 64 6f 6e 65 20 69 6e 20 66 75 6e 63 74 69 6f   done in functio
c410: 6e 20 66 74 73 33 49 6e 69 74 56 74 61 62 28 29  n fts3InitVtab()
c420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c430: 66 74 73 33 43 6f 6e 6e 65 63 74 4d 65 74 68 6f  fts3ConnectMetho
c440: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
c450: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c460: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
c470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c480: 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20 20 20   void *pAux,    
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
c4b0: 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61  okenizer hash ta
c4c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  ble */.  int arg
c4d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c4f0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
c500: 6e 20 61 72 67 76 20 61 72 72 61 79 20 2a 2f 0a  n argv array */.
c510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63    const char * c
c520: 6f 6e 73 74 20 2a 61 72 67 76 2c 20 20 20 20 20  onst *argv,     
c530: 20 20 2f 2a 20 78 43 72 65 61 74 65 2f 78 43 6f    /* xCreate/xCo
c540: 6e 6e 65 63 74 20 61 72 67 75 6d 65 6e 74 20 61  nnect argument a
c550: 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rray */.  sqlite
c560: 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
c570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
c580: 3a 20 4e 65 77 20 73 71 6c 69 74 65 33 5f 76 74  : New sqlite3_vt
c590: 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  ab object */.  c
c5a0: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c5c0: 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d  * OUT: sqlite3_m
c5d0: 61 6c 6c 6f 63 27 64 20 65 72 72 6f 72 20 6d 65  alloc'd error me
c5e0: 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  ssage */.){.  re
c5f0: 74 75 72 6e 20 66 74 73 33 49 6e 69 74 56 74 61  turn fts3InitVta
c600: 62 28 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61  b(0, db, pAux, a
c610: 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 74 61  rgc, argv, ppVta
c620: 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61  b, pzErr);.}.sta
c630: 74 69 63 20 69 6e 74 20 66 74 73 33 43 72 65 61  tic int fts3Crea
c640: 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69  teMethod(.  sqli
c650: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
c660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
c670: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c680: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
c690: 75 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ux,             
c6a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
c6b0: 65 72 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 20  er to tokenizer 
c6c0: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
c6d0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
c700: 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72  ments in argv ar
c710: 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ray */.  const c
c720: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67  har * const *arg
c730: 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65  v,       /* xCre
c740: 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67  ate/xConnect arg
c750: 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
c760: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
c770: 70 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20  ppVtab,         
c780: 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 73 71 6c   /* OUT: New sql
c790: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
c7a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
c7b0: 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
c7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71        /* OUT: sq
c7d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 65  lite3_malloc'd e
c7e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
c7f0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33  ){.  return fts3
c800: 49 6e 69 74 56 74 61 62 28 31 2c 20 64 62 2c 20  InitVtab(1, db, 
c810: 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76  pAux, argc, argv
c820: 2c 20 70 70 56 74 61 62 2c 20 70 7a 45 72 72 29  , ppVtab, pzErr)
c830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
c840: 68 65 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  he pIdxInfo->est
c850: 69 6d 61 74 65 64 52 6f 77 73 20 76 61 72 69 61  imatedRows varia
c860: 62 6c 65 20 74 6f 20 6e 52 6f 77 2e 20 55 6e 6c  ble to nRow. Unl
c870: 65 73 73 20 74 68 69 73 0a 2a 2a 20 65 78 74 65  ess this.** exte
c880: 6e 73 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  nsion is current
c890: 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79  ly being used by
c8a0: 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51   a version of SQ
c8b0: 4c 69 74 65 20 74 6f 6f 20 6f 6c 64 20 74 6f 0a  Lite too old to.
c8c0: 2a 2a 20 73 75 70 70 6f 72 74 20 65 73 74 69 6d  ** support estim
c8d0: 61 74 65 64 52 6f 77 73 2e 20 49 6e 20 74 68 61  atedRows. In tha
c8e0: 74 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  t case this func
c8f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
c900: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c910: 66 74 73 33 53 65 74 45 73 74 69 6d 61 74 65 64  fts3SetEstimated
c920: 52 6f 77 73 28 73 71 6c 69 74 65 33 5f 69 6e 64  Rows(sqlite3_ind
c930: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
c940: 6f 2c 20 69 36 34 20 6e 52 6f 77 29 7b 0a 23 69  o, i64 nRow){.#i
c950: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
c960: 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 38 30 30 32  _NUMBER>=3008002
c970: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6c  .  if( sqlite3_l
c980: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
c990: 28 29 3e 3d 33 30 30 38 30 30 32 20 29 7b 0a 20  ()>=3008002 ){. 
c9a0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
c9b0: 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 6e 52 6f  imatedRows = nRo
c9c0: 77 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  w;.  }.#endif.}.
c9d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  ./*.** Set the S
c9e0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
c9f0: 5f 55 4e 49 51 55 45 20 66 6c 61 67 20 69 6e 20  _UNIQUE flag in 
ca00: 70 49 64 78 49 6e 66 6f 2d 3e 66 6c 61 67 73 2e  pIdxInfo->flags.
ca10: 20 55 6e 6c 65 73 73 20 74 68 69 73 0a 2a 2a 20   Unless this.** 
ca20: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 63 75 72  extension is cur
ca30: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
ca40: 64 20 62 79 20 61 20 76 65 72 73 69 6f 6e 20 6f  d by a version o
ca50: 66 20 53 51 4c 69 74 65 20 74 6f 6f 20 6f 6c 64  f SQLite too old
ca60: 20 74 6f 0a 2a 2a 20 73 75 70 70 6f 72 74 20 69   to.** support i
ca70: 6e 64 65 78 2d 69 6e 66 6f 20 66 6c 61 67 73 2e  ndex-info flags.
ca80: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 74 68   In that case th
ca90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
caa0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
cab0: 63 20 76 6f 69 64 20 66 74 73 33 53 65 74 55 6e  c void fts3SetUn
cac0: 69 71 75 65 46 6c 61 67 28 73 71 6c 69 74 65 33  iqueFlag(sqlite3
cad0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
cae0: 78 49 6e 66 6f 29 7b 0a 23 69 66 20 53 51 4c 49  xInfo){.#if SQLI
caf0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
cb00: 52 3e 3d 33 30 30 38 30 31 32 0a 20 20 69 66 28  R>=3008012.  if(
cb10: 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73   sqlite3_libvers
cb20: 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 3e 3d 33 30  ion_number()>=30
cb30: 30 38 30 31 32 20 29 7b 0a 20 20 20 20 70 49 64  08012 ){.    pId
cb40: 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
cb50: 7c 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  |= SQLITE_INDEX_
cb60: 53 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 7d  SCAN_UNIQUE;.  }
cb70: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a  .#endif.}../* .*
cb80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
cb90: 20 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   of the xBestInd
cba0: 65 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 46 54  ex method for FT
cbb0: 53 33 20 74 61 62 6c 65 73 2e 20 54 68 65 72 65  S3 tables. There
cbc0: 0a 2a 2a 20 61 72 65 20 74 68 72 65 65 20 70 6f  .** are three po
cbd0: 73 73 69 62 6c 65 20 73 74 72 61 74 65 67 69 65  ssible strategie
cbe0: 73 2c 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 70  s, in order of p
cbf0: 72 65 66 65 72 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a  reference:.**.**
cc00: 20 20 20 31 2e 20 44 69 72 65 63 74 20 6c 6f 6f     1. Direct loo
cc10: 6b 75 70 20 62 79 20 72 6f 77 69 64 20 6f 72 20  kup by rowid or 
cc20: 64 6f 63 69 64 2e 20 0a 2a 2a 20 20 20 32 2e 20  docid. .**   2. 
cc30: 46 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68  Full-text search
cc40: 20 75 73 69 6e 67 20 61 20 4d 41 54 43 48 20 6f   using a MATCH o
cc50: 70 65 72 61 74 6f 72 20 6f 6e 20 61 20 6e 6f 6e  perator on a non
cc60: 2d 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a  -docid column..*
cc70: 2a 20 20 20 33 2e 20 4c 69 6e 65 61 72 20 73 63  *   3. Linear sc
cc80: 61 6e 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74 20  an of %_content 
cc90: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
cca0: 20 69 6e 74 20 66 74 73 33 42 65 73 74 49 6e 64   int fts3BestInd
ccb0: 65 78 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  exMethod(sqlite3
ccc0: 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71  _vtab *pVTab, sq
ccd0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
cce0: 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73 33   *pInfo){.  Fts3
ccf0: 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
cd00: 54 61 62 6c 65 20 2a 29 70 56 54 61 62 3b 0a 20  Table *)pVTab;. 
cd10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
cd40: 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  iable */.  int i
cd50: 43 6f 6e 73 20 3d 20 2d 31 3b 20 20 20 20 20 20  Cons = -1;      
cd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
cd70: 64 65 78 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  dex of constrain
cd80: 74 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 69  t to use */..  i
cd90: 6e 74 20 69 4c 61 6e 67 69 64 43 6f 6e 73 20 3d  nt iLangidCons =
cda0: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f   -1;           /
cdb0: 2a 20 49 6e 64 65 78 20 6f 66 20 6c 61 6e 67 69  * Index of langi
cdc0: 64 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  d=x constraint, 
cdd0: 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  if present */.  
cde0: 69 6e 74 20 69 44 6f 63 69 64 47 65 20 3d 20 2d  int iDocidGe = -
cdf0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
ce00: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 6f 63 69  /* Index of doci
ce10: 64 3e 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74 2c  d>=x constraint,
ce20: 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   if present */. 
ce30: 20 69 6e 74 20 69 44 6f 63 69 64 4c 65 20 3d 20   int iDocidLe = 
ce40: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
ce50: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 6f 63   /* Index of doc
ce60: 69 64 3c 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74  id<=x constraint
ce70: 2c 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a  , if present */.
ce80: 20 20 69 6e 74 20 69 49 64 78 3b 0a 0a 20 20 2f    int iIdx;..  /
ce90: 2a 20 42 79 20 64 65 66 61 75 6c 74 20 75 73 65  * By default use
cea0: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
ceb0: 61 6e 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  an. This is an e
cec0: 78 70 65 6e 73 69 76 65 20 6f 70 74 69 6f 6e 2c  xpensive option,
ced0: 0a 20 20 2a 2a 20 73 6f 20 73 65 61 72 63 68 20  .  ** so search 
cee0: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 73  through the cons
cef0: 74 72 61 69 6e 74 73 20 74 6f 20 73 65 65 20 69  traints to see i
cf00: 66 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65  f a more efficie
cf10: 6e 74 20 0a 20 20 2a 2a 20 73 74 72 61 74 65 67  nt .  ** strateg
cf20: 79 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 20  y is possible.. 
cf30: 20 2a 2f 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78   */.  pInfo->idx
cf40: 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 53  Num = FTS3_FULLS
cf50: 43 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 70 49  CAN_SEARCH;.  pI
cf60: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
cf70: 73 74 20 3d 20 35 30 30 30 30 30 30 3b 0a 20 20  st = 5000000;.  
cf80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 66 6f  for(i=0; i<pInfo
cf90: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
cfa0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 62 44 6f  ++){.    int bDo
cfb0: 63 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  cid;            
cfc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
cfd0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
cfe0: 69 73 20 6f 6e 20 64 6f 63 69 64 20 2a 2f 0a 20  is on docid */. 
cff0: 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
d000: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
d010: 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49 6e  nt *pCons = &pIn
d020: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  fo->aConstraint[
d030: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  i];.    if( pCon
d040: 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 7b 0a  s->usable==0 ){.
d050: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
d060: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
d070: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
d080: 43 48 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CH ){.        /*
d090: 20 54 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   There exists an
d0a0: 20 75 6e 75 73 61 62 6c 65 20 4d 41 54 43 48 20   unusable MATCH 
d0b0: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73  constraint. This
d0c0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 0a 20   means that if. 
d0d0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
d0e0: 61 6e 6e 65 72 20 64 6f 65 73 20 65 6c 65 63 74  anner does elect
d0f0: 20 74 6f 20 75 73 65 20 74 68 65 20 72 65 73 75   to use the resu
d100: 6c 74 73 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  lts of this call
d110: 20 61 73 20 70 61 72 74 0a 20 20 20 20 20 20 20   as part.       
d120: 20 2a 2a 20 6f 66 20 74 68 65 20 6f 76 65 72 61   ** of the overa
d130: 6c 6c 20 71 75 65 72 79 20 70 6c 61 6e 20 74 68  ll query plan th
d140: 65 20 75 73 65 72 20 77 69 6c 6c 20 73 65 65 20  e user will see 
d150: 61 6e 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73  an "unable to us
d160: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  e.        ** fun
d170: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
d180: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
d190: 74 65 78 74 22 20 65 72 72 6f 72 2e 20 54 6f 20  text" error. To 
d1a0: 64 69 73 63 6f 75 72 61 67 65 0a 20 20 20 20 20  discourage.     
d1b0: 20 20 20 2a 2a 20 74 68 69 73 2c 20 72 65 74 75     ** this, retu
d1c0: 72 6e 20 61 20 76 65 72 79 20 68 69 67 68 20 63  rn a very high c
d1d0: 6f 73 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  ost here.  */.  
d1e0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
d1f0: 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 53  Num = FTS3_FULLS
d200: 43 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 20 20  CAN_SEARCH;.    
d210: 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d      pInfo->estim
d220: 61 74 65 64 43 6f 73 74 20 3d 20 31 65 35 30 3b  atedCost = 1e50;
d230: 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65 74  .        fts3Set
d240: 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28 70 49  EstimatedRows(pI
d250: 6e 66 6f 2c 20 28 28 73 71 6c 69 74 65 33 5f 69  nfo, ((sqlite3_i
d260: 6e 74 36 34 29 31 29 20 3c 3c 20 35 30 29 3b 0a  nt64)1) << 50);.
d270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d280: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
d290: 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  }.      continue
d2a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 44 6f  ;.    }..    bDo
d2b0: 63 69 64 20 3d 20 28 70 43 6f 6e 73 2d 3e 69 43  cid = (pCons->iC
d2c0: 6f 6c 75 6d 6e 3c 30 20 7c 7c 20 70 43 6f 6e 73  olumn<0 || pCons
d2d0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43  ->iColumn==p->nC
d2e0: 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20 2f  olumn+1);..    /
d2f0: 2a 20 41 20 64 69 72 65 63 74 20 6c 6f 6f 6b 75  * A direct looku
d300: 70 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  p on the rowid o
d310: 72 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 20  r docid column. 
d320: 41 73 73 69 67 6e 20 61 20 63 6f 73 74 20 6f 66  Assign a cost of
d330: 20 31 2e 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28   1.0. */.    if(
d340: 20 69 43 6f 6e 73 3c 30 20 26 26 20 70 43 6f 6e   iCons<0 && pCon
d350: 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  s->op==SQLITE_IN
d360: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
d370: 51 20 26 26 20 62 44 6f 63 69 64 20 29 7b 0a 20  Q && bDocid ){. 
d380: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e       pInfo->idxN
d390: 75 6d 20 3d 20 46 54 53 33 5f 44 4f 43 49 44 5f  um = FTS3_DOCID_
d3a0: 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 70 49  SEARCH;.      pI
d3b0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
d3c0: 73 74 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  st = 1.0;.      
d3d0: 69 43 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 7d  iCons = i;.    }
d3e0: 0a 0a 20 20 20 20 2f 2a 20 41 20 4d 41 54 43 48  ..    /* A MATCH
d3f0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 55 73 65   constraint. Use
d400: 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65 61   a full-text sea
d410: 72 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rch..    **.    
d420: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6d  ** If there is m
d430: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 4d 41 54  ore than one MAT
d440: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 76  CH constraint av
d450: 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65  ailable, use the
d460: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 6f 6e   first.    ** on
d470: 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 49  e encountered. I
d480: 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
d490: 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61 69  a MATCH constrai
d4a0: 6e 74 20 61 6e 64 20 61 20 64 69 72 65 63 74 0a  nt and a direct.
d4b0: 20 20 20 20 2a 2a 20 72 6f 77 69 64 2f 64 6f 63      ** rowid/doc
d4c0: 69 64 20 6c 6f 6f 6b 75 70 2c 20 70 72 65 66 65  id lookup, prefe
d4d0: 72 20 74 68 65 20 4d 41 54 43 48 20 73 74 72 61  r the MATCH stra
d4e0: 74 65 67 79 2e 20 54 68 69 73 20 69 73 20 64 6f  tegy. This is do
d4f0: 6e 65 20 65 76 65 6e 20 0a 20 20 20 20 2a 2a 20  ne even .    ** 
d500: 74 68 6f 75 67 68 20 74 68 65 20 72 6f 77 69 64  though the rowid
d510: 2f 64 6f 63 69 64 20 6c 6f 6f 6b 75 70 20 69 73  /docid lookup is
d520: 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20 4d   faster than a M
d530: 41 54 43 48 20 71 75 65 72 79 2c 20 73 65 6c 65  ATCH query, sele
d540: 63 74 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74 20  cting.    ** it 
d550: 77 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 6e  would lead to an
d560: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
d570: 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69  function MATCH i
d580: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
d590: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 78 74 22  .    ** context"
d5a0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
d5b0: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70     if( pCons->op
d5c0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
d5d0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20  ONSTRAINT_MATCH 
d5e0: 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 2d 3e  .     && pCons->
d5f0: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 43  iColumn>=0 && pC
d600: 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3c 3d 70 2d  ons->iColumn<=p-
d610: 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a  >nColumn.    ){.
d620: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
d630: 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c 54  Num = FTS3_FULLT
d640: 45 58 54 5f 53 45 41 52 43 48 20 2b 20 70 43 6f  EXT_SEARCH + pCo
d650: 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ns->iColumn;.   
d660: 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61     pInfo->estima
d670: 74 65 64 43 6f 73 74 20 3d 20 32 2e 30 3b 0a 20  tedCost = 2.0;. 
d680: 20 20 20 20 20 69 43 6f 6e 73 20 3d 20 69 3b 0a       iCons = i;.
d690: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 71      }..    /* Eq
d6a0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
d6b0: 74 20 6f 6e 20 74 68 65 20 6c 61 6e 67 69 64 20  t on the langid 
d6c0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 69 66  column */.    if
d6d0: 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c  ( pCons->op==SQL
d6e0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
d6f0: 41 49 4e 54 5f 45 51 20 0a 20 20 20 20 20 26 26  AINT_EQ .     &&
d700: 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3d   pCons->iColumn=
d710: 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 0a  =p->nColumn + 2.
d720: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4c 61      ){.      iLa
d730: 6e 67 69 64 43 6f 6e 73 20 3d 20 69 3b 0a 20 20  ngidCons = i;.  
d740: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 44 6f    }..    if( bDo
d750: 63 69 64 20 29 7b 0a 20 20 20 20 20 20 73 77 69  cid ){.      swi
d760: 74 63 68 28 20 70 43 6f 6e 73 2d 3e 6f 70 20 29  tch( pCons->op )
d770: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  {.        case S
d780: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
d790: 54 52 41 49 4e 54 5f 47 45 3a 0a 20 20 20 20 20  TRAINT_GE:.     
d7a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
d7b0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
d7c0: 47 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69 44  GT:.          iD
d7d0: 6f 63 69 64 47 65 20 3d 20 69 3b 0a 20 20 20 20  ocidGe = i;.    
d7e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
d7f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
d800: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
d810: 4e 54 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20 63  NT_LE:.        c
d820: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
d830: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a 0a  _CONSTRAINT_LT:.
d840: 20 20 20 20 20 20 20 20 20 20 69 44 6f 63 69 64            iDocid
d850: 4c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  Le = i;.        
d860: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
d870: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d880: 20 49 66 20 75 73 69 6e 67 20 61 20 64 6f 63 69   If using a doci
d890: 64 3d 3f 20 6f 72 20 72 6f 77 69 64 3d 3f 20 73  d=? or rowid=? s
d8a0: 74 72 61 74 65 67 79 2c 20 73 65 74 20 74 68 65  trategy, set the
d8b0: 20 55 4e 49 51 55 45 20 66 6c 61 67 2e 20 2a 2f   UNIQUE flag. */
d8c0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 69 64  .  if( pInfo->id
d8d0: 78 4e 75 6d 3d 3d 46 54 53 33 5f 44 4f 43 49 44  xNum==FTS3_DOCID
d8e0: 5f 53 45 41 52 43 48 20 29 20 66 74 73 33 53 65  _SEARCH ) fts3Se
d8f0: 74 55 6e 69 71 75 65 46 6c 61 67 28 70 49 6e 66  tUniqueFlag(pInf
d900: 6f 29 3b 0a 0a 20 20 69 49 64 78 20 3d 20 31 3b  o);..  iIdx = 1;
d910: 0a 20 20 69 66 28 20 69 43 6f 6e 73 3e 3d 30 20  .  if( iCons>=0 
d920: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  ){.    pInfo->aC
d930: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d940: 43 6f 6e 73 5d 2e 61 72 67 76 49 6e 64 65 78 20  Cons].argvIndex 
d950: 3d 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 70 49  = iIdx++;.    pI
d960: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
d970: 55 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 6f 6d 69  Usage[iCons].omi
d980: 74 20 3d 20 31 3b 0a 20 20 7d 20 0a 20 20 69 66  t = 1;.  } .  if
d990: 28 20 69 4c 61 6e 67 69 64 43 6f 6e 73 3e 3d 30  ( iLangidCons>=0
d9a0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69   ){.    pInfo->i
d9b0: 64 78 4e 75 6d 20 7c 3d 20 46 54 53 33 5f 48 41  dxNum |= FTS3_HA
d9c0: 56 45 5f 4c 41 4e 47 49 44 3b 0a 20 20 20 20 70  VE_LANGID;.    p
d9d0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
d9e0: 74 55 73 61 67 65 5b 69 4c 61 6e 67 69 64 43 6f  tUsage[iLangidCo
d9f0: 6e 73 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  ns].argvIndex = 
da00: 69 49 64 78 2b 2b 3b 0a 20 20 7d 20 0a 20 20 69  iIdx++;.  } .  i
da10: 66 28 20 69 44 6f 63 69 64 47 65 3e 3d 30 20 29  f( iDocidGe>=0 )
da20: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78  {.    pInfo->idx
da30: 4e 75 6d 20 7c 3d 20 46 54 53 33 5f 48 41 56 45  Num |= FTS3_HAVE
da40: 5f 44 4f 43 49 44 5f 47 45 3b 0a 20 20 20 20 70  _DOCID_GE;.    p
da50: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
da60: 74 55 73 61 67 65 5b 69 44 6f 63 69 64 47 65 5d  tUsage[iDocidGe]
da70: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 49 64  .argvIndex = iId
da80: 78 2b 2b 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20  x++;.  } .  if( 
da90: 69 44 6f 63 69 64 4c 65 3e 3d 30 20 29 7b 0a 20  iDocidLe>=0 ){. 
daa0: 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d     pInfo->idxNum
dab0: 20 7c 3d 20 46 54 53 33 5f 48 41 56 45 5f 44 4f   |= FTS3_HAVE_DO
dac0: 43 49 44 5f 4c 45 3b 0a 20 20 20 20 70 49 6e 66  CID_LE;.    pInf
dad0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
dae0: 61 67 65 5b 69 44 6f 63 69 64 4c 65 5d 2e 61 72  age[iDocidLe].ar
daf0: 67 76 49 6e 64 65 78 20 3d 20 69 49 64 78 2b 2b  gvIndex = iIdx++
db00: 3b 0a 20 20 7d 20 0a 0a 20 20 2f 2a 20 52 65 67  ;.  } ..  /* Reg
db10: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
db20: 74 72 61 74 65 67 79 20 73 65 6c 65 63 74 65 64  trategy selected
db30: 2c 20 46 54 53 20 63 61 6e 20 64 65 6c 69 76 65  , FTS can delive
db40: 72 20 72 6f 77 73 20 69 6e 20 72 6f 77 69 64 20  r rows in rowid 
db50: 28 6f 72 0a 20 20 2a 2a 20 64 6f 63 69 64 29 20  (or.  ** docid) 
db60: 6f 72 64 65 72 2e 20 42 6f 74 68 20 61 73 63 65  order. Both asce
db70: 6e 64 69 6e 67 20 61 6e 64 20 64 65 73 63 65 6e  nding and descen
db80: 64 69 6e 67 20 61 72 65 20 70 6f 73 73 69 62 6c  ding are possibl
db90: 65 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e. .  */.  if( p
dba0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d  Info->nOrderBy==
dbb0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
dbc0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
dbd0: 64 65 72 62 79 20 2a 70 4f 72 64 65 72 20 3d 20  derby *pOrder = 
dbe0: 26 70 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  &pInfo->aOrderBy
dbf0: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  [0];.    if( pOr
dc00: 64 65 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 7c  der->iColumn<0 |
dc10: 7c 20 70 4f 72 64 65 72 2d 3e 69 43 6f 6c 75 6d  | pOrder->iColum
dc20: 6e 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 20  n==p->nColumn+1 
dc30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  ){.      if( pOr
dc40: 64 65 72 2d 3e 64 65 73 63 20 29 7b 0a 20 20 20  der->desc ){.   
dc50: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 53       pInfo->idxS
dc60: 74 72 20 3d 20 22 44 45 53 43 22 3b 0a 20 20 20  tr = "DESC";.   
dc70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dc80: 20 20 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20    pInfo->idxStr 
dc90: 3d 20 22 41 53 43 22 3b 0a 20 20 20 20 20 20 7d  = "ASC";.      }
dca0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6f 72  .      pInfo->or
dcb0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
dcc0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
dcd0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d  assert( p->pSegm
dce0: 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ents==0 );.  ret
dcf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dd00: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
dd10: 74 61 74 69 6f 6e 20 6f 66 20 78 4f 70 65 6e 20  tation of xOpen 
dd20: 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
dd30: 63 20 69 6e 74 20 66 74 73 33 4f 70 65 6e 4d 65  c int fts3OpenMe
dd40: 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
dd50: 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
dd60: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
dd70: 70 70 43 73 72 29 7b 0a 20 20 73 71 6c 69 74 65  ppCsr){.  sqlite
dd80: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
dd90: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
dda0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
ddb0: 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 55 4e 55  cursor */..  UNU
ddc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
ddd0: 54 61 62 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  Tab);..  /* Allo
dde0: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 6c 61  cate a buffer la
ddf0: 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  rge enough for a
de00: 6e 20 46 74 73 33 43 75 72 73 6f 72 20 73 74 72  n Fts3Cursor str
de10: 75 63 74 75 72 65 2e 20 49 66 20 74 68 65 0a 20  ucture. If the. 
de20: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   ** allocation s
de30: 75 63 63 65 65 64 73 2c 20 7a 65 72 6f 20 69 74  ucceeds, zero it
de40: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
de50: 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
de60: 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61  , .  ** if the a
de70: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
de80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de90: 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  OMEM..  */.  *pp
dea0: 43 73 72 20 3d 20 70 43 73 72 20 3d 20 28 73 71  Csr = pCsr = (sq
deb0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
dec0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
ded0: 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 43 75  oc(sizeof(Fts3Cu
dee0: 72 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 21 70  rsor));.  if( !p
def0: 43 73 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Csr ){.    retur
df00: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
df10: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 73    }.  memset(pCs
df20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
df30: 33 43 75 72 73 6f 72 29 29 3b 0a 20 20 72 65 74  3Cursor));.  ret
df40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
df50: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65  ../*.** Finalize
df60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
df70: 61 6e 64 6c 65 20 61 74 20 70 43 73 72 2d 3e 70  andle at pCsr->p
df80: 53 74 6d 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  Stmt..**.** Or, 
df90: 69 66 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  if that statemen
dfa0: 74 20 68 61 6e 64 6c 65 20 69 73 20 6f 6e 65 20  t handle is one 
dfb0: 63 72 65 61 74 65 64 20 62 79 20 66 74 73 33 43  created by fts3C
dfc0: 75 72 73 6f 72 53 65 65 6b 53 74 6d 74 28 29 2c  ursorSeekStmt(),
dfd0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 46 74 73 33  .** and the Fts3
dfe0: 54 61 62 6c 65 2e 70 53 65 65 6b 53 74 6d 74 20  Table.pSeekStmt 
dff0: 73 6c 6f 74 20 69 73 20 63 75 72 72 65 6e 74 6c  slot is currentl
e000: 79 20 4e 55 4c 4c 2c 20 73 61 76 65 20 74 68 65  y NULL, save the
e010: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 70 6f   statement.** po
e020: 69 6e 74 65 72 20 74 68 65 72 65 20 69 6e 73 74  inter there inst
e030: 65 61 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  ead of finalizin
e040: 67 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  g it..*/.static 
e050: 76 6f 69 64 20 66 74 73 33 43 75 72 73 6f 72 46  void fts3CursorF
e060: 69 6e 61 6c 69 7a 65 53 74 6d 74 28 46 74 73 33  inalizeStmt(Fts3
e070: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
e080: 20 69 66 28 20 70 43 73 72 2d 3e 62 53 65 65 6b   if( pCsr->bSeek
e090: 53 74 6d 74 20 29 7b 0a 20 20 20 20 46 74 73 33  Stmt ){.    Fts3
e0a0: 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
e0b0: 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
e0c0: 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 69 66  se.pVtab;.    if
e0d0: 28 20 70 2d 3e 70 53 65 65 6b 53 74 6d 74 3d 3d  ( p->pSeekStmt==
e0e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53  0 ){.      p->pS
e0f0: 65 65 6b 53 74 6d 74 20 3d 20 70 43 73 72 2d 3e  eekStmt = pCsr->
e100: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c  pStmt;.      sql
e110: 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
e120: 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70  >pStmt);.      p
e130: 43 73 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  Csr->pStmt = 0;.
e140: 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e      }.    pCsr->
e150: 62 53 65 65 6b 53 74 6d 74 20 3d 20 30 3b 0a 20  bSeekStmt = 0;. 
e160: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
e170: 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d  alize(pCsr->pStm
e180: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  t);.}../*.** Fre
e190: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20  e all resources 
e1a0: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
e1b0: 79 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  y the cursor pas
e1c0: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a  sed as the only.
e1d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
e1e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
e1f0: 43 6c 65 61 72 43 75 72 73 6f 72 28 46 74 73 33  ClearCursor(Fts3
e200: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
e210: 20 66 74 73 33 43 75 72 73 6f 72 46 69 6e 61 6c   fts3CursorFinal
e220: 69 7a 65 53 74 6d 74 28 70 43 73 72 29 3b 0a 20  izeStmt(pCsr);. 
e230: 20 73 71 6c 69 74 65 33 46 74 73 33 46 72 65 65   sqlite3Fts3Free
e240: 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 73 28 70  DeferredTokens(p
e250: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Csr);.  sqlite3_
e260: 66 72 65 65 28 70 43 73 72 2d 3e 61 44 6f 63 6c  free(pCsr->aDocl
e270: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ist);.  sqlite3F
e280: 74 73 33 4d 49 42 75 66 66 65 72 46 72 65 65 28  ts3MIBufferFree(
e290: 70 43 73 72 2d 3e 70 4d 49 42 75 66 66 65 72 29  pCsr->pMIBuffer)
e2a0: 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 45  ;.  sqlite3Fts3E
e2b0: 78 70 72 46 72 65 65 28 70 43 73 72 2d 3e 70 45  xprFree(pCsr->pE
e2c0: 78 70 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  xpr);.  memset(&
e2d0: 28 26 70 43 73 72 2d 3e 62 61 73 65 29 5b 31 5d  (&pCsr->base)[1]
e2e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33  , 0, sizeof(Fts3
e2f0: 43 75 72 73 6f 72 29 2d 73 69 7a 65 6f 66 28 73  Cursor)-sizeof(s
e300: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e310: 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  or));.}../*.** C
e320: 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
e330: 20 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c    For additional
e340: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65 65   information see
e350: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
e360: 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43 6c  on.** on the xCl
e370: 6f 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  ose method of th
e380: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
e390: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
e3a0: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6c 6f  atic int fts3Clo
e3b0: 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  seMethod(sqlite3
e3c0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43  _vtab_cursor *pC
e3d0: 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 43 75  ursor){.  Fts3Cu
e3e0: 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74  rsor *pCsr = (Ft
e3f0: 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73  s3Cursor *)pCurs
e400: 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  or;.  assert( ((
e410: 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
e420: 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e 70  ->base.pVtab)->p
e430: 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20  Segments==0 );. 
e440: 20 66 74 73 33 43 6c 65 61 72 43 75 72 73 6f 72   fts3ClearCursor
e450: 28 70 43 73 72 29 3b 0a 20 20 61 73 73 65 72 74  (pCsr);.  assert
e460: 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
e470: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
e480: 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  )->pSegments==0 
e490: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
e4a0: 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
e4b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e4c0: 2f 2a 0a 2a 2a 20 49 66 20 70 43 73 72 2d 3e 70  /*.** If pCsr->p
e4d0: 53 74 6d 74 20 68 61 73 20 6e 6f 74 20 62 65 65  Stmt has not bee
e4e0: 6e 20 70 72 65 70 61 72 65 64 20 28 69 2e 65 2e  n prepared (i.e.
e4f0: 20 69 66 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d   if pCsr->pStmt=
e500: 3d 30 29 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6d  =0), then.** com
e510: 70 6f 73 65 20 61 6e 64 20 70 72 65 70 61 72 65  pose and prepare
e520: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
e530: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  t of the form:.*
e540: 2a 0a 2a 2a 20 20 20 20 22 53 45 4c 45 43 54 20  *.**    "SELECT 
e550: 3c 63 6f 6c 75 6d 6e 73 3e 20 46 52 4f 4d 20 25  <columns> FROM %
e560: 5f 63 6f 6e 74 65 6e 74 20 57 48 45 52 45 20 72  _content WHERE r
e570: 6f 77 69 64 20 3d 20 3f 22 0a 2a 2a 0a 2a 2a 20  owid = ?".**.** 
e580: 28 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65  (or the equivale
e590: 6e 74 20 66 6f 72 20 61 20 63 6f 6e 74 65 6e 74  nt for a content
e5a0: 3d 78 78 78 20 74 61 62 6c 65 29 20 61 6e 64 20  =xxx table) and 
e5b0: 73 65 74 20 70 43 73 72 2d 3e 70 53 74 6d 74 20  set pCsr->pStmt 
e5c0: 74 6f 0a 2a 2a 20 69 74 2e 20 49 66 20 61 6e 20  to.** it. If an 
e5d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
e5e0: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
e5f0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
e600: 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 75 72  atic int fts3Cur
e610: 73 6f 72 53 65 65 6b 53 74 6d 74 28 46 74 73 33  sorSeekStmt(Fts3
e620: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
e630: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e640: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  _OK;.  if( pCsr-
e650: 3e 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  >pStmt==0 ){.   
e660: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
e670: 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
e680: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
e690: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
e6a0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 65 6b 53     if( p->pSeekS
e6b0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 70 43 73  tmt ){.      pCs
e6c0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 2d 3e 70 53  r->pStmt = p->pS
e6d0: 65 65 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 70  eekStmt;.      p
e6e0: 2d 3e 70 53 65 65 6b 53 74 6d 74 20 3d 20 30 3b  ->pSeekStmt = 0;
e6f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e700: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
e710: 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
e720: 20 25 73 20 57 48 45 52 45 20 72 6f 77 69 64 20   %s WHERE rowid 
e730: 3d 20 3f 22 2c 20 70 2d 3e 7a 52 65 61 64 45 78  = ?", p->zReadEx
e740: 70 72 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69  prlist);.      i
e750: 66 28 20 21 7a 53 71 6c 20 29 20 72 65 74 75 72  f( !zSql ) retur
e760: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e770: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e780: 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28 70 2d  e3_prepare_v3(p-
e790: 3e 64 62 2c 20 7a 53 71 6c 2c 2d 31 2c 53 51 4c  >db, zSql,-1,SQL
e7a0: 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45 52 53  ITE_PREPARE_PERS
e7b0: 49 53 54 45 4e 54 2c 26 70 43 73 72 2d 3e 70 53  ISTENT,&pCsr->pS
e7c0: 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20 73 71  tmt,0);.      sq
e7d0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
e7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e7f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
e800: 70 43 73 72 2d 3e 62 53 65 65 6b 53 74 6d 74 20  pCsr->bSeekStmt 
e810: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
e820: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
e830: 6f 73 69 74 69 6f 6e 20 74 68 65 20 70 43 73 72  osition the pCsr
e840: 2d 3e 70 53 74 6d 74 20 73 74 61 74 65 6d 65 6e  ->pStmt statemen
e850: 74 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  t so that it is 
e860: 6f 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 6f 66  on the row.** of
e870: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
e880: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
e890: 6e 73 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63  ns the last matc
e8a0: 68 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51  h.  Return.** SQ
e8b0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e8c0: 73 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ss.  .*/.static 
e8d0: 69 6e 74 20 66 74 73 33 43 75 72 73 6f 72 53 65  int fts3CursorSe
e8e0: 65 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  ek(sqlite3_conte
e8f0: 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 46 74  xt *pContext, Ft
e900: 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  s3Cursor *pCsr){
e910: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e920: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73  TE_OK;.  if( pCs
e930: 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b  r->isRequireSeek
e940: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
e950: 33 43 75 72 73 6f 72 53 65 65 6b 53 74 6d 74 28  3CursorSeekStmt(
e960: 70 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCsr);.    if( r
e970: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
e990: 6e 64 5f 69 6e 74 36 34 28 70 43 73 72 2d 3e 70  nd_int64(pCsr->p
e9a0: 53 74 6d 74 2c 20 31 2c 20 70 43 73 72 2d 3e 69  Stmt, 1, pCsr->i
e9b0: 50 72 65 76 49 64 29 3b 0a 20 20 20 20 20 20 70  PrevId);.      p
e9c0: 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65 53 65  Csr->isRequireSe
e9d0: 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ek = 0;.      if
e9e0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
e9f0: 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
ea00: 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
ea10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ea20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
ea30: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ea40: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73  qlite3_reset(pCs
ea50: 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  r->pStmt);.     
ea60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ea70: 45 5f 4f 4b 20 26 26 20 28 28 46 74 73 33 54 61  E_OK && ((Fts3Ta
ea80: 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
ea90: 2e 70 56 74 61 62 29 2d 3e 7a 43 6f 6e 74 65 6e  .pVtab)->zConten
eaa0: 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tTbl==0 ){.     
eab0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 72 6f       /* If no ro
eac0: 77 20 77 61 73 20 66 6f 75 6e 64 20 61 6e 64 20  w was found and 
ead0: 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
eae0: 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
eaf0: 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 20 20 20 20  %_content.      
eb00: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 73 20      ** table is 
eb10: 6d 69 73 73 69 6e 67 20 61 20 72 6f 77 20 74 68  missing a row th
eb20: 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  at is present in
eb30: 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69   the full-text i
eb40: 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20  ndex..          
eb50: 2a 2a 20 54 68 65 20 64 61 74 61 20 73 74 72 75  ** The data stru
eb60: 63 74 75 72 65 73 20 61 72 65 20 63 6f 72 72 75  ctures are corru
eb70: 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  pt.  */.        
eb80: 20 20 72 63 20 3d 20 46 54 53 5f 43 4f 52 52 55    rc = FTS_CORRU
eb90: 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20 20 20  PT_VTAB;.       
eba0: 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d     pCsr->isEof =
ebb0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ebc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ebd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ebe0: 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 74 65 78 74  E_OK && pContext
ebf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ec00: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
ec10: 65 28 70 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b  e(pContext, rc);
ec20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ec30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
ec40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
ec50: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 73 69   to process a si
ec60: 6e 67 6c 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f  ngle interior no
ec70: 64 65 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e  de when searchin
ec80: 67 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20 66 6f  g.** a b-tree fo
ec90: 72 20 61 20 74 65 72 6d 20 6f 72 20 74 65 72 6d  r a term or term
eca0: 20 70 72 65 66 69 78 2e 20 54 68 65 20 6e 6f 64   prefix. The nod
ecb0: 65 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  e data is passed
ecc0: 20 74 6f 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e   to this .** fun
ecd0: 63 74 69 6f 6e 20 76 69 61 20 74 68 65 20 7a 4e  ction via the zN
ece0: 6f 64 65 2f 6e 4e 6f 64 65 20 70 61 72 61 6d 65  ode/nNode parame
ecf0: 74 65 72 73 2e 20 54 68 65 20 74 65 72 6d 20 74  ters. The term t
ed00: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 69 73 0a  o search for is.
ed10: 2a 2a 20 70 61 73 73 65 64 20 69 6e 20 7a 54 65  ** passed in zTe
ed20: 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  rm/nTerm..**.** 
ed30: 49 66 20 70 69 46 69 72 73 74 20 69 73 20 6e 6f  If piFirst is no
ed40: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  t NULL, then thi
ed50: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
ed60: 2a 70 69 46 69 72 73 74 20 74 6f 20 74 68 65 20  *piFirst to the 
ed70: 62 6c 6f 63 6b 69 64 0a 2a 2a 20 6f 66 20 74 68  blockid.** of th
ed80: 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 74 68 61  e child node tha
ed90: 74 20 68 65 61 64 73 20 74 68 65 20 73 75 62 2d  t heads the sub-
eda0: 74 72 65 65 20 74 68 61 74 20 6d 61 79 20 63 6f  tree that may co
edb0: 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d 2e 0a  ntain the term..
edc0: 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c 61 73 74 20  **.** If piLast 
edd0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
ede0: 6e 20 2a 70 69 4c 61 73 74 20 69 73 20 73 65 74  n *piLast is set
edf0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
ee00: 73 74 20 63 68 69 6c 64 20 6e 6f 64 65 0a 2a 2a  st child node.**
ee10: 20 74 68 61 74 20 68 65 61 64 73 20 61 20 73 75   that heads a su
ee20: 62 2d 74 72 65 65 20 74 68 61 74 20 6d 61 79 20  b-tree that may 
ee30: 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20 66  contain a term f
ee40: 6f 72 20 77 68 69 63 68 20 7a 54 65 72 6d 2f 6e  or which zTerm/n
ee50: 54 65 72 6d 20 69 73 0a 2a 2a 20 61 20 70 72 65  Term is.** a pre
ee60: 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  fix..**.** If an
ee70: 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
ee80: 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
ee90: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
eea0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
eeb0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
eec0: 20 66 74 73 33 53 63 61 6e 49 6e 74 65 72 69 6f   fts3ScanInterio
eed0: 72 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  rNode(.  const c
eee0: 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
eef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
ef00: 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61 76 65   to select leave
ef10: 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  s for */.  int n
ef20: 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
ef30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
ef40: 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d  ze of term zTerm
ef50: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
ef60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 64 65  onst char *zNode
ef70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ef80: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
ef90: 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e 74 65  ing segment inte
efa0: 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rior node */.  i
efb0: 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
efd0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
efe0: 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73   at zNode */.  s
eff0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
f000: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 2f  First,         /
f010: 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64 20  * OUT: Selected 
f020: 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 20 20  child node */.  
f030: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
f040: 69 4c 61 73 74 20 20 20 20 20 20 20 20 20 20 20  iLast           
f050: 2f 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65 64  /* OUT: Selected
f060: 20 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a 29   child node */.)
f070: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f080: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
f090: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f0a0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
f0b0: 61 72 20 2a 7a 43 73 72 20 3d 20 7a 4e 6f 64 65  ar *zCsr = zNode
f0c0: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ;       /* Curso
f0d0: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
f0e0: 6f 75 67 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 63  ough node */.  c
f0f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20  onst char *zEnd 
f100: 3d 20 26 7a 43 73 72 5b 6e 4e 6f 64 65 5d 3b 2f  = &zCsr[nNode];/
f110: 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72 69 6f  * End of interio
f120: 72 20 6e 6f 64 65 20 62 75 66 66 65 72 20 2a 2f  r node buffer */
f130: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 66 65 72  .  char *zBuffer
f140: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f150: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
f160: 6c 6f 61 64 20 74 65 72 6d 73 20 69 6e 74 6f 20  load terms into 
f170: 2a 2f 0a 20 20 69 36 34 20 6e 41 6c 6c 6f 63 20  */.  i64 nAlloc 
f180: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f190: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f1a0: 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
f1b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 69 72 73   */.  int isFirs
f1c0: 74 54 65 72 6d 20 3d 20 31 3b 20 20 20 20 20 20  tTerm = 1;      
f1d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68        /* True wh
f1e0: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 66 69  en processing fi
f1f0: 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
f200: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
f210: 74 36 34 20 69 43 68 69 6c 64 3b 20 20 20 20 20  t64 iChild;     
f220: 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
f230: 64 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64 65 20  d of child node 
f240: 74 6f 20 64 65 73 63 65 6e 64 20 74 6f 20 2a 2f  to descend to */
f250: 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72  ..  /* Skip over
f260: 20 74 68 65 20 27 68 65 69 67 68 74 27 20 76 61   the 'height' va
f270: 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
f280: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
f290: 20 65 76 65 72 79 20 0a 20 20 2a 2a 20 69 6e 74   every .  ** int
f2a0: 65 72 69 6f 72 20 6e 6f 64 65 2e 20 54 68 65 6e  erior node. Then
f2b0: 20 6c 6f 61 64 20 74 68 65 20 62 6c 6f 63 6b 69   load the blocki
f2c0: 64 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 63 68  d of the left-ch
f2d0: 69 6c 64 20 6f 66 20 74 68 65 20 62 2d 74 72 65  ild of the b-tre
f2e0: 65 0a 20 20 2a 2a 20 6e 6f 64 65 20 69 6e 74 6f  e.  ** node into
f2f0: 20 76 61 72 69 61 62 6c 65 20 69 43 68 69 6c 64   variable iChild
f300: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  .  .  **.  ** Ev
f310: 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 20 73  en if the data s
f320: 74 72 75 63 74 75 72 65 20 6f 6e 20 64 69 73 6b  tructure on disk
f330: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
f340: 68 69 73 20 28 72 65 61 64 69 6e 67 20 74 77 6f  his (reading two
f350: 0a 20 20 2a 2a 20 76 61 72 69 6e 74 73 20 66 72  .  ** varints fr
f360: 6f 6d 20 74 68 65 20 62 75 66 66 65 72 29 20 64  om the buffer) d
f370: 6f 65 73 20 6e 6f 74 20 72 69 73 6b 20 61 6e 20  oes not risk an 
f380: 6f 76 65 72 72 65 61 64 2e 20 49 66 20 7a 4e 6f  overread. If zNo
f390: 64 65 20 69 73 20 61 0a 20 20 2a 2a 20 72 6f 6f  de is a.  ** roo
f3a0: 74 20 6e 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  t node, then the
f3b0: 20 62 75 66 66 65 72 20 63 6f 6d 65 73 20 66 72   buffer comes fr
f3c0: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
f3d0: 65 6d 65 6e 74 2e 20 53 51 4c 69 74 65 20 64 6f  ement. SQLite do
f3e0: 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 6d 61 6b 65  es.  ** not make
f3f0: 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 20   this guarantee 
f400: 65 78 70 6c 69 63 69 74 6c 79 2c 20 62 75 74 20  explicitly, but 
f410: 69 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 72  in practice ther
f420: 65 20 61 72 65 20 61 6c 77 61 79 73 0a 20 20 2a  e are always.  *
f430: 2a 20 65 69 74 68 65 72 20 6d 6f 72 65 20 74 68  * either more th
f440: 61 6e 20 32 30 20 62 79 74 65 73 20 6f 66 20 61  an 20 bytes of a
f450: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 66  llocated space f
f460: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6e 4e 6f  ollowing the nNo
f470: 64 65 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  de bytes of.  **
f480: 20 63 6f 6e 74 65 6e 74 73 2c 20 6f 72 20 74 77   contents, or tw
f490: 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 20 4f 72  o zero bytes. Or
f4a0: 2c 20 69 66 20 74 68 65 20 6e 6f 64 65 20 69 73  , if the node is
f4b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
f4c0: 5f 73 65 67 6d 65 6e 74 73 0a 20 20 2a 2a 20 74  _segments.  ** t
f4d0: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 72 65  able, then there
f4e0: 20 61 72 65 20 61 6c 77 61 79 73 20 32 30 20 62   are always 20 b
f4f0: 79 74 65 73 20 6f 66 20 7a 65 72 6f 65 64 20 70  ytes of zeroed p
f500: 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
f510: 20 74 68 65 0a 20 20 2a 2a 20 6e 4e 6f 64 65 20   the.  ** nNode 
f520: 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  bytes of content
f530: 20 28 73 65 65 20 73 71 6c 69 74 65 33 46 74 73   (see sqlite3Fts
f540: 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66 6f 72  3ReadBlock() for
f550: 20 64 65 74 61 69 6c 73 29 2e 0a 20 20 2a 2f 0a   details)..  */.
f560: 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65    zCsr += sqlite
f570: 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 7a  3Fts3GetVarint(z
f580: 43 73 72 2c 20 26 69 43 68 69 6c 64 29 3b 0a 20  Csr, &iChild);. 
f590: 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33   zCsr += sqlite3
f5a0: 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 7a 43  Fts3GetVarint(zC
f5b0: 73 72 2c 20 26 69 43 68 69 6c 64 29 3b 0a 20 20  sr, &iChild);.  
f5c0: 69 66 28 20 7a 43 73 72 3e 7a 45 6e 64 20 29 7b  if( zCsr>zEnd ){
f5d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53 5f  .    return FTS_
f5e0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
f5f0: 7d 0a 20 20 0a 20 20 77 68 69 6c 65 28 20 7a 43  }.  .  while( zC
f600: 73 72 3c 7a 45 6e 64 20 26 26 20 28 70 69 46 69  sr<zEnd && (piFi
f610: 72 73 74 20 7c 7c 20 70 69 4c 61 73 74 29 20 29  rst || piLast) )
f620: 7b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b 20 20  {.    int cmp;  
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 2f 2a 20 6d 65 6d 63 6d 70 28 29 20      /* memcmp() 
f650: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 69 6e  result */.    in
f660: 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20 20  t nSuffix;      
f670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
f680: 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66  ize of term suff
f690: 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  ix */.    int nP
f6a0: 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20 20 20  refix = 0;      
f6b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6c0: 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a  of term prefix *
f6d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 75 66 66 65  /.    int nBuffe
f6e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
f6f0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 65 72      /* Total ter
f700: 6d 20 73 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20  m size */.  .   
f710: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78   /* Load the nex
f720: 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 6f  t term on the no
f730: 64 65 20 69 6e 74 6f 20 7a 42 75 66 66 65 72 2e  de into zBuffer.
f740: 20 55 73 65 20 72 65 61 6c 6c 6f 63 28 29 20 74   Use realloc() t
f750: 6f 20 65 78 70 61 6e 64 0a 20 20 20 20 2a 2a 20  o expand.    ** 
f760: 74 68 65 20 73 69 7a 65 20 6f 66 20 7a 42 75 66  the size of zBuf
f770: 66 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e  fer if required.
f780: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
f790: 46 69 72 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  FirstTerm ){.   
f7a0: 20 20 20 7a 43 73 72 20 2b 3d 20 66 74 73 33 47     zCsr += fts3G
f7b0: 65 74 56 61 72 69 6e 74 33 32 28 7a 43 73 72 2c  etVarint32(zCsr,
f7c0: 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20   &nPrefix);.    
f7d0: 7d 0a 20 20 20 20 69 73 46 69 72 73 74 54 65 72  }.    isFirstTer
f7e0: 6d 20 3d 20 30 3b 0a 20 20 20 20 7a 43 73 72 20  m = 0;.    zCsr 
f7f0: 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
f800: 33 32 28 7a 43 73 72 2c 20 26 6e 53 75 66 66 69  32(zCsr, &nSuffi
f810: 78 29 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  x);.    .    ass
f820: 65 72 74 28 20 6e 50 72 65 66 69 78 3e 3d 30 20  ert( nPrefix>=0 
f830: 26 26 20 6e 53 75 66 66 69 78 3e 3d 30 20 29 3b  && nSuffix>=0 );
f840: 0a 20 20 20 20 69 66 28 20 6e 50 72 65 66 69 78  .    if( nPrefix
f850: 3e 7a 43 73 72 2d 7a 4e 6f 64 65 20 7c 7c 20 6e  >zCsr-zNode || n
f860: 53 75 66 66 69 78 3e 7a 45 6e 64 2d 7a 43 73 72  Suffix>zEnd-zCsr
f870: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
f880: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
f890: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69  .      goto fini
f8a0: 73 68 5f 73 63 61 6e 3b 0a 20 20 20 20 7d 0a 20  sh_scan;.    }. 
f8b0: 20 20 20 69 66 28 20 28 69 36 34 29 6e 50 72 65     if( (i64)nPre
f8c0: 66 69 78 2b 6e 53 75 66 66 69 78 3e 6e 41 6c 6c  fix+nSuffix>nAll
f8d0: 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  oc ){.      char
f8e0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 6e 41   *zNew;.      nA
f8f0: 6c 6c 6f 63 20 3d 20 28 28 69 36 34 29 6e 50 72  lloc = ((i64)nPr
f900: 65 66 69 78 2b 6e 53 75 66 66 69 78 29 20 2a 20  efix+nSuffix) * 
f910: 32 3b 0a 20 20 20 20 20 20 7a 4e 65 77 20 3d 20  2;.      zNew = 
f920: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
f930: 72 65 61 6c 6c 6f 63 36 34 28 7a 42 75 66 66 65  realloc64(zBuffe
f940: 72 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  r, nAlloc);.    
f950: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
f960: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f970: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f980: 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f 73 63    goto finish_sc
f990: 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  an;.      }.    
f9a0: 20 20 7a 42 75 66 66 65 72 20 3d 20 7a 4e 65 77    zBuffer = zNew
f9b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
f9c0: 72 74 28 20 7a 42 75 66 66 65 72 20 29 3b 0a 20  rt( zBuffer );. 
f9d0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 66     memcpy(&zBuff
f9e0: 65 72 5b 6e 50 72 65 66 69 78 5d 2c 20 7a 43 73  er[nPrefix], zCs
f9f0: 72 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  r, nSuffix);.   
fa00: 20 6e 42 75 66 66 65 72 20 3d 20 6e 50 72 65 66   nBuffer = nPref
fa10: 69 78 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20  ix + nSuffix;.  
fa20: 20 20 7a 43 73 72 20 2b 3d 20 6e 53 75 66 66 69    zCsr += nSuffi
fa30: 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  x;..    /* Compa
fa40: 72 65 20 74 68 65 20 74 65 72 6d 20 77 65 20 61  re the term we a
fa50: 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  re searching for
fa60: 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 6a   with the term j
fa70: 75 73 74 20 6c 6f 61 64 65 64 20 66 72 6f 6d 0a  ust loaded from.
fa80: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72      ** the inter
fa90: 69 6f 72 20 6e 6f 64 65 2e 20 49 66 20 74 68 65  ior node. If the
faa0: 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
fab0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
fac0: 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20  or equal.    ** 
fad0: 74 6f 20 74 68 65 20 74 65 72 6d 20 66 72 6f 6d  to the term from
fae0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
faf0: 64 65 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  de, then all ter
fb00: 6d 73 20 6f 6e 20 74 68 65 20 73 75 62 2d 74 72  ms on the sub-tr
fb10: 65 65 20 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  ee .    ** heade
fb20: 64 20 62 79 20 6e 6f 64 65 20 69 43 68 69 6c 64  d by node iChild
fb30: 20 61 72 65 20 73 6d 61 6c 6c 65 72 20 74 68 61   are smaller tha
fb40: 6e 20 7a 54 65 72 6d 2e 20 4e 6f 20 6e 65 65 64  n zTerm. No need
fb50: 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20 20 20   to search .    
fb60: 2a 2a 20 69 43 68 69 6c 64 2e 0a 20 20 20 20 2a  ** iChild..    *
fb70: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
fb80: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74 65  interior node te
fb90: 72 6d 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  rm is larger tha
fba0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
fbb0: 74 65 72 6d 2c 20 74 68 65 6e 0a 20 20 20 20 2a  term, then.    *
fbc0: 2a 20 74 68 65 20 74 72 65 65 20 68 65 61 64 65  * the tree heade
fbd0: 64 20 62 79 20 69 43 68 69 6c 64 20 6d 61 79 20  d by iChild may 
fbe0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63  contain the spec
fbf0: 69 66 69 65 64 20 74 65 72 6d 2e 0a 20 20 20 20  ified term..    
fc00: 2a 2f 0a 20 20 20 20 63 6d 70 20 3d 20 6d 65 6d  */.    cmp = mem
fc10: 63 6d 70 28 7a 54 65 72 6d 2c 20 7a 42 75 66 66  cmp(zTerm, zBuff
fc20: 65 72 2c 20 28 6e 42 75 66 66 65 72 3e 6e 54 65  er, (nBuffer>nTe
fc30: 72 6d 20 3f 20 6e 54 65 72 6d 20 3a 20 6e 42 75  rm ? nTerm : nBu
fc40: 66 66 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ffer));.    if( 
fc50: 70 69 46 69 72 73 74 20 26 26 20 28 63 6d 70 3c  piFirst && (cmp<
fc60: 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20 26 26 20  0 || (cmp==0 && 
fc70: 6e 42 75 66 66 65 72 3e 6e 54 65 72 6d 29 29 20  nBuffer>nTerm)) 
fc80: 29 7b 0a 20 20 20 20 20 20 2a 70 69 46 69 72 73  ){.      *piFirs
fc90: 74 20 3d 20 69 43 68 69 6c 64 3b 0a 20 20 20 20  t = iChild;.    
fca0: 20 20 70 69 46 69 72 73 74 20 3d 20 30 3b 0a 20    piFirst = 0;. 
fcb0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 69     }..    if( pi
fcc0: 4c 61 73 74 20 26 26 20 63 6d 70 3c 30 20 29 7b  Last && cmp<0 ){
fcd0: 0a 20 20 20 20 20 20 2a 70 69 4c 61 73 74 20 3d  .      *piLast =
fce0: 20 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 70   iChild;.      p
fcf0: 69 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  iLast = 0;.    }
fd00: 0a 0a 20 20 20 20 69 43 68 69 6c 64 2b 2b 3b 0a  ..    iChild++;.
fd10: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 70 69 46 69    };..  if( piFi
fd20: 72 73 74 20 29 20 2a 70 69 46 69 72 73 74 20 3d  rst ) *piFirst =
fd30: 20 69 43 68 69 6c 64 3b 0a 20 20 69 66 28 20 70   iChild;.  if( p
fd40: 69 4c 61 73 74 20 29 20 2a 70 69 4c 61 73 74 20  iLast ) *piLast 
fd50: 3d 20 69 43 68 69 6c 64 3b 0a 0a 20 66 69 6e 69  = iChild;.. fini
fd60: 73 68 5f 73 63 61 6e 3a 0a 20 20 73 71 6c 69 74  sh_scan:.  sqlit
fd70: 65 33 5f 66 72 65 65 28 7a 42 75 66 66 65 72 29  e3_free(zBuffer)
fd80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fd90: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 75 66  .../*.** The buf
fda0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
fdb0: 79 20 61 72 67 75 6d 65 6e 74 20 7a 4e 6f 64 65  y argument zNode
fdc0: 20 28 73 69 7a 65 20 6e 4e 6f 64 65 20 62 79 74   (size nNode byt
fdd0: 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a  es) contains an.
fde0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ** interior node
fdf0: 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 65 67   of a b-tree seg
fe00: 6d 65 6e 74 2e 20 54 68 65 20 7a 54 65 72 6d 20  ment. The zTerm 
fe10: 62 75 66 66 65 72 20 28 73 69 7a 65 20 6e 54 65  buffer (size nTe
fe20: 72 6d 20 62 79 74 65 73 29 0a 2a 2a 20 63 6f 6e  rm bytes).** con
fe30: 74 61 69 6e 73 20 61 20 74 65 72 6d 2e 20 54 68  tains a term. Th
fe40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
fe50: 63 68 65 73 20 74 68 65 20 73 75 62 2d 74 72 65  ches the sub-tre
fe60: 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20  e headed by the 
fe70: 7a 4e 6f 64 65 0a 2a 2a 20 6e 6f 64 65 20 66 6f  zNode.** node fo
fe80: 72 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 6c  r the range of l
fe90: 65 61 66 20 6e 6f 64 65 73 20 74 68 61 74 20 6d  eaf nodes that m
fea0: 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  ay contain the s
feb0: 70 65 63 69 66 69 65 64 20 74 65 72 6d 0a 2a 2a  pecified term.**
fec0: 20 6f 72 20 74 65 72 6d 73 20 66 6f 72 20 77 68   or terms for wh
fed0: 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ich the specifie
fee0: 64 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66  d term is a pref
fef0: 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c  ix..**.** If piL
ff00: 65 61 66 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  eaf is not NULL,
ff10: 20 74 68 65 6e 20 2a 70 69 4c 65 61 66 20 69 73   then *piLeaf is
ff20: 20 73 65 74 20 74 6f 20 74 68 65 20 62 6c 6f 63   set to the bloc
ff30: 6b 69 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6c  kid of the .** l
ff40: 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6e 6f  eft-most leaf no
ff50: 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  de in the tree t
ff60: 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  hat may contain 
ff70: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
ff80: 72 6d 2e 0a 2a 2a 20 49 66 20 70 69 4c 65 61 66  rm..** If piLeaf
ff90: 32 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  2 is not NULL, t
ffa0: 68 65 6e 20 2a 70 69 4c 65 61 66 32 20 69 73 20  hen *piLeaf2 is 
ffb0: 73 65 74 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b  set to the block
ffc0: 69 64 20 6f 66 20 74 68 65 0a 2a 2a 20 72 69 67  id of the.** rig
ffd0: 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6e 6f 64  ht-most leaf nod
ffe0: 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61  e that may conta
fff0: 69 6e 20 61 20 74 65 72 6d 20 66 6f 72 20 77 68  in a term for wh
10000 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ich the specifie
10010 64 0a 2a 2a 20 74 65 72 6d 20 69 73 20 61 20 70  d.** term is a p
10020 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  refix..**.** It 
10030 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
10040 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
10050 74 75 72 6e 65 64 20 6c 65 61 66 20 6e 6f 64 65  turned leaf node
10060 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  s does not conta
10070 69 6e 20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  in .** the speci
10080 66 69 65 64 20 74 65 72 6d 20 6f 72 20 61 6e 79  fied term or any
10090 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
100a0 20 69 74 20 69 73 20 61 20 70 72 65 66 69 78 2e   it is a prefix.
100b0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
100c0 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 64 6f 65   .** segment doe
100d0 73 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 73 75  s contain any su
100e0 63 68 20 74 65 72 6d 73 2c 20 74 68 65 79 20 61  ch terms, they a
100f0 72 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  re stored within
10100 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 0a   the identified.
10110 2a 2a 20 72 61 6e 67 65 2e 20 42 65 63 61 75 73  ** range. Becaus
10120 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
10130 6f 6e 6c 79 20 69 6e 73 70 65 63 74 73 20 69 6e  only inspects in
10140 74 65 72 69 6f 72 20 73 65 67 6d 65 6e 74 20 6e  terior segment n
10150 6f 64 65 73 20 28 61 6e 64 0a 2a 2a 20 6e 65 76  odes (and.** nev
10160 65 72 20 6c 6f 61 64 73 20 6c 65 61 66 20 6e 6f  er loads leaf no
10170 64 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 29  des into memory)
10180 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
10190 69 62 6c 65 20 74 6f 20 62 65 20 73 75 72 65 2e  ible to be sure.
101a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
101b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
101c0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
101d0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  han SQLITE_OK is
101e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73   returned..*/ .s
101f0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
10200 6c 65 63 74 4c 65 61 66 28 0a 20 20 46 74 73 33  lectLeaf(.  Fts3
10210 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
10220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
10230 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
10240 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
10250 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
10260 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
10270 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61 76 65   to select leave
10280 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  s for */.  int n
10290 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
102a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
102b0 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d  ze of term zTerm
102c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
102d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 64 65  onst char *zNode
102e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
102f0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
10300 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e 74 65  ing segment inte
10310 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rior node */.  i
10320 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10340 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
10350 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73   at zNode */.  s
10360 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
10370 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 2f  Leaf,          /
10380 2a 20 53 65 6c 65 63 74 65 64 20 6c 65 61 66 20  * Selected leaf 
10390 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
103a0 33 5f 69 6e 74 36 34 20 2a 70 69 4c 65 61 66 32  3_int64 *piLeaf2
103b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
103c0 65 63 74 65 64 20 6c 65 61 66 20 6e 6f 64 65 20  ected leaf node 
103d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
103e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
103f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10400 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
10410 69 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  iHeight;        
10420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10430 65 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f  eight of this no
10440 64 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 0a 20  de in tree */.. 
10450 20 61 73 73 65 72 74 28 20 70 69 4c 65 61 66 20   assert( piLeaf 
10460 7c 7c 20 70 69 4c 65 61 66 32 20 29 3b 0a 0a 20  || piLeaf2 );.. 
10470 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
10480 28 7a 4e 6f 64 65 2c 20 26 69 48 65 69 67 68 74  (zNode, &iHeight
10490 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 63  );.  rc = fts3Sc
104a0 61 6e 49 6e 74 65 72 69 6f 72 4e 6f 64 65 28 7a  anInteriorNode(z
104b0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 4e 6f  Term, nTerm, zNo
104c0 64 65 2c 20 6e 4e 6f 64 65 2c 20 70 69 4c 65 61  de, nNode, piLea
104d0 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a 20 20 61  f, piLeaf2);.  a
104e0 73 73 65 72 74 28 20 21 70 69 4c 65 61 66 32 20  ssert( !piLeaf2 
104f0 7c 7c 20 21 70 69 4c 65 61 66 20 7c 7c 20 72 63  || !piLeaf || rc
10500 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
10510 2a 70 69 4c 65 61 66 3c 3d 2a 70 69 4c 65 61 66  *piLeaf<=*piLeaf
10520 32 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  2) );..  if( rc=
10530 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 48  =SQLITE_OK && iH
10540 65 69 67 68 74 3e 31 20 29 7b 0a 20 20 20 20 63  eight>1 ){.    c
10550 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 30 3b 20  har *zBlob = 0; 
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10570 42 6c 6f 62 20 72 65 61 64 20 66 72 6f 6d 20 25  Blob read from %
10580 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
10590 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62  */.    int nBlob
105a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
105b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
105c0 7a 42 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a  zBlob in bytes *
105d0 2f 0a 0a 20 20 20 20 69 66 28 20 70 69 4c 65 61  /..    if( piLea
105e0 66 20 26 26 20 70 69 4c 65 61 66 32 20 26 26 20  f && piLeaf2 && 
105f0 28 2a 70 69 4c 65 61 66 21 3d 2a 70 69 4c 65 61  (*piLeaf!=*piLea
10600 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f2) ){.      rc 
10610 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
10620 64 42 6c 6f 63 6b 28 70 2c 20 2a 70 69 4c 65 61  dBlock(p, *piLea
10630 66 2c 20 26 7a 42 6c 6f 62 2c 20 26 6e 42 6c 6f  f, &zBlob, &nBlo
10640 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  b, 0);.      if(
10650 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10660 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
10670 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c  ts3SelectLeaf(p,
10680 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a   zTerm, nTerm, z
10690 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 69 4c  Blob, nBlob, piL
106a0 65 61 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  eaf, 0);.      }
106b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
106c0 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20 20 20 20  ree(zBlob);.    
106d0 20 20 70 69 4c 65 61 66 20 3d 20 30 3b 0a 20 20    piLeaf = 0;.  
106e0 20 20 20 20 7a 42 6c 6f 62 20 3d 20 30 3b 0a 20      zBlob = 0;. 
106f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
10700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10710 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10720 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
10730 2c 20 70 69 4c 65 61 66 3f 2a 70 69 4c 65 61 66  , piLeaf?*piLeaf
10740 3a 2a 70 69 4c 65 61 66 32 2c 20 26 7a 42 6c 6f  :*piLeaf2, &zBlo
10750 62 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20  b, &nBlob, 0);. 
10760 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
10770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10780 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 6c      rc = fts3Sel
10790 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72 6d  ectLeaf(p, zTerm
107a0 2c 20 6e 54 65 72 6d 2c 20 7a 42 6c 6f 62 2c 20  , nTerm, zBlob, 
107b0 6e 42 6c 6f 62 2c 20 70 69 4c 65 61 66 2c 20 70  nBlob, piLeaf, p
107c0 69 4c 65 61 66 32 29 3b 0a 20 20 20 20 7d 0a 20  iLeaf2);.    }. 
107d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
107e0 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72  zBlob);.  }..  r
107f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10810 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
10820 74 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64  te delta-encoded
10830 20 73 65 72 69 61 6c 69 7a 65 64 20 6c 69 73 74   serialized list
10840 73 20 6f 66 20 46 54 53 33 20 0a 2a 2a 20 76 61  s of FTS3 .** va
10850 72 69 6e 74 73 2e 20 45 61 63 68 20 63 61 6c 6c  rints. Each call
10860 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10870 6e 20 61 70 70 65 6e 64 73 20 61 20 73 69 6e 67  n appends a sing
10880 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20 6c  le varint to a l
10890 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
108a0 6f 69 64 20 66 74 73 33 50 75 74 44 65 6c 74 61  oid fts3PutDelta
108b0 56 61 72 69 6e 74 28 0a 20 20 63 68 61 72 20 2a  Varint(.  char *
108c0 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
108d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
108e0 4f 55 54 3a 20 4f 75 74 70 75 74 20 70 6f 69 6e  OUT: Output poin
108f0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
10900 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76 2c 20  _int64 *piPrev, 
10910 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
10920 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76 61 6c  UT: Previous val
10930 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 69  ue written to li
10940 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
10950 69 6e 74 36 34 20 69 56 61 6c 20 20 20 20 20 20  int64 iVal      
10960 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
10970 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 74   this value to t
10980 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  he list */.){.  
10990 61 73 73 65 72 74 28 20 69 56 61 6c 2d 2a 70 69  assert( iVal-*pi
109a0 50 72 65 76 20 3e 20 30 20 7c 7c 20 28 2a 70 69  Prev > 0 || (*pi
109b0 50 72 65 76 3d 3d 30 20 26 26 20 69 56 61 6c 3d  Prev==0 && iVal=
109c0 3d 30 29 20 29 3b 0a 20 20 2a 70 70 20 2b 3d 20  =0) );.  *pp += 
109d0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
109e0 72 69 6e 74 28 2a 70 70 2c 20 69 56 61 6c 2d 2a  rint(*pp, iVal-*
109f0 70 69 50 72 65 76 29 3b 0a 20 20 2a 70 69 50 72  piPrev);.  *piPr
10a00 65 76 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a  ev = iVal;.}../*
10a10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
10a20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
10a30 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 69 73 20  , *ppPoslist is 
10a40 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
10a50 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 74 61 72   to the .** star
10a60 74 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 2d  t of a position-
10a70 6c 69 73 74 2e 20 41 66 74 65 72 20 69 74 20 72  list. After it r
10a80 65 74 75 72 6e 73 2c 20 2a 70 70 50 6f 73 6c 69  eturns, *ppPosli
10a90 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  st points to the
10aa0 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 61  .** first byte a
10ab0 66 74 65 72 20 74 68 65 20 70 6f 73 69 74 69 6f  fter the positio
10ac0 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  n-list..**.** A 
10ad0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73  position list is
10ae0 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74 69 6f   list of positio
10af0 6e 73 20 28 64 65 6c 74 61 20 65 6e 63 6f 64 65  ns (delta encode
10b00 64 29 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 66  d) and columns f
10b10 6f 72 20 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  or .** a single 
10b20 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f 72 64 20  document record 
10b30 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 20 53  of a doclist.  S
10b40 6f 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  o, in other word
10b50 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  s, this.** routi
10b60 6e 65 20 61 64 76 61 6e 63 65 73 20 2a 70 70 50  ne advances *ppP
10b70 6f 73 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69  oslist so that i
10b80 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
10b90 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 0a 2a 2a  next docid in.**
10ba0 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 6f 72   the doclist, or
10bb0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
10bc0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
10bd0 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  of the doclist..
10be0 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20 6e  **.** If pp is n
10bf0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
10c00 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10c10 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
10c20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f  are copied.** to
10c30 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74   *pp. *pp is set
10c40 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10c50 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
10c60 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63   the last byte c
10c70 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  opied.** before 
10c80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10c90 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
10ca0 20 76 6f 69 64 20 66 74 73 33 50 6f 73 6c 69 73   void fts3Poslis
10cb0 74 43 6f 70 79 28 63 68 61 72 20 2a 2a 70 70 2c  tCopy(char **pp,
10cc0 20 63 68 61 72 20 2a 2a 70 70 50 6f 73 6c 69 73   char **ppPoslis
10cd0 74 29 7b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  t){.  char *pEnd
10ce0 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74 3b 0a 20   = *ppPoslist;. 
10cf0 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20   char c = 0;..  
10d00 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 61 20  /* The end of a 
10d10 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73  position list is
10d20 20 6d 61 72 6b 65 64 20 62 79 20 61 20 7a 65 72   marked by a zer
10d30 6f 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20  o encoded as an 
10d40 46 54 53 33 20 0a 20 20 2a 2a 20 76 61 72 69 6e  FTS3 .  ** varin
10d50 74 2e 20 41 20 73 69 6e 67 6c 65 20 50 4f 53 5f  t. A single POS_
10d60 45 4e 44 20 28 30 29 20 62 79 74 65 2e 20 45 78  END (0) byte. Ex
10d70 63 65 70 74 2c 20 69 66 20 74 68 65 20 30 20 62  cept, if the 0 b
10d80 79 74 65 20 69 73 20 70 72 65 63 65 64 65 64 20  yte is preceded 
10d90 62 79 0a 20 20 2a 2a 20 61 20 62 79 74 65 20 77  by.  ** a byte w
10da0 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69 74  ith the 0x80 bit
10db0 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
10dc0 20 6e 6f 74 20 61 20 76 61 72 69 6e 74 20 30 2c   not a varint 0,
10dd0 20 62 75 74 20 74 68 65 20 74 61 69 6c 0a 20 20   but the tail.  
10de0 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  ** of some other
10df0 2c 20 6d 75 6c 74 69 2d 62 79 74 65 2c 20 76 61  , multi-byte, va
10e00 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  lue..  **.  ** T
10e10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 69  he following whi
10e20 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65 73 20 70 45  le-loop moves pE
10e30 6e 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nd to point to t
10e40 68 65 20 66 69 72 73 74 20 62 79 74 65 20 74 68  he first byte th
10e50 61 74 20 69 73 20 6e 6f 74 20 0a 20 20 2a 2a 20  at is not .  ** 
10e60 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 65 63  immediately prec
10e70 65 64 65 64 20 62 79 20 61 20 62 79 74 65 20 77  eded by a byte w
10e80 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69 74  ith the 0x80 bit
10e90 20 73 65 74 2e 20 54 68 65 6e 20 69 6e 63 72 65   set. Then incre
10ea0 6d 65 6e 74 73 0a 20 20 2a 2a 20 70 45 6e 64 20  ments.  ** pEnd 
10eb0 6f 6e 63 65 20 6d 6f 72 65 20 73 6f 20 74 68 61  once more so tha
10ec0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
10ed0 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
10ee0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
10ef0 65 0a 20 20 2a 2a 20 6c 61 73 74 20 62 79 74 65  e.  ** last byte
10f00 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
10f10 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 77 68  -list..  */.  wh
10f20 69 6c 65 28 20 2a 70 45 6e 64 20 7c 20 63 20 29  ile( *pEnd | c )
10f30 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64 2b  {.    c = *pEnd+
10f40 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74 65  + & 0x80;.    te
10f50 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26 20  stcase( c!=0 && 
10f60 28 2a 70 45 6e 64 29 3d 3d 30 20 29 3b 0a 20 20  (*pEnd)==0 );.  
10f70 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20 20 2f 2a 20  }.  pEnd++;  /* 
10f80 41 64 76 61 6e 63 65 20 70 61 73 74 20 74 68 65  Advance past the
10f90 20 50 4f 53 5f 45 4e 44 20 74 65 72 6d 69 6e 61   POS_END termina
10fa0 74 6f 72 20 62 79 74 65 20 2a 2f 0a 0a 20 20 69  tor byte */..  i
10fb0 66 28 20 70 70 20 29 7b 0a 20 20 20 20 69 6e 74  f( pp ){.    int
10fc0 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 20   n = (int)(pEnd 
10fd0 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20  - *ppPoslist);. 
10fe0 20 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70     char *p = *pp
10ff0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
11000 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a  *ppPoslist, n);.
11010 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20      p += n;.    
11020 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a  *pp = p;.  }.  *
11030 70 70 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64  ppPoslist = pEnd
11040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
11050 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11060 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f 73 6c   called, *ppPosl
11070 69 73 74 20 69 73 20 61 73 73 75 6d 65 64 20 74  ist is assumed t
11080 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
11090 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 63 6f  ** start of a co
110a0 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41 66 74 65 72  lumn-list. After
110b0 20 69 74 20 72 65 74 75 72 6e 73 2c 20 2a 70 70   it returns, *pp
110c0 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73 20 74  Poslist points t
110d0 6f 20 74 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20  o the.** to the 
110e0 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f  terminator (POS_
110f0 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e  COLUMN or POS_EN
11100 44 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  D) byte of the c
11110 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a  olumn-list..**.*
11120 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  * A column-list 
11130 69 73 20 6c 69 73 74 20 6f 66 20 64 65 6c 74 61  is list of delta
11140 2d 65 6e 63 6f 64 65 64 20 70 6f 73 69 74 69 6f  -encoded positio
11150 6e 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ns for a single 
11160 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69 74 68 69 6e  column.** within
11170 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 75 6d 65   a single docume
11180 6e 74 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c  nt within a docl
11190 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ist..**.** The c
111a0 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 74 65  olumn-list is te
111b0 72 6d 69 6e 61 74 65 64 20 65 69 74 68 65 72 20  rminated either 
111c0 62 79 20 61 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20  by a POS_COLUMN 
111d0 76 61 72 69 6e 74 20 28 31 29 20 6f 72 0a 2a 2a  varint (1) or.**
111e0 20 61 20 50 4f 53 5f 45 4e 44 20 76 61 72 69 6e   a POS_END varin
111f0 74 20 28 30 29 2e 20 20 54 68 69 73 20 72 6f 75  t (0).  This rou
11200 74 69 6e 65 20 6c 65 61 76 65 73 20 2a 70 70 50  tine leaves *ppP
11210 6f 73 6c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  oslist pointing 
11220 74 6f 0a 2a 2a 20 74 68 65 20 50 4f 53 5f 43 4f  to.** the POS_CO
11230 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44 20  LUMN or POS_END 
11240 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
11250 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e  the column-list.
11260 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20  .**.** If pp is 
11270 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
11280 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11290 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 61  he column-list a
112a0 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f 20  re copied.** to 
112b0 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74 20  *pp. *pp is set 
112c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
112d0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
112e0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63 6f  the last byte co
112f0 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 74  pied.** before t
11300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11310 75 72 6e 73 2e 20 20 54 68 65 20 50 4f 53 5f 43  urns.  The POS_C
11320 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44  OLUMN or POS_END
11330 20 74 65 72 6d 69 6e 61 74 6f 72 0a 2a 2a 20 69   terminator.** i
11340 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 69 6e 74  s not copied int
11350 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  o *pp..*/.static
11360 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e   void fts3Column
11370 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a 2a  listCopy(char **
11380 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f 73  pp, char **ppPos
11390 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a 70  list){.  char *p
113a0 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74  End = *ppPoslist
113b0 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a  ;.  char c = 0;.
113c0 0a 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c  .  /* A column-l
113d0 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
113e0 64 20 62 79 20 65 69 74 68 65 72 20 61 20 30 78  d by either a 0x
113f0 30 31 20 6f 72 20 30 78 30 30 20 62 79 74 65 20  01 or 0x00 byte 
11400 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  that is.  ** not
11410 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
11420 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20  -byte varint..  
11430 2a 2f 0a 20 20 77 68 69 6c 65 28 20 30 78 46 45  */.  while( 0xFE
11440 20 26 20 28 2a 70 45 6e 64 20 7c 20 63 29 20 29   & (*pEnd | c) )
11450 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64 2b  {.    c = *pEnd+
11460 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74 65  + & 0x80;.    te
11470 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26 20  stcase( c!=0 && 
11480 28 28 2a 70 45 6e 64 29 26 30 78 66 65 29 3d 3d  ((*pEnd)&0xfe)==
11490 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0 );.  }.  if( p
114a0 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  p ){.    int n =
114b0 20 28 69 6e 74 29 28 70 45 6e 64 20 2d 20 2a 70   (int)(pEnd - *p
114c0 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 63  pPoslist);.    c
114d0 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  har *p = *pp;.  
114e0 20 20 6d 65 6d 63 70 79 28 70 2c 20 2a 70 70 50    memcpy(p, *ppP
114f0 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a 20 20 20 20  oslist, n);.    
11500 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 2a 70 70 20  p += n;.    *pp 
11510 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 6f  = p;.  }.  *ppPo
11520 73 6c 69 73 74 20 3d 20 70 45 6e 64 3b 0a 7d 0a  slist = pEnd;.}.
11530 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 75 73 65  ./*.** Value use
11540 64 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  d to signify the
11550 20 65 6e 64 20 6f 66 20 61 6e 20 70 6f 73 69 74   end of an posit
11560 69 6f 6e 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ion-list. This i
11570 73 20 73 61 66 65 20 62 65 63 61 75 73 65 0a 2a  s safe because.*
11580 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * it is not poss
11590 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 64  ible to have a d
115a0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 32 5e 33  ocument with 2^3
115b0 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a 23 64 65 66  1 terms..*/.#def
115c0 69 6e 65 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53  ine POSITION_LIS
115d0 54 5f 45 4e 44 20 30 78 37 66 66 66 66 66 66 66  T_END 0x7fffffff
115e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
115f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
11600 20 68 65 6c 70 20 70 61 72 73 65 20 70 6f 73 69   help parse posi
11610 74 69 6f 6e 2d 6c 69 73 74 73 2e 20 57 68 65 6e  tion-lists. When
11620 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11630 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a 70 70  s.** called, *pp
11640 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 74 68   may point to th
11650 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
11660 65 78 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68  ext varint in th
11670 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
11680 2a 2a 20 62 65 69 6e 67 20 70 61 72 73 65 64 2c  ** being parsed,
11690 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
116a0 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20   to 1 byte past 
116b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
116c0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a 2a 2a 20  osition-list.** 
116d0 28 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 2a  (in which case *
116e0 2a 70 70 20 77 69 6c 6c 20 62 65 20 61 20 74 65  *pp will be a te
116f0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 50  rminator bytes P
11700 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72 0a 2a 2a  OS_END (0) or.**
11710 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   (1))..**.** If 
11720 2a 70 70 20 70 6f 69 6e 74 73 20 70 61 73 74 20  *pp points past 
11730 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
11740 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d  urrent position-
11750 6c 69 73 74 2c 20 73 65 74 20 2a 70 69 20 74 6f  list, set *pi to
11760 20 0a 2a 2a 20 50 4f 53 49 54 49 4f 4e 5f 4c 49   .** POSITION_LI
11770 53 54 5f 45 4e 44 20 61 6e 64 20 72 65 74 75 72  ST_END and retur
11780 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  n. Otherwise, re
11790 61 64 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  ad the next vari
117a0 6e 74 20 66 72 6f 6d 20 2a 70 70 2c 0a 2a 2a 20  nt from *pp,.** 
117b0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 75  increment the cu
117c0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 2a  rrent value of *
117d0 70 69 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  pi by the value 
117e0 72 65 61 64 2c 20 61 6e 64 20 73 65 74 20 2a 70  read, and set *p
117f0 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  p to.** point to
11800 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20   the next value 
11810 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
11820 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63  ..**.** Before c
11830 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
11840 69 6e 65 20 2a 70 69 20 6d 75 73 74 20 62 65 20  ine *pi must be 
11850 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
11860 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
11870 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 73 69  he previous posi
11880 74 69 6f 6e 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tion, or zero if
11890 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
118a0 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69  the first positi
118b0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 70 6f 73  on.** in the pos
118c0 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 20 42 65 63  ition-list.  Bec
118d0 61 75 73 65 20 70 6f 73 69 74 69 6f 6e 73 20 61  ause positions a
118e0 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64  re delta-encoded
118f0 2c 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  , the value.** o
11900 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  f the previous p
11910 6f 73 69 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  osition is neede
11920 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  d in order to co
11930 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
11940 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 70  of.** the next p
11950 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
11960 69 63 20 76 6f 69 64 20 66 74 73 33 52 65 61 64  ic void fts3Read
11970 4e 65 78 74 50 6f 73 28 0a 20 20 63 68 61 72 20  NextPos(.  char 
11980 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
11990 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
119a0 55 54 3a 20 50 6f 69 6e 74 65 72 20 69 6e 74 6f  UT: Pointer into
119b0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 62   position-list b
119c0 75 66 66 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  uffer */.  sqlit
119d0 65 33 5f 69 6e 74 36 34 20 2a 70 69 20 20 20 20  e3_int64 *pi    
119e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
119f0 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
11a00 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  rom position-lis
11a10 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 2a  t */.){.  if( (*
11a20 2a 70 70 29 26 30 78 46 45 20 29 7b 0a 20 20 20  *pp)&0xFE ){.   
11a30 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
11a40 69 6e 74 28 70 70 2c 20 70 69 29 3b 0a 20 20 20  int(pp, pi);.   
11a50 20 2a 70 69 20 2d 3d 20 32 3b 0a 20 20 7d 65 6c   *pi -= 2;.  }el
11a60 73 65 7b 0a 20 20 20 20 2a 70 69 20 3d 20 50 4f  se{.    *pi = PO
11a70 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
11a80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
11a90 20 70 61 72 61 6d 65 74 65 72 20 69 43 6f 6c 20   parameter iCol 
11aa0 69 73 20 6e 6f 74 20 30 2c 20 77 72 69 74 65 20  is not 0, write 
11ab0 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 28 31  an POS_COLUMN (1
11ac0 29 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64 20  ) byte followed 
11ad0 62 79 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  by.** the value 
11ae0 6f 66 20 69 43 6f 6c 20 65 6e 63 6f 64 65 64 20  of iCol encoded 
11af0 61 73 20 61 20 76 61 72 69 6e 74 20 74 6f 20 2a  as a varint to *
11b00 70 70 2e 20 20 20 54 68 69 73 20 77 69 6c 6c 20  pp.   This will 
11b10 73 74 61 72 74 20 61 20 6e 65 77 0a 2a 2a 20 63  start a new.** c
11b20 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  olumn list..**.*
11b30 2a 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  * Set *pp to poi
11b40 6e 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6a  nt to the byte j
11b50 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6c 61  ust after the la
11b60 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
11b70 62 65 66 6f 72 65 20 0a 2a 2a 20 72 65 74 75 72  before .** retur
11b80 6e 69 6e 67 20 28 64 6f 20 6e 6f 74 20 6d 6f 64  ning (do not mod
11b90 69 66 79 20 69 74 20 69 66 20 69 43 6f 6c 3d 3d  ify it if iCol==
11ba0 30 29 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74  0). Return the t
11bb0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
11bc0 79 74 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ytes.** written 
11bd0 28 30 20 69 66 20 69 43 6f 6c 3d 3d 30 29 2e 0a  (0 if iCol==0)..
11be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11bf0 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28 63  s3PutColNumber(c
11c00 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74 20 69 43  har **pp, int iC
11c10 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ol){.  int n = 0
11c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11c40 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
11c50 6e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 20  n */.  if( iCol 
11c60 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  ){.    char *p =
11c70 20 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20   *pp;           
11c80 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 70       /* Output p
11c90 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 6e 20  ointer */.    n 
11ca0 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = 1 + sqlite3Fts
11cb0 33 50 75 74 56 61 72 69 6e 74 28 26 70 5b 31 5d  3PutVarint(&p[1]
11cc0 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 20  , iCol);.    *p 
11cd0 3d 20 30 78 30 31 3b 0a 20 20 20 20 2a 70 70 20  = 0x01;.    *pp 
11ce0 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d 0a 20 20 72  = &p[n];.  }.  r
11cf0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
11d00 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 75 6e  * Compute the un
11d10 69 6f 6e 20 6f 66 20 74 77 6f 20 70 6f 73 69 74  ion of two posit
11d20 69 6f 6e 20 6c 69 73 74 73 2e 20 20 54 68 65 20  ion lists.  The 
11d30 6f 75 74 70 75 74 20 77 72 69 74 74 65 6e 0a 2a  output written.*
11d40 2a 20 69 6e 74 6f 20 2a 70 70 20 63 6f 6e 74 61  * into *pp conta
11d50 69 6e 73 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e  ins all position
11d60 73 20 6f 66 20 62 6f 74 68 20 2a 70 70 31 20 61  s of both *pp1 a
11d70 6e 64 20 2a 70 70 32 20 69 6e 20 73 6f 72 74 65  nd *pp2 in sorte
11d80 64 0a 2a 2a 20 6f 72 64 65 72 20 61 6e 64 20 77  d.** order and w
11d90 69 74 68 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ith any duplicat
11da0 65 73 20 72 65 6d 6f 76 65 64 2e 20 20 41 6c 6c  es removed.  All
11db0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a   pointers are.**
11dc0 20 75 70 64 61 74 65 64 20 61 70 70 72 6f 70 72   updated appropr
11dd0 69 61 74 65 6c 79 2e 20 20 20 54 68 65 20 63 61  iately.   The ca
11de0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
11df0 62 6c 65 20 66 6f 72 20 69 6e 73 75 72 69 6e 67  ble for insuring
11e00 0a 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69  .** that there i
11e10 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69  s enough space i
11e20 6e 20 2a 70 70 20 74 6f 20 68 6f 6c 64 20 74 68  n *pp to hold th
11e30 65 20 63 6f 6d 70 6c 65 74 65 20 6f 75 74 70 75  e complete outpu
11e40 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11e50 64 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72  d fts3PoslistMer
11e60 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c  ge(.  char **pp,
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
11e90 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72  buffer */.  char
11ea0 20 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20   **pp1,         
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11ec0 65 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a  eft input list *
11ed0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20  /.  char **pp2  
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 69 6e 70      /* Right inp
11f00 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  ut list */.){.  
11f10 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  char *p = *pp;. 
11f20 20 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31   char *p1 = *pp1
11f30 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a  ;.  char *p2 = *
11f40 70 70 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  pp2;..  while( *
11f50 70 31 20 7c 7c 20 2a 70 32 20 29 7b 0a 20 20 20  p1 || *p2 ){.   
11f60 20 69 6e 74 20 69 43 6f 6c 31 3b 20 20 20 20 20   int iCol1;     
11f70 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
11f80 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  nt column index 
11f90 69 6e 20 70 70 31 20 2a 2f 0a 20 20 20 20 69 6e  in pp1 */.    in
11fa0 74 20 69 43 6f 6c 32 3b 20 20 20 20 20 20 20 20  t iCol2;        
11fb0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
11fc0 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20  column index in 
11fd0 70 70 32 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  pp2 */..    if( 
11fe0 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20  *p1==POS_COLUMN 
11ff0 29 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  ) fts3GetVarint3
12000 32 28 26 70 31 5b 31 5d 2c 20 26 69 43 6f 6c 31  2(&p1[1], &iCol1
12010 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  );.    else if( 
12020 2a 70 31 3d 3d 50 4f 53 5f 45 4e 44 20 29 20 69  *p1==POS_END ) i
12030 43 6f 6c 31 20 3d 20 50 4f 53 49 54 49 4f 4e 5f  Col1 = POSITION_
12040 4c 49 53 54 5f 45 4e 44 3b 0a 20 20 20 20 65 6c  LIST_END;.    el
12050 73 65 20 69 43 6f 6c 31 20 3d 20 30 3b 0a 0a 20  se iCol1 = 0;.. 
12060 20 20 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f     if( *p2==POS_
12070 43 4f 4c 55 4d 4e 20 29 20 66 74 73 33 47 65 74  COLUMN ) fts3Get
12080 56 61 72 69 6e 74 33 32 28 26 70 32 5b 31 5d 2c  Varint32(&p2[1],
12090 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 65 6c   &iCol2);.    el
120a0 73 65 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f  se if( *p2==POS_
120b0 45 4e 44 20 29 20 69 43 6f 6c 32 20 3d 20 50 4f  END ) iCol2 = PO
120c0 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
120d0 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 32 20  .    else iCol2 
120e0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 43  = 0;..    if( iC
120f0 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20 20  ol1==iCol2 ){.  
12100 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12110 34 20 69 31 20 3d 20 30 3b 20 20 20 20 20 20 20  4 i1 = 0;       
12120 2f 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e  /* Last position
12130 20 66 72 6f 6d 20 70 70 31 20 2a 2f 0a 20 20 20   from pp1 */.   
12140 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
12150 20 69 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   i2 = 0;       /
12160 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e 20  * Last position 
12170 66 72 6f 6d 20 70 70 32 20 2a 2f 0a 20 20 20 20  from pp2 */.    
12180 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12190 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  iPrev = 0;.     
121a0 20 69 6e 74 20 6e 20 3d 20 66 74 73 33 50 75 74   int n = fts3Put
121b0 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43  ColNumber(&p, iC
121c0 6f 6c 31 29 3b 0a 20 20 20 20 20 20 70 31 20 2b  ol1);.      p1 +
121d0 3d 20 6e 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d  = n;.      p2 +=
121e0 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74   n;..      /* At
121f0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 6f 74   this point, bot
12200 68 20 70 31 20 61 6e 64 20 70 32 20 70 6f 69 6e  h p1 and p2 poin
12210 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
12220 66 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 0a 20  f column-lists. 
12230 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
12240 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 74 68 65  same column (the
12250 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 69 6e 64   column with ind
12260 65 78 20 69 43 6f 6c 31 20 61 6e 64 20 69 43 6f  ex iCol1 and iCo
12270 6c 32 29 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20  l2)..      ** A 
12280 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 61  column-list is a
12290 20 6c 69 73 74 20 6f 66 20 6e 6f 6e 2d 6e 65 67   list of non-neg
122a0 61 74 69 76 65 20 64 65 6c 74 61 2d 65 6e 63 6f  ative delta-enco
122b0 64 65 64 20 76 61 72 69 6e 74 73 2c 20 65 61 63  ded varints, eac
122c0 68 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  h .      ** incr
122d0 65 6d 65 6e 74 65 64 20 62 79 20 32 20 62 65 66  emented by 2 bef
122e0 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  ore being stored
122f0 2e 20 45 61 63 68 20 6c 69 73 74 20 69 73 20 74  . Each list is t
12300 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a 20  erminated by a. 
12310 20 20 20 20 20 2a 2a 20 50 4f 53 5f 45 4e 44 20       ** POS_END 
12320 28 30 29 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d  (0) or POS_COLUM
12330 4e 20 28 31 29 2e 20 54 68 65 20 66 6f 6c 6c 6f  N (1). The follo
12340 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 65 72 67 65  wing block merge
12350 73 20 74 68 65 20 74 77 6f 20 6c 69 73 74 73 0a  s the two lists.
12360 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 72 69        ** and wri
12370 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 73 20  tes the results 
12380 74 6f 20 62 75 66 66 65 72 20 70 2e 20 70 20 69  to buffer p. p i
12390 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
123a0 74 6f 20 74 68 65 20 62 79 74 65 0a 20 20 20 20  to the byte.    
123b0 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6c    ** after the l
123c0 69 73 74 20 77 72 69 74 74 65 6e 2e 20 4e 6f 20  ist written. No 
123d0 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f  terminator (POS_
123e0 45 4e 44 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d  END or POS_COLUM
123f0 4e 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 77  N) is.      ** w
12400 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
12410 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
12420 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
12430 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 31  aVarint(&p1, &i1
12440 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
12450 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c  DeltaVarint(&p2,
12460 20 26 69 32 29 3b 0a 20 20 20 20 20 20 64 6f 20   &i2);.      do 
12470 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50 75  {.        fts3Pu
12480 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
12490 20 26 69 50 72 65 76 2c 20 28 69 31 3c 69 32 29   &iPrev, (i1<i2)
124a0 20 3f 20 69 31 20 3a 20 69 32 29 3b 20 0a 20 20   ? i1 : i2); .  
124b0 20 20 20 20 20 20 69 50 72 65 76 20 2d 3d 20 32        iPrev -= 2
124c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
124d0 3d 3d 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==i2 ){.        
124e0 20 20 66 74 73 33 52 65 61 64 4e 65 78 74 50 6f    fts3ReadNextPo
124f0 73 28 26 70 31 2c 20 26 69 31 29 3b 0a 20 20 20  s(&p1, &i1);.   
12500 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e         fts3ReadN
12510 65 78 74 50 6f 73 28 26 70 32 2c 20 26 69 32 29  extPos(&p2, &i2)
12520 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12530 69 66 28 20 69 31 3c 69 32 20 29 7b 0a 20 20 20  if( i1<i2 ){.   
12540 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e         fts3ReadN
12550 65 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31 29  extPos(&p1, &i1)
12560 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12570 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 52  .          fts3R
12580 65 61 64 4e 65 78 74 50 6f 73 28 26 70 32 2c 20  eadNextPos(&p2, 
12590 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &i2);.        }.
125a0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 31        }while( i1
125b0 21 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  !=POSITION_LIST_
125c0 45 4e 44 20 7c 7c 20 69 32 21 3d 50 4f 53 49 54  END || i2!=POSIT
125d0 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 29 3b 0a  ION_LIST_END );.
125e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
125f0 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a 20 20 20  ol1<iCol2 ){.   
12600 20 20 20 70 31 20 2b 3d 20 66 74 73 33 50 75 74     p1 += fts3Put
12610 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43  ColNumber(&p, iC
12620 6f 6c 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33  ol1);.      fts3
12630 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 26  ColumnlistCopy(&
12640 70 2c 20 26 70 31 29 3b 0a 20 20 20 20 7d 65 6c  p, &p1);.    }el
12650 73 65 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20  se{.      p2 += 
12660 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72  fts3PutColNumber
12670 28 26 70 2c 20 69 43 6f 6c 32 29 3b 0a 20 20 20  (&p, iCol2);.   
12680 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
12690 74 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b 0a  tCopy(&p, &p2);.
126a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 2b      }.  }..  *p+
126b0 2b 20 3d 20 50 4f 53 5f 45 4e 44 3b 0a 20 20 2a  + = POS_END;.  *
126c0 70 70 20 3d 20 70 3b 0a 20 20 2a 70 70 31 20 3d  pp = p;.  *pp1 =
126d0 20 70 31 20 2b 20 31 3b 0a 20 20 2a 70 70 32 20   p1 + 1;.  *pp2 
126e0 3d 20 70 32 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  = p2 + 1;.}../*.
126f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12700 20 69 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67   is used to merg
12710 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
12720 69 73 74 73 20 69 6e 74 6f 20 6f 6e 65 2e 20 57  ists into one. W
12730 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 61 6c  hen it is.** cal
12740 6c 65 64 2c 20 2a 70 70 31 20 61 6e 64 20 2a 70  led, *pp1 and *p
12750 70 32 20 6d 75 73 74 20 62 6f 74 68 20 70 6f 69  p2 must both poi
12760 6e 74 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  nt to position l
12770 69 73 74 73 2e 20 41 20 70 6f 73 69 74 69 6f 6e  ists. A position
12780 2d 6c 69 73 74 20 69 73 0a 2a 2a 20 74 68 65 20  -list is.** the 
12790 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  part of a doclis
127a0 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65  t that follows e
127b0 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 64 2e  ach document id.
127c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
127d0 20 61 20 72 6f 77 0a 2a 2a 20 63 6f 6e 74 61 69   a row.** contai
127e0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 27 61  ns:.**.**     'a
127f0 20 62 20 63 27 7c 27 78 20 79 20 7a 27 7c 27 61   b c'|'x y z'|'a
12800 20 62 20 62 20 61 27 0a 2a 2a 0a 2a 2a 20 54 68   b b a'.**.** Th
12810 65 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  en the position 
12820 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 72 6f  list for this ro
12830 77 20 66 6f 72 20 74 6f 6b 65 6e 20 27 62 27 20  w for token 'b' 
12840 77 6f 75 6c 64 20 63 6f 6e 73 69 73 74 20 6f 66  would consist of
12850 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 78 30 32  :.**.**     0x02
12860 20 30 78 30 31 20 30 78 30 32 20 30 78 30 33 20   0x01 0x02 0x03 
12870 30 78 30 33 20 30 78 30 30 0a 2a 2a 0a 2a 2a 20  0x03 0x00.**.** 
12880 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
12890 6f 6e 20 72 65 74 75 72 6e 73 2c 20 62 6f 74 68  on returns, both
128a0 20 2a 70 70 31 20 61 6e 64 20 2a 70 70 32 20 61   *pp1 and *pp2 a
128b0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  re left pointing
128c0 20 74 6f 20 74 68 65 0a 2a 2a 20 62 79 74 65 20   to the.** byte 
128d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 30 78  following the 0x
128e0 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f 66  00 terminator of
128f0 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
12900 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
12910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 73 53 61 76  ..**.** If isSav
12920 65 4c 65 66 74 20 69 73 20 30 2c 20 61 6e 20 65  eLeft is 0, an e
12930 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
12940 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 73 69   the output posi
12950 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 0a 2a  tion list for .*
12960 2a 20 65 61 63 68 20 70 6f 73 69 74 69 6f 6e 20  * each position 
12970 69 6e 20 2a 70 70 32 20 66 6f 72 20 77 68 69 63  in *pp2 for whic
12980 68 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  h there exists o
12990 6e 65 20 6f 72 20 6d 6f 72 65 20 70 6f 73 69 74  ne or more posit
129a0 69 6f 6e 73 20 69 6e 0a 2a 2a 20 2a 70 70 31 20  ions in.** *pp1 
129b0 73 6f 20 74 68 61 74 20 28 70 6f 73 28 2a 70 70  so that (pos(*pp
129c0 32 29 3e 70 6f 73 28 2a 70 70 31 29 20 26 26 20  2)>pos(*pp1) && 
129d0 70 6f 73 28 2a 70 70 32 29 2d 70 6f 73 28 2a 70  pos(*pp2)-pos(*p
129e0 70 31 29 3c 3d 6e 54 6f 6b 65 6e 29 2e 20 69 2e  p1)<=nToken). i.
129f0 65 2e 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 2a  e..** when the *
12a00 70 70 31 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  pp1 token appear
12a10 73 20 62 65 66 6f 72 65 20 74 68 65 20 2a 70 70  s before the *pp
12a20 32 20 74 6f 6b 65 6e 2c 20 62 75 74 20 6e 6f 74  2 token, but not
12a30 20 6d 6f 72 65 20 74 68 61 6e 20 6e 54 6f 6b 65   more than nToke
12a40 6e 0a 2a 2a 20 73 6c 6f 74 73 20 62 65 66 6f 72  n.** slots befor
12a50 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 65 2e 67 2e  e it..**.** e.g.
12a60 20 6e 54 6f 6b 65 6e 3d 3d 31 20 73 65 61 72 63   nToken==1 searc
12a70 68 65 73 20 66 6f 72 20 61 64 6a 61 63 65 6e 74  hes for adjacent
12a80 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   positions..*/.s
12a90 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 6f  tatic int fts3Po
12aa0 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
12ab0 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 20  (.  char **pp,  
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
12ae0 72 65 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 70  reallocated outp
12af0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ut buffer */.  i
12b00 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b20 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72  * Maximum differ
12b30 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f  ence in token po
12b40 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  sitions */.  int
12b50 20 69 73 53 61 76 65 4c 65 66 74 2c 20 20 20 20   isSaveLeft,    
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b70 53 61 76 65 20 74 68 65 20 6c 65 66 74 20 70 6f  Save the left po
12b80 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  sition */.  int 
12b90 69 73 45 78 61 63 74 2c 20 20 20 20 20 20 20 20  isExact,        
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12bb0 66 20 2a 70 70 31 20 69 73 20 65 78 61 63 74 6c  f *pp1 is exactl
12bc0 79 20 6e 54 6f 6b 65 6e 73 20 62 65 66 6f 72 65  y nTokens before
12bd0 20 2a 70 70 32 20 2a 2f 0a 20 20 63 68 61 72 20   *pp2 */.  char 
12be0 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20  **pp1,          
12bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12c00 2f 4f 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74  /OUT: Left input
12c10 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
12c20 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20 20 20  **pp2           
12c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12c40 2f 4f 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75  /OUT: Right inpu
12c50 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  t list */.){.  c
12c60 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  har *p = *pp;.  
12c70 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b  char *p1 = *pp1;
12c80 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a 70  .  char *p2 = *p
12c90 70 32 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 31 20  p2;.  int iCol1 
12ca0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 32  = 0;.  int iCol2
12cb0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4e 65 76 65   = 0;..  /* Neve
12cc0 72 20 73 65 74 20 62 6f 74 68 20 69 73 53 61 76  r set both isSav
12cd0 65 4c 65 66 74 20 61 6e 64 20 69 73 45 78 61 63  eLeft and isExac
12ce0 74 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 69  t for the same i
12cf0 6e 76 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  nvocation. */.  
12d00 61 73 73 65 72 74 28 20 69 73 53 61 76 65 4c 65  assert( isSaveLe
12d10 66 74 3d 3d 30 20 7c 7c 20 69 73 45 78 61 63 74  ft==0 || isExact
12d20 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ==0 );..  assert
12d30 28 20 70 21 3d 30 20 26 26 20 2a 70 31 21 3d 30  ( p!=0 && *p1!=0
12d40 20 26 26 20 2a 70 32 21 3d 30 20 29 3b 0a 20 20   && *p2!=0 );.  
12d50 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c  if( *p1==POS_COL
12d60 55 4d 4e 20 29 7b 20 0a 20 20 20 20 70 31 2b 2b  UMN ){ .    p1++
12d70 3b 0a 20 20 20 20 70 31 20 2b 3d 20 66 74 73 33  ;.    p1 += fts3
12d80 47 65 74 56 61 72 69 6e 74 33 32 28 70 31 2c 20  GetVarint32(p1, 
12d90 26 69 43 6f 6c 31 29 3b 0a 20 20 7d 0a 20 20 69  &iCol1);.  }.  i
12da0 66 28 20 2a 70 32 3d 3d 50 4f 53 5f 43 4f 4c 55  f( *p2==POS_COLU
12db0 4d 4e 20 29 7b 20 0a 20 20 20 20 70 32 2b 2b 3b  MN ){ .    p2++;
12dc0 0a 20 20 20 20 70 32 20 2b 3d 20 66 74 73 33 47  .    p2 += fts3G
12dd0 65 74 56 61 72 69 6e 74 33 32 28 70 32 2c 20 26  etVarint32(p2, &
12de0 69 43 6f 6c 32 29 3b 0a 20 20 7d 0a 0a 20 20 77  iCol2);.  }..  w
12df0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
12e00 66 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c 32 20  f( iCol1==iCol2 
12e10 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
12e20 53 61 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  Save = p;.      
12e30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
12e40 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rev = 0;.      s
12e50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f  qlite3_int64 iPo
12e60 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  s1 = 0;.      sq
12e70 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f 73  lite3_int64 iPos
12e80 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  2 = 0;..      if
12e90 28 20 69 43 6f 6c 31 20 29 7b 0a 20 20 20 20 20  ( iCol1 ){.     
12ea0 20 20 20 2a 70 2b 2b 20 3d 20 50 4f 53 5f 43 4f     *p++ = POS_CO
12eb0 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 20  LUMN;.        p 
12ec0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
12ed0 74 56 61 72 69 6e 74 28 70 2c 20 69 43 6f 6c 31  tVarint(p, iCol1
12ee0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
12ef0 20 20 61 73 73 65 72 74 28 20 2a 70 31 21 3d 50    assert( *p1!=P
12f00 4f 53 5f 45 4e 44 20 26 26 20 2a 70 31 21 3d 50  OS_END && *p1!=P
12f10 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  OS_COLUMN );.   
12f20 20 20 20 61 73 73 65 72 74 28 20 2a 70 32 21 3d     assert( *p2!=
12f30 50 4f 53 5f 45 4e 44 20 26 26 20 2a 70 32 21 3d  POS_END && *p2!=
12f40 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  POS_COLUMN );.  
12f50 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
12f60 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50 6f  Varint(&p1, &iPo
12f70 73 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32 3b  s1); iPos1 -= 2;
12f80 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65  .      fts3GetDe
12f90 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c 20 26  ltaVarint(&p2, &
12fa0 69 50 6f 73 32 29 3b 20 69 50 6f 73 32 20 2d 3d  iPos2); iPos2 -=
12fb0 20 32 3b 0a 0a 20 20 20 20 20 20 77 68 69 6c 65   2;..      while
12fc0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( 1 ){.        i
12fd0 66 28 20 69 50 6f 73 32 3d 3d 69 50 6f 73 31 2b  f( iPos2==iPos1+
12fe0 6e 54 6f 6b 65 6e 20 0a 20 20 20 20 20 20 20 20  nToken .        
12ff0 20 7c 7c 20 28 69 73 45 78 61 63 74 3d 3d 30 20   || (isExact==0 
13000 26 26 20 69 50 6f 73 32 3e 69 50 6f 73 31 20 26  && iPos2>iPos1 &
13010 26 20 69 50 6f 73 32 3c 3d 69 50 6f 73 31 2b 6e  & iPos2<=iPos1+n
13020 54 6f 6b 65 6e 29 20 0a 20 20 20 20 20 20 20 20  Token) .        
13030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13040 69 74 65 33 5f 69 6e 74 36 34 20 69 53 61 76 65  ite3_int64 iSave
13050 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 61 76  ;.          iSav
13060 65 20 3d 20 69 73 53 61 76 65 4c 65 66 74 20 3f  e = isSaveLeft ?
13070 20 69 50 6f 73 31 20 3a 20 69 50 6f 73 32 3b 0a   iPos1 : iPos2;.
13080 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75            fts3Pu
13090 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
130a0 20 26 69 50 72 65 76 2c 20 69 53 61 76 65 2b 32   &iPrev, iSave+2
130b0 29 3b 20 69 50 72 65 76 20 2d 3d 20 32 3b 0a 20  ); iPrev -= 2;. 
130c0 20 20 20 20 20 20 20 20 20 70 53 61 76 65 20 3d           pSave =
130d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
130e0 73 65 72 74 28 20 70 20 29 3b 0a 20 20 20 20 20  sert( p );.     
130f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13100 20 28 21 69 73 53 61 76 65 4c 65 66 74 20 26 26   (!isSaveLeft &&
13110 20 69 50 6f 73 32 3c 3d 28 69 50 6f 73 31 2b 6e   iPos2<=(iPos1+n
13120 54 6f 6b 65 6e 29 29 20 7c 7c 20 69 50 6f 73 32  Token)) || iPos2
13130 3c 3d 69 50 6f 73 31 20 29 7b 0a 20 20 20 20 20  <=iPos1 ){.     
13140 20 20 20 20 20 69 66 28 20 28 2a 70 32 26 30 78       if( (*p2&0x
13150 46 45 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  FE)==0 ) break;.
13160 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
13170 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32  tDeltaVarint(&p2
13180 2c 20 26 69 50 6f 73 32 29 3b 20 69 50 6f 73 32  , &iPos2); iPos2
13190 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d   -= 2;.        }
131a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
131b0 69 66 28 20 28 2a 70 31 26 30 78 46 45 29 3d 3d  if( (*p1&0xFE)==
131c0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
131d0 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
131e0 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50  aVarint(&p1, &iP
131f0 6f 73 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32  os1); iPos1 -= 2
13200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13210 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
13220 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Save ){.        
13230 61 73 73 65 72 74 28 20 70 70 20 26 26 20 70 20  assert( pp && p 
13240 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  );.        p = p
13250 53 61 76 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Save;.      }.. 
13260 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c       fts3Columnl
13270 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b  istCopy(0, &p1);
13280 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d  .      fts3Colum
13290 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 32  nlistCopy(0, &p2
132a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
132b0 20 28 2a 70 31 26 30 78 46 45 29 3d 3d 30 20 26   (*p1&0xFE)==0 &
132c0 26 20 28 2a 70 32 26 30 78 46 45 29 3d 3d 30 20  & (*p2&0xFE)==0 
132d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
132e0 2a 70 31 20 7c 7c 20 30 3d 3d 2a 70 32 20 29 20  *p1 || 0==*p2 ) 
132f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 31  break;..      p1
13300 2b 2b 3b 0a 20 20 20 20 20 20 70 31 20 2b 3d 20  ++;.      p1 += 
13310 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
13320 70 31 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20  p1, &iCol1);.   
13330 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 20 20 70     p2++;.      p
13340 32 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  2 += fts3GetVari
13350 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c 32 29  nt32(p2, &iCol2)
13360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13370 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20  Advance pointer 
13380 70 31 20 6f 72 20 70 32 20 28 77 68 69 63 68 65  p1 or p2 (whiche
13390 76 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ver corresponds 
133a0 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 6f  to the smaller o
133b0 66 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 31 20 61  f.    ** iCol1 a
133c0 6e 64 20 69 43 6f 6c 32 29 20 73 6f 20 74 68 61  nd iCol2) so tha
133d0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 65  t it points to e
133e0 69 74 68 65 72 20 74 68 65 20 30 78 30 30 20 74  ither the 0x00 t
133f0 68 61 74 20 6d 61 72 6b 73 20 74 68 65 0a 20 20  hat marks the.  
13400 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
13410 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20 6f  position list, o
13420 72 20 74 68 65 20 30 78 30 31 20 74 68 61 74 20  r the 0x01 that 
13430 70 72 65 63 65 64 65 73 20 74 68 65 20 6e 65 78  precedes the nex
13440 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  t .    ** column
13450 2d 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 70  -number in the p
13460 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 0a 20  osition list. . 
13470 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
13480 66 28 20 69 43 6f 6c 31 3c 69 43 6f 6c 32 20 29  f( iCol1<iCol2 )
13490 7b 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75  {.      fts3Colu
134a0 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
134b0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  1);.      if( 0=
134c0 3d 2a 70 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  =*p1 ) break;.  
134d0 20 20 20 20 70 31 2b 2b 3b 0a 20 20 20 20 20 20      p1++;.      
134e0 70 31 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  p1 += fts3GetVar
134f0 69 6e 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31  int32(p1, &iCol1
13500 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13510 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69      fts3Columnli
13520 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a  stCopy(0, &p2);.
13530 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 70 32        if( 0==*p2
13540 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
13550 70 32 2b 2b 3b 0a 20 20 20 20 20 20 70 32 20 2b  p2++;.      p2 +
13560 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
13570 32 28 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20  2(p2, &iCol2);. 
13580 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33     }.  }..  fts3
13590 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
135a0 70 32 29 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69  p2);.  fts3Posli
135b0 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a  stCopy(0, &p1);.
135c0 20 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 2a    *pp1 = p1;.  *
135d0 70 70 32 20 3d 20 70 32 3b 0a 20 20 69 66 28 20  pp2 = p2;.  if( 
135e0 2a 70 70 3d 3d 70 20 29 7b 0a 20 20 20 20 72 65  *pp==p ){.    re
135f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  turn 0;.  }.  *p
13600 2b 2b 20 3d 20 30 78 30 30 3b 0a 20 20 2a 70 70  ++ = 0x00;.  *pp
13610 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 31   = p;.  return 1
13620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
13630 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   two position-li
13640 73 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  sts as required 
13650 62 79 20 74 68 65 20 4e 45 41 52 20 6f 70 65 72  by the NEAR oper
13660 61 74 6f 72 2e 20 54 68 65 20 61 72 67 75 6d 65  ator. The argume
13670 6e 74 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c  nt.** position l
13680 69 73 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  ists correspond 
13690 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
136a0 72 69 67 68 74 20 70 68 72 61 73 65 73 20 6f 66  right phrases of
136b0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 0a   an expression .
136c0 2a 2a 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  ** like:.**.**  
136d0 20 20 20 22 70 68 72 61 73 65 20 31 22 20 4e 45     "phrase 1" NE
136e0 41 52 20 22 70 68 72 61 73 65 20 6e 75 6d 62 65  AR "phrase numbe
136f0 72 20 32 22 0a 2a 2a 0a 2a 2a 20 50 6f 73 69 74  r 2".**.** Posit
13700 69 6f 6e 20 6c 69 73 74 20 2a 70 70 31 20 63 6f  ion list *pp1 co
13710 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
13720 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
13730 6f 66 20 74 68 65 20 4e 45 41 52 20 0a 2a 2a 20  of the NEAR .** 
13740 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 2a  expression and *
13750 70 70 32 20 74 6f 20 74 68 65 20 72 69 67 68 74  pp2 to the right
13760 2e 20 41 73 20 75 73 75 61 6c 2c 20 74 68 65 20  . As usual, the 
13770 69 6e 64 65 78 65 73 20 69 6e 20 74 68 65 20 70  indexes in the p
13780 6f 73 69 74 69 6f 6e 20 0a 2a 2a 20 6c 69 73 74  osition .** list
13790 73 20 61 72 65 20 74 68 65 20 6f 66 66 73 65 74  s are the offset
137a0 73 20 6f 66 20 74 68 65 20 6c 61 73 74 20 74 6f  s of the last to
137b0 6b 65 6e 20 69 6e 20 65 61 63 68 20 70 68 72 61  ken in each phra
137c0 73 65 20 28 74 6f 6b 65 6e 73 20 22 31 22 20 61  se (tokens "1" a
137d0 6e 64 20 22 32 22 20 0a 2a 2a 20 69 6e 20 74 68  nd "2" .** in th
137e0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 29  e example above)
137f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70  ..**.** The outp
13800 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ut position list
13810 20 2d 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70   - written to *p
13820 70 20 2d 20 69 73 20 61 20 63 6f 70 79 20 6f 66  p - is a copy of
13830 20 2a 70 70 32 20 77 69 74 68 20 74 68 6f 73 65   *pp2 with those
13840 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74  .** entries that
13850 20 61 72 65 20 6e 6f 74 20 73 75 66 66 69 63 69   are not suffici
13860 65 6e 74 6c 79 20 4e 45 41 52 20 65 6e 74 72 69  ently NEAR entri
13870 65 73 20 69 6e 20 2a 70 70 31 20 72 65 6d 6f 76  es in *pp1 remov
13880 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13890 74 20 66 74 73 33 50 6f 73 6c 69 73 74 4e 65 61  t fts3PoslistNea
138a0 72 4d 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a  rMerge(.  char *
138b0 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
138c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
138d0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
138e0 63 68 61 72 20 2a 61 54 6d 70 2c 20 20 20 20 20  char *aTmp,     
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 62 75 66  /* Temporary buf
13910 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  fer space */.  i
13920 6e 74 20 6e 52 69 67 68 74 2c 20 20 20 20 20 20  nt nRight,      
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13940 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72  * Maximum differ
13950 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f  ence in token po
13960 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  sitions */.  int
13970 20 6e 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   nLeft,         
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13990 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e  Maximum differen
139a0 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69  ce in token posi
139b0 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
139c0 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20  **pp1,          
139d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
139e0 2f 4f 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74  /OUT: Left input
139f0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
13a00 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20 20 20  **pp2           
13a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
13a20 2f 4f 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75  /OUT: Right inpu
13a30 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  t list */.){.  c
13a40 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b 0a  har *p1 = *pp1;.
13a50 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a 70 70    char *p2 = *pp
13a60 32 3b 0a 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  2;..  char *pTmp
13a70 31 20 3d 20 61 54 6d 70 3b 0a 20 20 63 68 61 72  1 = aTmp;.  char
13a80 20 2a 70 54 6d 70 32 3b 0a 20 20 63 68 61 72 20   *pTmp2;.  char 
13a90 2a 61 54 6d 70 32 3b 0a 20 20 69 6e 74 20 72 65  *aTmp2;.  int re
13aa0 73 20 3d 20 31 3b 0a 0a 20 20 66 74 73 33 50 6f  s = 1;..  fts3Po
13ab0 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
13ac0 28 26 70 54 6d 70 31 2c 20 6e 52 69 67 68 74 2c  (&pTmp1, nRight,
13ad0 20 30 2c 20 30 2c 20 70 70 31 2c 20 70 70 32 29   0, 0, pp1, pp2)
13ae0 3b 0a 20 20 61 54 6d 70 32 20 3d 20 70 54 6d 70  ;.  aTmp2 = pTmp
13af0 32 20 3d 20 70 54 6d 70 31 3b 0a 20 20 2a 70 70  2 = pTmp1;.  *pp
13b00 31 20 3d 20 70 31 3b 0a 20 20 2a 70 70 32 20 3d  1 = p1;.  *pp2 =
13b10 20 70 32 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69   p2;.  fts3Posli
13b20 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 70  stPhraseMerge(&p
13b30 54 6d 70 32 2c 20 6e 4c 65 66 74 2c 20 31 2c 20  Tmp2, nLeft, 1, 
13b40 30 2c 20 70 70 32 2c 20 70 70 31 29 3b 0a 20 20  0, pp2, pp1);.  
13b50 69 66 28 20 70 54 6d 70 31 21 3d 61 54 6d 70 20  if( pTmp1!=aTmp 
13b60 26 26 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20  && pTmp2!=aTmp2 
13b70 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69  ){.    fts3Posli
13b80 73 74 4d 65 72 67 65 28 70 70 2c 20 26 61 54 6d  stMerge(pp, &aTm
13b90 70 2c 20 26 61 54 6d 70 32 29 3b 0a 20 20 7d 65  p, &aTmp2);.  }e
13ba0 6c 73 65 20 69 66 28 20 70 54 6d 70 31 21 3d 61  lse if( pTmp1!=a
13bb0 54 6d 70 20 29 7b 0a 20 20 20 20 66 74 73 33 50  Tmp ){.    fts3P
13bc0 6f 73 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26  oslistCopy(pp, &
13bd0 61 54 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69  aTmp);.  }else i
13be0 66 28 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20  f( pTmp2!=aTmp2 
13bf0 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69  ){.    fts3Posli
13c00 73 74 43 6f 70 79 28 70 70 2c 20 26 61 54 6d 70  stCopy(pp, &aTmp
13c10 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  2);.  }else{.   
13c20 20 72 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20   res = 0;.  }.. 
13c30 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
13c40 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  /* .** An instan
13c50 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
13c60 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ion is used to m
13c70 65 72 67 65 20 74 6f 67 65 74 68 65 72 20 74 68  erge together th
13c80 65 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 2a  e (potentially.*
13c90 2a 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f  * large number o
13ca0 66 29 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20  f) doclists for 
13cb0 65 61 63 68 20 74 65 72 6d 20 74 68 61 74 20 6d  each term that m
13cc0 61 74 63 68 65 73 20 61 20 70 72 65 66 69 78 20  atches a prefix 
13cd0 71 75 65 72 79 2e 0a 2a 2a 20 53 65 65 20 66 75  query..** See fu
13ce0 6e 63 74 69 6f 6e 20 66 74 73 33 54 65 72 6d 53  nction fts3TermS
13cf0 65 6c 65 63 74 4d 65 72 67 65 28 29 20 66 6f 72  electMerge() for
13d00 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 74 79 70   details..*/.typ
13d10 65 64 65 66 20 73 74 72 75 63 74 20 54 65 72 6d  edef struct Term
13d20 53 65 6c 65 63 74 20 54 65 72 6d 53 65 6c 65 63  Select TermSelec
13d30 74 3b 0a 73 74 72 75 63 74 20 54 65 72 6d 53 65  t;.struct TermSe
13d40 6c 65 63 74 20 7b 0a 20 20 63 68 61 72 20 2a 61  lect {.  char *a
13d50 61 4f 75 74 70 75 74 5b 31 36 5d 3b 20 20 20 20  aOutput[16];    
13d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c           /* Mall
13d70 6f 63 27 64 20 6f 75 74 70 75 74 20 62 75 66 66  oc'd output buff
13d80 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 4f  ers */.  int anO
13d90 75 74 70 75 74 5b 31 36 5d 3b 20 20 20 20 20 20  utput[16];      
13da0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13db0 20 65 61 63 68 20 6f 75 74 70 75 74 20 62 75 66   each output buf
13dc0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
13dd0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
13de0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
13df0 74 6f 20 72 65 61 64 20 61 20 73 69 6e 67 6c 65  to read a single
13e00 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 61 20 62   varint from a b
13e10 75 66 66 65 72 2e 20 50 61 72 61 6d 65 74 65 72  uffer. Parameter
13e20 0a 2a 2a 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  .** pEnd points 
13e30 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
13e40 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
13e50 72 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  r. When this fun
13e60 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
13e70 65 64 2c 20 69 66 20 2a 70 70 20 70 6f 69 6e 74  ed, if *pp point
13e80 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 67 72 65  s to pEnd or gre
13e90 61 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 65  ater, then the e
13ea0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
13eb0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 61  .** has been rea
13ec0 63 68 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ched. In this ca
13ed0 73 65 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  se *pp is set to
13ee0 20 30 20 61 6e 64 20 74 68 65 20 66 75 6e 63 74   0 and the funct
13ef0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
13f00 2a 2a 20 49 66 20 2a 70 70 20 64 6f 65 73 20 6e  ** If *pp does n
13f10 6f 74 20 70 6f 69 6e 74 20 74 6f 20 6f 72 20 70  ot point to or p
13f20 61 73 74 20 70 45 6e 64 2c 20 74 68 65 6e 20 61  ast pEnd, then a
13f30 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 69   single varint i
13f40 73 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 2a  s read.** from *
13f50 70 70 2e 20 2a 70 70 20 69 73 20 74 68 65 6e 20  pp. *pp is then 
13f60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 31 20 62  set to point 1 b
13f70 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
13f80 20 6f 66 20 74 68 65 20 72 65 61 64 20 76 61 72   of the read var
13f90 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 44  int..**.** If bD
13fa0 65 73 63 49 64 78 20 69 73 20 66 61 6c 73 65 2c  escIdx is false,
13fb0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
13fc0 69 73 20 61 64 64 65 64 20 74 6f 20 2a 70 56 61  is added to *pVa
13fd0 6c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  l before returni
13fe0 6e 67 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ng..** If it is 
13ff0 74 72 75 65 2c 20 74 68 65 20 76 61 6c 75 65 20  true, the value 
14000 72 65 61 64 20 69 73 20 73 75 62 74 72 61 63 74  read is subtract
14010 65 64 20 66 72 6f 6d 20 2a 70 56 61 6c 20 62 65  ed from *pVal be
14020 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
14030 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
14040 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14050 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
14060 74 33 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c  t3(.  char **pp,
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14080 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
14090 20 50 6f 69 6e 74 20 74 6f 20 72 65 61 64 20 76   Point to read v
140a0 61 72 69 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  arint from */.  
140b0 63 68 61 72 20 2a 70 45 6e 64 2c 20 20 20 20 20  char *pEnd,     
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 2f 2a 20 45 6e 64 20 6f 66 20 62 75 66 66 65 72  /* End of buffer
140e0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49   */.  int bDescI
140f0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
14100 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14110 20 64 6f 63 69 64 73 20 61 72 65 20 64 65 73 63   docids are desc
14120 65 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69  ending */.  sqli
14130 74 65 33 5f 69 6e 74 36 34 20 2a 70 56 61 6c 20  te3_int64 *pVal 
14140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14150 4e 2f 4f 55 54 3a 20 49 6e 74 65 67 65 72 20 76  N/OUT: Integer v
14160 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  alue */.){.  if(
14170 20 2a 70 70 3e 3d 70 45 6e 64 20 29 7b 0a 20 20   *pp>=pEnd ){.  
14180 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 65 6c    *pp = 0;.  }el
14190 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
141a0 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20 20 20  int64 iVal;.    
141b0 2a 70 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  *pp += sqlite3Ft
141c0 73 33 47 65 74 56 61 72 69 6e 74 28 2a 70 70 2c  s3GetVarint(*pp,
141d0 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28   &iVal);.    if(
141e0 20 62 44 65 73 63 49 64 78 20 29 7b 0a 20 20 20   bDescIdx ){.   
141f0 20 20 20 2a 70 56 61 6c 20 2d 3d 20 69 56 61 6c     *pVal -= iVal
14200 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14210 20 20 20 2a 70 56 61 6c 20 2b 3d 20 69 56 61 6c     *pVal += iVal
14220 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14230 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14240 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  on is used to wr
14250 69 74 65 20 61 20 73 69 6e 67 6c 65 20 76 61 72  ite a single var
14260 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 2e  int to a buffer.
14270 20 54 68 65 20 76 61 72 69 6e 74 0a 2a 2a 20 69   The varint.** i
14280 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70  s written to *pp
14290 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
142a0 6e 67 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  ng, *pp is set t
142b0 6f 20 70 6f 69 6e 74 20 31 20 62 79 74 65 20 70  o point 1 byte p
142c0 61 73 74 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ast the.** end o
142d0 66 20 74 68 65 20 76 61 6c 75 65 20 77 72 69 74  f the value writ
142e0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  ten..**.** If *p
142f0 62 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 77  bFirst is zero w
14300 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
14310 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
14320 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
14330 6f 0a 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20  o.** the buffer 
14340 69 73 20 74 68 61 74 20 6f 66 20 70 61 72 61 6d  is that of param
14350 65 74 65 72 20 69 56 61 6c 2e 20 0a 2a 2a 0a 2a  eter iVal. .**.*
14360 2a 20 49 66 20 2a 70 62 46 69 72 73 74 20 69 73  * If *pbFirst is
14370 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
14380 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14390 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
143a0 20 76 61 6c 75 65 20 0a 2a 2a 20 77 72 69 74 74   value .** writt
143b0 65 6e 20 69 73 20 65 69 74 68 65 72 20 28 69 56  en is either (iV
143c0 61 6c 2d 2a 70 69 50 72 65 76 29 20 28 69 66 20  al-*piPrev) (if 
143d0 62 44 65 73 63 49 64 78 20 69 73 20 7a 65 72 6f  bDescIdx is zero
143e0 29 20 6f 72 20 28 2a 70 69 50 72 65 76 2d 69 56  ) or (*piPrev-iV
143f0 61 6c 29 0a 2a 2a 20 28 69 66 20 62 44 65 73 63  al).** (if bDesc
14400 49 64 78 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29  Idx is non-zero)
14410 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
14420 65 74 75 72 6e 69 6e 67 2c 20 74 68 69 73 20 66  eturning, this f
14430 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
14440 65 74 73 20 2a 70 62 46 69 72 73 74 20 74 6f 20  ets *pbFirst to 
14450 31 20 61 6e 64 20 2a 70 69 50 72 65 76 0a 2a 2a  1 and *piPrev.**
14460 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
14470 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 6c 2e   parameter iVal.
14480 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14490 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
144a0 6e 74 33 28 0a 20 20 63 68 61 72 20 2a 2a 70 70  nt3(.  char **pp
144b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
144c0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
144d0 3a 20 4f 75 74 70 75 74 20 70 6f 69 6e 74 65 72  : Output pointer
144e0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49   */.  int bDescI
144f0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
14500 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
14510 72 20 64 65 73 63 65 6e 64 69 6e 67 20 64 6f 63  r descending doc
14520 69 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ids */.  sqlite3
14530 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76 2c 20  _int64 *piPrev, 
14540 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
14550 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76 61 6c  UT: Previous val
14560 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 69  ue written to li
14570 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 46  st */.  int *pbF
14580 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
14590 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
145a0 54 3a 20 54 72 75 65 20 61 66 74 65 72 20 66 69  T: True after fi
145b0 72 73 74 20 69 6e 74 20 77 72 69 74 74 65 6e 20  rst int written 
145c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
145d0 36 34 20 69 56 61 6c 20 20 20 20 20 20 20 20 20  64 iVal         
145e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
145f0 69 73 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20  is value to the 
14600 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  list */.){.  sql
14610 69 74 65 33 5f 69 6e 74 36 34 20 69 57 72 69 74  ite3_int64 iWrit
14620 65 3b 0a 20 20 69 66 28 20 62 44 65 73 63 49 64  e;.  if( bDescId
14630 78 3d 3d 30 20 7c 7c 20 2a 70 62 46 69 72 73 74  x==0 || *pbFirst
14640 3d 3d 30 20 29 7b 0a 20 20 20 20 69 57 72 69 74  ==0 ){.    iWrit
14650 65 20 3d 20 69 56 61 6c 20 2d 20 2a 70 69 50 72  e = iVal - *piPr
14660 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ev;.  }else{.   
14670 20 69 57 72 69 74 65 20 3d 20 2a 70 69 50 72 65   iWrite = *piPre
14680 76 20 2d 20 69 56 61 6c 3b 0a 20 20 7d 0a 20 20  v - iVal;.  }.  
14690 61 73 73 65 72 74 28 20 2a 70 62 46 69 72 73 74  assert( *pbFirst
146a0 20 7c 7c 20 2a 70 69 50 72 65 76 3d 3d 30 20 29   || *piPrev==0 )
146b0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 46  ;.  assert( *pbF
146c0 69 72 73 74 3d 3d 30 20 7c 7c 20 69 57 72 69 74  irst==0 || iWrit
146d0 65 3e 30 20 29 3b 0a 20 20 2a 70 70 20 2b 3d 20  e>0 );.  *pp += 
146e0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
146f0 72 69 6e 74 28 2a 70 70 2c 20 69 57 72 69 74 65  rint(*pp, iWrite
14700 29 3b 0a 20 20 2a 70 69 50 72 65 76 20 3d 20 69  );.  *piPrev = i
14710 56 61 6c 3b 0a 20 20 2a 70 62 46 69 72 73 74 20  Val;.  *pbFirst 
14720 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
14730 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
14740 64 20 62 79 20 76 61 72 69 6f 75 73 20 66 75 6e  d by various fun
14750 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65 72 67  ctions that merg
14760 65 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 65 20  e doclists. The 
14770 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  two.** arguments
14780 20 61 72 65 20 36 34 2d 62 69 74 20 64 6f 63 69   are 64-bit doci
14790 64 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65  d values. If the
147a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 74   value of the st
147b0 61 63 6b 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ack variable.** 
147c0 62 44 65 73 63 44 6f 63 6c 69 73 74 20 69 73 20  bDescDoclist is 
147d0 30 20 77 68 65 6e 20 74 68 69 73 20 6d 61 63 72  0 when this macr
147e0 6f 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68  o is invoked, th
147f0 65 6e 20 69 74 20 72 65 74 75 72 6e 73 20 28 69  en it returns (i
14800 31 2d 69 32 29 2e 20 0a 2a 2a 20 4f 74 68 65 72  1-i2). .** Other
14810 77 69 73 65 2c 20 28 69 32 2d 69 31 29 2e 0a 2a  wise, (i2-i1)..*
14820 2a 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  *.** Using this 
14830 6d 61 6b 65 73 20 69 74 20 65 61 73 69 65 72 20  makes it easier 
14840 74 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 68  to write code th
14850 61 74 20 63 61 6e 20 6d 65 72 67 65 20 64 6f 63  at can merge doc
14860 6c 69 73 74 73 20 74 68 61 74 20 61 72 65 0a 2a  lists that are.*
14870 2a 20 73 6f 72 74 65 64 20 69 6e 20 65 69 74 68  * sorted in eith
14880 65 72 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20  er ascending or 
14890 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72  descending order
148a0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 43  ..*/.#define DOC
148b0 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29 20 28  ID_CMP(i1, i2) (
148c0 28 62 44 65 73 63 44 6f 63 6c 69 73 74 3f 2d 31  (bDescDoclist?-1
148d0 3a 31 29 20 2a 20 28 69 31 2d 69 32 29 29 0a 0a  :1) * (i1-i2))..
148e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
148f0 69 6f 6e 20 64 6f 65 73 20 61 6e 20 22 4f 52 22  ion does an "OR"
14900 20 6d 65 72 67 65 20 6f 66 20 74 77 6f 20 64 6f   merge of two do
14910 63 6c 69 73 74 73 20 28 6f 75 74 70 75 74 20 63  clists (output c
14920 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 70  ontains all.** p
14930 6f 73 69 74 69 6f 6e 73 20 63 6f 6e 74 61 69 6e  ositions contain
14940 65 64 20 69 6e 20 65 69 74 68 65 72 20 61 72 67  ed in either arg
14950 75 6d 65 6e 74 20 64 6f 63 6c 69 73 74 29 2e 20  ument doclist). 
14960 49 66 20 74 68 65 20 64 6f 63 69 64 73 20 69 6e  If the docids in
14970 20 74 68 65 20 0a 2a 2a 20 69 6e 70 75 74 20 64   the .** input d
14980 6f 63 6c 69 73 74 73 20 61 72 65 20 73 6f 72 74  oclists are sort
14990 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
149a0 6f 72 64 65 72 2c 20 70 61 72 61 6d 65 74 65 72  order, parameter
149b0 20 62 44 65 73 63 44 6f 63 6c 69 73 74 0a 2a 2a   bDescDoclist.**
149c0 20 73 68 6f 75 6c 64 20 62 65 20 66 61 6c 73 65   should be false
149d0 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 73 6f  . If they are so
149e0 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  rted in ascendin
149f0 67 20 6f 72 64 65 72 2c 20 69 74 20 73 68 6f 75  g order, it shou
14a00 6c 64 20 62 65 0a 2a 2a 20 70 61 73 73 65 64 20  ld be.** passed 
14a10 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
14a30 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 61 4f  ror occurs, *paO
14a40 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
14a50 6e 74 20 61 74 20 61 6e 20 73 71 6c 69 74 65 33  nt at an sqlite3
14a60 5f 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72  _malloc'd buffer
14a70 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .** containing t
14a80 68 65 20 6f 75 74 70 75 74 20 64 6f 63 6c 69 73  he output doclis
14a90 74 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  t and SQLITE_OK 
14aa0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
14ab0 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 2a 70 6e  this case.** *pn
14ac0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
14ad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14ae0 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  s in the output 
14af0 64 6f 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  doclist..**.** I
14b00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14b10 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
14b20 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14b30 6e 65 64 2e 20 54 68 65 20 6f 75 74 70 75 74 20  ned. The output 
14b40 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 75 6e  values.** are un
14b50 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
14b60 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
14b70 69 6e 74 20 66 74 73 33 44 6f 63 6c 69 73 74 4f  int fts3DoclistO
14b80 72 4d 65 72 67 65 28 0a 20 20 69 6e 74 20 62 44  rMerge(.  int bD
14b90 65 73 63 44 6f 63 6c 69 73 74 2c 20 20 20 20 20  escDoclist,     
14ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14bb0 65 20 69 66 20 61 72 67 75 6d 65 6e 74 73 20 61  e if arguments a
14bc0 72 65 20 64 65 73 63 20 2a 2f 0a 20 20 63 68 61  re desc */.  cha
14bd0 72 20 2a 61 31 2c 20 69 6e 74 20 6e 31 2c 20 20  r *a1, int n1,  
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14bf0 46 69 72 73 74 20 64 6f 63 6c 69 73 74 20 2a 2f  First doclist */
14c00 0a 20 20 63 68 61 72 20 2a 61 32 2c 20 69 6e 74  .  char *a2, int
14c10 20 6e 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   n2,            
14c20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 64 6f 63     /* Second doc
14c30 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
14c40 2a 70 61 4f 75 74 2c 20 69 6e 74 20 2a 70 6e 4f  *paOut, int *pnO
14c50 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ut        /* OUT
14c60 3a 20 4d 61 6c 6c 6f 63 27 64 20 64 6f 63 6c 69  : Malloc'd docli
14c70 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  st */.){.  sqlit
14c80 65 33 5f 69 6e 74 36 34 20 69 31 20 3d 20 30 3b  e3_int64 i1 = 0;
14c90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
14ca0 20 69 32 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   i2 = 0;.  sqlit
14cb0 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d  e3_int64 iPrev =
14cc0 20 30 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64   0;.  char *pEnd
14cd0 31 20 3d 20 26 61 31 5b 6e 31 5d 3b 0a 20 20 63  1 = &a1[n1];.  c
14ce0 68 61 72 20 2a 70 45 6e 64 32 20 3d 20 26 61 32  har *pEnd2 = &a2
14cf0 5b 6e 32 5d 3b 0a 20 20 63 68 61 72 20 2a 70 31  [n2];.  char *p1
14d00 20 3d 20 61 31 3b 0a 20 20 63 68 61 72 20 2a 70   = a1;.  char *p
14d10 32 20 3d 20 61 32 3b 0a 20 20 63 68 61 72 20 2a  2 = a2;.  char *
14d20 70 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b  p;.  char *aOut;
14d30 0a 20 20 69 6e 74 20 62 46 69 72 73 74 4f 75 74  .  int bFirstOut
14d40 20 3d 20 30 3b 0a 0a 20 20 2a 70 61 4f 75 74 20   = 0;..  *paOut 
14d50 3d 20 30 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20  = 0;.  *pnOut = 
14d60 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  0;..  /* Allocat
14d70 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
14d80 6f 75 74 70 75 74 2e 20 42 6f 74 68 20 74 68 65  output. Both the
14d90 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75   input and outpu
14da0 74 20 64 6f 63 6c 69 73 74 73 0a 20 20 2a 2a 20  t doclists.  ** 
14db0 61 72 65 20 64 65 6c 74 61 20 65 6e 63 6f 64 65  are delta encode
14dc0 64 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 69  d. If they are i
14dd0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
14de0 72 20 28 62 44 65 73 63 44 6f 63 6c 69 73 74 3d  r (bDescDoclist=
14df0 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  =0),.  ** then t
14e00 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 69  he first docid i
14e10 6e 20 65 61 63 68 20 6c 69 73 74 20 69 73 20 73  n each list is s
14e20 69 6d 70 6c 79 20 65 6e 63 6f 64 65 64 20 61 73  imply encoded as
14e30 20 61 20 76 61 72 69 6e 74 2e 20 46 6f 72 0a 20   a varint. For. 
14e40 20 2a 2a 20 65 61 63 68 20 73 75 62 73 65 71 75   ** each subsequ
14e50 65 6e 74 20 64 6f 63 69 64 2c 20 74 68 65 20 76  ent docid, the v
14e60 61 72 69 6e 74 20 73 74 6f 72 65 64 20 69 73 20  arint stored is 
14e70 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
14e80 65 74 77 65 65 6e 20 74 68 65 0a 20 20 2a 2a 20  etween the.  ** 
14e90 63 75 72 72 65 6e 74 20 61 6e 64 20 70 72 65 76  current and prev
14ea0 69 6f 75 73 20 64 6f 63 69 64 20 28 61 20 70 6f  ious docid (a po
14eb0 73 69 74 69 76 65 20 6e 75 6d 62 65 72 20 2d 20  sitive number - 
14ec0 73 69 6e 63 65 20 74 68 65 20 6c 69 73 74 20 69  since the list i
14ed0 73 20 69 6e 0a 20 20 2a 2a 20 61 73 63 65 6e 64  s in.  ** ascend
14ee0 69 6e 67 20 6f 72 64 65 72 29 2e 0a 20 20 2a 2a  ing order)..  **
14ef0 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
14f00 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
14f10 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 74   the output is t
14f20 68 65 72 65 66 6f 72 65 20 65 6e 63 6f 64 65 64  herefore encoded
14f30 20 75 73 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a   using the .  **
14f40 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
14f50 62 79 74 65 73 20 61 73 20 69 74 20 69 73 20 69  bytes as it is i
14f60 6e 20 77 68 69 63 68 65 76 65 72 20 6f 66 20 74  n whichever of t
14f70 68 65 20 69 6e 70 75 74 20 6c 69 73 74 73 20 69  he input lists i
14f80 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 64 20 66  t is.  ** read f
14f90 72 6f 6d 2e 20 41 6e 64 20 65 61 63 68 20 73 75  rom. And each su
14fa0 62 73 65 71 75 65 6e 74 20 64 6f 63 69 64 20 72  bsequent docid r
14fb0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ead from the sam
14fc0 65 20 69 6e 70 75 74 20 6c 69 73 74 20 0a 20 20  e input list .  
14fd0 2a 2a 20 63 6f 6e 73 75 6d 65 73 20 65 69 74 68  ** consumes eith
14fe0 65 72 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  er the same or l
14ff0 65 73 73 20 62 79 74 65 73 20 61 73 20 69 74 20  ess bytes as it 
15000 64 69 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74  did in the input
15010 20 28 73 69 6e 63 65 0a 20 20 2a 2a 20 74 68 65   (since.  ** the
15020 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
15030 65 65 6e 20 69 74 20 61 6e 64 20 74 68 65 20 70  een it and the p
15040 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 69 6e  revious value in
15050 20 74 68 65 20 6f 75 74 70 75 74 20 6d 75 73 74   the output must
15060 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 73 69 74  .  ** be a posit
15070 69 76 65 20 76 61 6c 75 65 20 6c 65 73 73 20 74  ive value less t
15080 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
15090 74 68 65 20 64 65 6c 74 61 20 76 61 6c 75 65 20  the delta value 
150a0 72 65 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20  read from .  ** 
150b0 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 29 2e  the input list).
150c0 20 54 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65   The same argume
150d0 6e 74 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c  nt applies to al
150e0 6c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  l but the first 
150f0 64 6f 63 69 64 0a 20 20 2a 2a 20 72 65 61 64 20  docid.  ** read 
15100 66 72 6f 6d 20 74 68 65 20 27 6f 74 68 65 72 27  from the 'other'
15110 20 6c 69 73 74 2e 20 41 6e 64 20 74 6f 20 74 68   list. And to th
15120 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c  e contents of al
15130 6c 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  l position lists
15140 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
15150 62 65 20 63 6f 70 69 65 64 20 61 6e 64 20 6d 65  be copied and me
15160 72 67 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  rged from the in
15170 70 75 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  put to the outpu
15180 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  t..  **.  ** How
15190 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 72  ever, if the fir
151a0 73 74 20 64 6f 63 69 64 20 63 6f 70 69 65 64 20  st docid copied 
151b0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  to the output is
151c0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
151d0 65 72 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  er,.  ** then th
151e0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
151f0 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 72  e first docid fr
15200 6f 6d 20 74 68 65 20 27 6f 74 68 65 72 27 20 69  om the 'other' i
15210 6e 70 75 74 20 6c 69 73 74 20 6d 61 79 0a 20 20  nput list may.  
15220 2a 2a 20 62 65 20 6c 61 72 67 65 72 20 69 6e 20  ** be larger in 
15230 74 68 65 20 6f 75 74 70 75 74 20 74 68 61 6e 20  the output than 
15240 69 74 20 77 61 73 20 69 6e 20 74 68 65 20 69 6e  it was in the in
15250 70 75 74 20 28 73 69 6e 63 65 20 74 68 65 20 64  put (since the d
15260 65 6c 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  elta value.  ** 
15270 6d 61 79 20 62 65 20 61 20 6c 61 72 67 65 72 20  may be a larger 
15280 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
15290 20 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c   than the actual
152a0 20 64 6f 63 69 64 29 2e 0a 20 20 2a 2a 0a 20 20   docid)..  **.  
152b0 2a 2a 20 54 68 65 20 73 70 61 63 65 20 72 65 71  ** The space req
152c0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
152d0 68 65 20 6f 75 74 70 75 74 20 69 73 20 74 68 65  he output is the
152e0 72 65 66 6f 72 65 20 74 68 65 20 73 75 6d 20 6f  refore the sum o
152f0 66 20 74 68 65 0a 20 20 2a 2a 20 73 69 7a 65 73  f the.  ** sizes
15300 20 6f 66 20 74 68 65 20 74 77 6f 20 69 6e 70 75   of the two inpu
15310 74 73 2c 20 70 6c 75 73 20 65 6e 6f 75 67 68 20  ts, plus enough 
15320 73 70 61 63 65 20 66 6f 72 20 65 78 61 63 74 6c  space for exactl
15330 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70  y one of the inp
15340 75 74 0a 20 20 2a 2a 20 64 6f 63 69 64 73 20 74  ut.  ** docids t
15350 6f 20 67 72 6f 77 2e 20 0a 20 20 2a 2a 0a 20 20  o grow. .  **.  
15360 2a 2a 20 41 20 73 79 6d 65 74 72 69 63 20 61 72  ** A symetric ar
15370 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 6d 61  gument may be ma
15380 64 65 20 69 66 20 74 68 65 20 64 6f 63 6c 69 73  de if the doclis
15390 74 73 20 61 72 65 20 69 6e 20 64 65 73 63 65 6e  ts are in descen
153a0 64 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 64 65 72  ding .  ** order
153b0 2e 0a 20 20 2a 2f 0a 20 20 61 4f 75 74 20 3d 20  ..  */.  aOut = 
153c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
153d0 31 2b 6e 32 2b 46 54 53 33 5f 56 41 52 49 4e 54  1+n2+FTS3_VARINT
153e0 5f 4d 41 58 2d 31 29 3b 0a 20 20 69 66 28 20 21  _MAX-1);.  if( !
153f0 61 4f 75 74 20 29 20 72 65 74 75 72 6e 20 53 51  aOut ) return SQ
15400 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 70  LITE_NOMEM;..  p
15410 20 3d 20 61 4f 75 74 3b 0a 20 20 66 74 73 33 47   = aOut;.  fts3G
15420 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15430 70 31 2c 20 70 45 6e 64 31 2c 20 30 2c 20 26 69  p1, pEnd1, 0, &i
15440 31 29 3b 0a 20 20 66 74 73 33 47 65 74 44 65 6c  1);.  fts3GetDel
15450 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70  taVarint3(&p2, p
15460 45 6e 64 32 2c 20 30 2c 20 26 69 32 29 3b 0a 20  End2, 0, &i2);. 
15470 20 77 68 69 6c 65 28 20 70 31 20 7c 7c 20 70 32   while( p1 || p2
15480 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15490 69 6e 74 36 34 20 69 44 69 66 66 20 3d 20 44 4f  int64 iDiff = DO
154a0 43 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29 3b  CID_CMP(i1, i2);
154b0 0a 0a 20 20 20 20 69 66 28 20 70 32 20 26 26 20  ..    if( p2 && 
154c0 70 31 20 26 26 20 69 44 69 66 66 3d 3d 30 20 29  p1 && iDiff==0 )
154d0 7b 0a 20 20 20 20 20 20 66 74 73 33 50 75 74 44  {.      fts3PutD
154e0 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 2c 20  eltaVarint3(&p, 
154f0 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69  bDescDoclist, &i
15500 50 72 65 76 2c 20 26 62 46 69 72 73 74 4f 75 74  Prev, &bFirstOut
15510 2c 20 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73  , i1);.      fts
15520 33 50 6f 73 6c 69 73 74 4d 65 72 67 65 28 26 70  3PoslistMerge(&p
15530 2c 20 26 70 31 2c 20 26 70 32 29 3b 0a 20 20 20  , &p1, &p2);.   
15540 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56     fts3GetDeltaV
15550 61 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e 64  arint3(&p1, pEnd
15560 31 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  1, bDescDoclist,
15570 20 26 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73   &i1);.      fts
15580 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3GetDeltaVarint3
15590 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 62 44 65  (&p2, pEnd2, bDe
155a0 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b  scDoclist, &i2);
155b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
155c0 70 32 20 7c 7c 20 28 70 31 20 26 26 20 69 44 69  p2 || (p1 && iDi
155d0 66 66 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 66  ff<0) ){.      f
155e0 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
155f0 74 33 28 26 70 2c 20 62 44 65 73 63 44 6f 63 6c  t3(&p, bDescDocl
15600 69 73 74 2c 20 26 69 50 72 65 76 2c 20 26 62 46  ist, &iPrev, &bF
15610 69 72 73 74 4f 75 74 2c 20 69 31 29 3b 0a 20 20  irstOut, i1);.  
15620 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43      fts3PoslistC
15630 6f 70 79 28 26 70 2c 20 26 70 31 29 3b 0a 20 20  opy(&p, &p1);.  
15640 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
15650 56 61 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e  Varint3(&p1, pEn
15660 64 31 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74  d1, bDescDoclist
15670 2c 20 26 69 31 29 3b 0a 20 20 20 20 7d 65 6c 73  , &i1);.    }els
15680 65 7b 0a 20 20 20 20 20 20 66 74 73 33 50 75 74  e{.      fts3Put
15690 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 2c  DeltaVarint3(&p,
156a0 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26   bDescDoclist, &
156b0 69 50 72 65 76 2c 20 26 62 46 69 72 73 74 4f 75  iPrev, &bFirstOu
156c0 74 2c 20 69 32 29 3b 0a 20 20 20 20 20 20 66 74  t, i2);.      ft
156d0 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 26 70  s3PoslistCopy(&p
156e0 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20 66 74  , &p2);.      ft
156f0 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
15700 33 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 62 44  3(&p2, pEnd2, bD
15710 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 32 29  escDoclist, &i2)
15720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
15730 70 61 4f 75 74 20 3d 20 61 4f 75 74 3b 0a 20 20  paOut = aOut;.  
15740 2a 70 6e 4f 75 74 20 3d 20 28 69 6e 74 29 28 70  *pnOut = (int)(p
15750 2d 61 4f 75 74 29 3b 0a 20 20 61 73 73 65 72 74  -aOut);.  assert
15760 28 20 2a 70 6e 4f 75 74 3c 3d 6e 31 2b 6e 32 2b  ( *pnOut<=n1+n2+
15770 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2d  FTS3_VARINT_MAX-
15780 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  1 );.  return SQ
15790 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
157a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
157b0 64 6f 65 73 20 61 20 22 70 68 72 61 73 65 22 20  does a "phrase" 
157c0 6d 65 72 67 65 20 6f 66 20 74 77 6f 20 64 6f 63  merge of two doc
157d0 6c 69 73 74 73 2e 20 49 6e 20 61 20 70 68 72 61  lists. In a phra
157e0 73 65 20 6d 65 72 67 65 2c 0a 2a 2a 20 74 68 65  se merge,.** the
157f0 20 6f 75 74 70 75 74 20 63 6f 6e 74 61 69 6e 73   output contains
15800 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
15810 70 6f 73 69 74 69 6f 6e 20 66 72 6f 6d 20 74 68  position from th
15820 65 20 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70  e right-hand inp
15830 75 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 66 6f  ut.** doclist fo
15840 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
15850 20 61 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74   a position in t
15860 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 69 6e 70  he left-hand inp
15870 75 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 65 78  ut doclist.** ex
15880 61 63 74 6c 79 20 6e 44 69 73 74 20 74 6f 6b 65  actly nDist toke
15890 6e 73 20 62 65 66 6f 72 65 20 69 74 2e 0a 2a 2a  ns before it..**
158a0 0a 2a 2a 20 49 66 20 74 68 65 20 64 6f 63 69 64  .** If the docid
158b0 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 64  s in the input d
158c0 6f 63 6c 69 73 74 73 20 61 72 65 20 73 6f 72 74  oclists are sort
158d0 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
158e0 6f 72 64 65 72 2c 0a 2a 2a 20 70 61 72 61 6d 65  order,.** parame
158f0 74 65 72 20 62 44 65 73 63 44 6f 63 6c 69 73 74  ter bDescDoclist
15900 20 73 68 6f 75 6c 64 20 62 65 20 66 61 6c 73 65   should be false
15910 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 73 6f  . If they are so
15920 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  rted in ascendin
15930 67 20 0a 2a 2a 20 6f 72 64 65 72 2c 20 69 74 20  g .** order, it 
15940 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
15950 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15960 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  e..**.** The rig
15970 68 74 2d 68 61 6e 64 20 69 6e 70 75 74 20 64 6f  ht-hand input do
15980 63 6c 69 73 74 20 69 73 20 6f 76 65 72 77 72 69  clist is overwri
15990 74 74 65 6e 20 62 79 20 74 68 69 73 20 66 75 6e  tten by this fun
159a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
159b0 20 69 6e 74 20 66 74 73 33 44 6f 63 6c 69 73 74   int fts3Doclist
159c0 50 68 72 61 73 65 4d 65 72 67 65 28 0a 20 20 69  PhraseMerge(.  i
159d0 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  nt bDescDoclist,
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159f0 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65  * True if argume
15a00 6e 74 73 20 61 72 65 20 64 65 73 63 20 2a 2f 0a  nts are desc */.
15a10 20 20 69 6e 74 20 6e 44 69 73 74 2c 20 20 20 20    int nDist,    
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 2f 2a 20 44 69 73 74 61 6e 63 65 20 66 72    /* Distance fr
15a40 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
15a50 20 28 31 3d 61 64 6a 61 63 65 6e 74 29 20 2a 2f   (1=adjacent) */
15a60 0a 20 20 63 68 61 72 20 2a 61 4c 65 66 74 2c 20  .  char *aLeft, 
15a70 69 6e 74 20 6e 4c 65 66 74 2c 20 20 20 20 20 20  int nLeft,      
15a80 20 20 20 2f 2a 20 4c 65 66 74 20 64 6f 63 6c 69     /* Left docli
15a90 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  st */.  char **p
15aa0 61 52 69 67 68 74 2c 20 69 6e 74 20 2a 70 6e 52  aRight, int *pnR
15ab0 69 67 68 74 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ight    /* IN/OU
15ac0 54 3a 20 52 69 67 68 74 2f 6f 75 74 70 75 74 20  T: Right/output 
15ad0 64 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  doclist */.){.  
15ae0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 31  sqlite3_int64 i1
15af0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
15b00 69 6e 74 36 34 20 69 32 20 3d 20 30 3b 0a 20 20  int64 i2 = 0;.  
15b10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
15b20 72 65 76 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  rev = 0;.  char 
15b30 2a 61 52 69 67 68 74 20 3d 20 2a 70 61 52 69 67  *aRight = *paRig
15b40 68 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  ht;.  char *pEnd
15b50 31 20 3d 20 26 61 4c 65 66 74 5b 6e 4c 65 66 74  1 = &aLeft[nLeft
15b60 5d 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 32  ];.  char *pEnd2
15b70 20 3d 20 26 61 52 69 67 68 74 5b 2a 70 6e 52 69   = &aRight[*pnRi
15b80 67 68 74 5d 3b 0a 20 20 63 68 61 72 20 2a 70 31  ght];.  char *p1
15b90 20 3d 20 61 4c 65 66 74 3b 0a 20 20 63 68 61 72   = aLeft;.  char
15ba0 20 2a 70 32 20 3d 20 61 52 69 67 68 74 3b 0a 20   *p2 = aRight;. 
15bb0 20 63 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20   char *p;.  int 
15bc0 62 46 69 72 73 74 4f 75 74 20 3d 20 30 3b 0a 20  bFirstOut = 0;. 
15bd0 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20   char *aOut;..  
15be0 61 73 73 65 72 74 28 20 6e 44 69 73 74 3e 30 20  assert( nDist>0 
15bf0 29 3b 0a 20 20 69 66 28 20 62 44 65 73 63 44 6f  );.  if( bDescDo
15c00 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 61 4f 75  clist ){.    aOu
15c10 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
15c20 6f 63 28 2a 70 6e 52 69 67 68 74 20 2b 20 46 54  oc(*pnRight + FT
15c30 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a  S3_VARINT_MAX);.
15c40 20 20 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20      if( aOut==0 
15c50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15c60 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
15c70 20 20 20 20 61 4f 75 74 20 3d 20 61 52 69 67 68      aOut = aRigh
15c80 74 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 61 4f 75  t;.  }.  p = aOu
15c90 74 3b 0a 0a 20 20 66 74 73 33 47 65 74 44 65 6c  t;..  fts3GetDel
15ca0 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20 70  taVarint3(&p1, p
15cb0 45 6e 64 31 2c 20 30 2c 20 26 69 31 29 3b 0a 20  End1, 0, &i1);. 
15cc0 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
15cd0 69 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32 2c  int3(&p2, pEnd2,
15ce0 20 30 2c 20 26 69 32 29 3b 0a 0a 20 20 77 68 69   0, &i2);..  whi
15cf0 6c 65 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a  le( p1 && p2 ){.
15d00 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
15d10 34 20 69 44 69 66 66 20 3d 20 44 4f 43 49 44 5f  4 iDiff = DOCID_
15d20 43 4d 50 28 69 31 2c 20 69 32 29 3b 0a 20 20 20  CMP(i1, i2);.   
15d30 20 69 66 28 20 69 44 69 66 66 3d 3d 30 20 29 7b   if( iDiff==0 ){
15d40 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 53 61  .      char *pSa
15d50 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 73 71  ve = p;.      sq
15d60 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65  lite3_int64 iPre
15d70 76 53 61 76 65 20 3d 20 69 50 72 65 76 3b 0a 20  vSave = iPrev;. 
15d80 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 4f       int bFirstO
15d90 75 74 53 61 76 65 20 3d 20 62 46 69 72 73 74 4f  utSave = bFirstO
15da0 75 74 3b 0a 0a 20 20 20 20 20 20 66 74 73 33 50  ut;..      fts3P
15db0 75 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  utDeltaVarint3(&
15dc0 70 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  p, bDescDoclist,
15dd0 20 26 69 50 72 65 76 2c 20 26 62 46 69 72 73 74   &iPrev, &bFirst
15de0 4f 75 74 2c 20 69 31 29 3b 0a 20 20 20 20 20 20  Out, i1);.      
15df0 69 66 28 20 30 3d 3d 66 74 73 33 50 6f 73 6c 69  if( 0==fts3Posli
15e00 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 70  stPhraseMerge(&p
15e10 2c 20 6e 44 69 73 74 2c 20 30 2c 20 31 2c 20 26  , nDist, 0, 1, &
15e20 70 31 2c 20 26 70 32 29 20 29 7b 0a 20 20 20 20  p1, &p2) ){.    
15e30 20 20 20 20 70 20 3d 20 70 53 61 76 65 3b 0a 20      p = pSave;. 
15e40 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
15e50 50 72 65 76 53 61 76 65 3b 0a 20 20 20 20 20 20  PrevSave;.      
15e60 20 20 62 46 69 72 73 74 4f 75 74 20 3d 20 62 46    bFirstOut = bF
15e70 69 72 73 74 4f 75 74 53 61 76 65 3b 0a 20 20 20  irstOutSave;.   
15e80 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 47     }.      fts3G
15e90 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15ea0 70 31 2c 20 70 45 6e 64 31 2c 20 62 44 65 73 63  p1, pEnd1, bDesc
15eb0 44 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b 0a 20  Doclist, &i1);. 
15ec0 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
15ed0 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70 45  aVarint3(&p2, pE
15ee0 6e 64 32 2c 20 62 44 65 73 63 44 6f 63 6c 69 73  nd2, bDescDoclis
15ef0 74 2c 20 26 69 32 29 3b 0a 20 20 20 20 7d 65 6c  t, &i2);.    }el
15f00 73 65 20 69 66 28 20 69 44 69 66 66 3c 30 20 29  se if( iDiff<0 )
15f10 7b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  {.      fts3Posl
15f20 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b  istCopy(0, &p1);
15f30 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65  .      fts3GetDe
15f40 6c 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20  ltaVarint3(&p1, 
15f50 70 45 6e 64 31 2c 20 62 44 65 73 63 44 6f 63 6c  pEnd1, bDescDocl
15f60 69 73 74 2c 20 26 69 31 29 3b 0a 20 20 20 20 7d  ist, &i1);.    }
15f70 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 33  else{.      fts3
15f80 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
15f90 70 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47  p2);.      fts3G
15fa0 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15fb0 70 32 2c 20 70 45 6e 64 32 2c 20 62 44 65 73 63  p2, pEnd2, bDesc
15fc0 44 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20  Doclist, &i2);. 
15fd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52     }.  }..  *pnR
15fe0 69 67 68 74 20 3d 20 28 69 6e 74 29 28 70 20 2d  ight = (int)(p -
15ff0 20 61 4f 75 74 29 3b 0a 20 20 69 66 28 20 62 44   aOut);.  if( bD
16000 65 73 63 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  escDoclist ){.  
16010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
16020 52 69 67 68 74 29 3b 0a 20 20 20 20 2a 70 61 52  Right);.    *paR
16030 69 67 68 74 20 3d 20 61 4f 75 74 3b 0a 20 20 7d  ight = aOut;.  }
16040 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
16050 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16060 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 70 6f  rgument pList po
16070 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69  ints to a positi
16080 6f 6e 20 6c 69 73 74 20 6e 4c 69 73 74 20 62 79  on list nList by
16090 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
160a0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 68  s.** function ch
160b0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
160c0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
160d0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 65 6e   contains any en
160e0 74 72 69 65 73 20 66 6f 72 0a 2a 2a 20 61 20 74  tries for.** a t
160f0 6f 6b 65 6e 20 69 6e 20 70 6f 73 69 74 69 6f 6e  oken in position
16100 20 30 20 28 6f 66 20 61 6e 79 20 63 6f 6c 75 6d   0 (of any colum
16110 6e 29 2e 20 49 66 20 73 6f 2c 20 69 74 20 77 72  n). If so, it wr
16120 69 74 65 73 20 61 72 67 75 6d 65 6e 74 20 69 44  ites argument iD
16130 65 6c 74 61 0a 2a 2a 20 74 6f 20 74 68 65 20 6f  elta.** to the o
16140 75 74 70 75 74 20 62 75 66 66 65 72 20 70 4f 75  utput buffer pOu
16150 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  t, followed by a
16160 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
16170 6f 6e 73 69 73 74 69 6e 67 20 6f 6e 6c 79 0a 2a  onsisting only.*
16180 2a 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73  * of the entries
16190 20 66 72 6f 6d 20 70 4c 69 73 74 20 61 74 20 70   from pList at p
161a0 6f 73 69 74 69 6f 6e 20 30 2c 20 61 6e 64 20 74  osition 0, and t
161b0 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 6e 20  erminated by an 
161c0 30 78 30 30 20 62 79 74 65 2e 0a 2a 2a 20 54 68  0x00 byte..** Th
161d0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
161e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
161f0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
16200 74 6f 20 70 4f 75 74 20 28 69 66 20 61 6e 79 29  to pOut (if any)
16210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16220 46 74 73 33 46 69 72 73 74 46 69 6c 74 65 72 28  Fts3FirstFilter(
16230 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
16240 20 69 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20   iDelta,        
16250 20 20 20 2f 2a 20 56 61 72 69 6e 74 20 74 68 61     /* Varint tha
16260 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
16270 20 74 6f 20 70 4f 75 74 20 2a 2f 0a 20 20 63 68   to pOut */.  ch
16280 61 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ar *pList,      
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
162a0 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 28   Position list (
162b0 6e 6f 20 30 78 30 30 20 74 65 72 6d 29 20 2a 2f  no 0x00 term) */
162c0 0a 20 20 69 6e 74 20 6e 4c 69 73 74 2c 20 20 20  .  int nList,   
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4c     /* Size of pL
162f0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
16300 20 20 63 68 61 72 20 2a 70 4f 75 74 20 20 20 20    char *pOut    
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 70 75    /* Write outpu
16330 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
16340 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 69  nt nOut = 0;.  i
16350 6e 74 20 62 57 72 69 74 74 65 6e 20 3d 20 30 3b  nt bWritten = 0;
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16370 2a 20 54 72 75 65 20 6f 6e 63 65 20 69 44 65 6c  * True once iDel
16380 74 61 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ta has been writ
16390 74 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ten */.  char *p
163a0 20 3d 20 70 4c 69 73 74 3b 0a 20 20 63 68 61 72   = pList;.  char
163b0 20 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b   *pEnd = &pList[
163c0 6e 4c 69 73 74 5d 3b 0a 0a 20 20 69 66 28 20 2a  nList];..  if( *
163d0 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 69  p!=0x01 ){.    i
163e0 66 28 20 2a 70 3d 3d 30 78 30 32 20 29 7b 0a 20  f( *p==0x02 ){. 
163f0 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c       nOut += sql
16400 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
16410 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69  t(&pOut[nOut], i
16420 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 4f  Delta);.      pO
16430 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30  ut[nOut++] = 0x0
16440 32 3b 0a 20 20 20 20 20 20 62 57 72 69 74 74 65  2;.      bWritte
16450 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 1;.    }.   
16460 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43   fts3ColumnlistC
16470 6f 70 79 28 30 2c 20 26 70 29 3b 0a 20 20 7d 0a  opy(0, &p);.  }.
16480 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64  .  while( p<pEnd
16490 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
164a0 69 6e 74 36 34 20 69 43 6f 6c 3b 0a 20 20 20 20  int64 iCol;.    
164b0 70 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d 20 73 71  p++;.    p += sq
164c0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
164d0 6e 74 28 70 2c 20 26 69 43 6f 6c 29 3b 0a 20 20  nt(p, &iCol);.  
164e0 20 20 69 66 28 20 2a 70 3d 3d 30 78 30 32 20 29    if( *p==0x02 )
164f0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 57 72 69  {.      if( bWri
16500 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tten==0 ){.     
16510 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c 69 74     nOut += sqlit
16520 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
16530 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69 44 65  &pOut[nOut], iDe
16540 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 62 57  lta);.        bW
16550 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
16560 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 5b 6e    }.      pOut[n
16570 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 31 3b 0a 20  Out++] = 0x01;. 
16580 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c       nOut += sql
16590 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
165a0 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69  t(&pOut[nOut], i
165b0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 4f 75 74  Col);.      pOut
165c0 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 32 3b  [nOut++] = 0x02;
165d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 43  .    }.    fts3C
165e0 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c  olumnlistCopy(0,
165f0 20 26 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   &p);.  }.  if( 
16600 62 57 72 69 74 74 65 6e 20 29 7b 0a 20 20 20 20  bWritten ){.    
16610 70 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30  pOut[nOut++] = 0
16620 78 30 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  x00;.  }..  retu
16630 72 6e 20 6e 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nOut;.}.../*.
16640 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 64 6f 63  ** Merge all doc
16650 6c 69 73 74 73 20 69 6e 20 74 68 65 20 54 65 72  lists in the Ter
16660 6d 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74  mSelect.aaOutput
16670 5b 5d 20 61 72 72 61 79 20 69 6e 74 6f 20 61 20  [] array into a 
16680 73 69 6e 67 6c 65 0a 2a 2a 20 64 6f 63 6c 69 73  single.** doclis
16690 74 20 73 74 6f 72 65 64 20 69 6e 20 54 65 72 6d  t stored in Term
166a0 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74 5b  Select.aaOutput[
166b0 30 5d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  0]. If successfu
166c0 6c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 0a 2a 2a  l, delete all.**
166d0 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 73 20   other doclists 
166e0 28 65 78 63 65 70 74 20 74 68 65 20 61 61 4f 75  (except the aaOu
166f0 74 70 75 74 5b 30 5d 20 6f 6e 65 29 20 61 6e 64  tput[0] one) and
16700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16710 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  K..**.** If an O
16720 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
16730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16740 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
16750 73 65 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20  se it is.** the 
16760 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16770 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
16780 66 72 65 65 20 61 6e 79 20 64 6f 63 6c 69 73 74  free any doclist
16790 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  s left in the.**
167a0 20 54 65 72 6d 53 65 6c 65 63 74 2e 61 61 4f 75   TermSelect.aaOu
167b0 74 70 75 74 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  tput[] array..*/
167c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
167d0 54 65 72 6d 53 65 6c 65 63 74 46 69 6e 69 73 68  TermSelectFinish
167e0 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20  Merge(Fts3Table 
167f0 2a 70 2c 20 54 65 72 6d 53 65 6c 65 63 74 20 2a  *p, TermSelect *
16800 70 54 53 29 7b 0a 20 20 63 68 61 72 20 2a 61 4f  pTS){.  char *aO
16810 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f  ut = 0;.  int nO
16820 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ut = 0;.  int i;
16830 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
16840 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 73  ugh the doclists
16850 20 69 6e 20 74 68 65 20 61 61 4f 75 74 70 75 74   in the aaOutput
16860 5b 5d 20 61 72 72 61 79 2e 20 4d 65 72 67 65 20  [] array. Merge 
16870 74 68 65 6d 20 61 6c 6c 0a 20 20 2a 2a 20 69 6e  them all.  ** in
16880 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 6c  to a single docl
16890 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ist..  */.  for(
168a0 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72  i=0; i<SizeofArr
168b0 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  ay(pTS->aaOutput
168c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
168d0 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69   pTS->aaOutput[i
168e0 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ] ){.      if( !
168f0 61 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  aOut ){.        
16900 61 4f 75 74 20 3d 20 70 54 53 2d 3e 61 61 4f 75  aOut = pTS->aaOu
16910 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20  tput[i];.       
16920 20 6e 4f 75 74 20 3d 20 70 54 53 2d 3e 61 6e 4f   nOut = pTS->anO
16930 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20  utput[i];.      
16940 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
16950 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  i] = 0;.      }e
16960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
16970 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63   nNew;.        c
16980 68 61 72 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20  har *aNew;..    
16990 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
169a0 33 44 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28  3DoclistOrMerge(
169b0 70 2d 3e 62 44 65 73 63 49 64 78 2c 20 0a 20 20  p->bDescIdx, .  
169c0 20 20 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61            pTS->a
169d0 61 4f 75 74 70 75 74 5b 69 5d 2c 20 70 54 53 2d  aOutput[i], pTS-
169e0 3e 61 6e 4f 75 74 70 75 74 5b 69 5d 2c 20 61 4f  >anOutput[i], aO
169f0 75 74 2c 20 6e 4f 75 74 2c 20 26 61 4e 65 77 2c  ut, nOut, &aNew,
16a00 20 26 6e 4e 65 77 0a 20 20 20 20 20 20 20 20 29   &nNew.        )
16a10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16a30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16a40 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
16a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16a60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16a70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16a80 65 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b  e(pTS->aaOutput[
16a90 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
16aa0 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b  ite3_free(aOut);
16ab0 0a 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61  .        pTS->aa
16ac0 4f 75 74 70 75 74 5b 69 5d 20 3d 20 30 3b 0a 20  Output[i] = 0;. 
16ad0 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20 61 4e         aOut = aN
16ae0 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  ew;.        nOut
16af0 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = nNew;.      }
16b00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
16b10 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20 3d  S->aaOutput[0] =
16b20 20 61 4f 75 74 3b 0a 20 20 70 54 53 2d 3e 61 6e   aOut;.  pTS->an
16b30 4f 75 74 70 75 74 5b 30 5d 20 3d 20 6e 4f 75 74  Output[0] = nOut
16b40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16b50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
16b60 65 72 67 65 20 74 68 65 20 64 6f 63 6c 69 73 74  erge the doclist
16b70 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69   aDoclist/nDocli
16b80 73 74 20 69 6e 74 6f 20 74 68 65 20 54 65 72 6d  st into the Term
16b90 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61  Select object pa
16ba0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
16bb0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
16bc0 68 65 20 6d 65 72 67 65 20 69 73 20 61 6e 20 22  he merge is an "
16bd0 4f 52 22 20 6d 65 72 67 65 20 28 73 65 65 20 66  OR" merge (see f
16be0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 74 73 33 44  unction.** fts3D
16bf0 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 29 20  oclistOrMerge() 
16c00 66 6f 72 20 64 65 74 61 69 6c 73 29 2e 0a 2a 2a  for details)..**
16c10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16c20 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
16c30 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
16c40 20 65 61 63 68 20 74 65 72 6d 20 74 68 61 74 20   each term that 
16c50 6d 61 74 63 68 65 73 0a 2a 2a 20 61 20 71 75 65  matches.** a que
16c60 72 69 65 64 20 70 72 65 66 69 78 2e 20 49 74 20  ried prefix. It 
16c70 6d 65 72 67 65 73 20 61 6c 6c 20 74 68 65 73 65  merges all these
16c80 20 64 6f 63 6c 69 73 74 73 20 69 6e 74 6f 20 6f   doclists into o
16c90 6e 65 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 0a  ne, the doclist.
16ca0 2a 2a 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ** for the speci
16cb0 66 69 65 64 20 70 72 65 66 69 78 2e 20 53 69 6e  fied prefix. Sin
16cc0 63 65 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  ce there can be 
16cd0 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 75 6d  a very large num
16ce0 62 65 72 20 6f 66 0a 2a 2a 20 64 6f 63 6c 69 73  ber of.** doclis
16cf0 74 73 20 74 6f 20 6d 65 72 67 65 2c 20 74 68 65  ts to merge, the
16d00 20 6d 65 72 67 69 6e 67 20 69 73 20 64 6f 6e 65   merging is done
16d10 20 70 61 69 72 2d 77 69 73 65 20 75 73 69 6e 67   pair-wise using
16d20 20 74 68 65 20 54 65 72 6d 53 65 6c 65 63 74 0a   the TermSelect.
16d30 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  ** object..**.**
16d40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
16d50 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
16d60 20 69 66 20 74 68 65 20 6d 65 72 67 65 20 69 73   if the merge is
16d70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
16d80 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
16d90 6f 72 20 63 6f 64 65 20 28 53 51 4c 49 54 45 5f  or code (SQLITE_
16da0 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72 72  NOMEM) if an err
16db0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
16dc0 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 65 72  atic int fts3Ter
16dd0 6d 53 65 6c 65 63 74 4d 65 72 67 65 28 0a 20 20  mSelectMerge(.  
16de0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e00 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e  /* FTS table han
16e10 64 6c 65 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  dle */.  TermSel
16e20 65 63 74 20 2a 70 54 53 2c 20 20 20 20 20 20 20  ect *pTS,       
16e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
16e40 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 74 6f  Select object to
16e50 20 6d 65 72 67 65 20 69 6e 74 6f 20 2a 2f 0a 20   merge into */. 
16e60 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c   char *aDoclist,
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
16e90 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
16ea0 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20  nDoclist        
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16ec0 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20  ize of aDoclist 
16ed0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
16ee0 20 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70   if( pTS->aaOutp
16ef0 75 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ut[0]==0 ){.    
16f00 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
16f10 65 20 66 69 72 73 74 20 74 65 72 6d 20 73 65 6c  e first term sel
16f20 65 63 74 65 64 2c 20 63 6f 70 79 20 74 68 65 20  ected, copy the 
16f30 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 6f  doclist to the o
16f40 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 62 75 66  utput.    ** buf
16f50 66 65 72 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  fer using memcpy
16f60 28 29 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (). .    **.    
16f70 2a 2a 20 41 64 64 20 46 54 53 33 5f 56 41 52 49  ** Add FTS3_VARI
16f80 4e 54 5f 4d 41 58 20 62 79 74 65 73 20 6f 66 20  NT_MAX bytes of 
16f90 75 6e 75 73 65 64 20 73 70 61 63 65 20 74 6f 20  unused space to 
16fa0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
16fb0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f      ** allocatio
16fc0 6e 2e 20 54 68 69 73 20 69 73 20 73 6f 20 61 73  n. This is so as
16fd0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
16fe0 74 68 65 20 62 75 66 66 65 72 20 69 73 20 62 69  the buffer is bi
16ff0 67 20 65 6e 6f 75 67 68 0a 20 20 20 20 2a 2a 20  g enough.    ** 
17000 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 75 72 72  to hold the curr
17010 65 6e 74 20 64 6f 63 6c 69 73 74 20 41 4e 44 27  ent doclist AND'
17020 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
17030 20 64 6f 63 6c 69 73 74 2e 20 49 66 20 74 68 65   doclist. If the
17040 0a 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 73  .    ** doclists
17050 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 6f   are stored in o
17060 72 64 65 72 3d 41 53 43 20 6f 72 64 65 72 2c 20  rder=ASC order, 
17070 74 68 69 73 20 70 61 64 64 69 6e 67 20 77 6f 75  this padding wou
17080 6c 64 20 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a  ld not be.    **
17090 20 72 65 71 75 69 72 65 64 20 28 73 69 6e 63 65   required (since
170a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 5b 64 6f   the size of [do
170b0 63 6c 69 73 74 41 20 41 4e 44 20 64 6f 63 6c 69  clistA AND docli
170c0 73 74 42 5d 20 69 73 20 61 6c 77 61 79 73 20 6c  stB] is always l
170d0 65 73 73 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ess.    ** than 
170e0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
170f0 73 69 7a 65 20 6f 66 20 5b 64 6f 63 6c 69 73 74  size of [doclist
17100 41 5d 20 69 6e 20 74 68 61 74 20 63 61 73 65 29  A] in that case)
17110 2e 20 42 75 74 20 74 68 69 73 20 69 73 0a 20 20  . But this is.  
17120 20 20 2a 2a 20 6e 6f 74 20 74 72 75 65 20 66 6f    ** not true fo
17130 72 20 6f 72 64 65 72 3d 44 45 53 43 2e 20 46 6f  r order=DESC. Fo
17140 72 20 65 78 61 6d 70 6c 65 2c 20 61 20 64 6f 63  r example, a doc
17150 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
17160 28 31 2c 20 2d 31 29 20 0a 20 20 20 20 2a 2a 20  (1, -1) .    ** 
17170 6d 61 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  may be smaller t
17180 68 61 6e 20 28 2d 31 29 2c 20 61 73 20 69 6e 20  han (-1), as in 
17190 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
171a0 65 20 74 68 65 20 2d 31 20 6d 61 79 20 62 65 20  e the -1 may be 
171b0 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 61 73  stored.    ** as
171c0 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 64   a single-byte d
171d0 65 6c 74 61 2c 20 77 68 65 72 65 61 73 20 69 6e  elta, whereas in
171e0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 20 6d   the second it m
171f0 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 61 73  ust be stored as
17200 20 61 0a 20 20 20 20 2a 2a 20 46 54 53 33 5f 56   a.    ** FTS3_V
17210 41 52 49 4e 54 5f 4d 41 58 20 62 79 74 65 20 76  ARINT_MAX byte v
17220 61 72 69 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  arint..    **.  
17230 20 20 2a 2a 20 53 69 6d 69 6c 61 72 20 70 61 64    ** Similar pad
17240 64 69 6e 67 20 69 73 20 61 64 64 65 64 20 69 6e  ding is added in
17250 20 74 68 65 20 66 74 73 33 44 6f 63 6c 69 73 74   the fts3Doclist
17260 4f 72 4d 65 72 67 65 28 29 20 66 75 6e 63 74 69  OrMerge() functi
17270 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
17280 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20  TS->aaOutput[0] 
17290 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
172a0 28 6e 44 6f 63 6c 69 73 74 20 2b 20 46 54 53 33  (nDoclist + FTS3
172b0 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2b 20 31 29  _VARINT_MAX + 1)
172c0 3b 0a 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74  ;.    pTS->anOut
172d0 70 75 74 5b 30 5d 20 3d 20 6e 44 6f 63 6c 69 73  put[0] = nDoclis
172e0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 53 2d 3e  t;.    if( pTS->
172f0 61 61 4f 75 74 70 75 74 5b 30 5d 20 29 7b 0a 20  aaOutput[0] ){. 
17300 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 53 2d       memcpy(pTS-
17310 3e 61 61 4f 75 74 70 75 74 5b 30 5d 2c 20 61 44  >aaOutput[0], aD
17320 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
17330 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17340 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17350 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
17360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
17370 20 2a 61 4d 65 72 67 65 20 3d 20 61 44 6f 63 6c   *aMerge = aDocl
17380 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 65  ist;.    int nMe
17390 72 67 65 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a  rge = nDoclist;.
173a0 20 20 20 20 69 6e 74 20 69 4f 75 74 3b 0a 0a 20      int iOut;.. 
173b0 20 20 20 66 6f 72 28 69 4f 75 74 3d 30 3b 20 69     for(iOut=0; i
173c0 4f 75 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28  Out<SizeofArray(
173d0 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 29 3b 20  pTS->aaOutput); 
173e0 69 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iOut++){.      i
173f0 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  f( pTS->aaOutput
17400 5b 69 4f 75 74 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOut]==0 ){.   
17410 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
17420 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  t>0 );.        p
17430 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75  TS->aaOutput[iOu
17440 74 5d 20 3d 20 61 4d 65 72 67 65 3b 0a 20 20 20  t] = aMerge;.   
17450 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70       pTS->anOutp
17460 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67  ut[iOut] = nMerg
17470 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
17480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17490 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65         char *aNe
174a0 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  w;.        int n
174b0 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20 20 69 6e  New;..        in
174c0 74 20 72 63 20 3d 20 66 74 73 33 44 6f 63 6c 69  t rc = fts3Docli
174d0 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e 62 44 65  stOrMerge(p->bDe
174e0 73 63 49 64 78 2c 20 61 4d 65 72 67 65 2c 20 6e  scIdx, aMerge, n
174f0 4d 65 72 67 65 2c 20 0a 20 20 20 20 20 20 20 20  Merge, .        
17500 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75      pTS->aaOutpu
17510 74 5b 69 4f 75 74 5d 2c 20 70 54 53 2d 3e 61 6e  t[iOut], pTS->an
17520 4f 75 74 70 75 74 5b 69 4f 75 74 5d 2c 20 26 61  Output[iOut], &a
17530 4e 65 77 2c 20 26 6e 4e 65 77 0a 20 20 20 20 20  New, &nNew.     
17540 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
17550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17570 20 61 4d 65 72 67 65 21 3d 61 44 6f 63 6c 69 73   aMerge!=aDoclis
17580 74 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  t ) sqlite3_free
17590 28 61 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  (aMerge);.      
175a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
175b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
175c0 20 20 69 66 28 20 61 4d 65 72 67 65 21 3d 61 44    if( aMerge!=aD
175d0 6f 63 6c 69 73 74 20 29 20 73 71 6c 69 74 65 33  oclist ) sqlite3
175e0 5f 66 72 65 65 28 61 4d 65 72 67 65 29 3b 0a 20  _free(aMerge);. 
175f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
17600 72 65 65 28 70 54 53 2d 3e 61 61 4f 75 74 70 75  ree(pTS->aaOutpu
17610 74 5b 69 4f 75 74 5d 29 3b 0a 20 20 20 20 20 20  t[iOut]);.      
17620 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
17630 69 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 0a 20 20  iOut] = 0;.  .  
17640 20 20 20 20 20 20 61 4d 65 72 67 65 20 3d 20 61        aMerge = a
17650 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4d 65  New;.        nMe
17660 72 67 65 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  rge = nNew;.    
17670 20 20 20 20 69 66 28 20 28 69 4f 75 74 2b 31 29      if( (iOut+1)
17680 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28 70 54  ==SizeofArray(pT
17690 53 2d 3e 61 61 4f 75 74 70 75 74 29 20 29 7b 0a  S->aaOutput) ){.
176a0 20 20 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61            pTS->a
176b0 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20  aOutput[iOut] = 
176c0 61 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  aMerge;.        
176d0 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b    pTS->anOutput[
176e0 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67 65 3b 0a  iOut] = nMerge;.
176f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17700 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
17710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17720 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17730 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
17740 20 70 4e 65 77 20 74 6f 20 74 68 65 20 65 6e 64   pNew to the end
17750 20 6f 66 20 74 68 65 20 70 43 73 72 2d 3e 61 70   of the pCsr->ap
17760 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 2e  Segment[] array.
17770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17780 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
17790 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74 73 33  orAppend(.  Fts3
177a0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
177b0 70 43 73 72 2c 20 0a 20 20 46 74 73 33 53 65 67  pCsr, .  Fts3Seg
177c0 52 65 61 64 65 72 20 2a 70 4e 65 77 0a 29 7b 0a  Reader *pNew.){.
177d0 20 20 69 66 28 20 28 70 43 73 72 2d 3e 6e 53 65    if( (pCsr->nSe
177e0 67 6d 65 6e 74 25 31 36 29 3d 3d 30 20 29 7b 0a  gment%16)==0 ){.
177f0 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
17800 72 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 69  r **apNew;.    i
17810 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 43 73 72  nt nByte = (pCsr
17820 2d 3e 6e 53 65 67 6d 65 6e 74 20 2b 20 31 36 29  ->nSegment + 16)
17830 2a 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52  *sizeof(Fts3SegR
17840 65 61 64 65 72 2a 29 3b 0a 20 20 20 20 61 70 4e  eader*);.    apN
17850 65 77 20 3d 20 28 46 74 73 33 53 65 67 52 65 61  ew = (Fts3SegRea
17860 64 65 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  der **)sqlite3_r
17870 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 70 53  ealloc(pCsr->apS
17880 65 67 6d 65 6e 74 2c 20 6e 42 79 74 65 29 3b 0a  egment, nByte);.
17890 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
178a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
178b0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
178c0 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  (pNew);.      re
178d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
178e0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73  M;.    }.    pCs
178f0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 61  r->apSegment = a
17900 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 73 72  pNew;.  }.  pCsr
17910 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 70 43 73 72  ->apSegment[pCsr
17920 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 5d 20 3d 20  ->nSegment++] = 
17930 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 53  pNew;.  return S
17940 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17950 2a 2a 20 41 64 64 20 73 65 67 2d 72 65 61 64 65  ** Add seg-reade
17960 72 20 6f 62 6a 65 63 74 73 20 74 6f 20 74 68 65  r objects to the
17970 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
17980 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  der object passe
17990 64 20 61 73 20 74 68 65 0a 2a 2a 20 38 74 68 20  d as the.** 8th 
179a0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
179b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
179c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
179d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
179e0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
179f0 72 20 63 6f 64 65 0a 2a 2a 20 6f 74 68 65 72 77  r code.** otherw
17a00 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
17a10 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
17a20 43 75 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61  Cursor(.  Fts3Ta
17a30 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
17a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
17a50 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
17a60 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
17a90 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  id */.  int iInd
17aa0 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
17ab0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17ac0 20 74 6f 20 73 65 61 72 63 68 20 28 66 72 6f 6d   to search (from
17ad0 20 30 20 74 6f 20 70 2d 3e 6e 49 6e 64 65 78 2d   0 to p->nIndex-
17ae0 31 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  1) */.  int iLev
17af0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
17b00 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
17b10 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
17b20 73 63 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  scan */.  const 
17b30 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
17b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
17b50 6d 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  m to query for *
17b60 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
17b90 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
17ba0 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 2c  .  int isPrefix,
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
17bd0 20 70 72 65 66 69 78 20 73 65 61 72 63 68 20 2a   prefix search *
17be0 2f 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 2c 20  /.  int isScan, 
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
17c10 63 61 6e 20 66 72 6f 6d 20 7a 54 65 72 6d 20 74  can from zTerm t
17c20 6f 20 45 4f 46 20 2a 2f 0a 20 20 46 74 73 33 4d  o EOF */.  Fts3M
17c30 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
17c40 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
17c50 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70  rsor object to p
17c60 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
17c70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17c80 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
17c90 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
17ca0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17cb0 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
17cc0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
17cd0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
17ce0 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
17cf0 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20   int rc2;       
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 73 71   /* Result of sq
17d20 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f  lite3_reset() */
17d30 0a 0a 20 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c  ..  /* If iLevel
17d40 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 30 20   is less than 0 
17d50 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  and this is not 
17d60 61 20 73 63 61 6e 2c 20 69 6e 63 6c 75 64 65 20  a scan, include 
17d70 61 20 73 65 67 2d 72 65 61 64 65 72 20 0a 20 20  a seg-reader .  
17d80 2a 2a 20 66 6f 72 20 74 68 65 20 70 65 6e 64 69  ** for the pendi
17d90 6e 67 2d 74 65 72 6d 73 2e 20 49 66 20 74 68 69  ng-terms. If thi
17da0 73 20 69 73 20 61 20 73 63 61 6e 2c 20 74 68 65  s is a scan, the
17db0 6e 20 74 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  n this call must
17dc0 20 62 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 6d   be being.  ** m
17dd0 61 64 65 20 62 79 20 61 6e 20 66 74 73 34 61 75  ade by an fts4au
17de0 78 20 6d 6f 64 75 6c 65 2c 20 6e 6f 74 20 61 6e  x module, not an
17df0 20 46 54 53 20 74 61 62 6c 65 2e 20 49 6e 20 74   FTS table. In t
17e00 68 69 73 20 63 61 73 65 20 63 61 6c 6c 69 6e 67  his case calling
17e10 0a 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61  .  ** Fts3SegRea
17e20 64 65 72 50 65 6e 64 69 6e 67 20 6d 69 67 68 74  derPending might
17e30 20 73 65 67 66 61 75 6c 74 2c 20 61 73 20 74 68   segfault, as th
17e40 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
17e50 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
17e60 66 74 73 34 61 75 78 20 61 72 65 20 6e 6f 74 20  fts4aux are not 
17e70 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75 6c  completely popul
17e80 61 74 65 64 2e 20 53 6f 20 69 74 27 73 20 65 61  ated. So it's ea
17e90 73 69 65 73 74 20 74 6f 20 66 69 6c 74 65 72 20  siest to filter 
17ea0 74 68 65 73 65 0a 20 20 2a 2a 20 63 61 6c 6c 73  these.  ** calls
17eb0 20 6f 75 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20   out here.  */. 
17ec0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 26 26   if( iLevel<0 &&
17ed0 20 70 2d 3e 61 49 6e 64 65 78 20 29 7b 0a 20 20   p->aIndex ){.  
17ee0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
17ef0 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 72  *pSeg = 0;.    r
17f00 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
17f10 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28  egReaderPending(
17f20 70 2c 20 69 49 6e 64 65 78 2c 20 7a 54 65 72 6d  p, iIndex, zTerm
17f30 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66 69  , nTerm, isPrefi
17f40 78 7c 7c 69 73 53 63 61 6e 2c 20 26 70 53 65 67  x||isScan, &pSeg
17f50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
17f60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67  QLITE_OK && pSeg
17f70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
17f80 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
17f90 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c 20 70  orAppend(pCsr, p
17fa0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Seg);.    }.  }.
17fb0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46  .  if( iLevel!=F
17fc0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
17fd0 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 69 66 28  NDING ){.    if(
17fe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17ff0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18000 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64 69  ite3Fts3AllSegdi
18010 72 73 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  rs(p, iLangid, i
18020 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 26  Index, iLevel, &
18030 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pStmt);.    }.. 
18040 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
18050 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
18060 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c  E_ROW==(rc = sql
18070 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18080 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53  ) ){.      Fts3S
18090 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
180a0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65   0;..      /* Re
180b0 61 64 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  ad the values re
180c0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
180d0 4c 45 43 54 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  LECT into local 
180e0 76 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  variables. */.  
180f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
18100 34 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20  4 iStartBlock = 
18110 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18120 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
18130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
18140 74 36 34 20 69 4c 65 61 76 65 73 45 6e 64 42 6c  t64 iLeavesEndBl
18150 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ock = sqlite3_co
18160 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
18170 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
18180 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c  te3_int64 iEndBl
18190 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ock = sqlite3_co
181a0 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
181b0 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  , 3);.      int 
181c0 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  nRoot = sqlite3_
181d0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
181e0 6d 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 68  mt, 4);.      ch
181f0 61 72 20 63 6f 6e 73 74 20 2a 7a 52 6f 6f 74 20  ar const *zRoot 
18200 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
18210 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 3b  _blob(pStmt, 4);
18220 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 7a 54  ..      /* If zT
18230 65 72 6d 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  erm is not NULL,
18240 20 61 6e 64 20 74 68 69 73 20 73 65 67 6d 65 6e   and this segmen
18250 74 20 69 73 20 6e 6f 74 20 73 74 6f 72 65 64 20  t is not stored 
18260 65 6e 74 69 72 65 6c 79 20 6f 6e 20 69 74 73 0a  entirely on its.
18270 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f        ** root no
18280 64 65 2c 20 74 68 65 20 72 61 6e 67 65 20 6f 66  de, the range of
18290 20 6c 65 61 76 65 73 20 73 63 61 6e 6e 65 64 20   leaves scanned 
182a0 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 2e 20  can be reduced. 
182b0 44 6f 20 74 68 69 73 2e 20 2a 2f 0a 20 20 20 20  Do this. */.    
182c0 20 20 69 66 28 20 69 53 74 61 72 74 42 6c 6f 63    if( iStartBloc
182d0 6b 20 26 26 20 7a 54 65 72 6d 20 29 7b 0a 20 20  k && zTerm ){.  
182e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
182f0 74 36 34 20 2a 70 69 20 3d 20 28 69 73 50 72 65  t64 *pi = (isPre
18300 66 69 78 20 3f 20 26 69 4c 65 61 76 65 73 45 6e  fix ? &iLeavesEn
18310 64 42 6c 6f 63 6b 20 3a 20 30 29 3b 0a 20 20 20  dBlock : 0);.   
18320 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
18330 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72  lectLeaf(p, zTer
18340 6d 2c 20 6e 54 65 72 6d 2c 20 7a 52 6f 6f 74 2c  m, nTerm, zRoot,
18350 20 6e 52 6f 6f 74 2c 20 26 69 53 74 61 72 74 42   nRoot, &iStartB
18360 6c 6f 63 6b 2c 20 70 69 29 3b 0a 20 20 20 20 20  lock, pi);.     
18370 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18380 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
18390 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  shed;.        if
183a0 28 20 69 73 50 72 65 66 69 78 3d 3d 30 20 26 26  ( isPrefix==0 &&
183b0 20 69 73 53 63 61 6e 3d 3d 30 20 29 20 69 4c 65   isScan==0 ) iLe
183c0 61 76 65 73 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  avesEndBlock = i
183d0 53 74 61 72 74 42 6c 6f 63 6b 3b 0a 20 20 20 20  StartBlock;.    
183e0 20 20 7d 0a 20 0a 20 20 20 20 20 20 72 63 20 3d    }. .      rc =
183f0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
18400 65 61 64 65 72 4e 65 77 28 70 43 73 72 2d 3e 6e  eaderNew(pCsr->n
18410 53 65 67 6d 65 6e 74 2b 31 2c 20 0a 20 20 20 20  Segment+1, .    
18420 20 20 20 20 20 20 28 69 73 50 72 65 66 69 78 3d        (isPrefix=
18430 3d 30 20 26 26 20 69 73 53 63 61 6e 3d 3d 30 29  =0 && isScan==0)
18440 2c 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ,.          iSta
18450 72 74 42 6c 6f 63 6b 2c 20 69 4c 65 61 76 65 73  rtBlock, iLeaves
18460 45 6e 64 42 6c 6f 63 6b 2c 20 0a 20 20 20 20 20  EndBlock, .     
18470 20 20 20 20 20 69 45 6e 64 42 6c 6f 63 6b 2c 20       iEndBlock, 
18480 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 70  zRoot, nRoot, &p
18490 53 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Seg.      );.   
184a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
184b0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
184c0 73 68 65 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  shed;.      rc =
184d0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75   fts3SegReaderCu
184e0 72 73 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c  rsorAppend(pCsr,
184f0 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pSeg);.    }.  
18500 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20  }.. finished:.  
18510 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
18520 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
18530 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
18540 45 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  E ) rc = rc2;.. 
18550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18560 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 63 75  *.** Set up a cu
18570 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72 20  rsor object for 
18580 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
18590 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  h a full-text in
185a0 64 65 78 20 6f 72 20 61 20 0a 2a 2a 20 73 69 6e  dex or a .** sin
185b0 67 6c 65 20 6c 65 76 65 6c 20 74 68 65 72 65 69  gle level therei
185c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
185d0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
185e0 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61 62 6c  rsor(.  Fts3Tabl
185f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
18600 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
18610 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
18620 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18640 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 2d 69 64    /* Language-id
18650 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
18660 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
18690 63 68 20 28 66 72 6f 6d 20 30 20 74 6f 20 70 2d  ch (from 0 to p-
186a0 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20  >nIndex-1) */.  
186b0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d  /* Level of segm
186e0 65 6e 74 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ents to scan */.
186f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
18700 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
18710 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65    /* Term to que
18720 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
18730 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
18740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18750 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
18760 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
18770 73 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20  sPrefix,        
18780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18790 75 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20  ue for a prefix 
187a0 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
187b0 69 73 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20  isScan,         
187c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
187d0 72 75 65 20 74 6f 20 73 63 61 6e 20 66 72 6f 6d  rue to scan from
187e0 20 7a 54 65 72 6d 20 74 6f 20 45 4f 46 20 2a 2f   zTerm to EOF */
187f0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
18800 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
18810 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
18820 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
18830 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  /.){.  assert( i
18840 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
18850 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
18860 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
18870 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
18880 5f 41 4c 4c 0a 20 20 20 20 20 20 7c 7c 20 20 69  _ALL.      ||  i
18890 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
188a0 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 0a 20  URSOR_PENDING . 
188b0 20 20 20 20 20 7c 7c 20 20 69 4c 65 76 65 6c 3e       ||  iLevel>
188c0 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  =0.  );.  assert
188d0 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45  ( iLevel<FTS3_SE
188e0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b  GDIR_MAXLEVEL );
188f0 0a 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f  .  assert( FTS3_
18900 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 3c 30 20  SEGCURSOR_ALL<0 
18910 26 26 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  && FTS3_SEGCURSO
18920 52 5f 50 45 4e 44 49 4e 47 3c 30 20 29 3b 0a 20  R_PENDING<0 );. 
18930 20 61 73 73 65 72 74 28 20 69 73 50 72 65 66 69   assert( isPrefi
18940 78 3d 3d 30 20 7c 7c 20 69 73 53 63 61 6e 3d 3d  x==0 || isScan==
18950 30 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  0 );..  memset(p
18960 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Csr, 0, sizeof(F
18970 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
18980 72 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  r));.  return ft
18990 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
189a0 72 28 0a 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  r(.      p, iLan
189b0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
189c0 76 65 6c 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  vel, zTerm, nTer
189d0 6d 2c 20 69 73 50 72 65 66 69 78 2c 20 69 73 53  m, isPrefix, isS
189e0 63 61 6e 2c 20 70 43 73 72 0a 20 20 29 3b 0a 7d  can, pCsr.  );.}
189f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74  ../*.** In addit
18a00 69 6f 6e 20 74 6f 20 69 74 73 20 63 75 72 72 65  ion to its curre
18a10 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  nt configuration
18a20 2c 20 68 61 76 65 20 74 68 65 20 46 74 73 33 4d  , have the Fts3M
18a30 75 6c 74 69 53 65 67 52 65 61 64 65 72 0a 2a 2a  ultiSegReader.**
18a40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 34   passed as the 4
18a50 74 68 20 61 72 67 75 6d 65 6e 74 20 61 6c 73 6f  th argument also
18a60 20 73 63 61 6e 20 74 68 65 20 64 6f 63 6c 69 73   scan the doclis
18a70 74 20 66 6f 72 20 74 65 72 6d 20 7a 54 65 72 6d  t for term zTerm
18a80 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 53 51  /nTerm..**.** SQ
18a90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18aa0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
18ab0 6f 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73  occurs, otherwis
18ac0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
18ad0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
18ae0 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
18af0 64 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f  derCursorAddZero
18b00 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
18b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18b20 20 20 20 20 2f 2a 20 46 54 53 20 76 69 72 74 75      /* FTS virtu
18b30 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
18b40 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
18b50 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18b60 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
18b70 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
18b80 63 61 6e 20 64 6f 63 6c 69 73 74 20 6f 66 20 2a  can doclist of *
18b90 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18bc0 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20   bytes in zTerm 
18bd0 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
18be0 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
18bf0 20 20 20 20 20 2f 2a 20 46 74 73 33 4d 75 6c 74       /* Fts3Mult
18c00 69 53 65 67 52 65 61 64 65 72 20 74 6f 20 6d 6f  iSegReader to mo
18c10 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  dify */.){.  ret
18c20 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
18c30 72 43 75 72 73 6f 72 28 70 2c 20 0a 20 20 20 20  rCursor(p, .    
18c40 20 20 69 4c 61 6e 67 69 64 2c 20 30 2c 20 46 54    iLangid, 0, FT
18c50 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
18c60 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
18c70 30 2c 20 30 2c 70 43 73 72 0a 20 20 29 3b 0a 7d  0, 0,pCsr.  );.}
18c80 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20  ../*.** Open an 
18c90 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18ca0 65 72 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  er to scan the d
18cb0 6f 63 6c 69 73 74 20 66 6f 72 20 74 65 72 6d 20  oclist for term 
18cc0 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 4f 72 2c  zTerm/nTerm. Or,
18cd0 0a 2a 2a 20 69 66 20 69 73 50 72 65 66 69 78 20  .** if isPrefix 
18ce0 69 73 20 74 72 75 65 2c 20 74 6f 20 73 63 61 6e  is true, to scan
18cf0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
18d00 20 61 6c 6c 20 74 65 72 6d 73 20 66 6f 72 20 77   all terms for w
18d10 68 69 63 68 20 0a 2a 2a 20 7a 54 65 72 6d 2f 6e  hich .** zTerm/n
18d20 54 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78  Term is a prefix
18d30 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
18d40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18d50 4b 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61  K and write.** a
18d60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18d70 6e 65 77 20 46 74 73 33 4d 75 6c 74 69 53 65 67  new Fts3MultiSeg
18d80 52 65 61 64 65 72 20 74 6f 20 2a 70 70 53 65 67  Reader to *ppSeg
18d90 63 73 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  csr. Otherwise, 
18da0 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c  return.** an SQL
18db0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
18dc0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
18dd0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
18de0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
18df0 66 72 65 65 20 74 68 69 73 20 6f 62 6a 65 63 74  free this object
18e00 20 62 79 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   by eventually.*
18e10 2a 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  * passing it to 
18e20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  fts3SegReaderCur
18e30 73 6f 72 46 72 65 65 28 29 20 0a 2a 2a 0a 2a 2a  sorFree() .**.**
18e40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18e50 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
18e60 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
18e70 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
18e80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 75  rror code..** Ou
18e90 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
18ea0 70 70 53 65 67 63 73 72 20 69 73 20 73 65 74 20  ppSegcsr is set 
18eb0 74 6f 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72  to 0 if an error
18ec0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
18ed0 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53  ic int fts3TermS
18ee0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a  egReaderCursor(.
18ef0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
18f00 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
18f10 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
18f20 6c 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65  le cursor handle
18f30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18f40 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
18f50 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
18f60 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
18f70 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
18f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f90 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
18fa0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
18fb0 6e 74 20 69 73 50 72 65 66 69 78 2c 20 20 20 20  nt isPrefix,    
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18fd0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
18fe0 66 69 78 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  fix search */.  
18ff0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
19000 65 72 20 2a 2a 70 70 53 65 67 63 73 72 20 20 20  er **ppSegcsr   
19010 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  /* OUT: Allocate
19020 64 20 73 65 67 2d 72 65 61 64 65 72 20 63 75 72  d seg-reader cur
19030 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  sor */.){.  Fts3
19040 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
19050 70 53 65 67 63 73 72 3b 20 20 20 20 2f 2a 20 4f  pSegcsr;    /* O
19060 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
19070 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
19080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19090 45 5f 4e 4f 4d 45 4d 3b 20 20 20 20 20 20 20 20  E_NOMEM;        
190a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
190b0 20 2a 2f 0a 0a 20 20 70 53 65 67 63 73 72 20 3d   */..  pSegcsr =
190c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
190d0 73 69 7a 65 6f 66 28 46 74 73 33 4d 75 6c 74 69  sizeof(Fts3Multi
190e0 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 69  SegReader));.  i
190f0 66 28 20 70 53 65 67 63 73 72 20 29 7b 0a 20 20  f( pSegcsr ){.  
19100 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
19110 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20   bFound = 0;    
19120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19130 75 65 20 6f 6e 63 65 20 61 6e 20 69 6e 64 65 78  ue once an index
19140 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20   has been found 
19150 2a 2f 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65  */.    Fts3Table
19160 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
19170 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
19180 74 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 69 73  tab;..    if( is
19190 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
191a0 66 6f 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d  for(i=1; bFound=
191b0 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  =0 && i<p->nInde
191c0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
191d0 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69   if( p->aIndex[i
191e0 5d 2e 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d  ].nPrefix==nTerm
191f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
19200 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
19210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19220 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
19230 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
19240 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
19250 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
19260 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
19270 6d 2c 20 6e 54 65 72 6d 2c 20 30 2c 20 30 2c 20  m, nTerm, 0, 0, 
19280 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
19290 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70    );.          p
192a0 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20  Segcsr->bLookup 
192b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
192c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
192d0 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d 3d 30  r(i=1; bFound==0
192e0 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b   && i<p->nIndex;
192f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
19300 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  f( p->aIndex[i].
19310 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d 2b 31  nPrefix==nTerm+1
19320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
19330 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
19340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19350 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
19360 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
19370 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
19380 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
19390 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
193a0 6d 2c 20 6e 54 65 72 6d 2c 20 31 2c 20 30 2c 20  m, nTerm, 1, 0, 
193b0 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
193c0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
193d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
193e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
193f0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
19400 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f 28  erCursorAddZero(
19410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19420 20 70 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69   p, pCsr->iLangi
19430 64 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  d, zTerm, nTerm,
19440 20 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20   pSegcsr.       
19450 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
19460 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19480 20 69 66 28 20 62 46 6f 75 6e 64 3d 3d 30 20 29   if( bFound==0 )
19490 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
194a0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
194b0 72 43 75 72 73 6f 72 28 70 2c 20 70 43 73 72 2d  rCursor(p, pCsr-
194c0 3e 69 4c 61 6e 67 69 64 2c 20 0a 20 20 20 20 20  >iLangid, .     
194d0 20 20 20 20 20 30 2c 20 46 54 53 33 5f 53 45 47       0, FTS3_SEG
194e0 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
194f0 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66  m, nTerm, isPref
19500 69 78 2c 20 30 2c 20 70 53 65 67 63 73 72 0a 20  ix, 0, pSegcsr. 
19510 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 53       );.      pS
19520 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d  egcsr->bLookup =
19530 20 21 69 73 50 72 65 66 69 78 3b 0a 20 20 20 20   !isPrefix;.    
19540 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 65 67 63  }.  }..  *ppSegc
19550 73 72 20 3d 20 70 53 65 67 63 73 72 3b 0a 20 20  sr = pSegcsr;.  
19560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19570 0a 2a 2a 20 46 72 65 65 20 61 6e 20 46 74 73 33  .** Free an Fts3
19580 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 61  MultiSegReader a
19590 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 33  llocated by fts3
195a0 54 65 72 6d 53 65 67 52 65 61 64 65 72 43 75 72  TermSegReaderCur
195b0 73 6f 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  sor()..*/.static
195c0 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61   void fts3SegRea
195d0 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 46 74  derCursorFree(Ft
195e0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
195f0 20 2a 70 53 65 67 63 73 72 29 7b 0a 20 20 73 71   *pSegcsr){.  sq
19600 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
19610 65 72 46 69 6e 69 73 68 28 70 53 65 67 63 73 72  erFinish(pSegcsr
19620 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
19630 65 28 70 53 65 67 63 73 72 29 3b 0a 7d 0a 0a 2f  e(pSegcsr);.}../
19640 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19650 6f 6e 20 72 65 74 72 69 65 76 65 73 20 74 68 65  on retrieves the
19660 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
19670 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
19680 28 6f 72 20 74 65 72 6d 0a 2a 2a 20 70 72 65 66  (or term.** pref
19690 69 78 29 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ix) from the dat
196a0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
196b0 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c   int fts3TermSel
196c0 65 63 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ect(.  Fts3Table
196d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
196e0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
196f0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
19700 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 54 6f  /.  Fts3PhraseTo
19710 6b 65 6e 20 2a 70 54 6f 6b 2c 20 20 20 20 20 20  ken *pTok,      
19720 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20      /* Token to 
19730 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
19740 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19760 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72  * Column to quer
19770 79 20 28 6f 72 20 2d 76 65 20 66 6f 72 20 61 6c  y (or -ve for al
19780 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  l columns) */.  
19790 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20  int *pnOut,     
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
197c0 62 75 66 66 65 72 20 61 74 20 2a 70 70 4f 75 74  buffer at *ppOut
197d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f   */.  char **ppO
197e0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
197f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
19800 6c 6c 6f 63 65 64 20 72 65 73 75 6c 74 20 62 75  lloced result bu
19810 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ffer */.){.  int
19820 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19840 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19850 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
19860 64 65 72 20 2a 70 53 65 67 63 73 72 3b 20 20 20  der *pSegcsr;   
19870 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 63   /* Seg-reader c
19880 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74  ursor for this t
19890 65 72 6d 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  erm */.  TermSel
198a0 65 63 74 20 74 73 63 3b 20 20 20 20 20 20 20 20  ect tsc;        
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
198c0 63 74 20 66 6f 72 20 70 61 69 72 2d 77 69 73 65  ct for pair-wise
198d0 20 64 6f 63 6c 69 73 74 20 6d 65 72 67 69 6e 67   doclist merging
198e0 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c   */.  Fts3SegFil
198f0 74 65 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20  ter filter;     
19900 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
19910 20 74 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e   term filter con
19920 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20  figuration */.. 
19930 20 70 53 65 67 63 73 72 20 3d 20 70 54 6f 6b 2d   pSegcsr = pTok-
19940 3e 70 53 65 67 63 73 72 3b 0a 20 20 6d 65 6d 73  >pSegcsr;.  mems
19950 65 74 28 26 74 73 63 2c 20 30 2c 20 73 69 7a 65  et(&tsc, 0, size
19960 6f 66 28 54 65 72 6d 53 65 6c 65 63 74 29 29 3b  of(TermSelect));
19970 0a 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ..  filter.flags
19980 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
19990 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 7c 20 46  IGNORE_EMPTY | F
199a0 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55  TS3_SEGMENT_REQU
199b0 49 52 45 5f 50 4f 53 0a 20 20 20 20 20 20 20 20  IRE_POS.        
199c0 7c 20 28 70 54 6f 6b 2d 3e 69 73 50 72 65 66 69  | (pTok->isPrefi
199d0 78 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  x ? FTS3_SEGMENT
199e0 5f 50 52 45 46 49 58 20 3a 20 30 29 0a 20 20 20  _PREFIX : 0).   
199f0 20 20 20 20 20 7c 20 28 70 54 6f 6b 2d 3e 62 46       | (pTok->bF
19a00 69 72 73 74 20 3f 20 46 54 53 33 5f 53 45 47 4d  irst ? FTS3_SEGM
19a10 45 4e 54 5f 46 49 52 53 54 20 3a 20 30 29 0a 20  ENT_FIRST : 0). 
19a20 20 20 20 20 20 20 20 7c 20 28 69 43 6f 6c 75 6d         | (iColum
19a30 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 46  n<p->nColumn ? F
19a40 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
19a50 4d 4e 5f 46 49 4c 54 45 52 20 3a 20 30 29 3b 0a  MN_FILTER : 0);.
19a60 20 20 66 69 6c 74 65 72 2e 69 43 6f 6c 20 3d 20    filter.iCol = 
19a70 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66 69 6c 74 65  iColumn;.  filte
19a80 72 2e 7a 54 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e  r.zTerm = pTok->
19a90 7a 3b 0a 20 20 66 69 6c 74 65 72 2e 6e 54 65 72  z;.  filter.nTer
19aa0 6d 20 3d 20 70 54 6f 6b 2d 3e 6e 3b 0a 0a 20 20  m = pTok->n;..  
19ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
19ac0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70  SegReaderStart(p
19ad0 2c 20 70 53 65 67 63 73 72 2c 20 26 66 69 6c 74  , pSegcsr, &filt
19ae0 65 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  er);.  while( SQ
19af0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
19b00 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d    && SQLITE_ROW=
19b10 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  =(rc = sqlite3Ft
19b20 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
19b30 70 2c 20 70 53 65 67 63 73 72 29 29 20 0a 20 20  p, pSegcsr)) .  
19b40 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
19b50 54 65 72 6d 53 65 6c 65 63 74 4d 65 72 67 65 28  TermSelectMerge(
19b60 70 2c 20 26 74 73 63 2c 20 70 53 65 67 63 73 72  p, &tsc, pSegcsr
19b70 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 53 65 67  ->aDoclist, pSeg
19b80 63 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a  csr->nDoclist);.
19b90 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
19ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19bb0 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65 6c  rc = fts3TermSel
19bc0 65 63 74 46 69 6e 69 73 68 4d 65 72 67 65 28 70  ectFinishMerge(p
19bd0 2c 20 26 74 73 63 29 3b 0a 20 20 7d 0a 20 20 69  , &tsc);.  }.  i
19be0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19bf0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d   ){.    *ppOut =
19c00 20 74 73 63 2e 61 61 4f 75 74 70 75 74 5b 30 5d   tsc.aaOutput[0]
19c10 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 74  ;.    *pnOut = t
19c20 73 63 2e 61 6e 4f 75 74 70 75 74 5b 30 5d 3b 0a  sc.anOutput[0];.
19c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19c40 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
19c50 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 74   i<SizeofArray(t
19c60 73 63 2e 61 61 4f 75 74 70 75 74 29 3b 20 69 2b  sc.aaOutput); i+
19c70 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
19c80 33 5f 66 72 65 65 28 74 73 63 2e 61 61 4f 75 74  3_free(tsc.aaOut
19c90 70 75 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  put[i]);.    }. 
19ca0 20 7d 0a 0a 20 20 66 74 73 33 53 65 67 52 65 61   }..  fts3SegRea
19cb0 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70 53  derCursorFree(pS
19cc0 65 67 63 73 72 29 3b 0a 20 20 70 54 6f 6b 2d 3e  egcsr);.  pTok->
19cd0 70 53 65 67 63 73 72 20 3d 20 30 3b 0a 20 20 72  pSegcsr = 0;.  r
19ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19cf0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19d00 20 63 6f 75 6e 74 73 20 74 68 65 20 74 6f 74 61   counts the tota
19d10 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 69  l number of doci
19d20 64 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ds in the doclis
19d30 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 62  t stored.** in b
19d40 75 66 66 65 72 20 61 4c 69 73 74 5b 5d 2c 20 73  uffer aList[], s
19d50 69 7a 65 20 6e 4c 69 73 74 20 62 79 74 65 73 2e  ize nList bytes.
19d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
19d70 50 6f 73 6c 69 73 74 20 61 72 67 75 6d 65 6e 74  Poslist argument
19d80 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
19d90 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
19da0 74 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  t the doclist.**
19db0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 73 69   contains a posi
19dc0 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 6c 6c 6f 77  tion-list follow
19dd0 69 6e 67 20 65 61 63 68 20 64 6f 63 69 64 2e 20  ing each docid. 
19de0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
19df0 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68 61 74   assumed.** that
19e00 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
19e10 73 69 6d 70 6c 79 20 61 20 6c 69 73 74 20 6f 66  simply a list of
19e20 20 64 6f 63 69 64 73 20 73 74 6f 72 65 64 20 61   docids stored a
19e30 73 20 64 65 6c 74 61 20 65 6e 63 6f 64 65 64 20  s delta encoded 
19e40 0a 2a 2a 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a  .** varints..*/.
19e50 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
19e60 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64  oclistCountDocid
19e70 73 28 63 68 61 72 20 2a 61 4c 69 73 74 2c 20 69  s(char *aList, i
19e80 6e 74 20 6e 4c 69 73 74 29 7b 0a 20 20 69 6e 74  nt nList){.  int
19e90 20 6e 44 6f 63 20 3d 20 30 3b 20 20 20 20 20 20   nDoc = 0;      
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19eb0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
19ec0 20 20 69 66 28 20 61 4c 69 73 74 20 29 7b 0a 20    if( aList ){. 
19ed0 20 20 20 63 68 61 72 20 2a 61 45 6e 64 20 3d 20     char *aEnd = 
19ee0 26 61 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 20 20  &aList[nList];  
19ef0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19f00 6e 65 20 62 79 74 65 20 61 66 74 65 72 20 45 4f  ne byte after EO
19f10 46 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 70  F */.    char *p
19f20 20 3d 20 61 4c 69 73 74 3b 20 20 20 20 20 20 20   = aList;       
19f30 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
19f40 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
19f50 3c 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e  <aEnd ){.      n
19f60 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  Doc++;.      whi
19f70 6c 65 28 20 28 2a 70 2b 2b 29 26 30 78 38 30 20  le( (*p++)&0x80 
19f80 29 3b 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 64  );     /* Skip d
19f90 6f 63 69 64 20 76 61 72 69 6e 74 20 2a 2f 0a 20  ocid varint */. 
19fa0 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74       fts3Poslist
19fb0 43 6f 70 79 28 30 2c 20 26 70 29 3b 20 20 20 2f  Copy(0, &p);   /
19fc0 2a 20 53 6b 69 70 20 6f 76 65 72 20 70 6f 73 69  * Skip over posi
19fd0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
19fe0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
19ff0 20 6e 44 6f 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nDoc;.}../*.** 
1a000 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
1a010 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
1a020 6f 77 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ow in the %_cont
1a030 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
1a040 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  * matches the se
1a050 61 72 63 68 20 63 72 69 74 65 72 69 61 2e 20 20  arch criteria.  
1a060 46 6f 72 20 61 20 4d 41 54 43 48 20 73 65 61 72  For a MATCH sear
1a070 63 68 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ch, this will be
1a080 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 72 6f 77  .** the next row
1a090 20 74 68 61 74 20 6d 61 74 63 68 65 73 2e 20 46   that matches. F
1a0a0 6f 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  or a full-table 
1a0b0 73 63 61 6e 2c 20 74 68 69 73 20 77 69 6c 6c 20  scan, this will 
1a0c0 62 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 74 68 65  be.** simply the
1a0d0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
1a0e0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
1a0f0 2e 20 20 46 6f 72 20 61 20 64 6f 63 69 64 20 6c  .  For a docid l
1a100 6f 6f 6b 75 70 2c 0a 2a 2a 20 74 68 69 73 20 72  ookup,.** this r
1a110 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 65  outine simply se
1a120 74 73 20 74 68 65 20 45 4f 46 20 66 6c 61 67 2e  ts the EOF flag.
1a130 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1a140 4c 49 54 45 5f 4f 4b 20 69 66 20 6e 6f 74 68 69  LITE_OK if nothi
1a150 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
1a160 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a170 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66  urned.** even if
1a180 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
1a190 2d 66 69 6c 65 2e 20 20 54 68 65 20 66 74 73 33  -file.  The fts3
1a1a0 45 6f 66 4d 65 74 68 6f 64 28 29 20 77 69 6c 6c  EofMethod() will
1a1b0 20 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 73 75   be called.** su
1a1c0 62 73 65 71 75 65 6e 74 6c 79 20 74 6f 20 64 65  bsequently to de
1a1d0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
1a1e0 6f 72 20 6e 6f 74 20 61 6e 20 45 4f 46 20 77 61  or not an EOF wa
1a1f0 73 20 68 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s hit..*/.static
1a200 20 69 6e 74 20 66 74 73 33 4e 65 78 74 4d 65 74   int fts3NextMet
1a210 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
1a220 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1a230 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
1a240 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
1a250 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
1a260 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1a270 43 73 72 2d 3e 65 53 65 61 72 63 68 3d 3d 46 54  Csr->eSearch==FT
1a280 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20  S3_DOCID_SEARCH 
1a290 7c 7c 20 70 43 73 72 2d 3e 65 53 65 61 72 63 68  || pCsr->eSearch
1a2a0 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  ==FTS3_FULLSCAN_
1a2b0 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66  SEARCH ){.    if
1a2c0 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
1a2d0 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
1a2e0 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
1a2f0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31   pCsr->isEof = 1
1a300 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a310 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
1a320 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 65 6c  >pStmt);.    }el
1a330 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  se{.      pCsr->
1a340 69 50 72 65 76 49 64 20 3d 20 73 71 6c 69 74 65  iPrevId = sqlite
1a350 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1a360 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
1a370 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a380 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  E_OK;.    }.  }e
1a390 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
1a3a0 73 33 45 76 61 6c 4e 65 78 74 28 28 46 74 73 33  s3EvalNext((Fts3
1a3b0 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1a3c0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
1a3d0 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70   ((Fts3Table *)p
1a3e0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
1a3f0 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29  ->pSegments==0 )
1a400 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a410 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a420 6f 77 69 6e 67 20 61 72 65 20 63 6f 70 69 65 64  owing are copied
1a430 20 66 72 6f 6d 20 73 71 6c 69 74 65 49 6e 74 2e   from sqliteInt.
1a440 68 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  h..**.** Constan
1a450 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  ts for the large
1a460 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74 20  st and smallest 
1a470 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74 20  possible 64-bit 
1a480 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e  signed integers.
1a490 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73  .** These macros
1a4a0 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
1a4b0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
1a4c0 6f 6e 20 62 6f 74 68 20 33 32 2d 62 69 74 20 61  on both 32-bit a
1a4d0 6e 64 20 36 34 2d 62 69 74 0a 2a 2a 20 63 6f 6d  nd 64-bit.** com
1a4e0 70 69 6c 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  pilers..*/.#ifnd
1a4f0 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
1a500 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  MATION.# define 
1a510 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 20 28  LARGEST_INT64  (
1a520 30 78 66 66 66 66 66 66 66 66 7c 28 28 28 73 71  0xffffffff|(((sq
1a530 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 66  lite3_int64)0x7f
1a540 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a 23 20  ffffff)<<32)).# 
1a550 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54 5f  define SMALLEST_
1a560 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74 65 33  INT64 (((sqlite3
1a570 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c 41 52  _int64)-1) - LAR
1a580 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65 6e 64  GEST_INT64).#end
1a590 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1a5a0 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66   numeric type of
1a5b0 20 61 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 69   argument pVal i
1a5c0 73 20 22 69 6e 74 65 67 65 72 22 2c 20 74 68 65  s "integer", the
1a5d0 6e 20 72 65 74 75 72 6e 20 69 74 0a 2a 2a 20 63  n return it.** c
1a5e0 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 36 34  onverted to a 64
1a5f0 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1a600 67 65 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ger. Otherwise, 
1a610 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  return a copy of
1a620 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 70  .** the second p
1a630 61 72 61 6d 65 74 65 72 2c 20 69 44 65 66 61 75  arameter, iDefau
1a640 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  lt..*/.static sq
1a650 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 73 33  lite3_int64 fts3
1a660 44 6f 63 69 64 52 61 6e 67 65 28 73 71 6c 69 74  DocidRange(sqlit
1a670 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
1a680 69 36 34 20 69 44 65 66 61 75 6c 74 29 7b 0a 20  i64 iDefault){. 
1a690 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
1a6a0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
1a6b0 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
1a6c0 69 63 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ic_type(pVal);. 
1a6d0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
1a6e0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
1a6f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1a700 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1a710 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
1a720 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 65 66 61  }.  return iDefa
1a730 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
1a740 69 73 20 69 73 20 74 68 65 20 78 46 69 6c 74 65  is is the xFilte
1a750 72 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  r interface for 
1a760 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a770 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76  e.  See.** the v
1a780 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69  irtual table xFi
1a790 6c 74 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75  lter method docu
1a7a0 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64  mentation for ad
1a7b0 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f  ditional.** info
1a7c0 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
1a7d0 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 46  f idxNum==FTS3_F
1a7e0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 74  ULLSCAN_SEARCH t
1a7f0 68 65 6e 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  hen do a full ta
1a800 62 6c 65 20 73 63 61 6e 20 61 67 61 69 6e 73 74  ble scan against
1a810 0a 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  .** the %_conten
1a820 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  t table..**.** I
1a830 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 44  f idxNum==FTS3_D
1a840 4f 43 49 44 5f 53 45 41 52 43 48 20 74 68 65 6e  OCID_SEARCH then
1a850 20 64 6f 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b   do a docid look
1a860 75 70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  up for a single 
1a870 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
1a880 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1a890 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64 78 4e 75 6d  .**.** If idxNum
1a8a0 3e 3d 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f  >=FTS3_FULLTEXT_
1a8b0 53 45 41 52 43 48 20 74 68 65 6e 20 75 73 65 20  SEARCH then use 
1a8c0 74 68 65 20 66 75 6c 6c 20 74 65 78 74 20 69 6e  the full text in
1a8d0 64 65 78 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 6c  dex.  The.** col
1a8e0 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d  umn on the left-
1a8f0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1a900 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
1a910 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d  is column.** num
1a920 62 65 72 20 69 64 78 4e 75 6d 2d 46 54 53 33 5f  ber idxNum-FTS3_
1a930 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2c  FULLTEXT_SEARCH,
1a940 20 30 20 69 6e 64 65 78 65 64 2e 20 20 61 72 67   0 indexed.  arg
1a950 76 5b 30 5d 20 69 73 20 74 68 65 20 72 69 67 68  v[0] is the righ
1a960 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f  t-hand.** side o
1a970 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
1a980 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
1a990 69 6e 74 20 66 74 73 33 46 69 6c 74 65 72 4d 65  int fts3FilterMe
1a9a0 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1a9b0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1a9c0 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  rsor,   /* The c
1a9d0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74  ursor used for t
1a9e0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
1a9f0 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20  nt idxNum,      
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa10 2a 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78  * Strategy index
1aa20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1aa30 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20   *idxStr,       
1aa40 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
1aa50 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1aa80 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70  f elements in ap
1aa90 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Val */.  sqlite3
1aaa0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
1aac0 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e  ments for the in
1aad0 64 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f  dexing scheme */
1aae0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1aaf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
1ab00 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ab20 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  QL statement use
1ab30 64 20 74 6f 20 61 63 63 65 73 73 20 25 5f 63 6f  d to access %_co
1ab40 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntent */.  int e
1ab50 53 65 61 72 63 68 3b 0a 20 20 46 74 73 33 54 61  Search;.  Fts3Ta
1ab60 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
1ab70 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  ble *)pCursor->p
1ab80 56 74 61 62 3b 0a 20 20 46 74 73 33 43 75 72 73  Vtab;.  Fts3Curs
1ab90 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
1aba0 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1abb0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
1abc0 75 65 20 2a 70 43 6f 6e 73 20 3d 20 30 3b 20 20  ue *pCons = 0;  
1abd0 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 41 54 43       /* The MATC
1abe0 48 20 6f 72 20 72 6f 77 69 64 20 63 6f 6e 73 74  H or rowid const
1abf0 72 61 69 6e 74 2c 20 69 66 20 61 6e 79 20 2a 2f  raint, if any */
1ac00 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1ac10 20 2a 70 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20   *pLangid = 0;  
1ac20 20 20 20 2f 2a 20 54 68 65 20 22 6c 61 6e 67 69     /* The "langi
1ac30 64 20 3d 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e  d = ?" constrain
1ac40 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 73  t, if any */.  s
1ac50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44  qlite3_value *pD
1ac60 6f 63 69 64 47 65 20 3d 20 30 3b 20 20 20 20 2f  ocidGe = 0;    /
1ac70 2a 20 54 68 65 20 22 64 6f 63 69 64 20 3e 3d 20  * The "docid >= 
1ac80 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69  ?" constraint, i
1ac90 66 20 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74  f any */.  sqlit
1aca0 65 33 5f 76 61 6c 75 65 20 2a 70 44 6f 63 69 64  e3_value *pDocid
1acb0 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68  Le = 0;    /* Th
1acc0 65 20 22 64 6f 63 69 64 20 3c 3d 20 3f 22 20 63  e "docid <= ?" c
1acd0 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 61 6e  onstraint, if an
1ace0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  y */.  int iIdx;
1acf0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1ad00 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20  ETER(idxStr);.  
1ad10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ad20 28 6e 56 61 6c 29 3b 0a 0a 20 20 65 53 65 61 72  (nVal);..  eSear
1ad30 63 68 20 3d 20 28 69 64 78 4e 75 6d 20 26 20 30  ch = (idxNum & 0
1ad40 78 30 30 30 30 46 46 46 46 29 3b 0a 20 20 61 73  x0000FFFF);.  as
1ad50 73 65 72 74 28 20 65 53 65 61 72 63 68 3e 3d 30  sert( eSearch>=0
1ad60 20 26 26 20 65 53 65 61 72 63 68 3c 3d 28 46 54   && eSearch<=(FT
1ad70 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
1ad80 43 48 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  CH+p->nColumn) )
1ad90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1ada0 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a  Segments==0 );..
1adb0 20 20 2f 2a 20 43 6f 6c 6c 65 63 74 20 61 72 67    /* Collect arg
1adc0 75 6d 65 6e 74 73 20 69 6e 74 6f 20 6c 6f 63 61  uments into loca
1add0 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  l variables */. 
1ade0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 69 66 28   iIdx = 0;.  if(
1adf0 20 65 53 65 61 72 63 68 21 3d 46 54 53 33 5f 46   eSearch!=FTS3_F
1ae00 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 29  ULLSCAN_SEARCH )
1ae10 20 70 43 6f 6e 73 20 3d 20 61 70 56 61 6c 5b 69   pCons = apVal[i
1ae20 49 64 78 2b 2b 5d 3b 0a 20 20 69 66 28 20 69 64  Idx++];.  if( id
1ae30 78 4e 75 6d 20 26 20 46 54 53 33 5f 48 41 56 45  xNum & FTS3_HAVE
1ae40 5f 4c 41 4e 47 49 44 20 29 20 70 4c 61 6e 67 69  _LANGID ) pLangi
1ae50 64 20 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b  d = apVal[iIdx++
1ae60 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20  ];.  if( idxNum 
1ae70 26 20 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49  & FTS3_HAVE_DOCI
1ae80 44 5f 47 45 20 29 20 70 44 6f 63 69 64 47 65 20  D_GE ) pDocidGe 
1ae90 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b  = apVal[iIdx++];
1aea0 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20  .  if( idxNum & 
1aeb0 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f  FTS3_HAVE_DOCID_
1aec0 4c 45 20 29 20 70 44 6f 63 69 64 4c 65 20 3d 20  LE ) pDocidLe = 
1aed0 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b 0a 20  apVal[iIdx++];. 
1aee0 20 61 73 73 65 72 74 28 20 69 49 64 78 3d 3d 6e   assert( iIdx==n
1aef0 56 61 6c 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  Val );..  /* In 
1af00 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
1af10 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 65  has been used be
1af20 66 6f 72 65 2c 20 63 6c 65 61 72 20 69 74 20 6e  fore, clear it n
1af30 6f 77 2e 20 2a 2f 0a 20 20 66 74 73 33 43 6c 65  ow. */.  fts3Cle
1af40 61 72 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  arCursor(pCsr);.
1af50 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 6f  .  /* Set the lo
1af60 77 65 72 20 61 6e 64 20 75 70 70 65 72 20 62 6f  wer and upper bo
1af70 75 6e 64 73 20 6f 6e 20 64 6f 63 69 64 73 20 74  unds on docids t
1af80 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 70 43  o return */.  pC
1af90 73 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 20 3d 20  sr->iMinDocid = 
1afa0 66 74 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70  fts3DocidRange(p
1afb0 44 6f 63 69 64 47 65 2c 20 53 4d 41 4c 4c 45 53  DocidGe, SMALLES
1afc0 54 5f 49 4e 54 36 34 29 3b 0a 20 20 70 43 73 72  T_INT64);.  pCsr
1afd0 2d 3e 69 4d 61 78 44 6f 63 69 64 20 3d 20 66 74  ->iMaxDocid = ft
1afe0 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70 44 6f  s3DocidRange(pDo
1aff0 63 69 64 4c 65 2c 20 4c 41 52 47 45 53 54 5f 49  cidLe, LARGEST_I
1b000 4e 54 36 34 29 3b 0a 0a 20 20 69 66 28 20 69 64  NT64);..  if( id
1b010 78 53 74 72 20 29 7b 0a 20 20 20 20 70 43 73 72  xStr ){.    pCsr
1b020 2d 3e 62 44 65 73 63 20 3d 20 28 69 64 78 53 74  ->bDesc = (idxSt
1b030 72 5b 30 5d 3d 3d 27 44 27 29 3b 0a 20 20 7d 65  r[0]=='D');.  }e
1b040 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 2d 3e 62  lse{.    pCsr->b
1b050 44 65 73 63 20 3d 20 70 2d 3e 62 44 65 73 63 49  Desc = p->bDescI
1b060 64 78 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e  dx;.  }.  pCsr->
1b070 65 53 65 61 72 63 68 20 3d 20 28 69 31 36 29 65  eSearch = (i16)e
1b080 53 65 61 72 63 68 3b 0a 0a 20 20 69 66 28 20 65  Search;..  if( e
1b090 53 65 61 72 63 68 21 3d 46 54 53 33 5f 44 4f 43  Search!=FTS3_DOC
1b0a0 49 44 5f 53 45 41 52 43 48 20 26 26 20 65 53 65  ID_SEARCH && eSe
1b0b0 61 72 63 68 21 3d 46 54 53 33 5f 46 55 4c 4c 53  arch!=FTS3_FULLS
1b0c0 43 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a 20 20  CAN_SEARCH ){.  
1b0d0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 65 53 65    int iCol = eSe
1b0e0 61 72 63 68 2d 46 54 53 33 5f 46 55 4c 4c 54 45  arch-FTS3_FULLTE
1b0f0 58 54 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 63  XT_SEARCH;.    c
1b100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
1b110 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y = (const char 
1b120 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1b130 74 65 78 74 28 70 43 6f 6e 73 29 3b 0a 0a 20 20  text(pCons);..  
1b140 20 20 69 66 28 20 7a 51 75 65 72 79 3d 3d 30 20    if( zQuery==0 
1b150 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
1b160 5f 74 79 70 65 28 70 43 6f 6e 73 29 21 3d 53 51  _type(pCons)!=SQ
1b170 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
1b180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b190 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
1b1a0 20 20 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69 64     pCsr->iLangid
1b1b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1b1c0 61 6e 67 69 64 20 29 20 70 43 73 72 2d 3e 69 4c  angid ) pCsr->iL
1b1d0 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
1b1e0 76 61 6c 75 65 5f 69 6e 74 28 70 4c 61 6e 67 69  value_int(pLangi
1b1f0 64 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  d);..    assert(
1b200 20 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67   p->base.zErrMsg
1b210 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1b220 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 50  sqlite3Fts3ExprP
1b230 61 72 73 65 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a  arse(p->pTokeniz
1b240 65 72 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69  er, pCsr->iLangi
1b250 64 2c 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 7a  d,.        p->az
1b260 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 62 46 74 73 34  Column, p->bFts4
1b270 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 69 43  , p->nColumn, iC
1b280 6f 6c 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  ol, zQuery, -1, 
1b290 26 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 0a 20  &pCsr->pExpr, . 
1b2a0 20 20 20 20 20 20 20 26 70 2d 3e 62 61 73 65 2e         &p->base.
1b2b0 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20  zErrMsg.    );. 
1b2c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b2d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1b2e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1b2f0 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76 61      rc = fts3Eva
1b300 6c 53 74 61 72 74 28 70 43 73 72 29 3b 0a 20 20  lStart(pCsr);.  
1b310 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1b320 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
1b330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b340 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b350 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65 78  ;.    pCsr->pNex
1b360 74 49 64 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63  tId = pCsr->aDoc
1b370 6c 69 73 74 3b 0a 20 20 20 20 70 43 73 72 2d 3e  list;.    pCsr->
1b380 69 50 72 65 76 49 64 20 3d 20 30 3b 0a 20 20 7d  iPrevId = 0;.  }
1b390 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 20 61  ..  /* Compile a
1b3a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b3b0 74 20 66 6f 72 20 74 68 69 73 20 63 75 72 73 6f  t for this curso
1b3c0 72 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d 74 61  r. For a full-ta
1b3d0 62 6c 65 2d 73 63 61 6e 2c 20 74 68 65 0a 20 20  ble-scan, the.  
1b3e0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f 6f  ** statement loo
1b3f0 70 73 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72  ps through all r
1b400 6f 77 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e  ows of the %_con
1b410 74 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20  tent table. For 
1b420 61 0a 20 20 2a 2a 20 66 75 6c 6c 2d 74 65 78 74  a.  ** full-text
1b430 20 71 75 65 72 79 20 6f 72 20 64 6f 63 69 64 20   query or docid 
1b440 6c 6f 6f 6b 75 70 2c 20 74 68 65 20 73 74 61 74  lookup, the stat
1b450 65 6d 65 6e 74 20 72 65 74 72 69 65 76 65 73 20  ement retrieves 
1b460 61 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 72 6f  a single.  ** ro
1b470 77 20 62 79 20 64 6f 63 69 64 2e 0a 20 20 2a 2f  w by docid..  */
1b480 0a 20 20 69 66 28 20 65 53 65 61 72 63 68 3d 3d  .  if( eSearch==
1b490 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45  FTS3_FULLSCAN_SE
1b4a0 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66 28 20  ARCH ){.    if( 
1b4b0 70 44 6f 63 69 64 47 65 20 7c 7c 20 70 44 6f 63  pDocidGe || pDoc
1b4c0 69 64 4c 65 20 29 7b 0a 20 20 20 20 20 20 7a 53  idLe ){.      zS
1b4d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1b4e0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
1b4f0 22 53 45 4c 45 43 54 20 25 73 20 57 48 45 52 45  "SELECT %s WHERE
1b500 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 25   rowid BETWEEN %
1b510 6c 6c 64 20 41 4e 44 20 25 6c 6c 64 20 4f 52 44  lld AND %lld ORD
1b520 45 52 20 42 59 20 72 6f 77 69 64 20 25 73 22 2c  ER BY rowid %s",
1b530 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 52  .          p->zR
1b540 65 61 64 45 78 70 72 6c 69 73 74 2c 20 70 43 73  eadExprlist, pCs
1b550 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 2c 20 70 43  r->iMinDocid, pC
1b560 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 2c 0a 20  sr->iMaxDocid,. 
1b570 20 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e           (pCsr->
1b580 62 44 65 73 63 20 3f 20 22 44 45 53 43 22 20 3a  bDesc ? "DESC" :
1b590 20 22 41 53 43 22 29 0a 20 20 20 20 20 20 29 3b   "ASC").      );
1b5a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b5b0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1b5c0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
1b5d0 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77   %s ORDER BY row
1b5e0 69 64 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20  id %s", .       
1b5f0 20 20 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c     p->zReadExprl
1b600 69 73 74 2c 20 28 70 43 73 72 2d 3e 62 44 65 73  ist, (pCsr->bDes
1b610 63 20 3f 20 22 44 45 53 43 22 20 3a 20 22 41 53  c ? "DESC" : "AS
1b620 43 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  C").      );.   
1b630 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20   }.    if( zSql 
1b640 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1b650 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33  lite3_prepare_v3
1b660 28 70 2d 3e 64 62 2c 7a 53 71 6c 2c 2d 31 2c 53  (p->db,zSql,-1,S
1b670 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45  QLITE_PREPARE_PE
1b680 52 53 49 53 54 45 4e 54 2c 26 70 43 73 72 2d 3e  RSISTENT,&pCsr->
1b690 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20  pStmt,0);.      
1b6a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1b6b0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1b6c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b6d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1b6e0 7d 65 6c 73 65 20 69 66 28 20 65 53 65 61 72 63  }else if( eSearc
1b6f0 68 3d 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45  h==FTS3_DOCID_SE
1b700 41 52 43 48 20 29 7b 0a 20 20 20 20 72 63 20 3d  ARCH ){.    rc =
1b710 20 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 53   fts3CursorSeekS
1b720 74 6d 74 28 70 43 73 72 29 3b 0a 20 20 20 20 69  tmt(pCsr);.    i
1b730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b740 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1b750 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
1b760 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31  e(pCsr->pStmt, 1
1b770 2c 20 70 43 6f 6e 73 29 3b 0a 20 20 20 20 7d 0a  , pCons);.    }.
1b780 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1b790 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b7a0 20 72 63 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66   rc;..  return f
1b7b0 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28 70 43  ts3NextMethod(pC
1b7c0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ursor);.}../* .*
1b7d0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
1b7e0 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  of method of the
1b7f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1b800 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
1b810 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  s .** routine to
1b820 20 66 69 6e 64 20 6f 75 74 20 69 66 20 69 74 20   find out if it 
1b830 68 61 73 20 72 65 61 63 68 65 64 20 74 68 65 20  has reached the 
1b840 65 6e 64 20 6f 66 20 61 20 72 65 73 75 6c 74 20  end of a result 
1b850 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1b860 6e 74 20 66 74 73 33 45 6f 66 4d 65 74 68 6f 64  nt fts3EofMethod
1b870 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1b880 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
1b890 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1b8a0 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f 72  sr = (Fts3Cursor
1b8b0 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  *)pCursor;.  if(
1b8c0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 29 7b 0a   pCsr->isEof ){.
1b8d0 20 20 20 20 66 74 73 33 43 6c 65 61 72 43 75 72      fts3ClearCur
1b8e0 73 6f 72 28 70 43 73 72 29 3b 0a 20 20 20 20 70  sor(pCsr);.    p
1b8f0 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a  Csr->isEof = 1;.
1b900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 73    }.  return pCs
1b910 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f 2a 20  r->isEof;.}../* 
1b920 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1b930 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20 54  xRowid method. T
1b940 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63  he SQLite core c
1b950 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1b960 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76 65  e to.** retrieve
1b970 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
1b980 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1b990 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1b9a0 2e 20 66 74 73 33 0a 2a 2a 20 65 78 70 6f 73 65  . fts3.** expose
1b9b0 73 20 25 5f 63 6f 6e 74 65 6e 74 2e 64 6f 63 69  s %_content.doci
1b9c0 64 20 61 73 20 74 68 65 20 72 6f 77 69 64 20 66  d as the rowid f
1b9d0 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
1b9e0 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 77  able. The.** row
1b9f0 69 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  id should be wri
1ba00 74 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e  tten to *pRowid.
1ba10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ba20 74 73 33 52 6f 77 69 64 4d 65 74 68 6f 64 28 73  ts3RowidMethod(s
1ba30 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
1ba40 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c  or *pCursor, sql
1ba50 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
1ba60 64 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72  d){.  Fts3Cursor
1ba70 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43 75   *pCsr = (Fts3Cu
1ba80 72 73 6f 72 20 2a 29 20 70 43 75 72 73 6f 72 3b  rsor *) pCursor;
1ba90 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73  .  *pRowid = pCs
1baa0 72 2d 3e 69 50 72 65 76 49 64 3b 0a 20 20 72 65  r->iPrevId;.  re
1bab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bac0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69  }../* .** This i
1bad0 73 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  s the xColumn me
1bae0 74 68 6f 64 2c 20 63 61 6c 6c 65 64 20 62 79 20  thod, called by 
1baf0 53 51 4c 69 74 65 20 74 6f 20 72 65 71 75 65 73  SQLite to reques
1bb00 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a  t a value from.*
1bb10 2a 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  * the row that t
1bb20 68 65 20 73 75 70 70 6c 69 65 64 20 63 75 72 73  he supplied curs
1bb30 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1bb40 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  nts to..**.** If
1bb50 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 69 43 6f 6c 20  :.**.**   (iCol 
1bb60 3c 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 20  <  p->nColumn)  
1bb70 20 2d 3e 20 54 68 65 20 76 61 6c 75 65 20 6f 66   -> The value of
1bb80 20 74 68 65 20 69 43 6f 6c 27 74 68 20 75 73 65   the iCol'th use
1bb90 72 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 28  r column..**   (
1bba0 69 43 6f 6c 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75  iCol == p->nColu
1bbb0 6d 6e 29 20 20 20 2d 3e 20 4d 61 67 69 63 20 63  mn)   -> Magic c
1bbc0 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68 65 20 73  olumn with the s
1bbd0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
1bbe0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28 69 43 6f  table..**   (iCo
1bbf0 6c 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  l == p->nColumn+
1bc00 31 29 20 2d 3e 20 44 6f 63 69 64 20 63 6f 6c 75  1) -> Docid colu
1bc10 6d 6e 0a 2a 2a 20 20 20 28 69 43 6f 6c 20 3d 3d  mn.**   (iCol ==
1bc20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 29 20 2d   p->nColumn+2) -
1bc30 3e 20 4c 61 6e 67 69 64 20 63 6f 6c 75 6d 6e 0a  > Langid column.
1bc40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1bc50 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a  s3ColumnMethod(.
1bc60 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
1bc70 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
1bc80 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
1bc90 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72  etrieve value fr
1bca0 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  om */.  sqlite3_
1bcb0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
1bcc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1bcd0 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  xt for sqlite3_r
1bce0 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c  esult_xxx() call
1bcf0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bd20 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  of column to rea
1bd30 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  d value from */.
1bd40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1bd50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1bd60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1bd70 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 43 75 72  ode */.  Fts3Cur
1bd80 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
1bd90 33 43 75 72 73 6f 72 20 2a 29 20 70 43 75 72 73  3Cursor *) pCurs
1bda0 6f 72 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  or;.  Fts3Table 
1bdb0 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
1bdc0 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  *)pCursor->pVtab
1bdd0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ;..  /* The colu
1bde0 6d 6e 20 76 61 6c 75 65 20 73 75 70 70 6c 69 65  mn value supplie
1bdf0 64 20 62 79 20 53 51 4c 69 74 65 20 6d 75 73 74  d by SQLite must
1be00 20 62 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f   be in range. */
1be10 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1be20 3d 30 20 26 26 20 69 43 6f 6c 3c 3d 70 2d 3e 6e  =0 && iCol<=p->n
1be30 43 6f 6c 75 6d 6e 2b 32 20 29 3b 0a 0a 20 20 73  Column+2 );..  s
1be40 77 69 74 63 68 28 20 69 43 6f 6c 2d 70 2d 3e 6e  witch( iCol-p->n
1be50 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 63 61  Column ){.    ca
1be60 73 65 20 30 3a 0a 20 20 20 20 20 20 2f 2a 20 54  se 0:.      /* T
1be70 68 65 20 73 70 65 63 69 61 6c 20 27 74 61 62 6c  he special 'tabl
1be80 65 2d 6e 61 6d 65 27 20 63 6f 6c 75 6d 6e 20 2a  e-name' column *
1be90 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
1bea0 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72 28 70  result_pointer(p
1beb0 43 74 78 2c 20 70 43 73 72 2c 20 22 66 74 73 33  Ctx, pCsr, "fts3
1bec0 63 75 72 73 6f 72 22 2c 20 30 29 3b 0a 20 20 20  cursor", 0);.   
1bed0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1bee0 61 73 65 20 31 3a 0a 20 20 20 20 20 20 2f 2a 20  ase 1:.      /* 
1bef0 54 68 65 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e  The docid column
1bf00 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1bf10 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
1bf20 43 74 78 2c 20 70 43 73 72 2d 3e 69 50 72 65 76  Ctx, pCsr->iPrev
1bf30 49 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Id);.      break
1bf40 3b 0a 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  ;..    case 2:. 
1bf50 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70       if( pCsr->p
1bf60 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1bf70 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1bf80 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d  nt64(pCtx, pCsr-
1bf90 3e 69 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 20  >iLangid);.     
1bfa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bfb0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4c 61  }else if( p->zLa
1bfc0 6e 67 75 61 67 65 69 64 3d 3d 30 20 29 7b 0a 20  nguageid==0 ){. 
1bfd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
1bfe0 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
1bff0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
1c000 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
1c010 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1c020 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
1c030 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1c040 67 68 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 0a 20  gh */.      }.. 
1c050 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1c060 20 20 2f 2a 20 41 20 75 73 65 72 20 63 6f 6c 75    /* A user colu
1c070 6d 6e 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  mn. Or, if this 
1c080 69 73 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  is a full-table 
1c090 73 63 61 6e 2c 20 70 6f 73 73 69 62 6c 79 20 74  scan, possibly t
1c0a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 6e 67  he.      ** lang
1c0b0 75 61 67 65 2d 69 64 20 63 6f 6c 75 6d 6e 2e 20  uage-id column. 
1c0c0 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 2e  Seek the cursor.
1c0d0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66   */.      rc = f
1c0e0 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 30 2c  ts3CursorSeek(0,
1c0f0 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66   pCsr);.      if
1c100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c110 26 26 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  && sqlite3_data_
1c120 63 6f 75 6e 74 28 70 43 73 72 2d 3e 70 53 74 6d  count(pCsr->pStm
1c130 74 29 2d 31 3e 69 43 6f 6c 20 29 7b 0a 20 20 20  t)-1>iCol ){.   
1c140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1c150 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
1c160 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
1c170 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74 6d 74  alue(pCsr->pStmt
1c180 2c 20 69 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  , iCol+1));.    
1c190 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c1a0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1c1b0 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43  ((Fts3Table *)pC
1c1c0 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d  sr->base.pVtab)-
1c1d0 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1c1e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c1f0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1c200 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70  ction is the imp
1c210 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1c220 68 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 62  he xUpdate callb
1c230 61 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  ack used by .** 
1c240 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62  FTS3 virtual tab
1c250 6c 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f 6b  les. It is invok
1c260 65 64 20 62 79 20 53 51 4c 69 74 65 20 65 61 63  ed by SQLite eac
1c270 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
1c280 74 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65  to be.** inserte
1c290 64 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64 65  d, updated or de
1c2a0 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
1c2b0 20 69 6e 74 20 66 74 73 33 55 70 64 61 74 65 4d   int fts3UpdateM
1c2c0 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
1c2d0 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20  _vtab *pVtab,   
1c2e0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
1c2f0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
1c300 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c330 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
1c340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1c350 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20  ue **apVal,     
1c360 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1c370 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1c380 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
1c390 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
1c3a0 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65  /* OUT: The affe
1c3b0 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65  cted (or effecte
1c3c0 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20  d) rowid */.){. 
1c3d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
1c3e0 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28  ts3UpdateMethod(
1c3f0 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70 56  pVtab, nArg, apV
1c400 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 7d 0a 0a  al, pRowid);.}..
1c410 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1c420 74 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20  tion of xSync() 
1c430 6d 65 74 68 6f 64 2e 20 46 6c 75 73 68 20 74 68  method. Flush th
1c440 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1c450 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 0a  e pending-terms.
1c460 2a 2a 20 68 61 73 68 2d 74 61 62 6c 65 20 74 6f  ** hash-table to
1c470 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1c480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1c490 33 53 79 6e 63 4d 65 74 68 6f 64 28 73 71 6c 69  3SyncMethod(sqli
1c4a0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
1c4b0 7b 0a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  {..  /* Followin
1c4c0 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
1c4d0 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
1c4e0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
1c4f0 74 68 65 20 69 6e 70 75 74 0a 20 20 2a 2a 20 73  the input.  ** s
1c500 65 67 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  egments are not 
1c510 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 73 75  completely consu
1c520 6d 65 64 20 28 74 68 65 20 75 73 75 61 6c 20 63  med (the usual c
1c530 61 73 65 29 2c 20 74 68 65 79 20 61 72 65 20 75  ase), they are u
1c540 70 64 61 74 65 64 0a 20 20 2a 2a 20 69 6e 20 70  pdated.  ** in p
1c550 6c 61 63 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  lace to remove t
1c560 68 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  he entries that 
1c570 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1c580 6e 20 6d 65 72 67 65 64 2e 20 54 68 69 73 0a 20  n merged. This. 
1c590 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 75 70 64   ** involves upd
1c5a0 61 74 69 6e 67 20 74 68 65 20 6c 65 61 66 20 62  ating the leaf b
1c5b0 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 74 61 69  lock that contai
1c5c0 6e 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ns the smallest 
1c5d0 75 6e 6d 65 72 67 65 64 0a 20 20 2a 2a 20 65 6e  unmerged.  ** en
1c5e0 74 72 79 20 61 6e 64 20 65 61 63 68 20 62 6c 6f  try and each blo
1c5f0 63 6b 20 28 69 66 20 61 6e 79 29 20 62 65 74 77  ck (if any) betw
1c600 65 65 6e 20 74 68 65 20 6c 65 61 66 20 61 6e 64  een the leaf and
1c610 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
1c620 53 6f 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 68  So.  ** if the h
1c630 65 69 67 68 74 20 6f 66 20 74 68 65 20 69 6e 70  eight of the inp
1c640 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
1c650 65 73 20 69 73 20 4e 2c 20 61 6e 64 20 69 6e 70  es is N, and inp
1c660 75 74 20 73 65 67 6d 65 6e 74 73 0a 20 20 2a 2a  ut segments.  **
1c670 20 61 72 65 20 6d 65 72 67 65 64 20 65 69 67 68   are merged eigh
1c680 74 20 61 74 20 61 20 74 69 6d 65 2c 20 75 70 64  t at a time, upd
1c690 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ating the input 
1c6a0 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65 20  segments at the 
1c6b0 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 61 6e 20 69  end.  ** of an i
1c6c0 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
1c6d0 20 72 65 71 75 69 72 65 73 20 77 72 69 74 69 6e   requires writin
1c6e0 67 20 28 38 2a 28 31 2b 4e 29 29 20 62 6c 6f 63  g (8*(1+N)) bloc
1c6f0 6b 73 2e 20 4e 20 69 73 20 75 73 75 61 6c 6c 79  ks. N is usually
1c700 0a 20 20 2a 2a 20 73 6d 61 6c 6c 20 2d 20 6f 66  .  ** small - of
1c710 74 65 6e 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ten between 0 an
1c720 64 20 32 2e 20 53 6f 20 74 68 65 20 6f 76 65 72  d 2. So the over
1c730 68 65 61 64 20 6f 66 20 74 68 65 20 69 6e 63 72  head of the incr
1c740 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 6d 65 72  emental.  ** mer
1c750 67 65 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  ge is somewhere 
1c760 62 65 74 77 65 65 6e 20 38 20 61 6e 64 20 32 34  between 8 and 24
1c770 20 62 6c 6f 63 6b 73 2e 20 54 6f 20 61 76 6f 69   blocks. To avoi
1c780 64 20 74 68 69 73 20 6f 76 65 72 68 65 61 64 0a  d this overhead.
1c790 20 20 2a 2a 20 64 77 61 72 66 69 6e 67 20 74 68    ** dwarfing th
1c7a0 65 20 61 63 74 75 61 6c 20 70 72 6f 64 75 63 74  e actual product
1c7b0 69 76 65 20 77 6f 72 6b 20 61 63 63 6f 6d 70 6c  ive work accompl
1c7c0 69 73 68 65 64 2c 20 74 68 65 20 69 6e 63 72 65  ished, the incre
1c7d0 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a 20 20 2a  mental merge.  *
1c7e0 2a 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  * is only attemp
1c7f0 74 65 64 20 69 66 20 69 74 20 77 69 6c 6c 20 77  ted if it will w
1c800 72 69 74 65 20 61 74 20 6c 65 61 73 74 20 36 34  rite at least 64
1c810 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 20 48 65   leaf blocks. He
1c820 6e 63 65 0a 20 20 2a 2a 20 6e 4d 69 6e 4d 65 72  nce.  ** nMinMer
1c830 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  ge..  **.  ** Of
1c840 20 63 6f 75 72 73 65 2c 20 75 70 64 61 74 69 6e   course, updatin
1c850 67 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  g the input segm
1c860 65 6e 74 73 20 61 6c 73 6f 20 69 6e 76 6f 6c 76  ents also involv
1c870 65 73 20 64 65 6c 65 74 69 6e 67 20 61 20 62 75  es deleting a bu
1c880 6e 63 68 0a 20 20 2a 2a 20 6f 66 20 62 6c 6f 63  nch.  ** of bloc
1c890 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ks from the segm
1c8a0 65 6e 74 73 20 74 61 62 6c 65 2e 20 42 75 74 20  ents table. But 
1c8b0 74 68 69 73 20 69 73 20 6e 6f 74 20 63 6f 6e 73  this is not cons
1c8c0 69 64 65 72 65 64 20 6f 76 65 72 68 65 61 64 0a  idered overhead.
1c8d0 20 20 2a 2a 20 61 73 20 69 74 20 77 6f 75 6c 64    ** as it would
1c8e0 20 61 6c 73 6f 20 62 65 20 72 65 71 75 69 72 65   also be require
1c8f0 64 20 62 79 20 61 20 63 72 69 73 69 73 2d 6d 65  d by a crisis-me
1c900 72 67 65 20 74 68 61 74 20 75 73 65 64 20 74 68  rge that used th
1c910 65 20 73 61 6d 65 20 69 6e 70 75 74 20 0a 20 20  e same input .  
1c920 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 20 20 2a  ** segments..  *
1c930 2f 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6e 4d  /.  const u32 nM
1c940 69 6e 4d 65 72 67 65 20 3d 20 36 34 3b 20 20 20  inMerge = 64;   
1c950 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61      /* Minimum a
1c960 6d 6f 75 6e 74 20 6f 66 20 69 6e 63 72 2d 6d 65  mount of incr-me
1c970 72 67 65 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a  rge work to do *
1c980 2f 0a 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  /..  Fts3Table *
1c990 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29  p = (Fts3Table*)
1c9a0 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pVtab;.  int rc;
1c9b0 0a 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69  .  i64 iLastRowi
1c9c0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
1c9d0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
1c9e0 3e 64 62 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  >db);..  rc = sq
1c9f0 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1ca00 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
1ca10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca20 4f 4b 20 0a 20 20 20 26 26 20 70 2d 3e 6e 4c 65  OK .   && p->nLe
1ca30 61 66 41 64 64 3e 28 6e 4d 69 6e 4d 65 72 67 65  afAdd>(nMinMerge
1ca40 2f 31 36 29 20 0a 20 20 20 26 26 20 70 2d 3e 6e  /16) .   && p->n
1ca50 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 26 26  Autoincrmerge &&
1ca60 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1ca70 67 65 21 3d 30 78 66 66 0a 20 20 29 7b 0a 20 20  ge!=0xff.  ){.  
1ca80 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20    int mxLevel = 
1ca90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1caa0 2f 2a 20 4d 61 78 69 6d 75 6d 20 72 65 6c 61 74  /* Maximum relat
1cab0 69 76 65 20 6c 65 76 65 6c 20 76 61 6c 75 65 20  ive level value 
1cac0 69 6e 20 64 62 20 2a 2f 0a 20 20 20 20 69 6e 74  in db */.    int
1cad0 20 41 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   A;             
1cae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1caf0 63 72 2d 6d 65 72 67 65 20 70 61 72 61 6d 65 74  cr-merge paramet
1cb00 65 72 20 41 20 2a 2f 0a 0a 20 20 20 20 72 63 20  er A */..    rc 
1cb10 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 78  = sqlite3Fts3Max
1cb20 4c 65 76 65 6c 28 70 2c 20 26 6d 78 4c 65 76 65  Level(p, &mxLeve
1cb30 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
1cb40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1cb50 20 6d 78 4c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20   mxLevel==0 );. 
1cb60 20 20 20 41 20 3d 20 70 2d 3e 6e 4c 65 61 66 41     A = p->nLeafA
1cb70 64 64 20 2a 20 6d 78 4c 65 76 65 6c 3b 0a 20 20  dd * mxLevel;.  
1cb80 20 20 41 20 2b 3d 20 28 41 2f 32 29 3b 0a 20 20    A += (A/2);.  
1cb90 20 20 69 66 28 20 41 3e 28 69 6e 74 29 6e 4d 69    if( A>(int)nMi
1cba0 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 73 71  nMerge ) rc = sq
1cbb0 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
1cbc0 67 65 28 70 2c 20 41 2c 20 70 2d 3e 6e 41 75 74  ge(p, A, p->nAut
1cbd0 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20 7d  oincrmerge);.  }
1cbe0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1cbf0 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
1cc00 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61    sqlite3_set_la
1cc10 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
1cc20 70 2d 3e 64 62 2c 20 69 4c 61 73 74 52 6f 77 69  p->db, iLastRowi
1cc30 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
1cc40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  .}../*.** If it 
1cc50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6b  is currently unk
1cc60 6e 6f 77 6e 20 77 68 65 74 68 65 72 20 6f 72 20  nown whether or 
1cc70 6e 6f 74 20 74 68 65 20 46 54 53 20 74 61 62 6c  not the FTS tabl
1cc80 65 20 68 61 73 20 61 6e 20 25 5f 73 74 61 74 0a  e has an %_stat.
1cc90 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 70 2d 3e  ** table (if p->
1cca0 62 48 61 73 53 74 61 74 3d 3d 32 29 2c 20 61 74  bHasStat==2), at
1ccb0 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
1ccc0 6e 65 20 74 68 69 73 20 28 73 65 74 20 70 2d 3e  ne this (set p->
1ccd0 62 48 61 73 53 74 61 74 0a 2a 2a 20 74 6f 20 30  bHasStat.** to 0
1cce0 20 6f 72 20 31 29 2e 20 52 65 74 75 72 6e 20 53   or 1). Return S
1ccf0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1cd00 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1cd10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
1cd20 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** if an error o
1cd30 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
1cd40 20 69 6e 74 20 66 74 73 33 53 65 74 48 61 73 53   int fts3SetHasS
1cd50 74 61 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70  tat(Fts3Table *p
1cd60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1cd70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1cd80 2d 3e 62 48 61 73 53 74 61 74 3d 3d 32 20 29 7b  ->bHasStat==2 ){
1cd90 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 62 6c 20  .    char *zTbl 
1cda0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1cdb0 66 28 22 25 73 5f 73 74 61 74 22 2c 20 70 2d 3e  f("%s_stat", p->
1cdc0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
1cdd0 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  zTbl ){.      in
1cde0 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  t res = sqlite3_
1cdf0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1ce00 61 64 61 74 61 28 70 2d 3e 64 62 2c 20 70 2d 3e  adata(p->db, p->
1ce10 7a 44 62 2c 20 7a 54 62 6c 2c 20 30 2c 30 2c 30  zDb, zTbl, 0,0,0
1ce20 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 73  ,0,0,0);.      s
1ce30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 62 6c  qlite3_free(zTbl
1ce40 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 48 61 73  );.      p->bHas
1ce50 53 74 61 74 20 3d 20 28 72 65 73 3d 3d 53 51 4c  Stat = (res==SQL
1ce60 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 7d 65 6c  ITE_OK);.    }el
1ce70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1ce80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ce90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cea0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1ceb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1cec0 42 65 67 69 6e 28 29 20 6d 65 74 68 6f 64 2e 20  Begin() method. 
1ced0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1cee0 74 73 33 42 65 67 69 6e 4d 65 74 68 6f 64 28 73  ts3BeginMethod(s
1cef0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1cf00 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  ab){.  Fts3Table
1cf10 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
1cf20 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53 45  *)pVtab;.  UNUSE
1cf30 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61  D_PARAMETER(pVta
1cf40 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  b);.  assert( p-
1cf50 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1cf60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50  .  assert( p->nP
1cf70 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
1cf80 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1cf90 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 31 20 29  Transaction!=1 )
1cfa0 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1cfb0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1cfc0 20 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   1 );.  TESTONLY
1cfd0 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74  ( p->mxSavepoint
1cfe0 20 3d 20 2d 31 3b 20 29 3b 0a 20 20 70 2d 3e 6e   = -1; );.  p->n
1cff0 4c 65 61 66 41 64 64 20 3d 20 30 3b 0a 20 20 72  LeafAdd = 0;.  r
1d000 65 74 75 72 6e 20 66 74 73 33 53 65 74 48 61 73  eturn fts3SetHas
1d010 53 74 61 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat(p);.}../*.*
1d020 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1d030 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29 20 6d 65   of xCommit() me
1d040 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20 61 20  thod. This is a 
1d050 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f 6e 74 65  no-op. The conte
1d060 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 65  nts of.** the pe
1d070 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
1d080 2d 74 61 62 6c 65 20 68 61 76 65 20 61 6c 72 65  -table have alre
1d090 61 64 79 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ady been flushed
1d0a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1d0b0 73 65 0a 2a 2a 20 62 79 20 66 74 73 33 53 79 6e  se.** by fts3Syn
1d0c0 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a 73 74  cMethod()..*/.st
1d0d0 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6d  atic int fts3Com
1d0e0 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  mitMethod(sqlite
1d0f0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
1d100 20 20 54 45 53 54 4f 4e 4c 59 28 20 46 74 73 33    TESTONLY( Fts3
1d110 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1d120 54 61 62 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a  Table*)pVtab );.
1d130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d140 45 52 28 70 56 74 61 62 29 3b 0a 20 20 61 73 73  ER(pVtab);.  ass
1d150 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  ert( p->nPending
1d160 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Data==0 );.  ass
1d170 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  ert( p->inTransa
1d180 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73  ction!=0 );.  as
1d190 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d 65 6e  sert( p->pSegmen
1d1a0 74 73 3d 3d 30 20 29 3b 0a 20 20 54 45 53 54 4f  ts==0 );.  TESTO
1d1b0 4e 4c 59 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  NLY( p->inTransa
1d1c0 63 74 69 6f 6e 20 3d 20 30 20 29 3b 0a 20 20 54  ction = 0 );.  T
1d1d0 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d 78 53 61  ESTONLY( p->mxSa
1d1e0 76 65 70 6f 69 6e 74 20 3d 20 2d 31 3b 20 29 3b  vepoint = -1; );
1d1f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
1d210 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1d220 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73  xRollback(). Dis
1d230 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1d240 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
1d250 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74  -terms.** hash-t
1d260 61 62 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65  able. Any change
1d270 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
1d280 74 61 62 61 73 65 20 61 72 65 20 72 65 76 65 72  tabase are rever
1d290 74 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a  ted by SQLite..*
1d2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1d2b0 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28  3RollbackMethod(
1d2c0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1d2d0 74 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  tab){.  Fts3Tabl
1d2e0 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
1d2f0 65 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  e*)pVtab;.  sqli
1d300 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
1d310 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 61  rmsClear(p);.  a
1d320 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1d330 73 61 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  saction!=0 );.  
1d340 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 69 6e 54  TESTONLY( p->inT
1d350 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 20 29  ransaction = 0 )
1d360 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1d370 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 2d  >mxSavepoint = -
1d380 31 3b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  1; );.  return S
1d390 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d3a0 2a 2a 20 57 68 65 6e 20 63 61 6c 6c 65 64 2c 20  ** When called, 
1d3b0 2a 70 70 50 6f 73 6c 69 73 74 20 6d 75 73 74 20  *ppPoslist must 
1d3c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74  point to the byt
1d3d0 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
1d3e0 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
1d3f0 6e 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e  nd of a position
1d400 2d 6c 69 73 74 2e 20 69 2e 65 2e 20 28 20 28 2a  -list. i.e. ( (*
1d410 70 70 50 6f 73 6c 69 73 74 29 5b 2d 31 5d 3d 3d  ppPoslist)[-1]==
1d420 50 4f 53 5f 45 4e 44 20 29 2e 20 54 68 69 73 20  POS_END ). This 
1d430 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 6f 76 65  function.** move
1d440 73 20 2a 70 70 50 6f 73 6c 69 73 74 20 73 6f 20  s *ppPoslist so 
1d450 74 68 61 74 20 69 74 20 69 6e 73 74 65 61 64 20  that it instead 
1d460 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
1d470 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 0a  rst byte of the.
1d480 2a 2a 20 73 61 6d 65 20 70 6f 73 69 74 69 6f 6e  ** same position
1d490 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1d4a0 20 76 6f 69 64 20 66 74 73 33 52 65 76 65 72 73   void fts3Revers
1d4b0 65 50 6f 73 6c 69 73 74 28 63 68 61 72 20 2a 70  ePoslist(char *p
1d4c0 53 74 61 72 74 2c 20 63 68 61 72 20 2a 2a 70 70  Start, char **pp
1d4d0 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72  Poslist){.  char
1d4e0 20 2a 70 20 3d 20 26 28 2a 70 70 50 6f 73 6c 69   *p = &(*ppPosli
1d4f0 73 74 29 5b 2d 32 5d 3b 0a 20 20 63 68 61 72 20  st)[-2];.  char 
1d500 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 6b 69  c = 0;..  /* Ski
1d510 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 73  p backwards pass
1d520 65 64 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ed any trailing 
1d530 30 78 30 30 20 62 79 74 65 73 20 61 64 64 65 64  0x00 bytes added
1d540 20 62 79 20 4e 65 61 72 54 72 69 6d 28 29 20 2a   by NearTrim() *
1d550 2f 0a 20 20 77 68 69 6c 65 28 20 70 3e 70 53 74  /.  while( p>pSt
1d560 61 72 74 20 26 26 20 28 63 3d 2a 70 2d 2d 29 3d  art && (c=*p--)=
1d570 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  =0 );..  /* Sear
1d580 63 68 20 62 61 63 6b 77 61 72 64 73 20 66 6f 72  ch backwards for
1d590 20 61 20 76 61 72 69 6e 74 20 77 69 74 68 20 76   a varint with v
1d5a0 61 6c 75 65 20 7a 65 72 6f 20 28 74 68 65 20 65  alue zero (the e
1d5b0 6e 64 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  nd of the previo
1d5c0 75 73 20 0a 20 20 2a 2a 20 70 6f 73 6c 69 73 74  us .  ** poslist
1d5d0 29 2e 20 54 68 69 73 20 69 73 20 61 6e 20 30 78  ). This is an 0x
1d5e0 30 30 20 62 79 74 65 20 70 72 65 63 65 64 65 64  00 byte preceded
1d5f0 20 62 79 20 73 6f 6d 65 20 62 79 74 65 20 74 68   by some byte th
1d600 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1d610 20 68 61 76 65 20 74 68 65 20 30 78 38 30 20 62   have the 0x80 b
1d620 69 74 20 73 65 74 2e 20 20 2a 2f 0a 20 20 77 68  it set.  */.  wh
1d630 69 6c 65 28 20 70 3e 70 53 74 61 72 74 20 26 26  ile( p>pStart &&
1d640 20 28 2a 70 20 26 20 30 78 38 30 29 20 7c 20 63   (*p & 0x80) | c
1d650 20 29 7b 20 0a 20 20 20 20 63 20 3d 20 2a 70 2d   ){ .    c = *p-
1d660 2d 3b 20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  -; .  }.  assert
1d670 28 20 70 3d 3d 70 53 74 61 72 74 20 7c 7c 20 63  ( p==pStart || c
1d680 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20  ==0 );..  /* At 
1d690 74 68 69 73 20 70 6f 69 6e 74 20 70 20 70 6f 69  this point p poi
1d6a0 6e 74 73 20 74 6f 20 74 68 61 74 20 70 72 65 63  nts to that prec
1d6b0 65 64 69 6e 67 20 62 79 74 65 20 77 69 74 68 6f  eding byte witho
1d6c0 75 74 20 74 68 65 20 30 78 38 30 20 62 69 74 0a  ut the 0x80 bit.
1d6d0 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 6f 20    ** set. So to 
1d6e0 66 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f  find the start o
1d6f0 66 20 74 68 65 20 70 6f 73 6c 69 73 74 2c 20 73  f the poslist, s
1d700 6b 69 70 20 66 6f 72 77 61 72 64 20 32 20 62 79  kip forward 2 by
1d710 74 65 73 20 74 68 65 6e 0a 20 20 2a 2a 20 6f 76  tes then.  ** ov
1d720 65 72 20 61 20 76 61 72 69 6e 74 2e 20 0a 20 20  er a varint. .  
1d730 2a 2a 0a 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  **.  ** Normally
1d740 2e 20 54 68 65 20 6f 74 68 65 72 20 63 61 73 65  . The other case
1d750 20 69 73 20 74 68 61 74 20 70 3d 3d 70 53 74 61   is that p==pSta
1d760 72 74 20 61 6e 64 20 74 68 65 20 70 6f 73 6c 69  rt and the posli
1d770 73 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  st to return.  *
1d780 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  * is the first i
1d790 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 49  n the doclist. I
1d7a0 6e 20 74 68 69 73 20 63 61 73 65 20 64 6f 20 6e  n this case do n
1d7b0 6f 74 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20  ot skip forward 
1d7c0 32 20 62 79 74 65 73 2e 0a 20 20 2a 2a 20 54 68  2 bytes..  ** Th
1d7d0 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  e second part of
1d7e0 20 74 68 65 20 69 66 20 63 6f 6e 64 69 74 69 6f   the if conditio
1d7f0 6e 20 28 63 3d 3d 30 20 26 26 20 2a 70 70 50 6f  n (c==0 && *ppPo
1d800 73 6c 69 73 74 3e 26 70 5b 32 5d 29 0a 20 20 2a  slist>&p[2]).  *
1d810 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  * is required fo
1d820 72 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  r cases where th
1d830 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
1d840 61 20 64 6f 63 6c 69 73 74 20 61 6e 64 20 74 68  a doclist and th
1d850 65 0a 20 20 2a 2a 20 64 6f 63 6c 69 73 74 20 69  e.  ** doclist i
1d860 73 20 65 6d 70 74 79 2e 20 46 6f 72 20 65 78 61  s empty. For exa
1d870 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 66 69 72  mple, if the fir
1d880 73 74 20 64 6f 63 69 64 20 69 73 20 31 30 2c 20  st docid is 10, 
1d890 61 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 74  a doclist.  ** t
1d8a0 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 3a  hat begins with:
1d8b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 30 78 30  .  **.  **   0x0
1d8c0 41 20 30 78 30 30 20 3c 6e 65 78 74 20 64 6f 63  A 0x00 <next doc
1d8d0 69 64 20 64 65 6c 74 61 20 76 61 72 69 6e 74 3e  id delta varint>
1d8e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3e 70 53  .  */.  if( p>pS
1d8f0 74 61 72 74 20 7c 7c 20 28 63 3d 3d 30 20 26 26  tart || (c==0 &&
1d900 20 2a 70 70 50 6f 73 6c 69 73 74 3e 26 70 5b 32   *ppPoslist>&p[2
1d910 5d 29 20 29 7b 20 70 20 3d 20 26 70 5b 32 5d 3b  ]) ){ p = &p[2];
1d920 20 7d 0a 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b   }.  while( *p++
1d930 26 30 78 38 30 20 29 3b 0a 20 20 2a 70 70 50 6f  &0x80 );.  *ppPo
1d940 73 6c 69 73 74 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  slist = p;.}../*
1d950 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
1d960 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
1d970 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1d980 66 20 74 68 65 20 6f 76 65 72 6c 6f 61 64 65 64  f the overloaded
1d990 20 73 6e 69 70 70 65 74 28 29 2c 0a 2a 2a 20 6f   snippet(),.** o
1d9a0 66 66 73 65 74 73 28 29 20 61 6e 64 20 6f 70 74  ffsets() and opt
1d9b0 69 6d 69 7a 65 28 29 20 53 51 4c 20 66 75 6e 63  imize() SQL func
1d9c0 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tions..**.** If 
1d9d0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
1d9e0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
1d9f0 67 75 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 62  gument is a blob
1da00 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 73 69 7a 65   of size.** size
1da10 6f 66 28 46 74 73 33 43 75 72 73 6f 72 2a 29 2c  of(Fts3Cursor*),
1da20 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 62 20 63   then the blob c
1da30 6f 6e 74 65 6e 74 73 20 61 72 65 20 63 6f 70 69  ontents are copi
1da40 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6f 75  ed to the .** ou
1da50 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
1da60 70 43 73 72 20 61 6e 64 20 53 51 4c 49 54 45 5f  pCsr and SQLITE_
1da70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1da80 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1da90 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
1daa0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f 6e  s written to con
1dab0 74 65 78 74 20 70 43 6f 6e 74 65 78 74 20 61 6e  text pContext an
1dac0 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72  d SQLITE_ERROR r
1dad0 65 74 75 72 6e 65 64 2e 20 54 68 65 0a 2a 2a 20  eturned. The.** 
1dae0 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 76 69  string passed vi
1daf0 61 20 7a 46 75 6e 63 20 69 73 20 75 73 65 64 20  a zFunc is used 
1db00 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 65  as part of the e
1db10 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
1db20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1db30 46 75 6e 63 74 69 6f 6e 41 72 67 28 0a 20 20 73  FunctionArg(.  s
1db40 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1db50 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f  pContext,      /
1db60 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  * SQL function c
1db70 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
1db80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
1db90 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1dba0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61 6d   /* Function nam
1dbb0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
1dbc0 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20  alue *pVal,     
1dbd0 20 20 20 20 20 20 20 2f 2a 20 61 72 67 76 5b 30         /* argv[0
1dbe0 5d 20 70 61 73 73 65 64 20 74 6f 20 66 75 6e 63  ] passed to func
1dbf0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 43 75  tion */.  Fts3Cu
1dc00 72 73 6f 72 20 2a 2a 70 70 43 73 72 20 20 20 20  rsor **ppCsr    
1dc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1dc20 3a 20 53 74 6f 72 65 20 63 75 72 73 6f 72 20 68  : Store cursor h
1dc30 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 29 7b  andle here */.){
1dc40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70  .  int rc;.  *pp
1dc50 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f  Csr = (Fts3Curso
1dc60 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1dc70 5f 70 6f 69 6e 74 65 72 28 70 56 61 6c 2c 20 22  _pointer(pVal, "
1dc80 66 74 73 33 63 75 72 73 6f 72 22 29 3b 0a 20 20  fts3cursor");.  
1dc90 69 66 28 20 28 2a 70 70 43 73 72 29 21 3d 30 20  if( (*ppCsr)!=0 
1dca0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1dcb0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1dcc0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
1dcd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1dce0 28 22 69 6c 6c 65 67 61 6c 20 66 69 72 73 74 20  ("illegal first 
1dcf0 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c  argument to %s",
1dd00 20 7a 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c   zFunc);.    sql
1dd10 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1dd20 72 28 70 43 6f 6e 74 65 78 74 2c 20 7a 45 72 72  r(pContext, zErr
1dd30 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
1dd40 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
1dd50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1dd60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1dd70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1dd80 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1dd90 66 20 74 68 65 20 73 6e 69 70 70 65 74 28 29 20  f the snippet() 
1dda0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54 53  function for FTS
1ddb0 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  3.*/.static void
1ddc0 20 66 74 73 33 53 6e 69 70 70 65 74 46 75 6e 63   fts3SnippetFunc
1ddd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1dde0 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  ext *pContext,  
1ddf0 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 75      /* SQLite fu
1de00 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
1de10 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ext */.  int nVa
1de20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1de30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1de40 20 6f 66 20 61 70 56 61 6c 5b 5d 20 61 72 72 61   of apVal[] arra
1de50 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  y */.  sqlite3_v
1de60 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
1de70 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1de80 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1de90 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  ){.  Fts3Cursor 
1dea0 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
1deb0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68       /* Cursor h
1dec0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 74 68 72  andle passed thr
1ded0 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f  ough apVal[0] */
1dee0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1def0 53 74 61 72 74 20 3d 20 22 3c 62 3e 22 3b 0a 20  Start = "<b>";. 
1df00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
1df10 64 20 3d 20 22 3c 2f 62 3e 22 3b 0a 20 20 63 6f  d = "</b>";.  co
1df20 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 6c 69 70  nst char *zEllip
1df30 73 69 73 20 3d 20 22 3c 62 3e 2e 2e 2e 3c 2f 62  sis = "<b>...</b
1df40 3e 22 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  >";.  int iCol =
1df50 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   -1;.  int nToke
1df60 6e 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  n = 15;         
1df70 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
1df80 74 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  t number of toke
1df90 6e 73 20 69 6e 20 73 6e 69 70 70 65 74 20 2a 2f  ns in snippet */
1dfa0 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73  ..  /* There mus
1dfb0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
1dfc0 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
1dfd0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1dfe0 6f 6e 20 28 6f 74 68 65 72 77 69 73 65 0a 20 20  on (otherwise.  
1dff0 2a 2a 20 74 68 65 20 6e 6f 6e 2d 6f 76 65 72 6c  ** the non-overl
1e000 6f 61 64 65 64 20 76 65 72 73 69 6f 6e 20 77 6f  oaded version wo
1e010 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 63 61  uld have been ca
1e020 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  lled instead of 
1e030 74 68 69 73 20 6f 6e 65 29 2e 0a 20 20 2a 2f 0a  this one)..  */.
1e040 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3e 3d    assert( nVal>=
1e050 31 20 29 3b 0a 0a 20 20 69 66 28 20 6e 56 61 6c  1 );..  if( nVal
1e060 3e 36 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >6 ){.    sqlite
1e070 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
1e080 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
1e090 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20    "wrong number 
1e0a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
1e0b0 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65 74  function snippet
1e0c0 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ()", -1);.    re
1e0d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1e0e0 66 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28  fts3FunctionArg(
1e0f0 70 43 6f 6e 74 65 78 74 2c 20 22 73 6e 69 70 70  pContext, "snipp
1e100 65 74 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26  et", apVal[0], &
1e110 70 43 73 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  pCsr) ) return;.
1e120 0a 20 20 73 77 69 74 63 68 28 20 6e 56 61 6c 20  .  switch( nVal 
1e130 29 7b 0a 20 20 20 20 63 61 73 65 20 36 3a 20 6e  ){.    case 6: n
1e140 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  Token = sqlite3_
1e150 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1e160 35 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 35 3a  5]);.    case 5:
1e170 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iCol = sqlite3_
1e180 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1e190 34 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  4]);.    case 4:
1e1a0 20 7a 45 6c 6c 69 70 73 69 73 20 3d 20 28 63 6f   zEllipsis = (co
1e1b0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1e1c0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1e1d0 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 63 61 73 65  al[3]);.    case
1e1e0 20 33 3a 20 7a 45 6e 64 20 3d 20 28 63 6f 6e 73   3: zEnd = (cons
1e1f0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e200 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e210 5b 32 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 32  [2]);.    case 2
1e220 3a 20 7a 53 74 61 72 74 20 3d 20 28 63 6f 6e 73  : zStart = (cons
1e230 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e240 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e250 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [1]);.  }.  if( 
1e260 21 7a 45 6c 6c 69 70 73 69 73 20 7c 7c 20 21 7a  !zEllipsis || !z
1e270 45 6e 64 20 7c 7c 20 21 7a 53 74 61 72 74 20 29  End || !zStart )
1e280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e290 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1e2a0 28 70 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  (pContext);.  }e
1e2b0 6c 73 65 20 69 66 28 20 6e 54 6f 6b 65 6e 3d 3d  lse if( nToken==
1e2c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1e2d0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f  _result_text(pCo
1e2e0 6e 74 65 78 74 2c 20 22 22 2c 20 2d 31 2c 20 53  ntext, "", -1, S
1e2f0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1e300 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
1e310 45 5f 4f 4b 3d 3d 66 74 73 33 43 75 72 73 6f 72  E_OK==fts3Cursor
1e320 53 65 65 6b 28 70 43 6f 6e 74 65 78 74 2c 20 70  Seek(pContext, p
1e330 43 73 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Csr) ){.    sqli
1e340 74 65 33 46 74 73 33 53 6e 69 70 70 65 74 28 70  te3Fts3Snippet(p
1e350 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a  Context, pCsr, z
1e360 53 74 61 72 74 2c 20 7a 45 6e 64 2c 20 7a 45 6c  Start, zEnd, zEl
1e370 6c 69 70 73 69 73 2c 20 69 43 6f 6c 2c 20 6e 54  lipsis, iCol, nT
1e380 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
1e390 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1e3a0 6f 6e 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  on of the offset
1e3b0 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  s() function for
1e3c0 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20   FTS3.*/.static 
1e3d0 76 6f 69 64 20 66 74 73 33 4f 66 66 73 65 74 73  void fts3Offsets
1e3e0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e3f0 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
1e400 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
1e410 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1e420 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e430 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e450 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
1e460 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
1e470 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1e480 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1e490 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
1e4a0 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75  s */.){.  Fts3Cu
1e4b0 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
1e4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1e4d0 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65  sor handle passe
1e4e0 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b  d through apVal[
1e4f0 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  0] */..  UNUSED_
1e500 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
1e510 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1e520 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 66 74 73  ==1 );.  if( fts
1e530 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f  3FunctionArg(pCo
1e540 6e 74 65 78 74 2c 20 22 6f 66 66 73 65 74 73 22  ntext, "offsets"
1e550 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73  , apVal[0], &pCs
1e560 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  r) ) return;.  a
1e570 73 73 65 72 74 28 20 70 43 73 72 20 29 3b 0a 20  ssert( pCsr );. 
1e580 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1e590 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 70  fts3CursorSeek(p
1e5a0 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29 20 29  Context, pCsr) )
1e5b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1e5c0 33 4f 66 66 73 65 74 73 28 70 43 6f 6e 74 65 78  3Offsets(pContex
1e5d0 74 2c 20 70 43 73 72 29 3b 0a 20 20 7d 0a 7d 0a  t, pCsr);.  }.}.
1e5e0 0a 2f 2a 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ./* .** Implemen
1e5f0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  tation of the sp
1e600 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a 65 28 29  ecial optimize()
1e610 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54   function for FT
1e620 53 33 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  S3. This .** fun
1e630 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 61 6c 6c  ction merges all
1e640 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
1e650 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 73   database to a s
1e660 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  ingle segment..*
1e670 2a 20 45 78 61 6d 70 6c 65 20 75 73 61 67 65 20  * Example usage 
1e680 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  is:.**.**   SELE
1e690 43 54 20 6f 70 74 69 6d 69 7a 65 28 74 29 20 46  CT optimize(t) F
1e6a0 52 4f 4d 20 74 20 4c 49 4d 49 54 20 31 3b 0a 2a  ROM t LIMIT 1;.*
1e6b0 2a 0a 2a 2a 20 77 68 65 72 65 20 27 74 27 20 69  *.** where 't' i
1e6c0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
1e6d0 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a   FTS3 table..*/.
1e6e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1e6f0 4f 70 74 69 6d 69 7a 65 46 75 6e 63 28 0a 20 20  OptimizeFunc(.  
1e700 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e710 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1e720 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1e730 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1e740 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e770 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1e780 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1e790 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1e7a0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1e7b0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1e7c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e7f0 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
1e800 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1e810 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1e820 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1e830 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
1e840 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
1e850 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e     /* Cursor han
1e860 64 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  dle passed throu
1e870 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a  gh apVal[0] */..
1e880 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1e890 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73 73  ER(nVal);..  ass
1e8a0 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  ert( nVal==1 );.
1e8b0 20 20 69 66 28 20 66 74 73 33 46 75 6e 63 74 69    if( fts3Functi
1e8c0 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c 20  onArg(pContext, 
1e8d0 22 6f 70 74 69 6d 69 7a 65 22 2c 20 61 70 56 61  "optimize", apVa
1e8e0 6c 5b 30 5d 2c 20 26 70 43 75 72 73 6f 72 29 20  l[0], &pCursor) 
1e8f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1e900 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 75  (Fts3Table *)pCu
1e910 72 73 6f 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  rsor->base.pVtab
1e920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
1e930 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1e940 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 70 29 3b  Fts3Optimize(p);
1e950 0a 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ..  switch( rc )
1e960 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e970 45 5f 4f 4b 3a 0a 20 20 20 20 20 20 73 71 6c 69  E_OK:.      sqli
1e980 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1e990 70 43 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78  pContext, "Index
1e9a0 20 6f 70 74 69 6d 69 7a 65 64 22 2c 20 2d 31 2c   optimized", -1,
1e9b0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1e9c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e9d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1e9e0 4e 45 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NE:.      sqlite
1e9f0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
1ea00 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78 20 61  ontext, "Index a
1ea10 6c 72 65 61 64 79 20 6f 70 74 69 6d 61 6c 22 2c  lready optimal",
1ea20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1ea30 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
1ea40 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1ea50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1ea60 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
1ea70 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  Context, rc);.  
1ea80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
1ea90 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1eaa0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  tation of the ma
1eab0 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69  tchinfo() functi
1eac0 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a 73  on for FTS3.*/.s
1ead0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4d  tatic void fts3M
1eae0 61 74 63 68 69 6e 66 6f 46 75 6e 63 28 0a 20 20  atchinfoFunc(.  
1eaf0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1eb00 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1eb10 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1eb20 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1eb30 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1eb60 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1eb70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1eb80 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1eb90 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1eba0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1ebb0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1ebc0 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
1ebd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64    /* Cursor hand
1ebe0 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  le passed throug
1ebf0 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20  h apVal[0] */.  
1ec00 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20  assert( nVal==1 
1ec10 7c 7c 20 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20  || nVal==2 );.  
1ec20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66  if( SQLITE_OK==f
1ec30 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70  ts3FunctionArg(p
1ec40 43 6f 6e 74 65 78 74 2c 20 22 6d 61 74 63 68 69  Context, "matchi
1ec50 6e 66 6f 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20  nfo", apVal[0], 
1ec60 26 70 43 73 72 29 20 29 7b 0a 20 20 20 20 63 6f  &pCsr) ){.    co
1ec70 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
1ec80 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 6c   0;.    if( nVal
1ec90 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67  >1 ){.      zArg
1eca0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1ecb0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1ecc0 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
1ecd0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ece0 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 28 70 43  Fts3Matchinfo(pC
1ecf0 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a 41  ontext, pCsr, zA
1ed00 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
1ed10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1ed20 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 78 46  mplements the xF
1ed30 69 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68  indFunction meth
1ed40 6f 64 20 66 6f 72 20 74 68 65 20 46 54 53 33 0a  od for the FTS3.
1ed50 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1ed60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ed70 66 74 73 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  fts3FindFunction
1ed80 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
1ed90 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
1eda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
1edb0 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
1edc0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1edf0 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1ee00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1ee10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1ee20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ee30 2f 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66  /* Name of SQL f
1ee40 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1ee50 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
1ee60 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
1ee70 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
1ee80 2a 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75  *), /* OUT: Resu
1ee90 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  lt */.  void **p
1eea0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
1eeb0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
1eec0 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
1eed0 20 4f 76 65 72 6c 6f 61 64 65 64 20 7b 0a 20 20   Overloaded {.  
1eee0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1eef0 61 6d 65 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a  ame;.    void (*
1ef00 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
1ef10 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
1ef20 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20  te3_value**);.  
1ef30 7d 20 61 4f 76 65 72 6c 6f 61 64 5b 5d 20 3d 20  } aOverload[] = 
1ef40 7b 0a 20 20 20 20 7b 20 22 73 6e 69 70 70 65 74  {.    { "snippet
1ef50 22 2c 20 66 74 73 33 53 6e 69 70 70 65 74 46 75  ", fts3SnippetFu
1ef60 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 66 66  nc },.    { "off
1ef70 73 65 74 73 22 2c 20 66 74 73 33 4f 66 66 73 65  sets", fts3Offse
1ef80 74 73 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  tsFunc },.    { 
1ef90 22 6f 70 74 69 6d 69 7a 65 22 2c 20 66 74 73 33  "optimize", fts3
1efa0 4f 70 74 69 6d 69 7a 65 46 75 6e 63 20 7d 2c 0a  OptimizeFunc },.
1efb0 20 20 20 20 7b 20 22 6d 61 74 63 68 69 6e 66 6f      { "matchinfo
1efc0 22 2c 20 66 74 73 33 4d 61 74 63 68 69 6e 66 6f  ", fts3Matchinfo
1efd0 46 75 6e 63 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  Func },.  };.  i
1efe0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f000 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
1f010 62 6c 65 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  ble */..  UNUSED
1f020 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61 62  _PARAMETER(pVtab
1f030 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f040 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f050 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f060 70 70 41 72 67 29 3b 0a 0a 20 20 66 6f 72 28 69  ppArg);..  for(i
1f070 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72 61  =0; i<SizeofArra
1f080 79 28 61 4f 76 65 72 6c 6f 61 64 29 3b 20 69 2b  y(aOverload); i+
1f090 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
1f0a0 6d 70 28 7a 4e 61 6d 65 2c 20 61 4f 76 65 72 6c  mp(zName, aOverl
1f0b0 6f 61 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  oad[i].zName)==0
1f0c0 20 29 7b 0a 20 20 20 20 20 20 2a 70 78 46 75 6e   ){.      *pxFun
1f0d0 63 20 3d 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d  c = aOverload[i]
1f0e0 2e 78 46 75 6e 63 3b 0a 20 20 20 20 20 20 72 65  .xFunc;.      re
1f0f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f100 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 66 75 6e 63 74  }..  /* No funct
1f110 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
1f120 66 69 65 64 20 6e 61 6d 65 20 77 61 73 20 66 6f  fied name was fo
1f130 75 6e 64 2e 20 52 65 74 75 72 6e 20 30 2e 20 2a  und. Return 0. *
1f140 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1f150 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1f160 61 74 69 6f 6e 20 6f 66 20 46 54 53 33 20 78 52  ation of FTS3 xR
1f170 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 52 65  ename method. Re
1f180 6e 61 6d 65 20 61 6e 20 66 74 73 33 20 74 61 62  name an fts3 tab
1f190 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1f1a0 74 20 66 74 73 33 52 65 6e 61 6d 65 4d 65 74 68  t fts3RenameMeth
1f1b0 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
1f1c0 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20  ab *pVtab,      
1f1d0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1f1e0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1f1f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f200 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
1f210 20 20 20 2f 2a 20 4e 65 77 20 6e 61 6d 65 20 6f     /* New name o
1f220 66 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  f table */.){.  
1f230 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
1f240 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61  Fts3Table *)pVta
1f250 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
1f260 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
1f270 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1f280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f290 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f2c0 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
1f2d0 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62   point it must b
1f2e0 65 20 6b 6e 6f 77 6e 20 69 66 20 74 68 65 20 25  e known if the %
1f2f0 5f 73 74 61 74 20 74 61 62 6c 65 20 65 78 69 73  _stat table exis
1f300 74 73 20 6f 72 20 6e 6f 74 2e 0a 20 20 2a 2a 20  ts or not..  ** 
1f310 53 6f 20 62 48 61 73 53 74 61 74 20 6d 61 79 20  So bHasStat may 
1f320 6e 6f 74 20 62 65 20 32 2e 20 20 2a 2f 0a 20 20  not be 2.  */.  
1f330 72 63 20 3d 20 66 74 73 33 53 65 74 48 61 73 53  rc = fts3SetHasS
1f340 74 61 74 28 70 29 3b 0a 20 20 0a 20 20 2f 2a 20  tat(p);.  .  /* 
1f350 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
1f360 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  he pending terms
1f370 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
1f380 20 65 6d 70 74 79 20 68 65 72 65 2e 20 54 68 69   empty here. Thi
1f390 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73  s is.  ** becaus
1f3a0 65 20 61 6e 20 22 41 4c 54 45 52 20 54 41 42 4c  e an "ALTER TABL
1f3b0 45 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 22 20  E RENAME TABLE" 
1f3c0 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65  statement inside
1f3d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1f3e0 20 20 2a 2a 20 61 6c 77 61 79 73 20 6f 70 65 6e    ** always open
1f3f0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  s a savepoint tr
1f400 61 6e 73 61 63 74 69 6f 6e 2e 20 41 6e 64 20 74  ansaction. And t
1f410 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29 20  he xSavepoint() 
1f420 6d 65 74 68 6f 64 20 0a 20 20 2a 2a 20 66 6c 75  method .  ** flu
1f430 73 68 65 73 20 74 68 65 20 70 65 6e 64 69 6e 67  shes the pending
1f440 20 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 42 75   terms table. Bu
1f450 74 20 6c 65 61 76 65 20 74 68 65 20 28 6e 6f 2d  t leave the (no-
1f460 6f 70 29 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  op) call to.  **
1f470 20 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75   PendingTermsFlu
1f480 73 68 28 29 20 69 6e 20 69 6e 20 63 61 73 65 20  sh() in in case 
1f490 74 68 61 74 20 63 68 61 6e 67 65 73 2e 0a 20 20  that changes..  
1f4a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1f4b0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1f4c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1f4e0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 65   = sqlite3Fts3Pe
1f4f0 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28  ndingTermsFlush(
1f500 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
1f510 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
1f520 20 29 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78   ){.    fts3DbEx
1f530 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
1f540 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
1f550 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 20  Q.'%q_content'  
1f560 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 63 6f  RENAME TO '%q_co
1f570 6e 74 65 6e 74 27 3b 22 2c 0a 20 20 20 20 20 20  ntent';",.      
1f580 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f590 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
1f5a0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61   }..  if( p->bHa
1f5b0 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
1f5c0 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20  fts3DbExec(&rc, 
1f5d0 64 62 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52  db,.      "ALTER
1f5e0 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 64 6f   TABLE %Q.'%q_do
1f5f0 63 73 69 7a 65 27 20 20 52 45 4e 41 4d 45 20 54  csize'  RENAME T
1f600 4f 20 27 25 71 5f 64 6f 63 73 69 7a 65 27 3b 22  O '%q_docsize';"
1f610 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20  ,.      p->zDb, 
1f620 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a  p->zName, zName.
1f630 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
1f640 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
1f650 20 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26      fts3DbExec(&
1f660 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 22 41  rc, db,.      "A
1f670 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25  LTER TABLE %Q.'%
1f680 71 5f 73 74 61 74 27 20 20 52 45 4e 41 4d 45 20  q_stat'  RENAME 
1f690 54 4f 20 27 25 71 5f 73 74 61 74 27 3b 22 2c 0a  TO '%q_stat';",.
1f6a0 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d        p->zDb, p-
1f6b0 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20  >zName, zName.  
1f6c0 20 20 29 3b 0a 20 20 7d 0a 20 20 66 74 73 33 44    );.  }.  fts3D
1f6d0 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
1f6e0 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20     "ALTER TABLE 
1f6f0 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
1f700 20 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73   RENAME TO '%q_s
1f710 65 67 6d 65 6e 74 73 27 3b 22 2c 0a 20 20 20 20  egments';",.    
1f720 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f730 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 66  , zName.  );.  f
1f740 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
1f750 62 2c 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  b,.    "ALTER TA
1f760 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69  BLE %Q.'%q_segdi
1f770 72 27 20 20 20 52 45 4e 41 4d 45 20 54 4f 20 27  r'   RENAME TO '
1f780 25 71 5f 73 65 67 64 69 72 27 3b 22 2c 0a 20 20  %q_segdir';",.  
1f790 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
1f7a0 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20  me, zName.  );. 
1f7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f7c0 2a 0a 2a 2a 20 54 68 65 20 78 53 61 76 65 70 6f  *.** The xSavepo
1f7d0 69 6e 74 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a  int() method..**
1f7e0 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1f7f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
1f800 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c  nding-terms tabl
1f810 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  e to disk..*/.st
1f820 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 61 76  atic int fts3Sav
1f830 65 70 6f 69 6e 74 4d 65 74 68 6f 64 28 73 71 6c  epointMethod(sql
1f840 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1f850 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1f860 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45  LITE_OK;.  UNUSE
1f880 44 5f 50 41 52 41 4d 45 54 45 52 28 69 53 61 76  D_PARAMETER(iSav
1f890 65 70 6f 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  epoint);.  asser
1f8a0 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a  t( ((Fts3Table *
1f8b0 29 70 56 74 61 62 29 2d 3e 69 6e 54 72 61 6e 73  )pVtab)->inTrans
1f8c0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65  action );.  asse
1f8d0 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20  rt( ((Fts3Table 
1f8e0 2a 29 70 56 74 61 62 29 2d 3e 6d 78 53 61 76 65  *)pVtab)->mxSave
1f8f0 70 6f 69 6e 74 20 3c 3d 20 69 53 61 76 65 70 6f  point <= iSavepo
1f900 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  int );.  TESTONL
1f910 59 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a  Y( ((Fts3Table *
1f920 29 70 56 74 61 62 29 2d 3e 6d 78 53 61 76 65 70  )pVtab)->mxSavep
1f930 6f 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e  oint = iSavepoin
1f940 74 20 29 3b 0a 20 20 69 66 28 20 28 28 46 74 73  t );.  if( ((Fts
1f950 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29 2d  3Table *)pVtab)-
1f960 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e  >bIgnoreSavepoin
1f970 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
1f980 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 28   fts3SyncMethod(
1f990 70 56 74 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65  pVtab);.  }.  re
1f9a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f9b0 2a 20 54 68 65 20 78 52 65 6c 65 61 73 65 28 29  * The xRelease()
1f9c0 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54   method..**.** T
1f9d0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1f9e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1f9f0 73 33 52 65 6c 65 61 73 65 4d 65 74 68 6f 64 28  s3ReleaseMethod(
1fa00 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1fa10 74 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f  tab, int iSavepo
1fa20 69 6e 74 29 7b 0a 20 20 54 45 53 54 4f 4e 4c 59  int){.  TESTONLY
1fa30 28 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d  ( Fts3Table *p =
1fa40 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 56 74   (Fts3Table*)pVt
1fa50 61 62 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ab );.  UNUSED_P
1fa60 41 52 41 4d 45 54 45 52 28 69 53 61 76 65 70 6f  ARAMETER(iSavepo
1fa70 69 6e 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  int);.  UNUSED_P
1fa80 41 52 41 4d 45 54 45 52 28 70 56 74 61 62 29 3b  ARAMETER(pVtab);
1fa90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1faa0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1fab0 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 78 53 61   assert( p->mxSa
1fac0 76 65 70 6f 69 6e 74 20 3e 3d 20 69 53 61 76 65  vepoint >= iSave
1fad0 70 6f 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f  point );.  TESTO
1fae0 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f  NLY( p->mxSavepo
1faf0 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  int = iSavepoint
1fb00 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  -1 );.  return S
1fb10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1fb20 2a 2a 20 54 68 65 20 78 52 6f 6c 6c 62 61 63 6b  ** The xRollback
1fb30 54 6f 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  To() method..**.
1fb40 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63  ** Discard the c
1fb50 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
1fb60 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 74 61 62  ending terms tab
1fb70 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fb80 74 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54 6f  t fts3RollbackTo
1fb90 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
1fba0 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20  tab *pVtab, int 
1fbb0 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 46  iSavepoint){.  F
1fbc0 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
1fbd0 74 73 33 54 61 62 6c 65 2a 29 70 56 74 61 62 3b  ts3Table*)pVtab;
1fbe0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1fbf0 54 45 52 28 69 53 61 76 65 70 6f 69 6e 74 29 3b  TER(iSavepoint);
1fc00 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1fc10 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1fc20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 78 53 61   assert( p->mxSa
1fc30 76 65 70 6f 69 6e 74 20 3e 3d 20 69 53 61 76 65  vepoint >= iSave
1fc40 70 6f 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f  point );.  TESTO
1fc50 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f  NLY( p->mxSavepo
1fc60 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  int = iSavepoint
1fc70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   );.  sqlite3Fts
1fc80 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65  3PendingTermsCle
1fc90 61 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ar(p);.  return 
1fca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1fcb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1fcc0 69 66 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20  if zName is the 
1fcd0 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 20 6f 6e 65  extension on one
1fce0 20 6f 66 20 74 68 65 20 73 68 61 64 6f 77 20 74   of the shadow t
1fcf0 61 62 6c 65 73 20 75 73 65 64 0a 2a 2a 20 62 79  ables used.** by
1fd00 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
1fd10 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1fd20 53 68 61 64 6f 77 4e 61 6d 65 28 63 6f 6e 73 74  ShadowName(const
1fd30 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
1fd40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
1fd50 61 72 20 2a 61 7a 4e 61 6d 65 5b 5d 20 3d 20 7b  ar *azName[] = {
1fd60 0a 20 20 20 20 22 63 6f 6e 74 65 6e 74 22 2c 20  .    "content", 
1fd70 22 64 6f 63 73 69 7a 65 22 2c 20 22 73 65 67 64  "docsize", "segd
1fd80 69 72 22 2c 20 22 73 65 67 6d 65 6e 74 73 22 2c  ir", "segments",
1fd90 20 22 73 74 61 74 22 2c 20 0a 20 20 7d 3b 0a 20   "stat", .  };. 
1fda0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
1fdb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1fdc0 7a 65 6f 66 28 61 7a 4e 61 6d 65 29 2f 73 69 7a  zeof(azName)/siz
1fdd0 65 6f 66 28 61 7a 4e 61 6d 65 5b 30 5d 29 3b 20  eof(azName[0]); 
1fde0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
1fdf0 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4e  lite3_stricmp(zN
1fe00 61 6d 65 2c 20 61 7a 4e 61 6d 65 5b 69 5d 29 3d  ame, azName[i])=
1fe10 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1fe20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1fe30 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  ..static const s
1fe40 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 66 74  qlite3_module ft
1fe50 73 33 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 2f  s3Module = {.  /
1fe60 2a 20 69 56 65 72 73 69 6f 6e 20 20 20 20 20 20  * iVersion      
1fe70 2a 2f 20 33 2c 0a 20 20 2f 2a 20 78 43 72 65 61  */ 3,.  /* xCrea
1fe80 74 65 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33  te       */ fts3
1fe90 43 72 65 61 74 65 4d 65 74 68 6f 64 2c 0a 20 20  CreateMethod,.  
1fea0 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20 20 20 20  /* xConnect     
1feb0 20 2a 2f 20 66 74 73 33 43 6f 6e 6e 65 63 74 4d   */ fts3ConnectM
1fec0 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 42 65 73  ethod,.  /* xBes
1fed0 74 49 6e 64 65 78 20 20 20 20 2a 2f 20 66 74 73  tIndex    */ fts
1fee0 33 42 65 73 74 49 6e 64 65 78 4d 65 74 68 6f 64  3BestIndexMethod
1fef0 2c 0a 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65  ,.  /* xDisconne
1ff00 63 74 20 20 20 2a 2f 20 66 74 73 33 44 69 73 63  ct   */ fts3Disc
1ff10 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 0a 20 20  onnectMethod,.  
1ff20 2f 2a 20 78 44 65 73 74 72 6f 79 20 20 20 20 20  /* xDestroy     
1ff30 20 2a 2f 20 66 74 73 33 44 65 73 74 72 6f 79 4d   */ fts3DestroyM
1ff40 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 4f 70 65  ethod,.  /* xOpe
1ff50 6e 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73  n         */ fts
1ff60 33 4f 70 65 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f  3OpenMethod,.  /
1ff70 2a 20 78 43 6c 6f 73 65 20 20 20 20 20 20 20 20  * xClose        
1ff80 2a 2f 20 66 74 73 33 43 6c 6f 73 65 4d 65 74 68  */ fts3CloseMeth
1ff90 6f 64 2c 0a 20 20 2f 2a 20 78 46 69 6c 74 65 72  od,.  /* xFilter
1ffa0 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 46 69         */ fts3Fi
1ffb0 6c 74 65 72 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a  lterMethod,.  /*
1ffc0 20 78 4e 65 78 74 20 20 20 20 20 20 20 20 20 2a   xNext         *
1ffd0 2f 20 66 74 73 33 4e 65 78 74 4d 65 74 68 6f 64  / fts3NextMethod
1ffe0 2c 0a 20 20 2f 2a 20 78 45 6f 66 20 20 20 20 20  ,.  /* xEof     
1fff0 20 20 20 20 20 2a 2f 20 66 74 73 33 45 6f 66 4d       */ fts3EofM
20000 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 43 6f 6c  ethod,.  /* xCol
20010 75 6d 6e 20 20 20 20 20 20 20 2a 2f 20 66 74 73  umn       */ fts
20020 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 2c 0a 20  3ColumnMethod,. 
20030 20 2f 2a 20 78 52 6f 77 69 64 20 20 20 20 20 20   /* xRowid      
20040 20 20 2a 2f 20 66 74 73 33 52 6f 77 69 64 4d 65    */ fts3RowidMe
20050 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 55 70 64 61  thod,.  /* xUpda
20060 74 65 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33  te       */ fts3
20070 55 70 64 61 74 65 4d 65 74 68 6f 64 2c 0a 20 20  UpdateMethod,.  
20080 2f 2a 20 78 42 65 67 69 6e 20 20 20 20 20 20 20  /* xBegin       
20090 20 2a 2f 20 66 74 73 33 42 65 67 69 6e 4d 65 74   */ fts3BeginMet
200a0 68 6f 64 2c 0a 20 20 2f 2a 20 78 53 79 6e 63 20  hod,.  /* xSync 
200b0 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 53          */ fts3S
200c0 79 6e 63 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  yncMethod,.  /* 
200d0 78 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 2a 2f  xCommit       */
200e0 20 66 74 73 33 43 6f 6d 6d 69 74 4d 65 74 68 6f   fts3CommitMetho
200f0 64 2c 0a 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63  d,.  /* xRollbac
20100 6b 20 20 20 20 20 2a 2f 20 66 74 73 33 52 6f 6c  k     */ fts3Rol
20110 6c 62 61 63 6b 4d 65 74 68 6f 64 2c 0a 20 20 2f  lbackMethod,.  /
20120 2a 20 78 46 69 6e 64 46 75 6e 63 74 69 6f 6e 20  * xFindFunction 
20130 2a 2f 20 66 74 73 33 46 69 6e 64 46 75 6e 63 74  */ fts3FindFunct
20140 69 6f 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  ionMethod,.  /* 
20150 78 52 65 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20  xRename */      
20160 20 66 74 73 33 52 65 6e 61 6d 65 4d 65 74 68 6f   fts3RenameMetho
20170 64 2c 0a 20 20 2f 2a 20 78 53 61 76 65 70 6f 69  d,.  /* xSavepoi
20180 6e 74 20 20 20 20 2a 2f 20 66 74 73 33 53 61 76  nt    */ fts3Sav
20190 65 70 6f 69 6e 74 4d 65 74 68 6f 64 2c 0a 20 20  epointMethod,.  
201a0 2f 2a 20 78 52 65 6c 65 61 73 65 20 20 20 20 20  /* xRelease     
201b0 20 2a 2f 20 66 74 73 33 52 65 6c 65 61 73 65 4d   */ fts3ReleaseM
201c0 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 6c  ethod,.  /* xRol
201d0 6c 62 61 63 6b 54 6f 20 20 20 2a 2f 20 66 74 73  lbackTo   */ fts
201e0 33 52 6f 6c 6c 62 61 63 6b 54 6f 4d 65 74 68 6f  3RollbackToMetho
201f0 64 2c 0a 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e  d,.  /* xShadowN
20200 61 6d 65 20 20 20 2a 2f 20 66 74 73 33 53 68 61  ame   */ fts3Sha
20210 64 6f 77 4e 61 6d 65 2c 0a 7d 3b 0a 0a 2f 2a 0a  dowName,.};../*.
20220 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20230 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
20240 73 20 74 68 65 20 6d 6f 64 75 6c 65 20 64 65 73  s the module des
20250 74 72 75 63 74 6f 72 20 28 63 61 6c 6c 65 64 20  tructor (called 
20260 77 68 65 6e 20 61 6e 0a 2a 2a 20 46 54 53 33 20  when an.** FTS3 
20270 65 6e 61 62 6c 65 64 20 64 61 74 61 62 61 73 65  enabled database
20280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
20290 6c 6f 73 65 64 29 2e 20 49 74 20 66 72 65 65 73  losed). It frees
202a0 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61   the memory.** a
202b0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
202c0 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20   tokenizer hash 
202d0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
202e0 20 76 6f 69 64 20 68 61 73 68 44 65 73 74 72 6f   void hashDestro
202f0 79 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 46 74  y(void *p){.  Ft
20300 73 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s3Hash *pHash = 
20310 28 46 74 73 33 48 61 73 68 20 2a 29 70 3b 0a 20  (Fts3Hash *)p;. 
20320 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68   sqlite3Fts3Hash
20330 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
20340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 61  sqlite3_free(pHa
20350 73 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sh);.}../*.** Th
20360 65 20 66 74 73 33 20 62 75 69 6c 74 2d 69 6e 20  e fts3 built-in 
20370 74 6f 6b 65 6e 69 7a 65 72 73 20 2d 20 22 73 69  tokenizers - "si
20380 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20  mple", "porter" 
20390 61 6e 64 20 22 69 63 75 22 2d 20 61 72 65 20 0a  and "icu"- are .
203a0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  ** implemented i
203b0 6e 20 66 69 6c 65 73 20 66 74 73 33 5f 74 6f 6b  n files fts3_tok
203c0 65 6e 69 7a 65 72 31 2e 63 2c 20 66 74 73 33 5f  enizer1.c, fts3_
203d0 70 6f 72 74 65 72 2e 63 20 61 6e 64 20 66 74 73  porter.c and fts
203e0 33 5f 69 63 75 2e 63 0a 2a 2a 20 72 65 73 70 65  3_icu.c.** respe
203f0 63 74 69 76 65 6c 79 2e 20 54 68 65 20 66 6f 6c  ctively. The fol
20400 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 6f 72  lowing three for
20410 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
20420 73 20 61 72 65 20 66 6f 72 20 66 75 6e 63 74 69  s are for functi
20430 6f 6e 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20  ons.** declared 
20440 69 6e 20 74 68 65 73 65 20 66 69 6c 65 73 20 75  in these files u
20450 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
20460 74 68 65 20 72 65 73 70 65 63 74 69 76 65 20 69  the respective i
20470 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
20480 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 73 71  **.** Calling sq
20490 6c 69 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54  lite3Fts3SimpleT
204a0 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 29  okenizerModule()
204b0 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
204c0 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
204d0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
204e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 22 73   point to the "s
204f0 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72  imple" tokenizer
20500 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
20510 0a 2a 2a 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a  .** And so on..*
20520 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
20530 73 33 53 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65  s3SimpleTokenize
20540 72 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f  rModule(sqlite3_
20550 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
20560 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65   const**ppModule
20570 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
20580 74 73 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  ts3PorterTokeniz
20590 65 72 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33  erModule(sqlite3
205a0 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
205b0 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c  e const**ppModul
205c0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
205d0 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 33 5f  TE_DISABLE_FTS3_
205e0 55 4e 49 43 4f 44 45 0a 76 6f 69 64 20 73 71 6c  UNICODE.void sql
205f0 69 74 65 33 46 74 73 33 55 6e 69 63 6f 64 65 54  ite3Fts3UnicodeT
20600 6f 6b 65 6e 69 7a 65 72 28 73 71 6c 69 74 65 33  okenizer(sqlite3
20610 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
20620 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c  e const**ppModul
20630 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  e);.#endif.#ifde
20640 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20650 49 43 55 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ICU.void sqlite3
20660 46 74 73 33 49 63 75 54 6f 6b 65 6e 69 7a 65 72  Fts3IcuTokenizer
20670 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74  Module(sqlite3_t
20680 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
20690 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29  const**ppModule)
206a0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
206b0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
206c0 74 73 33 20 65 78 74 65 6e 73 69 6f 6e 2e 20 49  ts3 extension. I
206d0 66 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  f this extension
206e0 20 69 73 20 62 75 69 6c 74 20 61 73 20 70 61 72   is built as par
206f0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69  t.** of the sqli
20700 74 65 20 6c 69 62 72 61 72 79 2c 20 74 68 65 6e  te library, then
20710 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20720 73 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c  s called directl
20730 79 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  y by.** SQLite. 
20740 49 66 20 66 74 73 33 20 69 73 20 62 75 69 6c 74  If fts3 is built
20750 20 61 73 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   as a dynamicall
20760 79 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  y loadable exten
20770 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75  sion, this.** fu
20780 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20790 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
207a0 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 29  extension_init()
207b0 20 65 6e 74 72 79 20 70 6f 69 6e 74 2e 0a 2a 2f   entry point..*/
207c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
207d0 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
207e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
207f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 33 48  LITE_OK;.  Fts3H
20800 61 73 68 20 2a 70 48 61 73 68 20 3d 20 30 3b 0a  ash *pHash = 0;.
20810 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
20820 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
20830 20 2a 70 53 69 6d 70 6c 65 20 3d 20 30 3b 0a 20   *pSimple = 0;. 
20840 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
20850 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
20860 2a 70 50 6f 72 74 65 72 20 3d 20 30 3b 0a 23 69  *pPorter = 0;.#i
20870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
20880 41 42 4c 45 5f 46 54 53 33 5f 55 4e 49 43 4f 44  ABLE_FTS3_UNICOD
20890 45 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  E.  const sqlite
208a0 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
208b0 6c 65 20 2a 70 55 6e 69 63 6f 64 65 20 3d 20 30  le *pUnicode = 0
208c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
208d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
208e0 43 55 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  CU.  const sqlit
208f0 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
20900 75 6c 65 20 2a 70 49 63 75 20 3d 20 30 3b 0a 20  ule *pIcu = 0;. 
20910 20 73 71 6c 69 74 65 33 46 74 73 33 49 63 75 54   sqlite3Fts3IcuT
20920 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 26  okenizerModule(&
20930 70 49 63 75 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  pIcu);.#endif..#
20940 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
20950 53 41 42 4c 45 5f 46 54 53 33 5f 55 4e 49 43 4f  SABLE_FTS3_UNICO
20960 44 45 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  DE.  sqlite3Fts3
20970 55 6e 69 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 72  UnicodeTokenizer
20980 28 26 70 55 6e 69 63 6f 64 65 29 3b 0a 23 65 6e  (&pUnicode);.#en
20990 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
209a0 54 45 5f 54 45 53 54 0a 20 20 72 63 20 3d 20 73  TE_TEST.  rc = s
209b0 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 54 65  qlite3Fts3InitTe
209c0 72 6d 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  rm(db);.  if( rc
209d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
209e0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
209f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
20a00 74 73 33 49 6e 69 74 41 75 78 28 64 62 29 3b 0a  ts3InitAux(db);.
20a10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20a20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20a30 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ..  sqlite3Fts3S
20a40 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f  impleTokenizerMo
20a50 64 75 6c 65 28 26 70 53 69 6d 70 6c 65 29 3b 0a  dule(&pSimple);.
20a60 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 6f 72    sqlite3Fts3Por
20a70 74 65 72 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  terTokenizerModu
20a80 6c 65 28 26 70 50 6f 72 74 65 72 29 3b 0a 0a 20  le(&pPorter);.. 
20a90 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
20aa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
20ab0 68 61 73 68 2d 74 61 62 6c 65 20 75 73 65 64 20  hash-table used 
20ac0 74 6f 20 73 74 6f 72 65 20 74 6f 6b 65 6e 69 7a  to store tokeniz
20ad0 65 72 73 2e 20 2a 2f 0a 20 20 70 48 61 73 68 20  ers. */.  pHash 
20ae0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
20af0 28 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68  (sizeof(Fts3Hash
20b00 29 29 3b 0a 20 20 69 66 28 20 21 70 48 61 73 68  ));.  if( !pHash
20b10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
20b20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
20b30 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  se{.    sqlite3F
20b40 74 73 33 48 61 73 68 49 6e 69 74 28 70 48 61 73  ts3HashInit(pHas
20b50 68 2c 20 46 54 53 33 5f 48 41 53 48 5f 53 54 52  h, FTS3_HASH_STR
20b60 49 4e 47 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  ING, 1);.  }..  
20b70 2f 2a 20 4c 6f 61 64 20 74 68 65 20 62 75 69 6c  /* Load the buil
20b80 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 73 20  t-in tokenizers 
20b90 69 6e 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  into the hash ta
20ba0 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ble */.  if( rc=
20bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20bc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
20bd0 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
20be0 68 2c 20 22 73 69 6d 70 6c 65 22 2c 20 37 2c 20  h, "simple", 7, 
20bf0 28 76 6f 69 64 20 2a 29 70 53 69 6d 70 6c 65 29  (void *)pSimple)
20c00 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
20c10 46 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70  Fts3HashInsert(p
20c20 48 61 73 68 2c 20 22 70 6f 72 74 65 72 22 2c 20  Hash, "porter", 
20c30 37 2c 20 28 76 6f 69 64 20 2a 29 70 50 6f 72 74  7, (void *)pPort
20c40 65 72 29 20 0a 0a 23 69 66 6e 64 65 66 20 53 51  er) ..#ifndef SQ
20c50 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53  LITE_DISABLE_FTS
20c60 33 5f 55 4e 49 43 4f 44 45 0a 20 20 20 20 20 7c  3_UNICODE.     |
20c70 7c 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73  | sqlite3Fts3Has
20c80 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 22  hInsert(pHash, "
20c90 75 6e 69 63 6f 64 65 36 31 22 2c 20 31 30 2c 20  unicode61", 10, 
20ca0 28 76 6f 69 64 20 2a 29 70 55 6e 69 63 6f 64 65  (void *)pUnicode
20cb0 29 20 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ) .#endif.#ifdef
20cc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
20cd0 43 55 0a 20 20 20 20 20 7c 7c 20 28 70 49 63 75  CU.     || (pIcu
20ce0 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 33 48   && sqlite3Fts3H
20cf0 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
20d00 20 22 69 63 75 22 2c 20 34 2c 20 28 76 6f 69 64   "icu", 4, (void
20d10 20 2a 29 70 49 63 75 29 29 0a 23 65 6e 64 69 66   *)pIcu)).#endif
20d20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
20d30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
20d40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
20d50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
20d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20d70 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
20d80 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 49 6e  qlite3Fts3ExprIn
20d90 69 74 54 65 73 74 49 6e 74 65 72 66 61 63 65 28  itTestInterface(
20da0 64 62 2c 20 70 48 61 73 68 29 3b 0a 20 20 7d 0a  db, pHash);.  }.
20db0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 72 65  #endif..  /* Cre
20dc0 61 74 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ate the virtual 
20dd0 74 61 62 6c 65 20 77 72 61 70 70 65 72 20 61 72  table wrapper ar
20de0 6f 75 6e 64 20 74 68 65 20 68 61 73 68 2d 74 61  ound the hash-ta
20df0 62 6c 65 20 61 6e 64 20 6f 76 65 72 6c 6f 61 64  ble and overload
20e00 20 0a 20 20 2a 2a 20 74 68 65 20 66 6f 75 72 20   .  ** the four 
20e10 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73  scalar functions
20e20 2e 20 49 66 20 74 68 69 73 20 69 73 20 73 75 63  . If this is suc
20e30 63 65 73 73 66 75 6c 2c 20 72 65 67 69 73 74 65  cessful, registe
20e40 72 20 74 68 65 0a 20 20 2a 2a 20 6d 6f 64 75 6c  r the.  ** modul
20e50 65 20 77 69 74 68 20 73 71 6c 69 74 65 2e 0a 20  e with sqlite.. 
20e60 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
20e70 5f 4f 4b 3d 3d 72 63 20 0a 20 20 20 26 26 20 53  _OK==rc .   && S
20e80 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
20e90 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 48  sqlite3Fts3InitH
20ea0 61 73 68 54 61 62 6c 65 28 64 62 2c 20 70 48 61  ashTable(db, pHa
20eb0 73 68 2c 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69  sh, "fts3_tokeni
20ec0 7a 65 72 22 29 29 0a 20 20 20 26 26 20 53 51 4c  zer")).   && SQL
20ed0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
20ee0 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
20ef0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 6e 69  unction(db, "sni
20f00 70 70 65 74 22 2c 20 2d 31 29 29 0a 20 20 20 26  ppet", -1)).   &
20f10 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
20f20 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c   = sqlite3_overl
20f30 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  oad_function(db,
20f40 20 22 6f 66 66 73 65 74 73 22 2c 20 31 29 29 0a   "offsets", 1)).
20f50 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
20f60 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f  =(rc = sqlite3_o
20f70 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
20f80 28 64 62 2c 20 22 6d 61 74 63 68 69 6e 66 6f 22  (db, "matchinfo"
20f90 2c 20 31 29 29 0a 20 20 20 26 26 20 53 51 4c 49  , 1)).   && SQLI
20fa0 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
20fb0 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
20fc0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 61 74 63  nction(db, "matc
20fd0 68 69 6e 66 6f 22 2c 20 32 29 29 0a 20 20 20 26  hinfo", 2)).   &
20fe0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
20ff0 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c   = sqlite3_overl
21000 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  oad_function(db,
21010 20 22 6f 70 74 69 6d 69 7a 65 22 2c 20 31 29 29   "optimize", 1))
21020 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
21030 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
21040 64 75 6c 65 5f 76 32 28 0a 20 20 20 20 20 20 20  dule_v2(.       
21050 20 64 62 2c 20 22 66 74 73 33 22 2c 20 26 66 74   db, "fts3", &ft
21060 73 33 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 20  s3Module, (void 
21070 2a 29 70 48 61 73 68 2c 20 68 61 73 68 44 65 73  *)pHash, hashDes
21080 74 72 6f 79 0a 20 20 20 20 29 3b 0a 20 20 20 20  troy.    );.    
21090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
210a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
210b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
210c0 6f 64 75 6c 65 5f 76 32 28 0a 20 20 20 20 20 20  odule_v2(.      
210d0 20 20 20 20 64 62 2c 20 22 66 74 73 34 22 2c 20      db, "fts4", 
210e0 26 66 74 73 33 4d 6f 64 75 6c 65 2c 20 28 76 6f  &fts3Module, (vo
210f0 69 64 20 2a 29 70 48 61 73 68 2c 20 30 0a 20 20  id *)pHash, 0.  
21100 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
21110 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
21130 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
21140 54 6f 6b 28 64 62 2c 20 28 76 6f 69 64 20 2a 29  Tok(db, (void *)
21150 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
21160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21170 0a 0a 0a 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72  ...  /* An error
21180 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 44   has occurred. D
21190 65 6c 65 74 65 20 74 68 65 20 68 61 73 68 20 74  elete the hash t
211a0 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
211b0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
211c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  */.  assert( rc!
211d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
211e0 69 66 28 20 70 48 61 73 68 20 29 7b 0a 20 20 20  if( pHash ){.   
211f0 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68   sqlite3Fts3Hash
21200 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
21210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21220 48 61 73 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Hash);.  }.  ret
21230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21240 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73   Allocate an Fts
21250 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
21260 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69  for each token i
21270 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
21280 20 68 65 61 64 65 64 0a 2a 2a 20 62 79 20 70 45   headed.** by pE
21290 78 70 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 46  xpr. .**.** An F
212a0 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a  ts3SegReader obj
212b0 65 63 74 20 69 73 20 61 20 63 75 72 73 6f 72 20  ect is a cursor 
212c0 74 68 61 74 20 63 61 6e 20 73 65 65 6b 20 6f 72  that can seek or
212d0 20 73 63 61 6e 20 61 20 72 61 6e 67 65 20 6f 66   scan a range of
212e0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 77 69 74 68  .** entries with
212f0 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  in a single segm
21300 65 6e 74 20 62 2d 74 72 65 65 2e 20 41 6e 20 46  ent b-tree. An F
21310 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
21320 72 20 75 73 65 73 20 6d 75 6c 74 69 70 6c 65 0a  r uses multiple.
21330 2a 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72  ** Fts3SegReader
21340 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
21350 6c 6c 79 20 74 6f 20 70 72 6f 76 69 64 65 20 61  lly to provide a
21360 6e 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 73  n interface to s
21370 65 65 6b 20 6f 72 20 73 63 61 6e 0a 2a 2a 20 77  eek or scan.** w
21380 69 74 68 69 6e 20 74 68 65 20 75 6e 69 6f 6e 20  ithin the union 
21390 6f 66 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  of all segments 
213a0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 48 65 6e  of a b-tree. Hen
213b0 63 65 20 74 68 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  ce the name..**.
213c0 2a 2a 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** If the alloca
213d0 74 65 64 20 46 74 73 33 4d 75 6c 74 69 53 65 67  ted Fts3MultiSeg
213e0 52 65 61 64 65 72 20 6a 75 73 74 20 73 65 65 6b  Reader just seek
213f0 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e  s to a single en
21400 74 72 79 20 69 6e 20 61 0a 2a 2a 20 73 65 67 6d  try in a.** segm
21410 65 6e 74 20 62 2d 74 72 65 65 20 28 69 66 20 74  ent b-tree (if t
21420 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61  he term is not a
21430 20 70 72 65 66 69 78 20 6f 72 20 69 74 20 69 73   prefix or it is
21440 20 61 20 70 72 65 66 69 78 20 66 6f 72 20 77 68   a prefix for wh
21450 69 63 68 0a 2a 2a 20 74 68 65 72 65 20 65 78 69  ich.** there exi
21460 73 74 73 20 70 72 65 66 69 78 20 62 2d 74 72 65  sts prefix b-tre
21470 65 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 6c  e of the right l
21480 65 6e 67 74 68 29 20 74 68 65 6e 20 69 74 20 6d  ength) then it m
21490 61 79 20 62 65 20 74 72 61 76 65 72 73 65 64 0a  ay be traversed.
214a0 2a 2a 20 61 6e 64 20 6d 65 72 67 65 64 20 69 6e  ** and merged in
214b0 63 72 65 6d 65 6e 74 61 6c 6c 79 2e 20 4f 74 68  crementally. Oth
214c0 65 72 77 69 73 65 2c 20 69 74 20 68 61 73 20 74  erwise, it has t
214d0 6f 20 62 65 20 6d 65 72 67 65 64 20 69 6e 74 6f  o be merged into
214e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 0a 2a   an in-memory .*
214f0 2a 20 64 6f 63 6c 69 73 74 20 61 6e 64 20 74 68  * doclist and th
21500 65 6e 20 74 72 61 76 65 72 73 65 64 2e 0a 2a 2f  en traversed..*/
21510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
21520 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65 52 65 61  3EvalAllocateRea
21530 64 65 72 73 28 0a 20 20 46 74 73 33 43 75 72 73  ders(.  Fts3Curs
21540 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
21550 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 63          /* FTS c
21560 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a  ursor handle */.
21570 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
21580 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
21590 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
215a0 61 64 65 72 73 20 66 6f 72 20 74 68 69 73 20 65  aders for this e
215b0 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
215c0 6e 74 20 2a 70 6e 54 6f 6b 65 6e 2c 20 20 20 20  nt *pnToken,    
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
215e0 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d  * OUT: Total num
215f0 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e  ber of tokens in
21600 20 70 68 72 61 73 65 2e 20 2a 2f 0a 20 20 69 6e   phrase. */.  in
21610 74 20 2a 70 6e 4f 72 2c 20 20 20 20 20 20 20 20  t *pnOr,        
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21630 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
21640 65 72 20 6f 66 20 4f 52 20 6e 6f 64 65 73 20 69  er of OR nodes i
21650 6e 20 65 78 70 72 2e 20 2a 2f 0a 20 20 69 6e 74  n expr. */.  int
21660 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21680 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
21690 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  de */.){.  if( p
216a0 45 78 70 72 20 26 26 20 53 51 4c 49 54 45 5f 4f  Expr && SQLITE_O
216b0 4b 3d 3d 2a 70 52 63 20 29 7b 0a 20 20 20 20 69  K==*pRc ){.    i
216c0 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  f( pExpr->eType=
216d0 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
216e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
216f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
21700 6e 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61  n = pExpr->pPhra
21710 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  se->nToken;.    
21720 20 20 2a 70 6e 54 6f 6b 65 6e 20 2b 3d 20 6e 54    *pnToken += nT
21730 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  oken;.      for(
21740 69 3d 30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b 20 69  i=0; i<nToken; i
21750 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
21760 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
21770 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 70  oken = &pExpr->p
21780 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
21790 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ];.        int r
217a0 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65 67 52  c = fts3TermSegR
217b0 65 61 64 65 72 43 75 72 73 6f 72 28 70 43 73 72  eaderCursor(pCsr
217c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
217d0 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
217e0 2d 3e 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 69 73 50  ->n, pToken->isP
217f0 72 65 66 69 78 2c 20 26 70 54 6f 6b 65 6e 2d 3e  refix, &pToken->
21800 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
21810 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21820 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21830 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d            *pRc =
21840 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 72   rc;.          r
21850 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
21860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
21870 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 50  ssert( pExpr->pP
21880 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54  hrase->iDoclistT
21890 6f 6b 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  oken==0 );.     
218a0 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d   pExpr->pPhrase-
218b0 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20 3d  >iDoclistToken =
218c0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
218d0 20 20 20 20 20 20 2a 70 6e 4f 72 20 2b 3d 20 28        *pnOr += (
218e0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
218f0 53 51 55 45 52 59 5f 4f 52 29 3b 0a 20 20 20 20  SQUERY_OR);.    
21900 20 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61    fts3EvalAlloca
21910 74 65 52 65 61 64 65 72 73 28 70 43 73 72 2c 20  teReaders(pCsr, 
21920 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 6e  pExpr->pLeft, pn
21930 54 6f 6b 65 6e 2c 20 70 6e 4f 72 2c 20 70 52 63  Token, pnOr, pRc
21940 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  );.      fts3Eva
21950 6c 41 6c 6c 6f 63 61 74 65 52 65 61 64 65 72 73  lAllocateReaders
21960 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52  (pCsr, pExpr->pR
21970 69 67 68 74 2c 20 70 6e 54 6f 6b 65 6e 2c 20 70  ight, pnToken, p
21980 6e 4f 72 2c 20 70 52 63 29 3b 0a 20 20 20 20 7d  nOr, pRc);.    }
21990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
219a0 67 75 6d 65 6e 74 73 20 70 4c 69 73 74 2f 6e 4c  guments pList/nL
219b0 69 73 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ist contain the 
219c0 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 6f 6b 65  doclist for toke
219d0 6e 20 69 54 6f 6b 65 6e 20 6f 66 20 70 68 72 61  n iToken of phra
219e0 73 65 20 70 2e 0a 2a 2a 20 49 74 20 69 73 20 6d  se p..** It is m
219f0 65 72 67 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  erged into the m
21a00 61 69 6e 20 64 6f 63 6c 69 73 74 20 73 74 6f 72  ain doclist stor
21a10 65 64 20 69 6e 20 70 2d 3e 64 6f 63 6c 69 73 74  ed in p->doclist
21a20 2e 61 41 6c 6c 2f 6e 41 6c 6c 2e 0a 2a 2a 0a 2a  .aAll/nAll..**.*
21a30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21a40 61 73 73 75 6d 65 73 20 74 68 61 74 20 70 4c 69  assumes that pLi
21a50 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  st points to a b
21a60 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
21a70 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
21a80 5f 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 20  _malloc(). This 
21a90 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 72  function takes r
21aa0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f  esponsibility fo
21ab0 72 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  r eventually.** 
21ac0 66 72 65 65 69 6e 67 20 74 68 65 20 62 75 66 66  freeing the buff
21ad0 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
21ae0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
21af0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
21b00 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
21b10 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
21b20 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
21b30 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65 4d   fts3EvalPhraseM
21b40 65 72 67 65 54 6f 6b 65 6e 28 0a 20 20 46 74 73  ergeToken(.  Fts
21b50 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20  3Table *pTab,   
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b70 46 54 53 20 54 61 62 6c 65 20 70 6f 69 6e 74 65  FTS Table pointe
21b80 72 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73  r */.  Fts3Phras
21b90 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
21ba0 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65         /* Phrase
21bb0 20 74 6f 20 6d 65 72 67 65 20 70 4c 69 73 74 2f   to merge pList/
21bc0 6e 4c 69 73 74 20 69 6e 74 6f 20 2a 2f 0a 20 20  nList into */.  
21bd0 69 6e 74 20 69 54 6f 6b 65 6e 2c 20 20 20 20 20  int iToken,     
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bf0 2f 2a 20 54 6f 6b 65 6e 20 70 4c 69 73 74 2f 6e  /* Token pList/n
21c00 4c 69 73 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  List corresponds
21c10 20 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70   to */.  char *p
21c20 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
21c30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
21c40 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 2a  ter to doclist *
21c50 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 20 20  /.  int nList   
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21c80 20 62 79 74 65 73 20 69 6e 20 70 4c 69 73 74 20   bytes in pList 
21c90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
21ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
21cb0 73 65 72 74 28 20 69 54 6f 6b 65 6e 21 3d 70 2d  sert( iToken!=p-
21cc0 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20 29  >iDoclistToken )
21cd0 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
21ce0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
21cf0 5f 66 72 65 65 28 70 2d 3e 64 6f 63 6c 69 73 74  _free(p->doclist
21d00 2e 61 41 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 64  .aAll);.    p->d
21d10 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 3d 20 30 3b  oclist.aAll = 0;
21d20 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e  .    p->doclist.
21d30 6e 41 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  nAll = 0;.  }.. 
21d40 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 69 44 6f   else if( p->iDo
21d50 63 6c 69 73 74 54 6f 6b 65 6e 3c 30 20 29 7b 0a  clistToken<0 ){.
21d60 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61      p->doclist.a
21d70 41 6c 6c 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  All = pList;.   
21d80 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c   p->doclist.nAll
21d90 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 7d 0a 0a 20   = nList;.  }.. 
21da0 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 64 6f 63   else if( p->doc
21db0 6c 69 73 74 2e 61 41 6c 6c 3d 3d 30 20 29 7b 0a  list.aAll==0 ){.
21dc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21dd0 28 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  (pList);.  }..  
21de0 65 6c 73 65 20 7b 0a 20 20 20 20 63 68 61 72 20  else {.    char 
21df0 2a 70 4c 65 66 74 3b 0a 20 20 20 20 63 68 61 72  *pLeft;.    char
21e00 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 69 6e   *pRight;.    in
21e10 74 20 6e 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74  t nLeft;.    int
21e20 20 6e 52 69 67 68 74 3b 0a 20 20 20 20 69 6e 74   nRight;.    int
21e30 20 6e 44 69 66 66 3b 0a 0a 20 20 20 20 69 66 28   nDiff;..    if(
21e40 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65   p->iDoclistToke
21e50 6e 3c 69 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  n<iToken ){.    
21e60 20 20 70 4c 65 66 74 20 3d 20 70 2d 3e 64 6f 63    pLeft = p->doc
21e70 6c 69 73 74 2e 61 41 6c 6c 3b 0a 20 20 20 20 20  list.aAll;.     
21e80 20 6e 4c 65 66 74 20 3d 20 70 2d 3e 64 6f 63 6c   nLeft = p->docl
21e90 69 73 74 2e 6e 41 6c 6c 3b 0a 20 20 20 20 20 20  ist.nAll;.      
21ea0 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 3b 0a  pRight = pList;.
21eb0 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 6e        nRight = n
21ec0 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 44 69 66  List;.      nDif
21ed0 66 20 3d 20 69 54 6f 6b 65 6e 20 2d 20 70 2d 3e  f = iToken - p->
21ee0 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3b 0a 20  iDoclistToken;. 
21ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21f00 70 52 69 67 68 74 20 3d 20 70 2d 3e 64 6f 63 6c  pRight = p->docl
21f10 69 73 74 2e 61 41 6c 6c 3b 0a 20 20 20 20 20 20  ist.aAll;.      
21f20 6e 52 69 67 68 74 20 3d 20 70 2d 3e 64 6f 63 6c  nRight = p->docl
21f30 69 73 74 2e 6e 41 6c 6c 3b 0a 20 20 20 20 20 20  ist.nAll;.      
21f40 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pLeft = pList;. 
21f50 20 20 20 20 20 6e 4c 65 66 74 20 3d 20 6e 4c 69       nLeft = nLi
21f60 73 74 3b 0a 20 20 20 20 20 20 6e 44 69 66 66 20  st;.      nDiff 
21f70 3d 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  = p->iDoclistTok
21f80 65 6e 20 2d 20 69 54 6f 6b 65 6e 3b 0a 20 20 20  en - iToken;.   
21f90 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 66 74 73   }..    rc = fts
21fa0 33 44 6f 63 6c 69 73 74 50 68 72 61 73 65 4d 65  3DoclistPhraseMe
21fb0 72 67 65 28 0a 20 20 20 20 20 20 20 20 70 54 61  rge(.        pTa
21fc0 62 2d 3e 62 44 65 73 63 49 64 78 2c 20 6e 44 69  b->bDescIdx, nDi
21fd0 66 66 2c 20 70 4c 65 66 74 2c 20 6e 4c 65 66 74  ff, pLeft, nLeft
21fe0 2c 20 26 70 52 69 67 68 74 2c 20 26 6e 52 69 67  , &pRight, &nRig
21ff0 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ht.    );.    sq
22000 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 65 66 74  lite3_free(pLeft
22010 29 3b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73  );.    p->doclis
22020 74 2e 61 41 6c 6c 20 3d 20 70 52 69 67 68 74 3b  t.aAll = pRight;
22030 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e  .    p->doclist.
22040 6e 41 6c 6c 20 3d 20 6e 52 69 67 68 74 3b 0a 20  nAll = nRight;. 
22050 20 7d 0a 0a 20 20 69 66 28 20 69 54 6f 6b 65 6e   }..  if( iToken
22060 3e 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65  >p->iDoclistToke
22070 6e 20 29 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54  n ) p->iDoclistT
22080 6f 6b 65 6e 20 3d 20 69 54 6f 6b 65 6e 3b 0a 20  oken = iToken;. 
22090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
220a0 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64 6f  *.** Load the do
220b0 63 6c 69 73 74 20 66 6f 72 20 70 68 72 61 73 65  clist for phrase
220c0 20 70 20 69 6e 74 6f 20 70 2d 3e 64 6f 63 6c 69   p into p->docli
220d0 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 2e 20 54 68  st.aAll/nAll. Th
220e0 65 20 6c 6f 61 64 65 64 20 64 6f 63 6c 69 73 74  e loaded doclist
220f0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b  .** does not tak
22100 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  e deferred token
22110 73 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a  s into account..
22120 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
22130 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
22140 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
22150 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  otherwise an SQL
22160 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
22170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
22180 73 33 45 76 61 6c 50 68 72 61 73 65 4c 6f 61 64  s3EvalPhraseLoad
22190 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  (.  Fts3Cursor *
221a0 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
221b0 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f      /* FTS Curso
221c0 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  r handle */.  Ft
221d0 73 33 50 68 72 61 73 65 20 2a 70 20 20 20 20 20  s3Phrase *p     
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
221f0 20 50 68 72 61 73 65 20 6f 62 6a 65 63 74 20 2a   Phrase object *
22200 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  /.){.  Fts3Table
22210 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61   *pTab = (Fts3Ta
22220 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
22230 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 54  .pVtab;.  int iT
22240 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d  oken;.  int rc =
22250 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66   SQLITE_OK;..  f
22260 6f 72 28 69 54 6f 6b 65 6e 3d 30 3b 20 72 63 3d  or(iToken=0; rc=
22270 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 54  =SQLITE_OK && iT
22280 6f 6b 65 6e 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b 20  oken<p->nToken; 
22290 69 54 6f 6b 65 6e 2b 2b 29 7b 0a 20 20 20 20 46  iToken++){.    F
222a0 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
222b0 70 54 6f 6b 65 6e 20 3d 20 26 70 2d 3e 61 54 6f  pToken = &p->aTo
222c0 6b 65 6e 5b 69 54 6f 6b 65 6e 5d 3b 0a 20 20 20  ken[iToken];.   
222d0 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
222e0 3e 70 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  >pDeferred==0 ||
222f0 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72   pToken->pSegcsr
22300 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
22310 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 20  pToken->pSegcsr 
22320 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 68  ){.      int nTh
22330 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  is = 0;.      ch
22340 61 72 20 2a 70 54 68 69 73 20 3d 20 30 3b 0a 20  ar *pThis = 0;. 
22350 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54 65       rc = fts3Te
22360 72 6d 53 65 6c 65 63 74 28 70 54 61 62 2c 20 70  rmSelect(pTab, p
22370 54 6f 6b 65 6e 2c 20 70 2d 3e 69 43 6f 6c 75 6d  Token, p->iColum
22380 6e 2c 20 26 6e 54 68 69 73 2c 20 26 70 54 68 69  n, &nThis, &pThi
22390 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
223a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
223b0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
223c0 45 76 61 6c 50 68 72 61 73 65 4d 65 72 67 65 54  EvalPhraseMergeT
223d0 6f 6b 65 6e 28 70 54 61 62 2c 20 70 2c 20 69 54  oken(pTab, p, iT
223e0 6f 6b 65 6e 2c 20 70 54 68 69 73 2c 20 6e 54 68  oken, pThis, nTh
223f0 69 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  is);.      }.   
22400 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
22410 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 3d 3d  Token->pSegcsr==
22420 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  0 );.  }..  retu
22430 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
22440 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
22450 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44 0a 2f  _FTS4_DEFERRED./
22460 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22470 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  on is called on 
22480 65 61 63 68 20 70 68 72 61 73 65 20 61 66 74 65  each phrase afte
22490 72 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  r the position l
224a0 69 73 74 73 20 66 6f 72 0a 2a 2a 20 61 6e 79 20  ists for.** any 
224b0 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
224c0 68 61 76 65 20 62 65 65 6e 20 6c 6f 61 64 65 64  have been loaded
224d0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 74   into memory. It
224e0 20 75 70 64 61 74 65 73 20 74 68 65 20 70 68 72   updates the phr
224f0 61 73 65 73 0a 2a 2a 20 63 75 72 72 65 6e 74 20  ases.** current 
22500 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 6f  position list to
22510 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 74 68   include only th
22520 6f 73 65 20 70 6f 73 69 74 69 6f 6e 73 20 74 68  ose positions th
22530 61 74 20 61 72 65 20 72 65 61 6c 6c 79 0a 2a 2a  at are really.**
22540 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
22550 65 20 70 68 72 61 73 65 20 28 61 66 74 65 72 20  e phrase (after 
22560 63 6f 6e 73 69 64 65 72 69 6e 67 20 64 65 66 65  considering defe
22570 72 72 65 64 20 74 6f 6b 65 6e 73 29 2e 20 49 66  rred tokens). If
22580 20 74 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   this.** means t
22590 68 61 74 20 74 68 65 20 70 68 72 61 73 65 20 64  hat the phrase d
225a0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
225b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
225c0 77 2c 20 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  w, doclist.pList
225d0 0a 2a 2a 20 61 6e 64 20 64 6f 63 6c 69 73 74 2e  .** and doclist.
225e0 6e 4c 69 73 74 20 61 72 65 20 62 6f 74 68 20 7a  nList are both z
225f0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  eroed..**.** SQL
22600 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22610 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
22620 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65  ccurs, otherwise
22630 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
22640 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
22650 20 69 6e 74 20 66 74 73 33 45 76 61 6c 44 65 66   int fts3EvalDef
22660 65 72 72 65 64 50 68 72 61 73 65 28 46 74 73 33  erredPhrase(Fts3
22670 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 46 74  Cursor *pCsr, Ft
22680 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
22690 65 29 7b 0a 20 20 69 6e 74 20 69 54 6f 6b 65 6e  e){.  int iToken
226a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
226b0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
226c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
226d0 20 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 20 2a   phrase tokens *
226e0 2f 0a 20 20 63 68 61 72 20 2a 61 50 6f 73 6c 69  /.  char *aPosli
226f0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
22700 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
22710 6c 69 73 74 20 66 6f 72 20 64 65 66 65 72 72 65  list for deferre
22720 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 6e  d tokens */.  in
22730 74 20 6e 50 6f 73 6c 69 73 74 20 3d 20 30 3b 20  t nPoslist = 0; 
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22750 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22760 20 69 6e 20 61 50 6f 73 6c 69 73 74 20 2a 2f 0a   in aPoslist */.
22770 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 2d 31    int iPrev = -1
22780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22790 20 20 2f 2a 20 54 6f 6b 65 6e 20 6e 75 6d 62 65    /* Token numbe
227a0 72 20 6f 66 20 70 72 65 76 69 6f 75 73 20 64 65  r of previous de
227b0 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 2a 2f 0a  ferred token */.
227c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 68 72 61  .  assert( pPhra
227d0 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65  se->doclist.bFre
227e0 65 4c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 66  eList==0 );..  f
227f0 6f 72 28 69 54 6f 6b 65 6e 3d 30 3b 20 69 54 6f  or(iToken=0; iTo
22800 6b 65 6e 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f  ken<pPhrase->nTo
22810 6b 65 6e 3b 20 69 54 6f 6b 65 6e 2b 2b 29 7b 0a  ken; iToken++){.
22820 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
22830 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70  ken *pToken = &p
22840 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
22850 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 46 74 73 33  Token];.    Fts3
22860 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
22870 44 65 66 65 72 72 65 64 20 3d 20 70 54 6f 6b 65  Deferred = pToke
22880 6e 2d 3e 70 44 65 66 65 72 72 65 64 3b 0a 0a 20  n->pDeferred;.. 
22890 20 20 20 69 66 28 20 70 44 65 66 65 72 72 65 64     if( pDeferred
228a0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
228b0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
228c0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e   nList;.      in
228d0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
228e0 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c  s3DeferredTokenL
228f0 69 73 74 28 70 44 65 66 65 72 72 65 64 2c 20 26  ist(pDeferred, &
22900 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
22910 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22920 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
22930 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   rc;..      if( 
22940 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
22950 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22960 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  (aPoslist);.    
22970 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63      pPhrase->doc
22980 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a  list.pList = 0;.
22990 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d          pPhrase-
229a0 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d  >doclist.nList =
229b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
229c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
229d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
229e0 50 6f 73 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Poslist==0 ){.  
229f0 20 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d        aPoslist =
22a00 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
22a10 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c 69 73 74  nPoslist = nList
22a20 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
22a30 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4f          char *aO
22a40 75 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ut = pList;.    
22a50 20 20 20 20 63 68 61 72 20 2a 70 31 20 3d 20 61      char *p1 = a
22a60 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Poslist;.       
22a70 20 63 68 61 72 20 2a 70 32 20 3d 20 61 4f 75 74   char *p2 = aOut
22a80 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
22a90 74 28 20 69 50 72 65 76 3e 3d 30 20 29 3b 0a 20  t( iPrev>=0 );. 
22aa0 20 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69         fts3Posli
22ab0 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 61  stPhraseMerge(&a
22ac0 4f 75 74 2c 20 69 54 6f 6b 65 6e 2d 69 50 72 65  Out, iToken-iPre
22ad0 76 2c 20 30 2c 20 31 2c 20 26 70 31 2c 20 26 70  v, 0, 1, &p1, &p
22ae0 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
22af0 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c 69 73  te3_free(aPoslis
22b00 74 29 3b 0a 20 20 20 20 20 20 20 20 61 50 6f 73  t);.        aPos
22b10 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  list = pList;.  
22b20 20 20 20 20 20 20 6e 50 6f 73 6c 69 73 74 20 3d        nPoslist =
22b30 20 28 69 6e 74 29 28 61 4f 75 74 20 2d 20 61 50   (int)(aOut - aP
22b40 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
22b50 20 69 66 28 20 6e 50 6f 73 6c 69 73 74 3d 3d 30   if( nPoslist==0
22b60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
22b70 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c  lite3_free(aPosl
22b80 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
22b90 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
22ba0 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  .pList = 0;.    
22bb0 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
22bc0 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20 30  oclist.nList = 0
22bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
22be0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
22bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22c00 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 54        iPrev = iT
22c10 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oken;.    }.  }.
22c20 0a 20 20 69 66 28 20 69 50 72 65 76 3e 3d 30 20  .  if( iPrev>=0 
22c30 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 55  ){.    int nMaxU
22c40 6e 64 65 66 65 72 72 65 64 20 3d 20 70 50 68 72  ndeferred = pPhr
22c50 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ase->iDoclistTok
22c60 65 6e 3b 0a 20 20 20 20 69 66 28 20 6e 4d 61 78  en;.    if( nMax
22c70 55 6e 64 65 66 65 72 72 65 64 3c 30 20 29 7b 0a  Undeferred<0 ){.
22c80 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
22c90 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 61  oclist.pList = a
22ca0 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 70  Poslist;.      p
22cb0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
22cc0 6e 4c 69 73 74 20 3d 20 6e 50 6f 73 6c 69 73 74  nList = nPoslist
22cd0 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
22ce0 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 20  >doclist.iDocid 
22cf0 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3b  = pCsr->iPrevId;
22d00 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
22d10 64 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73  doclist.bFreeLis
22d20 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
22d30 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 69 73  {.      int nDis
22d40 74 61 6e 63 65 3b 0a 20 20 20 20 20 20 63 68 61  tance;.      cha
22d50 72 20 2a 70 31 3b 0a 20 20 20 20 20 20 63 68 61  r *p1;.      cha
22d60 72 20 2a 70 32 3b 0a 20 20 20 20 20 20 63 68 61  r *p2;.      cha
22d70 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 20 20 20 20  r *aOut;..      
22d80 69 66 28 20 6e 4d 61 78 55 6e 64 65 66 65 72 72  if( nMaxUndeferr
22d90 65 64 3e 69 50 72 65 76 20 29 7b 0a 20 20 20 20  ed>iPrev ){.    
22da0 20 20 20 20 70 31 20 3d 20 61 50 6f 73 6c 69 73      p1 = aPoslis
22db0 74 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d 20  t;.        p2 = 
22dc0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
22dd0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
22de0 6e 44 69 73 74 61 6e 63 65 20 3d 20 6e 4d 61 78  nDistance = nMax
22df0 55 6e 64 65 66 65 72 72 65 64 20 2d 20 69 50 72  Undeferred - iPr
22e00 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
22e10 0a 20 20 20 20 20 20 20 20 70 31 20 3d 20 70 50  .        p1 = pP
22e20 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
22e30 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 32  List;.        p2
22e40 20 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20   = aPoslist;.   
22e50 20 20 20 20 20 6e 44 69 73 74 61 6e 63 65 20 3d       nDistance =
22e60 20 69 50 72 65 76 20 2d 20 6e 4d 61 78 55 6e 64   iPrev - nMaxUnd
22e70 65 66 65 72 72 65 64 3b 0a 20 20 20 20 20 20 7d  eferred;.      }
22e80 0a 0a 20 20 20 20 20 20 61 4f 75 74 20 3d 20 28  ..      aOut = (
22e90 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
22ea0 61 6c 6c 6f 63 28 6e 50 6f 73 6c 69 73 74 2b 38  alloc(nPoslist+8
22eb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4f  );.      if( !aO
22ec0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
22ed0 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c  lite3_free(aPosl
22ee0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ist);.        re
22ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22f00 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
22f10 20 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d   .      pPhrase-
22f20 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d  >doclist.pList =
22f30 20 61 4f 75 74 3b 0a 20 20 20 20 20 20 69 66 28   aOut;.      if(
22f40 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61   fts3PoslistPhra
22f50 73 65 4d 65 72 67 65 28 26 61 4f 75 74 2c 20 6e  seMerge(&aOut, n
22f60 44 69 73 74 61 6e 63 65 2c 20 30 2c 20 31 2c 20  Distance, 0, 1, 
22f70 26 70 31 2c 20 26 70 32 29 20 29 7b 0a 20 20 20  &p1, &p2) ){.   
22f80 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f       pPhrase->do
22f90 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 20  clist.bFreeList 
22fa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 68  = 1;.        pPh
22fb0 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c  rase->doclist.nL
22fc0 69 73 74 20 3d 20 28 69 6e 74 29 28 61 4f 75 74  ist = (int)(aOut
22fd0 20 2d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   - pPhrase->docl
22fe0 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ist.pList);.    
22ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23000 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f   sqlite3_free(aO
23010 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 50 68  ut);.        pPh
23020 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
23030 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
23040 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
23050 74 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t.nList = 0;.   
23060 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
23070 65 33 5f 66 72 65 65 28 61 50 6f 73 6c 69 73 74  e3_free(aPoslist
23080 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
23090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
230a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
230b0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53  LITE_DISABLE_FTS
230c0 34 5f 44 45 46 45 52 52 45 44 20 2a 2f 0a 0a 2f  4_DEFERRED */../
230d0 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  *.** Maximum num
230e0 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 61 20  ber of tokens a 
230f0 70 68 72 61 73 65 20 6d 61 79 20 68 61 76 65 20  phrase may have 
23100 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
23110 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 63 72   for the.** incr
23120 65 6d 65 6e 74 61 6c 20 64 6f 63 6c 69 73 74 73  emental doclists
23130 20 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 23 64   strategy..*/.#d
23140 65 66 69 6e 65 20 4d 41 58 5f 49 4e 43 52 5f 50  efine MAX_INCR_P
23150 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20 34 0a 0a  HRASE_TOKENS 4..
23160 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23170 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
23180 72 20 65 61 63 68 20 46 74 73 33 50 68 72 61 73  r each Fts3Phras
23190 65 20 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74  e in a full-text
231a0 20 71 75 65 72 79 20 0a 2a 2a 20 65 78 70 72 65   query .** expre
231b0 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c  ssion to initial
231c0 69 7a 65 20 74 68 65 20 6d 65 63 68 61 6e 69 73  ize the mechanis
231d0 6d 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20  m for returning 
231e0 72 6f 77 73 2e 20 4f 6e 63 65 20 74 68 69 73 0a  rows. Once this.
231f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
23200 62 65 65 6e 20 63 61 6c 6c 65 64 20 73 75 63 63  been called succ
23210 65 73 73 66 75 6c 6c 79 20 6f 6e 20 61 6e 20 46  essfully on an F
23220 74 73 33 50 68 72 61 73 65 2c 20 69 74 20 6d 61  ts3Phrase, it ma
23230 79 20 62 65 0a 2a 2a 20 75 73 65 64 20 77 69 74  y be.** used wit
23240 68 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65  h fts3EvalPhrase
23250 4e 65 78 74 28 29 20 74 6f 20 69 74 65 72 61 74  Next() to iterat
23260 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  e through the ma
23270 74 63 68 69 6e 67 20 64 6f 63 69 64 73 2e 0a 2a  tching docids..*
23280 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
23290 72 20 62 4f 70 74 4f 6b 20 69 73 20 74 72 75 65  r bOptOk is true
232a0 2c 20 74 68 65 6e 20 74 68 65 20 70 68 72 61 73  , then the phras
232b0 65 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f  e may (or may no
232c0 74 29 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  t) use the.** in
232d0 63 72 65 6d 65 6e 74 61 6c 20 6c 6f 61 64 69 6e  cremental loadin
232e0 67 20 73 74 72 61 74 65 67 79 2e 20 4f 74 68 65  g strategy. Othe
232f0 72 77 69 73 65 2c 20 74 68 65 20 65 6e 74 69 72  rwise, the entir
23300 65 20 64 6f 63 6c 69 73 74 20 69 73 20 6c 6f 61  e doclist is loa
23310 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f  ded into.** memo
23320 72 79 20 77 69 74 68 69 6e 20 74 68 69 73 20 63  ry within this c
23330 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  all..**.** SQLIT
23340 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
23350 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
23360 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  urs, otherwise a
23370 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
23380 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
23390 6e 74 20 66 74 73 33 45 76 61 6c 50 68 72 61 73  nt fts3EvalPhras
233a0 65 53 74 61 72 74 28 46 74 73 33 43 75 72 73 6f  eStart(Fts3Curso
233b0 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 4f 70  r *pCsr, int bOp
233c0 74 4f 6b 2c 20 46 74 73 33 50 68 72 61 73 65 20  tOk, Fts3Phrase 
233d0 2a 70 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  *p){.  Fts3Table
233e0 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61   *pTab = (Fts3Ta
233f0 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
23400 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  .pVtab;.  int rc
23410 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
23420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
23430 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
23440 20 69 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d   i;..  /* Determ
23450 69 6e 65 20 69 66 20 64 6f 63 6c 69 73 74 73 20  ine if doclists 
23460 6d 61 79 20 62 65 20 6c 6f 61 64 65 64 20 66 72  may be loaded fr
23470 6f 6d 20 64 69 73 6b 20 69 6e 63 72 65 6d 65 6e  om disk incremen
23480 74 61 6c 6c 79 2e 20 54 68 69 73 20 69 73 0a 20  tally. This is. 
23490 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 69 66 20   ** possible if 
234a0 74 68 65 20 62 4f 70 74 4f 6b 20 61 72 67 75 6d  the bOptOk argum
234b0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
234c0 20 46 54 53 20 64 6f 63 6c 69 73 74 73 20 77 69   FTS doclists wi
234d0 6c 6c 20 62 65 0a 20 20 2a 2a 20 73 63 61 6e 6e  ll be.  ** scann
234e0 65 64 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72  ed in forward or
234f0 64 65 72 2c 20 61 6e 64 20 74 68 65 20 70 68 72  der, and the phr
23500 61 73 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ase consists of 
23510 0a 20 20 2a 2a 20 4d 41 58 5f 49 4e 43 52 5f 50  .  ** MAX_INCR_P
23520 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20 6f 72 20  HRASE_TOKENS or 
23530 66 65 77 65 72 20 74 6f 6b 65 6e 73 2c 20 6e 6f  fewer tokens, no
23540 6e 65 20 6f 66 20 77 68 69 63 68 20 61 72 65 20  ne of which are 
23550 61 72 65 20 22 5e 66 69 72 73 74 22 0a 20 20 2a  are "^first".  *
23560 2a 20 74 6f 6b 65 6e 73 20 6f 72 20 70 72 65 66  * tokens or pref
23570 69 78 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 63  ix tokens that c
23580 61 6e 6e 6f 74 20 75 73 65 20 61 20 70 72 65 66  annot use a pref
23590 69 78 2d 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20  ix-index.  */.  
235a0 69 6e 74 20 62 48 61 76 65 49 6e 63 72 20 3d 20  int bHaveIncr = 
235b0 30 3b 0a 20 20 69 6e 74 20 62 49 6e 63 72 4f 6b  0;.  int bIncrOk
235c0 20 3d 20 28 62 4f 70 74 4f 6b 20 0a 20 20 20 26   = (bOptOk .   &
235d0 26 20 70 43 73 72 2d 3e 62 44 65 73 63 3d 3d 70  & pCsr->bDesc==p
235e0 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 0a 20  Tab->bDescIdx . 
235f0 20 20 26 26 20 70 2d 3e 6e 54 6f 6b 65 6e 3c 3d    && p->nToken<=
23600 4d 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f  MAX_INCR_PHRASE_
23610 54 4f 4b 45 4e 53 20 26 26 20 70 2d 3e 6e 54 6f  TOKENS && p->nTo
23620 6b 65 6e 3e 30 0a 23 69 66 64 65 66 20 53 51 4c  ken>0.#ifdef SQL
23630 49 54 45 5f 54 45 53 54 0a 20 20 20 26 26 20 70  ITE_TEST.   && p
23640 54 61 62 2d 3e 62 4e 6f 49 6e 63 72 44 6f 63 6c  Tab->bNoIncrDocl
23650 69 73 74 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  ist==0.#endif.  
23660 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 62 49  );.  for(i=0; bI
23670 6e 63 72 4f 6b 3d 3d 31 20 26 26 20 69 3c 70 2d  ncrOk==1 && i<p-
23680 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20  >nToken; i++){. 
23690 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b     Fts3PhraseTok
236a0 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70 2d  en *pToken = &p-
236b0 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20  >aToken[i];.    
236c0 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 62 46 69 72  if( pToken->bFir
236d0 73 74 20 7c 7c 20 28 70 54 6f 6b 65 6e 2d 3e 70  st || (pToken->p
236e0 53 65 67 63 73 72 21 3d 30 20 26 26 20 21 70 54  Segcsr!=0 && !pT
236f0 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2d 3e 62  oken->pSegcsr->b
23700 4c 6f 6f 6b 75 70 29 20 29 7b 0a 20 20 20 20 20  Lookup) ){.     
23710 20 62 49 6e 63 72 4f 6b 20 3d 20 30 3b 0a 20 20   bIncrOk = 0;.  
23720 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54 6f 6b    }.    if( pTok
23730 65 6e 2d 3e 70 53 65 67 63 73 72 20 29 20 62 48  en->pSegcsr ) bH
23740 61 76 65 49 6e 63 72 20 3d 20 31 3b 0a 20 20 7d  aveIncr = 1;.  }
23750 0a 0a 20 20 69 66 28 20 62 49 6e 63 72 4f 6b 20  ..  if( bIncrOk 
23760 26 26 20 62 48 61 76 65 49 6e 63 72 20 29 7b 0a  && bHaveIncr ){.
23770 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 69      /* Use the i
23780 6e 63 72 65 6d 65 6e 74 61 6c 20 61 70 70 72 6f  ncremental appro
23790 61 63 68 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ach. */.    int 
237a0 69 43 6f 6c 20 3d 20 28 70 2d 3e 69 43 6f 6c 75  iCol = (p->iColu
237b0 6d 6e 20 3e 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  mn >= pTab->nCol
237c0 75 6d 6e 20 3f 20 2d 31 20 3a 20 70 2d 3e 69 43  umn ? -1 : p->iC
237d0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 66 6f 72 28  olumn);.    for(
237e0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
237f0 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 54 6f 6b 65  OK && i<p->nToke
23800 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  n; i++){.      F
23810 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
23820 70 54 6f 6b 65 6e 20 3d 20 26 70 2d 3e 61 54 6f  pToken = &p->aTo
23830 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  ken[i];.      Ft
23840 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
23850 20 2a 70 53 65 67 63 73 72 20 3d 20 70 54 6f 6b   *pSegcsr = pTok
23860 65 6e 2d 3e 70 53 65 67 63 73 72 3b 0a 20 20 20  en->pSegcsr;.   
23870 20 20 20 69 66 28 20 70 53 65 67 63 73 72 20 29     if( pSegcsr )
23880 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
23890 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63  qlite3Fts3MsrInc
238a0 72 53 74 61 72 74 28 70 54 61 62 2c 20 70 53 65  rStart(pTab, pSe
238b0 67 63 73 72 2c 20 69 43 6f 6c 2c 20 70 54 6f 6b  gcsr, iCol, pTok
238c0 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
238d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
238e0 0a 20 20 20 20 70 2d 3e 62 49 6e 63 72 20 3d 20  .    p->bIncr = 
238f0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
23900 2f 2a 20 4c 6f 61 64 20 74 68 65 20 66 75 6c 6c  /* Load the full
23910 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
23920 20 70 68 72 61 73 65 20 69 6e 74 6f 20 6d 65 6d   phrase into mem
23930 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ory. */.    rc =
23940 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65 4c   fts3EvalPhraseL
23950 6f 61 64 28 70 43 73 72 2c 20 70 29 3b 0a 20 20  oad(pCsr, p);.  
23960 20 20 70 2d 3e 62 49 6e 63 72 20 3d 20 30 3b 0a    p->bIncr = 0;.
23970 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72    }..  assert( r
23980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
23990 70 2d 3e 6e 54 6f 6b 65 6e 3c 31 20 7c 7c 20 70  p->nToken<1 || p
239a0 2d 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 70 53 65 67  ->aToken[0].pSeg
239b0 63 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 62 49 6e  csr==0 || p->bIn
239c0 63 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  cr );.  return r
239d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
239e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
239f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 62 61 63  d to iterate bac
23a00 6b 77 61 72 64 73 20 28 66 72 6f 6d 20 74 68 65  kwards (from the
23a10 20 65 6e 64 20 74 6f 20 73 74 61 72 74 29 20 0a   end to start) .
23a20 2a 2a 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69  ** through docli
23a30 73 74 73 2e 20 49 74 20 69 73 20 75 73 65 64 20  sts. It is used 
23a40 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 74  by this module t
23a50 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
23a60 68 20 70 68 72 61 73 65 0a 2a 2a 20 64 6f 63 6c  h phrase.** docl
23a70 69 73 74 73 20 69 6e 20 72 65 76 65 72 73 65 20  ists in reverse 
23a80 61 6e 64 20 62 79 20 74 68 65 20 66 74 73 33 5f  and by the fts3_
23a90 77 72 69 74 65 2e 63 20 6d 6f 64 75 6c 65 20 74  write.c module t
23aa0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
23ab0 68 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72  h.** pending-ter
23ac0 6d 73 20 6c 69 73 74 73 20 77 68 65 6e 20 77 72  ms lists when wr
23ad0 69 74 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  iting to databas
23ae0 65 73 20 77 69 74 68 20 22 6f 72 64 65 72 3d 64  es with "order=d
23af0 65 73 63 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  esc"..**.** The 
23b00 64 6f 63 6c 69 73 74 20 6d 61 79 20 62 65 20 73  doclist may be s
23b10 6f 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69  orted in ascendi
23b20 6e 67 20 28 70 61 72 61 6d 65 74 65 72 20 62 44  ng (parameter bD
23b30 65 73 63 49 64 78 3d 3d 30 29 20 6f 72 20 0a 2a  escIdx==0) or .*
23b40 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 28 70 61  * descending (pa
23b50 72 61 6d 65 74 65 72 20 62 44 65 73 63 49 64 78  rameter bDescIdx
23b60 3d 3d 31 29 20 6f 72 64 65 72 20 6f 66 20 64 6f  ==1) order of do
23b70 63 69 64 2e 20 52 65 67 61 72 64 6c 65 73 73 2c  cid. Regardless,
23b80 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
23b90 6e 20 69 74 65 72 61 74 65 73 20 66 72 6f 6d 20  n iterates from 
23ba0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
23bb0 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62 65  oclist to the be
23bc0 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  ginning..*/.void
23bd0 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c   sqlite3Fts3Docl
23be0 69 73 74 50 72 65 76 28 0a 20 20 69 6e 74 20 62  istPrev(.  int b
23bf0 44 65 73 63 49 64 78 2c 20 20 20 20 20 20 20 20  DescIdx,        
23c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23c10 75 65 20 69 66 20 74 68 65 20 64 6f 63 6c 69 73  ue if the doclis
23c20 74 20 69 73 20 64 65 73 63 20 2a 2f 0a 20 20 63  t is desc */.  c
23c30 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20  har *aDoclist,  
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74  * Pointer to ent
23c60 69 72 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20  ire doclist */. 
23c70 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 2c 20 20   int nDoclist,  
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 44   /* Length of aD
23ca0 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
23cb0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 49 74  */.  char **ppIt
23cc0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
23cd0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
23ce0 49 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 65 72  Iterator pointer
23cf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
23d00 74 36 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20  t64 *piDocid,   
23d10 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
23d20 20 44 6f 63 69 64 20 70 6f 69 6e 74 65 72 20 2a   Docid pointer *
23d30 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 2c  /.  int *pnList,
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 69 73 74      /* OUT: List
23d60 20 6c 65 6e 67 74 68 20 70 6f 69 6e 74 65 72 20   length pointer 
23d70 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66 20 20  */.  u8 *pbEof  
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
23da0 2d 6f 66 2d 66 69 6c 65 20 66 6c 61 67 20 2a 2f  -of-file flag */
23db0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20  .){.  char *p = 
23dc0 2a 70 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65  *ppIter;..  asse
23dd0 72 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29  rt( nDoclist>0 )
23de0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 45  ;.  assert( *pbE
23df0 6f 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  of==0 );.  asser
23e00 74 28 20 70 20 7c 7c 20 2a 70 69 44 6f 63 69 64  t( p || *piDocid
23e10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23e20 20 21 70 20 7c 7c 20 28 70 3e 61 44 6f 63 6c 69   !p || (p>aDocli
23e30 73 74 20 26 26 20 70 3c 26 61 44 6f 63 6c 69 73  st && p<&aDoclis
23e40 74 5b 6e 44 6f 63 6c 69 73 74 5d 29 20 29 3b 0a  t[nDoclist]) );.
23e50 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
23e60 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
23e70 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20   iDocid = 0;.   
23e80 20 63 68 61 72 20 2a 70 4e 65 78 74 20 3d 20 30   char *pNext = 0
23e90 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 44 6f 63  ;.    char *pDoc
23ea0 69 64 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20  id = aDoclist;. 
23eb0 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20     char *pEnd = 
23ec0 26 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69  &aDoclist[nDocli
23ed0 73 74 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4d 75  st];.    int iMu
23ee0 6c 20 3d 20 31 3b 0a 0a 20 20 20 20 77 68 69 6c  l = 1;..    whil
23ef0 65 28 20 70 44 6f 63 69 64 3c 70 45 6e 64 20 29  e( pDocid<pEnd )
23f00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
23f10 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
23f20 20 20 20 20 70 44 6f 63 69 64 20 2b 3d 20 73 71      pDocid += sq
23f30 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
23f40 6e 74 28 70 44 6f 63 69 64 2c 20 26 69 44 65 6c  nt(pDocid, &iDel
23f50 74 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69  ta);.      iDoci
23f60 64 20 2b 3d 20 28 69 4d 75 6c 20 2a 20 69 44 65  d += (iMul * iDe
23f70 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  lta);.      pNex
23f80 74 20 3d 20 70 44 6f 63 69 64 3b 0a 20 20 20 20  t = pDocid;.    
23f90 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
23fa0 79 28 30 2c 20 26 70 44 6f 63 69 64 29 3b 0a 20  y(0, &pDocid);. 
23fb0 20 20 20 20 20 77 68 69 6c 65 28 20 70 44 6f 63       while( pDoc
23fc0 69 64 3c 70 45 6e 64 20 26 26 20 2a 70 44 6f 63  id<pEnd && *pDoc
23fd0 69 64 3d 3d 30 20 29 20 70 44 6f 63 69 64 2b 2b  id==0 ) pDocid++
23fe0 3b 0a 20 20 20 20 20 20 69 4d 75 6c 20 3d 20 28  ;.      iMul = (
23ff0 62 44 65 73 63 49 64 78 20 3f 20 2d 31 20 3a 20  bDescIdx ? -1 : 
24000 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a  1);.    }..    *
24010 70 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70  pnList = (int)(p
24020 45 6e 64 20 2d 20 70 4e 65 78 74 29 3b 0a 20 20  End - pNext);.  
24030 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4e 65 78    *ppIter = pNex
24040 74 3b 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20  t;.    *piDocid 
24050 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73  = iDocid;.  }els
24060 65 7b 0a 20 20 20 20 69 6e 74 20 69 4d 75 6c 20  e{.    int iMul 
24070 3d 20 28 62 44 65 73 63 49 64 78 20 3f 20 2d 31  = (bDescIdx ? -1
24080 20 3a 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   : 1);.    sqlit
24090 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b  e3_int64 iDelta;
240a0 0a 20 20 20 20 66 74 73 33 47 65 74 52 65 76 65  .    fts3GetReve
240b0 72 73 65 56 61 72 69 6e 74 28 26 70 2c 20 61 44  rseVarint(&p, aD
240c0 6f 63 6c 69 73 74 2c 20 26 69 44 65 6c 74 61 29  oclist, &iDelta)
240d0 3b 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 2d  ;.    *piDocid -
240e0 3d 20 28 69 4d 75 6c 20 2a 20 69 44 65 6c 74 61  = (iMul * iDelta
240f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 3d 3d 61  );..    if( p==a
24100 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
24110 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20   *pbEof = 1;.   
24120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
24130 61 72 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20  ar *pSave = p;. 
24140 20 20 20 20 20 66 74 73 33 52 65 76 65 72 73 65       fts3Reverse
24150 50 6f 73 6c 69 73 74 28 61 44 6f 63 6c 69 73 74  Poslist(aDoclist
24160 2c 20 26 70 29 3b 0a 20 20 20 20 20 20 2a 70 6e  , &p);.      *pn
24170 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 53 61  List = (int)(pSa
24180 76 65 20 2d 20 70 29 3b 0a 20 20 20 20 7d 0a 20  ve - p);.    }. 
24190 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 3b 0a     *ppIter = p;.
241a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
241b0 72 61 74 65 20 66 6f 72 77 61 72 64 73 20 74 68  rate forwards th
241c0 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 73 74 2e  rough a doclist.
241d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
241e0 46 74 73 33 44 6f 63 6c 69 73 74 4e 65 78 74 28  Fts3DoclistNext(
241f0 0a 20 20 69 6e 74 20 62 44 65 73 63 49 64 78 2c  .  int bDescIdx,
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
24220 65 20 64 6f 63 6c 69 73 74 20 69 73 20 64 65 73  e doclist is des
24230 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f  c */.  char *aDo
24240 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  clist,          
24250 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24260 72 20 74 6f 20 65 6e 74 69 72 65 20 64 6f 63 6c  r to entire docl
24270 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f  ist */.  int nDo
24280 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  clist,          
24290 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
242a0 74 68 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69  th of aDoclist i
242b0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
242c0 72 20 2a 2a 70 70 49 74 65 72 2c 20 20 20 20 20  r **ppIter,     
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
242e0 49 4e 2f 4f 55 54 3a 20 49 74 65 72 61 74 6f 72  IN/OUT: Iterator
242f0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71   pointer */.  sq
24300 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44  lite3_int64 *piD
24310 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  ocid,         /*
24320 20 49 4e 2f 4f 55 54 3a 20 44 6f 63 69 64 20 70   IN/OUT: Docid p
24330 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
24340 70 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20  pbEof           
24350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24360 55 54 3a 20 45 6e 64 2d 6f 66 2d 66 69 6c 65 20  UT: End-of-file 
24370 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  flag */.){.  cha
24380 72 20 2a 70 20 3d 20 2a 70 70 49 74 65 72 3b 0a  r *p = *ppIter;.
24390 0a 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c  .  assert( nDocl
243a0 69 73 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ist>0 );.  asser
243b0 74 28 20 2a 70 62 45 6f 66 3d 3d 30 20 29 3b 0a  t( *pbEof==0 );.
243c0 20 20 61 73 73 65 72 74 28 20 70 20 7c 7c 20 2a    assert( p || *
243d0 70 69 44 6f 63 69 64 3d 3d 30 20 29 3b 0a 20 20  piDocid==0 );.  
243e0 61 73 73 65 72 74 28 20 21 70 20 7c 7c 20 28 70  assert( !p || (p
243f0 3e 3d 61 44 6f 63 6c 69 73 74 20 26 26 20 70 3c  >=aDoclist && p<
24400 3d 26 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c  =&aDoclist[nDocl
24410 69 73 74 5d 29 20 29 3b 0a 0a 20 20 69 66 28 20  ist]) );..  if( 
24420 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  p==0 ){.    p = 
24430 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 70 20  aDoclist;.    p 
24440 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65  += sqlite3Fts3Ge
24450 74 56 61 72 69 6e 74 28 70 2c 20 70 69 44 6f 63  tVarint(p, piDoc
24460 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
24470 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
24480 79 28 30 2c 20 26 70 29 3b 0a 20 20 20 20 77 68  y(0, &p);.    wh
24490 69 6c 65 28 20 70 3c 26 61 44 6f 63 6c 69 73 74  ile( p<&aDoclist
244a0 5b 6e 44 6f 63 6c 69 73 74 5d 20 26 26 20 2a 70  [nDoclist] && *p
244b0 3d 3d 30 20 29 20 70 2b 2b 3b 20 0a 20 20 20 20  ==0 ) p++; .    
244c0 69 66 28 20 70 3e 3d 26 61 44 6f 63 6c 69 73 74  if( p>=&aDoclist
244d0 5b 6e 44 6f 63 6c 69 73 74 5d 20 29 7b 0a 20 20  [nDoclist] ){.  
244e0 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a      *pbEof = 1;.
244f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24500 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
24510 56 61 72 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20  Var;.      p += 
24520 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61  sqlite3Fts3GetVa
24530 72 69 6e 74 28 70 2c 20 26 69 56 61 72 29 3b 0a  rint(p, &iVar);.
24540 20 20 20 20 20 20 2a 70 69 44 6f 63 69 64 20 2b        *piDocid +
24550 3d 20 28 28 62 44 65 73 63 49 64 78 20 3f 20 2d  = ((bDescIdx ? -
24560 31 20 3a 20 31 29 20 2a 20 69 56 61 72 29 3b 0a  1 : 1) * iVar);.
24570 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
24580 49 74 65 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  Iter = p;.}../*.
24590 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
245a0 74 65 72 61 74 6f 72 20 70 44 4c 20 74 6f 20 74  terator pDL to t
245b0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
245c0 20 70 44 4c 2d 3e 61 41 6c 6c 2f 6e 41 6c 6c 2e   pDL->aAll/nAll.
245d0 20 53 65 74 20 2a 70 62 45 6f 66 0a 2a 2a 20 74   Set *pbEof.** t
245e0 6f 20 74 72 75 65 20 69 66 20 45 4f 46 20 69 73  o true if EOF is
245f0 20 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 73 74 61   reached..*/.sta
24600 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 76 61  tic void fts3Eva
24610 6c 44 6c 50 68 72 61 73 65 4e 65 78 74 28 0a 20  lDlPhraseNext(. 
24620 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
24630 2c 0a 20 20 46 74 73 33 44 6f 63 6c 69 73 74 20  ,.  Fts3Doclist 
24640 2a 70 44 4c 2c 0a 20 20 75 38 20 2a 70 62 45 6f  *pDL,.  u8 *pbEo
24650 66 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 49 74  f.){.  char *pIt
24660 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24680 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
24690 65 20 74 68 72 6f 75 67 68 20 61 41 6c 6c 20 2a  e through aAll *
246a0 2f 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d  /.  char *pEnd =
246b0 20 26 70 44 4c 2d 3e 61 41 6c 6c 5b 70 44 4c 2d   &pDL->aAll[pDL-
246c0 3e 6e 41 6c 6c 5d 3b 20 20 20 20 20 2f 2a 20 31  >nAll];     /* 1
246d0 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
246e0 66 20 61 41 6c 6c 20 2a 2f 0a 20 0a 20 20 69 66  f aAll */. .  if
246f0 28 20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69  ( pDL->pNextDoci
24700 64 20 29 7b 0a 20 20 20 20 70 49 74 65 72 20 3d  d ){.    pIter =
24710 20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64   pDL->pNextDocid
24720 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
24730 49 74 65 72 20 3d 20 70 44 4c 2d 3e 61 41 6c 6c  Iter = pDL->aAll
24740 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74  ;.  }..  if( pIt
24750 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
24760 2f 2a 20 57 65 20 68 61 76 65 20 61 6c 72 65 61  /* We have alrea
24770 64 79 20 72 65 61 63 68 65 64 20 74 68 65 20 65  dy reached the e
24780 6e 64 20 6f 66 20 74 68 69 73 20 64 6f 63 6c 69  nd of this docli
24790 73 74 2e 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20  st. EOF. */.    
247a0 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  *pbEof = 1;.  }e
247b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
247c0 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20  _int64 iDelta;. 
247d0 20 20 20 70 49 74 65 72 20 2b 3d 20 73 71 6c 69     pIter += sqli
247e0 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
247f0 28 70 49 74 65 72 2c 20 26 69 44 65 6c 74 61 29  (pIter, &iDelta)
24800 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
24810 62 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 70  bDescIdx==0 || p
24820 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3d 3d  DL->pNextDocid==
24830 30 20 29 7b 0a 20 20 20 20 20 20 70 44 4c 2d 3e  0 ){.      pDL->
24840 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61  iDocid += iDelta
24850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24860 20 20 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20 2d     pDL->iDocid -
24870 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 7d 0a  = iDelta;.    }.
24880 20 20 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d      pDL->pList =
24890 20 70 49 74 65 72 3b 0a 20 20 20 20 66 74 73 33   pIter;.    fts3
248a0 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
248b0 70 49 74 65 72 29 3b 0a 20 20 20 20 70 44 4c 2d  pIter);.    pDL-
248c0 3e 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70  >nList = (int)(p
248d0 49 74 65 72 20 2d 20 70 44 4c 2d 3e 70 4c 69 73  Iter - pDL->pLis
248e0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65  t);..    /* pIte
248f0 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 6a 75 73  r now points jus
24900 74 20 70 61 73 74 20 74 68 65 20 30 78 30 30 20  t past the 0x00 
24910 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
24920 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 0a 20 20  the position-.  
24930 20 20 2a 2a 20 6c 69 73 74 20 66 6f 72 20 64 6f    ** list for do
24940 63 75 6d 65 6e 74 20 70 44 4c 2d 3e 69 44 6f 63  cument pDL->iDoc
24950 69 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  id. However, if 
24960 74 68 69 73 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  this position-li
24970 73 74 20 77 61 73 0a 20 20 20 20 2a 2a 20 65 64  st was.    ** ed
24980 69 74 65 64 20 69 6e 20 70 6c 61 63 65 20 62 79  ited in place by
24990 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69   fts3EvalNearTri
249a0 6d 28 29 2c 20 74 68 65 6e 20 70 49 74 65 72 20  m(), then pIter 
249b0 6d 61 79 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  may not actually
249c0 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 74 6f  .    ** point to
249d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
249e0 65 20 6e 65 78 74 20 64 6f 63 69 64 20 76 61 6c  e next docid val
249f0 75 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ue. The followin
24a00 67 20 6c 69 6e 65 20 64 65 61 6c 73 0a 20 20 20  g line deals.   
24a10 20 2a 2a 20 77 69 74 68 20 74 68 69 73 20 63 61   ** with this ca
24a20 73 65 20 62 79 20 61 64 76 61 6e 63 69 6e 67 20  se by advancing 
24a30 70 49 74 65 72 20 70 61 73 74 20 74 68 65 20 7a  pIter past the z
24a40 65 72 6f 2d 70 61 64 64 69 6e 67 20 61 64 64 65  ero-padding adde
24a50 64 20 62 79 0a 20 20 20 20 2a 2a 20 66 74 73 33  d by.    ** fts3
24a60 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 29 2e 20  EvalNearTrim(). 
24a70 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
24a80 49 74 65 72 3c 70 45 6e 64 20 26 26 20 2a 70 49  Iter<pEnd && *pI
24a90 74 65 72 3d 3d 30 20 29 20 70 49 74 65 72 2b 2b  ter==0 ) pIter++
24aa0 3b 0a 0a 20 20 20 20 70 44 4c 2d 3e 70 4e 65 78  ;..    pDL->pNex
24ab0 74 44 6f 63 69 64 20 3d 20 70 49 74 65 72 3b 0a  tDocid = pIter;.
24ac0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
24ad0 72 3e 3d 26 70 44 4c 2d 3e 61 41 6c 6c 5b 70 44  r>=&pDL->aAll[pD
24ae0 4c 2d 3e 6e 41 6c 6c 5d 20 7c 7c 20 2a 70 49 74  L->nAll] || *pIt
24af0 65 72 20 29 3b 0a 20 20 20 20 2a 70 62 45 6f 66  er );.    *pbEof
24b00 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
24b10 2a 2a 20 48 65 6c 70 65 72 20 74 79 70 65 20 75  ** Helper type u
24b20 73 65 64 20 62 79 20 66 74 73 33 45 76 61 6c 49  sed by fts3EvalI
24b30 6e 63 72 50 68 72 61 73 65 4e 65 78 74 28 29 20  ncrPhraseNext() 
24b40 61 6e 64 20 69 6e 63 72 50 68 72 61 73 65 54 6f  and incrPhraseTo
24b50 6b 65 6e 4e 65 78 74 28 29 2e 0a 2a 2f 0a 74 79  kenNext()..*/.ty
24b60 70 65 64 65 66 20 73 74 72 75 63 74 20 54 6f 6b  pedef struct Tok
24b70 65 6e 44 6f 63 6c 69 73 74 20 54 6f 6b 65 6e 44  enDoclist TokenD
24b80 6f 63 6c 69 73 74 3b 0a 73 74 72 75 63 74 20 54  oclist;.struct T
24b90 6f 6b 65 6e 44 6f 63 6c 69 73 74 20 7b 0a 20 20  okenDoclist {.  
24ba0 69 6e 74 20 62 49 67 6e 6f 72 65 3b 0a 20 20 73  int bIgnore;.  s
24bb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f  qlite3_int64 iDo
24bc0 63 69 64 3b 0a 20 20 63 68 61 72 20 2a 70 4c 69  cid;.  char *pLi
24bd0 73 74 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b  st;.  int nList;
24be0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e  .};../*.** Token
24bf0 20 70 54 6f 6b 65 6e 20 69 73 20 61 6e 20 69 6e   pToken is an in
24c00 63 72 65 6d 65 6e 74 61 6c 6c 79 20 6c 6f 61 64  crementally load
24c10 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 69 73  ed token that is
24c20 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 6d   part of a .** m
24c30 75 6c 74 69 2d 74 6f 6b 65 6e 20 70 68 72 61 73  ulti-token phras
24c40 65 2e 20 41 64 76 61 6e 63 65 20 69 74 20 74 6f  e. Advance it to
24c50 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
24c60 6e 67 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74  ng document in t
24c70 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
24c80 6e 64 20 70 6f 70 75 6c 61 74 65 20 6f 75 74 70  nd populate outp
24c90 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 20 77  ut variable *p w
24ca0 69 74 68 20 74 68 65 20 64 65 74 61 69 6c 73 20  ith the details 
24cb0 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 65 6e  of the new.** en
24cc0 74 72 79 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  try. Or, if the 
24cd0 69 74 65 72 61 74 6f 72 20 68 61 73 20 72 65 61  iterator has rea
24ce0 63 68 65 64 20 45 4f 46 2c 20 73 65 74 20 2a 70  ched EOF, set *p
24cf0 62 45 6f 66 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  bEof to true..**
24d00 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
24d10 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
24d20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
24d30 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
24d40 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
24d50 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
24d60 69 6e 74 20 69 6e 63 72 50 68 72 61 73 65 54 6f  int incrPhraseTo
24d70 6b 65 6e 4e 65 78 74 28 0a 20 20 46 74 73 33 54  kenNext(.  Fts3T
24d80 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
24d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69             /* Vi
24da0 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
24db0 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61  le */.  Fts3Phra
24dc0 73 65 20 2a 70 50 68 72 61 73 65 2c 20 20 20 20  se *pPhrase,    
24dd0 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
24de0 65 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 6b  e to advance tok
24df0 65 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69  en of */.  int i
24e00 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
24e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
24e20 65 63 69 66 69 63 20 74 6f 6b 65 6e 20 74 6f 20  ecific token to 
24e30 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 54 6f 6b  advance */.  Tok
24e40 65 6e 44 6f 63 6c 69 73 74 20 2a 70 2c 20 20 20  enDoclist *p,   
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24e60 4f 55 54 3a 20 44 6f 63 69 64 20 61 6e 64 20 64  OUT: Docid and d
24e70 6f 63 6c 69 73 74 20 66 6f 72 20 6e 65 77 20 65  oclist for new e
24e80 6e 74 72 79 20 2a 2f 0a 20 20 75 38 20 2a 70 62  ntry */.  u8 *pb
24e90 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Eof             
24ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
24eb0 3a 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74  : True if iterat
24ec0 6f 72 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  or is at EOF */.
24ed0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24ee0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
24ef0 70 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73  pPhrase->iDoclis
24f00 74 54 6f 6b 65 6e 3d 3d 69 54 6f 6b 65 6e 20 29  tToken==iToken )
24f10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
24f20 3e 62 49 67 6e 6f 72 65 3d 3d 30 20 29 3b 0a 20  >bIgnore==0 );. 
24f30 20 20 20 61 73 73 65 72 74 28 20 70 50 68 72 61     assert( pPhra
24f40 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65  se->aToken[iToke
24f50 6e 5d 2e 70 53 65 67 63 73 72 3d 3d 30 20 29 3b  n].pSegcsr==0 );
24f60 0a 20 20 20 20 66 74 73 33 45 76 61 6c 44 6c 50  .    fts3EvalDlP
24f70 68 72 61 73 65 4e 65 78 74 28 70 54 61 62 2c 20  hraseNext(pTab, 
24f80 26 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73  &pPhrase->doclis
24f90 74 2c 20 70 62 45 6f 66 29 3b 0a 20 20 20 20 70  t, pbEof);.    p
24fa0 2d 3e 70 4c 69 73 74 20 3d 20 70 50 68 72 61 73  ->pList = pPhras
24fb0 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
24fc0 3b 0a 20 20 20 20 70 2d 3e 6e 4c 69 73 74 20 3d  ;.    p->nList =
24fd0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
24fe0 74 2e 6e 4c 69 73 74 3b 0a 20 20 20 20 70 2d 3e  t.nList;.    p->
24ff0 69 44 6f 63 69 64 20 3d 20 70 50 68 72 61 73 65  iDocid = pPhrase
25000 2d 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64  ->doclist.iDocid
25010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46  ;.  }else{.    F
25020 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
25030 70 54 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61 73  pToken = &pPhras
25040 65 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65 6e  e->aToken[iToken
25050 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
25060 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64  Token->pDeferred
25070 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
25080 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63  t( pToken->pSegc
25090 73 72 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 69  sr || pPhrase->i
250a0 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3e 3d 30 20  DoclistToken>=0 
250b0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65  );.    if( pToke
250c0 6e 2d 3e 70 53 65 67 63 73 72 20 29 7b 0a 20 20  n->pSegcsr ){.  
250d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62      assert( p->b
250e0 49 67 6e 6f 72 65 3d 3d 30 20 29 3b 0a 20 20 20  Ignore==0 );.   
250f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
25100 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a  ts3MsrIncrNext(.
25110 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2c 20            pTab, 
25120 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2c  pToken->pSegcsr,
25130 20 26 70 2d 3e 69 44 6f 63 69 64 2c 20 26 70 2d   &p->iDocid, &p-
25140 3e 70 4c 69 73 74 2c 20 26 70 2d 3e 6e 4c 69 73  >pList, &p->nLis
25150 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  t.      );.     
25160 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d 30   if( p->pList==0
25170 20 29 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20   ) *pbEof = 1;. 
25180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25190 70 2d 3e 62 49 67 6e 6f 72 65 20 3d 20 31 3b 0a  p->bIgnore = 1;.
251a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
251b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
251c0 2a 20 54 68 65 20 70 68 72 61 73 65 20 69 74 65  * The phrase ite
251d0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
251e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
251f0 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 66  ent:.**.**   * f
25200 65 61 74 75 72 65 73 20 61 74 20 6c 65 61 73 74  eatures at least
25210 20 6f 6e 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   one token that 
25220 75 73 65 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  uses an incremen
25230 74 61 6c 20 64 6f 63 6c 69 73 74 2c 20 61 6e 64  tal doclist, and
25240 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 6f 65 73   .**.**   * does
25250 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79   not contain any
25260 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
25270 2e 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ..**.** Advance 
25280 69 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  it to the next m
25290 61 74 63 68 69 6e 67 20 64 6f 63 75 6d 6e 65 6e  atching documnen
252a0 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
252b0 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 0a 2a  e and populate.*
252c0 2a 20 74 68 65 20 46 74 73 33 44 6f 63 6c 69 73  * the Fts3Doclis
252d0 74 2e 70 4c 69 73 74 20 61 6e 64 20 6e 4c 69 73  t.pList and nLis
252e0 74 20 66 69 65 6c 64 73 2e 20 0a 2a 2a 0a 2a 2a  t fields. .**.**
252f0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
25300 22 6e 65 78 74 22 20 65 6e 74 72 79 20 61 6e 64  "next" entry and
25310 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
25320 2c 20 74 68 65 6e 20 2a 70 62 45 6f 66 20 69 73  , then *pbEof is
25330 20 73 65 74 20 74 6f 0a 2a 2a 20 31 20 62 65 66   set to.** 1 bef
25340 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  ore returning. O
25350 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
25360 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64  error occurs and
25370 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
25380 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
25390 20 61 64 76 61 6e 63 65 64 2c 20 2a 70 62 45 6f   advanced, *pbEo
253a0 66 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  f is set to 0..*
253b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
253c0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
253d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
253e0 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
253f0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
25400 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
25410 20 69 6e 74 20 66 74 73 33 45 76 61 6c 49 6e 63   int fts3EvalInc
25420 72 50 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46  rPhraseNext(.  F
25430 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25450 2a 20 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e  * FTS Cursor han
25460 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72  dle */.  Fts3Phr
25470 61 73 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ase *p,         
25480 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61           /* Phra
25490 73 65 20 6f 62 6a 65 63 74 20 74 6f 20 61 64 76  se object to adv
254a0 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63  ance to next doc
254b0 69 64 20 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f  id */.  u8 *pbEo
254c0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
254d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
254e0 53 65 74 20 74 6f 20 31 20 69 66 20 45 4f 46 20  Set to 1 if EOF 
254f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
25500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74   SQLITE_OK;.  Ft
25510 73 33 44 6f 63 6c 69 73 74 20 2a 70 44 4c 20 3d  s3Doclist *pDL =
25520 20 26 70 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20   &p->doclist;.  
25530 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20  Fts3Table *pTab 
25540 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
25550 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
25560 0a 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a  .  u8 bEof = 0;.
25570 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e  .  /* This is on
25580 6c 79 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  ly called if it 
25590 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
255a0 61 74 20 74 68 65 20 70 68 72 61 73 65 20 68 61  at the phrase ha
255b0 73 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  s at least.  ** 
255c0 6f 6e 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  one incremental 
255d0 74 6f 6b 65 6e 2e 20 49 6e 20 77 68 69 63 68 20  token. In which 
255e0 63 61 73 65 20 74 68 65 20 62 49 6e 63 72 20 66  case the bIncr f
255f0 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20  lag is set. */. 
25600 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 6e 63   assert( p->bInc
25610 72 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70  r==1 );..  if( p
25620 2d 3e 6e 54 6f 6b 65 6e 3d 3d 31 20 29 7b 0a 20  ->nToken==1 ){. 
25630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
25640 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28 70  ts3MsrIncrNext(p
25650 54 61 62 2c 20 70 2d 3e 61 54 6f 6b 65 6e 5b 30  Tab, p->aToken[0
25660 5d 2e 70 53 65 67 63 73 72 2c 20 0a 20 20 20 20  ].pSegcsr, .    
25670 20 20 20 20 26 70 44 4c 2d 3e 69 44 6f 63 69 64      &pDL->iDocid
25680 2c 20 26 70 44 4c 2d 3e 70 4c 69 73 74 2c 20 26  , &pDL->pList, &
25690 70 44 4c 2d 3e 6e 4c 69 73 74 0a 20 20 20 20 29  pDL->nList.    )
256a0 3b 0a 20 20 20 20 69 66 28 20 70 44 4c 2d 3e 70  ;.    if( pDL->p
256b0 4c 69 73 74 3d 3d 30 20 29 20 62 45 6f 66 20 3d  List==0 ) bEof =
256c0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
256d0 20 69 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73   int bDescDoclis
256e0 74 20 3d 20 70 43 73 72 2d 3e 62 44 65 73 63 3b  t = pCsr->bDesc;
256f0 0a 20 20 20 20 73 74 72 75 63 74 20 54 6f 6b 65  .    struct Toke
25700 6e 44 6f 63 6c 69 73 74 20 61 5b 4d 41 58 5f 49  nDoclist a[MAX_I
25710 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45 4e  NCR_PHRASE_TOKEN
25720 53 5d 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  S];..    memset(
25730 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
25740 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
25750 3e 6e 54 6f 6b 65 6e 3c 3d 4d 41 58 5f 49 4e 43  >nToken<=MAX_INC
25760 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20  R_PHRASE_TOKENS 
25770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25780 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3c  ->iDoclistToken<
25790 4d 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f  MAX_INCR_PHRASE_
257a0 54 4f 4b 45 4e 53 20 29 3b 0a 0a 20 20 20 20 77  TOKENS );..    w
257b0 68 69 6c 65 28 20 62 45 6f 66 3d 3d 30 20 29 7b  hile( bEof==0 ){
257c0 0a 20 20 20 20 20 20 69 6e 74 20 62 4d 61 78 53  .      int bMaxS
257d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  et = 0;.      sq
257e0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 78  lite3_int64 iMax
257f0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4c 61 72   = 0;     /* Lar
25800 67 65 73 74 20 64 6f 63 69 64 20 66 6f 72 20 61  gest docid for a
25810 6c 6c 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a  ll iterators */.
25820 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
25830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25840 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
25850 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 6f 6b  rate through tok
25860 65 6e 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ens */..      /*
25870 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
25880 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 74  rator for each t
25890 6f 6b 65 6e 20 69 6e 20 74 68 65 20 70 68 72 61  oken in the phra
258a0 73 65 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  se once. */.    
258b0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
258c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
258d0 3e 6e 54 6f 6b 65 6e 20 26 26 20 62 45 6f 66 3d  >nToken && bEof=
258e0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
258f0 20 20 72 63 20 3d 20 69 6e 63 72 50 68 72 61 73    rc = incrPhras
25900 65 54 6f 6b 65 6e 4e 65 78 74 28 70 54 61 62 2c  eTokenNext(pTab,
25910 20 70 2c 20 69 2c 20 26 61 5b 69 5d 2c 20 26 62   p, i, &a[i], &b
25920 45 6f 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Eof);.        if
25930 28 20 61 5b 69 5d 2e 62 49 67 6e 6f 72 65 3d 3d  ( a[i].bIgnore==
25940 30 20 26 26 20 28 62 4d 61 78 53 65 74 3d 3d 30  0 && (bMaxSet==0
25950 20 7c 7c 20 44 4f 43 49 44 5f 43 4d 50 28 69 4d   || DOCID_CMP(iM
25960 61 78 2c 20 61 5b 69 5d 2e 69 44 6f 63 69 64 29  ax, a[i].iDocid)
25970 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <0) ){.         
25980 20 69 4d 61 78 20 3d 20 61 5b 69 5d 2e 69 44 6f   iMax = a[i].iDo
25990 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 62  cid;.          b
259a0 4d 61 78 53 65 74 20 3d 20 31 3b 0a 20 20 20 20  MaxSet = 1;.    
259b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
259c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
259d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
259e0 3e 6e 54 6f 6b 65 6e 3e 3d 31 20 26 26 20 61 5b  >nToken>=1 && a[
259f0 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e 62 49 67  p->nToken-1].bIg
25a00 6e 6f 72 65 3d 3d 30 29 20 29 3b 0a 20 20 20 20  nore==0) );.    
25a10 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
25a20 4c 49 54 45 5f 4f 4b 20 7c 7c 20 62 4d 61 78 53  LITE_OK || bMaxS
25a30 65 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  et );..      /* 
25a40 4b 65 65 70 20 61 64 76 61 6e 63 69 6e 67 20 69  Keep advancing i
25a50 74 65 72 61 74 6f 72 73 20 75 6e 74 69 6c 20 74  terators until t
25a60 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f  hey all point to
25a70 20 74 68 65 20 73 61 6d 65 20 64 6f 63 75 6d 65   the same docume
25a80 6e 74 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  nt */.      for(
25a90 69 3d 30 3b 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e  i=0; i<p->nToken
25aa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
25ab0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25ac0 45 5f 4f 4b 20 26 26 20 62 45 6f 66 3d 3d 30 20  E_OK && bEof==0 
25ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
25ae0 61 5b 69 5d 2e 62 49 67 6e 6f 72 65 3d 3d 30 20  a[i].bIgnore==0 
25af0 26 26 20 44 4f 43 49 44 5f 43 4d 50 28 61 5b 69  && DOCID_CMP(a[i
25b00 5d 2e 69 44 6f 63 69 64 2c 20 69 4d 61 78 29 3c  ].iDocid, iMax)<
25b10 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  0 .        ){.  
25b20 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
25b30 72 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74  rPhraseTokenNext
25b40 28 70 54 61 62 2c 20 70 2c 20 69 2c 20 26 61 5b  (pTab, p, i, &a[
25b50 69 5d 2c 20 26 62 45 6f 66 29 3b 0a 20 20 20 20  i], &bEof);.    
25b60 20 20 20 20 20 20 69 66 28 20 44 4f 43 49 44 5f        if( DOCID_
25b70 43 4d 50 28 61 5b 69 5d 2e 69 44 6f 63 69 64 2c  CMP(a[i].iDocid,
25b80 20 69 4d 61 78 29 3e 30 20 29 7b 0a 20 20 20 20   iMax)>0 ){.    
25b90 20 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 61          iMax = a
25ba0 5b 69 5d 2e 69 44 6f 63 69 64 3b 0a 20 20 20 20  [i].iDocid;.    
25bb0 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20          i = 0;. 
25bc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25bd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
25be0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
25bf0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
25c00 69 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 61  ies really are a
25c10 20 70 68 72 61 73 65 20 6d 61 74 63 68 20 2a 2f   phrase match */
25c20 0a 20 20 20 20 20 20 69 66 28 20 62 45 6f 66 3d  .      if( bEof=
25c30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
25c40 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
25c50 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
25c60 20 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e   a[p->nToken-1].
25c70 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 63  nList;.        c
25c80 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 20 3d 20  har *aDoclist = 
25c90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
25ca0 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20  Byte+1);.       
25cb0 20 69 66 28 20 21 61 44 6f 63 6c 69 73 74 20 29   if( !aDoclist )
25cc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25cd0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 6d 65  OMEM;.        me
25ce0 6d 63 70 79 28 61 44 6f 63 6c 69 73 74 2c 20 61  mcpy(aDoclist, a
25cf0 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e 70 4c  [p->nToken-1].pL
25d00 69 73 74 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 0a  ist, nByte+1);..
25d10 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
25d20 20 69 3c 28 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 29   i<(p->nToken-1)
25d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
25d40 20 20 69 66 28 20 61 5b 69 5d 2e 62 49 67 6e 6f    if( a[i].bIgno
25d50 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  re==0 ){.       
25d60 20 20 20 20 20 63 68 61 72 20 2a 70 4c 20 3d 20       char *pL = 
25d70 61 5b 69 5d 2e 70 4c 69 73 74 3b 0a 20 20 20 20  a[i].pList;.    
25d80 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 52          char *pR
25d90 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20   = aDoclist;.   
25da0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
25db0 4f 75 74 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a  Out = aDoclist;.
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
25dd0 6e 44 69 73 74 20 3d 20 70 2d 3e 6e 54 6f 6b 65  nDist = p->nToke
25de0 6e 2d 31 2d 69 3b 0a 20 20 20 20 20 20 20 20 20  n-1-i;.         
25df0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
25e00 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65  3PoslistPhraseMe
25e10 72 67 65 28 26 70 4f 75 74 2c 20 6e 44 69 73 74  rge(&pOut, nDist
25e20 2c 20 30 2c 20 31 2c 20 26 70 4c 2c 20 26 70 52  , 0, 1, &pL, &pR
25e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
25e40 66 28 20 72 65 73 3d 3d 30 20 29 20 62 72 65 61  f( res==0 ) brea
25e50 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  k;.            n
25e60 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 4f 75  List = (int)(pOu
25e70 74 20 2d 20 61 44 6f 63 6c 69 73 74 29 3b 0a 20  t - aDoclist);. 
25e80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25ea0 20 69 3d 3d 28 70 2d 3e 6e 54 6f 6b 65 6e 2d 31   i==(p->nToken-1
25eb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
25ec0 44 4c 2d 3e 69 44 6f 63 69 64 20 3d 20 69 4d 61  DL->iDocid = iMa
25ed0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 4c  x;.          pDL
25ee0 2d 3e 70 4c 69 73 74 20 3d 20 61 44 6f 63 6c 69  ->pList = aDocli
25ef0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  st;.          pD
25f00 4c 2d 3e 6e 4c 69 73 74 20 3d 20 6e 4c 69 73 74  L->nList = nList
25f10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 4c 2d  ;.          pDL-
25f20 3e 62 46 72 65 65 4c 69 73 74 20 3d 20 31 3b 0a  >bFreeList = 1;.
25f30 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
25f40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25f50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25f60 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  aDoclist);.     
25f70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
25f80 2a 70 62 45 6f 66 20 3d 20 62 45 6f 66 3b 0a 20  *pbEof = bEof;. 
25f90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25fa0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
25fb0 6d 6f 76 65 20 74 68 65 20 70 68 72 61 73 65 20  move the phrase 
25fc0 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
25fd0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  t to the next ma
25fe0 74 63 68 69 6e 67 20 64 6f 63 69 64 2e 20 0a 2a  tching docid. .*
25ff0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
26000 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
26010 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
26020 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
26030 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
26040 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
26050 72 65 20 69 73 20 6e 6f 20 22 6e 65 78 74 22 20  re is no "next" 
26060 65 6e 74 72 79 20 61 6e 64 20 6e 6f 20 65 72 72  entry and no err
26070 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
26080 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20 74 6f  *pbEof is set to
26090 0a 2a 2a 20 31 20 62 65 66 6f 72 65 20 72 65 74  .** 1 before ret
260a0 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  urning. Otherwis
260b0 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  e, if no error o
260c0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74  ccurs and the it
260d0 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 73 75 63  erator is.** suc
260e0 63 65 73 73 66 75 6c 6c 79 20 61 64 76 61 6e 63  cessfully advanc
260f0 65 64 2c 20 2a 70 62 45 6f 66 20 69 73 20 73 65  ed, *pbEof is se
26100 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
26110 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 50 68  c int fts3EvalPh
26120 72 61 73 65 4e 65 78 74 28 0a 20 20 46 74 73 33  raseNext(.  Fts3
26130 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
26140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26150 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65  TS Cursor handle
26160 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65   */.  Fts3Phrase
26170 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
26180 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20        /* Phrase 
26190 6f 62 6a 65 63 74 20 74 6f 20 61 64 76 61 6e 63  object to advanc
261a0 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20  e to next docid 
261b0 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66 20 20  */.  u8 *pbEof  
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
261e0 20 74 6f 20 31 20 69 66 20 45 4f 46 20 2a 2f 0a   to 1 if EOF */.
261f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 33 44  LITE_OK;.  Fts3D
26210 6f 63 6c 69 73 74 20 2a 70 44 4c 20 3d 20 26 70  oclist *pDL = &p
26220 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73  ->doclist;.  Fts
26230 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  3Table *pTab = (
26240 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
26250 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 0a 20  ->base.pVtab;.. 
26260 20 69 66 28 20 70 2d 3e 62 49 6e 63 72 20 29 7b   if( p->bIncr ){
26270 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76  .    rc = fts3Ev
26280 61 6c 49 6e 63 72 50 68 72 61 73 65 4e 65 78 74  alIncrPhraseNext
26290 28 70 43 73 72 2c 20 70 2c 20 70 62 45 6f 66 29  (pCsr, p, pbEof)
262a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
262b0 73 72 2d 3e 62 44 65 73 63 21 3d 70 54 61 62 2d  sr->bDesc!=pTab-
262c0 3e 62 44 65 73 63 49 64 78 20 26 26 20 70 44 4c  >bDescIdx && pDL
262d0 2d 3e 6e 41 6c 6c 20 29 7b 0a 20 20 20 20 73 71  ->nAll ){.    sq
262e0 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74  lite3Fts3Doclist
262f0 50 72 65 76 28 70 54 61 62 2d 3e 62 44 65 73 63  Prev(pTab->bDesc
26300 49 64 78 2c 20 70 44 4c 2d 3e 61 41 6c 6c 2c 20  Idx, pDL->aAll, 
26310 70 44 4c 2d 3e 6e 41 6c 6c 2c 20 0a 20 20 20 20  pDL->nAll, .    
26320 20 20 20 20 26 70 44 4c 2d 3e 70 4e 65 78 74 44      &pDL->pNextD
26330 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 69 44 6f 63  ocid, &pDL->iDoc
26340 69 64 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73 74 2c  id, &pDL->nList,
26350 20 70 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20   pbEof.    );.  
26360 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d 20 70    pDL->pList = p
26370 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3b 0a  DL->pNextDocid;.
26380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
26390 33 45 76 61 6c 44 6c 50 68 72 61 73 65 4e 65 78  3EvalDlPhraseNex
263a0 74 28 70 54 61 62 2c 20 70 44 4c 2c 20 70 62 45  t(pTab, pDL, pbE
263b0 6f 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  of);.  }..  retu
263c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
263d0 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f  ** If *pRc is no
263e0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  t SQLITE_OK when
263f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26400 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
26410 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
26420 72 77 69 73 65 2c 20 66 74 73 33 45 76 61 6c 50  rwise, fts3EvalP
26430 68 72 61 73 65 53 74 61 72 74 28 29 20 69 73 20  hraseStart() is 
26440 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20 70 68  called on all ph
26450 72 61 73 65 73 20 77 69 74 68 69 6e 20 74 68 65  rases within the
26460 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
26470 41 6c 73 6f 20 74 68 65 20 46 74 73 33 45 78 70  Also the Fts3Exp
26480 72 2e 62 44 65 66 65 72 72 65 64 20 76 61 72 69  r.bDeferred vari
26490 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
264a0 72 75 65 20 66 6f 72 20 61 6e 79 0a 2a 2a 20 65  rue for any.** e
264b0 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 77  xpressions for w
264c0 68 69 63 68 20 61 6c 6c 20 64 65 73 63 65 6e 64  hich all descend
264d0 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65 20 64  ent tokens are d
264e0 65 66 65 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eferred..**.** I
264f0 66 20 70 61 72 61 6d 65 74 65 72 20 62 4f 70 74  f parameter bOpt
26500 4f 6b 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  Ok is zero, then
26510 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
26520 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 46 74  d that the.** Ft
26530 73 33 50 68 72 61 73 65 2e 64 6f 63 6c 69 73 74  s3Phrase.doclist
26540 2e 61 41 6c 6c 2f 6e 41 6c 6c 20 76 61 72 69 61  .aAll/nAll varia
26550 62 6c 65 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  bles contain the
26560 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
26570 66 6f 72 0a 2a 2a 20 65 61 63 68 20 70 68 72 61  for.** each phra
26580 73 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  se in the expres
26590 73 69 6f 6e 20 28 73 75 62 6a 65 63 74 20 74 6f  sion (subject to
265a0 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20   deferred token 
265b0 70 72 6f 63 65 73 73 69 6e 67 29 2e 0a 2a 2a 20  processing)..** 
265c0 4f 72 2c 20 69 66 20 62 4f 70 74 4f 6b 20 69 73  Or, if bOptOk is
265d0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
265e0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65  one or more toke
265f0 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ns within the ex
26600 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d 61 79 20  pression.** may 
26610 62 65 20 6c 6f 61 64 65 64 20 69 6e 63 72 65 6d  be loaded increm
26620 65 6e 74 61 6c 6c 79 2c 20 6d 65 61 6e 69 6e 67  entally, meaning
26630 20 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41   doclist.aAll/nA
26640 6c 6c 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ll is not availa
26650 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ble..**.** If an
26660 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
26670 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
26680 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20  on, *pRc is set 
26690 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  to an SQLite err
266a0 6f 72 0a 2a 2a 20 63 6f 64 65 20 62 65 66 6f 72  or.** code befor
266b0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
266c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
266d0 45 76 61 6c 53 74 61 72 74 52 65 61 64 65 72 73  EvalStartReaders
266e0 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  (.  Fts3Cursor *
266f0 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
26700 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f      /* FTS Curso
26710 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  r handle */.  Ft
26720 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s3Expr *pExpr,  
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26740 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   Expression to i
26750 6e 69 74 69 61 6c 69 7a 65 20 70 68 72 61 73 65  nitialize phrase
26760 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  s in */.  int *p
26770 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
26780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
26790 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
267a0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70  */.){.  if( pExp
267b0 72 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  r && SQLITE_OK==
267c0 2a 70 52 63 20 29 7b 0a 20 20 20 20 69 66 28 20  *pRc ){.    if( 
267d0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
267e0 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 7b  SQUERY_PHRASE ){
267f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65  .      int nToke
26800 6e 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61  n = pExpr->pPhra
26810 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  se->nToken;.    
26820 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a    if( nToken ){.
26830 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
26840 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
26850 69 3c 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a  i<nToken; i++){.
26860 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
26870 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54  xpr->pPhrase->aT
26880 6f 6b 65 6e 5b 69 5d 2e 70 44 65 66 65 72 72 65  oken[i].pDeferre
26890 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
268a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
268b0 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64  pExpr->bDeferred
268c0 20 3d 20 28 69 3d 3d 6e 54 6f 6b 65 6e 29 3b 0a   = (i==nToken);.
268d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
268e0 52 63 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72  Rc = fts3EvalPhr
268f0 61 73 65 53 74 61 72 74 28 70 43 73 72 2c 20 31  aseStart(pCsr, 1
26900 2c 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  , pExpr->pPhrase
26910 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26920 20 20 20 20 66 74 73 33 45 76 61 6c 53 74 61 72      fts3EvalStar
26930 74 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70  tReaders(pCsr, p
26940 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63  Expr->pLeft, pRc
26950 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  );.      fts3Eva
26960 6c 53 74 61 72 74 52 65 61 64 65 72 73 28 70 43  lStartReaders(pC
26970 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  sr, pExpr->pRigh
26980 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 70  t, pRc);.      p
26990 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64 20  Expr->bDeferred 
269a0 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = (pExpr->pLeft-
269b0 3e 62 44 65 66 65 72 72 65 64 20 26 26 20 70 45  >bDeferred && pE
269c0 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 62 44 65  xpr->pRight->bDe
269d0 66 65 72 72 65 64 29 3b 0a 20 20 20 20 7d 0a 20  ferred);.    }. 
269e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61   }.}../*.** An a
269f0 72 72 61 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  rray of the foll
26a00 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73  owing structures
26a10 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20 61 73   is assembled as
26a20 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f   part of the pro
26a30 63 65 73 73 0a 2a 2a 20 6f 66 20 73 65 6c 65 63  cess.** of selec
26a40 74 69 6e 67 20 74 6f 6b 65 6e 73 20 74 6f 20 64  ting tokens to d
26a50 65 66 65 72 20 62 65 66 6f 72 65 20 74 68 65 20  efer before the 
26a60 71 75 65 72 79 20 73 74 61 72 74 73 20 65 78 65  query starts exe
26a70 63 75 74 69 6e 67 20 28 61 73 20 70 61 72 74 0a  cuting (as part.
26a80 2a 2a 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65  ** of the xFilte
26a90 72 28 29 20 6d 65 74 68 6f 64 29 2e 20 54 68 65  r() method). The
26aa0 72 65 20 69 73 20 6f 6e 65 20 65 6c 65 6d 65 6e  re is one elemen
26ab0 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 66  t in the array f
26ac0 6f 72 20 65 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e  or each.** token
26ad0 20 69 6e 20 74 68 65 20 46 54 53 20 65 78 70 72   in the FTS expr
26ae0 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  ession..**.** To
26af0 6b 65 6e 73 20 61 72 65 20 64 69 76 69 64 65 64  kens are divided
26b00 20 69 6e 74 6f 20 41 4e 44 2f 4e 45 41 52 20 63   into AND/NEAR c
26b10 6c 75 73 74 65 72 73 2e 20 41 6c 6c 20 74 6f 6b  lusters. All tok
26b20 65 6e 73 20 69 6e 20 61 20 63 6c 75 73 74 65 72  ens in a cluster
26b30 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 70 68   belong.** to ph
26b40 72 61 73 65 73 20 74 68 61 74 20 61 72 65 20 63  rases that are c
26b50 6f 6e 6e 65 63 74 65 64 20 6f 6e 6c 79 20 62 79  onnected only by
26b60 20 41 4e 44 20 61 6e 64 20 4e 45 41 52 20 6f 70   AND and NEAR op
26b70 65 72 61 74 6f 72 73 20 28 6e 6f 74 20 4f 52 20  erators (not OR 
26b80 6f 72 0a 2a 2a 20 4e 4f 54 29 2e 20 57 68 65 6e  or.** NOT). When
26b90 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 6f 6b   determining tok
26ba0 65 6e 73 20 74 6f 20 64 65 66 65 72 2c 20 65 61  ens to defer, ea
26bb0 63 68 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73  ch AND/NEAR clus
26bc0 74 65 72 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ter is considere
26bd0 64 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c 79 2e  d.** separately.
26be0 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 74   The root of a t
26bf0 6f 6b 65 6e 73 20 41 4e 44 2f 4e 45 41 52 20 63  okens AND/NEAR c
26c00 6c 75 73 74 65 72 20 69 73 20 73 74 6f 72 65 64  luster is stored
26c10 20 69 6e 20 0a 2a 2a 20 46 74 73 33 54 6f 6b 65   in .** Fts3Toke
26c20 6e 41 6e 64 43 6f 73 74 2e 70 52 6f 6f 74 2e 0a  nAndCost.pRoot..
26c30 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
26c40 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f  t Fts3TokenAndCo
26c50 73 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43  st Fts3TokenAndC
26c60 6f 73 74 3b 0a 73 74 72 75 63 74 20 46 74 73 33  ost;.struct Fts3
26c70 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 7b 0a 20  TokenAndCost {. 
26c80 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
26c90 72 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  rase;           
26ca0 20 2f 2a 20 54 68 65 20 70 68 72 61 73 65 20 74   /* The phrase t
26cb0 68 65 20 74 6f 6b 65 6e 20 62 65 6c 6f 6e 67 73  he token belongs
26cc0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f   to */.  int iTo
26cd0 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ken;            
26ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
26cf0 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e  tion of token in
26d00 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 46 74 73   phrase */.  Fts
26d10 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
26d20 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  oken;        /* 
26d30 54 68 65 20 74 6f 6b 65 6e 20 69 74 73 65 6c 66  The token itself
26d40 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a   */.  Fts3Expr *
26d50 70 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20  pRoot;          
26d60 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f 66        /* Root of
26d70 20 4e 45 41 52 2f 41 4e 44 20 63 6c 75 73 74 65   NEAR/AND cluste
26d80 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 76 66 6c  r */.  int nOvfl
26d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26da0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26db0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
26dc0 65 73 20 74 6f 20 6c 6f 61 64 20 64 6f 63 6c 69  es to load docli
26dd0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  st */.  int iCol
26de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26df0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
26e00 6f 6c 75 6d 6e 20 74 68 65 20 74 6f 6b 65 6e 20  olumn the token 
26e10 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 7d 3b  must match */.};
26e20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26e30 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
26e40 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 61 6c 6c   populate an all
26e50 6f 63 61 74 65 64 20 46 74 73 33 54 6f 6b 65 6e  ocated Fts3Token
26e60 41 6e 64 43 6f 73 74 20 61 72 72 61 79 2e 0a 2a  AndCost array..*
26e70 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
26e80 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
26e90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26ea0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
26eb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
26ec0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
26ed0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
26ee0 6e 67 20 65 78 65 63 75 74 69 6f 6e 2c 20 2a 70  ng execution, *p
26ef0 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 0a  Rc is set to an.
26f00 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
26f10 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
26f20 76 6f 69 64 20 66 74 73 33 45 76 61 6c 54 6f 6b  void fts3EvalTok
26f30 65 6e 43 6f 73 74 73 28 0a 20 20 46 74 73 33 43  enCosts(.  Fts3C
26f40 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
26f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
26f60 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20  S Cursor handle 
26f70 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
26f80 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
26f90 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f 66 20       /* Root of 
26fa0 63 75 72 72 65 6e 74 20 41 4e 44 2f 4e 45 41 52  current AND/NEAR
26fb0 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 46 74   cluster */.  Ft
26fc0 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s3Expr *pExpr,  
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26fe0 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63   Expression to c
26ff0 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 46 74 73  onsider */.  Fts
27000 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 2a  3TokenAndCost **
27010 70 70 54 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppTC,        /* 
27020 57 72 69 74 65 20 6e 65 77 20 65 6e 74 72 69 65  Write new entrie
27030 73 20 74 6f 20 2a 28 2a 70 70 54 43 29 2b 2b 20  s to *(*ppTC)++ 
27040 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a  */.  Fts3Expr **
27050 2a 70 70 4f 72 2c 20 20 20 20 20 20 20 20 20 20  *ppOr,          
27060 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
27070 77 20 4f 52 20 72 6f 6f 74 20 74 6f 20 2a 28 2a  w OR root to *(*
27080 70 70 4f 72 29 2b 2b 20 2a 2f 0a 20 20 69 6e 74  ppOr)++ */.  int
27090 20 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20   *pRc           
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270b0 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
270c0 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a  de */.){.  if( *
270d0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
270e0 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
270f0 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
27100 5f 50 48 52 41 53 45 20 29 7b 0a 20 20 20 20 20  _PHRASE ){.     
27110 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
27120 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50  rase = pExpr->pP
27130 68 72 61 73 65 3b 0a 20 20 20 20 20 20 69 6e 74  hrase;.      int
27140 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
27150 30 3b 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  0; *pRc==SQLITE_
27160 4f 4b 20 26 26 20 69 3c 70 50 68 72 61 73 65 2d  OK && i<pPhrase-
27170 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20  >nToken; i++){. 
27180 20 20 20 20 20 20 20 46 74 73 33 54 6f 6b 65 6e         Fts3Token
27190 41 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d 20 28  AndCost *pTC = (
271a0 2a 70 70 54 43 29 2b 2b 3b 0a 20 20 20 20 20 20  *ppTC)++;.      
271b0 20 20 70 54 43 2d 3e 70 50 68 72 61 73 65 20 3d    pTC->pPhrase =
271c0 20 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20   pPhrase;.      
271d0 20 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 20 3d 20    pTC->iToken = 
271e0 69 3b 0a 20 20 20 20 20 20 20 20 70 54 43 2d 3e  i;.        pTC->
271f0 70 52 6f 6f 74 20 3d 20 70 52 6f 6f 74 3b 0a 20  pRoot = pRoot;. 
27200 20 20 20 20 20 20 20 70 54 43 2d 3e 70 54 6f 6b         pTC->pTok
27210 65 6e 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61  en = &pPhrase->a
27220 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  Token[i];.      
27230 20 20 70 54 43 2d 3e 69 43 6f 6c 20 3d 20 70 50    pTC->iCol = pP
27240 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  hrase->iColumn;.
27250 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 73          *pRc = s
27260 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f 76 66  qlite3Fts3MsrOvf
27270 6c 28 70 43 73 72 2c 20 70 54 43 2d 3e 70 54 6f  l(pCsr, pTC->pTo
27280 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2c 20 26 70  ken->pSegcsr, &p
27290 54 43 2d 3e 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  TC->nOvfl);.    
272a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
272b0 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 21 3d  ( pExpr->eType!=
272c0 46 54 53 51 55 45 52 59 5f 4e 4f 54 20 29 7b 0a  FTSQUERY_NOT ){.
272d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
272e0 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
272f0 55 45 52 59 5f 4f 52 0a 20 20 20 20 20 20 20 20  UERY_OR.        
27300 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79     || pExpr->eTy
27310 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 41 4e 44  pe==FTSQUERY_AND
27320 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
27330 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
27340 51 55 45 52 59 5f 4e 45 41 52 0a 20 20 20 20 20  QUERY_NEAR.     
27350 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
27360 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 26  ( pExpr->pLeft &
27370 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  & pExpr->pRight 
27380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
27390 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
273a0 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  ERY_OR ){.      
273b0 20 20 70 52 6f 6f 74 20 3d 20 70 45 78 70 72 2d    pRoot = pExpr-
273c0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
273d0 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74 3b 0a  **ppOr = pRoot;.
273e0 20 20 20 20 20 20 20 20 28 2a 70 70 4f 72 29 2b          (*ppOr)+
273f0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
27400 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43 6f   fts3EvalTokenCo
27410 73 74 73 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c  sts(pCsr, pRoot,
27420 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
27430 70 54 43 2c 20 70 70 4f 72 2c 20 70 52 63 29 3b  pTC, ppOr, pRc);
27440 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
27450 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
27460 59 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  Y_OR ){.        
27470 70 52 6f 6f 74 20 3d 20 70 45 78 70 72 2d 3e 70  pRoot = pExpr->p
27480 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2a  Right;.        *
27490 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74 3b 0a 20  *ppOr = pRoot;. 
274a0 20 20 20 20 20 20 20 28 2a 70 70 4f 72 29 2b 2b         (*ppOr)++
274b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
274c0 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43 6f 73  fts3EvalTokenCos
274d0 74 73 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c 20  ts(pCsr, pRoot, 
274e0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70  pExpr->pRight, p
274f0 70 54 43 2c 20 70 70 4f 72 2c 20 70 52 63 29 3b  pTC, ppOr, pRc);
27500 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
27510 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
27520 65 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65  e average docume
27530 6e 74 20 28 72 6f 77 29 20 73 69 7a 65 20 69 6e  nt (row) size in
27540 20 70 61 67 65 73 2e 20 49 66 20 73 75 63 63 65   pages. If succe
27550 73 73 66 75 6c 2c 0a 2a 2a 20 77 72 69 74 65 20  ssful,.** write 
27560 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 2a 70  this value to *p
27570 6e 50 61 67 65 20 61 6e 64 20 72 65 74 75 72 6e  nPage and return
27580 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
27590 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a  rwise, return.**
275a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
275b0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
275c0 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e   average documen
275d0 74 20 73 69 7a 65 20 69 6e 20 70 61 67 65 73 20  t size in pages 
275e0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  is calculated by
275f0 20 66 69 72 73 74 20 63 61 6c 63 75 6c 61 74 69   first calculati
27600 6e 67 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 69  ng .** determini
27610 6e 67 20 74 68 65 20 61 76 65 72 61 67 65 20 73  ng the average s
27620 69 7a 65 20 69 6e 20 62 79 74 65 73 2c 20 42 2e  ize in bytes, B.
27630 20 49 66 20 42 20 69 73 20 6c 65 73 73 20 74 68   If B is less th
27640 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  an the amount.**
27650 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 77 69   of data that wi
27660 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ll fit on a sing
27670 6c 65 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20  le leaf page of 
27680 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  an intkey table 
27690 69 6e 0a 2a 2a 20 74 68 69 73 20 64 61 74 61 62  in.** this datab
276a0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 61 76  ase, then the av
276b0 65 72 61 67 65 20 64 6f 63 73 69 7a 65 20 69 73  erage docsize is
276c0 20 31 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69   1. Otherwise, i
276d0 74 20 69 73 20 31 20 70 6c 75 73 0a 2a 2a 20 74  t is 1 plus.** t
276e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65  he number of ove
276f0 72 66 6c 6f 77 20 70 61 67 65 73 20 63 6f 6e 73  rflow pages cons
27700 75 6d 65 64 20 62 79 20 61 20 72 65 63 6f 72 64  umed by a record
27710 20 42 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   B bytes in size
27720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27730 66 74 73 33 45 76 61 6c 41 76 65 72 61 67 65 44  fts3EvalAverageD
27740 6f 63 73 69 7a 65 28 46 74 73 33 43 75 72 73 6f  ocsize(Fts3Curso
27750 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 6e  r *pCsr, int *pn
27760 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
27770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27780 66 28 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67  f( pCsr->nRowAvg
27790 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
277a0 65 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65  e average docume
277b0 6e 74 20 73 69 7a 65 2c 20 77 68 69 63 68 20 69  nt size, which i
277c0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 61  s required to ca
277d0 6c 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74  lculate the cost
277e0 0a 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  .    ** of each 
277f0 64 6f 63 6c 69 73 74 2c 20 68 61 73 20 6e 6f 74  doclist, has not
27800 20 79 65 74 20 62 65 65 6e 20 64 65 74 65 72 6d   yet been determ
27810 69 6e 65 64 2e 20 52 65 61 64 20 74 68 65 20 72  ined. Read the r
27820 65 71 75 69 72 65 64 20 0a 20 20 20 20 2a 2a 20  equired .    ** 
27830 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 25 5f  data from the %_
27840 73 74 61 74 20 74 61 62 6c 65 20 74 6f 20 63 61  stat table to ca
27850 6c 63 75 6c 61 74 65 20 69 74 2e 0a 20 20 20 20  lculate it..    
27860 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 74 72 79 20  **.    ** Entry 
27870 30 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20  0 of the %_stat 
27880 74 61 62 6c 65 20 69 73 20 61 20 62 6c 6f 62 20  table is a blob 
27890 63 6f 6e 74 61 69 6e 69 6e 67 20 28 6e 43 6f 6c  containing (nCol
278a0 2b 31 29 20 46 54 53 33 20 0a 20 20 20 20 2a 2a  +1) FTS3 .    **
278b0 20 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20   varints, where 
278c0 6e 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62  nCol is the numb
278d0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
278e0 20 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e   the FTS3 table.
278f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
27900 74 20 76 61 72 69 6e 74 20 69 73 20 74 68 65 20  t varint is the 
27910 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
27920 6e 74 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74  nts currently st
27930 6f 72 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  ored in.    ** t
27940 68 65 20 74 61 62 6c 65 2e 20 54 68 65 20 66 6f  he table. The fo
27950 6c 6c 6f 77 69 6e 67 20 6e 43 6f 6c 20 76 61 72  llowing nCol var
27960 69 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65  ints contain the
27970 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66   total amount of
27980 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 73 74 6f  .    ** data sto
27990 72 65 64 20 69 6e 20 61 6c 6c 20 72 6f 77 73 20  red in all rows 
279a0 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  of each column o
279b0 66 20 74 68 65 20 74 61 62 6c 65 2c 20 66 72 6f  f the table, fro
279c0 6d 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 74 6f  m left.    ** to
279d0 20 72 69 67 68 74 2e 0a 20 20 20 20 2a 2f 0a 20   right..    */. 
279e0 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20     Fts3Table *p 
279f0 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 43  = (Fts3Table*)pC
27a00 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
27a10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
27a20 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 73 71 6c   *pStmt;.    sql
27a30 69 74 65 33 5f 69 6e 74 36 34 20 6e 44 6f 63 20  ite3_int64 nDoc 
27a40 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
27a50 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 30  _int64 nByte = 0
27a60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
27a70 20 2a 70 45 6e 64 3b 0a 20 20 20 20 63 6f 6e 73   *pEnd;.    cons
27a80 74 20 63 68 61 72 20 2a 61 3b 0a 0a 20 20 20 20  t char *a;..    
27a90 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
27aa0 53 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c 28 70  SelectDoctotal(p
27ab0 2c 20 26 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  , &pStmt);.    i
27ac0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27ad0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27ae0 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    a = sqlite3_co
27af0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
27b00 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
27b10 20 61 20 29 3b 0a 0a 20 20 20 20 70 45 6e 64 20   a );..    pEnd 
27b20 3d 20 26 61 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  = &a[sqlite3_col
27b30 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
27b40 20 30 29 5d 3b 0a 20 20 20 20 61 20 2b 3d 20 73   0)];.    a += s
27b50 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
27b60 69 6e 74 28 61 2c 20 26 6e 44 6f 63 29 3b 0a 20  int(a, &nDoc);. 
27b70 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64     while( a<pEnd
27b80 20 29 7b 0a 20 20 20 20 20 20 61 20 2b 3d 20 73   ){.      a += s
27b90 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
27ba0 69 6e 74 28 61 2c 20 26 6e 42 79 74 65 29 3b 0a  int(a, &nByte);.
27bb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 44      }.    if( nD
27bc0 6f 63 3d 3d 30 20 7c 7c 20 6e 42 79 74 65 3d 3d  oc==0 || nByte==
27bd0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27be0 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
27bf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 54  .      return FT
27c00 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a  S_CORRUPT_VTAB;.
27c10 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d      }..    pCsr-
27c20 3e 6e 44 6f 63 20 3d 20 6e 44 6f 63 3b 0a 20 20  >nDoc = nDoc;.  
27c30 20 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 20    pCsr->nRowAvg 
27c40 3d 20 28 69 6e 74 29 28 28 28 6e 42 79 74 65 20  = (int)(((nByte 
27c50 2f 20 6e 44 6f 63 29 20 2b 20 70 2d 3e 6e 50 67  / nDoc) + p->nPg
27c60 73 7a 29 20 2f 20 70 2d 3e 6e 50 67 73 7a 29 3b  sz) / p->nPgsz);
27c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73  .    assert( pCs
27c80 72 2d 3e 6e 52 6f 77 41 76 67 3e 30 20 29 3b 20  r->nRowAvg>0 ); 
27c90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27ca0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
27cb0 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
27cc0 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3b 0a   pCsr->nRowAvg;.
27cd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27ce0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
27cf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
27d00 20 73 65 6c 65 63 74 20 74 68 65 20 74 6f 6b 65   select the toke
27d10 6e 73 20 28 69 66 20 61 6e 79 29 20 74 68 61 74  ns (if any) that
27d20 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 64 65 66   will be .** def
27d30 65 72 72 65 64 2e 20 54 68 65 20 61 72 72 61 79  erred. The array
27d40 20 61 54 43 5b 5d 20 68 61 73 20 61 6c 72 65 61   aTC[] has alrea
27d50 64 79 20 62 65 65 6e 20 70 6f 70 75 6c 61 74 65  dy been populate
27d60 64 20 77 68 65 6e 20 74 68 69 73 20 69 73 0a 2a  d when this is.*
27d70 2a 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  * called..**.** 
27d80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
27d90 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
27da0 20 65 61 63 68 20 41 4e 44 2f 4e 45 41 52 20 63   each AND/NEAR c
27db0 6c 75 73 74 65 72 20 69 6e 20 74 68 65 20 0a 2a  luster in the .*
27dc0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 45 61  * expression. Ea
27dd0 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 64 65  ch invocation de
27de0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 74  termines which t
27df0 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65 72 20 77  okens to defer w
27e00 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 63 6c 75  ithin.** the clu
27e10 73 74 65 72 20 77 69 74 68 20 72 6f 6f 74 20 6e  ster with root n
27e20 6f 64 65 20 70 52 6f 6f 74 2e 20 53 65 65 20 63  ode pRoot. See c
27e30 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 74 68  omments above th
27e40 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a 2a 20  e definition.** 
27e50 6f 66 20 73 74 72 75 63 74 20 46 74 73 33 54 6f  of struct Fts3To
27e60 6b 65 6e 41 6e 64 43 6f 73 74 20 66 6f 72 20 6d  kenAndCost for m
27e70 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  ore details..**.
27e80 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
27e90 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
27ea0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
27eb0 20 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65   sqlite3Fts3Defe
27ec0 72 54 6f 6b 65 6e 28 29 0a 2a 2a 20 63 61 6c 6c  rToken().** call
27ed0 65 64 20 6f 6e 20 65 61 63 68 20 74 6f 6b 65 6e  ed on each token
27ee0 20 74 6f 20 64 65 66 65 72 2e 20 4f 74 68 65 72   to defer. Other
27ef0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20  wise, an SQLite 
27f00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a  error code is.**
27f10 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
27f20 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
27f30 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65 64 28  lSelectDeferred(
27f40 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
27f50 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
27f60 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72     /* FTS Cursor
27f70 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
27f80 33 45 78 70 72 20 2a 70 52 6f 6f 74 2c 20 20 20  3Expr *pRoot,   
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27fa0 43 6f 6e 73 69 64 65 72 20 74 6f 6b 65 6e 73 20  Consider tokens 
27fb0 77 69 74 68 20 74 68 69 73 20 72 6f 6f 74 20 6e  with this root n
27fc0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 6f 6b  ode */.  Fts3Tok
27fd0 65 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43 2c 20  enAndCost *aTC, 
27fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
27ff0 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
28000 74 6f 6b 65 6e 73 20 61 6e 64 20 63 6f 73 74 73  tokens and costs
28010 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 43 20 20 20   */.  int nTC   
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28040 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54  of entries in aT
28050 43 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  C[] */.){.  Fts3
28060 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
28070 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d  ts3Table *)pCsr-
28080 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69  >base.pVtab;.  i
28090 6e 74 20 6e 44 6f 63 53 69 7a 65 20 3d 20 30 3b  nt nDocSize = 0;
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
280b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
280c0 73 20 70 65 72 20 64 6f 63 20 6c 6f 61 64 65 64  s per doc loaded
280d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
280e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
280f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28100 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 69  code */.  int ii
28110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
28130 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 66  rator variable f
28140 6f 72 20 76 61 72 69 6f 75 73 20 70 75 72 70 6f  or various purpo
28150 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 76  ses */.  int nOv
28160 66 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  fl = 0;         
28170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
28180 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  l overflow pages
28190 20 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74   used by doclist
281a0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  s */.  int nToke
281b0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
281c0 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
281d0 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
281e0 20 69 6e 20 63 6c 75 73 74 65 72 20 2a 2f 0a 0a   in cluster */..
281f0 20 20 69 6e 74 20 6e 4d 69 6e 45 73 74 20 3d 20    int nMinEst = 
28200 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28210 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d    /* The minimum
28220 20 63 6f 75 6e 74 20 66 6f 72 20 61 6e 79 20 70   count for any p
28230 68 72 61 73 65 20 73 6f 20 66 61 72 2e 20 2a 2f  hrase so far. */
28240 0a 20 20 69 6e 74 20 6e 4c 6f 61 64 34 20 3d 20  .  int nLoad4 = 
28250 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
28260 20 20 20 2f 2a 20 28 50 68 72 61 73 65 73 20 74     /* (Phrases t
28270 68 61 74 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64  hat will be load
28280 65 64 29 5e 34 2e 20 2a 2f 0a 0a 20 20 2f 2a 20  ed)^4. */..  /* 
28290 54 6f 6b 65 6e 73 20 61 72 65 20 6e 65 76 65 72  Tokens are never
282a0 20 64 65 66 65 72 72 65 64 20 66 6f 72 20 46 54   deferred for FT
282b0 53 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 64  S tables created
282c0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65   using the conte
282d0 6e 74 3d 78 78 78 0a 20 20 2a 2a 20 6f 70 74 69  nt=xxx.  ** opti
282e0 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 62  on. The reason b
282f0 65 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  eing that it is 
28300 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 20 74  not guaranteed t
28310 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  hat the content.
28320 20 20 2a 2a 20 74 61 62 6c 65 20 61 63 74 75 61    ** table actua
28330 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  lly contains the
28340 20 73 61 6d 65 20 64 61 74 61 20 61 73 20 74 68   same data as th
28350 65 20 69 6e 64 65 78 2e 20 54 6f 20 70 72 65 76  e index. To prev
28360 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  ent this from.  
28370 2a 2a 20 63 61 75 73 69 6e 67 20 61 6e 79 20 70  ** causing any p
28380 72 6f 62 6c 65 6d 73 2c 20 74 68 65 20 64 65 66  roblems, the def
28390 65 72 72 65 64 20 74 6f 6b 65 6e 20 6f 70 74 69  erred token opti
283a0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  mization is comp
283b0 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 64 69 73 61  letely.  ** disa
283c0 62 6c 65 64 20 66 6f 72 20 63 6f 6e 74 65 6e 74  bled for content
283d0 3d 78 78 78 20 74 61 62 6c 65 73 2e 20 2a 2f 0a  =xxx tables. */.
283e0 20 20 69 66 28 20 70 54 61 62 2d 3e 7a 43 6f 6e    if( pTab->zCon
283f0 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 72  tentTbl ){.    r
28400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  .  }..  /* Count
28420 20 74 68 65 20 74 6f 6b 65 6e 73 20 69 6e 20 74   the tokens in t
28430 68 69 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75  his AND/NEAR clu
28440 73 74 65 72 2e 20 49 66 20 6e 6f 6e 65 20 6f 66  ster. If none of
28450 20 74 68 65 20 64 6f 63 6c 69 73 74 73 0a 20 20   the doclists.  
28460 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
28470 74 68 20 74 68 65 20 74 6f 6b 65 6e 73 20 73 70  th the tokens sp
28480 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill onto overflo
28490 77 20 70 61 67 65 73 2c 20 6f 72 20 69 66 20 74  w pages, or if t
284a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c  here is.  ** onl
284b0 79 20 31 20 74 6f 6b 65 6e 2c 20 65 78 69 74 20  y 1 token, exit 
284c0 65 61 72 6c 79 2e 20 4e 6f 20 74 6f 6b 65 6e 73  early. No tokens
284d0 20 74 6f 20 64 65 66 65 72 20 69 6e 20 74 68 69   to defer in thi
284e0 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66 6f 72  s case. */.  for
284f0 28 69 69 3d 30 3b 20 69 69 3c 6e 54 43 3b 20 69  (ii=0; ii<nTC; i
28500 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 54  i++){.    if( aT
28510 43 5b 69 69 5d 2e 70 52 6f 6f 74 3d 3d 70 52 6f  C[ii].pRoot==pRo
28520 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 4f 76 66  ot ){.      nOvf
28530 6c 20 2b 3d 20 61 54 43 5b 69 69 5d 2e 6e 4f 76  l += aTC[ii].nOv
28540 66 6c 3b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  fl;.      nToken
28550 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
28560 69 66 28 20 6e 4f 76 66 6c 3d 3d 30 20 7c 7c 20  if( nOvfl==0 || 
28570 6e 54 6f 6b 65 6e 3c 32 20 29 20 72 65 74 75 72  nToken<2 ) retur
28580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
28590 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 61 76  /* Obtain the av
285a0 65 72 61 67 65 20 64 6f 63 73 69 7a 65 20 28 69  erage docsize (i
285b0 6e 20 70 61 67 65 73 29 2e 20 2a 2f 0a 20 20 72  n pages). */.  r
285c0 63 20 3d 20 66 74 73 33 45 76 61 6c 41 76 65 72  c = fts3EvalAver
285d0 61 67 65 44 6f 63 73 69 7a 65 28 70 43 73 72 2c  ageDocsize(pCsr,
285e0 20 26 6e 44 6f 63 53 69 7a 65 29 3b 0a 20 20 61   &nDocSize);.  a
285f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
28600 45 5f 4f 4b 20 7c 7c 20 6e 44 6f 63 53 69 7a 65  E_OK || nDocSize
28610 3e 30 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49 74 65  >0 );...  /* Ite
28620 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
28630 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 69 73 20   tokens in this 
28640 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74 65 72  AND/NEAR cluster
28650 2c 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  , in ascending o
28660 72 64 65 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68  rder .  ** of th
28670 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72  e number of over
28680 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
28690 77 69 6c 6c 20 62 65 20 6c 6f 61 64 65 64 20 62  will be loaded b
286a0 79 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  y the pager laye
286b0 72 20 0a 20 20 2a 2a 20 74 6f 20 72 65 74 72 69  r .  ** to retri
286c0 65 76 65 20 74 68 65 20 65 6e 74 69 72 65 20 64  eve the entire d
286d0 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  oclist for the t
286e0 6f 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 75  oken from the fu
286f0 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 20  ll-text index.. 
28700 20 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64 6f 63   ** Load the doc
28710 6c 69 73 74 73 20 66 6f 72 20 74 6f 6b 65 6e 73  lists for tokens
28720 20 74 68 61 74 20 61 72 65 20 65 69 74 68 65 72   that are either
28730 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 61 2e  :.  **.  **   a.
28740 20 54 68 65 20 63 68 65 61 70 65 73 74 20 74 6f   The cheapest to
28750 6b 65 6e 20 69 6e 20 74 68 65 20 65 6e 74 69 72  ken in the entir
28760 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68  e query (i.e. th
28770 65 20 6f 6e 65 20 76 69 73 69 74 65 64 20 62 79  e one visited by
28780 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 66   the.  **      f
28790 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
287a0 66 20 74 68 69 73 20 6c 6f 6f 70 29 2c 20 6f 72  f this loop), or
287b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 2e 20  .  **.  **   b. 
287c0 50 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  Part of a multi-
287d0 74 6f 6b 65 6e 20 70 68 72 61 73 65 2e 0a 20 20  token phrase..  
287e0 2a 2a 0a 20 20 2a 2a 20 41 66 74 65 72 20 65 61  **.  ** After ea
287f0 63 68 20 74 6f 6b 65 6e 20 64 6f 63 6c 69 73 74  ch token doclist
28800 20 69 73 20 6c 6f 61 64 65 64 2c 20 6d 65 72 67   is loaded, merg
28810 65 20 69 74 20 77 69 74 68 20 74 68 65 20 6f 74  e it with the ot
28820 68 65 72 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  hers from the.  
28830 2a 2a 20 73 61 6d 65 20 70 68 72 61 73 65 20 61  ** same phrase a
28840 6e 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d  nd count the num
28850 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73  ber of documents
28860 20 74 68 61 74 20 74 68 65 20 6d 65 72 67 65 64   that the merged
28870 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 63 6f   doclist.  ** co
28880 6e 74 61 69 6e 73 2e 20 53 65 74 20 76 61 72 69  ntains. Set vari
28890 61 62 6c 65 20 22 6e 4d 69 6e 45 73 74 22 20 74  able "nMinEst" t
288a0 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6e  o the smallest n
288b0 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
288c0 74 73 20 69 6e 20 0a 20 20 2a 2a 20 61 6e 79 20  ts in .  ** any 
288d0 70 68 72 61 73 65 20 64 6f 63 6c 69 73 74 20 66  phrase doclist f
288e0 6f 72 20 77 68 69 63 68 20 31 20 6f 72 20 6d 6f  or which 1 or mo
288f0 72 65 20 74 6f 6b 65 6e 20 64 6f 63 6c 69 73 74  re token doclist
28900 73 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 61 64  s have been load
28910 65 64 2e 0a 20 20 2a 2a 20 4c 65 74 20 6e 4f 74  ed..  ** Let nOt
28920 68 65 72 20 62 65 20 74 68 65 20 6e 75 6d 62 65  her be the numbe
28930 72 20 6f 66 20 6f 74 68 65 72 20 70 68 72 61 73  r of other phras
28940 65 73 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  es for which it 
28950 69 73 20 63 65 72 74 61 69 6e 20 74 68 61 74 0a  is certain that.
28960 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
28970 20 74 6f 6b 65 6e 73 20 77 69 6c 6c 20 6e 6f 74   tokens will not
28980 20 62 65 20 64 65 66 65 72 72 65 64 2e 0a 20 20   be deferred..  
28990 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  **.  ** Then, fo
289a0 72 20 65 61 63 68 20 74 6f 6b 65 6e 2c 20 64 65  r each token, de
289b0 66 65 72 20 69 74 20 69 66 20 6c 6f 61 64 69 6e  fer it if loadin
289c0 67 20 74 68 65 20 64 6f 63 6c 69 73 74 20 77 6f  g the doclist wo
289d0 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 0a 20 20  uld result in.  
289e0 2a 2a 20 6c 6f 61 64 69 6e 67 20 4e 20 6f 72 20  ** loading N or 
289f0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
28a00 67 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c  ges into memory,
28a10 20 77 68 65 72 65 20 4e 20 69 73 20 63 6f 6d 70   where N is comp
28a20 75 74 65 64 20 61 73 3a 0a 20 20 2a 2a 0a 20 20  uted as:.  **.  
28a30 2a 2a 20 20 20 20 28 6e 4d 69 6e 45 73 74 20 2b  **    (nMinEst +
28a40 20 34 5e 6e 4f 74 68 65 72 20 2d 20 31 29 20 2f   4^nOther - 1) /
28a50 20 28 34 5e 6e 4f 74 68 65 72 29 0a 20 20 2a 2f   (4^nOther).  */
28a60 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
28a70 6e 54 6f 6b 65 6e 20 26 26 20 72 63 3d 3d 53 51  nToken && rc==SQ
28a80 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
28a90 20 20 20 20 69 6e 74 20 69 54 43 3b 20 20 20 20      int iTC;    
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ab0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
28ac0 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 54 43  rate through aTC
28ad0 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  [] array. */.   
28ae0 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73   Fts3TokenAndCos
28af0 74 20 2a 70 54 43 20 3d 20 30 3b 20 20 20 20 2f  t *pTC = 0;    /
28b00 2a 20 53 65 74 20 74 6f 20 63 68 65 61 70 65 73  * Set to cheapes
28b10 74 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 6b 65  t remaining toke
28b20 6e 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  n. */..    /* Se
28b30 74 20 70 54 43 20 74 6f 20 70 6f 69 6e 74 20 74  t pTC to point t
28b40 6f 20 74 68 65 20 63 68 65 61 70 65 73 74 20 72  o the cheapest r
28b50 65 6d 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 2e 20  emaining token. 
28b60 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 43 3d 30  */.    for(iTC=0
28b70 3b 20 69 54 43 3c 6e 54 43 3b 20 69 54 43 2b 2b  ; iTC<nTC; iTC++
28b80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 54 43  ){.      if( aTC
28b90 5b 69 54 43 5d 2e 70 54 6f 6b 65 6e 20 26 26 20  [iTC].pToken && 
28ba0 61 54 43 5b 69 54 43 5d 2e 70 52 6f 6f 74 3d 3d  aTC[iTC].pRoot==
28bb0 70 52 6f 6f 74 20 0a 20 20 20 20 20 20 20 26 26  pRoot .       &&
28bc0 20 28 21 70 54 43 20 7c 7c 20 61 54 43 5b 69 54   (!pTC || aTC[iT
28bd0 43 5d 2e 6e 4f 76 66 6c 3c 70 54 43 2d 3e 6e 4f  C].nOvfl<pTC->nO
28be0 76 66 6c 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  vfl) .      ){. 
28bf0 20 20 20 20 20 20 20 70 54 43 20 3d 20 26 61 54         pTC = &aT
28c00 43 5b 69 54 43 5d 3b 0a 20 20 20 20 20 20 7d 0a  C[iTC];.      }.
28c10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
28c20 28 20 70 54 43 20 29 3b 0a 0a 20 20 20 20 69 66  ( pTC );..    if
28c30 28 20 69 69 20 26 26 20 70 54 43 2d 3e 6e 4f 76  ( ii && pTC->nOv
28c40 66 6c 3e 3d 28 28 6e 4d 69 6e 45 73 74 2b 28 6e  fl>=((nMinEst+(n
28c50 4c 6f 61 64 34 2f 34 29 2d 31 29 2f 28 6e 4c 6f  Load4/4)-1)/(nLo
28c60 61 64 34 2f 34 29 29 2a 6e 44 6f 63 53 69 7a 65  ad4/4))*nDocSize
28c70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
28c80 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72 66   number of overf
28c90 6c 6f 77 20 70 61 67 65 73 20 74 6f 20 6c 6f 61  low pages to loa
28ca0 64 20 66 6f 72 20 74 68 69 73 20 28 61 6e 64 20  d for this (and 
28cb0 74 68 65 72 65 66 6f 72 65 20 61 6c 6c 0a 20 20  therefore all.  
28cc0 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
28cd0 74 29 20 74 6f 6b 65 6e 73 20 69 73 20 67 72 65  t) tokens is gre
28ce0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 65 73  ater than the es
28cf0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
28d00 66 20 70 61 67 65 73 20 0a 20 20 20 20 20 20 2a  f pages .      *
28d10 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6c  * that will be l
28d20 6f 61 64 65 64 20 69 66 20 61 6c 6c 20 73 75 62  oaded if all sub
28d30 73 65 71 75 65 6e 74 20 74 6f 6b 65 6e 73 20 61  sequent tokens a
28d40 72 65 20 64 65 66 65 72 72 65 64 2e 0a 20 20 20  re deferred..   
28d50 20 20 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 33     */.      Fts3
28d60 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
28d70 6b 65 6e 20 3d 20 70 54 43 2d 3e 70 54 6f 6b 65  ken = pTC->pToke
28d80 6e 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  n;.      rc = sq
28d90 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f  lite3Fts3DeferTo
28da0 6b 65 6e 28 70 43 73 72 2c 20 70 54 6f 6b 65 6e  ken(pCsr, pToken
28db0 2c 20 70 54 43 2d 3e 69 43 6f 6c 29 3b 0a 20 20  , pTC->iCol);.  
28dc0 20 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65      fts3SegReade
28dd0 72 43 75 72 73 6f 72 46 72 65 65 28 70 54 6f 6b  rCursorFree(pTok
28de0 65 6e 2d 3e 70 53 65 67 63 73 72 29 3b 0a 20 20  en->pSegcsr);.  
28df0 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67      pToken->pSeg
28e00 63 73 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  csr = 0;.    }el
28e10 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  se{.      /* Set
28e20 20 6e 4c 6f 61 64 34 20 74 6f 20 74 68 65 20 76   nLoad4 to the v
28e30 61 6c 75 65 20 6f 66 20 28 34 5e 6e 4f 74 68 65  alue of (4^nOthe
28e40 72 29 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  r) for the next 
28e50 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
28e60 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 2d 6c 6f  .      ** for-lo
28e70 6f 70 2e 20 45 78 63 65 70 74 2c 20 6c 69 6d 69  op. Except, limi
28e80 74 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 32  t the value to 2
28e90 5e 32 34 20 74 6f 20 70 72 65 76 65 6e 74 20 69  ^24 to prevent i
28ea0 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20 2a 2a  t from .      **
28eb0 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 74 68 65   overflowing the
28ec0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
28ed0 69 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 2e  it is stored in.
28ee0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 69   */.      if( ii
28ef0 3c 31 32 20 29 20 6e 4c 6f 61 64 34 20 3d 20 6e  <12 ) nLoad4 = n
28f00 4c 6f 61 64 34 2a 34 3b 0a 0a 20 20 20 20 20 20  Load4*4;..      
28f10 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 28 70 54  if( ii==0 || (pT
28f20 43 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b  C->pPhrase->nTok
28f30 65 6e 3e 31 20 26 26 20 69 69 21 3d 6e 54 6f 6b  en>1 && ii!=nTok
28f40 65 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  en-1) ){.       
28f50 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
28f60 69 73 20 74 68 65 20 63 68 65 61 70 65 73 74 20  is the cheapest 
28f70 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 6e 74  token in the ent
28f80 69 72 65 20 71 75 65 72 79 2c 20 6f 72 20 69 74  ire query, or it
28f90 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   is.        ** p
28fa0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 74  art of a multi-t
28fb0 6f 6b 65 6e 20 70 68 72 61 73 65 2e 20 45 69 74  oken phrase. Eit
28fc0 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 6e 74  her way, the ent
28fd0 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
28fe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 76 65  .        ** (eve
28ff0 6e 74 75 61 6c 6c 79 29 20 62 65 20 6c 6f 61 64  ntually) be load
29000 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
29010 49 74 20 6d 61 79 20 61 73 20 77 65 6c 6c 20 62  It may as well b
29020 65 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  e now. */.      
29030 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
29040 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 70 54 43 2d  n *pToken = pTC-
29050 3e 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  >pToken;.       
29060 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a   int nList = 0;.
29070 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c          char *pL
29080 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
29090 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65   rc = fts3TermSe
290a0 6c 65 63 74 28 70 54 61 62 2c 20 70 54 6f 6b 65  lect(pTab, pToke
290b0 6e 2c 20 70 54 43 2d 3e 69 43 6f 6c 2c 20 26 6e  n, pTC->iCol, &n
290c0 4c 69 73 74 2c 20 26 70 4c 69 73 74 29 3b 0a 20  List, &pList);. 
290d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
290e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
290f0 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
29100 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29120 20 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c     rc = fts3Eval
29130 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b 65 6e  PhraseMergeToken
29140 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
29150 70 54 61 62 2c 20 70 54 43 2d 3e 70 50 68 72 61  pTab, pTC->pPhra
29160 73 65 2c 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 2c  se, pTC->iToken,
29170 70 4c 69 73 74 2c 6e 4c 69 73 74 0a 20 20 20 20  pList,nList.    
29180 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29190 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
291a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
291b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
291c0 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ount;.          
291d0 6e 43 6f 75 6e 74 20 3d 20 66 74 73 33 44 6f 63  nCount = fts3Doc
291e0 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64 73 28  listCountDocids(
291f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
29200 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63  TC->pPhrase->doc
29210 6c 69 73 74 2e 61 41 6c 6c 2c 20 70 54 43 2d 3e  list.aAll, pTC->
29220 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
29230 2e 6e 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  .nAll.          
29240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29250 20 69 69 3d 3d 30 20 7c 7c 20 6e 43 6f 75 6e 74   ii==0 || nCount
29260 3c 6e 4d 69 6e 45 73 74 20 29 20 6e 4d 69 6e 45  <nMinEst ) nMinE
29270 73 74 20 3d 20 6e 43 6f 75 6e 74 3b 0a 20 20 20  st = nCount;.   
29280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29290 20 20 20 7d 0a 20 20 20 20 70 54 43 2d 3e 70 54     }.    pTC->pT
292a0 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  oken = 0;.  }.. 
292b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
292c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
292d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
292e0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78 46 69  m within the xFi
292f0 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 49 74 20  lter method. It 
29300 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a 20 74  initializes.** t
29310 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65  he full-text que
29320 72 79 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ry currently sto
29330 72 65 64 20 69 6e 20 70 43 73 72 2d 3e 70 45 78  red in pCsr->pEx
29340 70 72 2e 20 54 6f 20 69 74 65 72 61 74 65 20 74  pr. To iterate t
29350 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 72 65  hrough.** the re
29360 73 75 6c 74 73 20 6f 66 20 61 20 71 75 65 72 79  sults of a query
29370 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 64 6f 65  , the caller doe
29380 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 74 73 33  s:.**.**    fts3
29390 45 76 61 6c 53 74 61 72 74 28 70 43 73 72 29 3b  EvalStart(pCsr);
293a0 0a 2a 2a 20 20 20 20 77 68 69 6c 65 28 20 31 20  .**    while( 1 
293b0 29 7b 0a 2a 2a 20 20 20 20 20 20 66 74 73 33 45  ){.**      fts3E
293c0 76 61 6c 4e 65 78 74 28 70 43 73 72 29 3b 0a 2a  valNext(pCsr);.*
293d0 2a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  *      if( pCsr-
293e0 3e 62 45 6f 66 20 29 20 62 72 65 61 6b 3b 0a 2a  >bEof ) break;.*
293f0 2a 20 20 20 20 20 20 2e 2e 2e 20 72 65 74 75 72  *      ... retur
29400 6e 20 72 6f 77 20 70 43 73 72 2d 3e 69 50 72 65  n row pCsr->iPre
29410 76 49 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  vId to the calle
29420 72 20 2e 2e 2e 0a 2a 2a 20 20 20 20 7d 0a 2a 2f  r ....**    }.*/
29430 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
29440 45 76 61 6c 53 74 61 72 74 28 46 74 73 33 43 75  EvalStart(Fts3Cu
29450 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46  rsor *pCsr){.  F
29460 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts3Table *pTab =
29470 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
29480 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
29490 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
294a0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b  E_OK;.  int nTok
294b0 65 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f  en = 0;.  int nO
294c0 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  r = 0;..  /* All
294d0 6f 63 61 74 65 20 61 20 4d 75 6c 74 69 53 65 67  ocate a MultiSeg
294e0 52 65 61 64 65 72 20 66 6f 72 20 65 61 63 68 20  Reader for each 
294f0 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 78 70  token in the exp
29500 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 66 74  ression. */.  ft
29510 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65 52 65  s3EvalAllocateRe
29520 61 64 65 72 73 28 70 43 73 72 2c 20 70 43 73 72  aders(pCsr, pCsr
29530 2d 3e 70 45 78 70 72 2c 20 26 6e 54 6f 6b 65 6e  ->pExpr, &nToken
29540 2c 20 26 6e 4f 72 2c 20 26 72 63 29 3b 0a 0a 20  , &nOr, &rc);.. 
29550 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
29560 69 63 68 2c 20 69 66 20 61 6e 79 2c 20 74 6f 6b  ich, if any, tok
29570 65 6e 73 20 69 6e 20 74 68 65 20 65 78 70 72 65  ens in the expre
29580 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ssion should be 
29590 64 65 66 65 72 72 65 64 2e 20 2a 2f 0a 23 69 66  deferred. */.#if
295a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
295b0 42 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45  BLE_FTS4_DEFERRE
295c0 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
295d0 54 45 5f 4f 4b 20 26 26 20 6e 54 6f 6b 65 6e 3e  TE_OK && nToken>
295e0 31 20 26 26 20 70 54 61 62 2d 3e 62 46 74 73 34  1 && pTab->bFts4
295f0 20 29 7b 0a 20 20 20 20 46 74 73 33 54 6f 6b 65   ){.    Fts3Toke
29600 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43 3b 0a 20  nAndCost *aTC;. 
29610 20 20 20 46 74 73 33 45 78 70 72 20 2a 2a 61 70     Fts3Expr **ap
29620 4f 72 3b 0a 20 20 20 20 61 54 43 20 3d 20 28 46  Or;.    aTC = (F
29630 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20  ts3TokenAndCost 
29640 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
29650 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  (.        sizeof
29660 28 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73  (Fts3TokenAndCos
29670 74 29 20 2a 20 6e 54 6f 6b 65 6e 0a 20 20 20 20  t) * nToken.    
29680 20 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 45    + sizeof(Fts3E
29690 78 70 72 20 2a 29 20 2a 20 6e 4f 72 20 2a 20 32  xpr *) * nOr * 2
296a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 70 4f 72  .    );.    apOr
296b0 20 3d 20 28 46 74 73 33 45 78 70 72 20 2a 2a 29   = (Fts3Expr **)
296c0 26 61 54 43 5b 6e 54 6f 6b 65 6e 5d 3b 0a 0a 20  &aTC[nToken];.. 
296d0 20 20 20 69 66 28 20 21 61 54 43 20 29 7b 0a 20     if( !aTC ){. 
296e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
296f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
29700 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  e{.      int ii;
29710 0a 20 20 20 20 20 20 46 74 73 33 54 6f 6b 65 6e  .      Fts3Token
29720 41 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d 20 61  AndCost *pTC = a
29730 54 43 3b 0a 20 20 20 20 20 20 46 74 73 33 45 78  TC;.      Fts3Ex
29740 70 72 20 2a 2a 70 70 4f 72 20 3d 20 61 70 4f 72  pr **ppOr = apOr
29750 3b 0a 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  ;..      fts3Eva
29760 6c 54 6f 6b 65 6e 43 6f 73 74 73 28 70 43 73 72  lTokenCosts(pCsr
29770 2c 20 30 2c 20 70 43 73 72 2d 3e 70 45 78 70 72  , 0, pCsr->pExpr
29780 2c 20 26 70 54 43 2c 20 26 70 70 4f 72 2c 20 26  , &pTC, &ppOr, &
29790 72 63 29 3b 0a 20 20 20 20 20 20 6e 54 6f 6b 65  rc);.      nToke
297a0 6e 20 3d 20 28 69 6e 74 29 28 70 54 43 2d 61 54  n = (int)(pTC-aT
297b0 43 29 3b 0a 20 20 20 20 20 20 6e 4f 72 20 3d 20  C);.      nOr = 
297c0 28 69 6e 74 29 28 70 70 4f 72 2d 61 70 4f 72 29  (int)(ppOr-apOr)
297d0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
297e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
297f0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45        rc = fts3E
29800 76 61 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65  valSelectDeferre
29810 64 28 70 43 73 72 2c 20 30 2c 20 61 54 43 2c 20  d(pCsr, 0, aTC, 
29820 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20  nToken);.       
29830 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
29840 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
29850 4f 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  Or; ii++){.     
29860 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76       rc = fts3Ev
29870 61 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65 64  alSelectDeferred
29880 28 70 43 73 72 2c 20 61 70 4f 72 5b 69 69 5d 2c  (pCsr, apOr[ii],
29890 20 61 54 43 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20   aTC, nToken);. 
298a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
298b0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ..      sqlite3_
298c0 66 72 65 65 28 61 54 43 29 3b 0a 20 20 20 20 7d  free(aTC);.    }
298d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 66  .  }.#endif..  f
298e0 74 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64  ts3EvalStartRead
298f0 65 72 73 28 70 43 73 72 2c 20 70 43 73 72 2d 3e  ers(pCsr, pCsr->
29900 70 45 78 70 72 2c 20 26 72 63 29 3b 0a 20 20 72  pExpr, &rc);.  r
29910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29920 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
29930 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
29940 6f 6e 20 6c 69 73 74 20 66 6f 72 20 70 68 72 61  on list for phra
29950 73 65 20 70 50 68 72 61 73 65 2e 0a 2a 2f 0a 73  se pPhrase..*/.s
29960 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45  tatic void fts3E
29970 76 61 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f 73  valInvalidatePos
29980 6c 69 73 74 28 46 74 73 33 50 68 72 61 73 65 20  list(Fts3Phrase 
29990 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69 66 28  *pPhrase){.  if(
299a0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
299b0 74 2e 62 46 72 65 65 4c 69 73 74 20 29 7b 0a 20  t.bFreeList ){. 
299c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
299d0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
299e0 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
299f0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
29a00 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70 50 68  pList = 0;.  pPh
29a10 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c  rase->doclist.nL
29a20 69 73 74 20 3d 20 30 3b 0a 20 20 70 50 68 72 61  ist = 0;.  pPhra
29a30 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65  se->doclist.bFre
29a40 65 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eList = 0;.}../*
29a50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29a60 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65  n is called to e
29a70 64 69 74 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  dit the position
29a80 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64   list associated
29a90 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 70 68 72   with.** the phr
29aa0 61 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ase object passe
29ab0 64 20 61 73 20 74 68 65 20 66 69 66 74 68 20 61  d as the fifth a
29ac0 72 67 75 6d 65 6e 74 20 61 63 63 6f 72 64 69 6e  rgument accordin
29ad0 67 20 74 6f 20 61 20 4e 45 41 52 0a 2a 2a 20 63  g to a NEAR.** c
29ae0 6f 6e 64 69 74 69 6f 6e 2e 20 46 6f 72 20 65 78  ondition. For ex
29af0 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
29b00 20 61 62 63 20 4e 45 41 52 2f 35 20 22 64 65 66   abc NEAR/5 "def
29b10 20 67 68 69 22 0a 2a 2a 0a 2a 2a 20 50 61 72 61   ghi".**.** Para
29b20 6d 65 74 65 72 20 6e 4e 65 61 72 20 69 73 20 70  meter nNear is p
29b30 61 73 73 65 64 20 74 68 65 20 4e 45 41 52 20 64  assed the NEAR d
29b40 69 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 65  istance of the e
29b50 78 70 72 65 73 73 69 6f 6e 20 28 35 20 69 6e 0a  xpression (5 in.
29b60 2a 2a 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  ** the example a
29b70 62 6f 76 65 29 2e 20 57 68 65 6e 20 74 68 69 73  bove). When this
29b80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
29b90 6c 65 64 2c 20 2a 70 61 50 6f 73 6c 69 73 74 20  led, *paPoslist 
29ba0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
29bb0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20   position list, 
29bc0 61 6e 64 20 2a 70 6e 54 6f 6b 65 6e 20 69 73 20  and *pnToken is 
29bd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 68  the number of ph
29be0 72 61 73 65 20 74 6f 6b 65 6e 73 20 69 6e 2c 20  rase tokens in, 
29bf0 74 68 65 0a 2a 2a 20 70 68 72 61 73 65 20 6f 6e  the.** phrase on
29c00 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20   the other side 
29c10 6f 66 20 74 68 65 20 4e 45 41 52 20 6f 70 65 72  of the NEAR oper
29c20 61 74 6f 72 20 74 6f 20 70 50 68 72 61 73 65 2e  ator to pPhrase.
29c30 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a   For example,.**
29c40 20 69 66 20 70 50 68 72 61 73 65 20 72 65 66 65   if pPhrase refe
29c50 72 73 20 74 6f 20 74 68 65 20 22 64 65 66 20 67  rs to the "def g
29c60 68 69 22 20 70 68 72 61 73 65 2c 20 74 68 65 6e  hi" phrase, then
29c70 20 2a 70 61 50 6f 73 6c 69 73 74 20 70 6f 69 6e   *paPoslist poin
29c80 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 70 6f 73  ts to.** the pos
29c90 69 74 69 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63  ition list assoc
29ca0 69 61 74 65 64 20 77 69 74 68 20 70 68 72 61 73  iated with phras
29cb0 65 20 22 61 62 63 22 2e 0a 2a 2a 0a 2a 2a 20 41  e "abc"..**.** A
29cc0 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20  ll positions in 
29cd0 74 68 65 20 70 50 68 72 61 73 65 20 70 6f 73 69  the pPhrase posi
29ce0 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 61  tion list that a
29cf0 72 65 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  re not sufficien
29d00 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f 20  tly.** close to 
29d10 61 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  a position in th
29d20 65 20 2a 70 61 50 6f 73 6c 69 73 74 20 70 6f 73  e *paPoslist pos
29d30 69 74 69 6f 6e 20 6c 69 73 74 20 61 72 65 20 72  ition list are r
29d40 65 6d 6f 76 65 64 2e 20 49 66 20 74 68 69 73 0a  emoved. If this.
29d50 2a 2a 20 6c 65 61 76 65 73 20 30 20 70 6f 73 69  ** leaves 0 posi
29d60 74 69 6f 6e 73 2c 20 7a 65 72 6f 20 69 73 20 72  tions, zero is r
29d70 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
29d80 73 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  se, non-zero..**
29d90 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
29da0 6e 69 6e 67 2c 20 2a 70 61 50 6f 73 6c 69 73 74  ning, *paPoslist
29db0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
29dc0 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
29dd0 20 6c 73 69 74 20 0a 2a 2a 20 61 73 73 6f 63 69   lsit .** associ
29de0 61 74 65 64 20 77 69 74 68 20 70 50 68 72 61 73  ated with pPhras
29df0 65 2e 20 41 6e 64 20 2a 70 6e 54 6f 6b 65 6e 20  e. And *pnToken 
29e00 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
29e10 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69  mber of tokens i
29e20 6e 0a 2a 2a 20 70 50 68 72 61 73 65 2e 0a 2a 2f  n.** pPhrase..*/
29e30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
29e40 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 0a 20 20  EvalNearTrim(.  
29e50 69 6e 74 20 6e 4e 65 61 72 2c 20 20 20 20 20 20  int nNear,      
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 2f 2a 20 4e 45 41 52 20 64 69 73 74 61 6e 63 65  /* NEAR distance
29e80 2e 20 41 73 20 69 6e 20 22 4e 45 41 52 2f 6e 4e  . As in "NEAR/nN
29e90 65 61 72 22 2e 20 2a 2f 0a 20 20 63 68 61 72 20  ear". */.  char 
29ea0 2a 61 54 6d 70 2c 20 20 20 20 20 20 20 20 20 20  *aTmp,          
29eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
29ec0 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 74 6f  mporary space to
29ed0 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a   use */.  char *
29ee0 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20  *paPoslist,     
29ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
29f00 4f 55 54 3a 20 50 6f 73 69 74 69 6f 6e 20 6c 69  OUT: Position li
29f10 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54  st */.  int *pnT
29f20 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
29f30 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
29f40 54 3a 20 54 6f 6b 65 6e 73 20 69 6e 20 70 68 72  T: Tokens in phr
29f50 61 73 65 20 6f 66 20 2a 70 61 50 6f 73 6c 69 73  ase of *paPoslis
29f60 74 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73  t */.  Fts3Phras
29f70 65 20 2a 70 50 68 72 61 73 65 20 20 20 20 20 20  e *pPhrase      
29f80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 68         /* The ph
29f90 72 61 73 65 20 6f 62 6a 65 63 74 20 74 6f 20 74  rase object to t
29fa0 72 69 6d 20 74 68 65 20 64 6f 63 6c 69 73 74 20  rim the doclist 
29fb0 6f 66 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  of */.){.  int n
29fc0 50 61 72 61 6d 31 20 3d 20 6e 4e 65 61 72 20 2b  Param1 = nNear +
29fd0 20 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e   pPhrase->nToken
29fe0 3b 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d 32 20  ;.  int nParam2 
29ff0 3d 20 6e 4e 65 61 72 20 2b 20 2a 70 6e 54 6f 6b  = nNear + *pnTok
2a000 65 6e 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 0a  en;.  int nNew;.
2a010 20 20 63 68 61 72 20 2a 70 32 3b 20 0a 20 20 63    char *p2; .  c
2a020 68 61 72 20 2a 70 4f 75 74 3b 20 0a 20 20 69 6e  har *pOut; .  in
2a030 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74  t res;..  assert
2a040 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  ( pPhrase->docli
2a050 73 74 2e 70 4c 69 73 74 20 29 3b 0a 0a 20 20 70  st.pList );..  p
2a060 32 20 3d 20 70 4f 75 74 20 3d 20 70 50 68 72 61  2 = pOut = pPhra
2a070 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73  se->doclist.pLis
2a080 74 3b 0a 20 20 72 65 73 20 3d 20 66 74 73 33 50  t;.  res = fts3P
2a090 6f 73 6c 69 73 74 4e 65 61 72 4d 65 72 67 65 28  oslistNearMerge(
2a0a0 0a 20 20 20 20 26 70 4f 75 74 2c 20 61 54 6d 70  .    &pOut, aTmp
2a0b0 2c 20 6e 50 61 72 61 6d 31 2c 20 6e 50 61 72 61  , nParam1, nPara
2a0c0 6d 32 2c 20 70 61 50 6f 73 6c 69 73 74 2c 20 26  m2, paPoslist, &
2a0d0 70 32 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 65  p2.  );.  if( re
2a0e0 73 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 3d 20  s ){.    nNew = 
2a0f0 28 69 6e 74 29 28 70 4f 75 74 20 2d 20 70 50 68  (int)(pOut - pPh
2a100 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
2a110 69 73 74 29 20 2d 20 31 3b 0a 20 20 20 20 61 73  ist) - 1;.    as
2a120 73 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64  sert( pPhrase->d
2a130 6f 63 6c 69 73 74 2e 70 4c 69 73 74 5b 6e 4e 65  oclist.pList[nNe
2a140 77 5d 3d 3d 27 5c 30 27 20 29 3b 0a 20 20 20 20  w]=='\0' );.    
2a150 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 50  assert( nNew<=pP
2a160 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e  hrase->doclist.n
2a170 4c 69 73 74 20 26 26 20 6e 4e 65 77 3e 30 20 29  List && nNew>0 )
2a180 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50  ;.    memset(&pP
2a190 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
2a1a0 4c 69 73 74 5b 6e 4e 65 77 5d 2c 20 30 2c 20 70  List[nNew], 0, p
2a1b0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2a1c0 6e 4c 69 73 74 20 2d 20 6e 4e 65 77 29 3b 0a 20  nList - nNew);. 
2a1d0 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c     pPhrase->docl
2a1e0 69 73 74 2e 6e 4c 69 73 74 20 3d 20 6e 4e 65 77  ist.nList = nNew
2a1f0 3b 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74  ;.    *paPoslist
2a200 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   = pPhrase->docl
2a210 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 2a  ist.pList;.    *
2a220 70 6e 54 6f 6b 65 6e 20 3d 20 70 50 68 72 61 73  pnToken = pPhras
2a230 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 0a  e->nToken;.  }..
2a240 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
2a250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2a260 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
2a270 69 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72  if *pRc is other
2a280 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
2a290 77 68 65 6e 20 69 74 20 69 73 20 63 61 6c 6c 65  when it is calle
2a2a0 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  d..** Otherwise,
2a2b0 20 69 74 20 61 64 76 61 6e 63 65 73 20 74 68 65   it advances the
2a2c0 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
2a2d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2a2e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
2a2f0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  point to the nex
2a300 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 20 69  t matching row i
2a310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2a320 45 78 70 72 65 73 73 69 6f 6e 73 20 69 74 65 72  Expressions iter
2a330 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 6d  ate through.** m
2a340 61 74 63 68 69 6e 67 20 72 6f 77 73 20 69 6e 20  atching rows in 
2a350 64 6f 63 69 64 20 6f 72 64 65 72 2e 20 41 73 63  docid order. Asc
2a360 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 69 66 20  ending order if 
2a370 46 74 73 33 43 75 72 73 6f 72 2e 62 44 65 73 63  Fts3Cursor.bDesc
2a380 20 69 73 20 7a 65 72 6f 2c 0a 2a 2a 20 6f 72 20   is zero,.** or 
2a390 64 65 73 63 65 6e 64 69 6e 67 20 69 66 20 69 74  descending if it
2a3a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a   is non-zero..**
2a3b0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
2a3c0 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
2a3d0 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  set to an SQLite
2a3e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
2a3f0 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 73 75  erwise, if.** su
2a400 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 66 6f  ccessful, the fo
2a410 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2a420 73 20 69 6e 20 70 45 78 70 72 20 61 72 65 20 73  s in pExpr are s
2a430 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 33  et:.**.**   Fts3
2a440 45 78 70 72 2e 62 45 6f 66 20 20 20 20 20 20 20  Expr.bEof       
2a450 20 20 20 20 20 20 20 20 20 28 6e 6f 6e 2d 7a 65           (non-ze
2a460 72 6f 20 69 66 20 45 4f 46 20 2d 20 74 68 65 72  ro if EOF - ther
2a470 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77  e is no next row
2a480 29 0a 2a 2a 20 20 20 46 74 73 33 45 78 70 72 2e  ).**   Fts3Expr.
2a490 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20  iDocid          
2a4a0 20 20 20 20 28 76 61 6c 69 64 20 69 66 20 62 45      (valid if bE
2a4b0 6f 66 3d 3d 30 2e 20 54 68 65 20 64 6f 63 69 64  of==0. The docid
2a4c0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
2a4d0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ).**.** If the e
2a4e0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
2a4f0 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48  type FTSQUERY_PH
2a500 52 41 53 45 2c 20 61 6e 64 20 74 68 65 20 65 78  RASE, and the ex
2a510 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 0a  pression is not.
2a520 2a 2a 20 61 74 20 45 4f 46 2c 20 74 68 65 6e 20  ** at EOF, then 
2a530 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
2a540 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75  riables are popu
2a550 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70  lated with the p
2a560 6f 73 69 74 69 6f 6e 20 6c 69 73 74 0a 2a 2a 20  osition list.** 
2a570 66 6f 72 20 74 68 65 20 70 68 72 61 73 65 20 66  for the phrase f
2a580 6f 72 20 74 68 65 20 76 69 73 69 74 65 64 20 72  or the visited r
2a590 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54 73 33  ow:.**.**   FTs3
2a5a0 45 78 70 72 2e 70 50 68 72 61 73 65 2d 3e 64 6f  Expr.pPhrase->do
2a5b0 63 6c 69 73 74 2e 6e 4c 69 73 74 20 20 20 20 20  clist.nList     
2a5c0 20 20 20 28 6c 65 6e 67 74 68 20 6f 66 20 70 4c     (length of pL
2a5d0 69 73 74 20 69 6e 20 62 79 74 65 73 29 0a 2a 2a  ist in bytes).**
2a5e0 20 20 20 46 54 73 33 45 78 70 72 2e 70 50 68 72     FTs3Expr.pPhr
2a5f0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
2a600 73 74 20 20 20 20 20 20 20 20 28 70 6f 69 6e 74  st        (point
2a610 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  er to position l
2a620 69 73 74 29 0a 2a 2a 0a 2a 2a 20 49 74 20 73 61  ist).**.** It sa
2a630 79 73 20 61 62 6f 76 65 20 74 68 61 74 20 74 68  ys above that th
2a640 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
2a650 6e 63 65 73 20 74 68 65 20 65 78 70 72 65 73 73  nces the express
2a660 69 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78 74 0a  ion to the next.
2a670 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e  ** matching row.
2a680 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
2a690 20 74 72 75 65 2c 20 62 75 74 20 74 68 65 72 65   true, but there
2a6a0 20 61 72 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69   are the followi
2a6b0 6e 67 20 65 78 63 65 70 74 69 6f 6e 73 3a 0a 2a  ng exceptions:.*
2a6c0 2a 0a 2a 2a 20 20 20 31 2e 20 44 65 66 65 72 72  *.**   1. Deferr
2a6d0 65 64 20 74 6f 6b 65 6e 73 20 61 72 65 20 6e 6f  ed tokens are no
2a6e0 74 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  t taken into acc
2a6f0 6f 75 6e 74 2e 20 49 66 20 61 20 70 68 72 61 73  ount. If a phras
2a700 65 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 20 20  e consists.**   
2a710 20 20 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 64     entirely of d
2a720 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c 20  eferred tokens, 
2a730 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
2a740 20 6d 61 74 63 68 20 65 76 65 72 79 20 72 6f 77   match every row
2a750 20 69 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20   in.**      the 
2a760 64 62 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  db. In this case
2a770 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
2a780 73 74 20 69 73 20 6e 6f 74 20 70 6f 70 75 6c 61  st is not popula
2a790 74 65 64 20 61 74 20 61 6c 6c 2e 20 0a 2a 2a 0a  ted at all. .**.
2a7a0 2a 2a 20 20 20 20 20 20 4f 72 2c 20 69 66 20 61  **      Or, if a
2a7b0 20 70 68 72 61 73 65 20 63 6f 6e 74 61 69 6e 73   phrase contains
2a7c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 65 66   one or more def
2a7d0 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 61 6e 64  erred tokens and
2a7e0 20 6f 6e 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20   one or.**      
2a7f0 6d 6f 72 65 20 6e 6f 6e 2d 64 65 66 65 72 72 65  more non-deferre
2a800 64 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e 20 74  d tokens, then t
2a810 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
2a820 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
2a830 20 0a 2a 2a 20 20 20 20 20 20 6e 65 78 74 20 70   .**      next p
2a840 6f 73 73 69 62 6c 65 20 6d 61 74 63 68 2c 20 63  ossible match, c
2a850 6f 6e 73 69 64 65 72 69 6e 67 20 6f 6e 6c 79 20  onsidering only 
2a860 6e 6f 6e 2d 64 65 66 65 72 72 65 64 20 74 6f 6b  non-deferred tok
2a870 65 6e 73 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ens. In other.**
2a880 20 20 20 20 20 20 77 6f 72 64 73 2c 20 69 66 20        words, if 
2a890 74 68 65 20 70 68 72 61 73 65 20 69 73 20 22 41  the phrase is "A
2a8a0 20 42 20 43 22 2c 20 61 6e 64 20 22 42 22 20 69   B C", and "B" i
2a8b0 73 20 64 65 66 65 72 72 65 64 2c 20 74 68 65 20  s deferred, the 
2a8c0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20  expression.**   
2a8d0 20 20 20 69 73 20 61 64 76 61 6e 63 65 64 20 74     is advanced t
2a8e0 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74  o the next row t
2a8f0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  hat contains an 
2a900 69 6e 73 74 61 6e 63 65 20 6f 66 20 22 41 20 2a  instance of "A *
2a910 20 43 22 2c 20 0a 2a 2a 20 20 20 20 20 20 77 68   C", .**      wh
2a920 65 72 65 20 22 2a 22 20 6d 61 79 20 6d 61 74 63  ere "*" may matc
2a930 68 20 61 6e 79 20 73 69 6e 67 6c 65 20 74 6f 6b  h any single tok
2a940 65 6e 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e  en. The position
2a950 20 6c 69 73 74 20 69 6e 20 74 68 69 73 20 63 61   list in this ca
2a960 73 65 0a 2a 2a 20 20 20 20 20 20 69 73 20 70 6f  se.**      is po
2a970 70 75 6c 61 74 65 64 20 61 73 20 66 6f 72 20 22  pulated as for "
2a980 41 20 2a 20 43 22 20 62 65 66 6f 72 65 20 72 65  A * C" before re
2a990 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  turning..**.**  
2a9a0 20 32 2e 20 4e 45 41 52 20 69 73 20 74 72 65 61   2. NEAR is trea
2a9b0 74 65 64 20 61 73 20 41 4e 44 2e 20 49 66 20 74  ted as AND. If t
2a9c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
2a9d0 20 22 78 20 4e 45 41 52 20 79 22 2c 20 69 74 20   "x NEAR y", it 
2a9e0 69 73 20 0a 2a 2a 20 20 20 20 20 20 61 64 76 61  is .**      adva
2a9f0 6e 63 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  nced to point to
2aa00 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 68   the next row th
2aa10 61 74 20 6d 61 74 63 68 65 73 20 22 78 20 41 4e  at matches "x AN
2aa20 44 20 79 22 2e 0a 2a 2a 20 0a 2a 2a 20 53 65 65  D y"..** .** See
2aa30 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
2aa40 54 65 73 74 44 65 66 65 72 72 65 64 28 29 20 66  TestDeferred() f
2aa50 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 74 65  or details on te
2aa60 73 74 69 6e 67 20 69 66 20 61 20 72 6f 77 20 69  sting if a row i
2aa70 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 20 6d 61  s.** really a ma
2aa80 74 63 68 2c 20 74 61 6b 69 6e 67 20 69 6e 74 6f  tch, taking into
2aa90 20 61 63 63 6f 75 6e 74 20 64 65 66 65 72 72 65   account deferre
2aaa0 64 20 74 6f 6b 65 6e 73 20 61 6e 64 20 4e 45 41  d tokens and NEA
2aab0 52 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  R operators..*/.
2aac0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
2aad0 45 76 61 6c 4e 65 78 74 52 6f 77 28 0a 20 20 46  EvalNextRow(.  F
2aae0 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab00 2a 20 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e  * FTS Cursor han
2ab10 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70  dle */.  Fts3Exp
2ab20 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
2ab30 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
2ab40 2e 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20  . to advance to 
2ab50 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
2ab60 77 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  w */.  int *pRc 
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2ab90 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
2aba0 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
2abb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2abc0 69 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74  int bDescDoclist
2abd0 20 3d 20 70 43 73 72 2d 3e 62 44 65 73 63 3b 20   = pCsr->bDesc; 
2abe0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2abf0 62 79 20 44 4f 43 49 44 5f 43 4d 50 28 29 20 6d  by DOCID_CMP() m
2ac00 61 63 72 6f 20 2a 2f 0a 20 20 20 20 61 73 73 65  acro */.    asse
2ac10 72 74 28 20 70 45 78 70 72 2d 3e 62 45 6f 66 3d  rt( pExpr->bEof=
2ac20 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  =0 );.    pExpr-
2ac30 3e 62 53 74 61 72 74 20 3d 20 31 3b 0a 0a 20 20  >bStart = 1;..  
2ac40 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
2ac50 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  >eType ){.      
2ac60 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 4e 45  case FTSQUERY_NE
2ac70 41 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 46  AR:.      case F
2ac80 54 53 51 55 45 52 59 5f 41 4e 44 3a 20 7b 0a 20  TSQUERY_AND: {. 
2ac90 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20         Fts3Expr 
2aca0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
2acb0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 46  pLeft;.        F
2acc0 74 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 20  ts3Expr *pRight 
2acd0 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
2ace0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2acf0 20 21 70 4c 65 66 74 2d 3e 62 44 65 66 65 72 72   !pLeft->bDeferr
2ad00 65 64 20 7c 7c 20 21 70 52 69 67 68 74 2d 3e 62  ed || !pRight->b
2ad10 44 65 66 65 72 72 65 64 20 29 3b 0a 0a 20 20 20  Deferred );..   
2ad20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
2ad30 62 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20  bDeferred ){.   
2ad40 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 69 73         /* LHS is
2ad50 20 65 6e 74 69 72 65 6c 79 20 64 65 66 65 72 72   entirely deferr
2ad60 65 64 2e 20 53 6f 20 77 65 20 61 73 73 75 6d 65  ed. So we assume
2ad70 20 69 74 20 6d 61 74 63 68 65 73 20 65 76 65 72   it matches ever
2ad80 79 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20  y row..         
2ad90 20 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20   ** Advance the 
2ada0 52 48 53 20 69 74 65 72 61 74 6f 72 20 74 6f 20  RHS iterator to 
2adb0 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  find the next ro
2adc0 77 20 76 69 73 69 74 65 64 2e 20 2a 2f 0a 20 20  w visited. */.  
2add0 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2ade0 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52  NextRow(pCsr, pR
2adf0 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  ight, pRc);.    
2ae00 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f        pExpr->iDo
2ae10 63 69 64 20 3d 20 70 52 69 67 68 74 2d 3e 69 44  cid = pRight->iD
2ae20 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  ocid;.          
2ae30 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 70 52  pExpr->bEof = pR
2ae40 69 67 68 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  ight->bEof;.    
2ae50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
2ae60 69 67 68 74 2d 3e 62 44 65 66 65 72 72 65 64 20  ight->bDeferred 
2ae70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2ae80 52 48 53 20 69 73 20 65 6e 74 69 72 65 6c 79 20  RHS is entirely 
2ae90 64 65 66 65 72 72 65 64 2e 20 53 6f 20 77 65 20  deferred. So we 
2aea0 61 73 73 75 6d 65 20 69 74 20 6d 61 74 63 68 65  assume it matche
2aeb0 73 20 65 76 65 72 79 20 72 6f 77 2e 0a 20 20 20  s every row..   
2aec0 20 20 20 20 20 20 20 2a 2a 20 41 64 76 61 6e 63         ** Advanc
2aed0 65 20 74 68 65 20 4c 48 53 20 69 74 65 72 61 74  e the LHS iterat
2aee0 6f 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  or to find the n
2aef0 65 78 74 20 72 6f 77 20 76 69 73 69 74 65 64 2e  ext row visited.
2af00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74   */.          ft
2af10 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2af20 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b  sr, pLeft, pRc);
2af30 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
2af40 2d 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66 74  ->iDocid = pLeft
2af50 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ->iDocid;.      
2af60 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20      pExpr->bEof 
2af70 3d 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3b 0a 20  = pLeft->bEof;. 
2af80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2af90 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68          /* Neith
2afa0 65 72 20 74 68 65 20 52 48 53 20 6f 72 20 4c 48  er the RHS or LH
2afb0 53 20 61 72 65 20 64 65 66 65 72 72 65 64 2e 20  S are deferred. 
2afc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  */.          fts
2afd0 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2afe0 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a  r, pLeft, pRc);.
2aff0 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
2b000 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2b010 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
2b020 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 21          while( !
2b030 70 4c 65 66 74 2d 3e 62 45 6f 66 20 26 26 20 21  pLeft->bEof && !
2b040 70 52 69 67 68 74 2d 3e 62 45 6f 66 20 26 26 20  pRight->bEof && 
2b050 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
2b060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b070 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 69  qlite3_int64 iDi
2b080 66 66 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28 70  ff = DOCID_CMP(p
2b090 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52  Left->iDocid, pR
2b0a0 69 67 68 74 2d 3e 69 44 6f 63 69 64 29 3b 0a 20  ight->iDocid);. 
2b0b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2b0c0 44 69 66 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Diff==0 ) break;
2b0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b0e0 20 69 44 69 66 66 3c 30 20 29 7b 0a 20 20 20 20   iDiff<0 ){.    
2b0f0 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
2b100 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2b110 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20  pLeft, pRc);.   
2b120 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
2b140 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2b150 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29  sr, pRight, pRc)
2b160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2b170 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b180 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f        pExpr->iDo
2b190 63 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69 44 6f  cid = pLeft->iDo
2b1a0 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  cid;.          p
2b1b0 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 28 70 4c  Expr->bEof = (pL
2b1c0 65 66 74 2d 3e 62 45 6f 66 20 7c 7c 20 70 52 69  eft->bEof || pRi
2b1d0 67 68 74 2d 3e 62 45 6f 66 29 3b 0a 20 20 20 20  ght->bEof);.    
2b1e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
2b1f0 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
2b200 5f 4e 45 41 52 20 26 26 20 70 45 78 70 72 2d 3e  _NEAR && pExpr->
2b210 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20  bEof ){.        
2b220 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
2b230 68 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  ht->eType==FTSQU
2b240 45 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20  ERY_PHRASE );.  
2b250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52            if( pR
2b260 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64  ight->pPhrase->d
2b270 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20  oclist.aAll ){. 
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73               Fts
2b290 33 44 6f 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20  3Doclist *pDl = 
2b2a0 26 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65  &pRight->pPhrase
2b2b0 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20  ->doclist;.     
2b2c0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2b2d0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
2b2e0 26 26 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 3d  && pRight->bEof=
2b2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b300 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 44 6c        memset(pDl
2b310 2d 3e 70 4c 69 73 74 2c 20 30 2c 20 70 44 6c 2d  ->pList, 0, pDl-
2b320 3e 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  >nList);.       
2b330 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
2b340 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2b350 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20  Right, pRc);.   
2b360 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b380 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
2b390 2d 3e 70 50 68 72 61 73 65 20 26 26 20 70 4c 65  ->pPhrase && pLe
2b3a0 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63  ft->pPhrase->doc
2b3b0 6c 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20 20 20  list.aAll ){.   
2b3c0 20 20 20 20 20 20 20 20 20 20 20 46 74 73 33 44             Fts3D
2b3d0 6f 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20 26 70  oclist *pDl = &p
2b3e0 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64  Left->pPhrase->d
2b3f0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  oclist;.        
2b400 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 52        while( *pR
2b410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b420 70 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 29  pLeft->bEof==0 )
2b430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b440 20 20 6d 65 6d 73 65 74 28 70 44 6c 2d 3e 70 4c    memset(pDl->pL
2b450 69 73 74 2c 20 30 2c 20 70 44 6c 2d 3e 6e 4c 69  ist, 0, pDl->nLi
2b460 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
2b470 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78       fts3EvalNex
2b480 74 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74  tRow(pCsr, pLeft
2b490 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20  , pRc);.        
2b4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b4c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b4d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b4e0 20 7d 0a 20 20 0a 20 20 20 20 20 20 63 61 73 65   }.  .      case
2b4f0 20 46 54 53 51 55 45 52 59 5f 4f 52 3a 20 7b 0a   FTSQUERY_OR: {.
2b500 20 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72          Fts3Expr
2b510 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
2b520 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
2b530 46 74 73 33 45 78 70 72 20 2a 70 52 69 67 68 74  Fts3Expr *pRight
2b540 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
2b550 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b560 33 5f 69 6e 74 36 34 20 69 43 6d 70 20 3d 20 44  3_int64 iCmp = D
2b570 4f 43 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d 3e  OCID_CMP(pLeft->
2b580 69 44 6f 63 69 64 2c 20 70 52 69 67 68 74 2d 3e  iDocid, pRight->
2b590 69 44 6f 63 69 64 29 3b 0a 0a 20 20 20 20 20 20  iDocid);..      
2b5a0 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d    assert( pLeft-
2b5b0 3e 62 53 74 61 72 74 20 7c 7c 20 70 4c 65 66 74  >bStart || pLeft
2b5c0 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 69 67 68 74  ->iDocid==pRight
2b5d0 2d 3e 69 44 6f 63 69 64 20 29 3b 0a 20 20 20 20  ->iDocid );.    
2b5e0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
2b5f0 68 74 2d 3e 62 53 74 61 72 74 20 7c 7c 20 70 4c  ht->bStart || pL
2b600 65 66 74 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 69  eft->iDocid==pRi
2b610 67 68 74 2d 3e 69 44 6f 63 69 64 20 29 3b 0a 0a  ght->iDocid );..
2b620 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
2b630 68 74 2d 3e 62 45 6f 66 20 7c 7c 20 28 70 4c 65  ht->bEof || (pLe
2b640 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 69  ft->bEof==0 && i
2b650 43 6d 70 3c 30 29 20 29 7b 0a 20 20 20 20 20 20  Cmp<0) ){.      
2b660 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74      fts3EvalNext
2b670 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c  Row(pCsr, pLeft,
2b680 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   pRc);.        }
2b690 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e  else if( pLeft->
2b6a0 62 45 6f 66 20 7c 7c 20 69 43 6d 70 3e 30 20 29  bEof || iCmp>0 )
2b6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
2b6c0 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2b6d0 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a  , pRight, pRc);.
2b6e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b6f0 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
2b700 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2b710 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  Left, pRc);.    
2b720 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65        fts3EvalNe
2b730 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52 69 67  xtRow(pCsr, pRig
2b740 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20  ht, pRc);.      
2b750 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 45 78    }..        pEx
2b760 70 72 2d 3e 62 45 6f 66 20 3d 20 28 70 4c 65 66  pr->bEof = (pLef
2b770 74 2d 3e 62 45 6f 66 20 26 26 20 70 52 69 67 68  t->bEof && pRigh
2b780 74 2d 3e 62 45 6f 66 29 3b 0a 20 20 20 20 20 20  t->bEof);.      
2b790 20 20 69 43 6d 70 20 3d 20 44 4f 43 49 44 5f 43    iCmp = DOCID_C
2b7a0 4d 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64  MP(pLeft->iDocid
2b7b0 2c 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64  , pRight->iDocid
2b7c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2b7d0 52 69 67 68 74 2d 3e 62 45 6f 66 20 7c 7c 20 28  Right->bEof || (
2b7e0 70 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 26  pLeft->bEof==0 &
2b7f0 26 20 20 69 43 6d 70 3c 30 29 20 29 7b 0a 20 20  &  iCmp<0) ){.  
2b800 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2b810 44 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69  Docid = pLeft->i
2b820 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Docid;.        }
2b830 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b840 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20  pExpr->iDocid = 
2b850 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 3b 0a  pRight->iDocid;.
2b860 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2b870 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b880 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  }..      case FT
2b890 53 51 55 45 52 59 5f 4e 4f 54 3a 20 7b 0a 20 20  SQUERY_NOT: {.  
2b8a0 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20 2a        Fts3Expr *
2b8b0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
2b8c0 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 46 74  Left;.        Ft
2b8d0 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d  s3Expr *pRight =
2b8e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
2b8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69  .        if( pRi
2b900 67 68 74 2d 3e 62 53 74 61 72 74 3d 3d 30 20 29  ght->bStart==0 )
2b910 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  {.          fts3
2b920 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2b930 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a  , pRight, pRc);.
2b940 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b950 28 20 2a 70 52 63 21 3d 53 51 4c 49 54 45 5f 4f  ( *pRc!=SQLITE_O
2b960 4b 20 7c 7c 20 70 52 69 67 68 74 2d 3e 62 53 74  K || pRight->bSt
2b970 61 72 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  art );.        }
2b980 0a 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76  ..        fts3Ev
2b990 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2b9a0 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20  pLeft, pRc);.   
2b9b0 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
2b9c0 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bEof==0 ){.     
2b9d0 20 20 20 20 20 77 68 69 6c 65 28 20 21 2a 70 52       while( !*pR
2b9e0 63 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c .             
2b9f0 20 26 26 20 21 70 52 69 67 68 74 2d 3e 62 45 6f   && !pRight->bEo
2ba00 66 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f .             
2ba10 20 26 26 20 44 4f 43 49 44 5f 43 4d 50 28 70 4c   && DOCID_CMP(pL
2ba20 65 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52 69  eft->iDocid, pRi
2ba30 67 68 74 2d 3e 69 44 6f 63 69 64 29 3e 30 20 0a  ght->iDocid)>0 .
2ba40 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2ba50 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
2ba60 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2ba70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20  Right, pRc);.   
2ba80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ba90 20 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72   }.        pExpr
2baa0 2d 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66 74  ->iDocid = pLeft
2bab0 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ->iDocid;.      
2bac0 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20    pExpr->bEof = 
2bad0 70 4c 65 66 74 2d 3e 62 45 6f 66 3b 0a 20 20 20  pLeft->bEof;.   
2bae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2baf0 20 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75    }..      defau
2bb00 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 46 74  lt: {.        Ft
2bb10 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
2bb20 65 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61  e = pExpr->pPhra
2bb30 73 65 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33  se;.        fts3
2bb40 45 76 61 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f  EvalInvalidatePo
2bb50 73 6c 69 73 74 28 70 50 68 72 61 73 65 29 3b 0a  slist(pPhrase);.
2bb60 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 66          *pRc = f
2bb70 74 73 33 45 76 61 6c 50 68 72 61 73 65 4e 65 78  ts3EvalPhraseNex
2bb80 74 28 70 43 73 72 2c 20 70 50 68 72 61 73 65 2c  t(pCsr, pPhrase,
2bb90 20 26 70 45 78 70 72 2d 3e 62 45 6f 66 29 3b 0a   &pExpr->bEof);.
2bba0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2bbb0 44 6f 63 69 64 20 3d 20 70 50 68 72 61 73 65 2d  Docid = pPhrase-
2bbc0 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 3b  >doclist.iDocid;
2bbd0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2bbe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bbf0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  }.}../*.** If *p
2bc00 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
2bc10 5f 4f 4b 2c 20 6f 72 20 69 66 20 70 45 78 70 72  _OK, or if pExpr
2bc20 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
2bc30 20 6e 6f 64 65 20 6f 66 20 61 20 4e 45 41 52 0a   node of a NEAR.
2bc40 2a 2a 20 63 6c 75 73 74 65 72 2c 20 74 68 65 6e  ** cluster, then
2bc50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2bc60 65 74 75 72 6e 73 20 31 20 69 6d 6d 65 64 69 61  eturns 1 immedia
2bc70 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  tely..**.** Othe
2bc80 72 77 69 73 65 2c 20 69 74 20 63 68 65 63 6b 73  rwise, it checks
2bc90 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2bca0 72 6f 77 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  row really does 
2bcb0 6d 61 74 63 68 20 74 68 65 20 4e 45 41 52 20 0a  match the NEAR .
2bcc0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 75  ** expression, u
2bcd0 73 69 6e 67 20 74 68 65 20 64 61 74 61 20 63 75  sing the data cu
2bce0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
2bcf0 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  n the position l
2bd00 69 73 74 73 20 0a 2a 2a 20 28 46 74 73 33 45 78  ists .** (Fts3Ex
2bd10 70 72 2d 3e 70 50 68 72 61 73 65 2e 64 6f 63 6c  pr->pPhrase.docl
2bd20 69 73 74 2e 70 4c 69 73 74 2f 6e 4c 69 73 74 29  ist.pList/nList)
2bd30 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73 65   for each phrase
2bd40 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
2bd50 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
2bd60 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
2bd70 20 61 20 6d 61 74 63 68 2c 20 74 68 65 20 70 6f   a match, the po
2bd80 73 69 74 69 6f 6e 20 6c 69 73 74 20 61 73 73 6f  sition list asso
2bd90 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
2bda0 0a 2a 2a 20 70 68 72 61 73 65 20 69 6e 20 74 68  .** phrase in th
2bdb0 65 20 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f  e NEAR expressio
2bdc0 6e 20 69 73 20 65 64 69 74 65 64 20 69 6e 20 70  n is edited in p
2bdd0 6c 61 63 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  lace to contain 
2bde0 6f 6e 6c 79 20 74 68 6f 73 65 0a 2a 2a 20 70 68  only those.** ph
2bdf0 72 61 73 65 20 69 6e 73 74 61 6e 63 65 73 20 73  rase instances s
2be00 75 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73  ufficiently clos
2be10 65 20 74 6f 20 74 68 65 69 72 20 70 65 65 72 73  e to their peers
2be20 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
2be30 4e 45 41 52 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  NEAR.** constrai
2be40 6e 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  nts. In this cas
2be50 65 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20  e it returns 1. 
2be60 49 66 20 74 68 65 20 4e 45 41 52 20 65 78 70 72  If the NEAR expr
2be70 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
2be80 0a 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 63 75  .** match the cu
2be90 72 72 65 6e 74 20 72 6f 77 2c 20 30 20 69 73 20  rrent row, 0 is 
2bea0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 70 6f  returned. The po
2beb0 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 6d 61 79  sition lists may
2bec0 20 6f 72 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62   or may not.** b
2bed0 65 20 65 64 69 74 65 64 20 69 66 20 30 20 69 73  e edited if 0 is
2bee0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2bef0 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
2bf00 6c 4e 65 61 72 54 65 73 74 28 46 74 73 33 45 78  lNearTest(Fts3Ex
2bf10 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a  pr *pExpr, int *
2bf20 70 52 63 29 7b 0a 20 20 69 6e 74 20 72 65 73 20  pRc){.  int res 
2bf30 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  = 1;..  /* The f
2bf40 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 72  ollowing block r
2bf50 75 6e 73 20 69 66 20 70 45 78 70 72 20 69 73 20  uns if pExpr is 
2bf60 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 4e 45  the root of a NE
2bf70 41 52 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 46  AR query..  ** F
2bf80 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
2bf90 71 75 65 72 79 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  query:.  **.  **
2bfa0 20 20 20 20 20 20 20 20 20 22 77 22 20 4e 45 41           "w" NEA
2bfb0 52 20 22 78 22 20 4e 45 41 52 20 22 79 22 20 4e  R "x" NEAR "y" N
2bfc0 45 41 52 20 22 7a 22 0a 20 20 2a 2a 0a 20 20 2a  EAR "z".  **.  *
2bfd0 2a 20 77 68 69 63 68 20 69 73 20 72 65 70 72 65  * which is repre
2bfe0 73 65 6e 74 65 64 20 69 6e 20 74 72 65 65 20 66  sented in tree f
2bff0 6f 72 6d 20 61 73 3a 0a 20 20 2a 2a 0a 20 20 2a  orm as:.  **.  *
2c000 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c020 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  |.  **          
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c040 2b 2d 2d 4e 45 41 52 2d 2d 2b 20 20 20 20 20 20  +--NEAR--+      
2c050 3c 2d 2d 20 72 6f 6f 74 20 6f 66 20 4e 45 41 52  <-- root of NEAR
2c060 20 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 20   query.  **     
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c080 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 7c 0a       |        |.
2c090 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
2c0a0 20 20 20 20 20 20 20 20 20 2b 2d 2d 4e 45 41 52           +--NEAR
2c0b0 2d 2d 2b 20 20 20 22 7a 22 0a 20 20 2a 2a 20 20  --+   "z".  **  
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0d0 20 20 20 7c 20 20 20 20 20 20 20 20 7c 0a 20 20     |        |.  
2c0e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2c0f0 20 20 2b 2d 2d 4e 45 41 52 2d 2d 2b 20 20 20 22    +--NEAR--+   "
2c100 79 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  y".  **         
2c110 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
2c120 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  |.  **          
2c130 20 20 20 20 20 22 77 22 20 20 20 20 20 20 22 78       "w"      "x
2c140 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ".  **.  ** The 
2c150 72 69 67 68 74 2d 68 61 6e 64 20 63 68 69 6c 64  right-hand child
2c160 20 6f 66 20 61 20 4e 45 41 52 20 6e 6f 64 65 20   of a NEAR node 
2c170 69 73 20 61 6c 77 61 79 73 20 61 20 70 68 72 61  is always a phra
2c180 73 65 2e 20 54 68 65 20 0a 20 20 2a 2a 20 6c 65  se. The .  ** le
2c190 66 74 2d 68 61 6e 64 20 63 68 69 6c 64 20 6d 61  ft-hand child ma
2c1a0 79 20 62 65 20 65 69 74 68 65 72 20 61 20 70 68  y be either a ph
2c1b0 72 61 73 65 20 6f 72 20 61 20 4e 45 41 52 20 6e  rase or a NEAR n
2c1c0 6f 64 65 2e 20 54 68 65 72 65 20 61 72 65 0a 20  ode. There are. 
2c1d0 20 2a 2a 20 6e 6f 20 65 78 63 65 70 74 69 6f 6e   ** no exception
2c1e0 73 20 74 6f 20 74 68 69 73 20 2d 20 69 74 27 73  s to this - it's
2c1f0 20 74 68 65 20 77 61 79 20 74 68 65 20 70 61 72   the way the par
2c200 73 65 72 20 69 6e 20 66 74 73 33 5f 65 78 70 72  ser in fts3_expr
2c210 2e 63 20 77 6f 72 6b 73 2e 0a 20 20 2a 2f 0a 20  .c works..  */. 
2c220 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
2c230 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 45 78 70  E_OK .   && pExp
2c240 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
2c250 52 59 5f 4e 45 41 52 20 0a 20 20 20 26 26 20 28  RY_NEAR .   && (
2c260 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3d 3d  pExpr->pParent==
2c270 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50 61 72  0 || pExpr->pPar
2c280 65 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51  ent->eType!=FTSQ
2c290 55 45 52 59 5f 4e 45 41 52 29 0a 20 20 29 7b 0a  UERY_NEAR).  ){.
2c2a0 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 3b      Fts3Expr *p;
2c2b0 20 0a 20 20 20 20 69 6e 74 20 6e 54 6d 70 20 3d   .    int nTmp =
2c2c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2c2d0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
2c2e0 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20  temp space */.  
2c2f0 20 20 63 68 61 72 20 2a 61 54 6d 70 3b 20 20 20    char *aTmp;   
2c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c310 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
2c320 72 20 50 6f 73 6c 69 73 74 4e 65 61 72 4d 65 72  r PoslistNearMer
2c330 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ge() */..    /* 
2c340 41 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72 61  Allocate tempora
2c350 72 79 20 77 6f 72 6b 69 6e 67 20 73 70 61 63 65  ry working space
2c360 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70  . */.    for(p=p
2c370 45 78 70 72 3b 20 70 2d 3e 70 4c 65 66 74 3b 20  Expr; p->pLeft; 
2c380 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20 20 20  p=p->pLeft){.   
2c390 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
2c3a0 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64  ight->pPhrase->d
2c3b0 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3e 30 20 29  oclist.nList>0 )
2c3c0 3b 0a 20 20 20 20 20 20 6e 54 6d 70 20 2b 3d 20  ;.      nTmp += 
2c3d0 70 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68 72 61  p->pRight->pPhra
2c3e0 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73  se->doclist.nLis
2c3f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 54 6d  t;.    }.    nTm
2c400 70 20 2b 3d 20 70 2d 3e 70 50 68 72 61 73 65 2d  p += p->pPhrase-
2c410 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3b 0a  >doclist.nList;.
2c420 20 20 20 20 61 54 6d 70 20 3d 20 73 71 6c 69 74      aTmp = sqlit
2c430 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 6d 70 2a 32  e3_malloc(nTmp*2
2c440 29 3b 0a 20 20 20 20 69 66 28 20 21 61 54 6d 70  );.    if( !aTmp
2c450 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
2c460 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c470 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20       res = 0;.  
2c480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2c490 68 61 72 20 2a 61 50 6f 73 6c 69 73 74 20 3d 20  har *aPoslist = 
2c4a0 70 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  p->pPhrase->docl
2c4b0 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ist.pList;.     
2c4c0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 70 2d   int nToken = p-
2c4d0 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e  >pPhrase->nToken
2c4e0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ;..      for(p=p
2c4f0 2d 3e 70 50 61 72 65 6e 74 3b 72 65 73 20 26 26  ->pParent;res &&
2c500 20 70 20 26 26 20 70 2d 3e 65 54 79 70 65 3d 3d   p && p->eType==
2c510 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3b 20 70  FTSQUERY_NEAR; p
2c520 3d 70 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20 20  =p->pParent){.  
2c530 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65        Fts3Phrase
2c540 20 2a 70 50 68 72 61 73 65 20 3d 20 70 2d 3e 70   *pPhrase = p->p
2c550 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 3b 0a  Right->pPhrase;.
2c560 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 61          int nNea
2c570 72 20 3d 20 70 2d 3e 6e 4e 65 61 72 3b 0a 20 20  r = p->nNear;.  
2c580 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 33        res = fts3
2c590 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 6e 4e 65  EvalNearTrim(nNe
2c5a0 61 72 2c 20 61 54 6d 70 2c 20 26 61 50 6f 73 6c  ar, aTmp, &aPosl
2c5b0 69 73 74 2c 20 26 6e 54 6f 6b 65 6e 2c 20 70 50  ist, &nToken, pP
2c5c0 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  hrase);.      }.
2c5d0 0a 20 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20  .      aPoslist 
2c5e0 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d  = pExpr->pRight-
2c5f0 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73  >pPhrase->doclis
2c600 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e  t.pList;.      n
2c610 54 6f 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70  Token = pExpr->p
2c620 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e  Right->pPhrase->
2c630 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 66 6f  nToken;.      fo
2c640 72 28 70 3d 70 45 78 70 72 2d 3e 70 4c 65 66 74  r(p=pExpr->pLeft
2c650 3b 20 70 20 26 26 20 72 65 73 3b 20 70 3d 70 2d  ; p && res; p=p-
2c660 3e 70 4c 65 66 74 29 7b 0a 20 20 20 20 20 20 20  >pLeft){.       
2c670 20 69 6e 74 20 6e 4e 65 61 72 3b 0a 20 20 20 20   int nNear;.    
2c680 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a      Fts3Phrase *
2c690 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20  pPhrase;.       
2c6a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72   assert( p->pPar
2c6b0 65 6e 74 20 26 26 20 70 2d 3e 70 50 61 72 65 6e  ent && p->pParen
2c6c0 74 2d 3e 70 4c 65 66 74 3d 3d 70 20 29 3b 0a 20  t->pLeft==p );. 
2c6d0 20 20 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 70         nNear = p
2c6e0 2d 3e 70 50 61 72 65 6e 74 2d 3e 6e 4e 65 61 72  ->pParent->nNear
2c6f0 3b 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73  ;.        pPhras
2c700 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20  e = (.          
2c710 20 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51    p->eType==FTSQ
2c720 55 45 52 59 5f 4e 45 41 52 20 3f 20 70 2d 3e 70  UERY_NEAR ? p->p
2c730 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 20 3a  Right->pPhrase :
2c740 20 70 2d 3e 70 50 68 72 61 73 65 0a 20 20 20 20   p->pPhrase.    
2c750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72      );.        r
2c760 65 73 20 3d 20 66 74 73 33 45 76 61 6c 4e 65 61  es = fts3EvalNea
2c770 72 54 72 69 6d 28 6e 4e 65 61 72 2c 20 61 54 6d  rTrim(nNear, aTm
2c780 70 2c 20 26 61 50 6f 73 6c 69 73 74 2c 20 26 6e  p, &aPoslist, &n
2c790 54 6f 6b 65 6e 2c 20 70 50 68 72 61 73 65 29 3b  Token, pPhrase);
2c7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2c7b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c7c0 28 61 54 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 72  (aTmp);.  }..  r
2c7d0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
2c7e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2c7f0 6e 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 75  n is a helper fu
2c800 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74  nction for sqlit
2c810 65 33 46 74 73 33 45 76 61 6c 54 65 73 74 44 65  e3Fts3EvalTestDe
2c820 66 65 72 72 65 64 28 29 2e 0a 2a 2a 20 41 73 73  ferred()..** Ass
2c830 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f  uming no error o
2c840 63 63 75 72 73 20 6f 72 20 68 61 73 20 6f 63 63  ccurs or has occ
2c850 75 72 72 65 64 2c 20 49 74 20 72 65 74 75 72 6e  urred, It return
2c860 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2c870 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
2c880 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2c890 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 61  cond argument ma
2c8a0 74 63 68 65 73 20 74 68 65 20 72 6f 77 20 74 68  tches the row th
2c8b0 61 74 20 70 43 73 72 20 0a 2a 2a 20 63 75 72 72  at pCsr .** curr
2c8c0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c  ently points to,
2c8d0 20 6f 72 20 7a 65 72 6f 20 69 66 20 69 74 20 64   or zero if it d
2c8e0 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
2c8f0 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2c900 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
2c910 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2c920 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2c930 2d 6f 70 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  -op..** If an er
2c940 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
2c950 67 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  g execution of t
2c960 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70  his function, *p
2c970 52 63 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  Rc is set to .**
2c980 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2c990 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2c9a0 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2c9b0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
2c9c0 6c 75 65 20 69 73 20 0a 2a 2a 20 75 6e 64 65 66  lue is .** undef
2c9d0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
2c9e0 69 6e 74 20 66 74 73 33 45 76 61 6c 54 65 73 74  int fts3EvalTest
2c9f0 45 78 70 72 28 0a 20 20 46 74 73 33 43 75 72 73  Expr(.  Fts3Curs
2ca00 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
2ca10 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 63          /* FTS c
2ca20 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a  ursor handle */.
2ca30 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70    Fts3Expr *pExp
2ca40 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2ca50 20 20 2f 2a 20 45 78 70 72 20 74 6f 20 74 65 73    /* Expr to tes
2ca60 74 2e 20 4d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  t. May or may no
2ca70 74 20 62 65 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20  t be root. */.  
2ca80 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
2ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2caa0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
2cab0 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   code */.){.  in
2cac0 74 20 62 48 69 74 20 3d 20 31 3b 20 20 20 20 20  t bHit = 1;     
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cae0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
2caf0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
2cb00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77  ITE_OK ){.    sw
2cb10 69 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79  itch( pExpr->eTy
2cb20 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
2cb30 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3a 0a   FTSQUERY_NEAR:.
2cb40 20 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55        case FTSQU
2cb50 45 52 59 5f 41 4e 44 3a 0a 20 20 20 20 20 20 20  ERY_AND:.       
2cb60 20 62 48 69 74 20 3d 20 28 0a 20 20 20 20 20 20   bHit = (.      
2cb70 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 54 65        fts3EvalTe
2cb80 73 74 45 78 70 72 28 70 43 73 72 2c 20 70 45 78  stExpr(pCsr, pEx
2cb90 70 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 0a  pr->pLeft, pRc).
2cba0 20 20 20 20 20 20 20 20 20 26 26 20 66 74 73 33           && fts3
2cbb0 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73  EvalTestExpr(pCs
2cbc0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
2cbd0 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 20  , pRc).         
2cbe0 26 26 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54  && fts3EvalNearT
2cbf0 65 73 74 28 70 45 78 70 72 2c 20 70 52 63 29 0a  est(pExpr, pRc).
2cc00 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20          );..    
2cc10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4e 45      /* If the NE
2cc20 41 52 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  AR expression do
2cc30 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
2cc40 20 72 6f 77 73 2c 20 7a 65 72 6f 20 74 68 65 20   rows, zero the 
2cc50 64 6f 63 6c 69 73 74 20 66 6f 72 20 0a 20 20 20  doclist for .   
2cc60 20 20 20 20 20 2a 2a 20 61 6c 6c 20 70 68 72 61       ** all phra
2cc70 73 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ses involved in 
2cc80 74 68 65 20 4e 45 41 52 2e 20 54 68 69 73 20 69  the NEAR. This i
2cc90 73 20 62 65 63 61 75 73 65 20 74 68 65 20 73 6e  s because the sn
2cca0 69 70 70 65 74 28 29 2c 0a 20 20 20 20 20 20 20  ippet(),.       
2ccb0 20 2a 2a 20 6f 66 66 73 65 74 73 28 29 20 61 6e   ** offsets() an
2ccc0 64 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75  d matchinfo() fu
2ccd0 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  nctions are not 
2cce0 73 75 70 70 6f 73 65 64 20 74 6f 20 72 65 63 6f  supposed to reco
2ccf0 67 6e 69 7a 65 20 0a 20 20 20 20 20 20 20 20 2a  gnize .        *
2cd00 2a 20 61 6e 79 20 69 6e 73 74 61 6e 63 65 73 20  * any instances 
2cd10 6f 66 20 70 68 72 61 73 65 73 20 74 68 61 74 20  of phrases that 
2cd20 61 72 65 20 70 61 72 74 20 6f 66 20 75 6e 6d 61  are part of unma
2cd30 74 63 68 65 64 20 4e 45 41 52 20 71 75 65 72 69  tched NEAR queri
2cd40 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es. .        ** 
2cd50 46 6f 72 20 65 78 61 6d 70 6c 65 20 69 66 20 74  For example if t
2cd60 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  his expression:.
2cd70 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2cd80 20 20 20 2a 2a 20 20 20 20 2e 2e 2e 20 4d 41 54     **    ... MAT
2cd90 43 48 20 27 61 20 4f 52 20 28 62 20 4e 45 41 52  CH 'a OR (b NEAR
2cda0 20 63 29 27 0a 20 20 20 20 20 20 20 20 2a 2a 0a   c)'.        **.
2cdb0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61          ** is ma
2cdc0 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 61 20  tched against a 
2cdd0 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 3a 0a  row containing:.
2cde0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2cdf0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 27 61 20     **        'a 
2ce00 62 20 64 20 65 27 0a 20 20 20 20 20 20 20 20 2a  b d e'.        *
2ce10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
2ce20 6e 20 61 6e 79 20 73 6e 69 70 70 65 74 28 29 20  n any snippet() 
2ce30 73 68 6f 75 6c 64 20 6f 6e 79 20 68 69 67 68 6c  should ony highl
2ce40 69 67 68 74 20 74 68 65 20 22 61 22 20 74 65 72  ight the "a" ter
2ce50 6d 2c 20 6e 6f 74 20 74 68 65 20 22 62 22 0a 20  m, not the "b". 
2ce60 20 20 20 20 20 20 20 2a 2a 20 28 61 73 20 22 62         ** (as "b
2ce70 22 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e  " is part of a n
2ce80 6f 6e 2d 6d 61 74 63 68 69 6e 67 20 4e 45 41 52  on-matching NEAR
2ce90 20 63 6c 61 75 73 65 29 2e 0a 20 20 20 20 20 20   clause)..      
2cea0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2ceb0 20 62 48 69 74 3d 3d 30 20 0a 20 20 20 20 20 20   bHit==0 .      
2cec0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 65 54 79     && pExpr->eTy
2ced0 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
2cee0 52 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  R .         && (
2cef0 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3d 3d  pExpr->pParent==
2cf00 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50 61 72  0 || pExpr->pPar
2cf10 65 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51  ent->eType!=FTSQ
2cf20 55 45 52 59 5f 4e 45 41 52 29 0a 20 20 20 20 20  UERY_NEAR).     
2cf30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2cf40 46 74 73 33 45 78 70 72 20 2a 70 3b 0a 20 20 20  Fts3Expr *p;.   
2cf50 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70 45 78         for(p=pEx
2cf60 70 72 3b 20 70 2d 3e 70 50 68 72 61 73 65 3d 3d  pr; p->pPhrase==
2cf70 30 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a  0; p=p->pLeft){.
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cf90 70 2d 3e 70 52 69 67 68 74 2d 3e 69 44 6f 63 69  p->pRight->iDoci
2cfa0 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64  d==pCsr->iPrevId
2cfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cfc0 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69    fts3EvalInvali
2cfd0 64 61 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e 70  datePoslist(p->p
2cfe0 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 29 3b  Right->pPhrase);
2cff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d000 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d010 20 20 20 20 20 69 66 28 20 70 2d 3e 69 44 6f 63       if( p->iDoc
2d020 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49  id==pCsr->iPrevI
2d030 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
2d040 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64   fts3EvalInvalid
2d050 61 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e 70 50  atePoslist(p->pP
2d060 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  hrase);.        
2d070 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
2d080 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2d090 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45       case FTSQUE
2d0a0 52 59 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 20  RY_OR: {.       
2d0b0 20 69 6e 74 20 62 48 69 74 31 20 3d 20 66 74 73   int bHit1 = fts
2d0c0 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43  3EvalTestExpr(pC
2d0d0 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  sr, pExpr->pLeft
2d0e0 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20  , pRc);.        
2d0f0 69 6e 74 20 62 48 69 74 32 20 3d 20 66 74 73 33  int bHit2 = fts3
2d100 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73  EvalTestExpr(pCs
2d110 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
2d120 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20  , pRc);.        
2d130 62 48 69 74 20 3d 20 62 48 69 74 31 20 7c 7c 20  bHit = bHit1 || 
2d140 62 48 69 74 32 3b 0a 20 20 20 20 20 20 20 20 62  bHit2;.        b
2d150 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
2d160 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45       case FTSQUE
2d170 52 59 5f 4e 4f 54 3a 0a 20 20 20 20 20 20 20 20  RY_NOT:.        
2d180 62 48 69 74 20 3d 20 28 0a 20 20 20 20 20 20 20  bHit = (.       
2d190 20 20 20 20 20 66 74 73 33 45 76 61 6c 54 65 73       fts3EvalTes
2d1a0 74 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70  tExpr(pCsr, pExp
2d1b0 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 0a 20  r->pLeft, pRc). 
2d1c0 20 20 20 20 20 20 20 20 26 26 20 21 66 74 73 33          && !fts3
2d1d0 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73  EvalTestExpr(pCs
2d1e0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
2d1f0 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 29  , pRc).        )
2d200 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2d210 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
2d220 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   {.#ifndef SQLIT
2d230 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44  E_DISABLE_FTS4_D
2d240 45 46 45 52 52 45 44 0a 20 20 20 20 20 20 20 20  EFERRED.        
2d250 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72  if( pCsr->pDefer
2d260 72 65 64 20 0a 20 20 20 20 20 20 20 20 20 26 26  red .         &&
2d270 20 28 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 3d   (pExpr->iDocid=
2d280 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20 7c  =pCsr->iPrevId |
2d290 7c 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72  | pExpr->bDeferr
2d2a0 65 64 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ed).        ){. 
2d2b0 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72           Fts3Phr
2d2c0 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
2d2d0 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20  Expr->pPhrase;. 
2d2e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d2f0 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65   pExpr->bDeferre
2d300 64 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 64 6f  d || pPhrase->do
2d310 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 3d  clist.bFreeList=
2d320 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2d330 69 66 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65  if( pExpr->bDefe
2d340 72 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rred ){.        
2d350 20 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61      fts3EvalInva
2d360 6c 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50  lidatePoslist(pP
2d370 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  hrase);.        
2d380 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 70    }.          *p
2d390 52 63 20 3d 20 66 74 73 33 45 76 61 6c 44 65 66  Rc = fts3EvalDef
2d3a0 65 72 72 65 64 50 68 72 61 73 65 28 70 43 73 72  erredPhrase(pCsr
2d3b0 2c 20 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20  , pPhrase);.    
2d3c0 20 20 20 20 20 20 62 48 69 74 20 3d 20 28 70 50        bHit = (pP
2d3d0 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
2d3e0 4c 69 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  List!=0);.      
2d3f0 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69      pExpr->iDoci
2d400 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49  d = pCsr->iPrevI
2d410 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
2d420 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
2d430 7b 0a 20 20 20 20 20 20 20 20 20 20 62 48 69 74  {.          bHit
2d440 20 3d 20 28 70 45 78 70 72 2d 3e 62 45 6f 66 3d   = (pExpr->bEof=
2d450 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 44 6f  =0 && pExpr->iDo
2d460 63 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76  cid==pCsr->iPrev
2d470 49 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Id);.        }. 
2d480 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2d490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2d4a0 20 20 72 65 74 75 72 6e 20 62 48 69 74 3b 0a 7d    return bHit;.}
2d4b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2d4c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2d4d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
2d4e0 72 74 20 6f 66 20 65 61 63 68 20 78 4e 65 78 74  rt of each xNext
2d4f0 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e 0a   operation when.
2d500 2a 2a 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  ** iterating thr
2d510 6f 75 67 68 20 74 68 65 20 72 65 73 75 6c 74 73  ough the results
2d520 20 6f 66 20 61 20 66 75 6c 6c 2d 74 65 78 74 20   of a full-text 
2d530 71 75 65 72 79 2e 20 41 74 20 74 68 69 73 20 70  query. At this p
2d540 6f 69 6e 74 20 74 68 65 0a 2a 2a 20 63 75 72 73  oint the.** curs
2d550 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 72  or points to a r
2d560 6f 77 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ow that matches 
2d570 74 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73  the query expres
2d580 73 69 6f 6e 2c 20 77 69 74 68 20 74 68 65 0a 2a  sion, with the.*
2d590 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 76 65  * following cave
2d5a0 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 55  ats:.**.**   * U
2d5b0 70 20 75 6e 74 69 6c 20 74 68 69 73 20 70 6f 69  p until this poi
2d5c0 6e 74 2c 20 22 4e 45 41 52 22 20 6f 70 65 72 61  nt, "NEAR" opera
2d5d0 74 6f 72 73 20 69 6e 20 74 68 65 20 65 78 70 72  tors in the expr
2d5e0 65 73 73 69 6f 6e 20 68 61 76 65 20 62 65 65 6e  ession have been
2d5f0 0a 2a 2a 20 20 20 20 20 74 72 65 61 74 65 64 20  .**     treated 
2d600 61 73 20 22 41 4e 44 22 2e 0a 2a 2a 0a 2a 2a 20  as "AND"..**.** 
2d610 20 20 2a 20 44 65 66 65 72 72 65 64 20 74 6f 6b    * Deferred tok
2d620 65 6e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ens have not yet
2d630 20 62 65 65 6e 20 63 6f 6e 73 69 64 65 72 65 64   been considered
2d640 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
2d650 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
2d660 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2d670 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2d680 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  t immediately.**
2d690 20 72 65 74 75 72 6e 73 20 30 2e 20 4f 74 68 65   returns 0. Othe
2d6a0 72 77 69 73 65 2c 20 69 74 20 74 65 73 74 73 20  rwise, it tests 
2d6b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2d6c0 66 74 65 72 20 63 6f 6e 73 69 64 65 72 69 6e 67  fter considering
2d6d0 20 4e 45 41 52 0a 2a 2a 20 6f 70 65 72 61 74 6f   NEAR.** operato
2d6e0 72 73 20 61 6e 64 20 64 65 66 65 72 72 65 64 20  rs and deferred 
2d6f0 74 6f 6b 65 6e 73 20 74 68 65 20 63 75 72 72 65  tokens the curre
2d700 6e 74 20 72 6f 77 20 69 73 20 73 74 69 6c 6c 20  nt row is still 
2d710 61 20 6d 61 74 63 68 20 66 6f 72 20 74 68 65 0a  a match for the.
2d720 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49  ** expression. I
2d730 74 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 62  t returns 1 if b
2d740 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  oth of the follo
2d750 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
2d760 2a 0a 2a 2a 20 20 20 31 2e 20 2a 70 52 63 20 69  *.**   1. *pRc i
2d770 73 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  s SQLITE_OK when
2d780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2d790 65 74 75 72 6e 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  eturns, and.**.*
2d7a0 2a 20 20 20 32 2e 20 41 66 74 65 72 20 73 63 61  *   2. After sca
2d7b0 6e 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  nning the curren
2d7c0 74 20 46 54 53 20 74 61 62 6c 65 20 72 6f 77 20  t FTS table row 
2d7d0 66 6f 72 20 74 68 65 20 64 65 66 65 72 72 65 64  for the deferred
2d7e0 20 74 6f 6b 65 6e 73 2c 0a 2a 2a 20 20 20 20 20   tokens,.**     
2d7f0 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
2d800 64 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 64  d that the row d
2d810 6f 65 73 20 2a 6e 6f 74 2a 20 6d 61 74 63 68 20  oes *not* match 
2d820 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  the query..**.**
2d830 20 4f 72 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72   Or, if no error
2d840 20 6f 63 63 75 72 73 20 61 6e 64 20 69 74 20 73   occurs and it s
2d850 65 65 6d 73 20 74 68 65 20 63 75 72 72 65 6e 74  eems the current
2d860 20 72 6f 77 20 64 6f 65 73 20 6d 61 74 63 68 20   row does match 
2d870 74 68 65 20 46 54 53 0a 2a 2a 20 71 75 65 72 79  the FTS.** query
2d880 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69  , return 0..*/.i
2d890 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 76  nt sqlite3Fts3Ev
2d8a0 61 6c 54 65 73 74 44 65 66 65 72 72 65 64 28 46  alTestDeferred(F
2d8b0 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
2d8c0 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e   int *pRc){.  in
2d8d0 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69  t rc = *pRc;.  i
2d8e0 6e 74 20 62 4d 69 73 73 20 3d 20 30 3b 0a 20 20  nt bMiss = 0;.  
2d8f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d900 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K ){..    /* If 
2d910 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
2d920 20 6d 6f 72 65 20 64 65 66 65 72 72 65 64 20 74   more deferred t
2d930 6f 6b 65 6e 73 2c 20 6c 6f 61 64 20 74 68 65 20  okens, load the 
2d940 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 74 6f  current row into
2d950 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  .    ** memory a
2d960 6e 64 20 73 63 61 6e 20 69 74 20 74 6f 20 64 65  nd scan it to de
2d970 74 65 72 6d 69 6e 65 20 74 68 65 20 70 6f 73 69  termine the posi
2d980 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 65 61  tion list for ea
2d990 63 68 20 64 65 66 65 72 72 65 64 0a 20 20 20 20  ch deferred.    
2d9a0 2a 2a 20 74 6f 6b 65 6e 2e 20 54 68 65 6e 2c 20  ** token. Then, 
2d9b0 73 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20  see if this row 
2d9c0 69 73 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63  is really a matc
2d9d0 68 2c 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 64  h, considering d
2d9e0 65 66 65 72 72 65 64 0a 20 20 20 20 2a 2a 20 74  eferred.    ** t
2d9f0 6f 6b 65 6e 73 20 61 6e 64 20 4e 45 41 52 20 6f  okens and NEAR o
2da00 70 65 72 61 74 6f 72 73 20 28 6e 65 69 74 68 65  perators (neithe
2da10 72 20 6f 66 20 77 68 69 63 68 20 77 65 72 65 20  r of which were 
2da20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75  taken into accou
2da30 6e 74 0a 20 20 20 20 2a 2a 20 65 61 72 6c 69 65  nt.    ** earlie
2da40 72 2c 20 62 79 20 66 74 73 33 45 76 61 6c 4e 65  r, by fts3EvalNe
2da50 78 74 52 6f 77 28 29 29 2e 20 0a 20 20 20 20 2a  xtRow()). .    *
2da60 2f 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e  /.    if( pCsr->
2da70 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20  pDeferred ){.   
2da80 20 20 20 72 63 20 3d 20 66 74 73 33 43 75 72 73     rc = fts3Curs
2da90 6f 72 53 65 65 6b 28 30 2c 20 70 43 73 72 29 3b  orSeek(0, pCsr);
2daa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2dab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2dad0 46 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65  Fts3CacheDeferre
2dae0 64 44 6f 63 6c 69 73 74 73 28 70 43 73 72 29 3b  dDoclists(pCsr);
2daf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2db00 20 20 20 62 4d 69 73 73 20 3d 20 28 30 3d 3d 66     bMiss = (0==f
2db10 74 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28  ts3EvalTestExpr(
2db20 70 43 73 72 2c 20 70 43 73 72 2d 3e 70 45 78 70  pCsr, pCsr->pExp
2db30 72 2c 20 26 72 63 29 29 3b 0a 0a 20 20 20 20 2f  r, &rc));..    /
2db40 2a 20 46 72 65 65 20 74 68 65 20 70 6f 73 69 74  * Free the posit
2db50 69 6f 6e 2d 6c 69 73 74 73 20 61 63 63 75 6d 75  ion-lists accumu
2db60 6c 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 64  lated for each d
2db70 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 61 62  eferred token ab
2db80 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ove. */.    sqli
2db90 74 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72  te3Fts3FreeDefer
2dba0 72 65 64 44 6f 63 6c 69 73 74 73 28 70 43 73 72  redDoclists(pCsr
2dbb0 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  );.    *pRc = rc
2dbc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
2dbd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2dbe0 20 62 4d 69 73 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   bMiss);.}../*.*
2dbf0 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
2dc00 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 74   next document t
2dc10 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20  hat matches the 
2dc20 46 54 53 20 65 78 70 72 65 73 73 69 6f 6e 20 69  FTS expression i
2dc30 6e 0a 2a 2a 20 46 74 73 33 43 75 72 73 6f 72 2e  n.** Fts3Cursor.
2dc40 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  pExpr..*/.static
2dc50 20 69 6e 74 20 66 74 73 33 45 76 61 6c 4e 65 78   int fts3EvalNex
2dc60 74 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43  t(Fts3Cursor *pC
2dc70 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  sr){.  int rc = 
2dc80 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2dc90 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2dca0 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 45   Code */.  Fts3E
2dcb0 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 73  xpr *pExpr = pCs
2dcc0 72 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  r->pExpr;.  asse
2dcd0 72 74 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d  rt( pCsr->isEof=
2dce0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
2dcf0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 73 72  r==0 ){.    pCsr
2dd00 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  ->isEof = 1;.  }
2dd10 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
2dd20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69       if( pCsr->i
2dd30 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20  sRequireSeek==0 
2dd40 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2dd50 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70  e3_reset(pCsr->p
2dd60 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Stmt);.      }. 
2dd70 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2dd80 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
2dd90 70 43 73 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20  pCsr->pStmt)==0 
2dda0 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  );.      fts3Eva
2ddb0 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2ddc0 45 78 70 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  Expr, &rc);.    
2ddd0 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
2dde0 70 45 78 70 72 2d 3e 62 45 6f 66 3b 0a 20 20 20  pExpr->bEof;.   
2ddf0 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69     pCsr->isRequi
2de00 72 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20  reSeek = 1;.    
2de10 20 20 70 43 73 72 2d 3e 69 73 4d 61 74 63 68 69    pCsr->isMatchi
2de20 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b 0a 20  nfoNeeded = 1;. 
2de30 20 20 20 20 20 70 43 73 72 2d 3e 69 50 72 65 76       pCsr->iPrev
2de40 49 64 20 3d 20 70 45 78 70 72 2d 3e 69 44 6f 63  Id = pExpr->iDoc
2de50 69 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  id;.    }while( 
2de60 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20 26  pCsr->isEof==0 &
2de70 26 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61  & sqlite3Fts3Eva
2de80 6c 54 65 73 74 44 65 66 65 72 72 65 64 28 70 43  lTestDeferred(pC
2de90 73 72 2c 20 26 72 63 29 20 29 3b 0a 20 20 7d 0a  sr, &rc) );.  }.
2dea0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
2deb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 61 73  he cursor is pas
2dec0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2ded0 20 64 6f 63 69 64 20 72 61 6e 67 65 20 73 70 65   docid range spe
2dee0 63 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 46  cified.  ** by F
2def0 74 73 33 43 75 72 73 6f 72 2e 69 4d 69 6e 44 6f  ts3Cursor.iMinDo
2df00 63 69 64 2f 69 4d 61 78 44 6f 63 69 64 2e 20 49  cid/iMaxDocid. I
2df10 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 45 4f  f so, set the EO
2df20 46 20 66 6c 61 67 2e 20 20 2a 2f 0a 20 20 69 66  F flag.  */.  if
2df30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2df40 26 26 20 28 0a 20 20 20 20 20 20 20 20 28 70 43  && (.        (pC
2df50 73 72 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26 20  sr->bDesc==0 && 
2df60 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3e 70 43  pCsr->iPrevId>pC
2df70 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 29 0a 20  sr->iMaxDocid). 
2df80 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 62 44      || (pCsr->bD
2df90 65 73 63 21 3d 30 20 26 26 20 70 43 73 72 2d 3e  esc!=0 && pCsr->
2dfa0 69 50 72 65 76 49 64 3c 70 43 73 72 2d 3e 69 4d  iPrevId<pCsr->iM
2dfb0 69 6e 44 6f 63 69 64 29 0a 20 20 29 29 7b 0a 20  inDocid).  )){. 
2dfc0 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d     pCsr->isEof =
2dfd0 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
2dfe0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2dff0 65 73 74 61 72 74 20 69 6e 74 65 72 61 74 69 6f  estart interatio
2e000 6e 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  n for expression
2e010 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74   pExpr so that t
2e020 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a  he next call to.
2e030 2a 2a 20 66 74 73 33 45 76 61 6c 4e 65 78 74 28  ** fts3EvalNext(
2e040 29 20 76 69 73 69 74 73 20 74 68 65 20 66 69 72  ) visits the fir
2e050 73 74 20 72 6f 77 2e 20 44 6f 20 6e 6f 74 20 61  st row. Do not a
2e060 6c 6c 6f 77 20 69 6e 63 72 65 6d 65 6e 74 61 6c  llow incremental
2e070 20 0a 2a 2a 20 6c 6f 61 64 69 6e 67 20 6f 72 20   .** loading or 
2e080 6d 65 72 67 69 6e 67 20 6f 66 20 70 68 72 61 73  merging of phras
2e090 65 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 74  e doclists for t
2e0a0 68 69 73 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a  his iteration..*
2e0b0 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
2e0c0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
2e0d0 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
2e0e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2e0f0 64 2c 20 69 74 20 69 73 0a 2a 2a 20 61 20 6e 6f  d, it is.** a no
2e100 2d 6f 70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  -op. If an error
2e110 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
2e120 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70  his function, *p
2e130 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 0a  Rc is set to an.
2e140 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
2e150 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75  code before retu
2e160 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
2e170 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c 52 65   void fts3EvalRe
2e180 73 74 61 72 74 28 0a 20 20 46 74 73 33 43 75 72  start(.  Fts3Cur
2e190 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20 46 74 73  sor *pCsr,.  Fts
2e1a0 33 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20  3Expr *pExpr,.  
2e1b0 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69 66  int *pRc.){.  if
2e1c0 28 20 70 45 78 70 72 20 26 26 20 2a 70 52 63 3d  ( pExpr && *pRc=
2e1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e1e0 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50    Fts3Phrase *pP
2e1f0 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70  hrase = pExpr->p
2e200 50 68 72 61 73 65 3b 0a 0a 20 20 20 20 69 66 28  Phrase;..    if(
2e210 20 70 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20   pPhrase ){.    
2e220 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69    fts3EvalInvali
2e230 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72  datePoslist(pPhr
2e240 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ase);.      if( 
2e250 70 50 68 72 61 73 65 2d 3e 62 49 6e 63 72 20 29  pPhrase->bIncr )
2e260 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
2e270 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2e280 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f  ; i<pPhrase->nTo
2e290 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ken; i++){.     
2e2a0 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54       Fts3PhraseT
2e2b0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
2e2c0 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b  pPhrase->aToken[
2e2d0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  i];.          as
2e2e0 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44  sert( pToken->pD
2e2f0 65 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20  eferred==0 );.  
2e300 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b          if( pTok
2e310 65 6e 2d 3e 70 53 65 67 63 73 72 20 29 7b 0a 20  en->pSegcsr ){. 
2e320 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e330 65 33 46 74 73 33 4d 73 72 49 6e 63 72 52 65 73  e3Fts3MsrIncrRes
2e340 74 61 72 74 28 70 54 6f 6b 65 6e 2d 3e 70 53 65  tart(pToken->pSe
2e350 67 63 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20  gcsr);.         
2e360 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e370 20 20 20 20 20 2a 70 52 63 20 3d 20 66 74 73 33       *pRc = fts3
2e380 45 76 61 6c 50 68 72 61 73 65 53 74 61 72 74 28  EvalPhraseStart(
2e390 70 43 73 72 2c 20 30 2c 20 70 50 68 72 61 73 65  pCsr, 0, pPhrase
2e3a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e3b0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
2e3c0 74 2e 70 4e 65 78 74 44 6f 63 69 64 20 3d 20 30  t.pNextDocid = 0
2e3d0 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
2e3e0 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 20  >doclist.iDocid 
2e3f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 68 72 61  = 0;.      pPhra
2e400 73 65 2d 3e 70 4f 72 50 6f 73 6c 69 73 74 20 3d  se->pOrPoslist =
2e410 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   0;.    }..    p
2e420 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30  Expr->iDocid = 0
2e430 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f  ;.    pExpr->bEo
2e440 66 20 3d 20 30 3b 0a 20 20 20 20 70 45 78 70 72  f = 0;.    pExpr
2e450 2d 3e 62 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20  ->bStart = 0;.. 
2e460 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74 61     fts3EvalResta
2e470 72 74 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  rt(pCsr, pExpr->
2e480 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20  pLeft, pRc);.   
2e490 20 66 74 73 33 45 76 61 6c 52 65 73 74 61 72 74   fts3EvalRestart
2e4a0 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52  (pCsr, pExpr->pR
2e4b0 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 7d 0a  ight, pRc);.  }.
2e4c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 66 74 65 72 20 61  }../*.** After a
2e4d0 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 46 74  llocating the Ft
2e4e0 73 33 45 78 70 72 2e 61 4d 49 5b 5d 20 61 72 72  s3Expr.aMI[] arr
2e4f0 61 79 20 66 6f 72 20 65 61 63 68 20 70 68 72 61  ay for each phra
2e500 73 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 65 78  se in the .** ex
2e510 70 72 65 73 73 69 6f 6e 20 72 6f 6f 74 65 64 20  pression rooted 
2e520 61 74 20 70 45 78 70 72 2c 20 74 68 65 20 63 75  at pExpr, the cu
2e530 72 73 6f 72 20 69 74 65 72 61 74 65 73 20 74 68  rsor iterates th
2e540 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6d  rough all rows m
2e550 61 74 63 68 65 64 0a 2a 2a 20 62 79 20 70 45 78  atched.** by pEx
2e560 70 72 2c 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  pr, calling this
2e570 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
2e580 63 68 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e  ch row. This fun
2e590 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
2e5a0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 69  .** the values i
2e5b0 6e 20 46 74 73 33 45 78 70 72 2e 61 4d 49 5b 5d  n Fts3Expr.aMI[]
2e5c0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2e5d0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
2e5e0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 6f 75  currently.** fou
2e5f0 6e 64 20 69 6e 20 46 74 73 33 45 78 70 72 2e 70  nd in Fts3Expr.p
2e600 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2e610 70 4c 69 73 74 20 66 6f 72 20 65 61 63 68 20 6f  pList for each o
2e620 66 20 74 68 65 20 70 68 72 61 73 65 20 0a 2a 2a  f the phrase .**
2e630 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2e640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2e650 64 20 66 74 73 33 45 76 61 6c 55 70 64 61 74 65  d fts3EvalUpdate
2e660 43 6f 75 6e 74 73 28 46 74 73 33 45 78 70 72 20  Counts(Fts3Expr 
2e670 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
2e680 45 78 70 72 20 29 7b 0a 20 20 20 20 46 74 73 33  Expr ){.    Fts3
2e690 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
2e6a0 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  = pExpr->pPhrase
2e6b0 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73  ;.    if( pPhras
2e6c0 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e 64 6f  e && pPhrase->do
2e6d0 63 6c 69 73 74 2e 70 4c 69 73 74 20 29 7b 0a 20  clist.pList ){. 
2e6e0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
2e6f0 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  0;.      char *p
2e700 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   = pPhrase->docl
2e710 69 73 74 2e 70 4c 69 73 74 3b 0a 0a 20 20 20 20  ist.pList;..    
2e720 20 20 61 73 73 65 72 74 28 20 2a 70 20 29 3b 0a    assert( *p );.
2e730 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
2e740 7b 0a 20 20 20 20 20 20 20 20 75 38 20 63 20 3d  {.        u8 c =
2e750 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
2e760 69 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  iCnt = 0;.      
2e770 20 20 77 68 69 6c 65 28 20 30 78 46 45 20 26 20    while( 0xFE & 
2e780 28 2a 70 20 7c 20 63 29 20 29 7b 0a 20 20 20 20  (*p | c) ){.    
2e790 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78 38        if( (c&0x8
2e7a0 30 29 3d 3d 30 20 29 20 69 43 6e 74 2b 2b 3b 0a  0)==0 ) iCnt++;.
2e7b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2a 70            c = *p
2e7c0 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20  ++ & 0x80;.     
2e7d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2e7e0 20 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d   aMI[iCol*3 + 1]
2e7f0 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20 6f 63 63   = Number of occ
2e800 75 72 72 65 6e 63 65 73 0a 20 20 20 20 20 20 20  urrences.       
2e810 20 2a 2a 20 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b   ** aMI[iCol*3 +
2e820 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20   2] = Number of 
2e830 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rows containing 
2e840 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73  at least one ins
2e850 74 61 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2f  tance.        */
2e860 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2e870 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20  aMI[iCol*3 + 1] 
2e880 2b 3d 20 69 43 6e 74 3b 0a 20 20 20 20 20 20 20  += iCnt;.       
2e890 20 70 45 78 70 72 2d 3e 61 4d 49 5b 69 43 6f 6c   pExpr->aMI[iCol
2e8a0 2a 33 20 2b 20 32 5d 20 2b 3d 20 28 69 43 6e 74  *3 + 2] += (iCnt
2e8b0 3e 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >0);.        if(
2e8c0 20 2a 70 3d 3d 30 78 30 30 20 29 20 62 72 65 61   *p==0x00 ) brea
2e8d0 6b 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a  k;.        p++;.
2e8e0 20 20 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73          p += fts
2e8f0 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  3GetVarint32(p, 
2e900 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  &iCol);.      }.
2e910 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 45      }..    fts3E
2e920 76 61 6c 55 70 64 61 74 65 43 6f 75 6e 74 73 28  valUpdateCounts(
2e930 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
2e940 20 20 20 66 74 73 33 45 76 61 6c 55 70 64 61 74     fts3EvalUpdat
2e950 65 43 6f 75 6e 74 73 28 70 45 78 70 72 2d 3e 70  eCounts(pExpr->p
2e960 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Right);.  }.}../
2e970 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
2e980 70 45 78 70 72 20 6d 75 73 74 20 62 65 20 6f 66  pExpr must be of
2e990 20 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50   type FTSQUERY_P
2e9a0 48 52 41 53 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  HRASE..**.** If 
2e9b0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
2e9c0 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  y allocated and 
2e9d0 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 69 73 20  populated, this 
2e9e0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
2e9f0 65 73 20 61 6e 64 0a 2a 2a 20 70 6f 70 75 6c 61  es and.** popula
2ea00 74 65 73 20 74 68 65 20 46 74 73 33 45 78 70 72  tes the Fts3Expr
2ea10 2e 61 4d 49 5b 5d 20 61 72 72 61 79 20 66 6f 72  .aMI[] array for
2ea20 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
2ea30 72 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 70  r. If pExpr is p
2ea40 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4e 45 41 52  art.** of a NEAR
2ea50 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
2ea60 6e 20 69 74 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  n it also alloca
2ea70 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  tes and populate
2ea80 73 20 74 68 65 20 73 61 6d 65 20 61 72 72 61 79  s the same array
2ea90 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65  .** for all othe
2eaa0 72 20 70 68 72 61 73 65 73 20 74 68 61 74 20 61  r phrases that a
2eab0 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 4e  re part of the N
2eac0 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  EAR expression..
2ead0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2eae0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
2eaf0 68 65 20 61 4d 49 5b 5d 20 61 72 72 61 79 20 69  he aMI[] array i
2eb00 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  s successfully a
2eb10 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20  llocated and.** 
2eb20 70 6f 70 75 6c 61 74 65 64 2e 20 4f 74 68 65 72  populated. Other
2eb30 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
2eb40 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
2eb50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2eb60 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2eb70 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76  tatic int fts3Ev
2eb80 61 6c 47 61 74 68 65 72 53 74 61 74 73 28 0a 20  alGatherStats(. 
2eb90 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73   Fts3Cursor *pCs
2eba0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2ebb0 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63   /* Cursor objec
2ebc0 74 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  t */.  Fts3Expr 
2ebd0 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
2ebe0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 51 55 45         /* FTSQUE
2ebf0 52 59 5f 50 48 52 41 53 45 20 65 78 70 72 65 73  RY_PHRASE expres
2ec00 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sion */.){.  int
2ec10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2ec40 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2ec50 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
2ec60 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 69 66 28  _PHRASE );.  if(
2ec70 20 70 45 78 70 72 2d 3e 61 4d 49 3d 3d 30 20 29   pExpr->aMI==0 )
2ec80 7b 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20  {.    Fts3Table 
2ec90 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
2eca0 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
2ecb0 70 56 74 61 62 3b 0a 20 20 20 20 46 74 73 33 45  pVtab;.    Fts3E
2ecc0 78 70 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20  xpr *pRoot;     
2ecd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2ece0 6f 74 20 6f 66 20 4e 45 41 52 20 65 78 70 72 65  ot of NEAR expre
2ecf0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 74 73  ssion */.    Fts
2ed00 33 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20  3Expr *p;       
2ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 66 6f  Iterator used fo
2ed30 72 20 73 65 76 65 72 61 6c 20 70 75 72 70 6f 73  r several purpos
2ed40 65 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74  es */..    sqlit
2ed50 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 49 64  e3_int64 iPrevId
2ed60 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64   = pCsr->iPrevId
2ed70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  ;.    sqlite3_in
2ed80 74 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 20 20  t64 iDocid;.    
2ed90 75 38 20 62 45 6f 66 3b 0a 0a 20 20 20 20 2f 2a  u8 bEof;..    /*
2eda0 20 46 69 6e 64 20 74 68 65 20 72 6f 6f 74 20 6f   Find the root o
2edb0 66 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65  f the NEAR expre
2edc0 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 52 6f  ssion */.    pRo
2edd0 6f 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  ot = pExpr;.    
2ede0 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 70 50  while( pRoot->pP
2edf0 61 72 65 6e 74 20 26 26 20 70 52 6f 6f 74 2d 3e  arent && pRoot->
2ee00 70 50 61 72 65 6e 74 2d 3e 65 54 79 70 65 3d 3d  pParent->eType==
2ee10 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b  FTSQUERY_NEAR ){
2ee20 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70  .      pRoot = p
2ee30 52 6f 6f 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Root->pParent;. 
2ee40 20 20 20 7d 0a 20 20 20 20 69 44 6f 63 69 64 20     }.    iDocid 
2ee50 3d 20 70 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 3b  = pRoot->iDocid;
2ee60 0a 20 20 20 20 62 45 6f 66 20 3d 20 70 52 6f 6f  .    bEof = pRoo
2ee70 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 61 73 73  t->bEof;.    ass
2ee80 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 53 74 61  ert( pRoot->bSta
2ee90 72 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c  rt );..    /* Al
2eea0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
2eeb0 20 74 68 65 20 61 4d 53 49 5b 5d 20 61 72 72 61   the aMSI[] arra
2eec0 79 20 6f 66 20 65 61 63 68 20 46 54 53 51 55 45  y of each FTSQUE
2eed0 52 59 5f 50 48 52 41 53 45 20 6e 6f 64 65 20 2a  RY_PHRASE node *
2eee0 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 52 6f 6f  /.    for(p=pRoo
2eef0 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c 65 66 74  t; p; p=p->pLeft
2ef00 29 7b 0a 20 20 20 20 20 20 46 74 73 33 45 78 70  ){.      Fts3Exp
2ef10 72 20 2a 70 45 20 3d 20 28 70 2d 3e 65 54 79 70  r *pE = (p->eTyp
2ef20 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41  e==FTSQUERY_PHRA
2ef30 53 45 3f 70 3a 70 2d 3e 70 52 69 67 68 74 29 3b  SE?p:p->pRight);
2ef40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ef50 45 2d 3e 61 4d 49 3d 3d 30 20 29 3b 0a 20 20 20  E->aMI==0 );.   
2ef60 20 20 20 70 45 2d 3e 61 4d 49 20 3d 20 28 75 33     pE->aMI = (u3
2ef70 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  2 *)sqlite3_mall
2ef80 6f 63 28 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e  oc(pTab->nColumn
2ef90 20 2a 20 33 20 2a 20 73 69 7a 65 6f 66 28 75 33   * 3 * sizeof(u3
2efa0 32 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  2));.      if( !
2efb0 70 45 2d 3e 61 4d 49 20 29 20 72 65 74 75 72 6e  pE->aMI ) return
2efc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2efd0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45 2d 3e       memset(pE->
2efe0 61 4d 49 2c 20 30 2c 20 70 54 61 62 2d 3e 6e 43  aMI, 0, pTab->nC
2eff0 6f 6c 75 6d 6e 20 2a 20 33 20 2a 20 73 69 7a 65  olumn * 3 * size
2f000 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20 7d 0a  of(u32));.    }.
2f010 0a 20 20 20 20 66 74 73 33 45 76 61 6c 52 65 73  .    fts3EvalRes
2f020 74 61 72 74 28 70 43 73 72 2c 20 70 52 6f 6f 74  tart(pCsr, pRoot
2f030 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 77 68 69  , &rc);..    whi
2f040 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d  le( pCsr->isEof=
2f050 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
2f060 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 64 6f  _OK ){..      do
2f070 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 6e   {.        /* En
2f080 73 75 72 65 20 74 68 65 20 25 5f 63 6f 6e 74 65  sure the %_conte
2f090 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  nt statement is 
2f0a0 72 65 73 65 74 2e 20 2a 2f 0a 20 20 20 20 20 20  reset. */.      
2f0b0 20 20 69 66 28 20 70 43 73 72 2d 3e 69 73 52 65    if( pCsr->isRe
2f0c0 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 20 73  quireSeek==0 ) s
2f0d0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73  qlite3_reset(pCs
2f0e0 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  r->pStmt);.     
2f0f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2f100 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 43  e3_data_count(pC
2f110 73 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 3b  sr->pStmt)==0 );
2f120 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76  ..        /* Adv
2f130 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
2f140 20 64 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20 20 20   document */.   
2f150 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78       fts3EvalNex
2f160 74 52 6f 77 28 70 43 73 72 2c 20 70 52 6f 6f 74  tRow(pCsr, pRoot
2f170 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
2f180 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 70 52  pCsr->isEof = pR
2f190 6f 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 20  oot->bEof;.     
2f1a0 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69     pCsr->isRequi
2f1b0 72 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20  reSeek = 1;.    
2f1c0 20 20 20 20 70 43 73 72 2d 3e 69 73 4d 61 74 63      pCsr->isMatc
2f1d0 68 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b  hinfoNeeded = 1;
2f1e0 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69  .        pCsr->i
2f1f0 50 72 65 76 49 64 20 3d 20 70 52 6f 6f 74 2d 3e  PrevId = pRoot->
2f200 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 7d 77  iDocid;.      }w
2f210 68 69 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f  hile( pCsr->isEo
2f220 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  f==0 .          
2f230 20 26 26 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65   && pRoot->eType
2f240 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20  ==FTSQUERY_NEAR 
2f250 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73  .           && s
2f260 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 54 65  qlite3Fts3EvalTe
2f270 73 74 44 65 66 65 72 72 65 64 28 70 43 73 72 2c  stDeferred(pCsr,
2f280 20 26 72 63 29 20 0a 20 20 20 20 20 20 29 3b 0a   &rc) .      );.
2f290 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f2a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 73 72  QLITE_OK && pCsr
2f2b0 2d 3e 69 73 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  ->isEof==0 ){.  
2f2c0 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 55 70        fts3EvalUp
2f2d0 64 61 74 65 43 6f 75 6e 74 73 28 70 52 6f 6f 74  dateCounts(pRoot
2f2e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f2f0 0a 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f  ..    pCsr->isEo
2f300 66 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d  f = 0;.    pCsr-
2f310 3e 69 50 72 65 76 49 64 20 3d 20 69 50 72 65 76  >iPrevId = iPrev
2f320 49 64 3b 0a 0a 20 20 20 20 69 66 28 20 62 45 6f  Id;..    if( bEo
2f330 66 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  f ){.      pRoot
2f340 2d 3e 62 45 6f 66 20 3d 20 62 45 6f 66 3b 0a 20  ->bEof = bEof;. 
2f350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f360 2f 2a 20 43 61 75 74 69 6f 6e 3a 20 70 52 6f 6f  /* Caution: pRoo
2f370 74 20 6d 61 79 20 69 74 65 72 61 74 65 20 74 68  t may iterate th
2f380 72 6f 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20  rough docids in 
2f390 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
2f3a0 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a  cending.      **
2f3b0 20 6f 72 64 65 72 2e 20 46 6f 72 20 74 68 69 73   order. For this
2f3c0 20 72 65 61 73 6f 6e 2c 20 65 76 65 6e 20 74 68   reason, even th
2f3d0 6f 75 67 68 20 69 74 20 73 65 65 6d 73 20 6d 6f  ough it seems mo
2f3e0 72 65 20 64 65 66 65 6e 73 69 76 65 2c 20 74 68  re defensive, th
2f3f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6c  e .      ** do l
2f400 6f 6f 70 20 63 61 6e 20 6e 6f 74 20 62 65 20 77  oop can not be w
2f410 72 69 74 74 65 6e 3a 0a 20 20 20 20 20 20 2a 2a  ritten:.      **
2f420 0a 20 20 20 20 20 20 2a 2a 20 20 20 64 6f 20 7b  .      **   do {
2f430 2e 2e 2e 7d 20 77 68 69 6c 65 28 20 70 52 6f 6f  ...} while( pRoo
2f440 74 2d 3e 69 44 6f 63 69 64 3c 69 44 6f 63 69 64  t->iDocid<iDocid
2f450 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2f460 4b 20 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  K );.      */.  
2f470 20 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74      fts3EvalRest
2f480 61 72 74 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c  art(pCsr, pRoot,
2f490 20 26 72 63 29 3b 0a 20 20 20 20 20 20 64 6f 20   &rc);.      do 
2f4a0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76  {.        fts3Ev
2f4b0 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2f4c0 70 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20  pRoot, &rc);.   
2f4d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f       assert( pRo
2f4e0 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  ot->bEof==0 );. 
2f4f0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 52 6f       }while( pRo
2f500 6f 74 2d 3e 69 44 6f 63 69 64 21 3d 69 44 6f 63  ot->iDocid!=iDoc
2f510 69 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  id && rc==SQLITE
2f520 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  _OK );.    }.  }
2f530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f540 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f550 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
2f560 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 28 29 20  the matchinfo() 
2f570 6d 6f 64 75 6c 65 20 74 6f 20 71 75 65 72 79 20  module to query 
2f580 61 20 70 68 72 61 73 65 20 0a 2a 2a 20 65 78 70  a phrase .** exp
2f590 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
2f5a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2f5b0 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  nformation:.**.*
2f5c0 2a 20 20 20 31 2e 20 54 68 65 20 74 6f 74 61 6c  *   1. The total
2f5d0 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72   number of occur
2f5e0 72 65 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68  rences of the ph
2f5f0 72 61 73 65 20 69 6e 20 65 61 63 68 20 63 6f 6c  rase in each col
2f600 75 6d 6e 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20  umn of .**      
2f610 74 68 65 20 46 54 53 20 74 61 62 6c 65 20 28 63  the FTS table (c
2f620 6f 6e 73 69 64 65 72 69 6e 67 20 61 6c 6c 20 72  onsidering all r
2f630 6f 77 73 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  ows), and.**.** 
2f640 20 20 32 2e 20 46 6f 72 20 65 61 63 68 20 63 6f    2. For each co
2f650 6c 75 6d 6e 2c 20 74 68 65 20 6e 75 6d 62 65 72  lumn, the number
2f660 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2f670 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20  table for which 
2f680 74 68 65 0a 2a 2a 20 20 20 20 20 20 63 6f 6c 75  the.**      colu
2f690 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  mn contains at l
2f6a0 65 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63  east one instanc
2f6b0 65 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e  e of the phrase.
2f6c0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72  .**.** If no err
2f6d0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
2f6e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f6f0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20   and the values 
2f700 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
2f710 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
2f720 74 68 65 20 61 72 72 61 79 20 61 69 4f 75 74 20  the array aiOut 
2f730 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2f740 2a 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33  *   aiOut[iCol*3
2f750 20 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72 20 6f   + 1] = Number o
2f760 66 20 6f 63 63 75 72 72 65 6e 63 65 73 0a 2a 2a  f occurrences.**
2f770 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20     aiOut[iCol*3 
2f780 2b 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66  + 2] = Number of
2f790 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67   rows containing
2f7a0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e   at least one in
2f7b0 73 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 43 61 76  stance.**.** Cav
2f7c0 65 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eats:.**.**   * 
2f7d0 49 66 20 61 20 70 68 72 61 73 65 20 63 6f 6e 73  If a phrase cons
2f7e0 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
2f7f0 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
2f800 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 75 74 70 75  , then all outpu
2f810 74 20 0a 2a 2a 20 20 20 20 20 76 61 6c 75 65 73  t .**     values
2f820 20 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20   are set to the 
2f830 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65  number of docume
2f840 6e 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  nts in the table
2f850 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 20 20  . In other.**   
2f860 20 20 77 6f 72 64 73 20 77 65 20 61 73 73 75 6d    words we assum
2f870 65 20 74 68 61 74 20 76 65 72 79 20 63 6f 6d 6d  e that very comm
2f880 6f 6e 20 74 6f 6b 65 6e 73 20 6f 63 63 75 72 20  on tokens occur 
2f890 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 69 6e 20  exactly once in 
2f8a0 65 61 63 68 20 0a 2a 2a 20 20 20 20 20 63 6f 6c  each .**     col
2f8b0 75 6d 6e 20 6f 66 20 65 61 63 68 20 72 6f 77 20  umn of each row 
2f8c0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
2f8d0 0a 2a 2a 20 20 20 2a 20 49 66 20 61 20 70 68 72  .**   * If a phr
2f8e0 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ase contains som
2f8f0 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  e deferred token
2f900 73 20 28 61 6e 64 20 73 6f 6d 65 20 6e 6f 6e 2d  s (and some non-
2f910 64 65 66 65 72 72 65 64 20 0a 2a 2a 20 20 20 20  deferred .**    
2f920 20 74 6f 6b 65 6e 73 29 2c 20 63 6f 75 6e 74 20   tokens), count 
2f930 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6f 63  the potential oc
2f940 63 75 72 72 65 6e 63 65 20 69 64 65 6e 74 69 66  currence identif
2f950 69 65 64 20 62 79 20 63 6f 6e 73 69 64 65 72 69  ied by consideri
2f960 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6e 6f  ng.**     the no
2f970 6e 2d 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  n-deferred token
2f980 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74  s instead of act
2f990 75 61 6c 20 70 68 72 61 73 65 20 6f 63 63 75 72  ual phrase occur
2f9a0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  rences..**.**   
2f9b0 2a 20 49 66 20 74 68 65 20 70 68 72 61 73 65 20  * If the phrase 
2f9c0 69 73 20 70 61 72 74 20 6f 66 20 61 20 4e 45 41  is part of a NEA
2f9d0 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  R expression, th
2f9e0 65 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 69  en only phrase i
2f9f0 6e 73 74 61 6e 63 65 73 0a 2a 2a 20 20 20 20 20  nstances.**     
2fa00 74 68 61 74 20 6d 65 65 74 20 74 68 65 20 4e 45  that meet the NE
2fa10 41 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72  AR constraint ar
2fa20 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  e included in th
2fa30 65 20 63 6f 75 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  e counts..*/.int
2fa40 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
2fa50 50 68 72 61 73 65 53 74 61 74 73 28 0a 20 20 46  PhraseStats(.  F
2fa60 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
2fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fa80 2a 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e  * FTS cursor han
2fa90 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70  dle */.  Fts3Exp
2faa0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
2fab0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61           /* Phra
2fac0 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  se expression */
2fad0 0a 20 20 75 33 32 20 2a 61 69 4f 75 74 20 20 20  .  u32 *aiOut   
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faf0 20 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 77     /* Array to w
2fb00 72 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74  rite results int
2fb10 6f 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  o (see above) */
2fb20 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  .){.  Fts3Table 
2fb30 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
2fb40 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
2fb50 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
2fb60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2fb70 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 69 66 28 20  nt iCol;..  if( 
2fb80 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64  pExpr->bDeferred
2fb90 20 26 26 20 70 45 78 70 72 2d 3e 70 50 61 72 65   && pExpr->pPare
2fba0 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55  nt->eType!=FTSQU
2fbb0 45 52 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20  ERY_NEAR ){.    
2fbc0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44  assert( pCsr->nD
2fbd0 6f 63 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  oc>0 );.    for(
2fbe0 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
2fbf0 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c  b->nColumn; iCol
2fc00 2b 2b 29 7b 0a 20 20 20 20 20 20 61 69 4f 75 74  ++){.      aiOut
2fc10 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 28  [iCol*3 + 1] = (
2fc20 75 33 32 29 70 43 73 72 2d 3e 6e 44 6f 63 3b 0a  u32)pCsr->nDoc;.
2fc30 20 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c        aiOut[iCol
2fc40 2a 33 20 2b 20 32 5d 20 3d 20 28 75 33 32 29 70  *3 + 2] = (u32)p
2fc50 43 73 72 2d 3e 6e 44 6f 63 3b 0a 20 20 20 20 7d  Csr->nDoc;.    }
2fc60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2fc70 20 3d 20 66 74 73 33 45 76 61 6c 47 61 74 68 65   = fts3EvalGathe
2fc80 72 53 74 61 74 73 28 70 43 73 72 2c 20 70 45 78  rStats(pCsr, pEx
2fc90 70 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pr);.    if( rc=
2fca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
2fcc0 72 2d 3e 61 4d 49 20 29 3b 0a 20 20 20 20 20 20  r->aMI );.      
2fcd0 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
2fce0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pTab->nColumn; 
2fcf0 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
2fd00 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b 20   aiOut[iCol*3 + 
2fd10 31 5d 20 3d 20 70 45 78 70 72 2d 3e 61 4d 49 5b  1] = pExpr->aMI[
2fd20 69 43 6f 6c 2a 33 20 2b 20 31 5d 3b 0a 20 20 20  iCol*3 + 1];.   
2fd30 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a       aiOut[iCol*
2fd40 33 20 2b 20 32 5d 20 3d 20 70 45 78 70 72 2d 3e  3 + 2] = pExpr->
2fd50 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 32 5d 3b  aMI[iCol*3 + 2];
2fd60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2fd70 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2fd80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
2fd90 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 70  pression pExpr p
2fda0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2fdb0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
2fdc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2fdd0 20 6d 75 73 74 20 62 65 20 6f 66 20 74 79 70 65   must be of type
2fde0 20 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45   FTSQUERY_PHRASE
2fdf0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  . .**.** The ret
2fe00 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
2fe10 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20  ither NULL or a 
2fe20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
2fe30 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  fer containing.*
2fe40 2a 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  * a position-lis
2fe50 74 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  t indicating the
2fe60 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
2fe70 74 68 65 20 70 68 72 61 73 65 20 69 6e 20 63 6f  the phrase in co
2fe80 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 6f 66 20  lumn iCol.** of 
2fe90 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
2fea0 20 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65   .**.** More spe
2feb0 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 72  cifically, the r
2fec0 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 63  eturned buffer c
2fed0 6f 6e 74 61 69 6e 73 20 31 20 76 61 72 69 6e 74  ontains 1 varint
2fee0 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 6f 63   for each .** oc
2fef0 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65 20  currence of the 
2ff00 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 63 6f  phrase in the co
2ff10 6c 75 6d 6e 2c 20 73 74 6f 72 65 64 20 75 73 69  lumn, stored usi
2ff20 6e 67 20 74 68 65 20 6e 6f 72 6d 61 6c 20 28 64  ng the normal (d
2ff30 65 6c 74 61 2b 32 29 20 0a 2a 2a 20 63 6f 6d 70  elta+2) .** comp
2ff40 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 73 20 74  ression and is t
2ff50 65 72 6d 69 6e 61 74 65 64 20 62 79 20 65 69 74  erminated by eit
2ff60 68 65 72 20 61 6e 20 30 78 30 31 20 6f 72 20 30  her an 0x01 or 0
2ff70 78 30 30 20 62 79 74 65 2e 20 46 6f 72 20 65 78  x00 byte. For ex
2ff80 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65  ample,.** if the
2ff90 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d   requested colum
2ffa0 6e 20 63 6f 6e 74 61 69 6e 73 20 22 61 20 62 20  n contains "a b 
2ffb0 58 20 63 20 64 20 58 20 58 22 20 61 6e 64 20 74  X c d X X" and t
2ffc0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
2ffd0 0a 2a 2a 20 66 6f 72 20 27 58 27 20 69 73 20 72  .** for 'X' is r
2ffe0 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 62 75  equested, the bu
2fff0 66 66 65 72 20 72 65 74 75 72 6e 65 64 20 6d 61  ffer returned ma
30000 79 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a  y contain:.**.**
30010 20 20 20 20 20 30 78 30 34 20 30 78 30 35 20 30       0x04 0x05 0
30020 78 30 33 20 30 78 30 31 20 20 20 6f 72 20 20 20  x03 0x01   or   
30030 30 78 30 34 20 30 78 30 35 20 30 78 30 33 20 30  0x04 0x05 0x03 0
30040 78 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  x00.**.** This f
30050 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 72 65  unction works re
30060 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
30070 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
30080 68 72 61 73 65 20 69 73 20 64 65 66 65 72 72 65  hrase is deferre
30090 64 2c 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  d,.** incrementa
300a0 6c 2c 20 6f 72 20 6e 65 69 74 68 65 72 2e 0a 2a  l, or neither..*
300b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
300c0 33 45 76 61 6c 50 68 72 61 73 65 50 6f 73 6c 69  3EvalPhrasePosli
300d0 73 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  st(.  Fts3Cursor
300e0 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
300f0 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 63 75        /* FTS3 cu
30100 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  rsor object */. 
30110 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72   Fts3Expr *pExpr
30120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30130 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 72 65   /* Phrase to re
30140 74 75 72 6e 20 64 6f 63 6c 69 73 74 20 66 6f 72  turn doclist for
30150 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30170 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
30180 74 6f 20 72 65 74 75 72 6e 20 70 6f 73 69 74 69  to return positi
30190 6f 6e 20 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20  on list for */. 
301a0 20 63 68 61 72 20 2a 2a 70 70 4f 75 74 20 20 20   char **ppOut   
301b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301c0 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72   /* OUT: Pointer
301d0 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73   to position lis
301e0 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 50 68  t */.){.  Fts3Ph
301f0 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20  rase *pPhrase = 
30200 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a  pExpr->pPhrase;.
30210 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
30220 62 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  b = (Fts3Table *
30230 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  )pCsr->base.pVta
30240 62 3b 0a 20 20 63 68 61 72 20 2a 70 49 74 65 72  b;.  char *pIter
30250 3b 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20  ;.  int iThis;. 
30260 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
30270 44 6f 63 69 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  Docid;..  /* If 
30280 74 68 69 73 20 70 68 72 61 73 65 20 69 73 20 61  this phrase is a
30290 70 70 6c 69 65 73 20 73 70 65 63 69 66 69 63 61  pplies specifica
302a0 6c 6c 79 20 74 6f 20 73 6f 6d 65 20 63 6f 6c 75  lly to some colu
302b0 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 0a 20  mn other than . 
302c0 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c   ** column iCol,
302d0 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70   return a NULL p
302e0 6f 69 6e 74 65 72 2e 20 20 2a 2f 0a 20 20 2a 70  ointer.  */.  *p
302f0 70 4f 75 74 20 3d 20 30 3b 0a 20 20 61 73 73 65  pOut = 0;.  asse
30300 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
30310 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d  Col<pTab->nColum
30320 6e 20 29 3b 0a 20 20 69 66 28 20 28 70 50 68 72  n );.  if( (pPhr
30330 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  ase->iColumn<pTa
30340 62 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50  b->nColumn && pP
30350 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  hrase->iColumn!=
30360 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  iCol) ){.    ret
30370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
30380 20 7d 0a 0a 20 20 69 44 6f 63 69 64 20 3d 20 70   }..  iDocid = p
30390 45 78 70 72 2d 3e 69 44 6f 63 69 64 3b 0a 20 20  Expr->iDocid;.  
303a0 70 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d  pIter = pPhrase-
303b0 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a  >doclist.pList;.
303c0 20 20 69 66 28 20 69 44 6f 63 69 64 21 3d 70 43    if( iDocid!=pC
303d0 73 72 2d 3e 69 50 72 65 76 49 64 20 7c 7c 20 70  sr->iPrevId || p
303e0 45 78 70 72 2d 3e 62 45 6f 66 20 29 7b 0a 20 20  Expr->bEof ){.  
303f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
30400 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 62 44  E_OK;.    int bD
30410 65 73 63 44 6f 63 6c 69 73 74 20 3d 20 70 54 61  escDoclist = pTa
30420 62 2d 3e 62 44 65 73 63 49 64 78 3b 20 20 20 20  b->bDescIdx;    
30430 20 20 2f 2a 20 46 6f 72 20 44 4f 43 49 44 5f 43    /* For DOCID_C
30440 4d 50 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 20 20  MP macro */.    
30450 69 6e 74 20 62 4f 72 20 3d 20 30 3b 0a 20 20 20  int bOr = 0;.   
30460 20 75 38 20 62 54 72 65 65 45 6f 66 20 3d 20 30   u8 bTreeEof = 0
30470 3b 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a  ;.    Fts3Expr *
30480 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
30490 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
304a0 74 65 72 61 74 65 20 66 72 6f 6d 20 70 45 78 70  terate from pExp
304b0 72 20 74 6f 20 72 6f 6f 74 20 2a 2f 0a 20 20 20  r to root */.   
304c0 20 46 74 73 33 45 78 70 72 20 2a 70 4e 65 61 72   Fts3Expr *pNear
304d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
304e0 2a 20 4d 6f 73 74 20 73 65 6e 69 6f 72 20 4e 45  * Most senior NE
304f0 41 52 20 61 6e 63 65 73 74 6f 72 20 28 6f 72 20  AR ancestor (or 
30500 70 45 78 70 72 29 20 2a 2f 0a 20 20 20 20 69 6e  pExpr) */.    in
30510 74 20 62 4d 61 74 63 68 3b 0a 0a 20 20 20 20 2f  t bMatch;..    /
30520 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
30530 70 68 72 61 73 65 20 64 65 73 63 65 6e 64 73 20  phrase descends 
30540 66 72 6f 6d 20 61 6e 20 4f 52 20 65 78 70 72 65  from an OR expre
30550 73 73 69 6f 6e 20 6e 6f 64 65 2e 20 49 66 20 6e  ssion node. If n
30560 6f 74 2c 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  ot, .    ** retu
30570 72 6e 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  rn NULL. Otherwi
30580 73 65 2c 20 74 68 65 20 65 6e 74 72 79 20 74 68  se, the entry th
30590 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
305a0 6f 20 64 6f 63 69 64 20 0a 20 20 20 20 2a 2a 20  o docid .    ** 
305b0 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20 6d 61  pCsr->iPrevId ma
305c0 79 20 6c 69 65 20 65 61 72 6c 69 65 72 20 69 6e  y lie earlier in
305d0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 62 75 66   the doclist buf
305e0 66 65 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a  fer. Or, if the.
305f0 20 20 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74      ** tree that
30600 20 74 68 65 20 6e 6f 64 65 20 69 73 20 70 61 72   the node is par
30610 74 20 6f 66 20 68 61 73 20 62 65 65 6e 20 6d 61  t of has been ma
30620 72 6b 65 64 20 61 73 20 45 4f 46 2c 20 62 75 74  rked as EOF, but
30630 20 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 2a 2a   the node.    **
30640 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 45   itself is not E
30650 4f 46 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  OF, then it may 
30660 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 61 72 6c  point to an earl
30670 69 65 72 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20  ier entry. */.  
30680 20 20 70 4e 65 61 72 20 3d 20 70 45 78 70 72 3b    pNear = pExpr;
30690 0a 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70 72  .    for(p=pExpr
306a0 2d 3e 70 50 61 72 65 6e 74 3b 20 70 3b 20 70 3d  ->pParent; p; p=
306b0 70 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20 20 20  p->pParent){.   
306c0 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d     if( p->eType=
306d0 3d 46 54 53 51 55 45 52 59 5f 4f 52 20 29 20 62  =FTSQUERY_OR ) b
306e0 4f 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  Or = 1;.      if
306f0 28 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  ( p->eType==FTSQ
30700 55 45 52 59 5f 4e 45 41 52 20 29 20 70 4e 65 61  UERY_NEAR ) pNea
30710 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28  r = p;.      if(
30720 20 70 2d 3e 62 45 6f 66 20 29 20 62 54 72 65 65   p->bEof ) bTree
30730 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
30740 20 20 20 69 66 28 20 62 4f 72 3d 3d 30 20 29 20     if( bOr==0 ) 
30750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30760 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ;..    /* This i
30770 73 20 74 68 65 20 64 65 73 63 65 6e 64 65 6e 74  s the descendent
30780 20 6f 66 20 61 6e 20 4f 52 20 6e 6f 64 65 2e 20   of an OR node. 
30790 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
307a0 63 61 6e 6e 6f 74 20 75 73 65 0a 20 20 20 20 2a  cannot use.    *
307b0 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * an incremental
307c0 20 70 68 72 61 73 65 2e 20 4c 6f 61 64 20 74 68   phrase. Load th
307d0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
307e0 20 66 6f 72 20 74 68 65 20 70 68 72 61 73 65 0a   for the phrase.
307f0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 6d 65 6d 6f      ** into memo
30800 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
30810 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 68    */.    if( pPh
30820 72 61 73 65 2d 3e 62 49 6e 63 72 20 29 7b 0a 20  rase->bIncr ){. 
30830 20 20 20 20 20 69 6e 74 20 62 45 6f 66 53 61 76       int bEofSav
30840 65 20 3d 20 70 4e 65 61 72 2d 3e 62 45 6f 66 3b  e = pNear->bEof;
30850 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 52  .      fts3EvalR
30860 65 73 74 61 72 74 28 70 43 73 72 2c 20 70 4e 65  estart(pCsr, pNe
30870 61 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ar, &rc);.      
30880 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
30890 45 5f 4f 4b 20 26 26 20 21 70 4e 65 61 72 2d 3e  E_OK && !pNear->
308a0 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20  bEof ){.        
308b0 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
308c0 70 43 73 72 2c 20 70 4e 65 61 72 2c 20 26 72 63  pCsr, pNear, &rc
308d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  );.        if( b
308e0 45 6f 66 53 61 76 65 3d 3d 30 20 26 26 20 70 4e  EofSave==0 && pN
308f0 65 61 72 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f  ear->iDocid==iDo
30900 63 69 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cid ) break;.   
30910 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
30920 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
30930 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 62 49 6e   || pPhrase->bIn
30940 63 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  cr==0 );.    }. 
30950 20 20 20 69 66 28 20 62 54 72 65 65 45 6f 66 20     if( bTreeEof 
30960 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
30970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30980 20 21 70 4e 65 61 72 2d 3e 62 45 6f 66 20 29 7b   !pNear->bEof ){
30990 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61  .        fts3Eva
309a0 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
309b0 4e 65 61 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  Near, &rc);.    
309c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
309d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
309e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
309f0 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20    bMatch = 1;.  
30a00 20 20 66 6f 72 28 70 3d 70 4e 65 61 72 3b 20 70    for(p=pNear; p
30a10 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20  ; p=p->pLeft){. 
30a20 20 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30       u8 bEof = 0
30a30 3b 0a 20 20 20 20 20 20 46 74 73 33 45 78 70 72  ;.      Fts3Expr
30a40 20 2a 70 54 65 73 74 20 3d 20 70 3b 0a 20 20 20   *pTest = p;.   
30a50 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70     Fts3Phrase *p
30a60 50 68 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Ph;.      assert
30a70 28 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d  ( pTest->eType==
30a80 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 7c 7c  FTSQUERY_NEAR ||
30a90 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46   pTest->eType==F
30aa0 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29  TSQUERY_PHRASE )
30ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 73  ;.      if( pTes
30ac0 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  t->eType==FTSQUE
30ad0 52 59 5f 4e 45 41 52 20 29 20 70 54 65 73 74 20  RY_NEAR ) pTest 
30ae0 3d 20 70 54 65 73 74 2d 3e 70 52 69 67 68 74 3b  = pTest->pRight;
30af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30b00 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Test->eType==FTS
30b10 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 3b 0a  QUERY_PHRASE );.
30b20 20 20 20 20 20 20 70 50 68 20 3d 20 70 54 65 73        pPh = pTes
30b30 74 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20 20 20  t->pPhrase;..   
30b40 20 20 20 70 49 74 65 72 20 3d 20 70 50 68 2d 3e     pIter = pPh->
30b50 70 4f 72 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  pOrPoslist;.    
30b60 20 20 69 44 6f 63 69 64 20 3d 20 70 50 68 2d 3e    iDocid = pPh->
30b70 69 4f 72 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  iOrDocid;.      
30b80 69 66 28 20 70 43 73 72 2d 3e 62 44 65 73 63 3d  if( pCsr->bDesc=
30b90 3d 62 44 65 73 63 44 6f 63 6c 69 73 74 20 29 7b  =bDescDoclist ){
30ba0 0a 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20  .        bEof = 
30bb0 21 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41  !pPh->doclist.nA
30bc0 6c 6c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ll ||.          
30bd0 28 70 49 74 65 72 20 3e 3d 20 28 70 50 68 2d 3e  (pIter >= (pPh->
30be0 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 2b 20 70  doclist.aAll + p
30bf0 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c  Ph->doclist.nAll
30c00 29 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ));.        whil
30c10 65 28 20 28 70 49 74 65 72 3d 3d 30 20 7c 7c 20  e( (pIter==0 || 
30c20 44 4f 43 49 44 5f 43 4d 50 28 69 44 6f 63 69 64  DOCID_CMP(iDocid
30c30 2c 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 29  , pCsr->iPrevId)
30c40 3c 30 20 29 20 26 26 20 62 45 6f 66 3d 3d 30 20  <0 ) && bEof==0 
30c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
30c60 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 4e  ite3Fts3DoclistN
30c70 65 78 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  ext(.           
30c80 20 20 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c     bDescDoclist,
30c90 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 61 41   pPh->doclist.aA
30ca0 6c 6c 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74  ll, pPh->doclist
30cb0 2e 6e 41 6c 6c 2c 20 0a 20 20 20 20 20 20 20 20  .nAll, .        
30cc0 20 20 20 20 20 20 26 70 49 74 65 72 2c 20 26 69        &pIter, &i
30cd0 44 6f 63 69 64 2c 20 26 62 45 6f 66 0a 20 20 20  Docid, &bEof.   
30ce0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
30cf0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
30d00 0a 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20  .        bEof = 
30d10 21 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41  !pPh->doclist.nA
30d20 6c 6c 20 7c 7c 20 28 70 49 74 65 72 20 26 26 20  ll || (pIter && 
30d30 70 49 74 65 72 3c 3d 70 50 68 2d 3e 64 6f 63 6c  pIter<=pPh->docl
30d40 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20 20 20  ist.aAll);.     
30d50 20 20 20 77 68 69 6c 65 28 20 28 70 49 74 65 72     while( (pIter
30d60 3d 3d 30 20 7c 7c 20 44 4f 43 49 44 5f 43 4d 50  ==0 || DOCID_CMP
30d70 28 69 44 6f 63 69 64 2c 20 70 43 73 72 2d 3e 69  (iDocid, pCsr->i
30d80 50 72 65 76 49 64 29 3e 30 20 29 20 26 26 20 62  PrevId)>0 ) && b
30d90 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
30da0 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20      int dummy;. 
30db0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30dc0 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28  Fts3DoclistPrev(
30dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
30de0 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 70 50 68  DescDoclist, pPh
30df0 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c 20  ->doclist.aAll, 
30e00 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c  pPh->doclist.nAl
30e10 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
30e20 20 20 26 70 49 74 65 72 2c 20 26 69 44 6f 63 69    &pIter, &iDoci
30e30 64 2c 20 26 64 75 6d 6d 79 2c 20 26 62 45 6f 66  d, &dummy, &bEof
30e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
30e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30e60 20 20 7d 0a 20 20 20 20 20 20 70 50 68 2d 3e 70    }.      pPh->p
30e70 4f 72 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65  OrPoslist = pIte
30e80 72 3b 0a 20 20 20 20 20 20 70 50 68 2d 3e 69 4f  r;.      pPh->iO
30e90 72 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b  rDocid = iDocid;
30ea0 0a 20 20 20 20 20 20 69 66 28 20 62 45 6f 66 20  .      if( bEof 
30eb0 7c 7c 20 69 44 6f 63 69 64 21 3d 70 43 73 72 2d  || iDocid!=pCsr-
30ec0 3e 69 50 72 65 76 49 64 20 29 20 62 4d 61 74 63  >iPrevId ) bMatc
30ed0 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  h = 0;.    }..  
30ee0 20 20 69 66 28 20 62 4d 61 74 63 68 20 29 7b 0a    if( bMatch ){.
30ef0 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 50        pIter = pP
30f00 68 72 61 73 65 2d 3e 70 4f 72 50 6f 73 6c 69 73  hrase->pOrPoslis
30f10 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
30f20 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20      pIter = 0;. 
30f30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
30f40 49 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Iter==0 ) return
30f50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
30f60 66 28 20 2a 70 49 74 65 72 3d 3d 30 78 30 31 20  f( *pIter==0x01 
30f70 29 7b 0a 20 20 20 20 70 49 74 65 72 2b 2b 3b 0a  ){.    pIter++;.
30f80 20 20 20 20 70 49 74 65 72 20 2b 3d 20 66 74 73      pIter += fts
30f90 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74  3GetVarint32(pIt
30fa0 65 72 2c 20 26 69 54 68 69 73 29 3b 0a 20 20 7d  er, &iThis);.  }
30fb0 65 6c 73 65 7b 0a 20 20 20 20 69 54 68 69 73 20  else{.    iThis 
30fc0 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  = 0;.  }.  while
30fd0 28 20 69 54 68 69 73 3c 69 43 6f 6c 20 29 7b 0a  ( iThis<iCol ){.
30fe0 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69      fts3Columnli
30ff0 73 74 43 6f 70 79 28 30 2c 20 26 70 49 74 65 72  stCopy(0, &pIter
31000 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 49 74 65  );.    if( *pIte
31010 72 3d 3d 30 78 30 30 20 29 20 72 65 74 75 72 6e  r==0x00 ) return
31020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
31030 70 49 74 65 72 2b 2b 3b 0a 20 20 20 20 70 49 74  pIter++;.    pIt
31040 65 72 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  er += fts3GetVar
31050 69 6e 74 33 32 28 70 49 74 65 72 2c 20 26 69 54  int32(pIter, &iT
31060 68 69 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  his);.  }.  if( 
31070 2a 70 49 74 65 72 3d 3d 30 78 30 30 20 29 7b 0a  *pIter==0x00 ){.
31080 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20      pIter = 0;. 
31090 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 28   }..  *ppOut = (
310a0 28 69 43 6f 6c 3d 3d 69 54 68 69 73 29 3f 70 49  (iCol==iThis)?pI
310b0 74 65 72 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e  ter:0);.  return
310c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
310d0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 63 6f  *.** Free all co
310e0 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65 20  mponents of the 
310f0 46 74 73 33 50 68 72 61 73 65 20 73 74 72 75 63  Fts3Phrase struc
31100 74 75 72 65 20 74 68 61 74 20 77 65 72 65 20 61  ture that were a
31110 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
31120 68 65 20 65 76 61 6c 20 6d 6f 64 75 6c 65 2e 20  he eval module. 
31130 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  Specifically, th
31140 69 73 20 6d 65 61 6e 73 20 74 6f 20 66 72 65 65  is means to free
31150 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
31160 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 68 72  contents of pPhr
31170 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2c 20 61 6e  ase->doclist, an
31180 64 0a 2a 2a 20 20 20 2a 20 61 6e 79 20 46 74 73  d.**   * any Fts
31190 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
311a0 6f 62 6a 65 63 74 73 20 68 65 6c 64 20 62 79 20  objects held by 
311b0 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 2e 0a 2a  phrase tokens..*
311c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
311d0 73 33 45 76 61 6c 50 68 72 61 73 65 43 6c 65 61  s3EvalPhraseClea
311e0 6e 75 70 28 46 74 73 33 50 68 72 61 73 65 20 2a  nup(Fts3Phrase *
311f0 70 50 68 72 61 73 65 29 7b 0a 20 20 69 66 28 20  pPhrase){.  if( 
31200 70 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20 69  pPhrase ){.    i
31210 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
31220 33 5f 66 72 65 65 28 70 50 68 72 61 73 65 2d 3e  3_free(pPhrase->
31230 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20  doclist.aAll);. 
31240 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c     fts3EvalInval
31250 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68  idatePoslist(pPh
31260 72 61 73 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65  rase);.    memse
31270 74 28 26 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  t(&pPhrase->docl
31280 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ist, 0, sizeof(F
31290 74 73 33 44 6f 63 6c 69 73 74 29 29 3b 0a 20 20  ts3Doclist));.  
312a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68    for(i=0; i<pPh
312b0 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b  rase->nToken; i+
312c0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65  +){.      fts3Se
312d0 67 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65  gReaderCursorFre
312e0 65 28 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65  e(pPhrase->aToke
312f0 6e 5b 69 5d 2e 70 53 65 67 63 73 72 29 3b 0a 20  n[i].pSegcsr);. 
31300 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54       pPhrase->aT
31310 6f 6b 65 6e 5b 69 5d 2e 70 53 65 67 63 73 72 20  oken[i].pSegcsr 
31320 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
31330 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
31340 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
31350 54 41 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  TAB..*/.#ifdef S
31360 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
31370 73 71 6c 69 74 65 33 46 74 73 33 43 6f 72 72 75  sqlite3Fts3Corru
31380 70 74 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  pt(){.  return S
31390 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
313a0 41 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  AB;.}.#endif..#i
313b0 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a 2f  f !SQLITE_CORE./
313c0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
313d0 41 50 49 20 70 6f 69 6e 74 65 72 20 74 61 62 6c  API pointer tabl
313e0 65 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  e, if required..
313f0 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  */.#ifdef _WIN32
31400 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65  .__declspec(dlle
31410 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e  xport).#endif.in
31420 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 69  t sqlite3_fts3_i
31430 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  nit(.  sqlite3 *
31440 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a  db, .  char **pz
31450 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20  ErrMsg,.  const 
31460 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
31470 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20  ines *pApi.){.  
31480 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
31490 5f 49 4e 49 54 32 28 70 41 70 69 29 0a 20 20 72  _INIT2(pApi).  r
314a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
314b0 33 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e  3Init(db);.}.#en
314c0 64 69 66 0a 0a 23 65 6e 64 69 66 0a              dif..#endif.