/ Hex Artifact Content
Login

Artifact f1c58503bc81c3dab1a70b25e146878ae40fccc716fd7c9b817995b661bc896f:


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 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int 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 26 7a 43 73 72 5b 6e  .    if( &zCsr[n
f850: 53 75 66 66 69 78 5d 3e 7a 45 6e 64 20 29 7b 0a  Suffix]>zEnd ){.
f860: 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 5f 43        rc = FTS_C
f870: 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20  ORRUPT_VTAB;.   
f880: 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f 73     goto finish_s
f890: 63 61 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  can;.    }.    i
f8a0: 66 28 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66  f( nPrefix+nSuff
f8b0: 69 78 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  ix>nAlloc ){.   
f8c0: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20     char *zNew;. 
f8d0: 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 28 6e       nAlloc = (n
f8e0: 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 29 20  Prefix+nSuffix) 
f8f0: 2a 20 32 3b 0a 20 20 20 20 20 20 7a 4e 65 77 20  * 2;.      zNew 
f900: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
f910: 33 5f 72 65 61 6c 6c 6f 63 28 7a 42 75 66 66 65  3_realloc(zBuffe
f920: 72 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  r, nAlloc);.    
f930: 20 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20    if( !zNew ){. 
f940: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f950: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f960: 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f 73 63    goto finish_sc
f970: 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  an;.      }.    
f980: 20 20 7a 42 75 66 66 65 72 20 3d 20 7a 4e 65 77    zBuffer = zNew
f990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
f9a0: 72 74 28 20 7a 42 75 66 66 65 72 20 29 3b 0a 20  rt( zBuffer );. 
f9b0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 66     memcpy(&zBuff
f9c0: 65 72 5b 6e 50 72 65 66 69 78 5d 2c 20 7a 43 73  er[nPrefix], zCs
f9d0: 72 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20  r, nSuffix);.   
f9e0: 20 6e 42 75 66 66 65 72 20 3d 20 6e 50 72 65 66   nBuffer = nPref
f9f0: 69 78 20 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20  ix + nSuffix;.  
fa00: 20 20 7a 43 73 72 20 2b 3d 20 6e 53 75 66 66 69    zCsr += nSuffi
fa10: 78 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  x;..    /* Compa
fa20: 72 65 20 74 68 65 20 74 65 72 6d 20 77 65 20 61  re the term we a
fa30: 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  re searching for
fa40: 20 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 6a   with the term j
fa50: 75 73 74 20 6c 6f 61 64 65 64 20 66 72 6f 6d 0a  ust loaded from.
fa60: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 74 65 72      ** the inter
fa70: 69 6f 72 20 6e 6f 64 65 2e 20 49 66 20 74 68 65  ior node. If the
fa80: 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
fa90: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
faa0: 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20  or equal.    ** 
fab0: 74 6f 20 74 68 65 20 74 65 72 6d 20 66 72 6f 6d  to the term from
fac0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
fad0: 64 65 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  de, then all ter
fae0: 6d 73 20 6f 6e 20 74 68 65 20 73 75 62 2d 74 72  ms on the sub-tr
faf0: 65 65 20 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  ee .    ** heade
fb00: 64 20 62 79 20 6e 6f 64 65 20 69 43 68 69 6c 64  d by node iChild
fb10: 20 61 72 65 20 73 6d 61 6c 6c 65 72 20 74 68 61   are smaller tha
fb20: 6e 20 7a 54 65 72 6d 2e 20 4e 6f 20 6e 65 65 64  n zTerm. No need
fb30: 20 74 6f 20 73 65 61 72 63 68 20 0a 20 20 20 20   to search .    
fb40: 2a 2a 20 69 43 68 69 6c 64 2e 0a 20 20 20 20 2a  ** iChild..    *
fb50: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
fb60: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 74 65  interior node te
fb70: 72 6d 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  rm is larger tha
fb80: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
fb90: 74 65 72 6d 2c 20 74 68 65 6e 0a 20 20 20 20 2a  term, then.    *
fba0: 2a 20 74 68 65 20 74 72 65 65 20 68 65 61 64 65  * the tree heade
fbb0: 64 20 62 79 20 69 43 68 69 6c 64 20 6d 61 79 20  d by iChild may 
fbc0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63  contain the spec
fbd0: 69 66 69 65 64 20 74 65 72 6d 2e 0a 20 20 20 20  ified term..    
fbe0: 2a 2f 0a 20 20 20 20 63 6d 70 20 3d 20 6d 65 6d  */.    cmp = mem
fbf0: 63 6d 70 28 7a 54 65 72 6d 2c 20 7a 42 75 66 66  cmp(zTerm, zBuff
fc00: 65 72 2c 20 28 6e 42 75 66 66 65 72 3e 6e 54 65  er, (nBuffer>nTe
fc10: 72 6d 20 3f 20 6e 54 65 72 6d 20 3a 20 6e 42 75  rm ? nTerm : nBu
fc20: 66 66 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ffer));.    if( 
fc30: 70 69 46 69 72 73 74 20 26 26 20 28 63 6d 70 3c  piFirst && (cmp<
fc40: 30 20 7c 7c 20 28 63 6d 70 3d 3d 30 20 26 26 20  0 || (cmp==0 && 
fc50: 6e 42 75 66 66 65 72 3e 6e 54 65 72 6d 29 29 20  nBuffer>nTerm)) 
fc60: 29 7b 0a 20 20 20 20 20 20 2a 70 69 46 69 72 73  ){.      *piFirs
fc70: 74 20 3d 20 69 43 68 69 6c 64 3b 0a 20 20 20 20  t = iChild;.    
fc80: 20 20 70 69 46 69 72 73 74 20 3d 20 30 3b 0a 20    piFirst = 0;. 
fc90: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 69     }..    if( pi
fca0: 4c 61 73 74 20 26 26 20 63 6d 70 3c 30 20 29 7b  Last && cmp<0 ){
fcb0: 0a 20 20 20 20 20 20 2a 70 69 4c 61 73 74 20 3d  .      *piLast =
fcc0: 20 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 70   iChild;.      p
fcd0: 69 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  iLast = 0;.    }
fce0: 0a 0a 20 20 20 20 69 43 68 69 6c 64 2b 2b 3b 0a  ..    iChild++;.
fcf0: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 70 69 46 69    };..  if( piFi
fd00: 72 73 74 20 29 20 2a 70 69 46 69 72 73 74 20 3d  rst ) *piFirst =
fd10: 20 69 43 68 69 6c 64 3b 0a 20 20 69 66 28 20 70   iChild;.  if( p
fd20: 69 4c 61 73 74 20 29 20 2a 70 69 4c 61 73 74 20  iLast ) *piLast 
fd30: 3d 20 69 43 68 69 6c 64 3b 0a 0a 20 66 69 6e 69  = iChild;.. fini
fd40: 73 68 5f 73 63 61 6e 3a 0a 20 20 73 71 6c 69 74  sh_scan:.  sqlit
fd50: 65 33 5f 66 72 65 65 28 7a 42 75 66 66 65 72 29  e3_free(zBuffer)
fd60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
fd70: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 75 66  .../*.** The buf
fd80: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
fd90: 79 20 61 72 67 75 6d 65 6e 74 20 7a 4e 6f 64 65  y argument zNode
fda0: 20 28 73 69 7a 65 20 6e 4e 6f 64 65 20 62 79 74   (size nNode byt
fdb0: 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 61 6e 0a  es) contains an.
fdc0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ** interior node
fdd0: 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 65 67   of a b-tree seg
fde0: 6d 65 6e 74 2e 20 54 68 65 20 7a 54 65 72 6d 20  ment. The zTerm 
fdf0: 62 75 66 66 65 72 20 28 73 69 7a 65 20 6e 54 65  buffer (size nTe
fe00: 72 6d 20 62 79 74 65 73 29 0a 2a 2a 20 63 6f 6e  rm bytes).** con
fe10: 74 61 69 6e 73 20 61 20 74 65 72 6d 2e 20 54 68  tains a term. Th
fe20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  is function sear
fe30: 63 68 65 73 20 74 68 65 20 73 75 62 2d 74 72 65  ches the sub-tre
fe40: 65 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20  e headed by the 
fe50: 7a 4e 6f 64 65 0a 2a 2a 20 6e 6f 64 65 20 66 6f  zNode.** node fo
fe60: 72 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 6c  r the range of l
fe70: 65 61 66 20 6e 6f 64 65 73 20 74 68 61 74 20 6d  eaf nodes that m
fe80: 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73  ay contain the s
fe90: 70 65 63 69 66 69 65 64 20 74 65 72 6d 0a 2a 2a  pecified term.**
fea0: 20 6f 72 20 74 65 72 6d 73 20 66 6f 72 20 77 68   or terms for wh
feb0: 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ich the specifie
fec0: 64 20 74 65 72 6d 20 69 73 20 61 20 70 72 65 66  d term is a pref
fed0: 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c  ix..**.** If piL
fee0: 65 61 66 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  eaf is not NULL,
fef0: 20 74 68 65 6e 20 2a 70 69 4c 65 61 66 20 69 73   then *piLeaf is
ff00: 20 73 65 74 20 74 6f 20 74 68 65 20 62 6c 6f 63   set to the bloc
ff10: 6b 69 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6c  kid of the .** l
ff20: 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6e 6f  eft-most leaf no
ff30: 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  de in the tree t
ff40: 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  hat may contain 
ff50: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
ff60: 72 6d 2e 0a 2a 2a 20 49 66 20 70 69 4c 65 61 66  rm..** If piLeaf
ff70: 32 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  2 is not NULL, t
ff80: 68 65 6e 20 2a 70 69 4c 65 61 66 32 20 69 73 20  hen *piLeaf2 is 
ff90: 73 65 74 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b  set to the block
ffa0: 69 64 20 6f 66 20 74 68 65 0a 2a 2a 20 72 69 67  id of the.** rig
ffb0: 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6e 6f 64  ht-most leaf nod
ffc0: 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61  e that may conta
ffd0: 69 6e 20 61 20 74 65 72 6d 20 66 6f 72 20 77 68  in a term for wh
ffe0: 69 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ich the specifie
fff0: 64 0a 2a 2a 20 74 65 72 6d 20 69 73 20 61 20 70  d.** term is a p
10000 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  refix..**.** It 
10010 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
10020 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65   the range of re
10030 74 75 72 6e 65 64 20 6c 65 61 66 20 6e 6f 64 65  turned leaf node
10040 73 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  s does not conta
10050 69 6e 20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  in .** the speci
10060 66 69 65 64 20 74 65 72 6d 20 6f 72 20 61 6e 79  fied term or any
10070 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68   terms for which
10080 20 69 74 20 69 73 20 61 20 70 72 65 66 69 78 2e   it is a prefix.
10090 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
100a0 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 64 6f 65   .** segment doe
100b0 73 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 73 75  s contain any su
100c0 63 68 20 74 65 72 6d 73 2c 20 74 68 65 79 20 61  ch terms, they a
100d0 72 65 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  re stored within
100e0 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 0a   the identified.
100f0 2a 2a 20 72 61 6e 67 65 2e 20 42 65 63 61 75 73  ** range. Becaus
10100 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
10110 6f 6e 6c 79 20 69 6e 73 70 65 63 74 73 20 69 6e  only inspects in
10120 74 65 72 69 6f 72 20 73 65 67 6d 65 6e 74 20 6e  terior segment n
10130 6f 64 65 73 20 28 61 6e 64 0a 2a 2a 20 6e 65 76  odes (and.** nev
10140 65 72 20 6c 6f 61 64 73 20 6c 65 61 66 20 6e 6f  er loads leaf no
10150 64 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 29  des into memory)
10160 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
10170 69 62 6c 65 20 74 6f 20 62 65 20 73 75 72 65 2e  ible to be sure.
10180 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
10190 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
101a0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
101b0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  han SQLITE_OK is
101c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 73   returned..*/ .s
101d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
101e0 6c 65 63 74 4c 65 61 66 28 0a 20 20 46 74 73 33  lectLeaf(.  Fts3
101f0 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20  Table *p,       
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
10210 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e  irtual table han
10220 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
10230 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
10240 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
10250 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61 76 65   to select leave
10260 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  s for */.  int n
10270 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20  Term,           
10280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10290 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 72 6d  ze of term zTerm
102a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
102b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f 64 65  onst char *zNode
102c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
102d0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
102e0 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e 74 65  ing segment inte
102f0 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20 20 69  rior node */.  i
10300 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20 20 20  nt nNode,       
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10320 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
10330 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20 20 73   at zNode */.  s
10340 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
10350 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 20 2f  Leaf,          /
10360 2a 20 53 65 6c 65 63 74 65 64 20 6c 65 61 66 20  * Selected leaf 
10370 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
10380 33 5f 69 6e 74 36 34 20 2a 70 69 4c 65 61 66 32  3_int64 *piLeaf2
10390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
103a0 65 63 74 65 64 20 6c 65 61 66 20 6e 6f 64 65 20  ected leaf node 
103b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
103c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
103d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
103e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
103f0 69 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  iHeight;        
10400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10410 65 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f  eight of this no
10420 64 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 0a 20  de in tree */.. 
10430 20 61 73 73 65 72 74 28 20 70 69 4c 65 61 66 20   assert( piLeaf 
10440 7c 7c 20 70 69 4c 65 61 66 32 20 29 3b 0a 0a 20  || piLeaf2 );.. 
10450 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32   fts3GetVarint32
10460 28 7a 4e 6f 64 65 2c 20 26 69 48 65 69 67 68 74  (zNode, &iHeight
10470 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 63  );.  rc = fts3Sc
10480 61 6e 49 6e 74 65 72 69 6f 72 4e 6f 64 65 28 7a  anInteriorNode(z
10490 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 4e 6f  Term, nTerm, zNo
104a0 64 65 2c 20 6e 4e 6f 64 65 2c 20 70 69 4c 65 61  de, nNode, piLea
104b0 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a 20 20 61  f, piLeaf2);.  a
104c0 73 73 65 72 74 28 20 21 70 69 4c 65 61 66 32 20  ssert( !piLeaf2 
104d0 7c 7c 20 21 70 69 4c 65 61 66 20 7c 7c 20 72 63  || !piLeaf || rc
104e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
104f0 2a 70 69 4c 65 61 66 3c 3d 2a 70 69 4c 65 61 66  *piLeaf<=*piLeaf
10500 32 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  2) );..  if( rc=
10510 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 48  =SQLITE_OK && iH
10520 65 69 67 68 74 3e 31 20 29 7b 0a 20 20 20 20 63  eight>1 ){.    c
10530 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 30 3b 20  har *zBlob = 0; 
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10550 42 6c 6f 62 20 72 65 61 64 20 66 72 6f 6d 20 25  Blob read from %
10560 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20  _segments table 
10570 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62  */.    int nBlob
10580 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10590 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
105a0 7a 42 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a  zBlob in bytes *
105b0 2f 0a 0a 20 20 20 20 69 66 28 20 70 69 4c 65 61  /..    if( piLea
105c0 66 20 26 26 20 70 69 4c 65 61 66 32 20 26 26 20  f && piLeaf2 && 
105d0 28 2a 70 69 4c 65 61 66 21 3d 2a 70 69 4c 65 61  (*piLeaf!=*piLea
105e0 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f2) ){.      rc 
105f0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61  = sqlite3Fts3Rea
10600 64 42 6c 6f 63 6b 28 70 2c 20 2a 70 69 4c 65 61  dBlock(p, *piLea
10610 66 2c 20 26 7a 42 6c 6f 62 2c 20 26 6e 42 6c 6f  f, &zBlob, &nBlo
10620 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  b, 0);.      if(
10630 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10640 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
10650 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c  ts3SelectLeaf(p,
10660 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a   zTerm, nTerm, z
10670 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 69 4c  Blob, nBlob, piL
10680 65 61 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  eaf, 0);.      }
10690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
106a0 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20 20 20 20  ree(zBlob);.    
106b0 20 20 70 69 4c 65 61 66 20 3d 20 30 3b 0a 20 20    piLeaf = 0;.  
106c0 20 20 20 20 7a 42 6c 6f 62 20 3d 20 30 3b 0a 20      zBlob = 0;. 
106d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
106e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
106f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10700 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70  3Fts3ReadBlock(p
10710 2c 20 70 69 4c 65 61 66 3f 2a 70 69 4c 65 61 66  , piLeaf?*piLeaf
10720 3a 2a 70 69 4c 65 61 66 32 2c 20 26 7a 42 6c 6f  :*piLeaf2, &zBlo
10730 62 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20  b, &nBlob, 0);. 
10740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
10750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10760 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 6c      rc = fts3Sel
10770 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72 6d  ectLeaf(p, zTerm
10780 2c 20 6e 54 65 72 6d 2c 20 7a 42 6c 6f 62 2c 20  , nTerm, zBlob, 
10790 6e 42 6c 6f 62 2c 20 70 69 4c 65 61 66 2c 20 70  nBlob, piLeaf, p
107a0 69 4c 65 61 66 32 29 3b 0a 20 20 20 20 7d 0a 20  iLeaf2);.    }. 
107b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
107c0 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72  zBlob);.  }..  r
107d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
107e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
107f0 20 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61   is used to crea
10800 74 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64  te delta-encoded
10810 20 73 65 72 69 61 6c 69 7a 65 64 20 6c 69 73 74   serialized list
10820 73 20 6f 66 20 46 54 53 33 20 0a 2a 2a 20 76 61  s of FTS3 .** va
10830 72 69 6e 74 73 2e 20 45 61 63 68 20 63 61 6c 6c  rints. Each call
10840 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10850 6e 20 61 70 70 65 6e 64 73 20 61 20 73 69 6e 67  n appends a sing
10860 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20 6c  le varint to a l
10870 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
10880 6f 69 64 20 66 74 73 33 50 75 74 44 65 6c 74 61  oid fts3PutDelta
10890 56 61 72 69 6e 74 28 0a 20 20 63 68 61 72 20 2a  Varint(.  char *
108a0 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
108b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
108c0 4f 55 54 3a 20 4f 75 74 70 75 74 20 70 6f 69 6e  OUT: Output poin
108d0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
108e0 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76 2c 20  _int64 *piPrev, 
108f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
10900 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76 61 6c  UT: Previous val
10910 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 69  ue written to li
10920 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
10930 69 6e 74 36 34 20 69 56 61 6c 20 20 20 20 20 20  int64 iVal      
10940 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
10950 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 74   this value to t
10960 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  he list */.){.  
10970 61 73 73 65 72 74 28 20 69 56 61 6c 2d 2a 70 69  assert( iVal-*pi
10980 50 72 65 76 20 3e 20 30 20 7c 7c 20 28 2a 70 69  Prev > 0 || (*pi
10990 50 72 65 76 3d 3d 30 20 26 26 20 69 56 61 6c 3d  Prev==0 && iVal=
109a0 3d 30 29 20 29 3b 0a 20 20 2a 70 70 20 2b 3d 20  =0) );.  *pp += 
109b0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
109c0 72 69 6e 74 28 2a 70 70 2c 20 69 56 61 6c 2d 2a  rint(*pp, iVal-*
109d0 70 69 50 72 65 76 29 3b 0a 20 20 2a 70 69 50 72  piPrev);.  *piPr
109e0 65 76 20 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a  ev = iVal;.}../*
109f0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
10a00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
10a10 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 69 73 20  , *ppPoslist is 
10a20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74  assumed to point
10a30 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 74 61 72   to the .** star
10a40 74 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 2d  t of a position-
10a50 6c 69 73 74 2e 20 41 66 74 65 72 20 69 74 20 72  list. After it r
10a60 65 74 75 72 6e 73 2c 20 2a 70 70 50 6f 73 6c 69  eturns, *ppPosli
10a70 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  st points to the
10a80 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 61  .** first byte a
10a90 66 74 65 72 20 74 68 65 20 70 6f 73 69 74 69 6f  fter the positio
10aa0 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  n-list..**.** A 
10ab0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73  position list is
10ac0 20 6c 69 73 74 20 6f 66 20 70 6f 73 69 74 69 6f   list of positio
10ad0 6e 73 20 28 64 65 6c 74 61 20 65 6e 63 6f 64 65  ns (delta encode
10ae0 64 29 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 66  d) and columns f
10af0 6f 72 20 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  or .** a single 
10b00 64 6f 63 75 6d 65 6e 74 20 72 65 63 6f 72 64 20  document record 
10b10 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 20 53  of a doclist.  S
10b20 6f 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  o, in other word
10b30 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  s, this.** routi
10b40 6e 65 20 61 64 76 61 6e 63 65 73 20 2a 70 70 50  ne advances *ppP
10b50 6f 73 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69  oslist so that i
10b60 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
10b70 6e 65 78 74 20 64 6f 63 69 64 20 69 6e 0a 2a 2a  next docid in.**
10b80 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20 6f 72   the doclist, or
10b90 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
10ba0 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
10bb0 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  of the doclist..
10bc0 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20 6e  **.** If pp is n
10bd0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
10be0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10bf0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
10c00 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f  are copied.** to
10c10 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74   *pp. *pp is set
10c20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10c30 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
10c40 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63   the last byte c
10c50 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  opied.** before 
10c60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10c70 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
10c80 20 76 6f 69 64 20 66 74 73 33 50 6f 73 6c 69 73   void fts3Poslis
10c90 74 43 6f 70 79 28 63 68 61 72 20 2a 2a 70 70 2c  tCopy(char **pp,
10ca0 20 63 68 61 72 20 2a 2a 70 70 50 6f 73 6c 69 73   char **ppPoslis
10cb0 74 29 7b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  t){.  char *pEnd
10cc0 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74 3b 0a 20   = *ppPoslist;. 
10cd0 20 63 68 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20   char c = 0;..  
10ce0 2f 2a 20 54 68 65 20 65 6e 64 20 6f 66 20 61 20  /* The end of a 
10cf0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73  position list is
10d00 20 6d 61 72 6b 65 64 20 62 79 20 61 20 7a 65 72   marked by a zer
10d10 6f 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20  o encoded as an 
10d20 46 54 53 33 20 0a 20 20 2a 2a 20 76 61 72 69 6e  FTS3 .  ** varin
10d30 74 2e 20 41 20 73 69 6e 67 6c 65 20 50 4f 53 5f  t. A single POS_
10d40 45 4e 44 20 28 30 29 20 62 79 74 65 2e 20 45 78  END (0) byte. Ex
10d50 63 65 70 74 2c 20 69 66 20 74 68 65 20 30 20 62  cept, if the 0 b
10d60 79 74 65 20 69 73 20 70 72 65 63 65 64 65 64 20  yte is preceded 
10d70 62 79 0a 20 20 2a 2a 20 61 20 62 79 74 65 20 77  by.  ** a byte w
10d80 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69 74  ith the 0x80 bit
10d90 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
10da0 20 6e 6f 74 20 61 20 76 61 72 69 6e 74 20 30 2c   not a varint 0,
10db0 20 62 75 74 20 74 68 65 20 74 61 69 6c 0a 20 20   but the tail.  
10dc0 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f 74 68 65 72  ** of some other
10dd0 2c 20 6d 75 6c 74 69 2d 62 79 74 65 2c 20 76 61  , multi-byte, va
10de0 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  lue..  **.  ** T
10df0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 69  he following whi
10e00 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65 73 20 70 45  le-loop moves pE
10e10 6e 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nd to point to t
10e20 68 65 20 66 69 72 73 74 20 62 79 74 65 20 74 68  he first byte th
10e30 61 74 20 69 73 20 6e 6f 74 20 0a 20 20 2a 2a 20  at is not .  ** 
10e40 69 6d 6d 65 64 69 61 74 65 6c 79 20 70 72 65 63  immediately prec
10e50 65 64 65 64 20 62 79 20 61 20 62 79 74 65 20 77  eded by a byte w
10e60 69 74 68 20 74 68 65 20 30 78 38 30 20 62 69 74  ith the 0x80 bit
10e70 20 73 65 74 2e 20 54 68 65 6e 20 69 6e 63 72 65   set. Then incre
10e80 6d 65 6e 74 73 0a 20 20 2a 2a 20 70 45 6e 64 20  ments.  ** pEnd 
10e90 6f 6e 63 65 20 6d 6f 72 65 20 73 6f 20 74 68 61  once more so tha
10ea0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
10eb0 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
10ec0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
10ed0 65 0a 20 20 2a 2a 20 6c 61 73 74 20 62 79 74 65  e.  ** last byte
10ee0 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
10ef0 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 77 68  -list..  */.  wh
10f00 69 6c 65 28 20 2a 70 45 6e 64 20 7c 20 63 20 29  ile( *pEnd | c )
10f10 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64 2b  {.    c = *pEnd+
10f20 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74 65  + & 0x80;.    te
10f30 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26 20  stcase( c!=0 && 
10f40 28 2a 70 45 6e 64 29 3d 3d 30 20 29 3b 0a 20 20  (*pEnd)==0 );.  
10f50 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20 20 2f 2a 20  }.  pEnd++;  /* 
10f60 41 64 76 61 6e 63 65 20 70 61 73 74 20 74 68 65  Advance past the
10f70 20 50 4f 53 5f 45 4e 44 20 74 65 72 6d 69 6e 61   POS_END termina
10f80 74 6f 72 20 62 79 74 65 20 2a 2f 0a 0a 20 20 69  tor byte */..  i
10f90 66 28 20 70 70 20 29 7b 0a 20 20 20 20 69 6e 74  f( pp ){.    int
10fa0 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 20   n = (int)(pEnd 
10fb0 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20  - *ppPoslist);. 
10fc0 20 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70     char *p = *pp
10fd0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
10fe0 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a  *ppPoslist, n);.
10ff0 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20      p += n;.    
11000 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a  *pp = p;.  }.  *
11010 70 70 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64  ppPoslist = pEnd
11020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
11030 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11040 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f 73 6c   called, *ppPosl
11050 69 73 74 20 69 73 20 61 73 73 75 6d 65 64 20 74  ist is assumed t
11060 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
11070 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 63 6f  ** start of a co
11080 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41 66 74 65 72  lumn-list. After
11090 20 69 74 20 72 65 74 75 72 6e 73 2c 20 2a 70 70   it returns, *pp
110a0 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73 20 74  Poslist points t
110b0 6f 20 74 68 65 0a 2a 2a 20 74 6f 20 74 68 65 20  o the.** to the 
110c0 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f  terminator (POS_
110d0 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e  COLUMN or POS_EN
110e0 44 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  D) byte of the c
110f0 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a  olumn-list..**.*
11100 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  * A column-list 
11110 69 73 20 6c 69 73 74 20 6f 66 20 64 65 6c 74 61  is list of delta
11120 2d 65 6e 63 6f 64 65 64 20 70 6f 73 69 74 69 6f  -encoded positio
11130 6e 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ns for a single 
11140 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69 74 68 69 6e  column.** within
11150 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 75 6d 65   a single docume
11160 6e 74 20 77 69 74 68 69 6e 20 61 20 64 6f 63 6c  nt within a docl
11170 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ist..**.** The c
11180 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 74 65  olumn-list is te
11190 72 6d 69 6e 61 74 65 64 20 65 69 74 68 65 72 20  rminated either 
111a0 62 79 20 61 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20  by a POS_COLUMN 
111b0 76 61 72 69 6e 74 20 28 31 29 20 6f 72 0a 2a 2a  varint (1) or.**
111c0 20 61 20 50 4f 53 5f 45 4e 44 20 76 61 72 69 6e   a POS_END varin
111d0 74 20 28 30 29 2e 20 20 54 68 69 73 20 72 6f 75  t (0).  This rou
111e0 74 69 6e 65 20 6c 65 61 76 65 73 20 2a 70 70 50  tine leaves *ppP
111f0 6f 73 6c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  oslist pointing 
11200 74 6f 0a 2a 2a 20 74 68 65 20 50 4f 53 5f 43 4f  to.** the POS_CO
11210 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44 20  LUMN or POS_END 
11220 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
11230 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e  the column-list.
11240 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20 69 73 20  .**.** If pp is 
11250 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
11260 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11270 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 61  he column-list a
11280 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 74 6f 20  re copied.** to 
11290 2a 70 70 2e 20 2a 70 70 20 69 73 20 73 65 74 20  *pp. *pp is set 
112a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
112b0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
112c0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 63 6f  the last byte co
112d0 70 69 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 74  pied.** before t
112e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
112f0 75 72 6e 73 2e 20 20 54 68 65 20 50 4f 53 5f 43  urns.  The POS_C
11300 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f 45 4e 44  OLUMN or POS_END
11310 20 74 65 72 6d 69 6e 61 74 6f 72 0a 2a 2a 20 69   terminator.** i
11320 73 20 6e 6f 74 20 63 6f 70 69 65 64 20 69 6e 74  s not copied int
11330 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  o *pp..*/.static
11340 20 76 6f 69 64 20 66 74 73 33 43 6f 6c 75 6d 6e   void fts3Column
11350 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a 2a  listCopy(char **
11360 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f 73  pp, char **ppPos
11370 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a 70  list){.  char *p
11380 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73 74  End = *ppPoslist
11390 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b 0a  ;.  char c = 0;.
113a0 0a 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c  .  /* A column-l
113b0 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
113c0 64 20 62 79 20 65 69 74 68 65 72 20 61 20 30 78  d by either a 0x
113d0 30 31 20 6f 72 20 30 78 30 30 20 62 79 74 65 20  01 or 0x00 byte 
113e0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  that is.  ** not
113f0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
11400 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20 20  -byte varint..  
11410 2a 2f 0a 20 20 77 68 69 6c 65 28 20 30 78 46 45  */.  while( 0xFE
11420 20 26 20 28 2a 70 45 6e 64 20 7c 20 63 29 20 29   & (*pEnd | c) )
11430 7b 0a 20 20 20 20 63 20 3d 20 2a 70 45 6e 64 2b  {.    c = *pEnd+
11440 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 74 65  + & 0x80;.    te
11450 73 74 63 61 73 65 28 20 63 21 3d 30 20 26 26 20  stcase( c!=0 && 
11460 28 28 2a 70 45 6e 64 29 26 30 78 66 65 29 3d 3d  ((*pEnd)&0xfe)==
11470 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0 );.  }.  if( p
11480 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  p ){.    int n =
11490 20 28 69 6e 74 29 28 70 45 6e 64 20 2d 20 2a 70   (int)(pEnd - *p
114a0 70 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 63  pPoslist);.    c
114b0 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  har *p = *pp;.  
114c0 20 20 6d 65 6d 63 70 79 28 70 2c 20 2a 70 70 50    memcpy(p, *ppP
114d0 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a 20 20 20 20  oslist, n);.    
114e0 70 20 2b 3d 20 6e 3b 0a 20 20 20 20 2a 70 70 20  p += n;.    *pp 
114f0 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 6f  = p;.  }.  *ppPo
11500 73 6c 69 73 74 20 3d 20 70 45 6e 64 3b 0a 7d 0a  slist = pEnd;.}.
11510 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 75 73 65  ./*.** Value use
11520 64 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  d to signify the
11530 20 65 6e 64 20 6f 66 20 61 6e 20 70 6f 73 69 74   end of an posit
11540 69 6f 6e 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ion-list. This i
11550 73 20 73 61 66 65 20 62 65 63 61 75 73 65 0a 2a  s safe because.*
11560 2a 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * it is not poss
11570 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 64  ible to have a d
11580 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 32 5e 33  ocument with 2^3
11590 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a 23 64 65 66  1 terms..*/.#def
115a0 69 6e 65 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53  ine POSITION_LIS
115b0 54 5f 45 4e 44 20 30 78 37 66 66 66 66 66 66 66  T_END 0x7fffffff
115c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
115d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
115e0 20 68 65 6c 70 20 70 61 72 73 65 20 70 6f 73 69   help parse posi
115f0 74 69 6f 6e 2d 6c 69 73 74 73 2e 20 57 68 65 6e  tion-lists. When
11600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11610 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a 70 70  s.** called, *pp
11620 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 74 68   may point to th
11630 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
11640 65 78 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68  ext varint in th
11650 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
11660 2a 2a 20 62 65 69 6e 67 20 70 61 72 73 65 64 2c  ** being parsed,
11670 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
11680 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20   to 1 byte past 
11690 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
116a0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a 2a 2a 20  osition-list.** 
116b0 28 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 2a  (in which case *
116c0 2a 70 70 20 77 69 6c 6c 20 62 65 20 61 20 74 65  *pp will be a te
116d0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 50  rminator bytes P
116e0 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72 0a 2a 2a  OS_END (0) or.**
116f0 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   (1))..**.** If 
11700 2a 70 70 20 70 6f 69 6e 74 73 20 70 61 73 74 20  *pp points past 
11710 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63  the end of the c
11720 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 2d  urrent position-
11730 6c 69 73 74 2c 20 73 65 74 20 2a 70 69 20 74 6f  list, set *pi to
11740 20 0a 2a 2a 20 50 4f 53 49 54 49 4f 4e 5f 4c 49   .** POSITION_LI
11750 53 54 5f 45 4e 44 20 61 6e 64 20 72 65 74 75 72  ST_END and retur
11760 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  n. Otherwise, re
11770 61 64 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  ad the next vari
11780 6e 74 20 66 72 6f 6d 20 2a 70 70 2c 0a 2a 2a 20  nt from *pp,.** 
11790 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 75  increment the cu
117a0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 2a  rrent value of *
117b0 70 69 20 62 79 20 74 68 65 20 76 61 6c 75 65 20  pi by the value 
117c0 72 65 61 64 2c 20 61 6e 64 20 73 65 74 20 2a 70  read, and set *p
117d0 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  p to.** point to
117e0 20 74 68 65 20 6e 65 78 74 20 76 61 6c 75 65 20   the next value 
117f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
11800 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63  ..**.** Before c
11810 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
11820 69 6e 65 20 2a 70 69 20 6d 75 73 74 20 62 65 20  ine *pi must be 
11830 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
11840 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
11850 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 73 69  he previous posi
11860 74 69 6f 6e 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tion, or zero if
11870 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
11880 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69  the first positi
11890 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 70 6f 73  on.** in the pos
118a0 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 20 42 65 63  ition-list.  Bec
118b0 61 75 73 65 20 70 6f 73 69 74 69 6f 6e 73 20 61  ause positions a
118c0 72 65 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64  re delta-encoded
118d0 2c 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  , the value.** o
118e0 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  f the previous p
118f0 6f 73 69 74 69 6f 6e 20 69 73 20 6e 65 65 64 65  osition is neede
11900 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  d in order to co
11910 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
11920 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 70  of.** the next p
11930 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
11940 69 63 20 76 6f 69 64 20 66 74 73 33 52 65 61 64  ic void fts3Read
11950 4e 65 78 74 50 6f 73 28 0a 20 20 63 68 61 72 20  NextPos(.  char 
11960 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
11970 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
11980 55 54 3a 20 50 6f 69 6e 74 65 72 20 69 6e 74 6f  UT: Pointer into
11990 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 62   position-list b
119a0 75 66 66 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  uffer */.  sqlit
119b0 65 33 5f 69 6e 74 36 34 20 2a 70 69 20 20 20 20  e3_int64 *pi    
119c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
119d0 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
119e0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  rom position-lis
119f0 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 2a  t */.){.  if( (*
11a00 2a 70 70 29 26 30 78 46 45 20 29 7b 0a 20 20 20  *pp)&0xFE ){.   
11a10 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
11a20 69 6e 74 28 70 70 2c 20 70 69 29 3b 0a 20 20 20  int(pp, pi);.   
11a30 20 2a 70 69 20 2d 3d 20 32 3b 0a 20 20 7d 65 6c   *pi -= 2;.  }el
11a40 73 65 7b 0a 20 20 20 20 2a 70 69 20 3d 20 50 4f  se{.    *pi = PO
11a50 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
11a60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
11a70 20 70 61 72 61 6d 65 74 65 72 20 69 43 6f 6c 20   parameter iCol 
11a80 69 73 20 6e 6f 74 20 30 2c 20 77 72 69 74 65 20  is not 0, write 
11a90 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 28 31  an POS_COLUMN (1
11aa0 29 20 62 79 74 65 20 66 6f 6c 6c 6f 77 65 64 20  ) byte followed 
11ab0 62 79 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  by.** the value 
11ac0 6f 66 20 69 43 6f 6c 20 65 6e 63 6f 64 65 64 20  of iCol encoded 
11ad0 61 73 20 61 20 76 61 72 69 6e 74 20 74 6f 20 2a  as a varint to *
11ae0 70 70 2e 20 20 20 54 68 69 73 20 77 69 6c 6c 20  pp.   This will 
11af0 73 74 61 72 74 20 61 20 6e 65 77 0a 2a 2a 20 63  start a new.** c
11b00 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  olumn list..**.*
11b10 2a 20 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  * Set *pp to poi
11b20 6e 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6a  nt to the byte j
11b30 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6c 61  ust after the la
11b40 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
11b50 62 65 66 6f 72 65 20 0a 2a 2a 20 72 65 74 75 72  before .** retur
11b60 6e 69 6e 67 20 28 64 6f 20 6e 6f 74 20 6d 6f 64  ning (do not mod
11b70 69 66 79 20 69 74 20 69 66 20 69 43 6f 6c 3d 3d  ify it if iCol==
11b80 30 29 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74  0). Return the t
11b90 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
11ba0 79 74 65 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ytes.** written 
11bb0 28 30 20 69 66 20 69 43 6f 6c 3d 3d 30 29 2e 0a  (0 if iCol==0)..
11bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
11bd0 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28 63  s3PutColNumber(c
11be0 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74 20 69 43  har **pp, int iC
11bf0 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ol){.  int n = 0
11c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11c20 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
11c30 6e 20 2a 2f 0a 20 20 69 66 28 20 69 43 6f 6c 20  n */.  if( iCol 
11c40 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  ){.    char *p =
11c50 20 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20   *pp;           
11c60 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 70       /* Output p
11c70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 6e 20  ointer */.    n 
11c80 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = 1 + sqlite3Fts
11c90 33 50 75 74 56 61 72 69 6e 74 28 26 70 5b 31 5d  3PutVarint(&p[1]
11ca0 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 20  , iCol);.    *p 
11cb0 3d 20 30 78 30 31 3b 0a 20 20 20 20 2a 70 70 20  = 0x01;.    *pp 
11cc0 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d 0a 20 20 72  = &p[n];.  }.  r
11cd0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
11ce0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 75 6e  * Compute the un
11cf0 69 6f 6e 20 6f 66 20 74 77 6f 20 70 6f 73 69 74  ion of two posit
11d00 69 6f 6e 20 6c 69 73 74 73 2e 20 20 54 68 65 20  ion lists.  The 
11d10 6f 75 74 70 75 74 20 77 72 69 74 74 65 6e 0a 2a  output written.*
11d20 2a 20 69 6e 74 6f 20 2a 70 70 20 63 6f 6e 74 61  * into *pp conta
11d30 69 6e 73 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e  ins all position
11d40 73 20 6f 66 20 62 6f 74 68 20 2a 70 70 31 20 61  s of both *pp1 a
11d50 6e 64 20 2a 70 70 32 20 69 6e 20 73 6f 72 74 65  nd *pp2 in sorte
11d60 64 0a 2a 2a 20 6f 72 64 65 72 20 61 6e 64 20 77  d.** order and w
11d70 69 74 68 20 61 6e 79 20 64 75 70 6c 69 63 61 74  ith any duplicat
11d80 65 73 20 72 65 6d 6f 76 65 64 2e 20 20 41 6c 6c  es removed.  All
11d90 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a   pointers are.**
11da0 20 75 70 64 61 74 65 64 20 61 70 70 72 6f 70 72   updated appropr
11db0 69 61 74 65 6c 79 2e 20 20 20 54 68 65 20 63 61  iately.   The ca
11dc0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
11dd0 62 6c 65 20 66 6f 72 20 69 6e 73 75 72 69 6e 67  ble for insuring
11de0 0a 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20 69  .** that there i
11df0 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69  s enough space i
11e00 6e 20 2a 70 70 20 74 6f 20 68 6f 6c 64 20 74 68  n *pp to hold th
11e10 65 20 63 6f 6d 70 6c 65 74 65 20 6f 75 74 70 75  e complete outpu
11e20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11e30 64 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72  d fts3PoslistMer
11e40 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c  ge(.  char **pp,
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
11e70 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72  buffer */.  char
11e80 20 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20   **pp1,         
11e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11ea0 65 66 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a  eft input list *
11eb0 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20  /.  char **pp2  
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 69 6e 70      /* Right inp
11ee0 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  ut list */.){.  
11ef0 63 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20  char *p = *pp;. 
11f00 20 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31   char *p1 = *pp1
11f10 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a  ;.  char *p2 = *
11f20 70 70 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  pp2;..  while( *
11f30 70 31 20 7c 7c 20 2a 70 32 20 29 7b 0a 20 20 20  p1 || *p2 ){.   
11f40 20 69 6e 74 20 69 43 6f 6c 31 3b 20 20 20 20 20   int iCol1;     
11f50 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
11f60 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  nt column index 
11f70 69 6e 20 70 70 31 20 2a 2f 0a 20 20 20 20 69 6e  in pp1 */.    in
11f80 74 20 69 43 6f 6c 32 3b 20 20 20 20 20 20 20 20  t iCol2;        
11f90 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
11fa0 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20  column index in 
11fb0 70 70 32 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  pp2 */..    if( 
11fc0 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20  *p1==POS_COLUMN 
11fd0 29 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  ) fts3GetVarint3
11fe0 32 28 26 70 31 5b 31 5d 2c 20 26 69 43 6f 6c 31  2(&p1[1], &iCol1
11ff0 29 3b 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  );.    else if( 
12000 2a 70 31 3d 3d 50 4f 53 5f 45 4e 44 20 29 20 69  *p1==POS_END ) i
12010 43 6f 6c 31 20 3d 20 50 4f 53 49 54 49 4f 4e 5f  Col1 = POSITION_
12020 4c 49 53 54 5f 45 4e 44 3b 0a 20 20 20 20 65 6c  LIST_END;.    el
12030 73 65 20 69 43 6f 6c 31 20 3d 20 30 3b 0a 0a 20  se iCol1 = 0;.. 
12040 20 20 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f     if( *p2==POS_
12050 43 4f 4c 55 4d 4e 20 29 20 66 74 73 33 47 65 74  COLUMN ) fts3Get
12060 56 61 72 69 6e 74 33 32 28 26 70 32 5b 31 5d 2c  Varint32(&p2[1],
12070 20 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 65 6c   &iCol2);.    el
12080 73 65 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f  se if( *p2==POS_
12090 45 4e 44 20 29 20 69 43 6f 6c 32 20 3d 20 50 4f  END ) iCol2 = PO
120a0 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
120b0 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 32 20  .    else iCol2 
120c0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 43  = 0;..    if( iC
120d0 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29 7b 0a 20 20  ol1==iCol2 ){.  
120e0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
120f0 34 20 69 31 20 3d 20 30 3b 20 20 20 20 20 20 20  4 i1 = 0;       
12100 2f 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e  /* Last position
12110 20 66 72 6f 6d 20 70 70 31 20 2a 2f 0a 20 20 20   from pp1 */.   
12120 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
12130 20 69 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f   i2 = 0;       /
12140 2a 20 4c 61 73 74 20 70 6f 73 69 74 69 6f 6e 20  * Last position 
12150 66 72 6f 6d 20 70 70 32 20 2a 2f 0a 20 20 20 20  from pp2 */.    
12160 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12170 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  iPrev = 0;.     
12180 20 69 6e 74 20 6e 20 3d 20 66 74 73 33 50 75 74   int n = fts3Put
12190 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43  ColNumber(&p, iC
121a0 6f 6c 31 29 3b 0a 20 20 20 20 20 20 70 31 20 2b  ol1);.      p1 +
121b0 3d 20 6e 3b 0a 20 20 20 20 20 20 70 32 20 2b 3d  = n;.      p2 +=
121c0 20 6e 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74   n;..      /* At
121d0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 62 6f 74   this point, bot
121e0 68 20 70 31 20 61 6e 64 20 70 32 20 70 6f 69 6e  h p1 and p2 poin
121f0 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
12200 66 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 73 0a 20  f column-lists. 
12210 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
12220 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 28 74 68 65  same column (the
12230 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 69 6e 64   column with ind
12240 65 78 20 69 43 6f 6c 31 20 61 6e 64 20 69 43 6f  ex iCol1 and iCo
12250 6c 32 29 2e 0a 20 20 20 20 20 20 2a 2a 20 41 20  l2)..      ** A 
12260 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 61  column-list is a
12270 20 6c 69 73 74 20 6f 66 20 6e 6f 6e 2d 6e 65 67   list of non-neg
12280 61 74 69 76 65 20 64 65 6c 74 61 2d 65 6e 63 6f  ative delta-enco
12290 64 65 64 20 76 61 72 69 6e 74 73 2c 20 65 61 63  ded varints, eac
122a0 68 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  h .      ** incr
122b0 65 6d 65 6e 74 65 64 20 62 79 20 32 20 62 65 66  emented by 2 bef
122c0 6f 72 65 20 62 65 69 6e 67 20 73 74 6f 72 65 64  ore being stored
122d0 2e 20 45 61 63 68 20 6c 69 73 74 20 69 73 20 74  . Each list is t
122e0 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 0a 20  erminated by a. 
122f0 20 20 20 20 20 2a 2a 20 50 4f 53 5f 45 4e 44 20       ** POS_END 
12300 28 30 29 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d  (0) or POS_COLUM
12310 4e 20 28 31 29 2e 20 54 68 65 20 66 6f 6c 6c 6f  N (1). The follo
12320 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 65 72 67 65  wing block merge
12330 73 20 74 68 65 20 74 77 6f 20 6c 69 73 74 73 0a  s the two lists.
12340 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 77 72 69        ** and wri
12350 74 65 73 20 74 68 65 20 72 65 73 75 6c 74 73 20  tes the results 
12360 74 6f 20 62 75 66 66 65 72 20 70 2e 20 70 20 69  to buffer p. p i
12370 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
12380 74 6f 20 74 68 65 20 62 79 74 65 0a 20 20 20 20  to the byte.    
12390 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6c    ** after the l
123a0 69 73 74 20 77 72 69 74 74 65 6e 2e 20 4e 6f 20  ist written. No 
123b0 74 65 72 6d 69 6e 61 74 6f 72 20 28 50 4f 53 5f  terminator (POS_
123c0 45 4e 44 20 6f 72 20 50 4f 53 5f 43 4f 4c 55 4d  END or POS_COLUM
123d0 4e 29 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 77  N) is.      ** w
123e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
123f0 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
12400 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
12410 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 31  aVarint(&p1, &i1
12420 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
12430 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c  DeltaVarint(&p2,
12440 20 26 69 32 29 3b 0a 20 20 20 20 20 20 64 6f 20   &i2);.      do 
12450 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50 75  {.        fts3Pu
12460 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
12470 20 26 69 50 72 65 76 2c 20 28 69 31 3c 69 32 29   &iPrev, (i1<i2)
12480 20 3f 20 69 31 20 3a 20 69 32 29 3b 20 0a 20 20   ? i1 : i2); .  
12490 20 20 20 20 20 20 69 50 72 65 76 20 2d 3d 20 32        iPrev -= 2
124a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
124b0 3d 3d 69 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==i2 ){.        
124c0 20 20 66 74 73 33 52 65 61 64 4e 65 78 74 50 6f    fts3ReadNextPo
124d0 73 28 26 70 31 2c 20 26 69 31 29 3b 0a 20 20 20  s(&p1, &i1);.   
124e0 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e         fts3ReadN
124f0 65 78 74 50 6f 73 28 26 70 32 2c 20 26 69 32 29  extPos(&p2, &i2)
12500 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12510 69 66 28 20 69 31 3c 69 32 20 29 7b 0a 20 20 20  if( i1<i2 ){.   
12520 20 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e         fts3ReadN
12530 65 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31 29  extPos(&p1, &i1)
12540 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12550 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 52  .          fts3R
12560 65 61 64 4e 65 78 74 50 6f 73 28 26 70 32 2c 20  eadNextPos(&p2, 
12570 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &i2);.        }.
12580 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 31        }while( i1
12590 21 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  !=POSITION_LIST_
125a0 45 4e 44 20 7c 7c 20 69 32 21 3d 50 4f 53 49 54  END || i2!=POSIT
125b0 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 29 3b 0a  ION_LIST_END );.
125c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 43      }else if( iC
125d0 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b 0a 20 20 20  ol1<iCol2 ){.   
125e0 20 20 20 70 31 20 2b 3d 20 66 74 73 33 50 75 74     p1 += fts3Put
125f0 43 6f 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43  ColNumber(&p, iC
12600 6f 6c 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33  ol1);.      fts3
12610 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 26  ColumnlistCopy(&
12620 70 2c 20 26 70 31 29 3b 0a 20 20 20 20 7d 65 6c  p, &p1);.    }el
12630 73 65 7b 0a 20 20 20 20 20 20 70 32 20 2b 3d 20  se{.      p2 += 
12640 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72  fts3PutColNumber
12650 28 26 70 2c 20 69 43 6f 6c 32 29 3b 0a 20 20 20  (&p, iCol2);.   
12660 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
12670 74 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b 0a  tCopy(&p, &p2);.
12680 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 2b      }.  }..  *p+
12690 2b 20 3d 20 50 4f 53 5f 45 4e 44 3b 0a 20 20 2a  + = POS_END;.  *
126a0 70 70 20 3d 20 70 3b 0a 20 20 2a 70 70 31 20 3d  pp = p;.  *pp1 =
126b0 20 70 31 20 2b 20 31 3b 0a 20 20 2a 70 70 32 20   p1 + 1;.  *pp2 
126c0 3d 20 70 32 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  = p2 + 1;.}../*.
126d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
126e0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67   is used to merg
126f0 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
12700 69 73 74 73 20 69 6e 74 6f 20 6f 6e 65 2e 20 57  ists into one. W
12710 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 61 6c  hen it is.** cal
12720 6c 65 64 2c 20 2a 70 70 31 20 61 6e 64 20 2a 70  led, *pp1 and *p
12730 70 32 20 6d 75 73 74 20 62 6f 74 68 20 70 6f 69  p2 must both poi
12740 6e 74 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  nt to position l
12750 69 73 74 73 2e 20 41 20 70 6f 73 69 74 69 6f 6e  ists. A position
12760 2d 6c 69 73 74 20 69 73 0a 2a 2a 20 74 68 65 20  -list is.** the 
12770 70 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73  part of a doclis
12780 74 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 65  t that follows e
12790 61 63 68 20 64 6f 63 75 6d 65 6e 74 20 69 64 2e  ach document id.
127a0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
127b0 20 61 20 72 6f 77 0a 2a 2a 20 63 6f 6e 74 61 69   a row.** contai
127c0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 27 61  ns:.**.**     'a
127d0 20 62 20 63 27 7c 27 78 20 79 20 7a 27 7c 27 61   b c'|'x y z'|'a
127e0 20 62 20 62 20 61 27 0a 2a 2a 0a 2a 2a 20 54 68   b b a'.**.** Th
127f0 65 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  en the position 
12800 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 72 6f  list for this ro
12810 77 20 66 6f 72 20 74 6f 6b 65 6e 20 27 62 27 20  w for token 'b' 
12820 77 6f 75 6c 64 20 63 6f 6e 73 69 73 74 20 6f 66  would consist of
12830 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 30 78 30 32  :.**.**     0x02
12840 20 30 78 30 31 20 30 78 30 32 20 30 78 30 33 20   0x01 0x02 0x03 
12850 30 78 30 33 20 30 78 30 30 0a 2a 2a 0a 2a 2a 20  0x03 0x00.**.** 
12860 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
12870 6f 6e 20 72 65 74 75 72 6e 73 2c 20 62 6f 74 68  on returns, both
12880 20 2a 70 70 31 20 61 6e 64 20 2a 70 70 32 20 61   *pp1 and *pp2 a
12890 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  re left pointing
128a0 20 74 6f 20 74 68 65 0a 2a 2a 20 62 79 74 65 20   to the.** byte 
128b0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 30 78  following the 0x
128c0 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 6f 66  00 terminator of
128d0 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
128e0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
128f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 73 53 61 76  ..**.** If isSav
12900 65 4c 65 66 74 20 69 73 20 30 2c 20 61 6e 20 65  eLeft is 0, an e
12910 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
12920 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 73 69   the output posi
12930 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 0a 2a  tion list for .*
12940 2a 20 65 61 63 68 20 70 6f 73 69 74 69 6f 6e 20  * each position 
12950 69 6e 20 2a 70 70 32 20 66 6f 72 20 77 68 69 63  in *pp2 for whic
12960 68 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  h there exists o
12970 6e 65 20 6f 72 20 6d 6f 72 65 20 70 6f 73 69 74  ne or more posit
12980 69 6f 6e 73 20 69 6e 0a 2a 2a 20 2a 70 70 31 20  ions in.** *pp1 
12990 73 6f 20 74 68 61 74 20 28 70 6f 73 28 2a 70 70  so that (pos(*pp
129a0 32 29 3e 70 6f 73 28 2a 70 70 31 29 20 26 26 20  2)>pos(*pp1) && 
129b0 70 6f 73 28 2a 70 70 32 29 2d 70 6f 73 28 2a 70  pos(*pp2)-pos(*p
129c0 70 31 29 3c 3d 6e 54 6f 6b 65 6e 29 2e 20 69 2e  p1)<=nToken). i.
129d0 65 2e 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 2a  e..** when the *
129e0 70 70 31 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  pp1 token appear
129f0 73 20 62 65 66 6f 72 65 20 74 68 65 20 2a 70 70  s before the *pp
12a00 32 20 74 6f 6b 65 6e 2c 20 62 75 74 20 6e 6f 74  2 token, but not
12a10 20 6d 6f 72 65 20 74 68 61 6e 20 6e 54 6f 6b 65   more than nToke
12a20 6e 0a 2a 2a 20 73 6c 6f 74 73 20 62 65 66 6f 72  n.** slots befor
12a30 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 65 2e 67 2e  e it..**.** e.g.
12a40 20 6e 54 6f 6b 65 6e 3d 3d 31 20 73 65 61 72 63   nToken==1 searc
12a50 68 65 73 20 66 6f 72 20 61 64 6a 61 63 65 6e 74  hes for adjacent
12a60 20 70 6f 73 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 73   positions..*/.s
12a70 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 6f  tatic int fts3Po
12a80 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
12a90 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 20  (.  char **pp,  
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
12ac0 72 65 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 70  reallocated outp
12ad0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ut buffer */.  i
12ae0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12b00 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72  * Maximum differ
12b10 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f  ence in token po
12b20 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  sitions */.  int
12b30 20 69 73 53 61 76 65 4c 65 66 74 2c 20 20 20 20   isSaveLeft,    
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b50 53 61 76 65 20 74 68 65 20 6c 65 66 74 20 70 6f  Save the left po
12b60 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  sition */.  int 
12b70 69 73 45 78 61 63 74 2c 20 20 20 20 20 20 20 20  isExact,        
12b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12b90 66 20 2a 70 70 31 20 69 73 20 65 78 61 63 74 6c  f *pp1 is exactl
12ba0 79 20 6e 54 6f 6b 65 6e 73 20 62 65 66 6f 72 65  y nTokens before
12bb0 20 2a 70 70 32 20 2a 2f 0a 20 20 63 68 61 72 20   *pp2 */.  char 
12bc0 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20  **pp1,          
12bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12be0 2f 4f 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74  /OUT: Left input
12bf0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
12c00 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20 20 20  **pp2           
12c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
12c20 2f 4f 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75  /OUT: Right inpu
12c30 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  t list */.){.  c
12c40 68 61 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  har *p = *pp;.  
12c50 63 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b  char *p1 = *pp1;
12c60 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a 70  .  char *p2 = *p
12c70 70 32 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 31 20  p2;.  int iCol1 
12c80 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 32  = 0;.  int iCol2
12c90 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4e 65 76 65   = 0;..  /* Neve
12ca0 72 20 73 65 74 20 62 6f 74 68 20 69 73 53 61 76  r set both isSav
12cb0 65 4c 65 66 74 20 61 6e 64 20 69 73 45 78 61 63  eLeft and isExac
12cc0 74 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 69  t for the same i
12cd0 6e 76 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  nvocation. */.  
12ce0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 4c 65  assert( isSaveLe
12cf0 66 74 3d 3d 30 20 7c 7c 20 69 73 45 78 61 63 74  ft==0 || isExact
12d00 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ==0 );..  assert
12d10 28 20 70 21 3d 30 20 26 26 20 2a 70 31 21 3d 30  ( p!=0 && *p1!=0
12d20 20 26 26 20 2a 70 32 21 3d 30 20 29 3b 0a 20 20   && *p2!=0 );.  
12d30 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c  if( *p1==POS_COL
12d40 55 4d 4e 20 29 7b 20 0a 20 20 20 20 70 31 2b 2b  UMN ){ .    p1++
12d50 3b 0a 20 20 20 20 70 31 20 2b 3d 20 66 74 73 33  ;.    p1 += fts3
12d60 47 65 74 56 61 72 69 6e 74 33 32 28 70 31 2c 20  GetVarint32(p1, 
12d70 26 69 43 6f 6c 31 29 3b 0a 20 20 7d 0a 20 20 69  &iCol1);.  }.  i
12d80 66 28 20 2a 70 32 3d 3d 50 4f 53 5f 43 4f 4c 55  f( *p2==POS_COLU
12d90 4d 4e 20 29 7b 20 0a 20 20 20 20 70 32 2b 2b 3b  MN ){ .    p2++;
12da0 0a 20 20 20 20 70 32 20 2b 3d 20 66 74 73 33 47  .    p2 += fts3G
12db0 65 74 56 61 72 69 6e 74 33 32 28 70 32 2c 20 26  etVarint32(p2, &
12dc0 69 43 6f 6c 32 29 3b 0a 20 20 7d 0a 0a 20 20 77  iCol2);.  }..  w
12dd0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
12de0 66 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c 32 20  f( iCol1==iCol2 
12df0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
12e00 53 61 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20  Save = p;.      
12e10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
12e20 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rev = 0;.      s
12e30 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f  qlite3_int64 iPo
12e40 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  s1 = 0;.      sq
12e50 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 6f 73  lite3_int64 iPos
12e60 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  2 = 0;..      if
12e70 28 20 69 43 6f 6c 31 20 29 7b 0a 20 20 20 20 20  ( iCol1 ){.     
12e80 20 20 20 2a 70 2b 2b 20 3d 20 50 4f 53 5f 43 4f     *p++ = POS_CO
12e90 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 20  LUMN;.        p 
12ea0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75  += sqlite3Fts3Pu
12eb0 74 56 61 72 69 6e 74 28 70 2c 20 69 43 6f 6c 31  tVarint(p, iCol1
12ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
12ed0 20 20 61 73 73 65 72 74 28 20 2a 70 31 21 3d 50    assert( *p1!=P
12ee0 4f 53 5f 45 4e 44 20 26 26 20 2a 70 31 21 3d 50  OS_END && *p1!=P
12ef0 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  OS_COLUMN );.   
12f00 20 20 20 61 73 73 65 72 74 28 20 2a 70 32 21 3d     assert( *p2!=
12f10 50 4f 53 5f 45 4e 44 20 26 26 20 2a 70 32 21 3d  POS_END && *p2!=
12f20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  POS_COLUMN );.  
12f30 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
12f40 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50 6f  Varint(&p1, &iPo
12f50 73 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32 3b  s1); iPos1 -= 2;
12f60 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65  .      fts3GetDe
12f70 6c 74 61 56 61 72 69 6e 74 28 26 70 32 2c 20 26  ltaVarint(&p2, &
12f80 69 50 6f 73 32 29 3b 20 69 50 6f 73 32 20 2d 3d  iPos2); iPos2 -=
12f90 20 32 3b 0a 0a 20 20 20 20 20 20 77 68 69 6c 65   2;..      while
12fa0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( 1 ){.        i
12fb0 66 28 20 69 50 6f 73 32 3d 3d 69 50 6f 73 31 2b  f( iPos2==iPos1+
12fc0 6e 54 6f 6b 65 6e 20 0a 20 20 20 20 20 20 20 20  nToken .        
12fd0 20 7c 7c 20 28 69 73 45 78 61 63 74 3d 3d 30 20   || (isExact==0 
12fe0 26 26 20 69 50 6f 73 32 3e 69 50 6f 73 31 20 26  && iPos2>iPos1 &
12ff0 26 20 69 50 6f 73 32 3c 3d 69 50 6f 73 31 2b 6e  & iPos2<=iPos1+n
13000 54 6f 6b 65 6e 29 20 0a 20 20 20 20 20 20 20 20  Token) .        
13010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13020 69 74 65 33 5f 69 6e 74 36 34 20 69 53 61 76 65  ite3_int64 iSave
13030 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 61 76  ;.          iSav
13040 65 20 3d 20 69 73 53 61 76 65 4c 65 66 74 20 3f  e = isSaveLeft ?
13050 20 69 50 6f 73 31 20 3a 20 69 50 6f 73 32 3b 0a   iPos1 : iPos2;.
13060 20 20 20 20 20 20 20 20 20 20 66 74 73 33 50 75            fts3Pu
13070 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 2c  tDeltaVarint(&p,
13080 20 26 69 50 72 65 76 2c 20 69 53 61 76 65 2b 32   &iPrev, iSave+2
13090 29 3b 20 69 50 72 65 76 20 2d 3d 20 32 3b 0a 20  ); iPrev -= 2;. 
130a0 20 20 20 20 20 20 20 20 20 70 53 61 76 65 20 3d           pSave =
130b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
130c0 73 65 72 74 28 20 70 20 29 3b 0a 20 20 20 20 20  sert( p );.     
130d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
130e0 20 28 21 69 73 53 61 76 65 4c 65 66 74 20 26 26   (!isSaveLeft &&
130f0 20 69 50 6f 73 32 3c 3d 28 69 50 6f 73 31 2b 6e   iPos2<=(iPos1+n
13100 54 6f 6b 65 6e 29 29 20 7c 7c 20 69 50 6f 73 32  Token)) || iPos2
13110 3c 3d 69 50 6f 73 31 20 29 7b 0a 20 20 20 20 20  <=iPos1 ){.     
13120 20 20 20 20 20 69 66 28 20 28 2a 70 32 26 30 78       if( (*p2&0x
13130 46 45 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  FE)==0 ) break;.
13140 20 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65            fts3Ge
13150 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 32  tDeltaVarint(&p2
13160 2c 20 26 69 50 6f 73 32 29 3b 20 69 50 6f 73 32  , &iPos2); iPos2
13170 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d   -= 2;.        }
13180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13190 69 66 28 20 28 2a 70 31 26 30 78 46 45 29 3d 3d  if( (*p1&0xFE)==
131a0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
131b0 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
131c0 61 56 61 72 69 6e 74 28 26 70 31 2c 20 26 69 50  aVarint(&p1, &iP
131d0 6f 73 31 29 3b 20 69 50 6f 73 31 20 2d 3d 20 32  os1); iPos1 -= 2
131e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
131f0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
13200 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Save ){.        
13210 61 73 73 65 72 74 28 20 70 70 20 26 26 20 70 20  assert( pp && p 
13220 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  );.        p = p
13230 53 61 76 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Save;.      }.. 
13240 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c       fts3Columnl
13250 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b  istCopy(0, &p1);
13260 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d  .      fts3Colum
13270 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 32  nlistCopy(0, &p2
13280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13290 20 28 2a 70 31 26 30 78 46 45 29 3d 3d 30 20 26   (*p1&0xFE)==0 &
132a0 26 20 28 2a 70 32 26 30 78 46 45 29 3d 3d 30 20  & (*p2&0xFE)==0 
132b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
132c0 2a 70 31 20 7c 7c 20 30 3d 3d 2a 70 32 20 29 20  *p1 || 0==*p2 ) 
132d0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 31  break;..      p1
132e0 2b 2b 3b 0a 20 20 20 20 20 20 70 31 20 2b 3d 20  ++;.      p1 += 
132f0 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
13300 70 31 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20  p1, &iCol1);.   
13310 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 20 20 70     p2++;.      p
13320 32 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  2 += fts3GetVari
13330 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c 32 29  nt32(p2, &iCol2)
13340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13350 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20  Advance pointer 
13360 70 31 20 6f 72 20 70 32 20 28 77 68 69 63 68 65  p1 or p2 (whiche
13370 76 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ver corresponds 
13380 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 6f  to the smaller o
13390 66 0a 20 20 20 20 2a 2a 20 69 43 6f 6c 31 20 61  f.    ** iCol1 a
133a0 6e 64 20 69 43 6f 6c 32 29 20 73 6f 20 74 68 61  nd iCol2) so tha
133b0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 65  t it points to e
133c0 69 74 68 65 72 20 74 68 65 20 30 78 30 30 20 74  ither the 0x00 t
133d0 68 61 74 20 6d 61 72 6b 73 20 74 68 65 0a 20 20  hat marks the.  
133e0 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
133f0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20 6f  position list, o
13400 72 20 74 68 65 20 30 78 30 31 20 74 68 61 74 20  r the 0x01 that 
13410 70 72 65 63 65 64 65 73 20 74 68 65 20 6e 65 78  precedes the nex
13420 74 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  t .    ** column
13430 2d 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 70  -number in the p
13440 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 0a 20  osition list. . 
13450 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
13460 66 28 20 69 43 6f 6c 31 3c 69 43 6f 6c 32 20 29  f( iCol1<iCol2 )
13470 7b 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75  {.      fts3Colu
13480 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
13490 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  1);.      if( 0=
134a0 3d 2a 70 31 20 29 20 62 72 65 61 6b 3b 0a 20 20  =*p1 ) break;.  
134b0 20 20 20 20 70 31 2b 2b 3b 0a 20 20 20 20 20 20      p1++;.      
134c0 70 31 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  p1 += fts3GetVar
134d0 69 6e 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31  int32(p1, &iCol1
134e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
134f0 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69      fts3Columnli
13500 73 74 43 6f 70 79 28 30 2c 20 26 70 32 29 3b 0a  stCopy(0, &p2);.
13510 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 70 32        if( 0==*p2
13520 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
13530 70 32 2b 2b 3b 0a 20 20 20 20 20 20 70 32 20 2b  p2++;.      p2 +
13540 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
13550 32 28 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20  2(p2, &iCol2);. 
13560 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33     }.  }..  fts3
13570 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
13580 70 32 29 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69  p2);.  fts3Posli
13590 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b 0a  stCopy(0, &p1);.
135a0 20 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 2a    *pp1 = p1;.  *
135b0 70 70 32 20 3d 20 70 32 3b 0a 20 20 69 66 28 20  pp2 = p2;.  if( 
135c0 2a 70 70 3d 3d 70 20 29 7b 0a 20 20 20 20 72 65  *pp==p ){.    re
135d0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  turn 0;.  }.  *p
135e0 2b 2b 20 3d 20 30 78 30 30 3b 0a 20 20 2a 70 70  ++ = 0x00;.  *pp
135f0 20 3d 20 70 3b 0a 20 20 72 65 74 75 72 6e 20 31   = p;.  return 1
13600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65  ;.}../*.** Merge
13610 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   two position-li
13620 73 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  sts as required 
13630 62 79 20 74 68 65 20 4e 45 41 52 20 6f 70 65 72  by the NEAR oper
13640 61 74 6f 72 2e 20 54 68 65 20 61 72 67 75 6d 65  ator. The argume
13650 6e 74 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c  nt.** position l
13660 69 73 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  ists correspond 
13670 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
13680 72 69 67 68 74 20 70 68 72 61 73 65 73 20 6f 66  right phrases of
13690 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 0a   an expression .
136a0 2a 2a 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20  ** like:.**.**  
136b0 20 20 20 22 70 68 72 61 73 65 20 31 22 20 4e 45     "phrase 1" NE
136c0 41 52 20 22 70 68 72 61 73 65 20 6e 75 6d 62 65  AR "phrase numbe
136d0 72 20 32 22 0a 2a 2a 0a 2a 2a 20 50 6f 73 69 74  r 2".**.** Posit
136e0 69 6f 6e 20 6c 69 73 74 20 2a 70 70 31 20 63 6f  ion list *pp1 co
136f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
13700 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
13710 6f 66 20 74 68 65 20 4e 45 41 52 20 0a 2a 2a 20  of the NEAR .** 
13720 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 2a  expression and *
13730 70 70 32 20 74 6f 20 74 68 65 20 72 69 67 68 74  pp2 to the right
13740 2e 20 41 73 20 75 73 75 61 6c 2c 20 74 68 65 20  . As usual, the 
13750 69 6e 64 65 78 65 73 20 69 6e 20 74 68 65 20 70  indexes in the p
13760 6f 73 69 74 69 6f 6e 20 0a 2a 2a 20 6c 69 73 74  osition .** list
13770 73 20 61 72 65 20 74 68 65 20 6f 66 66 73 65 74  s are the offset
13780 73 20 6f 66 20 74 68 65 20 6c 61 73 74 20 74 6f  s of the last to
13790 6b 65 6e 20 69 6e 20 65 61 63 68 20 70 68 72 61  ken in each phra
137a0 73 65 20 28 74 6f 6b 65 6e 73 20 22 31 22 20 61  se (tokens "1" a
137b0 6e 64 20 22 32 22 20 0a 2a 2a 20 69 6e 20 74 68  nd "2" .** in th
137c0 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 29  e example above)
137d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 75 74 70  ..**.** The outp
137e0 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ut position list
137f0 20 2d 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70   - written to *p
13800 70 20 2d 20 69 73 20 61 20 63 6f 70 79 20 6f 66  p - is a copy of
13810 20 2a 70 70 32 20 77 69 74 68 20 74 68 6f 73 65   *pp2 with those
13820 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74  .** entries that
13830 20 61 72 65 20 6e 6f 74 20 73 75 66 66 69 63 69   are not suffici
13840 65 6e 74 6c 79 20 4e 45 41 52 20 65 6e 74 72 69  ently NEAR entri
13850 65 73 20 69 6e 20 2a 70 70 31 20 72 65 6d 6f 76  es in *pp1 remov
13860 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13870 74 20 66 74 73 33 50 6f 73 6c 69 73 74 4e 65 61  t fts3PoslistNea
13880 72 4d 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a  rMerge(.  char *
13890 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
138a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
138b0 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
138c0 63 68 61 72 20 2a 61 54 6d 70 2c 20 20 20 20 20  char *aTmp,     
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 62 75 66  /* Temporary buf
138f0 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 20 20 69  fer space */.  i
13900 6e 74 20 6e 52 69 67 68 74 2c 20 20 20 20 20 20  nt nRight,      
13910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13920 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72  * Maximum differ
13930 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f  ence in token po
13940 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  sitions */.  int
13950 20 6e 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   nLeft,         
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13970 4d 61 78 69 6d 75 6d 20 64 69 66 66 65 72 65 6e  Maximum differen
13980 63 65 20 69 6e 20 74 6f 6b 65 6e 20 70 6f 73 69  ce in token posi
13990 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
139a0 2a 2a 70 70 31 2c 20 20 20 20 20 20 20 20 20 20  **pp1,          
139b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
139c0 2f 4f 55 54 3a 20 4c 65 66 74 20 69 6e 70 75 74  /OUT: Left input
139d0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
139e0 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20 20 20  **pp2           
139f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
13a00 2f 4f 55 54 3a 20 52 69 67 68 74 20 69 6e 70 75  /OUT: Right inpu
13a10 74 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63  t list */.){.  c
13a20 68 61 72 20 2a 70 31 20 3d 20 2a 70 70 31 3b 0a  har *p1 = *pp1;.
13a30 20 20 63 68 61 72 20 2a 70 32 20 3d 20 2a 70 70    char *p2 = *pp
13a40 32 3b 0a 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  2;..  char *pTmp
13a50 31 20 3d 20 61 54 6d 70 3b 0a 20 20 63 68 61 72  1 = aTmp;.  char
13a60 20 2a 70 54 6d 70 32 3b 0a 20 20 63 68 61 72 20   *pTmp2;.  char 
13a70 2a 61 54 6d 70 32 3b 0a 20 20 69 6e 74 20 72 65  *aTmp2;.  int re
13a80 73 20 3d 20 31 3b 0a 0a 20 20 66 74 73 33 50 6f  s = 1;..  fts3Po
13a90 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
13aa0 28 26 70 54 6d 70 31 2c 20 6e 52 69 67 68 74 2c  (&pTmp1, nRight,
13ab0 20 30 2c 20 30 2c 20 70 70 31 2c 20 70 70 32 29   0, 0, pp1, pp2)
13ac0 3b 0a 20 20 61 54 6d 70 32 20 3d 20 70 54 6d 70  ;.  aTmp2 = pTmp
13ad0 32 20 3d 20 70 54 6d 70 31 3b 0a 20 20 2a 70 70  2 = pTmp1;.  *pp
13ae0 31 20 3d 20 70 31 3b 0a 20 20 2a 70 70 32 20 3d  1 = p1;.  *pp2 =
13af0 20 70 32 3b 0a 20 20 66 74 73 33 50 6f 73 6c 69   p2;.  fts3Posli
13b00 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 70  stPhraseMerge(&p
13b10 54 6d 70 32 2c 20 6e 4c 65 66 74 2c 20 31 2c 20  Tmp2, nLeft, 1, 
13b20 30 2c 20 70 70 32 2c 20 70 70 31 29 3b 0a 20 20  0, pp2, pp1);.  
13b30 69 66 28 20 70 54 6d 70 31 21 3d 61 54 6d 70 20  if( pTmp1!=aTmp 
13b40 26 26 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20  && pTmp2!=aTmp2 
13b50 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69  ){.    fts3Posli
13b60 73 74 4d 65 72 67 65 28 70 70 2c 20 26 61 54 6d  stMerge(pp, &aTm
13b70 70 2c 20 26 61 54 6d 70 32 29 3b 0a 20 20 7d 65  p, &aTmp2);.  }e
13b80 6c 73 65 20 69 66 28 20 70 54 6d 70 31 21 3d 61  lse if( pTmp1!=a
13b90 54 6d 70 20 29 7b 0a 20 20 20 20 66 74 73 33 50  Tmp ){.    fts3P
13ba0 6f 73 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26  oslistCopy(pp, &
13bb0 61 54 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69  aTmp);.  }else i
13bc0 66 28 20 70 54 6d 70 32 21 3d 61 54 6d 70 32 20  f( pTmp2!=aTmp2 
13bd0 29 7b 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69  ){.    fts3Posli
13be0 73 74 43 6f 70 79 28 70 70 2c 20 26 61 54 6d 70  stCopy(pp, &aTmp
13bf0 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  2);.  }else{.   
13c00 20 72 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20   res = 0;.  }.. 
13c10 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
13c20 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  /* .** An instan
13c30 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
13c40 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ion is used to m
13c50 65 72 67 65 20 74 6f 67 65 74 68 65 72 20 74 68  erge together th
13c60 65 20 28 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 2a  e (potentially.*
13c70 2a 20 6c 61 72 67 65 20 6e 75 6d 62 65 72 20 6f  * large number o
13c80 66 29 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20  f) doclists for 
13c90 65 61 63 68 20 74 65 72 6d 20 74 68 61 74 20 6d  each term that m
13ca0 61 74 63 68 65 73 20 61 20 70 72 65 66 69 78 20  atches a prefix 
13cb0 71 75 65 72 79 2e 0a 2a 2a 20 53 65 65 20 66 75  query..** See fu
13cc0 6e 63 74 69 6f 6e 20 66 74 73 33 54 65 72 6d 53  nction fts3TermS
13cd0 65 6c 65 63 74 4d 65 72 67 65 28 29 20 66 6f 72  electMerge() for
13ce0 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 74 79 70   details..*/.typ
13cf0 65 64 65 66 20 73 74 72 75 63 74 20 54 65 72 6d  edef struct Term
13d00 53 65 6c 65 63 74 20 54 65 72 6d 53 65 6c 65 63  Select TermSelec
13d10 74 3b 0a 73 74 72 75 63 74 20 54 65 72 6d 53 65  t;.struct TermSe
13d20 6c 65 63 74 20 7b 0a 20 20 63 68 61 72 20 2a 61  lect {.  char *a
13d30 61 4f 75 74 70 75 74 5b 31 36 5d 3b 20 20 20 20  aOutput[16];    
13d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c           /* Mall
13d50 6f 63 27 64 20 6f 75 74 70 75 74 20 62 75 66 66  oc'd output buff
13d60 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 4f  ers */.  int anO
13d70 75 74 70 75 74 5b 31 36 5d 3b 20 20 20 20 20 20  utput[16];      
13d80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13d90 20 65 61 63 68 20 6f 75 74 70 75 74 20 62 75 66   each output buf
13da0 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
13db0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
13dc0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
13dd0 74 6f 20 72 65 61 64 20 61 20 73 69 6e 67 6c 65  to read a single
13de0 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 61 20 62   varint from a b
13df0 75 66 66 65 72 2e 20 50 61 72 61 6d 65 74 65 72  uffer. Parameter
13e00 0a 2a 2a 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  .** pEnd points 
13e10 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
13e20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
13e30 72 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  r. When this fun
13e40 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
13e50 65 64 2c 20 69 66 20 2a 70 70 20 70 6f 69 6e 74  ed, if *pp point
13e60 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 67 72 65  s to pEnd or gre
13e70 61 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 65  ater, then the e
13e80 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
13e90 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 61  .** has been rea
13ea0 63 68 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ched. In this ca
13eb0 73 65 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  se *pp is set to
13ec0 20 30 20 61 6e 64 20 74 68 65 20 66 75 6e 63 74   0 and the funct
13ed0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
13ee0 2a 2a 20 49 66 20 2a 70 70 20 64 6f 65 73 20 6e  ** If *pp does n
13ef0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 6f 72 20 70  ot point to or p
13f00 61 73 74 20 70 45 6e 64 2c 20 74 68 65 6e 20 61  ast pEnd, then a
13f10 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 69   single varint i
13f20 73 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d 20 2a  s read.** from *
13f30 70 70 2e 20 2a 70 70 20 69 73 20 74 68 65 6e 20  pp. *pp is then 
13f40 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 31 20 62  set to point 1 b
13f50 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
13f60 20 6f 66 20 74 68 65 20 72 65 61 64 20 76 61 72   of the read var
13f70 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 44  int..**.** If bD
13f80 65 73 63 49 64 78 20 69 73 20 66 61 6c 73 65 2c  escIdx is false,
13f90 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
13fa0 69 73 20 61 64 64 65 64 20 74 6f 20 2a 70 56 61  is added to *pVa
13fb0 6c 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  l before returni
13fc0 6e 67 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ng..** If it is 
13fd0 74 72 75 65 2c 20 74 68 65 20 76 61 6c 75 65 20  true, the value 
13fe0 72 65 61 64 20 69 73 20 73 75 62 74 72 61 63 74  read is subtract
13ff0 65 64 20 66 72 6f 6d 20 2a 70 56 61 6c 20 62 65  ed from *pVal be
14000 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
14010 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
14020 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14030 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
14040 74 33 28 0a 20 20 63 68 61 72 20 2a 2a 70 70 2c  t3(.  char **pp,
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14060 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
14070 20 50 6f 69 6e 74 20 74 6f 20 72 65 61 64 20 76   Point to read v
14080 61 72 69 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  arint from */.  
14090 63 68 61 72 20 2a 70 45 6e 64 2c 20 20 20 20 20  char *pEnd,     
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 2f 2a 20 45 6e 64 20 6f 66 20 62 75 66 66 65 72  /* End of buffer
140c0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49   */.  int bDescI
140d0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
140e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
140f0 20 64 6f 63 69 64 73 20 61 72 65 20 64 65 73 63   docids are desc
14100 65 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69  ending */.  sqli
14110 74 65 33 5f 69 6e 74 36 34 20 2a 70 56 61 6c 20  te3_int64 *pVal 
14120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14130 4e 2f 4f 55 54 3a 20 49 6e 74 65 67 65 72 20 76  N/OUT: Integer v
14140 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  alue */.){.  if(
14150 20 2a 70 70 3e 3d 70 45 6e 64 20 29 7b 0a 20 20   *pp>=pEnd ){.  
14160 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 65 6c    *pp = 0;.  }el
14170 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
14180 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20 20 20  int64 iVal;.    
14190 2a 70 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  *pp += sqlite3Ft
141a0 73 33 47 65 74 56 61 72 69 6e 74 28 2a 70 70 2c  s3GetVarint(*pp,
141b0 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28   &iVal);.    if(
141c0 20 62 44 65 73 63 49 64 78 20 29 7b 0a 20 20 20   bDescIdx ){.   
141d0 20 20 20 2a 70 56 61 6c 20 2d 3d 20 69 56 61 6c     *pVal -= iVal
141e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
141f0 20 20 20 2a 70 56 61 6c 20 2b 3d 20 69 56 61 6c     *pVal += iVal
14200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14210 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14220 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  on is used to wr
14230 69 74 65 20 61 20 73 69 6e 67 6c 65 20 76 61 72  ite a single var
14240 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 2e  int to a buffer.
14250 20 54 68 65 20 76 61 72 69 6e 74 0a 2a 2a 20 69   The varint.** i
14260 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 70  s written to *pp
14270 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
14280 6e 67 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  ng, *pp is set t
14290 6f 20 70 6f 69 6e 74 20 31 20 62 79 74 65 20 70  o point 1 byte p
142a0 61 73 74 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ast the.** end o
142b0 66 20 74 68 65 20 76 61 6c 75 65 20 77 72 69 74  f the value writ
142c0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  ten..**.** If *p
142d0 62 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20 77  bFirst is zero w
142e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
142f0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
14300 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
14310 6f 0a 2a 2a 20 74 68 65 20 62 75 66 66 65 72 20  o.** the buffer 
14320 69 73 20 74 68 61 74 20 6f 66 20 70 61 72 61 6d  is that of param
14330 65 74 65 72 20 69 56 61 6c 2e 20 0a 2a 2a 0a 2a  eter iVal. .**.*
14340 2a 20 49 66 20 2a 70 62 46 69 72 73 74 20 69 73  * If *pbFirst is
14350 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
14360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14370 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
14380 20 76 61 6c 75 65 20 0a 2a 2a 20 77 72 69 74 74   value .** writt
14390 65 6e 20 69 73 20 65 69 74 68 65 72 20 28 69 56  en is either (iV
143a0 61 6c 2d 2a 70 69 50 72 65 76 29 20 28 69 66 20  al-*piPrev) (if 
143b0 62 44 65 73 63 49 64 78 20 69 73 20 7a 65 72 6f  bDescIdx is zero
143c0 29 20 6f 72 20 28 2a 70 69 50 72 65 76 2d 69 56  ) or (*piPrev-iV
143d0 61 6c 29 0a 2a 2a 20 28 69 66 20 62 44 65 73 63  al).** (if bDesc
143e0 49 64 78 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29  Idx is non-zero)
143f0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
14400 65 74 75 72 6e 69 6e 67 2c 20 74 68 69 73 20 66  eturning, this f
14410 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
14420 65 74 73 20 2a 70 62 46 69 72 73 74 20 74 6f 20  ets *pbFirst to 
14430 31 20 61 6e 64 20 2a 70 69 50 72 65 76 0a 2a 2a  1 and *piPrev.**
14440 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
14450 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 6c 2e   parameter iVal.
14460 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14470 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
14480 6e 74 33 28 0a 20 20 63 68 61 72 20 2a 2a 70 70  nt3(.  char **pp
14490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
144a0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
144b0 3a 20 4f 75 74 70 75 74 20 70 6f 69 6e 74 65 72  : Output pointer
144c0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 49   */.  int bDescI
144d0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
144e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
144f0 72 20 64 65 73 63 65 6e 64 69 6e 67 20 64 6f 63  r descending doc
14500 69 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ids */.  sqlite3
14510 5f 69 6e 74 36 34 20 2a 70 69 50 72 65 76 2c 20  _int64 *piPrev, 
14520 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
14530 55 54 3a 20 50 72 65 76 69 6f 75 73 20 76 61 6c  UT: Previous val
14540 75 65 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 69  ue written to li
14550 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 46  st */.  int *pbF
14560 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
14570 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
14580 54 3a 20 54 72 75 65 20 61 66 74 65 72 20 66 69  T: True after fi
14590 72 73 74 20 69 6e 74 20 77 72 69 74 74 65 6e 20  rst int written 
145a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
145b0 36 34 20 69 56 61 6c 20 20 20 20 20 20 20 20 20  64 iVal         
145c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
145d0 69 73 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20  is value to the 
145e0 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  list */.){.  sql
145f0 69 74 65 33 5f 69 6e 74 36 34 20 69 57 72 69 74  ite3_int64 iWrit
14600 65 3b 0a 20 20 69 66 28 20 62 44 65 73 63 49 64  e;.  if( bDescId
14610 78 3d 3d 30 20 7c 7c 20 2a 70 62 46 69 72 73 74  x==0 || *pbFirst
14620 3d 3d 30 20 29 7b 0a 20 20 20 20 69 57 72 69 74  ==0 ){.    iWrit
14630 65 20 3d 20 69 56 61 6c 20 2d 20 2a 70 69 50 72  e = iVal - *piPr
14640 65 76 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ev;.  }else{.   
14650 20 69 57 72 69 74 65 20 3d 20 2a 70 69 50 72 65   iWrite = *piPre
14660 76 20 2d 20 69 56 61 6c 3b 0a 20 20 7d 0a 20 20  v - iVal;.  }.  
14670 61 73 73 65 72 74 28 20 2a 70 62 46 69 72 73 74  assert( *pbFirst
14680 20 7c 7c 20 2a 70 69 50 72 65 76 3d 3d 30 20 29   || *piPrev==0 )
14690 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 46  ;.  assert( *pbF
146a0 69 72 73 74 3d 3d 30 20 7c 7c 20 69 57 72 69 74  irst==0 || iWrit
146b0 65 3e 30 20 29 3b 0a 20 20 2a 70 70 20 2b 3d 20  e>0 );.  *pp += 
146c0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
146d0 72 69 6e 74 28 2a 70 70 2c 20 69 57 72 69 74 65  rint(*pp, iWrite
146e0 29 3b 0a 20 20 2a 70 69 50 72 65 76 20 3d 20 69  );.  *piPrev = i
146f0 56 61 6c 3b 0a 20 20 2a 70 62 46 69 72 73 74 20  Val;.  *pbFirst 
14700 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
14710 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65  his macro is use
14720 64 20 62 79 20 76 61 72 69 6f 75 73 20 66 75 6e  d by various fun
14730 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65 72 67  ctions that merg
14740 65 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 65 20  e doclists. The 
14750 74 77 6f 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  two.** arguments
14760 20 61 72 65 20 36 34 2d 62 69 74 20 64 6f 63 69   are 64-bit doci
14770 64 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65  d values. If the
14780 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 74   value of the st
14790 61 63 6b 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ack variable.** 
147a0 62 44 65 73 63 44 6f 63 6c 69 73 74 20 69 73 20  bDescDoclist is 
147b0 30 20 77 68 65 6e 20 74 68 69 73 20 6d 61 63 72  0 when this macr
147c0 6f 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68  o is invoked, th
147d0 65 6e 20 69 74 20 72 65 74 75 72 6e 73 20 28 69  en it returns (i
147e0 31 2d 69 32 29 2e 20 0a 2a 2a 20 4f 74 68 65 72  1-i2). .** Other
147f0 77 69 73 65 2c 20 28 69 32 2d 69 31 29 2e 0a 2a  wise, (i2-i1)..*
14800 2a 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  *.** Using this 
14810 6d 61 6b 65 73 20 69 74 20 65 61 73 69 65 72 20  makes it easier 
14820 74 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 68  to write code th
14830 61 74 20 63 61 6e 20 6d 65 72 67 65 20 64 6f 63  at can merge doc
14840 6c 69 73 74 73 20 74 68 61 74 20 61 72 65 0a 2a  lists that are.*
14850 2a 20 73 6f 72 74 65 64 20 69 6e 20 65 69 74 68  * sorted in eith
14860 65 72 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20  er ascending or 
14870 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72  descending order
14880 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 43  ..*/.#define DOC
14890 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29 20 28  ID_CMP(i1, i2) (
148a0 28 62 44 65 73 63 44 6f 63 6c 69 73 74 3f 2d 31  (bDescDoclist?-1
148b0 3a 31 29 20 2a 20 28 69 31 2d 69 32 29 29 0a 0a  :1) * (i1-i2))..
148c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
148d0 69 6f 6e 20 64 6f 65 73 20 61 6e 20 22 4f 52 22  ion does an "OR"
148e0 20 6d 65 72 67 65 20 6f 66 20 74 77 6f 20 64 6f   merge of two do
148f0 63 6c 69 73 74 73 20 28 6f 75 74 70 75 74 20 63  clists (output c
14900 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 70  ontains all.** p
14910 6f 73 69 74 69 6f 6e 73 20 63 6f 6e 74 61 69 6e  ositions contain
14920 65 64 20 69 6e 20 65 69 74 68 65 72 20 61 72 67  ed in either arg
14930 75 6d 65 6e 74 20 64 6f 63 6c 69 73 74 29 2e 20  ument doclist). 
14940 49 66 20 74 68 65 20 64 6f 63 69 64 73 20 69 6e  If the docids in
14950 20 74 68 65 20 0a 2a 2a 20 69 6e 70 75 74 20 64   the .** input d
14960 6f 63 6c 69 73 74 73 20 61 72 65 20 73 6f 72 74  oclists are sort
14970 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
14980 6f 72 64 65 72 2c 20 70 61 72 61 6d 65 74 65 72  order, parameter
14990 20 62 44 65 73 63 44 6f 63 6c 69 73 74 0a 2a 2a   bDescDoclist.**
149a0 20 73 68 6f 75 6c 64 20 62 65 20 66 61 6c 73 65   should be false
149b0 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 73 6f  . If they are so
149c0 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  rted in ascendin
149d0 67 20 6f 72 64 65 72 2c 20 69 74 20 73 68 6f 75  g order, it shou
149e0 6c 64 20 62 65 0a 2a 2a 20 70 61 73 73 65 64 20  ld be.** passed 
149f0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
14a10 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 61 4f  ror occurs, *paO
14a20 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
14a30 6e 74 20 61 74 20 61 6e 20 73 71 6c 69 74 65 33  nt at an sqlite3
14a40 5f 6d 61 6c 6c 6f 63 27 64 20 62 75 66 66 65 72  _malloc'd buffer
14a50 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .** containing t
14a60 68 65 20 6f 75 74 70 75 74 20 64 6f 63 6c 69 73  he output doclis
14a70 74 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  t and SQLITE_OK 
14a80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
14a90 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 2a 70 6e  this case.** *pn
14aa0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
14ab0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14ac0 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  s in the output 
14ad0 64 6f 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  doclist..**.** I
14ae0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14af0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
14b00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14b10 6e 65 64 2e 20 54 68 65 20 6f 75 74 70 75 74 20  ned. The output 
14b20 76 61 6c 75 65 73 0a 2a 2a 20 61 72 65 20 75 6e  values.** are un
14b30 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
14b40 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
14b50 69 6e 74 20 66 74 73 33 44 6f 63 6c 69 73 74 4f  int fts3DoclistO
14b60 72 4d 65 72 67 65 28 0a 20 20 69 6e 74 20 62 44  rMerge(.  int bD
14b70 65 73 63 44 6f 63 6c 69 73 74 2c 20 20 20 20 20  escDoclist,     
14b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14b90 65 20 69 66 20 61 72 67 75 6d 65 6e 74 73 20 61  e if arguments a
14ba0 72 65 20 64 65 73 63 20 2a 2f 0a 20 20 63 68 61  re desc */.  cha
14bb0 72 20 2a 61 31 2c 20 69 6e 74 20 6e 31 2c 20 20  r *a1, int n1,  
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14bd0 46 69 72 73 74 20 64 6f 63 6c 69 73 74 20 2a 2f  First doclist */
14be0 0a 20 20 63 68 61 72 20 2a 61 32 2c 20 69 6e 74  .  char *a2, int
14bf0 20 6e 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   n2,            
14c00 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 64 6f 63     /* Second doc
14c10 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
14c20 2a 70 61 4f 75 74 2c 20 69 6e 74 20 2a 70 6e 4f  *paOut, int *pnO
14c30 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ut        /* OUT
14c40 3a 20 4d 61 6c 6c 6f 63 27 64 20 64 6f 63 6c 69  : Malloc'd docli
14c50 73 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  st */.){.  sqlit
14c60 65 33 5f 69 6e 74 36 34 20 69 31 20 3d 20 30 3b  e3_int64 i1 = 0;
14c70 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
14c80 20 69 32 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74   i2 = 0;.  sqlit
14c90 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d  e3_int64 iPrev =
14ca0 20 30 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64   0;.  char *pEnd
14cb0 31 20 3d 20 26 61 31 5b 6e 31 5d 3b 0a 20 20 63  1 = &a1[n1];.  c
14cc0 68 61 72 20 2a 70 45 6e 64 32 20 3d 20 26 61 32  har *pEnd2 = &a2
14cd0 5b 6e 32 5d 3b 0a 20 20 63 68 61 72 20 2a 70 31  [n2];.  char *p1
14ce0 20 3d 20 61 31 3b 0a 20 20 63 68 61 72 20 2a 70   = a1;.  char *p
14cf0 32 20 3d 20 61 32 3b 0a 20 20 63 68 61 72 20 2a  2 = a2;.  char *
14d00 70 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b  p;.  char *aOut;
14d10 0a 20 20 69 6e 74 20 62 46 69 72 73 74 4f 75 74  .  int bFirstOut
14d20 20 3d 20 30 3b 0a 0a 20 20 2a 70 61 4f 75 74 20   = 0;..  *paOut 
14d30 3d 20 30 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20  = 0;.  *pnOut = 
14d40 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  0;..  /* Allocat
14d50 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
14d60 6f 75 74 70 75 74 2e 20 42 6f 74 68 20 74 68 65  output. Both the
14d70 20 69 6e 70 75 74 20 61 6e 64 20 6f 75 74 70 75   input and outpu
14d80 74 20 64 6f 63 6c 69 73 74 73 0a 20 20 2a 2a 20  t doclists.  ** 
14d90 61 72 65 20 64 65 6c 74 61 20 65 6e 63 6f 64 65  are delta encode
14da0 64 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 69  d. If they are i
14db0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
14dc0 72 20 28 62 44 65 73 63 44 6f 63 6c 69 73 74 3d  r (bDescDoclist=
14dd0 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  =0),.  ** then t
14de0 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 69  he first docid i
14df0 6e 20 65 61 63 68 20 6c 69 73 74 20 69 73 20 73  n each list is s
14e00 69 6d 70 6c 79 20 65 6e 63 6f 64 65 64 20 61 73  imply encoded as
14e10 20 61 20 76 61 72 69 6e 74 2e 20 46 6f 72 0a 20   a varint. For. 
14e20 20 2a 2a 20 65 61 63 68 20 73 75 62 73 65 71 75   ** each subsequ
14e30 65 6e 74 20 64 6f 63 69 64 2c 20 74 68 65 20 76  ent docid, the v
14e40 61 72 69 6e 74 20 73 74 6f 72 65 64 20 69 73 20  arint stored is 
14e50 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  the difference b
14e60 65 74 77 65 65 6e 20 74 68 65 0a 20 20 2a 2a 20  etween the.  ** 
14e70 63 75 72 72 65 6e 74 20 61 6e 64 20 70 72 65 76  current and prev
14e80 69 6f 75 73 20 64 6f 63 69 64 20 28 61 20 70 6f  ious docid (a po
14e90 73 69 74 69 76 65 20 6e 75 6d 62 65 72 20 2d 20  sitive number - 
14ea0 73 69 6e 63 65 20 74 68 65 20 6c 69 73 74 20 69  since the list i
14eb0 73 20 69 6e 0a 20 20 2a 2a 20 61 73 63 65 6e 64  s in.  ** ascend
14ec0 69 6e 67 20 6f 72 64 65 72 29 2e 0a 20 20 2a 2a  ing order)..  **
14ed0 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
14ee0 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
14ef0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 74   the output is t
14f00 68 65 72 65 66 6f 72 65 20 65 6e 63 6f 64 65 64  herefore encoded
14f10 20 75 73 69 6e 67 20 74 68 65 20 0a 20 20 2a 2a   using the .  **
14f20 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
14f30 62 79 74 65 73 20 61 73 20 69 74 20 69 73 20 69  bytes as it is i
14f40 6e 20 77 68 69 63 68 65 76 65 72 20 6f 66 20 74  n whichever of t
14f50 68 65 20 69 6e 70 75 74 20 6c 69 73 74 73 20 69  he input lists i
14f60 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 64 20 66  t is.  ** read f
14f70 72 6f 6d 2e 20 41 6e 64 20 65 61 63 68 20 73 75  rom. And each su
14f80 62 73 65 71 75 65 6e 74 20 64 6f 63 69 64 20 72  bsequent docid r
14f90 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ead from the sam
14fa0 65 20 69 6e 70 75 74 20 6c 69 73 74 20 0a 20 20  e input list .  
14fb0 2a 2a 20 63 6f 6e 73 75 6d 65 73 20 65 69 74 68  ** consumes eith
14fc0 65 72 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  er the same or l
14fd0 65 73 73 20 62 79 74 65 73 20 61 73 20 69 74 20  ess bytes as it 
14fe0 64 69 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74  did in the input
14ff0 20 28 73 69 6e 63 65 0a 20 20 2a 2a 20 74 68 65   (since.  ** the
15000 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
15010 65 65 6e 20 69 74 20 61 6e 64 20 74 68 65 20 70  een it and the p
15020 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 69 6e  revious value in
15030 20 74 68 65 20 6f 75 74 70 75 74 20 6d 75 73 74   the output must
15040 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 73 69 74  .  ** be a posit
15050 69 76 65 20 76 61 6c 75 65 20 6c 65 73 73 20 74  ive value less t
15060 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
15070 74 68 65 20 64 65 6c 74 61 20 76 61 6c 75 65 20  the delta value 
15080 72 65 61 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20  read from .  ** 
15090 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 29 2e  the input list).
150a0 20 54 68 65 20 73 61 6d 65 20 61 72 67 75 6d 65   The same argume
150b0 6e 74 20 61 70 70 6c 69 65 73 20 74 6f 20 61 6c  nt applies to al
150c0 6c 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20  l but the first 
150d0 64 6f 63 69 64 0a 20 20 2a 2a 20 72 65 61 64 20  docid.  ** read 
150e0 66 72 6f 6d 20 74 68 65 20 27 6f 74 68 65 72 27  from the 'other'
150f0 20 6c 69 73 74 2e 20 41 6e 64 20 74 6f 20 74 68   list. And to th
15100 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c  e contents of al
15110 6c 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  l position lists
15120 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
15130 62 65 20 63 6f 70 69 65 64 20 61 6e 64 20 6d 65  be copied and me
15140 72 67 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  rged from the in
15150 70 75 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  put to the outpu
15160 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  t..  **.  ** How
15170 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 72  ever, if the fir
15180 73 74 20 64 6f 63 69 64 20 63 6f 70 69 65 64 20  st docid copied 
15190 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  to the output is
151a0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
151b0 65 72 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  er,.  ** then th
151c0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68  e encoding of th
151d0 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 72  e first docid fr
151e0 6f 6d 20 74 68 65 20 27 6f 74 68 65 72 27 20 69  om the 'other' i
151f0 6e 70 75 74 20 6c 69 73 74 20 6d 61 79 0a 20 20  nput list may.  
15200 2a 2a 20 62 65 20 6c 61 72 67 65 72 20 69 6e 20  ** be larger in 
15210 74 68 65 20 6f 75 74 70 75 74 20 74 68 61 6e 20  the output than 
15220 69 74 20 77 61 73 20 69 6e 20 74 68 65 20 69 6e  it was in the in
15230 70 75 74 20 28 73 69 6e 63 65 20 74 68 65 20 64  put (since the d
15240 65 6c 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  elta value.  ** 
15250 6d 61 79 20 62 65 20 61 20 6c 61 72 67 65 72 20  may be a larger 
15260 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
15270 20 74 68 61 6e 20 74 68 65 20 61 63 74 75 61 6c   than the actual
15280 20 64 6f 63 69 64 29 2e 0a 20 20 2a 2a 0a 20 20   docid)..  **.  
15290 2a 2a 20 54 68 65 20 73 70 61 63 65 20 72 65 71  ** The space req
152a0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
152b0 68 65 20 6f 75 74 70 75 74 20 69 73 20 74 68 65  he output is the
152c0 72 65 66 6f 72 65 20 74 68 65 20 73 75 6d 20 6f  refore the sum o
152d0 66 20 74 68 65 0a 20 20 2a 2a 20 73 69 7a 65 73  f the.  ** sizes
152e0 20 6f 66 20 74 68 65 20 74 77 6f 20 69 6e 70 75   of the two inpu
152f0 74 73 2c 20 70 6c 75 73 20 65 6e 6f 75 67 68 20  ts, plus enough 
15300 73 70 61 63 65 20 66 6f 72 20 65 78 61 63 74 6c  space for exactl
15310 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 70  y one of the inp
15320 75 74 0a 20 20 2a 2a 20 64 6f 63 69 64 73 20 74  ut.  ** docids t
15330 6f 20 67 72 6f 77 2e 20 0a 20 20 2a 2a 0a 20 20  o grow. .  **.  
15340 2a 2a 20 41 20 73 79 6d 65 74 72 69 63 20 61 72  ** A symetric ar
15350 67 75 6d 65 6e 74 20 6d 61 79 20 62 65 20 6d 61  gument may be ma
15360 64 65 20 69 66 20 74 68 65 20 64 6f 63 6c 69 73  de if the doclis
15370 74 73 20 61 72 65 20 69 6e 20 64 65 73 63 65 6e  ts are in descen
15380 64 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 64 65 72  ding .  ** order
15390 2e 0a 20 20 2a 2f 0a 20 20 61 4f 75 74 20 3d 20  ..  */.  aOut = 
153a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
153b0 31 2b 6e 32 2b 46 54 53 33 5f 56 41 52 49 4e 54  1+n2+FTS3_VARINT
153c0 5f 4d 41 58 2d 31 29 3b 0a 20 20 69 66 28 20 21  _MAX-1);.  if( !
153d0 61 4f 75 74 20 29 20 72 65 74 75 72 6e 20 53 51  aOut ) return SQ
153e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 70  LITE_NOMEM;..  p
153f0 20 3d 20 61 4f 75 74 3b 0a 20 20 66 74 73 33 47   = aOut;.  fts3G
15400 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15410 70 31 2c 20 70 45 6e 64 31 2c 20 30 2c 20 26 69  p1, pEnd1, 0, &i
15420 31 29 3b 0a 20 20 66 74 73 33 47 65 74 44 65 6c  1);.  fts3GetDel
15430 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70  taVarint3(&p2, p
15440 45 6e 64 32 2c 20 30 2c 20 26 69 32 29 3b 0a 20  End2, 0, &i2);. 
15450 20 77 68 69 6c 65 28 20 70 31 20 7c 7c 20 70 32   while( p1 || p2
15460 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15470 69 6e 74 36 34 20 69 44 69 66 66 20 3d 20 44 4f  int64 iDiff = DO
15480 43 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29 3b  CID_CMP(i1, i2);
15490 0a 0a 20 20 20 20 69 66 28 20 70 32 20 26 26 20  ..    if( p2 && 
154a0 70 31 20 26 26 20 69 44 69 66 66 3d 3d 30 20 29  p1 && iDiff==0 )
154b0 7b 0a 20 20 20 20 20 20 66 74 73 33 50 75 74 44  {.      fts3PutD
154c0 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 2c 20  eltaVarint3(&p, 
154d0 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69  bDescDoclist, &i
154e0 50 72 65 76 2c 20 26 62 46 69 72 73 74 4f 75 74  Prev, &bFirstOut
154f0 2c 20 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73  , i1);.      fts
15500 33 50 6f 73 6c 69 73 74 4d 65 72 67 65 28 26 70  3PoslistMerge(&p
15510 2c 20 26 70 31 2c 20 26 70 32 29 3b 0a 20 20 20  , &p1, &p2);.   
15520 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56     fts3GetDeltaV
15530 61 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e 64  arint3(&p1, pEnd
15540 31 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  1, bDescDoclist,
15550 20 26 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73   &i1);.      fts
15560 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3GetDeltaVarint3
15570 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 62 44 65  (&p2, pEnd2, bDe
15580 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b  scDoclist, &i2);
15590 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
155a0 70 32 20 7c 7c 20 28 70 31 20 26 26 20 69 44 69  p2 || (p1 && iDi
155b0 66 66 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 66  ff<0) ){.      f
155c0 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
155d0 74 33 28 26 70 2c 20 62 44 65 73 63 44 6f 63 6c  t3(&p, bDescDocl
155e0 69 73 74 2c 20 26 69 50 72 65 76 2c 20 26 62 46  ist, &iPrev, &bF
155f0 69 72 73 74 4f 75 74 2c 20 69 31 29 3b 0a 20 20  irstOut, i1);.  
15600 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43      fts3PoslistC
15610 6f 70 79 28 26 70 2c 20 26 70 31 29 3b 0a 20 20  opy(&p, &p1);.  
15620 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
15630 56 61 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e  Varint3(&p1, pEn
15640 64 31 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74  d1, bDescDoclist
15650 2c 20 26 69 31 29 3b 0a 20 20 20 20 7d 65 6c 73  , &i1);.    }els
15660 65 7b 0a 20 20 20 20 20 20 66 74 73 33 50 75 74  e{.      fts3Put
15670 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 2c  DeltaVarint3(&p,
15680 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26   bDescDoclist, &
15690 69 50 72 65 76 2c 20 26 62 46 69 72 73 74 4f 75  iPrev, &bFirstOu
156a0 74 2c 20 69 32 29 3b 0a 20 20 20 20 20 20 66 74  t, i2);.      ft
156b0 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 26 70  s3PoslistCopy(&p
156c0 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20 66 74  , &p2);.      ft
156d0 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
156e0 33 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 62 44  3(&p2, pEnd2, bD
156f0 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 32 29  escDoclist, &i2)
15700 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
15710 70 61 4f 75 74 20 3d 20 61 4f 75 74 3b 0a 20 20  paOut = aOut;.  
15720 2a 70 6e 4f 75 74 20 3d 20 28 69 6e 74 29 28 70  *pnOut = (int)(p
15730 2d 61 4f 75 74 29 3b 0a 20 20 61 73 73 65 72 74  -aOut);.  assert
15740 28 20 2a 70 6e 4f 75 74 3c 3d 6e 31 2b 6e 32 2b  ( *pnOut<=n1+n2+
15750 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2d  FTS3_VARINT_MAX-
15760 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  1 );.  return SQ
15770 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15780 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15790 64 6f 65 73 20 61 20 22 70 68 72 61 73 65 22 20  does a "phrase" 
157a0 6d 65 72 67 65 20 6f 66 20 74 77 6f 20 64 6f 63  merge of two doc
157b0 6c 69 73 74 73 2e 20 49 6e 20 61 20 70 68 72 61  lists. In a phra
157c0 73 65 20 6d 65 72 67 65 2c 0a 2a 2a 20 74 68 65  se merge,.** the
157d0 20 6f 75 74 70 75 74 20 63 6f 6e 74 61 69 6e 73   output contains
157e0 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
157f0 70 6f 73 69 74 69 6f 6e 20 66 72 6f 6d 20 74 68  position from th
15800 65 20 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70  e right-hand inp
15810 75 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 66 6f  ut.** doclist fo
15820 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
15830 20 61 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74   a position in t
15840 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 69 6e 70  he left-hand inp
15850 75 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 65 78  ut doclist.** ex
15860 61 63 74 6c 79 20 6e 44 69 73 74 20 74 6f 6b 65  actly nDist toke
15870 6e 73 20 62 65 66 6f 72 65 20 69 74 2e 0a 2a 2a  ns before it..**
15880 0a 2a 2a 20 49 66 20 74 68 65 20 64 6f 63 69 64  .** If the docid
15890 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 64  s in the input d
158a0 6f 63 6c 69 73 74 73 20 61 72 65 20 73 6f 72 74  oclists are sort
158b0 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ed in ascending 
158c0 6f 72 64 65 72 2c 0a 2a 2a 20 70 61 72 61 6d 65  order,.** parame
158d0 74 65 72 20 62 44 65 73 63 44 6f 63 6c 69 73 74  ter bDescDoclist
158e0 20 73 68 6f 75 6c 64 20 62 65 20 66 61 6c 73 65   should be false
158f0 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 73 6f  . If they are so
15900 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  rted in ascendin
15910 67 20 0a 2a 2a 20 6f 72 64 65 72 2c 20 69 74 20  g .** order, it 
15920 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
15930 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15940 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  e..**.** The rig
15950 68 74 2d 68 61 6e 64 20 69 6e 70 75 74 20 64 6f  ht-hand input do
15960 63 6c 69 73 74 20 69 73 20 6f 76 65 72 77 72 69  clist is overwri
15970 74 74 65 6e 20 62 79 20 74 68 69 73 20 66 75 6e  tten by this fun
15980 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
15990 20 69 6e 74 20 66 74 73 33 44 6f 63 6c 69 73 74   int fts3Doclist
159a0 50 68 72 61 73 65 4d 65 72 67 65 28 0a 20 20 69  PhraseMerge(.  i
159b0 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  nt bDescDoclist,
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159d0 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65  * True if argume
159e0 6e 74 73 20 61 72 65 20 64 65 73 63 20 2a 2f 0a  nts are desc */.
159f0 20 20 69 6e 74 20 6e 44 69 73 74 2c 20 20 20 20    int nDist,    
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 2f 2a 20 44 69 73 74 61 6e 63 65 20 66 72    /* Distance fr
15a20 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
15a30 20 28 31 3d 61 64 6a 61 63 65 6e 74 29 20 2a 2f   (1=adjacent) */
15a40 0a 20 20 63 68 61 72 20 2a 61 4c 65 66 74 2c 20  .  char *aLeft, 
15a50 69 6e 74 20 6e 4c 65 66 74 2c 20 20 20 20 20 20  int nLeft,      
15a60 20 20 20 2f 2a 20 4c 65 66 74 20 64 6f 63 6c 69     /* Left docli
15a70 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  st */.  char **p
15a80 61 52 69 67 68 74 2c 20 69 6e 74 20 2a 70 6e 52  aRight, int *pnR
15a90 69 67 68 74 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ight    /* IN/OU
15aa0 54 3a 20 52 69 67 68 74 2f 6f 75 74 70 75 74 20  T: Right/output 
15ab0 64 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  doclist */.){.  
15ac0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 31  sqlite3_int64 i1
15ad0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
15ae0 69 6e 74 36 34 20 69 32 20 3d 20 30 3b 0a 20 20  int64 i2 = 0;.  
15af0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50  sqlite3_int64 iP
15b00 72 65 76 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  rev = 0;.  char 
15b10 2a 61 52 69 67 68 74 20 3d 20 2a 70 61 52 69 67  *aRight = *paRig
15b20 68 74 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  ht;.  char *pEnd
15b30 31 20 3d 20 26 61 4c 65 66 74 5b 6e 4c 65 66 74  1 = &aLeft[nLeft
15b40 5d 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 32  ];.  char *pEnd2
15b50 20 3d 20 26 61 52 69 67 68 74 5b 2a 70 6e 52 69   = &aRight[*pnRi
15b60 67 68 74 5d 3b 0a 20 20 63 68 61 72 20 2a 70 31  ght];.  char *p1
15b70 20 3d 20 61 4c 65 66 74 3b 0a 20 20 63 68 61 72   = aLeft;.  char
15b80 20 2a 70 32 20 3d 20 61 52 69 67 68 74 3b 0a 20   *p2 = aRight;. 
15b90 20 63 68 61 72 20 2a 70 3b 0a 20 20 69 6e 74 20   char *p;.  int 
15ba0 62 46 69 72 73 74 4f 75 74 20 3d 20 30 3b 0a 20  bFirstOut = 0;. 
15bb0 20 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20   char *aOut;..  
15bc0 61 73 73 65 72 74 28 20 6e 44 69 73 74 3e 30 20  assert( nDist>0 
15bd0 29 3b 0a 20 20 69 66 28 20 62 44 65 73 63 44 6f  );.  if( bDescDo
15be0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 61 4f 75  clist ){.    aOu
15bf0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
15c00 6f 63 28 2a 70 6e 52 69 67 68 74 20 2b 20 46 54  oc(*pnRight + FT
15c10 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 29 3b 0a  S3_VARINT_MAX);.
15c20 20 20 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20      if( aOut==0 
15c30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15c40 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
15c50 20 20 20 20 61 4f 75 74 20 3d 20 61 52 69 67 68      aOut = aRigh
15c60 74 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 61 4f 75  t;.  }.  p = aOu
15c70 74 3b 0a 0a 20 20 66 74 73 33 47 65 74 44 65 6c  t;..  fts3GetDel
15c80 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20 70  taVarint3(&p1, p
15c90 45 6e 64 31 2c 20 30 2c 20 26 69 31 29 3b 0a 20  End1, 0, &i1);. 
15ca0 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
15cb0 69 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32 2c  int3(&p2, pEnd2,
15cc0 20 30 2c 20 26 69 32 29 3b 0a 0a 20 20 77 68 69   0, &i2);..  whi
15cd0 6c 65 28 20 70 31 20 26 26 20 70 32 20 29 7b 0a  le( p1 && p2 ){.
15ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
15cf0 34 20 69 44 69 66 66 20 3d 20 44 4f 43 49 44 5f  4 iDiff = DOCID_
15d00 43 4d 50 28 69 31 2c 20 69 32 29 3b 0a 20 20 20  CMP(i1, i2);.   
15d10 20 69 66 28 20 69 44 69 66 66 3d 3d 30 20 29 7b   if( iDiff==0 ){
15d20 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 53 61  .      char *pSa
15d30 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 73 71  ve = p;.      sq
15d40 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65  lite3_int64 iPre
15d50 76 53 61 76 65 20 3d 20 69 50 72 65 76 3b 0a 20  vSave = iPrev;. 
15d60 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 4f       int bFirstO
15d70 75 74 53 61 76 65 20 3d 20 62 46 69 72 73 74 4f  utSave = bFirstO
15d80 75 74 3b 0a 0a 20 20 20 20 20 20 66 74 73 33 50  ut;..      fts3P
15d90 75 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  utDeltaVarint3(&
15da0 70 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c  p, bDescDoclist,
15db0 20 26 69 50 72 65 76 2c 20 26 62 46 69 72 73 74   &iPrev, &bFirst
15dc0 4f 75 74 2c 20 69 31 29 3b 0a 20 20 20 20 20 20  Out, i1);.      
15dd0 69 66 28 20 30 3d 3d 66 74 73 33 50 6f 73 6c 69  if( 0==fts3Posli
15de0 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 70  stPhraseMerge(&p
15df0 2c 20 6e 44 69 73 74 2c 20 30 2c 20 31 2c 20 26  , nDist, 0, 1, &
15e00 70 31 2c 20 26 70 32 29 20 29 7b 0a 20 20 20 20  p1, &p2) ){.    
15e10 20 20 20 20 70 20 3d 20 70 53 61 76 65 3b 0a 20      p = pSave;. 
15e20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
15e30 50 72 65 76 53 61 76 65 3b 0a 20 20 20 20 20 20  PrevSave;.      
15e40 20 20 62 46 69 72 73 74 4f 75 74 20 3d 20 62 46    bFirstOut = bF
15e50 69 72 73 74 4f 75 74 53 61 76 65 3b 0a 20 20 20  irstOutSave;.   
15e60 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 47     }.      fts3G
15e70 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15e80 70 31 2c 20 70 45 6e 64 31 2c 20 62 44 65 73 63  p1, pEnd1, bDesc
15e90 44 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b 0a 20  Doclist, &i1);. 
15ea0 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
15eb0 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70 45  aVarint3(&p2, pE
15ec0 6e 64 32 2c 20 62 44 65 73 63 44 6f 63 6c 69 73  nd2, bDescDoclis
15ed0 74 2c 20 26 69 32 29 3b 0a 20 20 20 20 7d 65 6c  t, &i2);.    }el
15ee0 73 65 20 69 66 28 20 69 44 69 66 66 3c 30 20 29  se if( iDiff<0 )
15ef0 7b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  {.      fts3Posl
15f00 69 73 74 43 6f 70 79 28 30 2c 20 26 70 31 29 3b  istCopy(0, &p1);
15f10 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65  .      fts3GetDe
15f20 6c 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20  ltaVarint3(&p1, 
15f30 70 45 6e 64 31 2c 20 62 44 65 73 63 44 6f 63 6c  pEnd1, bDescDocl
15f40 69 73 74 2c 20 26 69 31 29 3b 0a 20 20 20 20 7d  ist, &i1);.    }
15f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 33  else{.      fts3
15f60 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
15f70 70 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47  p2);.      fts3G
15f80 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15f90 70 32 2c 20 70 45 6e 64 32 2c 20 62 44 65 73 63  p2, pEnd2, bDesc
15fa0 44 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20  Doclist, &i2);. 
15fb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52     }.  }..  *pnR
15fc0 69 67 68 74 20 3d 20 28 69 6e 74 29 28 70 20 2d  ight = (int)(p -
15fd0 20 61 4f 75 74 29 3b 0a 20 20 69 66 28 20 62 44   aOut);.  if( bD
15fe0 65 73 63 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  escDoclist ){.  
15ff0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
16000 52 69 67 68 74 29 3b 0a 20 20 20 20 2a 70 61 52  Right);.    *paR
16010 69 67 68 74 20 3d 20 61 4f 75 74 3b 0a 20 20 7d  ight = aOut;.  }
16020 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
16030 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16040 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 70 6f  rgument pList po
16050 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69  ints to a positi
16060 6f 6e 20 6c 69 73 74 20 6e 4c 69 73 74 20 62 79  on list nList by
16070 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
16080 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 68  s.** function ch
16090 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
160a0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
160b0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 65 6e   contains any en
160c0 74 72 69 65 73 20 66 6f 72 0a 2a 2a 20 61 20 74  tries for.** a t
160d0 6f 6b 65 6e 20 69 6e 20 70 6f 73 69 74 69 6f 6e  oken in position
160e0 20 30 20 28 6f 66 20 61 6e 79 20 63 6f 6c 75 6d   0 (of any colum
160f0 6e 29 2e 20 49 66 20 73 6f 2c 20 69 74 20 77 72  n). If so, it wr
16100 69 74 65 73 20 61 72 67 75 6d 65 6e 74 20 69 44  ites argument iD
16110 65 6c 74 61 0a 2a 2a 20 74 6f 20 74 68 65 20 6f  elta.** to the o
16120 75 74 70 75 74 20 62 75 66 66 65 72 20 70 4f 75  utput buffer pOu
16130 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  t, followed by a
16140 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
16150 6f 6e 73 69 73 74 69 6e 67 20 6f 6e 6c 79 0a 2a  onsisting only.*
16160 2a 20 6f 66 20 74 68 65 20 65 6e 74 72 69 65 73  * of the entries
16170 20 66 72 6f 6d 20 70 4c 69 73 74 20 61 74 20 70   from pList at p
16180 6f 73 69 74 69 6f 6e 20 30 2c 20 61 6e 64 20 74  osition 0, and t
16190 65 72 6d 69 6e 61 74 65 64 20 62 79 20 61 6e 20  erminated by an 
161a0 30 78 30 30 20 62 79 74 65 2e 0a 2a 2a 20 54 68  0x00 byte..** Th
161b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
161c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
161d0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
161e0 74 6f 20 70 4f 75 74 20 28 69 66 20 61 6e 79 29  to pOut (if any)
161f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16200 46 74 73 33 46 69 72 73 74 46 69 6c 74 65 72 28  Fts3FirstFilter(
16210 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
16220 20 69 44 65 6c 74 61 2c 20 20 20 20 20 20 20 20   iDelta,        
16230 20 20 20 2f 2a 20 56 61 72 69 6e 74 20 74 68 61     /* Varint tha
16240 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  t may be written
16250 20 74 6f 20 70 4f 75 74 20 2a 2f 0a 20 20 63 68   to pOut */.  ch
16260 61 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ar *pList,      
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16280 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 28   Position list (
16290 6e 6f 20 30 78 30 30 20 74 65 72 6d 29 20 2a 2f  no 0x00 term) */
162a0 0a 20 20 69 6e 74 20 6e 4c 69 73 74 2c 20 20 20  .  int nList,   
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4c     /* Size of pL
162d0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
162e0 20 20 63 68 61 72 20 2a 70 4f 75 74 20 20 20 20    char *pOut    
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 70 75    /* Write outpu
16310 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
16320 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 69  nt nOut = 0;.  i
16330 6e 74 20 62 57 72 69 74 74 65 6e 20 3d 20 30 3b  nt bWritten = 0;
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16350 2a 20 54 72 75 65 20 6f 6e 63 65 20 69 44 65 6c  * True once iDel
16360 74 61 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  ta has been writ
16370 74 65 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ten */.  char *p
16380 20 3d 20 70 4c 69 73 74 3b 0a 20 20 63 68 61 72   = pList;.  char
16390 20 2a 70 45 6e 64 20 3d 20 26 70 4c 69 73 74 5b   *pEnd = &pList[
163a0 6e 4c 69 73 74 5d 3b 0a 0a 20 20 69 66 28 20 2a  nList];..  if( *
163b0 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 69  p!=0x01 ){.    i
163c0 66 28 20 2a 70 3d 3d 30 78 30 32 20 29 7b 0a 20  f( *p==0x02 ){. 
163d0 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c       nOut += sql
163e0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
163f0 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69  t(&pOut[nOut], i
16400 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 4f  Delta);.      pO
16410 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30  ut[nOut++] = 0x0
16420 32 3b 0a 20 20 20 20 20 20 62 57 72 69 74 74 65  2;.      bWritte
16430 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 1;.    }.   
16440 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43   fts3ColumnlistC
16450 6f 70 79 28 30 2c 20 26 70 29 3b 0a 20 20 7d 0a  opy(0, &p);.  }.
16460 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64  .  while( p<pEnd
16470 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16480 69 6e 74 36 34 20 69 43 6f 6c 3b 0a 20 20 20 20  int64 iCol;.    
16490 70 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d 20 73 71  p++;.    p += sq
164a0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
164b0 6e 74 28 70 2c 20 26 69 43 6f 6c 29 3b 0a 20 20  nt(p, &iCol);.  
164c0 20 20 69 66 28 20 2a 70 3d 3d 30 78 30 32 20 29    if( *p==0x02 )
164d0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 57 72 69  {.      if( bWri
164e0 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tten==0 ){.     
164f0 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c 69 74     nOut += sqlit
16500 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
16510 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69 44 65  &pOut[nOut], iDe
16520 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 62 57  lta);.        bW
16530 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
16540 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 5b 6e    }.      pOut[n
16550 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 31 3b 0a 20  Out++] = 0x01;. 
16560 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c       nOut += sql
16570 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
16580 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69  t(&pOut[nOut], i
16590 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 4f 75 74  Col);.      pOut
165a0 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 32 3b  [nOut++] = 0x02;
165b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 43  .    }.    fts3C
165c0 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c  olumnlistCopy(0,
165d0 20 26 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   &p);.  }.  if( 
165e0 62 57 72 69 74 74 65 6e 20 29 7b 0a 20 20 20 20  bWritten ){.    
165f0 70 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30  pOut[nOut++] = 0
16600 78 30 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  x00;.  }..  retu
16610 72 6e 20 6e 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nOut;.}.../*.
16620 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 64 6f 63  ** Merge all doc
16630 6c 69 73 74 73 20 69 6e 20 74 68 65 20 54 65 72  lists in the Ter
16640 6d 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74  mSelect.aaOutput
16650 5b 5d 20 61 72 72 61 79 20 69 6e 74 6f 20 61 20  [] array into a 
16660 73 69 6e 67 6c 65 0a 2a 2a 20 64 6f 63 6c 69 73  single.** doclis
16670 74 20 73 74 6f 72 65 64 20 69 6e 20 54 65 72 6d  t stored in Term
16680 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74 5b  Select.aaOutput[
16690 30 5d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  0]. If successfu
166a0 6c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 0a 2a 2a  l, delete all.**
166b0 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 73 20   other doclists 
166c0 28 65 78 63 65 70 74 20 74 68 65 20 61 61 4f 75  (except the aaOu
166d0 74 70 75 74 5b 30 5d 20 6f 6e 65 29 20 61 6e 64  tput[0] one) and
166e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
166f0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  K..**.** If an O
16700 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
16710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16720 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
16730 73 65 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20  se it is.** the 
16740 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16750 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
16760 66 72 65 65 20 61 6e 79 20 64 6f 63 6c 69 73 74  free any doclist
16770 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  s left in the.**
16780 20 54 65 72 6d 53 65 6c 65 63 74 2e 61 61 4f 75   TermSelect.aaOu
16790 74 70 75 74 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  tput[] array..*/
167a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
167b0 54 65 72 6d 53 65 6c 65 63 74 46 69 6e 69 73 68  TermSelectFinish
167c0 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20  Merge(Fts3Table 
167d0 2a 70 2c 20 54 65 72 6d 53 65 6c 65 63 74 20 2a  *p, TermSelect *
167e0 70 54 53 29 7b 0a 20 20 63 68 61 72 20 2a 61 4f  pTS){.  char *aO
167f0 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f  ut = 0;.  int nO
16800 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ut = 0;.  int i;
16810 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
16820 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 73  ugh the doclists
16830 20 69 6e 20 74 68 65 20 61 61 4f 75 74 70 75 74   in the aaOutput
16840 5b 5d 20 61 72 72 61 79 2e 20 4d 65 72 67 65 20  [] array. Merge 
16850 74 68 65 6d 20 61 6c 6c 0a 20 20 2a 2a 20 69 6e  them all.  ** in
16860 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 6c  to a single docl
16870 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ist..  */.  for(
16880 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72  i=0; i<SizeofArr
16890 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  ay(pTS->aaOutput
168a0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
168b0 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69   pTS->aaOutput[i
168c0 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ] ){.      if( !
168d0 61 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  aOut ){.        
168e0 61 4f 75 74 20 3d 20 70 54 53 2d 3e 61 61 4f 75  aOut = pTS->aaOu
168f0 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20  tput[i];.       
16900 20 6e 4f 75 74 20 3d 20 70 54 53 2d 3e 61 6e 4f   nOut = pTS->anO
16910 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20  utput[i];.      
16920 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
16930 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  i] = 0;.      }e
16940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
16950 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63   nNew;.        c
16960 68 61 72 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20  har *aNew;..    
16970 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
16980 33 44 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28  3DoclistOrMerge(
16990 70 2d 3e 62 44 65 73 63 49 64 78 2c 20 0a 20 20  p->bDescIdx, .  
169a0 20 20 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61            pTS->a
169b0 61 4f 75 74 70 75 74 5b 69 5d 2c 20 70 54 53 2d  aOutput[i], pTS-
169c0 3e 61 6e 4f 75 74 70 75 74 5b 69 5d 2c 20 61 4f  >anOutput[i], aO
169d0 75 74 2c 20 6e 4f 75 74 2c 20 26 61 4e 65 77 2c  ut, nOut, &aNew,
169e0 20 26 6e 4e 65 77 0a 20 20 20 20 20 20 20 20 29   &nNew.        )
169f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16a20 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
16a30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16a50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16a60 65 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b  e(pTS->aaOutput[
16a70 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
16a80 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b  ite3_free(aOut);
16a90 0a 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61  .        pTS->aa
16aa0 4f 75 74 70 75 74 5b 69 5d 20 3d 20 30 3b 0a 20  Output[i] = 0;. 
16ab0 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20 61 4e         aOut = aN
16ac0 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  ew;.        nOut
16ad0 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = nNew;.      }
16ae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
16af0 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20 3d  S->aaOutput[0] =
16b00 20 61 4f 75 74 3b 0a 20 20 70 54 53 2d 3e 61 6e   aOut;.  pTS->an
16b10 4f 75 74 70 75 74 5b 30 5d 20 3d 20 6e 4f 75 74  Output[0] = nOut
16b20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16b30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
16b40 65 72 67 65 20 74 68 65 20 64 6f 63 6c 69 73 74  erge the doclist
16b50 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69   aDoclist/nDocli
16b60 73 74 20 69 6e 74 6f 20 74 68 65 20 54 65 72 6d  st into the Term
16b70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61  Select object pa
16b80 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
16b90 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
16ba0 68 65 20 6d 65 72 67 65 20 69 73 20 61 6e 20 22  he merge is an "
16bb0 4f 52 22 20 6d 65 72 67 65 20 28 73 65 65 20 66  OR" merge (see f
16bc0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 74 73 33 44  unction.** fts3D
16bd0 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 29 20  oclistOrMerge() 
16be0 66 6f 72 20 64 65 74 61 69 6c 73 29 2e 0a 2a 2a  for details)..**
16bf0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16c00 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
16c10 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
16c20 20 65 61 63 68 20 74 65 72 6d 20 74 68 61 74 20   each term that 
16c30 6d 61 74 63 68 65 73 0a 2a 2a 20 61 20 71 75 65  matches.** a que
16c40 72 69 65 64 20 70 72 65 66 69 78 2e 20 49 74 20  ried prefix. It 
16c50 6d 65 72 67 65 73 20 61 6c 6c 20 74 68 65 73 65  merges all these
16c60 20 64 6f 63 6c 69 73 74 73 20 69 6e 74 6f 20 6f   doclists into o
16c70 6e 65 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 0a  ne, the doclist.
16c80 2a 2a 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ** for the speci
16c90 66 69 65 64 20 70 72 65 66 69 78 2e 20 53 69 6e  fied prefix. Sin
16ca0 63 65 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  ce there can be 
16cb0 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 75 6d  a very large num
16cc0 62 65 72 20 6f 66 0a 2a 2a 20 64 6f 63 6c 69 73  ber of.** doclis
16cd0 74 73 20 74 6f 20 6d 65 72 67 65 2c 20 74 68 65  ts to merge, the
16ce0 20 6d 65 72 67 69 6e 67 20 69 73 20 64 6f 6e 65   merging is done
16cf0 20 70 61 69 72 2d 77 69 73 65 20 75 73 69 6e 67   pair-wise using
16d00 20 74 68 65 20 54 65 72 6d 53 65 6c 65 63 74 0a   the TermSelect.
16d10 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  ** object..**.**
16d20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
16d30 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
16d40 20 69 66 20 74 68 65 20 6d 65 72 67 65 20 69 73   if the merge is
16d50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
16d60 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
16d70 6f 72 20 63 6f 64 65 20 28 53 51 4c 49 54 45 5f  or code (SQLITE_
16d80 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72 72  NOMEM) if an err
16d90 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
16da0 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 65 72  atic int fts3Ter
16db0 6d 53 65 6c 65 63 74 4d 65 72 67 65 28 0a 20 20  mSelectMerge(.  
16dc0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16de0 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e  /* FTS table han
16df0 64 6c 65 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  dle */.  TermSel
16e00 65 63 74 20 2a 70 54 53 2c 20 20 20 20 20 20 20  ect *pTS,       
16e10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
16e20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 74 6f  Select object to
16e30 20 6d 65 72 67 65 20 69 6e 74 6f 20 2a 2f 0a 20   merge into */. 
16e40 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c   char *aDoclist,
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
16e70 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
16e80 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20  nDoclist        
16e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16ea0 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20  ize of aDoclist 
16eb0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
16ec0 20 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70   if( pTS->aaOutp
16ed0 75 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ut[0]==0 ){.    
16ee0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
16ef0 65 20 66 69 72 73 74 20 74 65 72 6d 20 73 65 6c  e first term sel
16f00 65 63 74 65 64 2c 20 63 6f 70 79 20 74 68 65 20  ected, copy the 
16f10 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 6f  doclist to the o
16f20 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 62 75 66  utput.    ** buf
16f30 66 65 72 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  fer using memcpy
16f40 28 29 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (). .    **.    
16f50 2a 2a 20 41 64 64 20 46 54 53 33 5f 56 41 52 49  ** Add FTS3_VARI
16f60 4e 54 5f 4d 41 58 20 62 79 74 65 73 20 6f 66 20  NT_MAX bytes of 
16f70 75 6e 75 73 65 64 20 73 70 61 63 65 20 74 6f 20  unused space to 
16f80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
16f90 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f      ** allocatio
16fa0 6e 2e 20 54 68 69 73 20 69 73 20 73 6f 20 61 73  n. This is so as
16fb0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
16fc0 74 68 65 20 62 75 66 66 65 72 20 69 73 20 62 69  the buffer is bi
16fd0 67 20 65 6e 6f 75 67 68 0a 20 20 20 20 2a 2a 20  g enough.    ** 
16fe0 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 75 72 72  to hold the curr
16ff0 65 6e 74 20 64 6f 63 6c 69 73 74 20 41 4e 44 27  ent doclist AND'
17000 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
17010 20 64 6f 63 6c 69 73 74 2e 20 49 66 20 74 68 65   doclist. If the
17020 0a 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 73  .    ** doclists
17030 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 6f   are stored in o
17040 72 64 65 72 3d 41 53 43 20 6f 72 64 65 72 2c 20  rder=ASC order, 
17050 74 68 69 73 20 70 61 64 64 69 6e 67 20 77 6f 75  this padding wou
17060 6c 64 20 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a  ld not be.    **
17070 20 72 65 71 75 69 72 65 64 20 28 73 69 6e 63 65   required (since
17080 20 74 68 65 20 73 69 7a 65 20 6f 66 20 5b 64 6f   the size of [do
17090 63 6c 69 73 74 41 20 41 4e 44 20 64 6f 63 6c 69  clistA AND docli
170a0 73 74 42 5d 20 69 73 20 61 6c 77 61 79 73 20 6c  stB] is always l
170b0 65 73 73 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ess.    ** than 
170c0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
170d0 73 69 7a 65 20 6f 66 20 5b 64 6f 63 6c 69 73 74  size of [doclist
170e0 41 5d 20 69 6e 20 74 68 61 74 20 63 61 73 65 29  A] in that case)
170f0 2e 20 42 75 74 20 74 68 69 73 20 69 73 0a 20 20  . But this is.  
17100 20 20 2a 2a 20 6e 6f 74 20 74 72 75 65 20 66 6f    ** not true fo
17110 72 20 6f 72 64 65 72 3d 44 45 53 43 2e 20 46 6f  r order=DESC. Fo
17120 72 20 65 78 61 6d 70 6c 65 2c 20 61 20 64 6f 63  r example, a doc
17130 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
17140 28 31 2c 20 2d 31 29 20 0a 20 20 20 20 2a 2a 20  (1, -1) .    ** 
17150 6d 61 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  may be smaller t
17160 68 61 6e 20 28 2d 31 29 2c 20 61 73 20 69 6e 20  han (-1), as in 
17170 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
17180 65 20 74 68 65 20 2d 31 20 6d 61 79 20 62 65 20  e the -1 may be 
17190 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 61 73  stored.    ** as
171a0 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 64   a single-byte d
171b0 65 6c 74 61 2c 20 77 68 65 72 65 61 73 20 69 6e  elta, whereas in
171c0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 20 6d   the second it m
171d0 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 61 73  ust be stored as
171e0 20 61 0a 20 20 20 20 2a 2a 20 46 54 53 33 5f 56   a.    ** FTS3_V
171f0 41 52 49 4e 54 5f 4d 41 58 20 62 79 74 65 20 76  ARINT_MAX byte v
17200 61 72 69 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  arint..    **.  
17210 20 20 2a 2a 20 53 69 6d 69 6c 61 72 20 70 61 64    ** Similar pad
17220 64 69 6e 67 20 69 73 20 61 64 64 65 64 20 69 6e  ding is added in
17230 20 74 68 65 20 66 74 73 33 44 6f 63 6c 69 73 74   the fts3Doclist
17240 4f 72 4d 65 72 67 65 28 29 20 66 75 6e 63 74 69  OrMerge() functi
17250 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
17260 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20  TS->aaOutput[0] 
17270 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
17280 28 6e 44 6f 63 6c 69 73 74 20 2b 20 46 54 53 33  (nDoclist + FTS3
17290 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2b 20 31 29  _VARINT_MAX + 1)
172a0 3b 0a 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74  ;.    pTS->anOut
172b0 70 75 74 5b 30 5d 20 3d 20 6e 44 6f 63 6c 69 73  put[0] = nDoclis
172c0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 53 2d 3e  t;.    if( pTS->
172d0 61 61 4f 75 74 70 75 74 5b 30 5d 20 29 7b 0a 20  aaOutput[0] ){. 
172e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 53 2d       memcpy(pTS-
172f0 3e 61 61 4f 75 74 70 75 74 5b 30 5d 2c 20 61 44  >aaOutput[0], aD
17300 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
17310 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17320 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17330 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
17340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
17350 20 2a 61 4d 65 72 67 65 20 3d 20 61 44 6f 63 6c   *aMerge = aDocl
17360 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 65  ist;.    int nMe
17370 72 67 65 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a  rge = nDoclist;.
17380 20 20 20 20 69 6e 74 20 69 4f 75 74 3b 0a 0a 20      int iOut;.. 
17390 20 20 20 66 6f 72 28 69 4f 75 74 3d 30 3b 20 69     for(iOut=0; i
173a0 4f 75 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28  Out<SizeofArray(
173b0 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 29 3b 20  pTS->aaOutput); 
173c0 69 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iOut++){.      i
173d0 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  f( pTS->aaOutput
173e0 5b 69 4f 75 74 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOut]==0 ){.   
173f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
17400 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  t>0 );.        p
17410 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75  TS->aaOutput[iOu
17420 74 5d 20 3d 20 61 4d 65 72 67 65 3b 0a 20 20 20  t] = aMerge;.   
17430 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70       pTS->anOutp
17440 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67  ut[iOut] = nMerg
17450 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
17460 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17470 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65         char *aNe
17480 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  w;.        int n
17490 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20 20 69 6e  New;..        in
174a0 74 20 72 63 20 3d 20 66 74 73 33 44 6f 63 6c 69  t rc = fts3Docli
174b0 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e 62 44 65  stOrMerge(p->bDe
174c0 73 63 49 64 78 2c 20 61 4d 65 72 67 65 2c 20 6e  scIdx, aMerge, n
174d0 4d 65 72 67 65 2c 20 0a 20 20 20 20 20 20 20 20  Merge, .        
174e0 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75      pTS->aaOutpu
174f0 74 5b 69 4f 75 74 5d 2c 20 70 54 53 2d 3e 61 6e  t[iOut], pTS->an
17500 4f 75 74 70 75 74 5b 69 4f 75 74 5d 2c 20 26 61  Output[iOut], &a
17510 4e 65 77 2c 20 26 6e 4e 65 77 0a 20 20 20 20 20  New, &nNew.     
17520 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
17530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
17550 20 61 4d 65 72 67 65 21 3d 61 44 6f 63 6c 69 73   aMerge!=aDoclis
17560 74 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  t ) sqlite3_free
17570 28 61 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  (aMerge);.      
17580 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17590 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
175a0 20 20 69 66 28 20 61 4d 65 72 67 65 21 3d 61 44    if( aMerge!=aD
175b0 6f 63 6c 69 73 74 20 29 20 73 71 6c 69 74 65 33  oclist ) sqlite3
175c0 5f 66 72 65 65 28 61 4d 65 72 67 65 29 3b 0a 20  _free(aMerge);. 
175d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
175e0 72 65 65 28 70 54 53 2d 3e 61 61 4f 75 74 70 75  ree(pTS->aaOutpu
175f0 74 5b 69 4f 75 74 5d 29 3b 0a 20 20 20 20 20 20  t[iOut]);.      
17600 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
17610 69 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 0a 20 20  iOut] = 0;.  .  
17620 20 20 20 20 20 20 61 4d 65 72 67 65 20 3d 20 61        aMerge = a
17630 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4d 65  New;.        nMe
17640 72 67 65 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  rge = nNew;.    
17650 20 20 20 20 69 66 28 20 28 69 4f 75 74 2b 31 29      if( (iOut+1)
17660 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28 70 54  ==SizeofArray(pT
17670 53 2d 3e 61 61 4f 75 74 70 75 74 29 20 29 7b 0a  S->aaOutput) ){.
17680 20 20 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61            pTS->a
17690 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20  aOutput[iOut] = 
176a0 61 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  aMerge;.        
176b0 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b    pTS->anOutput[
176c0 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67 65 3b 0a  iOut] = nMerge;.
176d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
176e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
176f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17700 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17710 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
17720 20 70 4e 65 77 20 74 6f 20 74 68 65 20 65 6e 64   pNew to the end
17730 20 6f 66 20 74 68 65 20 70 43 73 72 2d 3e 61 70   of the pCsr->ap
17740 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 2e  Segment[] array.
17750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17760 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
17770 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74 73 33  orAppend(.  Fts3
17780 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
17790 70 43 73 72 2c 20 0a 20 20 46 74 73 33 53 65 67  pCsr, .  Fts3Seg
177a0 52 65 61 64 65 72 20 2a 70 4e 65 77 0a 29 7b 0a  Reader *pNew.){.
177b0 20 20 69 66 28 20 28 70 43 73 72 2d 3e 6e 53 65    if( (pCsr->nSe
177c0 67 6d 65 6e 74 25 31 36 29 3d 3d 30 20 29 7b 0a  gment%16)==0 ){.
177d0 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
177e0 72 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 69  r **apNew;.    i
177f0 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 43 73 72  nt nByte = (pCsr
17800 2d 3e 6e 53 65 67 6d 65 6e 74 20 2b 20 31 36 29  ->nSegment + 16)
17810 2a 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52  *sizeof(Fts3SegR
17820 65 61 64 65 72 2a 29 3b 0a 20 20 20 20 61 70 4e  eader*);.    apN
17830 65 77 20 3d 20 28 46 74 73 33 53 65 67 52 65 61  ew = (Fts3SegRea
17840 64 65 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  der **)sqlite3_r
17850 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 70 53  ealloc(pCsr->apS
17860 65 67 6d 65 6e 74 2c 20 6e 42 79 74 65 29 3b 0a  egment, nByte);.
17870 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
17880 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
17890 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
178a0 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  (pNew);.      re
178b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
178c0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73  M;.    }.    pCs
178d0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 61  r->apSegment = a
178e0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 73 72  pNew;.  }.  pCsr
178f0 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 70 43 73 72  ->apSegment[pCsr
17900 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 5d 20 3d 20  ->nSegment++] = 
17910 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 53  pNew;.  return S
17920 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17930 2a 2a 20 41 64 64 20 73 65 67 2d 72 65 61 64 65  ** Add seg-reade
17940 72 20 6f 62 6a 65 63 74 73 20 74 6f 20 74 68 65  r objects to the
17950 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
17960 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  der object passe
17970 64 20 61 73 20 74 68 65 0a 2a 2a 20 38 74 68 20  d as the.** 8th 
17980 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
17990 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
179a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
179b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
179c0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
179d0 72 20 63 6f 64 65 0a 2a 2a 20 6f 74 68 65 72 77  r code.** otherw
179e0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
179f0 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
17a00 43 75 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61  Cursor(.  Fts3Ta
17a10 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
17a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
17a30 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
17a40 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
17a70 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  id */.  int iInd
17a80 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
17a90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17aa0 20 74 6f 20 73 65 61 72 63 68 20 28 66 72 6f 6d   to search (from
17ab0 20 30 20 74 6f 20 70 2d 3e 6e 49 6e 64 65 78 2d   0 to p->nIndex-
17ac0 31 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  1) */.  int iLev
17ad0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
17ae0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
17af0 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
17b00 73 63 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  scan */.  const 
17b10 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
17b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
17b30 6d 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  m to query for *
17b40 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
17b70 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
17b80 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 2c  .  int isPrefix,
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
17bb0 20 70 72 65 66 69 78 20 73 65 61 72 63 68 20 2a   prefix search *
17bc0 2f 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 2c 20  /.  int isScan, 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
17bf0 63 61 6e 20 66 72 6f 6d 20 7a 54 65 72 6d 20 74  can from zTerm t
17c00 6f 20 45 4f 46 20 2a 2f 0a 20 20 46 74 73 33 4d  o EOF */.  Fts3M
17c10 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
17c20 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
17c30 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70  rsor object to p
17c40 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
17c50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17c60 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
17c70 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
17c80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17c90 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
17ca0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
17cb0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
17cc0 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
17cd0 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20   int rc2;       
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cf0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 73 71   /* Result of sq
17d00 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f  lite3_reset() */
17d10 0a 0a 20 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c  ..  /* If iLevel
17d20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 30 20   is less than 0 
17d30 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  and this is not 
17d40 61 20 73 63 61 6e 2c 20 69 6e 63 6c 75 64 65 20  a scan, include 
17d50 61 20 73 65 67 2d 72 65 61 64 65 72 20 0a 20 20  a seg-reader .  
17d60 2a 2a 20 66 6f 72 20 74 68 65 20 70 65 6e 64 69  ** for the pendi
17d70 6e 67 2d 74 65 72 6d 73 2e 20 49 66 20 74 68 69  ng-terms. If thi
17d80 73 20 69 73 20 61 20 73 63 61 6e 2c 20 74 68 65  s is a scan, the
17d90 6e 20 74 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  n this call must
17da0 20 62 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 6d   be being.  ** m
17db0 61 64 65 20 62 79 20 61 6e 20 66 74 73 34 61 75  ade by an fts4au
17dc0 78 20 6d 6f 64 75 6c 65 2c 20 6e 6f 74 20 61 6e  x module, not an
17dd0 20 46 54 53 20 74 61 62 6c 65 2e 20 49 6e 20 74   FTS table. In t
17de0 68 69 73 20 63 61 73 65 20 63 61 6c 6c 69 6e 67  his case calling
17df0 0a 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61  .  ** Fts3SegRea
17e00 64 65 72 50 65 6e 64 69 6e 67 20 6d 69 67 68 74  derPending might
17e10 20 73 65 67 66 61 75 6c 74 2c 20 61 73 20 74 68   segfault, as th
17e20 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
17e30 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
17e40 66 74 73 34 61 75 78 20 61 72 65 20 6e 6f 74 20  fts4aux are not 
17e50 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75 6c  completely popul
17e60 61 74 65 64 2e 20 53 6f 20 69 74 27 73 20 65 61  ated. So it's ea
17e70 73 69 65 73 74 20 74 6f 20 66 69 6c 74 65 72 20  siest to filter 
17e80 74 68 65 73 65 0a 20 20 2a 2a 20 63 61 6c 6c 73  these.  ** calls
17e90 20 6f 75 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20   out here.  */. 
17ea0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 26 26   if( iLevel<0 &&
17eb0 20 70 2d 3e 61 49 6e 64 65 78 20 29 7b 0a 20 20   p->aIndex ){.  
17ec0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
17ed0 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 72  *pSeg = 0;.    r
17ee0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
17ef0 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28  egReaderPending(
17f00 70 2c 20 69 49 6e 64 65 78 2c 20 7a 54 65 72 6d  p, iIndex, zTerm
17f10 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66 69  , nTerm, isPrefi
17f20 78 7c 7c 69 73 53 63 61 6e 2c 20 26 70 53 65 67  x||isScan, &pSeg
17f30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
17f40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67  QLITE_OK && pSeg
17f50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
17f60 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
17f70 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c 20 70  orAppend(pCsr, p
17f80 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Seg);.    }.  }.
17f90 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46  .  if( iLevel!=F
17fa0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
17fb0 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 69 66 28  NDING ){.    if(
17fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17fd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
17fe0 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64 69  ite3Fts3AllSegdi
17ff0 72 73 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  rs(p, iLangid, i
18000 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 26  Index, iLevel, &
18010 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pStmt);.    }.. 
18020 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
18030 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
18040 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c  E_ROW==(rc = sql
18050 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
18060 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53  ) ){.      Fts3S
18070 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
18080 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65   0;..      /* Re
18090 61 64 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  ad the values re
180a0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
180b0 4c 45 43 54 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  LECT into local 
180c0 76 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  variables. */.  
180d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
180e0 34 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20  4 iStartBlock = 
180f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
18100 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
18110 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
18120 74 36 34 20 69 4c 65 61 76 65 73 45 6e 64 42 6c  t64 iLeavesEndBl
18130 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ock = sqlite3_co
18140 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
18150 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
18160 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c  te3_int64 iEndBl
18170 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ock = sqlite3_co
18180 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
18190 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  , 3);.      int 
181a0 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  nRoot = sqlite3_
181b0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
181c0 6d 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 68  mt, 4);.      ch
181d0 61 72 20 63 6f 6e 73 74 20 2a 7a 52 6f 6f 74 20  ar const *zRoot 
181e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
181f0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 3b  _blob(pStmt, 4);
18200 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 7a 54  ..      /* If zT
18210 65 72 6d 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  erm is not NULL,
18220 20 61 6e 64 20 74 68 69 73 20 73 65 67 6d 65 6e   and this segmen
18230 74 20 69 73 20 6e 6f 74 20 73 74 6f 72 65 64 20  t is not stored 
18240 65 6e 74 69 72 65 6c 79 20 6f 6e 20 69 74 73 0a  entirely on its.
18250 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f        ** root no
18260 64 65 2c 20 74 68 65 20 72 61 6e 67 65 20 6f 66  de, the range of
18270 20 6c 65 61 76 65 73 20 73 63 61 6e 6e 65 64 20   leaves scanned 
18280 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 2e 20  can be reduced. 
18290 44 6f 20 74 68 69 73 2e 20 2a 2f 0a 20 20 20 20  Do this. */.    
182a0 20 20 69 66 28 20 69 53 74 61 72 74 42 6c 6f 63    if( iStartBloc
182b0 6b 20 26 26 20 7a 54 65 72 6d 20 29 7b 0a 20 20  k && zTerm ){.  
182c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
182d0 74 36 34 20 2a 70 69 20 3d 20 28 69 73 50 72 65  t64 *pi = (isPre
182e0 66 69 78 20 3f 20 26 69 4c 65 61 76 65 73 45 6e  fix ? &iLeavesEn
182f0 64 42 6c 6f 63 6b 20 3a 20 30 29 3b 0a 20 20 20  dBlock : 0);.   
18300 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
18310 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72  lectLeaf(p, zTer
18320 6d 2c 20 6e 54 65 72 6d 2c 20 7a 52 6f 6f 74 2c  m, nTerm, zRoot,
18330 20 6e 52 6f 6f 74 2c 20 26 69 53 74 61 72 74 42   nRoot, &iStartB
18340 6c 6f 63 6b 2c 20 70 69 29 3b 0a 20 20 20 20 20  lock, pi);.     
18350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18360 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
18370 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  shed;.        if
18380 28 20 69 73 50 72 65 66 69 78 3d 3d 30 20 26 26  ( isPrefix==0 &&
18390 20 69 73 53 63 61 6e 3d 3d 30 20 29 20 69 4c 65   isScan==0 ) iLe
183a0 61 76 65 73 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  avesEndBlock = i
183b0 53 74 61 72 74 42 6c 6f 63 6b 3b 0a 20 20 20 20  StartBlock;.    
183c0 20 20 7d 0a 20 0a 20 20 20 20 20 20 72 63 20 3d    }. .      rc =
183d0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
183e0 65 61 64 65 72 4e 65 77 28 70 43 73 72 2d 3e 6e  eaderNew(pCsr->n
183f0 53 65 67 6d 65 6e 74 2b 31 2c 20 0a 20 20 20 20  Segment+1, .    
18400 20 20 20 20 20 20 28 69 73 50 72 65 66 69 78 3d        (isPrefix=
18410 3d 30 20 26 26 20 69 73 53 63 61 6e 3d 3d 30 29  =0 && isScan==0)
18420 2c 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ,.          iSta
18430 72 74 42 6c 6f 63 6b 2c 20 69 4c 65 61 76 65 73  rtBlock, iLeaves
18440 45 6e 64 42 6c 6f 63 6b 2c 20 0a 20 20 20 20 20  EndBlock, .     
18450 20 20 20 20 20 69 45 6e 64 42 6c 6f 63 6b 2c 20       iEndBlock, 
18460 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 70  zRoot, nRoot, &p
18470 53 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Seg.      );.   
18480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18490 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
184a0 73 68 65 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  shed;.      rc =
184b0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75   fts3SegReaderCu
184c0 72 73 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c  rsorAppend(pCsr,
184d0 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pSeg);.    }.  
184e0 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20  }.. finished:.  
184f0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
18500 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
18510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
18520 45 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  E ) rc = rc2;.. 
18530 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18540 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 63 75  *.** Set up a cu
18550 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72 20  rsor object for 
18560 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
18570 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  h a full-text in
18580 64 65 78 20 6f 72 20 61 20 0a 2a 2a 20 73 69 6e  dex or a .** sin
18590 67 6c 65 20 6c 65 76 65 6c 20 74 68 65 72 65 69  gle level therei
185a0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
185b0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
185c0 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61 62 6c  rsor(.  Fts3Tabl
185d0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
185e0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
185f0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
18600 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 2d 69 64    /* Language-id
18630 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
18640 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
18670 63 68 20 28 66 72 6f 6d 20 30 20 74 6f 20 70 2d  ch (from 0 to p-
18680 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20  >nIndex-1) */.  
18690 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
186a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186b0 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d  /* Level of segm
186c0 65 6e 74 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ents to scan */.
186d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
186e0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
186f0 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65    /* Term to que
18700 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
18710 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
18720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18730 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
18740 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
18750 73 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20  sPrefix,        
18760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18770 75 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20  ue for a prefix 
18780 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
18790 69 73 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20  isScan,         
187a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
187b0 72 75 65 20 74 6f 20 73 63 61 6e 20 66 72 6f 6d  rue to scan from
187c0 20 7a 54 65 72 6d 20 74 6f 20 45 4f 46 20 2a 2f   zTerm to EOF */
187d0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
187e0 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
187f0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
18800 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
18810 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  /.){.  assert( i
18820 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
18830 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
18840 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
18850 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
18860 5f 41 4c 4c 0a 20 20 20 20 20 20 7c 7c 20 20 69  _ALL.      ||  i
18870 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
18880 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 0a 20  URSOR_PENDING . 
18890 20 20 20 20 20 7c 7c 20 20 69 4c 65 76 65 6c 3e       ||  iLevel>
188a0 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  =0.  );.  assert
188b0 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45  ( iLevel<FTS3_SE
188c0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b  GDIR_MAXLEVEL );
188d0 0a 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f  .  assert( FTS3_
188e0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 3c 30 20  SEGCURSOR_ALL<0 
188f0 26 26 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  && FTS3_SEGCURSO
18900 52 5f 50 45 4e 44 49 4e 47 3c 30 20 29 3b 0a 20  R_PENDING<0 );. 
18910 20 61 73 73 65 72 74 28 20 69 73 50 72 65 66 69   assert( isPrefi
18920 78 3d 3d 30 20 7c 7c 20 69 73 53 63 61 6e 3d 3d  x==0 || isScan==
18930 30 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  0 );..  memset(p
18940 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Csr, 0, sizeof(F
18950 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
18960 72 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  r));.  return ft
18970 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
18980 72 28 0a 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  r(.      p, iLan
18990 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
189a0 76 65 6c 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  vel, zTerm, nTer
189b0 6d 2c 20 69 73 50 72 65 66 69 78 2c 20 69 73 53  m, isPrefix, isS
189c0 63 61 6e 2c 20 70 43 73 72 0a 20 20 29 3b 0a 7d  can, pCsr.  );.}
189d0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74  ../*.** In addit
189e0 69 6f 6e 20 74 6f 20 69 74 73 20 63 75 72 72 65  ion to its curre
189f0 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  nt configuration
18a00 2c 20 68 61 76 65 20 74 68 65 20 46 74 73 33 4d  , have the Fts3M
18a10 75 6c 74 69 53 65 67 52 65 61 64 65 72 0a 2a 2a  ultiSegReader.**
18a20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 34   passed as the 4
18a30 74 68 20 61 72 67 75 6d 65 6e 74 20 61 6c 73 6f  th argument also
18a40 20 73 63 61 6e 20 74 68 65 20 64 6f 63 6c 69 73   scan the doclis
18a50 74 20 66 6f 72 20 74 65 72 6d 20 7a 54 65 72 6d  t for term zTerm
18a60 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 53 51  /nTerm..**.** SQ
18a70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18a80 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
18a90 6f 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73  occurs, otherwis
18aa0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
18ab0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
18ac0 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
18ad0 64 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f  derCursorAddZero
18ae0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
18af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18b00 20 20 20 20 2f 2a 20 46 54 53 20 76 69 72 74 75      /* FTS virtu
18b10 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
18b20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
18b30 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18b40 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
18b50 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
18b60 63 61 6e 20 64 6f 63 6c 69 73 74 20 6f 66 20 2a  can doclist of *
18b70 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
18b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18ba0 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20   bytes in zTerm 
18bb0 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
18bc0 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
18bd0 20 20 20 20 20 2f 2a 20 46 74 73 33 4d 75 6c 74       /* Fts3Mult
18be0 69 53 65 67 52 65 61 64 65 72 20 74 6f 20 6d 6f  iSegReader to mo
18bf0 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  dify */.){.  ret
18c00 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
18c10 72 43 75 72 73 6f 72 28 70 2c 20 0a 20 20 20 20  rCursor(p, .    
18c20 20 20 69 4c 61 6e 67 69 64 2c 20 30 2c 20 46 54    iLangid, 0, FT
18c30 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
18c40 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
18c50 30 2c 20 30 2c 70 43 73 72 0a 20 20 29 3b 0a 7d  0, 0,pCsr.  );.}
18c60 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20  ../*.** Open an 
18c70 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18c80 65 72 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  er to scan the d
18c90 6f 63 6c 69 73 74 20 66 6f 72 20 74 65 72 6d 20  oclist for term 
18ca0 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 4f 72 2c  zTerm/nTerm. Or,
18cb0 0a 2a 2a 20 69 66 20 69 73 50 72 65 66 69 78 20  .** if isPrefix 
18cc0 69 73 20 74 72 75 65 2c 20 74 6f 20 73 63 61 6e  is true, to scan
18cd0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
18ce0 20 61 6c 6c 20 74 65 72 6d 73 20 66 6f 72 20 77   all terms for w
18cf0 68 69 63 68 20 0a 2a 2a 20 7a 54 65 72 6d 2f 6e  hich .** zTerm/n
18d00 54 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78  Term is a prefix
18d10 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
18d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18d30 4b 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61  K and write.** a
18d40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18d50 6e 65 77 20 46 74 73 33 4d 75 6c 74 69 53 65 67  new Fts3MultiSeg
18d60 52 65 61 64 65 72 20 74 6f 20 2a 70 70 53 65 67  Reader to *ppSeg
18d70 63 73 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  csr. Otherwise, 
18d80 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c  return.** an SQL
18d90 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
18da0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
18db0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
18dc0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
18dd0 66 72 65 65 20 74 68 69 73 20 6f 62 6a 65 63 74  free this object
18de0 20 62 79 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   by eventually.*
18df0 2a 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  * passing it to 
18e00 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  fts3SegReaderCur
18e10 73 6f 72 46 72 65 65 28 29 20 0a 2a 2a 0a 2a 2a  sorFree() .**.**
18e20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18e30 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
18e40 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
18e50 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
18e60 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 75  rror code..** Ou
18e70 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
18e80 70 70 53 65 67 63 73 72 20 69 73 20 73 65 74 20  ppSegcsr is set 
18e90 74 6f 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72  to 0 if an error
18ea0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
18eb0 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53  ic int fts3TermS
18ec0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a  egReaderCursor(.
18ed0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
18ee0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
18ef0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
18f00 6c 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65  le cursor handle
18f10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18f20 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
18f30 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
18f40 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
18f50 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
18f80 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
18f90 6e 74 20 69 73 50 72 65 66 69 78 2c 20 20 20 20  nt isPrefix,    
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18fb0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
18fc0 66 69 78 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  fix search */.  
18fd0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18fe0 65 72 20 2a 2a 70 70 53 65 67 63 73 72 20 20 20  er **ppSegcsr   
18ff0 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  /* OUT: Allocate
19000 64 20 73 65 67 2d 72 65 61 64 65 72 20 63 75 72  d seg-reader cur
19010 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  sor */.){.  Fts3
19020 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
19030 70 53 65 67 63 73 72 3b 20 20 20 20 2f 2a 20 4f  pSegcsr;    /* O
19040 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
19050 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
19060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19070 45 5f 4e 4f 4d 45 4d 3b 20 20 20 20 20 20 20 20  E_NOMEM;        
19080 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
19090 20 2a 2f 0a 0a 20 20 70 53 65 67 63 73 72 20 3d   */..  pSegcsr =
190a0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
190b0 73 69 7a 65 6f 66 28 46 74 73 33 4d 75 6c 74 69  sizeof(Fts3Multi
190c0 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 69  SegReader));.  i
190d0 66 28 20 70 53 65 67 63 73 72 20 29 7b 0a 20 20  f( pSegcsr ){.  
190e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
190f0 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20   bFound = 0;    
19100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
19110 75 65 20 6f 6e 63 65 20 61 6e 20 69 6e 64 65 78  ue once an index
19120 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20   has been found 
19130 2a 2f 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65  */.    Fts3Table
19140 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
19150 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
19160 74 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 69 73  tab;..    if( is
19170 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
19180 66 6f 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d  for(i=1; bFound=
19190 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  =0 && i<p->nInde
191a0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
191b0 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69   if( p->aIndex[i
191c0 5d 2e 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d  ].nPrefix==nTerm
191d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
191e0 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
191f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19200 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
19210 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
19220 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
19230 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
19240 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
19250 6d 2c 20 6e 54 65 72 6d 2c 20 30 2c 20 30 2c 20  m, nTerm, 0, 0, 
19260 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
19270 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70    );.          p
19280 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20  Segcsr->bLookup 
19290 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
192a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
192b0 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d 3d 30  r(i=1; bFound==0
192c0 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b   && i<p->nIndex;
192d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
192e0 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  f( p->aIndex[i].
192f0 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d 2b 31  nPrefix==nTerm+1
19300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
19310 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
19320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19330 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
19340 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
19350 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
19360 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
19370 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
19380 6d 2c 20 6e 54 65 72 6d 2c 20 31 2c 20 30 2c 20  m, nTerm, 1, 0, 
19390 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
193a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
193b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
193c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
193d0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
193e0 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f 28  erCursorAddZero(
193f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19400 20 70 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69   p, pCsr->iLangi
19410 64 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  d, zTerm, nTerm,
19420 20 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20   pSegcsr.       
19430 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
19440 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19460 20 69 66 28 20 62 46 6f 75 6e 64 3d 3d 30 20 29   if( bFound==0 )
19470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
19480 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
19490 72 43 75 72 73 6f 72 28 70 2c 20 70 43 73 72 2d  rCursor(p, pCsr-
194a0 3e 69 4c 61 6e 67 69 64 2c 20 0a 20 20 20 20 20  >iLangid, .     
194b0 20 20 20 20 20 30 2c 20 46 54 53 33 5f 53 45 47       0, FTS3_SEG
194c0 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
194d0 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66  m, nTerm, isPref
194e0 69 78 2c 20 30 2c 20 70 53 65 67 63 73 72 0a 20  ix, 0, pSegcsr. 
194f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 53       );.      pS
19500 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d  egcsr->bLookup =
19510 20 21 69 73 50 72 65 66 69 78 3b 0a 20 20 20 20   !isPrefix;.    
19520 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 65 67 63  }.  }..  *ppSegc
19530 73 72 20 3d 20 70 53 65 67 63 73 72 3b 0a 20 20  sr = pSegcsr;.  
19540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19550 0a 2a 2a 20 46 72 65 65 20 61 6e 20 46 74 73 33  .** Free an Fts3
19560 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 61  MultiSegReader a
19570 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 33  llocated by fts3
19580 54 65 72 6d 53 65 67 52 65 61 64 65 72 43 75 72  TermSegReaderCur
19590 73 6f 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  sor()..*/.static
195a0 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61   void fts3SegRea
195b0 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 46 74  derCursorFree(Ft
195c0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
195d0 20 2a 70 53 65 67 63 73 72 29 7b 0a 20 20 73 71   *pSegcsr){.  sq
195e0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
195f0 65 72 46 69 6e 69 73 68 28 70 53 65 67 63 73 72  erFinish(pSegcsr
19600 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
19610 65 28 70 53 65 67 63 73 72 29 3b 0a 7d 0a 0a 2f  e(pSegcsr);.}../
19620 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19630 6f 6e 20 72 65 74 72 69 65 76 65 73 20 74 68 65  on retrieves the
19640 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
19650 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
19660 28 6f 72 20 74 65 72 6d 0a 2a 2a 20 70 72 65 66  (or term.** pref
19670 69 78 29 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ix) from the dat
19680 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
19690 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c   int fts3TermSel
196a0 65 63 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ect(.  Fts3Table
196b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
196c0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
196d0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
196e0 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 54 6f  /.  Fts3PhraseTo
196f0 6b 65 6e 20 2a 70 54 6f 6b 2c 20 20 20 20 20 20  ken *pTok,      
19700 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20      /* Token to 
19710 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
19720 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19740 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72  * Column to quer
19750 79 20 28 6f 72 20 2d 76 65 20 66 6f 72 20 61 6c  y (or -ve for al
19760 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  l columns) */.  
19770 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20  int *pnOut,     
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19790 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
197a0 62 75 66 66 65 72 20 61 74 20 2a 70 70 4f 75 74  buffer at *ppOut
197b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f   */.  char **ppO
197c0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
197d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
197e0 6c 6c 6f 63 65 64 20 72 65 73 75 6c 74 20 62 75  lloced result bu
197f0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ffer */.){.  int
19800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19820 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19830 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
19840 64 65 72 20 2a 70 53 65 67 63 73 72 3b 20 20 20  der *pSegcsr;   
19850 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 63   /* Seg-reader c
19860 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74  ursor for this t
19870 65 72 6d 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  erm */.  TermSel
19880 65 63 74 20 74 73 63 3b 20 20 20 20 20 20 20 20  ect tsc;        
19890 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
198a0 63 74 20 66 6f 72 20 70 61 69 72 2d 77 69 73 65  ct for pair-wise
198b0 20 64 6f 63 6c 69 73 74 20 6d 65 72 67 69 6e 67   doclist merging
198c0 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c   */.  Fts3SegFil
198d0 74 65 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20  ter filter;     
198e0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
198f0 20 74 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e   term filter con
19900 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20  figuration */.. 
19910 20 70 53 65 67 63 73 72 20 3d 20 70 54 6f 6b 2d   pSegcsr = pTok-
19920 3e 70 53 65 67 63 73 72 3b 0a 20 20 6d 65 6d 73  >pSegcsr;.  mems
19930 65 74 28 26 74 73 63 2c 20 30 2c 20 73 69 7a 65  et(&tsc, 0, size
19940 6f 66 28 54 65 72 6d 53 65 6c 65 63 74 29 29 3b  of(TermSelect));
19950 0a 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ..  filter.flags
19960 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
19970 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 7c 20 46  IGNORE_EMPTY | F
19980 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55  TS3_SEGMENT_REQU
19990 49 52 45 5f 50 4f 53 0a 20 20 20 20 20 20 20 20  IRE_POS.        
199a0 7c 20 28 70 54 6f 6b 2d 3e 69 73 50 72 65 66 69  | (pTok->isPrefi
199b0 78 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  x ? FTS3_SEGMENT
199c0 5f 50 52 45 46 49 58 20 3a 20 30 29 0a 20 20 20  _PREFIX : 0).   
199d0 20 20 20 20 20 7c 20 28 70 54 6f 6b 2d 3e 62 46       | (pTok->bF
199e0 69 72 73 74 20 3f 20 46 54 53 33 5f 53 45 47 4d  irst ? FTS3_SEGM
199f0 45 4e 54 5f 46 49 52 53 54 20 3a 20 30 29 0a 20  ENT_FIRST : 0). 
19a00 20 20 20 20 20 20 20 7c 20 28 69 43 6f 6c 75 6d         | (iColum
19a10 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 46  n<p->nColumn ? F
19a20 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
19a30 4d 4e 5f 46 49 4c 54 45 52 20 3a 20 30 29 3b 0a  MN_FILTER : 0);.
19a40 20 20 66 69 6c 74 65 72 2e 69 43 6f 6c 20 3d 20    filter.iCol = 
19a50 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66 69 6c 74 65  iColumn;.  filte
19a60 72 2e 7a 54 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e  r.zTerm = pTok->
19a70 7a 3b 0a 20 20 66 69 6c 74 65 72 2e 6e 54 65 72  z;.  filter.nTer
19a80 6d 20 3d 20 70 54 6f 6b 2d 3e 6e 3b 0a 0a 20 20  m = pTok->n;..  
19a90 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
19aa0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70  SegReaderStart(p
19ab0 2c 20 70 53 65 67 63 73 72 2c 20 26 66 69 6c 74  , pSegcsr, &filt
19ac0 65 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  er);.  while( SQ
19ad0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
19ae0 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d    && SQLITE_ROW=
19af0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  =(rc = sqlite3Ft
19b00 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
19b10 70 2c 20 70 53 65 67 63 73 72 29 29 20 0a 20 20  p, pSegcsr)) .  
19b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
19b30 54 65 72 6d 53 65 6c 65 63 74 4d 65 72 67 65 28  TermSelectMerge(
19b40 70 2c 20 26 74 73 63 2c 20 70 53 65 67 63 73 72  p, &tsc, pSegcsr
19b50 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 53 65 67  ->aDoclist, pSeg
19b60 63 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a  csr->nDoclist);.
19b70 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
19b80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19b90 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65 6c  rc = fts3TermSel
19ba0 65 63 74 46 69 6e 69 73 68 4d 65 72 67 65 28 70  ectFinishMerge(p
19bb0 2c 20 26 74 73 63 29 3b 0a 20 20 7d 0a 20 20 69  , &tsc);.  }.  i
19bc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19bd0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d   ){.    *ppOut =
19be0 20 74 73 63 2e 61 61 4f 75 74 70 75 74 5b 30 5d   tsc.aaOutput[0]
19bf0 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 74  ;.    *pnOut = t
19c00 73 63 2e 61 6e 4f 75 74 70 75 74 5b 30 5d 3b 0a  sc.anOutput[0];.
19c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19c20 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
19c30 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 74   i<SizeofArray(t
19c40 73 63 2e 61 61 4f 75 74 70 75 74 29 3b 20 69 2b  sc.aaOutput); i+
19c50 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
19c60 33 5f 66 72 65 65 28 74 73 63 2e 61 61 4f 75 74  3_free(tsc.aaOut
19c70 70 75 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  put[i]);.    }. 
19c80 20 7d 0a 0a 20 20 66 74 73 33 53 65 67 52 65 61   }..  fts3SegRea
19c90 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70 53  derCursorFree(pS
19ca0 65 67 63 73 72 29 3b 0a 20 20 70 54 6f 6b 2d 3e  egcsr);.  pTok->
19cb0 70 53 65 67 63 73 72 20 3d 20 30 3b 0a 20 20 72  pSegcsr = 0;.  r
19cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19cd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19ce0 20 63 6f 75 6e 74 73 20 74 68 65 20 74 6f 74 61   counts the tota
19cf0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 69  l number of doci
19d00 64 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ds in the doclis
19d10 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 62  t stored.** in b
19d20 75 66 66 65 72 20 61 4c 69 73 74 5b 5d 2c 20 73  uffer aList[], s
19d30 69 7a 65 20 6e 4c 69 73 74 20 62 79 74 65 73 2e  ize nList bytes.
19d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
19d50 50 6f 73 6c 69 73 74 20 61 72 67 75 6d 65 6e 74  Poslist argument
19d60 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
19d70 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
19d80 74 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  t the doclist.**
19d90 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 73 69   contains a posi
19da0 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 6c 6c 6f 77  tion-list follow
19db0 69 6e 67 20 65 61 63 68 20 64 6f 63 69 64 2e 20  ing each docid. 
19dc0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
19dd0 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68 61 74   assumed.** that
19de0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
19df0 73 69 6d 70 6c 79 20 61 20 6c 69 73 74 20 6f 66  simply a list of
19e00 20 64 6f 63 69 64 73 20 73 74 6f 72 65 64 20 61   docids stored a
19e10 73 20 64 65 6c 74 61 20 65 6e 63 6f 64 65 64 20  s delta encoded 
19e20 0a 2a 2a 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a  .** varints..*/.
19e30 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
19e40 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64  oclistCountDocid
19e50 73 28 63 68 61 72 20 2a 61 4c 69 73 74 2c 20 69  s(char *aList, i
19e60 6e 74 20 6e 4c 69 73 74 29 7b 0a 20 20 69 6e 74  nt nList){.  int
19e70 20 6e 44 6f 63 20 3d 20 30 3b 20 20 20 20 20 20   nDoc = 0;      
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e90 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
19ea0 20 20 69 66 28 20 61 4c 69 73 74 20 29 7b 0a 20    if( aList ){. 
19eb0 20 20 20 63 68 61 72 20 2a 61 45 6e 64 20 3d 20     char *aEnd = 
19ec0 26 61 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 20 20  &aList[nList];  
19ed0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19ee0 6e 65 20 62 79 74 65 20 61 66 74 65 72 20 45 4f  ne byte after EO
19ef0 46 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 70  F */.    char *p
19f00 20 3d 20 61 4c 69 73 74 3b 20 20 20 20 20 20 20   = aList;       
19f10 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
19f20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
19f30 3c 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e  <aEnd ){.      n
19f40 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  Doc++;.      whi
19f50 6c 65 28 20 28 2a 70 2b 2b 29 26 30 78 38 30 20  le( (*p++)&0x80 
19f60 29 3b 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 64  );     /* Skip d
19f70 6f 63 69 64 20 76 61 72 69 6e 74 20 2a 2f 0a 20  ocid varint */. 
19f80 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74       fts3Poslist
19f90 43 6f 70 79 28 30 2c 20 26 70 29 3b 20 20 20 2f  Copy(0, &p);   /
19fa0 2a 20 53 6b 69 70 20 6f 76 65 72 20 70 6f 73 69  * Skip over posi
19fb0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
19fc0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
19fd0 20 6e 44 6f 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nDoc;.}../*.** 
19fe0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
19ff0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
1a000 6f 77 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ow in the %_cont
1a010 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
1a020 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  * matches the se
1a030 61 72 63 68 20 63 72 69 74 65 72 69 61 2e 20 20  arch criteria.  
1a040 46 6f 72 20 61 20 4d 41 54 43 48 20 73 65 61 72  For a MATCH sear
1a050 63 68 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ch, this will be
1a060 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 72 6f 77  .** the next row
1a070 20 74 68 61 74 20 6d 61 74 63 68 65 73 2e 20 46   that matches. F
1a080 6f 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  or a full-table 
1a090 73 63 61 6e 2c 20 74 68 69 73 20 77 69 6c 6c 20  scan, this will 
1a0a0 62 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 74 68 65  be.** simply the
1a0b0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
1a0c0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
1a0d0 2e 20 20 46 6f 72 20 61 20 64 6f 63 69 64 20 6c  .  For a docid l
1a0e0 6f 6f 6b 75 70 2c 0a 2a 2a 20 74 68 69 73 20 72  ookup,.** this r
1a0f0 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 65  outine simply se
1a100 74 73 20 74 68 65 20 45 4f 46 20 66 6c 61 67 2e  ts the EOF flag.
1a110 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1a120 4c 49 54 45 5f 4f 4b 20 69 66 20 6e 6f 74 68 69  LITE_OK if nothi
1a130 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
1a140 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a150 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66  urned.** even if
1a160 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
1a170 2d 66 69 6c 65 2e 20 20 54 68 65 20 66 74 73 33  -file.  The fts3
1a180 45 6f 66 4d 65 74 68 6f 64 28 29 20 77 69 6c 6c  EofMethod() will
1a190 20 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 73 75   be called.** su
1a1a0 62 73 65 71 75 65 6e 74 6c 79 20 74 6f 20 64 65  bsequently to de
1a1b0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
1a1c0 6f 72 20 6e 6f 74 20 61 6e 20 45 4f 46 20 77 61  or not an EOF wa
1a1d0 73 20 68 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s hit..*/.static
1a1e0 20 69 6e 74 20 66 74 73 33 4e 65 78 74 4d 65 74   int fts3NextMet
1a1f0 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
1a200 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
1a210 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
1a220 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
1a230 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
1a240 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1a250 43 73 72 2d 3e 65 53 65 61 72 63 68 3d 3d 46 54  Csr->eSearch==FT
1a260 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20  S3_DOCID_SEARCH 
1a270 7c 7c 20 70 43 73 72 2d 3e 65 53 65 61 72 63 68  || pCsr->eSearch
1a280 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  ==FTS3_FULLSCAN_
1a290 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66  SEARCH ){.    if
1a2a0 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
1a2b0 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
1a2c0 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
1a2d0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31   pCsr->isEof = 1
1a2e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a2f0 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
1a300 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 65 6c  >pStmt);.    }el
1a310 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  se{.      pCsr->
1a320 69 50 72 65 76 49 64 20 3d 20 73 71 6c 69 74 65  iPrevId = sqlite
1a330 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1a340 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
1a350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a360 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  E_OK;.    }.  }e
1a370 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
1a380 73 33 45 76 61 6c 4e 65 78 74 28 28 46 74 73 33  s3EvalNext((Fts3
1a390 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1a3a0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
1a3b0 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70   ((Fts3Table *)p
1a3c0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
1a3d0 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29  ->pSegments==0 )
1a3e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a3f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1a400 6f 77 69 6e 67 20 61 72 65 20 63 6f 70 69 65 64  owing are copied
1a410 20 66 72 6f 6d 20 73 71 6c 69 74 65 49 6e 74 2e   from sqliteInt.
1a420 68 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  h..**.** Constan
1a430 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  ts for the large
1a440 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74 20  st and smallest 
1a450 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74 20  possible 64-bit 
1a460 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e  signed integers.
1a470 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73  .** These macros
1a480 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
1a490 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
1a4a0 6f 6e 20 62 6f 74 68 20 33 32 2d 62 69 74 20 61  on both 32-bit a
1a4b0 6e 64 20 36 34 2d 62 69 74 0a 2a 2a 20 63 6f 6d  nd 64-bit.** com
1a4c0 70 69 6c 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  pilers..*/.#ifnd
1a4d0 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
1a4e0 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  MATION.# define 
1a4f0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 20 28  LARGEST_INT64  (
1a500 30 78 66 66 66 66 66 66 66 66 7c 28 28 28 73 71  0xffffffff|(((sq
1a510 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 66  lite3_int64)0x7f
1a520 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a 23 20  ffffff)<<32)).# 
1a530 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54 5f  define SMALLEST_
1a540 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74 65 33  INT64 (((sqlite3
1a550 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c 41 52  _int64)-1) - LAR
1a560 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65 6e 64  GEST_INT64).#end
1a570 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1a580 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66   numeric type of
1a590 20 61 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 69   argument pVal i
1a5a0 73 20 22 69 6e 74 65 67 65 72 22 2c 20 74 68 65  s "integer", the
1a5b0 6e 20 72 65 74 75 72 6e 20 69 74 0a 2a 2a 20 63  n return it.** c
1a5c0 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 36 34  onverted to a 64
1a5d0 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1a5e0 67 65 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ger. Otherwise, 
1a5f0 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  return a copy of
1a600 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 70  .** the second p
1a610 61 72 61 6d 65 74 65 72 2c 20 69 44 65 66 61 75  arameter, iDefau
1a620 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  lt..*/.static sq
1a630 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 73 33  lite3_int64 fts3
1a640 44 6f 63 69 64 52 61 6e 67 65 28 73 71 6c 69 74  DocidRange(sqlit
1a650 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
1a660 69 36 34 20 69 44 65 66 61 75 6c 74 29 7b 0a 20  i64 iDefault){. 
1a670 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
1a680 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
1a690 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
1a6a0 69 63 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ic_type(pVal);. 
1a6b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
1a6c0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
1a6d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1a6e0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1a6f0 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
1a700 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 65 66 61  }.  return iDefa
1a710 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
1a720 69 73 20 69 73 20 74 68 65 20 78 46 69 6c 74 65  is is the xFilte
1a730 72 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  r interface for 
1a740 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a750 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76  e.  See.** the v
1a760 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69  irtual table xFi
1a770 6c 74 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75  lter method docu
1a780 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64  mentation for ad
1a790 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f  ditional.** info
1a7a0 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
1a7b0 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 46  f idxNum==FTS3_F
1a7c0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 74  ULLSCAN_SEARCH t
1a7d0 68 65 6e 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  hen do a full ta
1a7e0 62 6c 65 20 73 63 61 6e 20 61 67 61 69 6e 73 74  ble scan against
1a7f0 0a 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  .** the %_conten
1a800 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  t table..**.** I
1a810 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 44  f idxNum==FTS3_D
1a820 4f 43 49 44 5f 53 45 41 52 43 48 20 74 68 65 6e  OCID_SEARCH then
1a830 20 64 6f 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b   do a docid look
1a840 75 70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  up for a single 
1a850 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
1a860 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1a870 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64 78 4e 75 6d  .**.** If idxNum
1a880 3e 3d 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f  >=FTS3_FULLTEXT_
1a890 53 45 41 52 43 48 20 74 68 65 6e 20 75 73 65 20  SEARCH then use 
1a8a0 74 68 65 20 66 75 6c 6c 20 74 65 78 74 20 69 6e  the full text in
1a8b0 64 65 78 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 6c  dex.  The.** col
1a8c0 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d  umn on the left-
1a8d0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1a8e0 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
1a8f0 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d  is column.** num
1a900 62 65 72 20 69 64 78 4e 75 6d 2d 46 54 53 33 5f  ber idxNum-FTS3_
1a910 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2c  FULLTEXT_SEARCH,
1a920 20 30 20 69 6e 64 65 78 65 64 2e 20 20 61 72 67   0 indexed.  arg
1a930 76 5b 30 5d 20 69 73 20 74 68 65 20 72 69 67 68  v[0] is the righ
1a940 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f  t-hand.** side o
1a950 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
1a960 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
1a970 69 6e 74 20 66 74 73 33 46 69 6c 74 65 72 4d 65  int fts3FilterMe
1a980 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1a990 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1a9a0 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  rsor,   /* The c
1a9b0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74  ursor used for t
1a9c0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
1a9d0 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20  nt idxNum,      
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a9f0 2a 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78  * Strategy index
1aa00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1aa10 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20   *idxStr,       
1aa20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
1aa30 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1aa60 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70  f elements in ap
1aa70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Val */.  sqlite3
1aa80 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1aa90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
1aaa0 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e  ments for the in
1aab0 64 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f  dexing scheme */
1aac0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1aad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
1aae0 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ab00 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  QL statement use
1ab10 64 20 74 6f 20 61 63 63 65 73 73 20 25 5f 63 6f  d to access %_co
1ab20 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntent */.  int e
1ab30 53 65 61 72 63 68 3b 0a 20 20 46 74 73 33 54 61  Search;.  Fts3Ta
1ab40 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
1ab50 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  ble *)pCursor->p
1ab60 56 74 61 62 3b 0a 20 20 46 74 73 33 43 75 72 73  Vtab;.  Fts3Curs
1ab70 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
1ab80 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1ab90 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
1aba0 75 65 20 2a 70 43 6f 6e 73 20 3d 20 30 3b 20 20  ue *pCons = 0;  
1abb0 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 41 54 43       /* The MATC
1abc0 48 20 6f 72 20 72 6f 77 69 64 20 63 6f 6e 73 74  H or rowid const
1abd0 72 61 69 6e 74 2c 20 69 66 20 61 6e 79 20 2a 2f  raint, if any */
1abe0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1abf0 20 2a 70 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20   *pLangid = 0;  
1ac00 20 20 20 2f 2a 20 54 68 65 20 22 6c 61 6e 67 69     /* The "langi
1ac10 64 20 3d 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e  d = ?" constrain
1ac20 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 73  t, if any */.  s
1ac30 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44  qlite3_value *pD
1ac40 6f 63 69 64 47 65 20 3d 20 30 3b 20 20 20 20 2f  ocidGe = 0;    /
1ac50 2a 20 54 68 65 20 22 64 6f 63 69 64 20 3e 3d 20  * The "docid >= 
1ac60 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69  ?" constraint, i
1ac70 66 20 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74  f any */.  sqlit
1ac80 65 33 5f 76 61 6c 75 65 20 2a 70 44 6f 63 69 64  e3_value *pDocid
1ac90 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68  Le = 0;    /* Th
1aca0 65 20 22 64 6f 63 69 64 20 3c 3d 20 3f 22 20 63  e "docid <= ?" c
1acb0 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 61 6e  onstraint, if an
1acc0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  y */.  int iIdx;
1acd0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1ace0 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20  ETER(idxStr);.  
1acf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ad00 28 6e 56 61 6c 29 3b 0a 0a 20 20 65 53 65 61 72  (nVal);..  eSear
1ad10 63 68 20 3d 20 28 69 64 78 4e 75 6d 20 26 20 30  ch = (idxNum & 0
1ad20 78 30 30 30 30 46 46 46 46 29 3b 0a 20 20 61 73  x0000FFFF);.  as
1ad30 73 65 72 74 28 20 65 53 65 61 72 63 68 3e 3d 30  sert( eSearch>=0
1ad40 20 26 26 20 65 53 65 61 72 63 68 3c 3d 28 46 54   && eSearch<=(FT
1ad50 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
1ad60 43 48 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  CH+p->nColumn) )
1ad70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1ad80 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a  Segments==0 );..
1ad90 20 20 2f 2a 20 43 6f 6c 6c 65 63 74 20 61 72 67    /* Collect arg
1ada0 75 6d 65 6e 74 73 20 69 6e 74 6f 20 6c 6f 63 61  uments into loca
1adb0 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  l variables */. 
1adc0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 69 66 28   iIdx = 0;.  if(
1add0 20 65 53 65 61 72 63 68 21 3d 46 54 53 33 5f 46   eSearch!=FTS3_F
1ade0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 29  ULLSCAN_SEARCH )
1adf0 20 70 43 6f 6e 73 20 3d 20 61 70 56 61 6c 5b 69   pCons = apVal[i
1ae00 49 64 78 2b 2b 5d 3b 0a 20 20 69 66 28 20 69 64  Idx++];.  if( id
1ae10 78 4e 75 6d 20 26 20 46 54 53 33 5f 48 41 56 45  xNum & FTS3_HAVE
1ae20 5f 4c 41 4e 47 49 44 20 29 20 70 4c 61 6e 67 69  _LANGID ) pLangi
1ae30 64 20 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b  d = apVal[iIdx++
1ae40 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20  ];.  if( idxNum 
1ae50 26 20 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49  & FTS3_HAVE_DOCI
1ae60 44 5f 47 45 20 29 20 70 44 6f 63 69 64 47 65 20  D_GE ) pDocidGe 
1ae70 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b  = apVal[iIdx++];
1ae80 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20  .  if( idxNum & 
1ae90 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f  FTS3_HAVE_DOCID_
1aea0 4c 45 20 29 20 70 44 6f 63 69 64 4c 65 20 3d 20  LE ) pDocidLe = 
1aeb0 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b 0a 20  apVal[iIdx++];. 
1aec0 20 61 73 73 65 72 74 28 20 69 49 64 78 3d 3d 6e   assert( iIdx==n
1aed0 56 61 6c 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  Val );..  /* In 
1aee0 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
1aef0 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 65  has been used be
1af00 66 6f 72 65 2c 20 63 6c 65 61 72 20 69 74 20 6e  fore, clear it n
1af10 6f 77 2e 20 2a 2f 0a 20 20 66 74 73 33 43 6c 65  ow. */.  fts3Cle
1af20 61 72 43 75 72 73 6f 72 28 70 43 73 72 29 3b 0a  arCursor(pCsr);.
1af30 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 6f  .  /* Set the lo
1af40 77 65 72 20 61 6e 64 20 75 70 70 65 72 20 62 6f  wer and upper bo
1af50 75 6e 64 73 20 6f 6e 20 64 6f 63 69 64 73 20 74  unds on docids t
1af60 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 70 43  o return */.  pC
1af70 73 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 20 3d 20  sr->iMinDocid = 
1af80 66 74 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70  fts3DocidRange(p
1af90 44 6f 63 69 64 47 65 2c 20 53 4d 41 4c 4c 45 53  DocidGe, SMALLES
1afa0 54 5f 49 4e 54 36 34 29 3b 0a 20 20 70 43 73 72  T_INT64);.  pCsr
1afb0 2d 3e 69 4d 61 78 44 6f 63 69 64 20 3d 20 66 74  ->iMaxDocid = ft
1afc0 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70 44 6f  s3DocidRange(pDo
1afd0 63 69 64 4c 65 2c 20 4c 41 52 47 45 53 54 5f 49  cidLe, LARGEST_I
1afe0 4e 54 36 34 29 3b 0a 0a 20 20 69 66 28 20 69 64  NT64);..  if( id
1aff0 78 53 74 72 20 29 7b 0a 20 20 20 20 70 43 73 72  xStr ){.    pCsr
1b000 2d 3e 62 44 65 73 63 20 3d 20 28 69 64 78 53 74  ->bDesc = (idxSt
1b010 72 5b 30 5d 3d 3d 27 44 27 29 3b 0a 20 20 7d 65  r[0]=='D');.  }e
1b020 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 2d 3e 62  lse{.    pCsr->b
1b030 44 65 73 63 20 3d 20 70 2d 3e 62 44 65 73 63 49  Desc = p->bDescI
1b040 64 78 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e  dx;.  }.  pCsr->
1b050 65 53 65 61 72 63 68 20 3d 20 28 69 31 36 29 65  eSearch = (i16)e
1b060 53 65 61 72 63 68 3b 0a 0a 20 20 69 66 28 20 65  Search;..  if( e
1b070 53 65 61 72 63 68 21 3d 46 54 53 33 5f 44 4f 43  Search!=FTS3_DOC
1b080 49 44 5f 53 45 41 52 43 48 20 26 26 20 65 53 65  ID_SEARCH && eSe
1b090 61 72 63 68 21 3d 46 54 53 33 5f 46 55 4c 4c 53  arch!=FTS3_FULLS
1b0a0 43 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a 20 20  CAN_SEARCH ){.  
1b0b0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 65 53 65    int iCol = eSe
1b0c0 61 72 63 68 2d 46 54 53 33 5f 46 55 4c 4c 54 45  arch-FTS3_FULLTE
1b0d0 58 54 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 63  XT_SEARCH;.    c
1b0e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72  onst char *zQuer
1b0f0 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y = (const char 
1b100 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1b110 74 65 78 74 28 70 43 6f 6e 73 29 3b 0a 0a 20 20  text(pCons);..  
1b120 20 20 69 66 28 20 7a 51 75 65 72 79 3d 3d 30 20    if( zQuery==0 
1b130 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  && sqlite3_value
1b140 5f 74 79 70 65 28 70 43 6f 6e 73 29 21 3d 53 51  _type(pCons)!=SQ
1b150 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
1b160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b170 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20  _NOMEM;.    }.. 
1b180 20 20 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69 64     pCsr->iLangid
1b190 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c   = 0;.    if( pL
1b1a0 61 6e 67 69 64 20 29 20 70 43 73 72 2d 3e 69 4c  angid ) pCsr->iL
1b1b0 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
1b1c0 76 61 6c 75 65 5f 69 6e 74 28 70 4c 61 6e 67 69  value_int(pLangi
1b1d0 64 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  d);..    assert(
1b1e0 20 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67   p->base.zErrMsg
1b1f0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
1b200 73 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 50  sqlite3Fts3ExprP
1b210 61 72 73 65 28 70 2d 3e 70 54 6f 6b 65 6e 69 7a  arse(p->pTokeniz
1b220 65 72 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69  er, pCsr->iLangi
1b230 64 2c 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 7a  d,.        p->az
1b240 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 62 46 74 73 34  Column, p->bFts4
1b250 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20 69 43  , p->nColumn, iC
1b260 6f 6c 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  ol, zQuery, -1, 
1b270 26 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 0a 20  &pCsr->pExpr, . 
1b280 20 20 20 20 20 20 20 26 70 2d 3e 62 61 73 65 2e         &p->base.
1b290 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20  zErrMsg.    );. 
1b2a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b2b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1b2c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1b2d0 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76 61      rc = fts3Eva
1b2e0 6c 53 74 61 72 74 28 70 43 73 72 29 3b 0a 20 20  lStart(pCsr);.  
1b2f0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67    sqlite3Fts3Seg
1b300 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20  mentsClose(p);. 
1b310 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b320 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b330 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65 78  ;.    pCsr->pNex
1b340 74 49 64 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63  tId = pCsr->aDoc
1b350 6c 69 73 74 3b 0a 20 20 20 20 70 43 73 72 2d 3e  list;.    pCsr->
1b360 69 50 72 65 76 49 64 20 3d 20 30 3b 0a 20 20 7d  iPrevId = 0;.  }
1b370 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 20 61  ..  /* Compile a
1b380 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b390 74 20 66 6f 72 20 74 68 69 73 20 63 75 72 73 6f  t for this curso
1b3a0 72 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d 74 61  r. For a full-ta
1b3b0 62 6c 65 2d 73 63 61 6e 2c 20 74 68 65 0a 20 20  ble-scan, the.  
1b3c0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6c 6f 6f  ** statement loo
1b3d0 70 73 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 72  ps through all r
1b3e0 6f 77 73 20 6f 66 20 74 68 65 20 25 5f 63 6f 6e  ows of the %_con
1b3f0 74 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f 72 20  tent table. For 
1b400 61 0a 20 20 2a 2a 20 66 75 6c 6c 2d 74 65 78 74  a.  ** full-text
1b410 20 71 75 65 72 79 20 6f 72 20 64 6f 63 69 64 20   query or docid 
1b420 6c 6f 6f 6b 75 70 2c 20 74 68 65 20 73 74 61 74  lookup, the stat
1b430 65 6d 65 6e 74 20 72 65 74 72 69 65 76 65 73 20  ement retrieves 
1b440 61 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20 72 6f  a single.  ** ro
1b450 77 20 62 79 20 64 6f 63 69 64 2e 0a 20 20 2a 2f  w by docid..  */
1b460 0a 20 20 69 66 28 20 65 53 65 61 72 63 68 3d 3d  .  if( eSearch==
1b470 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45  FTS3_FULLSCAN_SE
1b480 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66 28 20  ARCH ){.    if( 
1b490 70 44 6f 63 69 64 47 65 20 7c 7c 20 70 44 6f 63  pDocidGe || pDoc
1b4a0 69 64 4c 65 20 29 7b 0a 20 20 20 20 20 20 7a 53  idLe ){.      zS
1b4b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1b4c0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
1b4d0 22 53 45 4c 45 43 54 20 25 73 20 57 48 45 52 45  "SELECT %s WHERE
1b4e0 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e 20 25   rowid BETWEEN %
1b4f0 6c 6c 64 20 41 4e 44 20 25 6c 6c 64 20 4f 52 44  lld AND %lld ORD
1b500 45 52 20 42 59 20 72 6f 77 69 64 20 25 73 22 2c  ER BY rowid %s",
1b510 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 52  .          p->zR
1b520 65 61 64 45 78 70 72 6c 69 73 74 2c 20 70 43 73  eadExprlist, pCs
1b530 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 2c 20 70 43  r->iMinDocid, pC
1b540 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 2c 0a 20  sr->iMaxDocid,. 
1b550 20 20 20 20 20 20 20 20 20 28 70 43 73 72 2d 3e           (pCsr->
1b560 62 44 65 73 63 20 3f 20 22 44 45 53 43 22 20 3a  bDesc ? "DESC" :
1b570 20 22 41 53 43 22 29 0a 20 20 20 20 20 20 29 3b   "ASC").      );
1b580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b590 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1b5a0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
1b5b0 20 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77   %s ORDER BY row
1b5c0 69 64 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20  id %s", .       
1b5d0 20 20 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c     p->zReadExprl
1b5e0 69 73 74 2c 20 28 70 43 73 72 2d 3e 62 44 65 73  ist, (pCsr->bDes
1b5f0 63 20 3f 20 22 44 45 53 43 22 20 3a 20 22 41 53  c ? "DESC" : "AS
1b600 43 22 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  C").      );.   
1b610 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20   }.    if( zSql 
1b620 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1b630 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33  lite3_prepare_v3
1b640 28 70 2d 3e 64 62 2c 7a 53 71 6c 2c 2d 31 2c 53  (p->db,zSql,-1,S
1b650 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45  QLITE_PREPARE_PE
1b660 52 53 49 53 54 45 4e 54 2c 26 70 43 73 72 2d 3e  RSISTENT,&pCsr->
1b670 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20 20 20  pStmt,0);.      
1b680 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1b690 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1b6a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b6b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1b6c0 7d 65 6c 73 65 20 69 66 28 20 65 53 65 61 72 63  }else if( eSearc
1b6d0 68 3d 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45  h==FTS3_DOCID_SE
1b6e0 41 52 43 48 20 29 7b 0a 20 20 20 20 72 63 20 3d  ARCH ){.    rc =
1b6f0 20 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 53   fts3CursorSeekS
1b700 74 6d 74 28 70 43 73 72 29 3b 0a 20 20 20 20 69  tmt(pCsr);.    i
1b710 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1b730 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
1b740 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31  e(pCsr->pStmt, 1
1b750 2c 20 70 43 6f 6e 73 29 3b 0a 20 20 20 20 7d 0a  , pCons);.    }.
1b760 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1b770 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b780 20 72 63 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66   rc;..  return f
1b790 74 73 33 4e 65 78 74 4d 65 74 68 6f 64 28 70 43  ts3NextMethod(pC
1b7a0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ursor);.}../* .*
1b7b0 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
1b7c0 6f 66 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  of method of the
1b7d0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
1b7e0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
1b7f0 73 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f  s .** routine to
1b800 20 66 69 6e 64 20 6f 75 74 20 69 66 20 69 74 20   find out if it 
1b810 68 61 73 20 72 65 61 63 68 65 64 20 74 68 65 20  has reached the 
1b820 65 6e 64 20 6f 66 20 61 20 72 65 73 75 6c 74 20  end of a result 
1b830 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1b840 6e 74 20 66 74 73 33 45 6f 66 4d 65 74 68 6f 64  nt fts3EofMethod
1b850 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
1b860 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a  rsor *pCursor){.
1b870 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1b880 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f 72  sr = (Fts3Cursor
1b890 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  *)pCursor;.  if(
1b8a0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 29 7b 0a   pCsr->isEof ){.
1b8b0 20 20 20 20 66 74 73 33 43 6c 65 61 72 43 75 72      fts3ClearCur
1b8c0 73 6f 72 28 70 43 73 72 29 3b 0a 20 20 20 20 70  sor(pCsr);.    p
1b8d0 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a  Csr->isEof = 1;.
1b8e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 73    }.  return pCs
1b8f0 72 2d 3e 69 73 45 6f 66 3b 0a 7d 0a 0a 2f 2a 20  r->isEof;.}../* 
1b900 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
1b910 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 20 54  xRowid method. T
1b920 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 63  he SQLite core c
1b930 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1b940 65 20 74 6f 0a 2a 2a 20 72 65 74 72 69 65 76 65  e to.** retrieve
1b950 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
1b960 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1b970 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
1b980 2e 20 66 74 73 33 0a 2a 2a 20 65 78 70 6f 73 65  . fts3.** expose
1b990 73 20 25 5f 63 6f 6e 74 65 6e 74 2e 64 6f 63 69  s %_content.doci
1b9a0 64 20 61 73 20 74 68 65 20 72 6f 77 69 64 20 66  d as the rowid f
1b9b0 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
1b9c0 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 77  able. The.** row
1b9d0 69 64 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  id should be wri
1b9e0 74 74 65 6e 20 74 6f 20 2a 70 52 6f 77 69 64 2e  tten to *pRowid.
1b9f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ba00 74 73 33 52 6f 77 69 64 4d 65 74 68 6f 64 28 73  ts3RowidMethod(s
1ba10 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
1ba20 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20 73 71 6c  or *pCursor, sql
1ba30 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
1ba40 64 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72  d){.  Fts3Cursor
1ba50 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43 75   *pCsr = (Fts3Cu
1ba60 72 73 6f 72 20 2a 29 20 70 43 75 72 73 6f 72 3b  rsor *) pCursor;
1ba70 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 73  .  *pRowid = pCs
1ba80 72 2d 3e 69 50 72 65 76 49 64 3b 0a 20 20 72 65  r->iPrevId;.  re
1ba90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1baa0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 69  }../* .** This i
1bab0 73 20 74 68 65 20 78 43 6f 6c 75 6d 6e 20 6d 65  s the xColumn me
1bac0 74 68 6f 64 2c 20 63 61 6c 6c 65 64 20 62 79 20  thod, called by 
1bad0 53 51 4c 69 74 65 20 74 6f 20 72 65 71 75 65 73  SQLite to reques
1bae0 74 20 61 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a  t a value from.*
1baf0 2a 20 74 68 65 20 72 6f 77 20 74 68 61 74 20 74  * the row that t
1bb00 68 65 20 73 75 70 70 6c 69 65 64 20 63 75 72 73  he supplied curs
1bb10 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1bb20 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  nts to..**.** If
1bb30 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 69 43 6f 6c 20  :.**.**   (iCol 
1bb40 3c 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 20  <  p->nColumn)  
1bb50 20 2d 3e 20 54 68 65 20 76 61 6c 75 65 20 6f 66   -> The value of
1bb60 20 74 68 65 20 69 43 6f 6c 27 74 68 20 75 73 65   the iCol'th use
1bb70 72 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 28  r column..**   (
1bb80 69 43 6f 6c 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75  iCol == p->nColu
1bb90 6d 6e 29 20 20 20 2d 3e 20 4d 61 67 69 63 20 63  mn)   -> Magic c
1bba0 6f 6c 75 6d 6e 20 77 69 74 68 20 74 68 65 20 73  olumn with the s
1bbb0 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
1bbc0 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 28 69 43 6f  table..**   (iCo
1bbd0 6c 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  l == p->nColumn+
1bbe0 31 29 20 2d 3e 20 44 6f 63 69 64 20 63 6f 6c 75  1) -> Docid colu
1bbf0 6d 6e 0a 2a 2a 20 20 20 28 69 43 6f 6c 20 3d 3d  mn.**   (iCol ==
1bc00 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 29 20 2d   p->nColumn+2) -
1bc10 3e 20 4c 61 6e 67 69 64 20 63 6f 6c 75 6d 6e 0a  > Langid column.
1bc20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1bc30 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a  s3ColumnMethod(.
1bc40 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
1bc50 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
1bc60 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
1bc70 65 74 72 69 65 76 65 20 76 61 6c 75 65 20 66 72  etrieve value fr
1bc80 6f 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  om */.  sqlite3_
1bc90 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
1bca0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1bcb0 78 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 72  xt for sqlite3_r
1bcc0 65 73 75 6c 74 5f 78 78 78 28 29 20 63 61 6c 6c  esult_xxx() call
1bcd0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1bd00 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  of column to rea
1bd10 64 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a  d value from */.
1bd20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1bd30 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1bd40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1bd50 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 43 75 72  ode */.  Fts3Cur
1bd60 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73  sor *pCsr = (Fts
1bd70 33 43 75 72 73 6f 72 20 2a 29 20 70 43 75 72 73  3Cursor *) pCurs
1bd80 6f 72 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  or;.  Fts3Table 
1bd90 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
1bda0 2a 29 70 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  *)pCursor->pVtab
1bdb0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  ;..  /* The colu
1bdc0 6d 6e 20 76 61 6c 75 65 20 73 75 70 70 6c 69 65  mn value supplie
1bdd0 64 20 62 79 20 53 51 4c 69 74 65 20 6d 75 73 74  d by SQLite must
1bde0 20 62 65 20 69 6e 20 72 61 6e 67 65 2e 20 2a 2f   be in range. */
1bdf0 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
1be00 3d 30 20 26 26 20 69 43 6f 6c 3c 3d 70 2d 3e 6e  =0 && iCol<=p->n
1be10 43 6f 6c 75 6d 6e 2b 32 20 29 3b 0a 0a 20 20 73  Column+2 );..  s
1be20 77 69 74 63 68 28 20 69 43 6f 6c 2d 70 2d 3e 6e  witch( iCol-p->n
1be30 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 63 61  Column ){.    ca
1be40 73 65 20 30 3a 0a 20 20 20 20 20 20 2f 2a 20 54  se 0:.      /* T
1be50 68 65 20 73 70 65 63 69 61 6c 20 27 74 61 62 6c  he special 'tabl
1be60 65 2d 6e 61 6d 65 27 20 63 6f 6c 75 6d 6e 20 2a  e-name' column *
1be70 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
1be80 72 65 73 75 6c 74 5f 70 6f 69 6e 74 65 72 28 70  result_pointer(p
1be90 43 74 78 2c 20 70 43 73 72 2c 20 22 66 74 73 33  Ctx, pCsr, "fts3
1bea0 63 75 72 73 6f 72 22 2c 20 30 29 3b 0a 20 20 20  cursor", 0);.   
1beb0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
1bec0 61 73 65 20 31 3a 0a 20 20 20 20 20 20 2f 2a 20  ase 1:.      /* 
1bed0 54 68 65 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e  The docid column
1bee0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1bef0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
1bf00 43 74 78 2c 20 70 43 73 72 2d 3e 69 50 72 65 76  Ctx, pCsr->iPrev
1bf10 49 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Id);.      break
1bf20 3b 0a 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  ;..    case 2:. 
1bf30 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70       if( pCsr->p
1bf40 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
1bf50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1bf60 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d  nt64(pCtx, pCsr-
1bf70 3e 69 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 20  >iLangid);.     
1bf80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bf90 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4c 61  }else if( p->zLa
1bfa0 6e 67 75 61 67 65 69 64 3d 3d 30 20 29 7b 0a 20  nguageid==0 ){. 
1bfb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
1bfc0 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20  esult_int(pCtx, 
1bfd0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
1bfe0 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
1bff0 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1c000 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->nColumn;.     
1c010 20 20 20 2f 2a 20 66 61 6c 6c 2d 74 68 72 6f 75     /* fall-throu
1c020 67 68 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 0a 20  gh */.      }.. 
1c030 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1c040 20 20 2f 2a 20 41 20 75 73 65 72 20 63 6f 6c 75    /* A user colu
1c050 6d 6e 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  mn. Or, if this 
1c060 69 73 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  is a full-table 
1c070 73 63 61 6e 2c 20 70 6f 73 73 69 62 6c 79 20 74  scan, possibly t
1c080 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 6e 67  he.      ** lang
1c090 75 61 67 65 2d 69 64 20 63 6f 6c 75 6d 6e 2e 20  uage-id column. 
1c0a0 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 2e  Seek the cursor.
1c0b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66   */.      rc = f
1c0c0 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 30 2c  ts3CursorSeek(0,
1c0d0 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66   pCsr);.      if
1c0e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c0f0 26 26 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  && sqlite3_data_
1c100 63 6f 75 6e 74 28 70 43 73 72 2d 3e 70 53 74 6d  count(pCsr->pStm
1c110 74 29 2d 31 3e 69 43 6f 6c 20 29 7b 0a 20 20 20  t)-1>iCol ){.   
1c120 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1c130 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20  ult_value(pCtx, 
1c140 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76  sqlite3_column_v
1c150 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74 6d 74  alue(pCsr->pStmt
1c160 2c 20 69 43 6f 6c 2b 31 29 29 3b 0a 20 20 20 20  , iCol+1));.    
1c170 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1c180 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1c190 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43  ((Fts3Table *)pC
1c1a0 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d  sr->base.pVtab)-
1c1b0 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1c1c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c1d0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
1c1e0 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70  ction is the imp
1c1f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1c200 68 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c 62  he xUpdate callb
1c210 61 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  ack used by .** 
1c220 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61 62  FTS3 virtual tab
1c230 6c 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f 6b  les. It is invok
1c240 65 64 20 62 79 20 53 51 4c 69 74 65 20 65 61 63  ed by SQLite eac
1c250 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
1c260 74 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65  to be.** inserte
1c270 64 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64 65  d, updated or de
1c280 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
1c290 20 69 6e 74 20 66 74 73 33 55 70 64 61 74 65 4d   int fts3UpdateM
1c2a0 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33  ethod(.  sqlite3
1c2b0 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20  _vtab *pVtab,   
1c2c0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
1c2d0 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65  ual table handle
1c2e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c310 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
1c320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1c330 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20 20  ue **apVal,     
1c340 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1c350 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1c360 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
1c370 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
1c380 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66 65  /* OUT: The affe
1c390 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74 65  cted (or effecte
1c3a0 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20  d) rowid */.){. 
1c3b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
1c3c0 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 28  ts3UpdateMethod(
1c3d0 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70 56  pVtab, nArg, apV
1c3e0 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 7d 0a 0a  al, pRowid);.}..
1c3f0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1c400 74 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29 20  tion of xSync() 
1c410 6d 65 74 68 6f 64 2e 20 46 6c 75 73 68 20 74 68  method. Flush th
1c420 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1c430 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 0a  e pending-terms.
1c440 2a 2a 20 68 61 73 68 2d 74 61 62 6c 65 20 74 6f  ** hash-table to
1c450 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1c460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1c470 33 53 79 6e 63 4d 65 74 68 6f 64 28 73 71 6c 69  3SyncMethod(sqli
1c480 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
1c490 7b 0a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  {..  /* Followin
1c4a0 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
1c4b0 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e  -merge operation
1c4c0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
1c4d0 74 68 65 20 69 6e 70 75 74 0a 20 20 2a 2a 20 73  the input.  ** s
1c4e0 65 67 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20  egments are not 
1c4f0 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 73 75  completely consu
1c500 6d 65 64 20 28 74 68 65 20 75 73 75 61 6c 20 63  med (the usual c
1c510 61 73 65 29 2c 20 74 68 65 79 20 61 72 65 20 75  ase), they are u
1c520 70 64 61 74 65 64 0a 20 20 2a 2a 20 69 6e 20 70  pdated.  ** in p
1c530 6c 61 63 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  lace to remove t
1c540 68 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  he entries that 
1c550 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1c560 6e 20 6d 65 72 67 65 64 2e 20 54 68 69 73 0a 20  n merged. This. 
1c570 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 75 70 64   ** involves upd
1c580 61 74 69 6e 67 20 74 68 65 20 6c 65 61 66 20 62  ating the leaf b
1c590 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 74 61 69  lock that contai
1c5a0 6e 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ns the smallest 
1c5b0 75 6e 6d 65 72 67 65 64 0a 20 20 2a 2a 20 65 6e  unmerged.  ** en
1c5c0 74 72 79 20 61 6e 64 20 65 61 63 68 20 62 6c 6f  try and each blo
1c5d0 63 6b 20 28 69 66 20 61 6e 79 29 20 62 65 74 77  ck (if any) betw
1c5e0 65 65 6e 20 74 68 65 20 6c 65 61 66 20 61 6e 64  een the leaf and
1c5f0 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20   the root node. 
1c600 53 6f 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 68  So.  ** if the h
1c610 65 69 67 68 74 20 6f 66 20 74 68 65 20 69 6e 70  eight of the inp
1c620 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
1c630 65 73 20 69 73 20 4e 2c 20 61 6e 64 20 69 6e 70  es is N, and inp
1c640 75 74 20 73 65 67 6d 65 6e 74 73 0a 20 20 2a 2a  ut segments.  **
1c650 20 61 72 65 20 6d 65 72 67 65 64 20 65 69 67 68   are merged eigh
1c660 74 20 61 74 20 61 20 74 69 6d 65 2c 20 75 70 64  t at a time, upd
1c670 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ating the input 
1c680 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65 20  segments at the 
1c690 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 61 6e 20 69  end.  ** of an i
1c6a0 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
1c6b0 20 72 65 71 75 69 72 65 73 20 77 72 69 74 69 6e   requires writin
1c6c0 67 20 28 38 2a 28 31 2b 4e 29 29 20 62 6c 6f 63  g (8*(1+N)) bloc
1c6d0 6b 73 2e 20 4e 20 69 73 20 75 73 75 61 6c 6c 79  ks. N is usually
1c6e0 0a 20 20 2a 2a 20 73 6d 61 6c 6c 20 2d 20 6f 66  .  ** small - of
1c6f0 74 65 6e 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ten between 0 an
1c700 64 20 32 2e 20 53 6f 20 74 68 65 20 6f 76 65 72  d 2. So the over
1c710 68 65 61 64 20 6f 66 20 74 68 65 20 69 6e 63 72  head of the incr
1c720 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 6d 65 72  emental.  ** mer
1c730 67 65 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  ge is somewhere 
1c740 62 65 74 77 65 65 6e 20 38 20 61 6e 64 20 32 34  between 8 and 24
1c750 20 62 6c 6f 63 6b 73 2e 20 54 6f 20 61 76 6f 69   blocks. To avoi
1c760 64 20 74 68 69 73 20 6f 76 65 72 68 65 61 64 0a  d this overhead.
1c770 20 20 2a 2a 20 64 77 61 72 66 69 6e 67 20 74 68    ** dwarfing th
1c780 65 20 61 63 74 75 61 6c 20 70 72 6f 64 75 63 74  e actual product
1c790 69 76 65 20 77 6f 72 6b 20 61 63 63 6f 6d 70 6c  ive work accompl
1c7a0 69 73 68 65 64 2c 20 74 68 65 20 69 6e 63 72 65  ished, the incre
1c7b0 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a 20 20 2a  mental merge.  *
1c7c0 2a 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  * is only attemp
1c7d0 74 65 64 20 69 66 20 69 74 20 77 69 6c 6c 20 77  ted if it will w
1c7e0 72 69 74 65 20 61 74 20 6c 65 61 73 74 20 36 34  rite at least 64
1c7f0 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 20 48 65   leaf blocks. He
1c800 6e 63 65 0a 20 20 2a 2a 20 6e 4d 69 6e 4d 65 72  nce.  ** nMinMer
1c810 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  ge..  **.  ** Of
1c820 20 63 6f 75 72 73 65 2c 20 75 70 64 61 74 69 6e   course, updatin
1c830 67 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  g the input segm
1c840 65 6e 74 73 20 61 6c 73 6f 20 69 6e 76 6f 6c 76  ents also involv
1c850 65 73 20 64 65 6c 65 74 69 6e 67 20 61 20 62 75  es deleting a bu
1c860 6e 63 68 0a 20 20 2a 2a 20 6f 66 20 62 6c 6f 63  nch.  ** of bloc
1c870 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ks from the segm
1c880 65 6e 74 73 20 74 61 62 6c 65 2e 20 42 75 74 20  ents table. But 
1c890 74 68 69 73 20 69 73 20 6e 6f 74 20 63 6f 6e 73  this is not cons
1c8a0 69 64 65 72 65 64 20 6f 76 65 72 68 65 61 64 0a  idered overhead.
1c8b0 20 20 2a 2a 20 61 73 20 69 74 20 77 6f 75 6c 64    ** as it would
1c8c0 20 61 6c 73 6f 20 62 65 20 72 65 71 75 69 72 65   also be require
1c8d0 64 20 62 79 20 61 20 63 72 69 73 69 73 2d 6d 65  d by a crisis-me
1c8e0 72 67 65 20 74 68 61 74 20 75 73 65 64 20 74 68  rge that used th
1c8f0 65 20 73 61 6d 65 20 69 6e 70 75 74 20 0a 20 20  e same input .  
1c900 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 20 20 2a  ** segments..  *
1c910 2f 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6e 4d  /.  const u32 nM
1c920 69 6e 4d 65 72 67 65 20 3d 20 36 34 3b 20 20 20  inMerge = 64;   
1c930 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61      /* Minimum a
1c940 6d 6f 75 6e 74 20 6f 66 20 69 6e 63 72 2d 6d 65  mount of incr-me
1c950 72 67 65 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a  rge work to do *
1c960 2f 0a 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  /..  Fts3Table *
1c970 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a 29  p = (Fts3Table*)
1c980 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pVtab;.  int rc;
1c990 0a 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69  .  i64 iLastRowi
1c9a0 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d = sqlite3_last
1c9b0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 70 2d  _insert_rowid(p-
1c9c0 3e 64 62 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  >db);..  rc = sq
1c9d0 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1c9e0 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
1c9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca00 4f 4b 20 0a 20 20 20 26 26 20 70 2d 3e 6e 4c 65  OK .   && p->nLe
1ca10 61 66 41 64 64 3e 28 6e 4d 69 6e 4d 65 72 67 65  afAdd>(nMinMerge
1ca20 2f 31 36 29 20 0a 20 20 20 26 26 20 70 2d 3e 6e  /16) .   && p->n
1ca30 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 26 26  Autoincrmerge &&
1ca40 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72   p->nAutoincrmer
1ca50 67 65 21 3d 30 78 66 66 0a 20 20 29 7b 0a 20 20  ge!=0xff.  ){.  
1ca60 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20    int mxLevel = 
1ca70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ca80 2f 2a 20 4d 61 78 69 6d 75 6d 20 72 65 6c 61 74  /* Maximum relat
1ca90 69 76 65 20 6c 65 76 65 6c 20 76 61 6c 75 65 20  ive level value 
1caa0 69 6e 20 64 62 20 2a 2f 0a 20 20 20 20 69 6e 74  in db */.    int
1cab0 20 41 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   A;             
1cac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1cad0 63 72 2d 6d 65 72 67 65 20 70 61 72 61 6d 65 74  cr-merge paramet
1cae0 65 72 20 41 20 2a 2f 0a 0a 20 20 20 20 72 63 20  er A */..    rc 
1caf0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 78  = sqlite3Fts3Max
1cb00 4c 65 76 65 6c 28 70 2c 20 26 6d 78 4c 65 76 65  Level(p, &mxLeve
1cb10 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
1cb20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1cb30 20 6d 78 4c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20   mxLevel==0 );. 
1cb40 20 20 20 41 20 3d 20 70 2d 3e 6e 4c 65 61 66 41     A = p->nLeafA
1cb50 64 64 20 2a 20 6d 78 4c 65 76 65 6c 3b 0a 20 20  dd * mxLevel;.  
1cb60 20 20 41 20 2b 3d 20 28 41 2f 32 29 3b 0a 20 20    A += (A/2);.  
1cb70 20 20 69 66 28 20 41 3e 28 69 6e 74 29 6e 4d 69    if( A>(int)nMi
1cb80 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 73 71  nMerge ) rc = sq
1cb90 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72  lite3Fts3Incrmer
1cba0 67 65 28 70 2c 20 41 2c 20 70 2d 3e 6e 41 75 74  ge(p, A, p->nAut
1cbb0 6f 69 6e 63 72 6d 65 72 67 65 29 3b 0a 20 20 7d  oincrmerge);.  }
1cbc0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65  .  sqlite3Fts3Se
1cbd0 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a  gmentsClose(p);.
1cbe0 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61    sqlite3_set_la
1cbf0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
1cc00 70 2d 3e 64 62 2c 20 69 4c 61 73 74 52 6f 77 69  p->db, iLastRowi
1cc10 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
1cc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  .}../*.** If it 
1cc30 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6b  is currently unk
1cc40 6e 6f 77 6e 20 77 68 65 74 68 65 72 20 6f 72 20  nown whether or 
1cc50 6e 6f 74 20 74 68 65 20 46 54 53 20 74 61 62 6c  not the FTS tabl
1cc60 65 20 68 61 73 20 61 6e 20 25 5f 73 74 61 74 0a  e has an %_stat.
1cc70 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 70 2d 3e  ** table (if p->
1cc80 62 48 61 73 53 74 61 74 3d 3d 32 29 2c 20 61 74  bHasStat==2), at
1cc90 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
1cca0 6e 65 20 74 68 69 73 20 28 73 65 74 20 70 2d 3e  ne this (set p->
1ccb0 62 48 61 73 53 74 61 74 0a 2a 2a 20 74 6f 20 30  bHasStat.** to 0
1ccc0 20 6f 72 20 31 29 2e 20 52 65 74 75 72 6e 20 53   or 1). Return S
1ccd0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
1cce0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
1ccf0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
1cd00 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** if an error o
1cd10 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
1cd20 20 69 6e 74 20 66 74 73 33 53 65 74 48 61 73 53   int fts3SetHasS
1cd30 74 61 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70  tat(Fts3Table *p
1cd40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1cd50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1cd60 2d 3e 62 48 61 73 53 74 61 74 3d 3d 32 20 29 7b  ->bHasStat==2 ){
1cd70 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 62 6c 20  .    char *zTbl 
1cd80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1cd90 66 28 22 25 73 5f 73 74 61 74 22 2c 20 70 2d 3e  f("%s_stat", p->
1cda0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  zName);.    if( 
1cdb0 7a 54 62 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  zTbl ){.      in
1cdc0 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f  t res = sqlite3_
1cdd0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1cde0 61 64 61 74 61 28 70 2d 3e 64 62 2c 20 70 2d 3e  adata(p->db, p->
1cdf0 7a 44 62 2c 20 7a 54 62 6c 2c 20 30 2c 30 2c 30  zDb, zTbl, 0,0,0
1ce00 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 73  ,0,0,0);.      s
1ce10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 62 6c  qlite3_free(zTbl
1ce20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 48 61 73  );.      p->bHas
1ce30 53 74 61 74 20 3d 20 28 72 65 73 3d 3d 53 51 4c  Stat = (res==SQL
1ce40 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 7d 65 6c  ITE_OK);.    }el
1ce50 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1ce60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ce70 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ce80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1ce90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1cea0 42 65 67 69 6e 28 29 20 6d 65 74 68 6f 64 2e 20  Begin() method. 
1ceb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1cec0 74 73 33 42 65 67 69 6e 4d 65 74 68 6f 64 28 73  ts3BeginMethod(s
1ced0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1cee0 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  ab){.  Fts3Table
1cef0 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
1cf00 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53 45  *)pVtab;.  UNUSE
1cf10 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61  D_PARAMETER(pVta
1cf20 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  b);.  assert( p-
1cf30 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1cf40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50  .  assert( p->nP
1cf50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
1cf60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1cf70 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 31 20 29  Transaction!=1 )
1cf80 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1cf90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1cfa0 20 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   1 );.  TESTONLY
1cfb0 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74  ( p->mxSavepoint
1cfc0 20 3d 20 2d 31 3b 20 29 3b 0a 20 20 70 2d 3e 6e   = -1; );.  p->n
1cfd0 4c 65 61 66 41 64 64 20 3d 20 30 3b 0a 20 20 72  LeafAdd = 0;.  r
1cfe0 65 74 75 72 6e 20 66 74 73 33 53 65 74 48 61 73  eturn fts3SetHas
1cff0 53 74 61 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat(p);.}../*.*
1d000 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1d010 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29 20 6d 65   of xCommit() me
1d020 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20 61 20  thod. This is a 
1d030 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f 6e 74 65  no-op. The conte
1d040 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 65  nts of.** the pe
1d050 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
1d060 2d 74 61 62 6c 65 20 68 61 76 65 20 61 6c 72 65  -table have alre
1d070 61 64 79 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ady been flushed
1d080 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1d090 73 65 0a 2a 2a 20 62 79 20 66 74 73 33 53 79 6e  se.** by fts3Syn
1d0a0 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a 73 74  cMethod()..*/.st
1d0b0 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6d  atic int fts3Com
1d0c0 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  mitMethod(sqlite
1d0d0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
1d0e0 20 20 54 45 53 54 4f 4e 4c 59 28 20 46 74 73 33    TESTONLY( Fts3
1d0f0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1d100 54 61 62 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a  Table*)pVtab );.
1d110 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1d120 45 52 28 70 56 74 61 62 29 3b 0a 20 20 61 73 73  ER(pVtab);.  ass
1d130 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  ert( p->nPending
1d140 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Data==0 );.  ass
1d150 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  ert( p->inTransa
1d160 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73  ction!=0 );.  as
1d170 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d 65 6e  sert( p->pSegmen
1d180 74 73 3d 3d 30 20 29 3b 0a 20 20 54 45 53 54 4f  ts==0 );.  TESTO
1d190 4e 4c 59 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  NLY( p->inTransa
1d1a0 63 74 69 6f 6e 20 3d 20 30 20 29 3b 0a 20 20 54  ction = 0 );.  T
1d1b0 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d 78 53 61  ESTONLY( p->mxSa
1d1c0 76 65 70 6f 69 6e 74 20 3d 20 2d 31 3b 20 29 3b  vepoint = -1; );
1d1d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d1e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
1d1f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1d200 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73  xRollback(). Dis
1d210 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1d220 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
1d230 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74  -terms.** hash-t
1d240 61 62 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65  able. Any change
1d250 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
1d260 74 61 62 61 73 65 20 61 72 65 20 72 65 76 65 72  tabase are rever
1d270 74 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a  ted by SQLite..*
1d280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1d290 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28  3RollbackMethod(
1d2a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1d2b0 74 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  tab){.  Fts3Tabl
1d2c0 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
1d2d0 65 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  e*)pVtab;.  sqli
1d2e0 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
1d2f0 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 61  rmsClear(p);.  a
1d300 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1d310 73 61 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  saction!=0 );.  
1d320 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 69 6e 54  TESTONLY( p->inT
1d330 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 20 29  ransaction = 0 )
1d340 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1d350 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 2d  >mxSavepoint = -
1d360 31 3b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  1; );.  return S
1d370 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d380 2a 2a 20 57 68 65 6e 20 63 61 6c 6c 65 64 2c 20  ** When called, 
1d390 2a 70 70 50 6f 73 6c 69 73 74 20 6d 75 73 74 20  *ppPoslist must 
1d3a0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74  point to the byt
1d3b0 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
1d3c0 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
1d3d0 6e 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e  nd of a position
1d3e0 2d 6c 69 73 74 2e 20 69 2e 65 2e 20 28 20 28 2a  -list. i.e. ( (*
1d3f0 70 70 50 6f 73 6c 69 73 74 29 5b 2d 31 5d 3d 3d  ppPoslist)[-1]==
1d400 50 4f 53 5f 45 4e 44 20 29 2e 20 54 68 69 73 20  POS_END ). This 
1d410 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 6f 76 65  function.** move
1d420 73 20 2a 70 70 50 6f 73 6c 69 73 74 20 73 6f 20  s *ppPoslist so 
1d430 74 68 61 74 20 69 74 20 69 6e 73 74 65 61 64 20  that it instead 
1d440 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
1d450 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 0a  rst byte of the.
1d460 2a 2a 20 73 61 6d 65 20 70 6f 73 69 74 69 6f 6e  ** same position
1d470 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1d480 20 76 6f 69 64 20 66 74 73 33 52 65 76 65 72 73   void fts3Revers
1d490 65 50 6f 73 6c 69 73 74 28 63 68 61 72 20 2a 70  ePoslist(char *p
1d4a0 53 74 61 72 74 2c 20 63 68 61 72 20 2a 2a 70 70  Start, char **pp
1d4b0 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72  Poslist){.  char
1d4c0 20 2a 70 20 3d 20 26 28 2a 70 70 50 6f 73 6c 69   *p = &(*ppPosli
1d4d0 73 74 29 5b 2d 32 5d 3b 0a 20 20 63 68 61 72 20  st)[-2];.  char 
1d4e0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 6b 69  c = 0;..  /* Ski
1d4f0 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 73  p backwards pass
1d500 65 64 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ed any trailing 
1d510 30 78 30 30 20 62 79 74 65 73 20 61 64 64 65 64  0x00 bytes added
1d520 20 62 79 20 4e 65 61 72 54 72 69 6d 28 29 20 2a   by NearTrim() *
1d530 2f 0a 20 20 77 68 69 6c 65 28 20 70 3e 70 53 74  /.  while( p>pSt
1d540 61 72 74 20 26 26 20 28 63 3d 2a 70 2d 2d 29 3d  art && (c=*p--)=
1d550 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  =0 );..  /* Sear
1d560 63 68 20 62 61 63 6b 77 61 72 64 73 20 66 6f 72  ch backwards for
1d570 20 61 20 76 61 72 69 6e 74 20 77 69 74 68 20 76   a varint with v
1d580 61 6c 75 65 20 7a 65 72 6f 20 28 74 68 65 20 65  alue zero (the e
1d590 6e 64 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  nd of the previo
1d5a0 75 73 20 0a 20 20 2a 2a 20 70 6f 73 6c 69 73 74  us .  ** poslist
1d5b0 29 2e 20 54 68 69 73 20 69 73 20 61 6e 20 30 78  ). This is an 0x
1d5c0 30 30 20 62 79 74 65 20 70 72 65 63 65 64 65 64  00 byte preceded
1d5d0 20 62 79 20 73 6f 6d 65 20 62 79 74 65 20 74 68   by some byte th
1d5e0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1d5f0 20 68 61 76 65 20 74 68 65 20 30 78 38 30 20 62   have the 0x80 b
1d600 69 74 20 73 65 74 2e 20 20 2a 2f 0a 20 20 77 68  it set.  */.  wh
1d610 69 6c 65 28 20 70 3e 70 53 74 61 72 74 20 26 26  ile( p>pStart &&
1d620 20 28 2a 70 20 26 20 30 78 38 30 29 20 7c 20 63   (*p & 0x80) | c
1d630 20 29 7b 20 0a 20 20 20 20 63 20 3d 20 2a 70 2d   ){ .    c = *p-
1d640 2d 3b 20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  -; .  }.  assert
1d650 28 20 70 3d 3d 70 53 74 61 72 74 20 7c 7c 20 63  ( p==pStart || c
1d660 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20  ==0 );..  /* At 
1d670 74 68 69 73 20 70 6f 69 6e 74 20 70 20 70 6f 69  this point p poi
1d680 6e 74 73 20 74 6f 20 74 68 61 74 20 70 72 65 63  nts to that prec
1d690 65 64 69 6e 67 20 62 79 74 65 20 77 69 74 68 6f  eding byte witho
1d6a0 75 74 20 74 68 65 20 30 78 38 30 20 62 69 74 0a  ut the 0x80 bit.
1d6b0 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 6f 20    ** set. So to 
1d6c0 66 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f  find the start o
1d6d0 66 20 74 68 65 20 70 6f 73 6c 69 73 74 2c 20 73  f the poslist, s
1d6e0 6b 69 70 20 66 6f 72 77 61 72 64 20 32 20 62 79  kip forward 2 by
1d6f0 74 65 73 20 74 68 65 6e 0a 20 20 2a 2a 20 6f 76  tes then.  ** ov
1d700 65 72 20 61 20 76 61 72 69 6e 74 2e 20 0a 20 20  er a varint. .  
1d710 2a 2a 0a 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  **.  ** Normally
1d720 2e 20 54 68 65 20 6f 74 68 65 72 20 63 61 73 65  . The other case
1d730 20 69 73 20 74 68 61 74 20 70 3d 3d 70 53 74 61   is that p==pSta
1d740 72 74 20 61 6e 64 20 74 68 65 20 70 6f 73 6c 69  rt and the posli
1d750 73 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  st to return.  *
1d760 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  * is the first i
1d770 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 49  n the doclist. I
1d780 6e 20 74 68 69 73 20 63 61 73 65 20 64 6f 20 6e  n this case do n
1d790 6f 74 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20  ot skip forward 
1d7a0 32 20 62 79 74 65 73 2e 0a 20 20 2a 2a 20 54 68  2 bytes..  ** Th
1d7b0 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  e second part of
1d7c0 20 74 68 65 20 69 66 20 63 6f 6e 64 69 74 69 6f   the if conditio
1d7d0 6e 20 28 63 3d 3d 30 20 26 26 20 2a 70 70 50 6f  n (c==0 && *ppPo
1d7e0 73 6c 69 73 74 3e 26 70 5b 32 5d 29 0a 20 20 2a  slist>&p[2]).  *
1d7f0 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  * is required fo
1d800 72 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  r cases where th
1d810 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
1d820 61 20 64 6f 63 6c 69 73 74 20 61 6e 64 20 74 68  a doclist and th
1d830 65 0a 20 20 2a 2a 20 64 6f 63 6c 69 73 74 20 69  e.  ** doclist i
1d840 73 20 65 6d 70 74 79 2e 20 46 6f 72 20 65 78 61  s empty. For exa
1d850 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 66 69 72  mple, if the fir
1d860 73 74 20 64 6f 63 69 64 20 69 73 20 31 30 2c 20  st docid is 10, 
1d870 61 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 74  a doclist.  ** t
1d880 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 3a  hat begins with:
1d890 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 30 78 30  .  **.  **   0x0
1d8a0 41 20 30 78 30 30 20 3c 6e 65 78 74 20 64 6f 63  A 0x00 <next doc
1d8b0 69 64 20 64 65 6c 74 61 20 76 61 72 69 6e 74 3e  id delta varint>
1d8c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3e 70 53  .  */.  if( p>pS
1d8d0 74 61 72 74 20 7c 7c 20 28 63 3d 3d 30 20 26 26  tart || (c==0 &&
1d8e0 20 2a 70 70 50 6f 73 6c 69 73 74 3e 26 70 5b 32   *ppPoslist>&p[2
1d8f0 5d 29 20 29 7b 20 70 20 3d 20 26 70 5b 32 5d 3b  ]) ){ p = &p[2];
1d900 20 7d 0a 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b   }.  while( *p++
1d910 26 30 78 38 30 20 29 3b 0a 20 20 2a 70 70 50 6f  &0x80 );.  *ppPo
1d920 73 6c 69 73 74 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  slist = p;.}../*
1d930 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
1d940 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
1d950 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1d960 66 20 74 68 65 20 6f 76 65 72 6c 6f 61 64 65 64  f the overloaded
1d970 20 73 6e 69 70 70 65 74 28 29 2c 0a 2a 2a 20 6f   snippet(),.** o
1d980 66 66 73 65 74 73 28 29 20 61 6e 64 20 6f 70 74  ffsets() and opt
1d990 69 6d 69 7a 65 28 29 20 53 51 4c 20 66 75 6e 63  imize() SQL func
1d9a0 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tions..**.** If 
1d9b0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
1d9c0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
1d9d0 67 75 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 62  gument is a blob
1d9e0 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 73 69 7a 65   of size.** size
1d9f0 6f 66 28 46 74 73 33 43 75 72 73 6f 72 2a 29 2c  of(Fts3Cursor*),
1da00 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 62 20 63   then the blob c
1da10 6f 6e 74 65 6e 74 73 20 61 72 65 20 63 6f 70 69  ontents are copi
1da20 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6f 75  ed to the .** ou
1da30 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
1da40 70 43 73 72 20 61 6e 64 20 53 51 4c 49 54 45 5f  pCsr and SQLITE_
1da50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1da60 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1da70 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
1da80 73 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f 6e  s written to con
1da90 74 65 78 74 20 70 43 6f 6e 74 65 78 74 20 61 6e  text pContext an
1daa0 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72  d SQLITE_ERROR r
1dab0 65 74 75 72 6e 65 64 2e 20 54 68 65 0a 2a 2a 20  eturned. The.** 
1dac0 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 76 69  string passed vi
1dad0 61 20 7a 46 75 6e 63 20 69 73 20 75 73 65 64 20  a zFunc is used 
1dae0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 65  as part of the e
1daf0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
1db00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1db10 46 75 6e 63 74 69 6f 6e 41 72 67 28 0a 20 20 73  FunctionArg(.  s
1db20 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1db30 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f  pContext,      /
1db40 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  * SQL function c
1db50 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
1db60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
1db70 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1db80 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61 6d   /* Function nam
1db90 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
1dba0 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20  alue *pVal,     
1dbb0 20 20 20 20 20 20 20 2f 2a 20 61 72 67 76 5b 30         /* argv[0
1dbc0 5d 20 70 61 73 73 65 64 20 74 6f 20 66 75 6e 63  ] passed to func
1dbd0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 43 75  tion */.  Fts3Cu
1dbe0 72 73 6f 72 20 2a 2a 70 70 43 73 72 20 20 20 20  rsor **ppCsr    
1dbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1dc00 3a 20 53 74 6f 72 65 20 63 75 72 73 6f 72 20 68  : Store cursor h
1dc10 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 29 7b  andle here */.){
1dc20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 2a 70 70  .  int rc;.  *pp
1dc30 43 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f  Csr = (Fts3Curso
1dc40 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1dc50 5f 70 6f 69 6e 74 65 72 28 70 56 61 6c 2c 20 22  _pointer(pVal, "
1dc60 66 74 73 33 63 75 72 73 6f 72 22 29 3b 0a 20 20  fts3cursor");.  
1dc70 69 66 28 20 28 2a 70 70 43 73 72 29 21 3d 30 20  if( (*ppCsr)!=0 
1dc80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1dc90 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1dca0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
1dcb0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1dcc0 28 22 69 6c 6c 65 67 61 6c 20 66 69 72 73 74 20  ("illegal first 
1dcd0 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c  argument to %s",
1dce0 20 7a 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c   zFunc);.    sql
1dcf0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1dd00 72 28 70 43 6f 6e 74 65 78 74 2c 20 7a 45 72 72  r(pContext, zErr
1dd10 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
1dd20 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
1dd30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1dd40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1dd50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1dd60 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1dd70 66 20 74 68 65 20 73 6e 69 70 70 65 74 28 29 20  f the snippet() 
1dd80 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54 53  function for FTS
1dd90 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  3.*/.static void
1dda0 20 66 74 73 33 53 6e 69 70 70 65 74 46 75 6e 63   fts3SnippetFunc
1ddb0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1ddc0 65 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20  ext *pContext,  
1ddd0 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 75      /* SQLite fu
1dde0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
1ddf0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ext */.  int nVa
1de00 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1de10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1de20 20 6f 66 20 61 70 56 61 6c 5b 5d 20 61 72 72 61   of apVal[] arra
1de30 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  y */.  sqlite3_v
1de40 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
1de50 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1de60 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1de70 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  ){.  Fts3Cursor 
1de80 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
1de90 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68       /* Cursor h
1dea0 61 6e 64 6c 65 20 70 61 73 73 65 64 20 74 68 72  andle passed thr
1deb0 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f  ough apVal[0] */
1dec0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ded0 53 74 61 72 74 20 3d 20 22 3c 62 3e 22 3b 0a 20  Start = "<b>";. 
1dee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
1def0 64 20 3d 20 22 3c 2f 62 3e 22 3b 0a 20 20 63 6f  d = "</b>";.  co
1df00 6e 73 74 20 63 68 61 72 20 2a 7a 45 6c 6c 69 70  nst char *zEllip
1df10 73 69 73 20 3d 20 22 3c 62 3e 2e 2e 2e 3c 2f 62  sis = "<b>...</b
1df20 3e 22 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d  >";.  int iCol =
1df30 20 2d 31 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65   -1;.  int nToke
1df40 6e 20 3d 20 31 35 3b 20 20 20 20 20 20 20 20 20  n = 15;         
1df50 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
1df60 74 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  t number of toke
1df70 6e 73 20 69 6e 20 73 6e 69 70 70 65 74 20 2a 2f  ns in snippet */
1df80 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73  ..  /* There mus
1df90 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
1dfa0 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  e argument passe
1dfb0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1dfc0 6f 6e 20 28 6f 74 68 65 72 77 69 73 65 0a 20 20  on (otherwise.  
1dfd0 2a 2a 20 74 68 65 20 6e 6f 6e 2d 6f 76 65 72 6c  ** the non-overl
1dfe0 6f 61 64 65 64 20 76 65 72 73 69 6f 6e 20 77 6f  oaded version wo
1dff0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 63 61  uld have been ca
1e000 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  lled instead of 
1e010 74 68 69 73 20 6f 6e 65 29 2e 0a 20 20 2a 2f 0a  this one)..  */.
1e020 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3e 3d    assert( nVal>=
1e030 31 20 29 3b 0a 0a 20 20 69 66 28 20 6e 56 61 6c  1 );..  if( nVal
1e040 3e 36 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >6 ){.    sqlite
1e050 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
1e060 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
1e070 20 20 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20    "wrong number 
1e080 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
1e090 66 75 6e 63 74 69 6f 6e 20 73 6e 69 70 70 65 74  function snippet
1e0a0 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ()", -1);.    re
1e0b0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
1e0c0 66 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28  fts3FunctionArg(
1e0d0 70 43 6f 6e 74 65 78 74 2c 20 22 73 6e 69 70 70  pContext, "snipp
1e0e0 65 74 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26  et", apVal[0], &
1e0f0 70 43 73 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  pCsr) ) return;.
1e100 0a 20 20 73 77 69 74 63 68 28 20 6e 56 61 6c 20  .  switch( nVal 
1e110 29 7b 0a 20 20 20 20 63 61 73 65 20 36 3a 20 6e  ){.    case 6: n
1e120 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f  Token = sqlite3_
1e130 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1e140 35 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 35 3a  5]);.    case 5:
1e150 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iCol = sqlite3_
1e160 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
1e170 34 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  4]);.    case 4:
1e180 20 7a 45 6c 6c 69 70 73 69 73 20 3d 20 28 63 6f   zEllipsis = (co
1e190 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
1e1a0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
1e1b0 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 63 61 73 65  al[3]);.    case
1e1c0 20 33 3a 20 7a 45 6e 64 20 3d 20 28 63 6f 6e 73   3: zEnd = (cons
1e1d0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e1e0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e1f0 5b 32 5d 29 3b 0a 20 20 20 20 63 61 73 65 20 32  [2]);.    case 2
1e200 3a 20 7a 53 74 61 72 74 20 3d 20 28 63 6f 6e 73  : zStart = (cons
1e210 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e220 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
1e230 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [1]);.  }.  if( 
1e240 21 7a 45 6c 6c 69 70 73 69 73 20 7c 7c 20 21 7a  !zEllipsis || !z
1e250 45 6e 64 20 7c 7c 20 21 7a 53 74 61 72 74 20 29  End || !zStart )
1e260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e270 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
1e280 28 70 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  (pContext);.  }e
1e290 6c 73 65 20 69 66 28 20 6e 54 6f 6b 65 6e 3d 3d  lse if( nToken==
1e2a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1e2b0 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f  _result_text(pCo
1e2c0 6e 74 65 78 74 2c 20 22 22 2c 20 2d 31 2c 20 53  ntext, "", -1, S
1e2d0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1e2e0 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
1e2f0 45 5f 4f 4b 3d 3d 66 74 73 33 43 75 72 73 6f 72  E_OK==fts3Cursor
1e300 53 65 65 6b 28 70 43 6f 6e 74 65 78 74 2c 20 70  Seek(pContext, p
1e310 43 73 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Csr) ){.    sqli
1e320 74 65 33 46 74 73 33 53 6e 69 70 70 65 74 28 70  te3Fts3Snippet(p
1e330 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a  Context, pCsr, z
1e340 53 74 61 72 74 2c 20 7a 45 6e 64 2c 20 7a 45 6c  Start, zEnd, zEl
1e350 6c 69 70 73 69 73 2c 20 69 43 6f 6c 2c 20 6e 54  lipsis, iCol, nT
1e360 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  oken);.  }.}../*
1e370 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1e380 6f 6e 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  on of the offset
1e390 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  s() function for
1e3a0 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20   FTS3.*/.static 
1e3b0 76 6f 69 64 20 66 74 73 33 4f 66 66 73 65 74 73  void fts3Offsets
1e3c0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e3d0 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
1e3e0 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
1e3f0 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1e400 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e410 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e430 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
1e440 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
1e450 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1e460 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1e470 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
1e480 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75  s */.){.  Fts3Cu
1e490 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
1e4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1e4b0 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65  sor handle passe
1e4c0 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b  d through apVal[
1e4d0 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  0] */..  UNUSED_
1e4e0 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b  PARAMETER(nVal);
1e4f0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
1e500 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 66 74 73  ==1 );.  if( fts
1e510 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f  3FunctionArg(pCo
1e520 6e 74 65 78 74 2c 20 22 6f 66 66 73 65 74 73 22  ntext, "offsets"
1e530 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73  , apVal[0], &pCs
1e540 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  r) ) return;.  a
1e550 73 73 65 72 74 28 20 70 43 73 72 20 29 3b 0a 20  ssert( pCsr );. 
1e560 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1e570 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 70  fts3CursorSeek(p
1e580 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29 20 29  Context, pCsr) )
1e590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1e5a0 33 4f 66 66 73 65 74 73 28 70 43 6f 6e 74 65 78  3Offsets(pContex
1e5b0 74 2c 20 70 43 73 72 29 3b 0a 20 20 7d 0a 7d 0a  t, pCsr);.  }.}.
1e5c0 0a 2f 2a 20 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ./* .** Implemen
1e5d0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  tation of the sp
1e5e0 65 63 69 61 6c 20 6f 70 74 69 6d 69 7a 65 28 29  ecial optimize()
1e5f0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54   function for FT
1e600 53 33 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  S3. This .** fun
1e610 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 61 6c 6c  ction merges all
1e620 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
1e630 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 73   database to a s
1e640 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  ingle segment..*
1e650 2a 20 45 78 61 6d 70 6c 65 20 75 73 61 67 65 20  * Example usage 
1e660 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  is:.**.**   SELE
1e670 43 54 20 6f 70 74 69 6d 69 7a 65 28 74 29 20 46  CT optimize(t) F
1e680 52 4f 4d 20 74 20 4c 49 4d 49 54 20 31 3b 0a 2a  ROM t LIMIT 1;.*
1e690 2a 0a 2a 2a 20 77 68 65 72 65 20 27 74 27 20 69  *.** where 't' i
1e6a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  s the name of an
1e6b0 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a   FTS3 table..*/.
1e6c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1e6d0 4f 70 74 69 6d 69 7a 65 46 75 6e 63 28 0a 20 20  OptimizeFunc(.  
1e6e0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e6f0 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1e700 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1e710 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1e720 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e750 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1e760 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1e770 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1e780 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1e790 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1e7a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e7d0 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20   */.  Fts3Table 
1e7e0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1e7f0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1e800 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1e810 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
1e820 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
1e830 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e     /* Cursor han
1e840 64 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  dle passed throu
1e850 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a  gh apVal[0] */..
1e860 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1e870 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73 73  ER(nVal);..  ass
1e880 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a  ert( nVal==1 );.
1e890 20 20 69 66 28 20 66 74 73 33 46 75 6e 63 74 69    if( fts3Functi
1e8a0 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c 20  onArg(pContext, 
1e8b0 22 6f 70 74 69 6d 69 7a 65 22 2c 20 61 70 56 61  "optimize", apVa
1e8c0 6c 5b 30 5d 2c 20 26 70 43 75 72 73 6f 72 29 20  l[0], &pCursor) 
1e8d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
1e8e0 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 75  (Fts3Table *)pCu
1e8f0 72 73 6f 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  rsor->base.pVtab
1e900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
1e910 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1e920 46 74 73 33 4f 70 74 69 6d 69 7a 65 28 70 29 3b  Fts3Optimize(p);
1e930 0a 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29  ..  switch( rc )
1e940 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1e950 45 5f 4f 4b 3a 0a 20 20 20 20 20 20 73 71 6c 69  E_OK:.      sqli
1e960 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1e970 70 43 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78  pContext, "Index
1e980 20 6f 70 74 69 6d 69 7a 65 64 22 2c 20 2d 31 2c   optimized", -1,
1e990 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
1e9a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e9b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
1e9c0 4e 45 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NE:.      sqlite
1e9d0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
1e9e0 6f 6e 74 65 78 74 2c 20 22 49 6e 64 65 78 20 61  ontext, "Index a
1e9f0 6c 72 65 61 64 79 20 6f 70 74 69 6d 61 6c 22 2c  lready optimal",
1ea00 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
1ea10 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
1ea20 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1ea30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1ea40 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70  ult_error_code(p
1ea50 43 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  Context, rc);.  
1ea60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
1ea70 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1ea80 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  tation of the ma
1ea90 74 63 68 69 6e 66 6f 28 29 20 66 75 6e 63 74 69  tchinfo() functi
1eaa0 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a 73  on for FTS3.*/.s
1eab0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 4d  tatic void fts3M
1eac0 61 74 63 68 69 6e 66 6f 46 75 6e 63 28 0a 20 20  atchinfoFunc(.  
1ead0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1eae0 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1eaf0 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1eb00 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1eb10 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1eb40 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1eb50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1eb60 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1eb70 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1eb80 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1eb90 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1eba0 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
1ebb0 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64    /* Cursor hand
1ebc0 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  le passed throug
1ebd0 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20  h apVal[0] */.  
1ebe0 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20  assert( nVal==1 
1ebf0 7c 7c 20 6e 56 61 6c 3d 3d 32 20 29 3b 0a 20 20  || nVal==2 );.  
1ec00 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66  if( SQLITE_OK==f
1ec10 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70  ts3FunctionArg(p
1ec20 43 6f 6e 74 65 78 74 2c 20 22 6d 61 74 63 68 69  Context, "matchi
1ec30 6e 66 6f 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20  nfo", apVal[0], 
1ec40 26 70 43 73 72 29 20 29 7b 0a 20 20 20 20 63 6f  &pCsr) ){.    co
1ec50 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
1ec60 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 56 61 6c   0;.    if( nVal
1ec70 3e 31 20 29 7b 0a 20 20 20 20 20 20 7a 41 72 67  >1 ){.      zArg
1ec80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
1ec90 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1eca0 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
1ecb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ecc0 46 74 73 33 4d 61 74 63 68 69 6e 66 6f 28 70 43  Fts3Matchinfo(pC
1ecd0 6f 6e 74 65 78 74 2c 20 70 43 73 72 2c 20 7a 41  ontext, pCsr, zA
1ece0 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
1ecf0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1ed00 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 78 46  mplements the xF
1ed10 69 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68  indFunction meth
1ed20 6f 64 20 66 6f 72 20 74 68 65 20 46 54 53 33 0a  od for the FTS3.
1ed30 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ** virtual table
1ed40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ed50 66 74 73 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  fts3FindFunction
1ed60 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
1ed70 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
1ed80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
1ed90 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
1eda0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1edd0 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   of SQL function
1ede0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1edf0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1ee00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ee10 2f 2a 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66  /* Name of SQL f
1ee20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1ee30 64 20 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c  d (**pxFunc)(sql
1ee40 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
1ee50 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
1ee60 2a 29 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75  *), /* OUT: Resu
1ee70 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70  lt */.  void **p
1ee80 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
1ee90 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
1eea0 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
1eeb0 20 4f 76 65 72 6c 6f 61 64 65 64 20 7b 0a 20 20   Overloaded {.  
1eec0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1eed0 61 6d 65 3b 0a 20 20 20 20 76 6f 69 64 20 28 2a  ame;.    void (*
1eee0 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
1eef0 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
1ef00 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20  te3_value**);.  
1ef10 7d 20 61 4f 76 65 72 6c 6f 61 64 5b 5d 20 3d 20  } aOverload[] = 
1ef20 7b 0a 20 20 20 20 7b 20 22 73 6e 69 70 70 65 74  {.    { "snippet
1ef30 22 2c 20 66 74 73 33 53 6e 69 70 70 65 74 46 75  ", fts3SnippetFu
1ef40 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 66 66  nc },.    { "off
1ef50 73 65 74 73 22 2c 20 66 74 73 33 4f 66 66 73 65  sets", fts3Offse
1ef60 74 73 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20  tsFunc },.    { 
1ef70 22 6f 70 74 69 6d 69 7a 65 22 2c 20 66 74 73 33  "optimize", fts3
1ef80 4f 70 74 69 6d 69 7a 65 46 75 6e 63 20 7d 2c 0a  OptimizeFunc },.
1ef90 20 20 20 20 7b 20 22 6d 61 74 63 68 69 6e 66 6f      { "matchinfo
1efa0 22 2c 20 66 74 73 33 4d 61 74 63 68 69 6e 66 6f  ", fts3Matchinfo
1efb0 46 75 6e 63 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  Func },.  };.  i
1efc0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1efe0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
1eff0 62 6c 65 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  ble */..  UNUSED
1f000 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61 62  _PARAMETER(pVtab
1f010 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f020 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20 55  METER(nArg);.  U
1f030 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f040 70 70 41 72 67 29 3b 0a 0a 20 20 66 6f 72 28 69  ppArg);..  for(i
1f050 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72 61  =0; i<SizeofArra
1f060 79 28 61 4f 76 65 72 6c 6f 61 64 29 3b 20 69 2b  y(aOverload); i+
1f070 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
1f080 6d 70 28 7a 4e 61 6d 65 2c 20 61 4f 76 65 72 6c  mp(zName, aOverl
1f090 6f 61 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  oad[i].zName)==0
1f0a0 20 29 7b 0a 20 20 20 20 20 20 2a 70 78 46 75 6e   ){.      *pxFun
1f0b0 63 20 3d 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d  c = aOverload[i]
1f0c0 2e 78 46 75 6e 63 3b 0a 20 20 20 20 20 20 72 65  .xFunc;.      re
1f0d0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f0e0 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 66 75 6e 63 74  }..  /* No funct
1f0f0 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69  ion of the speci
1f100 66 69 65 64 20 6e 61 6d 65 20 77 61 73 20 66 6f  fied name was fo
1f110 75 6e 64 2e 20 52 65 74 75 72 6e 20 30 2e 20 2a  und. Return 0. *
1f120 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1f130 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1f140 61 74 69 6f 6e 20 6f 66 20 46 54 53 33 20 78 52  ation of FTS3 xR
1f150 65 6e 61 6d 65 20 6d 65 74 68 6f 64 2e 20 52 65  ename method. Re
1f160 6e 61 6d 65 20 61 6e 20 66 74 73 33 20 74 61 62  name an fts3 tab
1f170 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1f180 74 20 66 74 73 33 52 65 6e 61 6d 65 4d 65 74 68  t fts3RenameMeth
1f190 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  od(.  sqlite3_vt
1f1a0 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20  ab *pVtab,      
1f1b0 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
1f1c0 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f   table handle */
1f1d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f1e0 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  Name            
1f1f0 20 20 20 2f 2a 20 4e 65 77 20 6e 61 6d 65 20 6f     /* New name o
1f200 66 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  f table */.){.  
1f210 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28  Fts3Table *p = (
1f220 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61  Fts3Table *)pVta
1f230 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
1f240 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
1f250 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1f260 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1f270 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f2a0 2a 2f 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  */..  /* At this
1f2b0 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62   point it must b
1f2c0 65 20 6b 6e 6f 77 6e 20 69 66 20 74 68 65 20 25  e known if the %
1f2d0 5f 73 74 61 74 20 74 61 62 6c 65 20 65 78 69 73  _stat table exis
1f2e0 74 73 20 6f 72 20 6e 6f 74 2e 0a 20 20 2a 2a 20  ts or not..  ** 
1f2f0 53 6f 20 62 48 61 73 53 74 61 74 20 6d 61 79 20  So bHasStat may 
1f300 6e 6f 74 20 62 65 20 32 2e 20 20 2a 2f 0a 20 20  not be 2.  */.  
1f310 72 63 20 3d 20 66 74 73 33 53 65 74 48 61 73 53  rc = fts3SetHasS
1f320 74 61 74 28 70 29 3b 0a 20 20 0a 20 20 2f 2a 20  tat(p);.  .  /* 
1f330 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
1f340 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73  he pending terms
1f350 20 74 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73   table is always
1f360 20 65 6d 70 74 79 20 68 65 72 65 2e 20 54 68 69   empty here. Thi
1f370 73 20 69 73 0a 20 20 2a 2a 20 62 65 63 61 75 73  s is.  ** becaus
1f380 65 20 61 6e 20 22 41 4c 54 45 52 20 54 41 42 4c  e an "ALTER TABL
1f390 45 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 22 20  E RENAME TABLE" 
1f3a0 73 74 61 74 65 6d 65 6e 74 20 69 6e 73 69 64 65  statement inside
1f3b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1f3c0 20 20 2a 2a 20 61 6c 77 61 79 73 20 6f 70 65 6e    ** always open
1f3d0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72  s a savepoint tr
1f3e0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 6e 64 20 74  ansaction. And t
1f3f0 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29 20  he xSavepoint() 
1f400 6d 65 74 68 6f 64 20 0a 20 20 2a 2a 20 66 6c 75  method .  ** flu
1f410 73 68 65 73 20 74 68 65 20 70 65 6e 64 69 6e 67  shes the pending
1f420 20 74 65 72 6d 73 20 74 61 62 6c 65 2e 20 42 75   terms table. Bu
1f430 74 20 6c 65 61 76 65 20 74 68 65 20 28 6e 6f 2d  t leave the (no-
1f440 6f 70 29 20 63 61 6c 6c 20 74 6f 0a 20 20 2a 2a  op) call to.  **
1f450 20 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75   PendingTermsFlu
1f460 73 68 28 29 20 69 6e 20 69 6e 20 63 61 73 65 20  sh() in in case 
1f470 74 68 61 74 20 63 68 61 6e 67 65 73 2e 0a 20 20  that changes..  
1f480 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1f490 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
1f4a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1f4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1f4c0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 65   = sqlite3Fts3Pe
1f4d0 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28  ndingTermsFlush(
1f4e0 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  p);.  }..  if( p
1f4f0 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30  ->zContentTbl==0
1f500 20 29 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78   ){.    fts3DbEx
1f510 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
1f520 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
1f530 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 20 20  Q.'%q_content'  
1f540 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 63 6f  RENAME TO '%q_co
1f550 6e 74 65 6e 74 27 3b 22 2c 0a 20 20 20 20 20 20  ntent';",.      
1f560 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f570 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
1f580 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 62 48 61   }..  if( p->bHa
1f590 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20  sDocsize ){.    
1f5a0 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20  fts3DbExec(&rc, 
1f5b0 64 62 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52  db,.      "ALTER
1f5c0 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 64 6f   TABLE %Q.'%q_do
1f5d0 63 73 69 7a 65 27 20 20 52 45 4e 41 4d 45 20 54  csize'  RENAME T
1f5e0 4f 20 27 25 71 5f 64 6f 63 73 69 7a 65 27 3b 22  O '%q_docsize';"
1f5f0 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20  ,.      p->zDb, 
1f600 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a  p->zName, zName.
1f610 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28      );.  }.  if(
1f620 20 70 2d 3e 62 48 61 73 53 74 61 74 20 29 7b 0a   p->bHasStat ){.
1f630 20 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26      fts3DbExec(&
1f640 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 22 41  rc, db,.      "A
1f650 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25  LTER TABLE %Q.'%
1f660 71 5f 73 74 61 74 27 20 20 52 45 4e 41 4d 45 20  q_stat'  RENAME 
1f670 54 4f 20 27 25 71 5f 73 74 61 74 27 3b 22 2c 0a  TO '%q_stat';",.
1f680 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d        p->zDb, p-
1f690 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20  >zName, zName.  
1f6a0 20 20 29 3b 0a 20 20 7d 0a 20 20 66 74 73 33 44    );.  }.  fts3D
1f6b0 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
1f6c0 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20     "ALTER TABLE 
1f6d0 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  %Q.'%q_segments'
1f6e0 20 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73   RENAME TO '%q_s
1f6f0 65 67 6d 65 6e 74 73 27 3b 22 2c 0a 20 20 20 20  egments';",.    
1f700 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f710 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 66  , zName.  );.  f
1f720 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
1f730 62 2c 0a 20 20 20 20 22 41 4c 54 45 52 20 54 41  b,.    "ALTER TA
1f740 42 4c 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69  BLE %Q.'%q_segdi
1f750 72 27 20 20 20 52 45 4e 41 4d 45 20 54 4f 20 27  r'   RENAME TO '
1f760 25 71 5f 73 65 67 64 69 72 27 3b 22 2c 0a 20 20  %q_segdir';",.  
1f770 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61    p->zDb, p->zNa
1f780 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20  me, zName.  );. 
1f790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f7a0 2a 0a 2a 2a 20 54 68 65 20 78 53 61 76 65 70 6f  *.** The xSavepo
1f7b0 69 6e 74 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a  int() method..**
1f7c0 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1f7d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
1f7e0 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 61 62 6c  nding-terms tabl
1f7f0 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  e to disk..*/.st
1f800 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 61 76  atic int fts3Sav
1f810 65 70 6f 69 6e 74 4d 65 74 68 6f 64 28 73 71 6c  epointMethod(sql
1f820 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1f830 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
1f840 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f850 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45  LITE_OK;.  UNUSE
1f860 44 5f 50 41 52 41 4d 45 54 45 52 28 69 53 61 76  D_PARAMETER(iSav
1f870 65 70 6f 69 6e 74 29 3b 0a 20 20 61 73 73 65 72  epoint);.  asser
1f880 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a  t( ((Fts3Table *
1f890 29 70 56 74 61 62 29 2d 3e 69 6e 54 72 61 6e 73  )pVtab)->inTrans
1f8a0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65  action );.  asse
1f8b0 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20  rt( ((Fts3Table 
1f8c0 2a 29 70 56 74 61 62 29 2d 3e 6d 78 53 61 76 65  *)pVtab)->mxSave
1f8d0 70 6f 69 6e 74 20 3c 20 69 53 61 76 65 70 6f 69  point < iSavepoi
1f8e0 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  nt );.  TESTONLY
1f8f0 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
1f900 70 56 74 61 62 29 2d 3e 6d 78 53 61 76 65 70 6f  pVtab)->mxSavepo
1f910 69 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  int = iSavepoint
1f920 20 29 3b 0a 20 20 69 66 28 20 28 28 46 74 73 33   );.  if( ((Fts3
1f930 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29 2d 3e  Table *)pVtab)->
1f940 62 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74  bIgnoreSavepoint
1f950 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1f960 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 28 70  fts3SyncMethod(p
1f970 56 74 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Vtab);.  }.  ret
1f980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f990 20 54 68 65 20 78 52 65 6c 65 61 73 65 28 29 20   The xRelease() 
1f9a0 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  method..**.** Th
1f9b0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
1f9c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1f9d0 33 52 65 6c 65 61 73 65 4d 65 74 68 6f 64 28 73  3ReleaseMethod(s
1f9e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1f9f0 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  ab, int iSavepoi
1fa00 6e 74 29 7b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  nt){.  TESTONLY(
1fa10 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
1fa20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 56 74 61  (Fts3Table*)pVta
1fa30 62 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  b );.  UNUSED_PA
1fa40 52 41 4d 45 54 45 52 28 69 53 61 76 65 70 6f 69  RAMETER(iSavepoi
1fa50 6e 74 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nt);.  UNUSED_PA
1fa60 52 41 4d 45 54 45 52 28 70 56 74 61 62 29 3b 0a  RAMETER(pVtab);.
1fa70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1fa80 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1fa90 61 73 73 65 72 74 28 20 70 2d 3e 6d 78 53 61 76  assert( p->mxSav
1faa0 65 70 6f 69 6e 74 20 3e 3d 20 69 53 61 76 65 70  epoint >= iSavep
1fab0 6f 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f 4e  oint );.  TESTON
1fac0 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69  LY( p->mxSavepoi
1fad0 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 2d  nt = iSavepoint-
1fae0 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  1 );.  return SQ
1faf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1fb00 2a 20 54 68 65 20 78 52 6f 6c 6c 62 61 63 6b 54  * The xRollbackT
1fb10 6f 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  o() method..**.*
1fb20 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  * Discard the co
1fb30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65  ntents of the pe
1fb40 6e 64 69 6e 67 20 74 65 72 6d 73 20 74 61 62 6c  nding terms tabl
1fb50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fb60 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54 6f 4d   fts3RollbackToM
1fb70 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74  ethod(sqlite3_vt
1fb80 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20 69  ab *pVtab, int i
1fb90 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 46 74  Savepoint){.  Ft
1fba0 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
1fbb0 73 33 54 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a  s3Table*)pVtab;.
1fbc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1fbd0 45 52 28 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  ER(iSavepoint);.
1fbe0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1fbf0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1fc00 61 73 73 65 72 74 28 20 70 2d 3e 6d 78 53 61 76  assert( p->mxSav
1fc10 65 70 6f 69 6e 74 20 3e 3d 20 69 53 61 76 65 70  epoint >= iSavep
1fc20 6f 69 6e 74 20 29 3b 0a 20 20 54 45 53 54 4f 4e  oint );.  TESTON
1fc30 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69  LY( p->mxSavepoi
1fc40 6e 74 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  nt = iSavepoint 
1fc50 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  );.  sqlite3Fts3
1fc60 50 65 6e 64 69 6e 67 54 65 72 6d 73 43 6c 65 61  PendingTermsClea
1fc70 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  r(p);.  return S
1fc80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
1fc90 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
1fca0 33 5f 6d 6f 64 75 6c 65 20 66 74 73 33 4d 6f 64  3_module fts3Mod
1fcb0 75 6c 65 20 3d 20 7b 0a 20 20 2f 2a 20 69 56 65  ule = {.  /* iVe
1fcc0 72 73 69 6f 6e 20 20 20 20 20 20 2a 2f 20 32 2c  rsion      */ 2,
1fcd0 0a 20 20 2f 2a 20 78 43 72 65 61 74 65 20 20 20  .  /* xCreate   
1fce0 20 20 20 20 2a 2f 20 66 74 73 33 43 72 65 61 74      */ fts3Creat
1fcf0 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 43  eMethod,.  /* xC
1fd00 6f 6e 6e 65 63 74 20 20 20 20 20 20 2a 2f 20 66  onnect      */ f
1fd10 74 73 33 43 6f 6e 6e 65 63 74 4d 65 74 68 6f 64  ts3ConnectMethod
1fd20 2c 0a 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65  ,.  /* xBestInde
1fd30 78 20 20 20 20 2a 2f 20 66 74 73 33 42 65 73 74  x    */ fts3Best
1fd40 49 6e 64 65 78 4d 65 74 68 6f 64 2c 0a 20 20 2f  IndexMethod,.  /
1fd50 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 20 20  * xDisconnect   
1fd60 2a 2f 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63  */ fts3Disconnec
1fd70 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 44  tMethod,.  /* xD
1fd80 65 73 74 72 6f 79 20 20 20 20 20 20 2a 2f 20 66  estroy      */ f
1fd90 74 73 33 44 65 73 74 72 6f 79 4d 65 74 68 6f 64  ts3DestroyMethod
1fda0 2c 0a 20 20 2f 2a 20 78 4f 70 65 6e 20 20 20 20  ,.  /* xOpen    
1fdb0 20 20 20 20 20 2a 2f 20 66 74 73 33 4f 70 65 6e       */ fts3Open
1fdc0 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 43 6c  Method,.  /* xCl
1fdd0 6f 73 65 20 20 20 20 20 20 20 20 2a 2f 20 66 74  ose        */ ft
1fde0 73 33 43 6c 6f 73 65 4d 65 74 68 6f 64 2c 0a 20  s3CloseMethod,. 
1fdf0 20 2f 2a 20 78 46 69 6c 74 65 72 20 20 20 20 20   /* xFilter     
1fe00 20 20 2a 2f 20 66 74 73 33 46 69 6c 74 65 72 4d    */ fts3FilterM
1fe10 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 4e 65 78  ethod,.  /* xNex
1fe20 74 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73  t         */ fts
1fe30 33 4e 65 78 74 4d 65 74 68 6f 64 2c 0a 20 20 2f  3NextMethod,.  /
1fe40 2a 20 78 45 6f 66 20 20 20 20 20 20 20 20 20 20  * xEof          
1fe50 2a 2f 20 66 74 73 33 45 6f 66 4d 65 74 68 6f 64  */ fts3EofMethod
1fe60 2c 0a 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 20  ,.  /* xColumn  
1fe70 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6c 75       */ fts3Colu
1fe80 6d 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  mnMethod,.  /* x
1fe90 52 6f 77 69 64 20 20 20 20 20 20 20 20 2a 2f 20  Rowid        */ 
1fea0 66 74 73 33 52 6f 77 69 64 4d 65 74 68 6f 64 2c  fts3RowidMethod,
1feb0 0a 20 20 2f 2a 20 78 55 70 64 61 74 65 20 20 20  .  /* xUpdate   
1fec0 20 20 20 20 2a 2f 20 66 74 73 33 55 70 64 61 74      */ fts3Updat
1fed0 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 42  eMethod,.  /* xB
1fee0 65 67 69 6e 20 20 20 20 20 20 20 20 2a 2f 20 66  egin        */ f
1fef0 74 73 33 42 65 67 69 6e 4d 65 74 68 6f 64 2c 0a  ts3BeginMethod,.
1ff00 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 20    /* xSync      
1ff10 20 20 20 2a 2f 20 66 74 73 33 53 79 6e 63 4d 65     */ fts3SyncMe
1ff20 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 43 6f 6d 6d  thod,.  /* xComm
1ff30 69 74 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33  it       */ fts3
1ff40 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 2c 0a 20 20  CommitMethod,.  
1ff50 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 20 20 20  /* xRollback    
1ff60 20 2a 2f 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b   */ fts3Rollback
1ff70 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 46 69  Method,.  /* xFi
1ff80 6e 64 46 75 6e 63 74 69 6f 6e 20 2a 2f 20 66 74  ndFunction */ ft
1ff90 73 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 4d 65  s3FindFunctionMe
1ffa0 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 65 6e 61  thod,.  /* xRena
1ffb0 6d 65 20 2a 2f 20 20 20 20 20 20 20 66 74 73 33  me */       fts3
1ffc0 52 65 6e 61 6d 65 4d 65 74 68 6f 64 2c 0a 20 20  RenameMethod,.  
1ffd0 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 20 20  /* xSavepoint   
1ffe0 20 2a 2f 20 66 74 73 33 53 61 76 65 70 6f 69 6e   */ fts3Savepoin
1fff0 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52  tMethod,.  /* xR
20000 65 6c 65 61 73 65 20 20 20 20 20 20 2a 2f 20 66  elease      */ f
20010 74 73 33 52 65 6c 65 61 73 65 4d 65 74 68 6f 64  ts3ReleaseMethod
20020 2c 0a 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b  ,.  /* xRollback
20030 54 6f 20 20 20 2a 2f 20 66 74 73 33 52 6f 6c 6c  To   */ fts3Roll
20040 62 61 63 6b 54 6f 4d 65 74 68 6f 64 2c 0a 7d 3b  backToMethod,.};
20050 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20060 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
20070 72 65 64 20 61 73 20 74 68 65 20 6d 6f 64 75 6c  red as the modul
20080 65 20 64 65 73 74 72 75 63 74 6f 72 20 28 63 61  e destructor (ca
20090 6c 6c 65 64 20 77 68 65 6e 20 61 6e 0a 2a 2a 20  lled when an.** 
200a0 46 54 53 33 20 65 6e 61 62 6c 65 64 20 64 61 74  FTS3 enabled dat
200b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
200c0 20 69 73 20 63 6c 6f 73 65 64 29 2e 20 49 74 20   is closed). It 
200d0 66 72 65 65 73 20 74 68 65 20 6d 65 6d 6f 72 79  frees the memory
200e0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  .** allocated fo
200f0 72 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 20  r the tokenizer 
20100 68 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  hash table..*/.s
20110 74 61 74 69 63 20 76 6f 69 64 20 68 61 73 68 44  tatic void hashD
20120 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70 29 7b  estroy(void *p){
20130 0a 20 20 46 74 73 33 48 61 73 68 20 2a 70 48 61  .  Fts3Hash *pHa
20140 73 68 20 3d 20 28 46 74 73 33 48 61 73 68 20 2a  sh = (Fts3Hash *
20150 29 70 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  )p;.  sqlite3Fts
20160 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  3HashClear(pHash
20170 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
20180 65 28 70 48 61 73 68 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pHash);.}../*.
20190 2a 2a 20 54 68 65 20 66 74 73 33 20 62 75 69 6c  ** The fts3 buil
201a0 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 73 20  t-in tokenizers 
201b0 2d 20 22 73 69 6d 70 6c 65 22 2c 20 22 70 6f 72  - "simple", "por
201c0 74 65 72 22 20 61 6e 64 20 22 69 63 75 22 2d 20  ter" and "icu"- 
201d0 61 72 65 20 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  are .** implemen
201e0 74 65 64 20 69 6e 20 66 69 6c 65 73 20 66 74 73  ted in files fts
201f0 33 5f 74 6f 6b 65 6e 69 7a 65 72 31 2e 63 2c 20  3_tokenizer1.c, 
20200 66 74 73 33 5f 70 6f 72 74 65 72 2e 63 20 61 6e  fts3_porter.c an
20210 64 20 66 74 73 33 5f 69 63 75 2e 63 0a 2a 2a 20  d fts3_icu.c.** 
20220 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 54 68  respectively. Th
20230 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
20240 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72  e forward declar
20250 61 74 69 6f 6e 73 20 61 72 65 20 66 6f 72 20 66  ations are for f
20260 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 64 65 63 6c  unctions.** decl
20270 61 72 65 64 20 69 6e 20 74 68 65 73 65 20 66 69  ared in these fi
20280 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 74 72  les used to retr
20290 69 65 76 65 20 74 68 65 20 72 65 73 70 65 63 74  ieve the respect
202a0 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ive implementati
202b0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ons..**.** Calli
202c0 6e 67 20 73 71 6c 69 74 65 33 46 74 73 33 53 69  ng sqlite3Fts3Si
202d0 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64  mpleTokenizerMod
202e0 75 6c 65 28 29 20 73 65 74 73 20 74 68 65 20 76  ule() sets the v
202f0 61 6c 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  alue pointed.** 
20300 74 6f 20 62 79 20 74 68 65 20 61 72 67 75 6d 65  to by the argume
20310 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
20320 68 65 20 22 73 69 6d 70 6c 65 22 20 74 6f 6b 65  he "simple" toke
20330 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  nizer implementa
20340 74 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  tion..** And so 
20350 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
20360 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b  te3Fts3SimpleTok
20370 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71 6c  enizerModule(sql
20380 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
20390 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70 4d  odule const**ppM
203a0 6f 64 75 6c 65 29 3b 0a 76 6f 69 64 20 73 71 6c  odule);.void sql
203b0 69 74 65 33 46 74 73 33 50 6f 72 74 65 72 54 6f  ite3Fts3PorterTo
203c0 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71  kenizerModule(sq
203d0 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
203e0 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70  module const**pp
203f0 4d 6f 64 75 6c 65 29 3b 0a 23 69 66 6e 64 65 66  Module);.#ifndef
20400 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
20410 46 54 53 33 5f 55 4e 49 43 4f 44 45 0a 76 6f 69  FTS3_UNICODE.voi
20420 64 20 73 71 6c 69 74 65 33 46 74 73 33 55 6e 69  d sqlite3Fts3Uni
20430 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 72 28 73 71  codeTokenizer(sq
20440 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
20450 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70  module const**pp
20460 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
20470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20480 41 42 4c 45 5f 49 43 55 0a 76 6f 69 64 20 73 71  ABLE_ICU.void sq
20490 6c 69 74 65 33 46 74 73 33 49 63 75 54 6f 6b 65  lite3Fts3IcuToke
204a0 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71 6c 69  nizerModule(sqli
204b0 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
204c0 64 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f  dule const**ppMo
204d0 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  dule);.#endif../
204e0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
204f0 74 68 65 20 66 74 73 33 20 65 78 74 65 6e 73 69  the fts3 extensi
20500 6f 6e 2e 20 49 66 20 74 68 69 73 20 65 78 74 65  on. If this exte
20510 6e 73 69 6f 6e 20 69 73 20 62 75 69 6c 74 20 61  nsion is built a
20520 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  s part.** of the
20530 20 73 71 6c 69 74 65 20 6c 69 62 72 61 72 79 2c   sqlite library,
20540 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
20550 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 64 69  ion is called di
20560 72 65 63 74 6c 79 20 62 79 0a 2a 2a 20 53 51 4c  rectly by.** SQL
20570 69 74 65 2e 20 49 66 20 66 74 73 33 20 69 73 20  ite. If fts3 is 
20580 62 75 69 6c 74 20 61 73 20 61 20 64 79 6e 61 6d  built as a dynam
20590 69 63 61 6c 6c 79 20 6c 6f 61 64 61 62 6c 65 20  ically loadable 
205a0 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 69 73 0a  extension, this.
205b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  ** function is c
205c0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73 71 6c  alled by the sql
205d0 69 74 65 33 5f 65 78 74 65 6e 73 69 6f 6e 5f 69  ite3_extension_i
205e0 6e 69 74 28 29 20 65 6e 74 72 79 20 70 6f 69 6e  nit() entry poin
205f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
20600 33 46 74 73 33 49 6e 69 74 28 73 71 6c 69 74 65  3Fts3Init(sqlite
20610 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
20620 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20630 46 74 73 33 48 61 73 68 20 2a 70 48 61 73 68 20  Fts3Hash *pHash 
20640 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  = 0;.  const sql
20650 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d  ite3_tokenizer_m
20660 6f 64 75 6c 65 20 2a 70 53 69 6d 70 6c 65 20 3d  odule *pSimple =
20670 20 30 3b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69   0;.  const sqli
20680 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
20690 64 75 6c 65 20 2a 70 50 6f 72 74 65 72 20 3d 20  dule *pPorter = 
206a0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
206b0 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 33 5f 55  E_DISABLE_FTS3_U
206c0 4e 49 43 4f 44 45 0a 20 20 63 6f 6e 73 74 20 73  NICODE.  const s
206d0 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
206e0 5f 6d 6f 64 75 6c 65 20 2a 70 55 6e 69 63 6f 64  _module *pUnicod
206f0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
20700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20710 42 4c 45 5f 49 43 55 0a 20 20 63 6f 6e 73 74 20  BLE_ICU.  const 
20720 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
20730 72 5f 6d 6f 64 75 6c 65 20 2a 70 49 63 75 20 3d  r_module *pIcu =
20740 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   0;.  sqlite3Fts
20750 33 49 63 75 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64  3IcuTokenizerMod
20760 75 6c 65 28 26 70 49 63 75 29 3b 0a 23 65 6e 64  ule(&pIcu);.#end
20770 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
20780 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 33 5f  TE_DISABLE_FTS3_
20790 55 4e 49 43 4f 44 45 0a 20 20 73 71 6c 69 74 65  UNICODE.  sqlite
207a0 33 46 74 73 33 55 6e 69 63 6f 64 65 54 6f 6b 65  3Fts3UnicodeToke
207b0 6e 69 7a 65 72 28 26 70 55 6e 69 63 6f 64 65 29  nizer(&pUnicode)
207c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
207d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72   SQLITE_TEST.  r
207e0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
207f0 6e 69 74 54 65 72 6d 28 64 62 29 3b 0a 20 20 69  nitTerm(db);.  i
20800 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20810 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
20820 6e 64 69 66 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ndif..  rc = sql
20830 69 74 65 33 46 74 73 33 49 6e 69 74 41 75 78 28  ite3Fts3InitAux(
20840 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  db);.  if( rc!=S
20850 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
20860 6e 20 72 63 3b 0a 0a 20 20 73 71 6c 69 74 65 33  n rc;..  sqlite3
20870 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b 65 6e 69  Fts3SimpleTokeni
20880 7a 65 72 4d 6f 64 75 6c 65 28 26 70 53 69 6d 70  zerModule(&pSimp
20890 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  le);.  sqlite3Ft
208a0 73 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65  s3PorterTokenize
208b0 72 4d 6f 64 75 6c 65 28 26 70 50 6f 72 74 65 72  rModule(&pPorter
208c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
208d0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
208e0 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 20   the hash-table 
208f0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 6f  used to store to
20900 6b 65 6e 69 7a 65 72 73 2e 20 2a 2f 0a 20 20 70  kenizers. */.  p
20910 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Hash = sqlite3_m
20920 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
20930 33 48 61 73 68 29 29 3b 0a 20 20 69 66 28 20 21  3Hash));.  if( !
20940 70 48 61 73 68 20 29 7b 0a 20 20 20 20 72 63 20  pHash ){.    rc 
20950 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
20960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
20970 69 74 65 33 46 74 73 33 48 61 73 68 49 6e 69 74  ite3Fts3HashInit
20980 28 70 48 61 73 68 2c 20 46 54 53 33 5f 48 41 53  (pHash, FTS3_HAS
20990 48 5f 53 54 52 49 4e 47 2c 20 31 29 3b 0a 20 20  H_STRING, 1);.  
209a0 7d 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  }..  /* Load the
209b0 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b 65 6e 69   built-in tokeni
209c0 7a 65 72 73 20 69 6e 74 6f 20 74 68 65 20 68 61  zers into the ha
209d0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  sh table */.  if
209e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
209f0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
20a00 65 33 46 74 73 33 48 61 73 68 49 6e 73 65 72 74  e3Fts3HashInsert
20a10 28 70 48 61 73 68 2c 20 22 73 69 6d 70 6c 65 22  (pHash, "simple"
20a20 2c 20 37 2c 20 28 76 6f 69 64 20 2a 29 70 53 69  , 7, (void *)pSi
20a30 6d 70 6c 65 29 0a 20 20 20 20 20 7c 7c 20 73 71  mple).     || sq
20a40 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e 73  lite3Fts3HashIns
20a50 65 72 74 28 70 48 61 73 68 2c 20 22 70 6f 72 74  ert(pHash, "port
20a60 65 72 22 2c 20 37 2c 20 28 76 6f 69 64 20 2a 29  er", 7, (void *)
20a70 70 50 6f 72 74 65 72 29 20 0a 0a 23 69 66 6e 64  pPorter) ..#ifnd
20a80 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
20a90 45 5f 46 54 53 33 5f 55 4e 49 43 4f 44 45 0a 20  E_FTS3_UNICODE. 
20aa0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 46 74      || sqlite3Ft
20ab0 73 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61  s3HashInsert(pHa
20ac0 73 68 2c 20 22 75 6e 69 63 6f 64 65 36 31 22 2c  sh, "unicode61",
20ad0 20 31 30 2c 20 28 76 6f 69 64 20 2a 29 70 55 6e   10, (void *)pUn
20ae0 69 63 6f 64 65 29 20 0a 23 65 6e 64 69 66 0a 23  icode) .#endif.#
20af0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20b00 42 4c 45 5f 49 43 55 0a 20 20 20 20 20 7c 7c 20  BLE_ICU.     || 
20b10 28 70 49 63 75 20 26 26 20 73 71 6c 69 74 65 33  (pIcu && sqlite3
20b20 46 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70  Fts3HashInsert(p
20b30 48 61 73 68 2c 20 22 69 63 75 22 2c 20 34 2c 20  Hash, "icu", 4, 
20b40 28 76 6f 69 64 20 2a 29 70 49 63 75 29 29 0a 23  (void *)pIcu)).#
20b50 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
20b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20b70 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
20b80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
20b90 45 53 54 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  EST.  if( rc==SQ
20ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20bb0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 45  c = sqlite3Fts3E
20bc0 78 70 72 49 6e 69 74 54 65 73 74 49 6e 74 65 72  xprInitTestInter
20bd0 66 61 63 65 28 64 62 29 3b 0a 20 20 7d 0a 23 65  face(db);.  }.#e
20be0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ndif..  /* Creat
20bf0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
20c00 62 6c 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  ble wrapper arou
20c10 6e 64 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  nd the hash-tabl
20c20 65 20 61 6e 64 20 6f 76 65 72 6c 6f 61 64 20 0a  e and overload .
20c30 20 20 2a 2a 20 74 68 65 20 66 6f 75 72 20 73 63    ** the four sc
20c40 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 2e 20  alar functions. 
20c50 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
20c60 73 73 66 75 6c 2c 20 72 65 67 69 73 74 65 72 20  ssful, register 
20c70 74 68 65 0a 20 20 2a 2a 20 6d 6f 64 75 6c 65 20  the.  ** module 
20c80 77 69 74 68 20 73 71 6c 69 74 65 2e 0a 20 20 2a  with sqlite..  *
20c90 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
20ca0 4b 3d 3d 72 63 20 0a 20 20 20 26 26 20 53 51 4c  K==rc .   && SQL
20cb0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71  ITE_OK==(rc = sq
20cc0 6c 69 74 65 33 46 74 73 33 49 6e 69 74 48 61 73  lite3Fts3InitHas
20cd0 68 54 61 62 6c 65 28 64 62 2c 20 70 48 61 73 68  hTable(db, pHash
20ce0 2c 20 22 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65  , "fts3_tokenize
20cf0 72 22 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54  r")).   && SQLIT
20d00 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
20d10 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
20d20 63 74 69 6f 6e 28 64 62 2c 20 22 73 6e 69 70 70  ction(db, "snipp
20d30 65 74 22 2c 20 2d 31 29 29 0a 20 20 20 26 26 20  et", -1)).   && 
20d40 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
20d50 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
20d60 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
20d70 6f 66 66 73 65 74 73 22 2c 20 31 29 29 0a 20 20  offsets", 1)).  
20d80 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
20d90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65  rc = sqlite3_ove
20da0 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
20db0 62 2c 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20  b, "matchinfo", 
20dc0 31 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  1)).   && SQLITE
20dd0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
20de0 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
20df0 74 69 6f 6e 28 64 62 2c 20 22 6d 61 74 63 68 69  tion(db, "matchi
20e00 6e 66 6f 22 2c 20 32 29 29 0a 20 20 20 26 26 20  nfo", 2)).   && 
20e10 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
20e20 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
20e30 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  d_function(db, "
20e40 6f 70 74 69 6d 69 7a 65 22 2c 20 31 29 29 0a 20  optimize", 1)). 
20e50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20e60 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
20e70 6c 65 5f 76 32 28 0a 20 20 20 20 20 20 20 20 64  le_v2(.        d
20e80 62 2c 20 22 66 74 73 33 22 2c 20 26 66 74 73 33  b, "fts3", &fts3
20e90 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29  Module, (void *)
20ea0 70 48 61 73 68 2c 20 68 61 73 68 44 65 73 74 72  pHash, hashDestr
20eb0 6f 79 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  oy.    );.    if
20ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20ed0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20ee0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
20ef0 75 6c 65 5f 76 32 28 0a 20 20 20 20 20 20 20 20  ule_v2(.        
20f00 20 20 64 62 2c 20 22 66 74 73 34 22 2c 20 26 66    db, "fts4", &f
20f10 74 73 33 4d 6f 64 75 6c 65 2c 20 28 76 6f 69 64  ts3Module, (void
20f20 20 2a 29 70 48 61 73 68 2c 20 30 0a 20 20 20 20   *)pHash, 0.    
20f30 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20f50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20f60 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 54 6f  qlite3Fts3InitTo
20f70 6b 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 48  k(db, (void *)pH
20f80 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ash);.    }.    
20f90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
20fa0 0a 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
20fb0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 44 65 6c  as occurred. Del
20fc0 65 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ete the hash tab
20fd0 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  le and return th
20fe0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f  e error code. */
20ff0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21000 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
21010 28 20 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73  ( pHash ){.    s
21020 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 43 6c  qlite3Fts3HashCl
21030 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20  ear(pHash);.    
21040 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 61  sqlite3_free(pHa
21050 73 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  sh);.  }.  retur
21060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
21070 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73 33 4d  llocate an Fts3M
21080 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 66 6f  ultiSegReader fo
21090 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20  r each token in 
210a0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
210b0 65 61 64 65 64 0a 2a 2a 20 62 79 20 70 45 78 70  eaded.** by pExp
210c0 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 74 73  r. .**.** An Fts
210d0 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63  3SegReader objec
210e0 74 20 69 73 20 61 20 63 75 72 73 6f 72 20 74 68  t is a cursor th
210f0 61 74 20 63 61 6e 20 73 65 65 6b 20 6f 72 20 73  at can seek or s
21100 63 61 6e 20 61 20 72 61 6e 67 65 20 6f 66 0a 2a  can a range of.*
21110 2a 20 65 6e 74 72 69 65 73 20 77 69 74 68 69 6e  * entries within
21120 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
21130 74 20 62 2d 74 72 65 65 2e 20 41 6e 20 46 74 73  t b-tree. An Fts
21140 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
21150 75 73 65 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  uses multiple.**
21160 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 6f   Fts3SegReader o
21170 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 6c  bjects internall
21180 79 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  y to provide an 
21190 69 6e 74 65 72 66 61 63 65 20 74 6f 20 73 65 65  interface to see
211a0 6b 20 6f 72 20 73 63 61 6e 0a 2a 2a 20 77 69 74  k or scan.** wit
211b0 68 69 6e 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66  hin the union of
211c0 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 6f 66   all segments of
211d0 20 61 20 62 2d 74 72 65 65 2e 20 48 65 6e 63 65   a b-tree. Hence
211e0 20 74 68 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   the name..**.**
211f0 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   If the allocate
21200 64 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  d Fts3MultiSegRe
21210 61 64 65 72 20 6a 75 73 74 20 73 65 65 6b 73 20  ader just seeks 
21220 74 6f 20 61 20 73 69 6e 67 6c 65 20 65 6e 74 72  to a single entr
21230 79 20 69 6e 20 61 0a 2a 2a 20 73 65 67 6d 65 6e  y in a.** segmen
21240 74 20 62 2d 74 72 65 65 20 28 69 66 20 74 68 65  t b-tree (if the
21250 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 20 70   term is not a p
21260 72 65 66 69 78 20 6f 72 20 69 74 20 69 73 20 61  refix or it is a
21270 20 70 72 65 66 69 78 20 66 6f 72 20 77 68 69 63   prefix for whic
21280 68 0a 2a 2a 20 74 68 65 72 65 20 65 78 69 73 74  h.** there exist
21290 73 20 70 72 65 66 69 78 20 62 2d 74 72 65 65 20  s prefix b-tree 
212a0 6f 66 20 74 68 65 20 72 69 67 68 74 20 6c 65 6e  of the right len
212b0 67 74 68 29 20 74 68 65 6e 20 69 74 20 6d 61 79  gth) then it may
212c0 20 62 65 20 74 72 61 76 65 72 73 65 64 0a 2a 2a   be traversed.**
212d0 20 61 6e 64 20 6d 65 72 67 65 64 20 69 6e 63 72   and merged incr
212e0 65 6d 65 6e 74 61 6c 6c 79 2e 20 4f 74 68 65 72  ementally. Other
212f0 77 69 73 65 2c 20 69 74 20 68 61 73 20 74 6f 20  wise, it has to 
21300 62 65 20 6d 65 72 67 65 64 20 69 6e 74 6f 20 61  be merged into a
21310 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 0a 2a 2a 20  n in-memory .** 
21320 64 6f 63 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  doclist and then
21330 20 74 72 61 76 65 72 73 65 64 2e 0a 2a 2f 0a 73   traversed..*/.s
21340 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45  tatic void fts3E
21350 76 61 6c 41 6c 6c 6f 63 61 74 65 52 65 61 64 65  valAllocateReade
21360 72 73 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  rs(.  Fts3Cursor
21370 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
21380 20 20 20 20 20 20 2f 2a 20 46 54 53 20 63 75 72        /* FTS cur
21390 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  sor handle */.  
213a0 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 61 64  /* Allocate read
213d0 65 72 73 20 66 6f 72 20 74 68 69 73 20 65 78 70  ers for this exp
213e0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
213f0 20 2a 70 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20   *pnToken,      
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21410 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
21420 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 70  r of tokens in p
21430 68 72 61 73 65 2e 20 2a 2f 0a 20 20 69 6e 74 20  hrase. */.  int 
21440 2a 70 6e 4f 72 2c 20 20 20 20 20 20 20 20 20 20  *pnOr,          
21450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21460 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
21470 20 6f 66 20 4f 52 20 6e 6f 64 65 73 20 69 6e 20   of OR nodes in 
21480 65 78 70 72 2e 20 2a 2f 0a 20 20 69 6e 74 20 2a  expr. */.  int *
21490 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20  pRc             
214a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
214b0 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
214c0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
214d0 70 72 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  pr && SQLITE_OK=
214e0 3d 2a 70 52 63 20 29 7b 0a 20 20 20 20 69 66 28  =*pRc ){.    if(
214f0 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46   pExpr->eType==F
21500 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29  TSQUERY_PHRASE )
21510 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
21520 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20       int nToken 
21530 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  = pExpr->pPhrase
21540 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  ->nToken;.      
21550 2a 70 6e 54 6f 6b 65 6e 20 2b 3d 20 6e 54 6f 6b  *pnToken += nTok
21560 65 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  en;.      for(i=
21570 30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b 20 69 2b 2b  0; i<nToken; i++
21580 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 50  ){.        Fts3P
21590 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b  hraseToken *pTok
215a0 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 70 50 68  en = &pExpr->pPh
215b0 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 3b  rase->aToken[i];
215c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
215d0 3d 20 66 74 73 33 54 65 72 6d 53 65 67 52 65 61  = fts3TermSegRea
215e0 64 65 72 43 75 72 73 6f 72 28 70 43 73 72 2c 20  derCursor(pCsr, 
215f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  .            pTo
21600 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
21610 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 69 73 50 72 65  n, pToken->isPre
21620 66 69 78 2c 20 26 70 54 6f 6b 65 6e 2d 3e 70 53  fix, &pToken->pS
21630 65 67 63 73 72 0a 20 20 20 20 20 20 20 20 29 3b  egcsr.        );
21640 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
21650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21660 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72          *pRc = r
21670 63 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  c;.          ret
21680 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
21690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
216a0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 50 68 72  ert( pExpr->pPhr
216b0 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ase->iDoclistTok
216c0 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  en==0 );.      p
216d0 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 69  Expr->pPhrase->i
216e0 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20 3d 20 2d  DoclistToken = -
216f0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
21700 20 20 20 20 2a 70 6e 4f 72 20 2b 3d 20 28 70 45      *pnOr += (pE
21710 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
21720 55 45 52 59 5f 4f 52 29 3b 0a 20 20 20 20 20 20  UERY_OR);.      
21730 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65  fts3EvalAllocate
21740 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 45  Readers(pCsr, pE
21750 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 6e 54 6f  xpr->pLeft, pnTo
21760 6b 65 6e 2c 20 70 6e 4f 72 2c 20 70 52 63 29 3b  ken, pnOr, pRc);
21770 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 41  .      fts3EvalA
21780 6c 6c 6f 63 61 74 65 52 65 61 64 65 72 73 28 70  llocateReaders(p
21790 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Csr, pExpr->pRig
217a0 68 74 2c 20 70 6e 54 6f 6b 65 6e 2c 20 70 6e 4f  ht, pnToken, pnO
217b0 72 2c 20 70 52 63 29 3b 0a 20 20 20 20 7d 0a 20  r, pRc);.    }. 
217c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75   }.}../*.** Argu
217d0 6d 65 6e 74 73 20 70 4c 69 73 74 2f 6e 4c 69 73  ments pList/nLis
217e0 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 6f  t contain the do
217f0 63 6c 69 73 74 20 66 6f 72 20 74 6f 6b 65 6e 20  clist for token 
21800 69 54 6f 6b 65 6e 20 6f 66 20 70 68 72 61 73 65  iToken of phrase
21810 20 70 2e 0a 2a 2a 20 49 74 20 69 73 20 6d 65 72   p..** It is mer
21820 67 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ged into the mai
21830 6e 20 64 6f 63 6c 69 73 74 20 73 74 6f 72 65 64  n doclist stored
21840 20 69 6e 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61   in p->doclist.a
21850 41 6c 6c 2f 6e 41 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  All/nAll..**.** 
21860 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
21870 73 75 6d 65 73 20 74 68 61 74 20 70 4c 69 73 74  sumes that pList
21880 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
21890 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  fer allocated us
218a0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  ing.** sqlite3_m
218b0 61 6c 6c 6f 63 28 29 2e 20 54 68 69 73 20 66 75  alloc(). This fu
218c0 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20 72 65 73  nction takes res
218d0 70 6f 6e 73 69 62 69 6c 69 74 79 20 66 6f 72 20  ponsibility for 
218e0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
218f0 65 65 69 6e 67 20 74 68 65 20 62 75 66 66 65 72  eeing the buffer
21900 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
21910 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
21920 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
21930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
21940 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
21950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21960 74 73 33 45 76 61 6c 50 68 72 61 73 65 4d 65 72  ts3EvalPhraseMer
21970 67 65 54 6f 6b 65 6e 28 0a 20 20 46 74 73 33 54  geToken(.  Fts3T
21980 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
21990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
219a0 53 20 54 61 62 6c 65 20 70 6f 69 6e 74 65 72 20  S Table pointer 
219b0 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 20  */.  Fts3Phrase 
219c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
219d0 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 74       /* Phrase t
219e0 6f 20 6d 65 72 67 65 20 70 4c 69 73 74 2f 6e 4c  o merge pList/nL
219f0 69 73 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e  ist into */.  in
21a00 74 20 69 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t iToken,       
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21a20 20 54 6f 6b 65 6e 20 70 4c 69 73 74 2f 6e 4c 69   Token pList/nLi
21a30 73 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  st corresponds t
21a40 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69  o */.  char *pLi
21a50 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
21a60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21a70 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  r to doclist */.
21a80 20 20 69 6e 74 20 6e 4c 69 73 74 20 20 20 20 20    int nList     
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
21ab0 79 74 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f  ytes in pList */
21ac0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
21ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
21ae0 72 74 28 20 69 54 6f 6b 65 6e 21 3d 70 2d 3e 69  rt( iToken!=p->i
21af0 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20 29 3b 0a  DoclistToken );.
21b00 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
21b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
21b20 72 65 65 28 70 2d 3e 64 6f 63 6c 69 73 74 2e 61  ree(p->doclist.a
21b30 41 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 64 6f 63  All);.    p->doc
21b40 6c 69 73 74 2e 61 41 6c 6c 20 3d 20 30 3b 0a 20  list.aAll = 0;. 
21b50 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41     p->doclist.nA
21b60 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 65  ll = 0;.  }..  e
21b70 6c 73 65 20 69 66 28 20 70 2d 3e 69 44 6f 63 6c  lse if( p->iDocl
21b80 69 73 74 54 6f 6b 65 6e 3c 30 20 29 7b 0a 20 20  istToken<0 ){.  
21b90 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c    p->doclist.aAl
21ba0 6c 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70  l = pList;.    p
21bb0 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 20 3d  ->doclist.nAll =
21bc0 20 6e 4c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 65   nList;.  }..  e
21bd0 6c 73 65 20 69 66 28 20 70 2d 3e 64 6f 63 6c 69  lse if( p->docli
21be0 73 74 2e 61 41 6c 6c 3d 3d 30 20 29 7b 0a 20 20  st.aAll==0 ){.  
21bf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
21c00 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 65 6c  List);.  }..  el
21c10 73 65 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  se {.    char *p
21c20 4c 65 66 74 3b 0a 20 20 20 20 63 68 61 72 20 2a  Left;.    char *
21c30 70 52 69 67 68 74 3b 0a 20 20 20 20 69 6e 74 20  pRight;.    int 
21c40 6e 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 6e  nLeft;.    int n
21c50 52 69 67 68 74 3b 0a 20 20 20 20 69 6e 74 20 6e  Right;.    int n
21c60 44 69 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 70  Diff;..    if( p
21c70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3c  ->iDoclistToken<
21c80 69 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  iToken ){.      
21c90 70 4c 65 66 74 20 3d 20 70 2d 3e 64 6f 63 6c 69  pLeft = p->docli
21ca0 73 74 2e 61 41 6c 6c 3b 0a 20 20 20 20 20 20 6e  st.aAll;.      n
21cb0 4c 65 66 74 20 3d 20 70 2d 3e 64 6f 63 6c 69 73  Left = p->doclis
21cc0 74 2e 6e 41 6c 6c 3b 0a 20 20 20 20 20 20 70 52  t.nAll;.      pR
21cd0 69 67 68 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  ight = pList;.  
21ce0 20 20 20 20 6e 52 69 67 68 74 20 3d 20 6e 4c 69      nRight = nLi
21cf0 73 74 3b 0a 20 20 20 20 20 20 6e 44 69 66 66 20  st;.      nDiff 
21d00 3d 20 69 54 6f 6b 65 6e 20 2d 20 70 2d 3e 69 44  = iToken - p->iD
21d10 6f 63 6c 69 73 74 54 6f 6b 65 6e 3b 0a 20 20 20  oclistToken;.   
21d20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
21d30 69 67 68 74 20 3d 20 70 2d 3e 64 6f 63 6c 69 73  ight = p->doclis
21d40 74 2e 61 41 6c 6c 3b 0a 20 20 20 20 20 20 6e 52  t.aAll;.      nR
21d50 69 67 68 74 20 3d 20 70 2d 3e 64 6f 63 6c 69 73  ight = p->doclis
21d60 74 2e 6e 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4c  t.nAll;.      pL
21d70 65 66 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  eft = pList;.   
21d80 20 20 20 6e 4c 65 66 74 20 3d 20 6e 4c 69 73 74     nLeft = nList
21d90 3b 0a 20 20 20 20 20 20 6e 44 69 66 66 20 3d 20  ;.      nDiff = 
21da0 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e  p->iDoclistToken
21db0 20 2d 20 69 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d   - iToken;.    }
21dc0 0a 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44  ..    rc = fts3D
21dd0 6f 63 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67  oclistPhraseMerg
21de0 65 28 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  e(.        pTab-
21df0 3e 62 44 65 73 63 49 64 78 2c 20 6e 44 69 66 66  >bDescIdx, nDiff
21e00 2c 20 70 4c 65 66 74 2c 20 6e 4c 65 66 74 2c 20  , pLeft, nLeft, 
21e10 26 70 52 69 67 68 74 2c 20 26 6e 52 69 67 68 74  &pRight, &nRight
21e20 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
21e30 74 65 33 5f 66 72 65 65 28 70 4c 65 66 74 29 3b  te3_free(pLeft);
21e40 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e  .    p->doclist.
21e50 61 41 6c 6c 20 3d 20 70 52 69 67 68 74 3b 0a 20  aAll = pRight;. 
21e60 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41     p->doclist.nA
21e70 6c 6c 20 3d 20 6e 52 69 67 68 74 3b 0a 20 20 7d  ll = nRight;.  }
21e80 0a 0a 20 20 69 66 28 20 69 54 6f 6b 65 6e 3e 70  ..  if( iToken>p
21e90 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20  ->iDoclistToken 
21ea0 29 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ) p->iDoclistTok
21eb0 65 6e 20 3d 20 69 54 6f 6b 65 6e 3b 0a 20 20 72  en = iToken;.  r
21ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21ed0 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64 6f 63 6c  ** Load the docl
21ee0 69 73 74 20 66 6f 72 20 70 68 72 61 73 65 20 70  ist for phrase p
21ef0 20 69 6e 74 6f 20 70 2d 3e 64 6f 63 6c 69 73 74   into p->doclist
21f00 2e 61 41 6c 6c 2f 6e 41 6c 6c 2e 20 54 68 65 20  .aAll/nAll. The 
21f10 6c 6f 61 64 65 64 20 64 6f 63 6c 69 73 74 0a 2a  loaded doclist.*
21f20 2a 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20  * does not take 
21f30 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
21f40 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a 2a  into account..**
21f50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21f60 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
21f70 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74  error occurs, ot
21f80 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
21f90 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
21fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
21fb0 45 76 61 6c 50 68 72 61 73 65 4c 6f 61 64 28 0a  EvalPhraseLoad(.
21fc0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
21fd0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
21fe0 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72 20    /* FTS Cursor 
21ff0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
22000 50 68 72 61 73 65 20 2a 70 20 20 20 20 20 20 20  Phrase *p       
22010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22020 68 72 61 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  hrase object */.
22030 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
22040 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c  pTab = (Fts3Tabl
22050 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
22060 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 54 6f 6b  Vtab;.  int iTok
22070 65 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  en;.  int rc = S
22080 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72  QLITE_OK;..  for
22090 28 69 54 6f 6b 65 6e 3d 30 3b 20 72 63 3d 3d 53  (iToken=0; rc==S
220a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 54 6f 6b  QLITE_OK && iTok
220b0 65 6e 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 54  en<p->nToken; iT
220c0 6f 6b 65 6e 2b 2b 29 7b 0a 20 20 20 20 46 74 73  oken++){.    Fts
220d0 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
220e0 6f 6b 65 6e 20 3d 20 26 70 2d 3e 61 54 6f 6b 65  oken = &p->aToke
220f0 6e 5b 69 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 61  n[iToken];.    a
22100 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70  ssert( pToken->p
22110 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 70  Deferred==0 || p
22120 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 3d 3d  Token->pSegcsr==
22130 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 54  0 );..    if( pT
22140 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 20 29 7b  oken->pSegcsr ){
22150 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 68 69 73  .      int nThis
22160 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
22170 20 2a 70 54 68 69 73 20 3d 20 30 3b 0a 20 20 20   *pThis = 0;.   
22180 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d     rc = fts3Term
22190 53 65 6c 65 63 74 28 70 54 61 62 2c 20 70 54 6f  Select(pTab, pTo
221a0 6b 65 6e 2c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c  ken, p->iColumn,
221b0 20 26 6e 54 68 69 73 2c 20 26 70 54 68 69 73 29   &nThis, &pThis)
221c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
221d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
221e0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76       rc = fts3Ev
221f0 61 6c 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b  alPhraseMergeTok
22200 65 6e 28 70 54 61 62 2c 20 70 2c 20 69 54 6f 6b  en(pTab, p, iTok
22210 65 6e 2c 20 70 54 68 69 73 2c 20 6e 54 68 69 73  en, pThis, nThis
22220 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
22240 6b 65 6e 2d 3e 70 53 65 67 63 73 72 3d 3d 30 20  ken->pSegcsr==0 
22250 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
22260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22270 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22280 61 6c 6c 65 64 20 6f 6e 20 65 61 63 68 20 70 68  alled on each ph
22290 72 61 73 65 20 61 66 74 65 72 20 74 68 65 20 70  rase after the p
222a0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 20 66 6f  osition lists fo
222b0 72 0a 2a 2a 20 61 6e 79 20 64 65 66 65 72 72 65  r.** any deferre
222c0 64 20 74 6f 6b 65 6e 73 20 68 61 76 65 20 62 65  d tokens have be
222d0 65 6e 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  en loaded into m
222e0 65 6d 6f 72 79 2e 20 49 74 20 75 70 64 61 74 65  emory. It update
222f0 73 20 74 68 65 20 70 68 72 61 73 65 73 0a 2a 2a  s the phrases.**
22300 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
22310 6e 20 6c 69 73 74 20 74 6f 20 69 6e 63 6c 75 64  n list to includ
22320 65 20 6f 6e 6c 79 20 74 68 6f 73 65 20 70 6f 73  e only those pos
22330 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
22340 72 65 61 6c 6c 79 0a 2a 2a 20 69 6e 73 74 61 6e  really.** instan
22350 63 65 73 20 6f 66 20 74 68 65 20 70 68 72 61 73  ces of the phras
22360 65 20 28 61 66 74 65 72 20 63 6f 6e 73 69 64 65  e (after conside
22370 72 69 6e 67 20 64 65 66 65 72 72 65 64 20 74 6f  ring deferred to
22380 6b 65 6e 73 29 2e 20 49 66 20 74 68 69 73 0a 2a  kens). If this.*
22390 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
223a0 20 70 68 72 61 73 65 20 64 6f 65 73 20 6e 6f 74   phrase does not
223b0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 63   appear in the c
223c0 75 72 72 65 6e 74 20 72 6f 77 2c 20 64 6f 63 6c  urrent row, docl
223d0 69 73 74 2e 70 4c 69 73 74 0a 2a 2a 20 61 6e 64  ist.pList.** and
223e0 20 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 61   doclist.nList a
223f0 72 65 20 62 6f 74 68 20 7a 65 72 6f 65 64 2e 0a  re both zeroed..
22400 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
22410 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
22420 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
22430 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  otherwise an SQL
22440 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
22450 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
22460 73 33 45 76 61 6c 44 65 66 65 72 72 65 64 50 68  s3EvalDeferredPh
22470 72 61 73 65 28 46 74 73 33 43 75 72 73 6f 72 20  rase(Fts3Cursor 
22480 2a 70 43 73 72 2c 20 46 74 73 33 50 68 72 61 73  *pCsr, Fts3Phras
22490 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69  e *pPhrase){.  i
224a0 6e 74 20 69 54 6f 6b 65 6e 3b 20 20 20 20 20 20  nt iToken;      
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
224c0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
224d0 65 20 74 68 72 6f 75 67 68 20 70 68 72 61 73 65  e through phrase
224e0 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 63 68 61   tokens */.  cha
224f0 72 20 2a 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r *aPoslist = 0;
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22510 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  Position list fo
22520 72 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  r deferred token
22530 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 6c  s */.  int nPosl
22540 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ist = 0;        
22550 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22560 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 50 6f   of bytes in aPo
22570 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69  slist */.  int i
22580 50 72 65 76 20 3d 20 2d 31 3b 20 20 20 20 20 20  Prev = -1;      
22590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
225a0 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 70 72  ken number of pr
225b0 65 76 69 6f 75 73 20 64 65 66 65 72 72 65 64 20  evious deferred 
225c0 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  token */..  asse
225d0 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63  rt( pPhrase->doc
225e0 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 3d 3d  list.bFreeList==
225f0 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 54 6f 6b  0 );..  for(iTok
22600 65 6e 3d 30 3b 20 69 54 6f 6b 65 6e 3c 70 50 68  en=0; iToken<pPh
22610 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 54  rase->nToken; iT
22620 6f 6b 65 6e 2b 2b 29 7b 0a 20 20 20 20 46 74 73  oken++){.    Fts
22630 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54  3PhraseToken *pT
22640 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61 73 65 2d  oken = &pPhrase-
22650 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65 6e 5d 3b  >aToken[iToken];
22660 0a 20 20 20 20 46 74 73 33 44 65 66 65 72 72 65  .    Fts3Deferre
22670 64 54 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65  dToken *pDeferre
22680 64 20 3d 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66  d = pToken->pDef
22690 65 72 72 65 64 3b 0a 0a 20 20 20 20 69 66 28 20  erred;..    if( 
226a0 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20  pDeferred ){.   
226b0 20 20 20 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a     char *pList;.
226c0 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
226d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
226e0 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72  sqlite3Fts3Defer
226f0 72 65 64 54 6f 6b 65 6e 4c 69 73 74 28 70 44 65  redTokenList(pDe
22700 66 65 72 72 65 64 2c 20 26 70 4c 69 73 74 2c 20  ferred, &pList, 
22710 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69  &nList);.      i
22720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22730 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
22740 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d       if( pList==
22750 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
22760 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c 69  ite3_free(aPosli
22770 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 50 68  st);.        pPh
22780 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
22790 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
227a0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
227b0 74 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t.nList = 0;.   
227c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
227d0 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 20 20 7d 65  TE_OK;..      }e
227e0 6c 73 65 20 69 66 28 20 61 50 6f 73 6c 69 73 74  lse if( aPoslist
227f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
22800 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b  Poslist = pList;
22810 0a 20 20 20 20 20 20 20 20 6e 50 6f 73 6c 69 73  .        nPoslis
22820 74 20 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 20 20  t = nList;..    
22830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22840 20 63 68 61 72 20 2a 61 4f 75 74 20 3d 20 70 4c   char *aOut = pL
22850 69 73 74 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ist;.        cha
22860 72 20 2a 70 31 20 3d 20 61 50 6f 73 6c 69 73 74  r *p1 = aPoslist
22870 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
22880 70 32 20 3d 20 61 4f 75 74 3b 0a 0a 20 20 20 20  p2 = aOut;..    
22890 20 20 20 20 61 73 73 65 72 74 28 20 69 50 72 65      assert( iPre
228a0 76 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  v>=0 );.        
228b0 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73  fts3PoslistPhras
228c0 65 4d 65 72 67 65 28 26 61 4f 75 74 2c 20 69 54  eMerge(&aOut, iT
228d0 6f 6b 65 6e 2d 69 50 72 65 76 2c 20 30 2c 20 31  oken-iPrev, 0, 1
228e0 2c 20 26 70 31 2c 20 26 70 32 29 3b 0a 20 20 20  , &p1, &p2);.   
228f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22900 65 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  e(aPoslist);.   
22910 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d 20       aPoslist = 
22920 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  pList;.        n
22930 50 6f 73 6c 69 73 74 20 3d 20 28 69 6e 74 29 28  Poslist = (int)(
22940 61 4f 75 74 20 2d 20 61 50 6f 73 6c 69 73 74 29  aOut - aPoslist)
22950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  ;.        if( nP
22960 6f 73 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  oslist==0 ){.   
22970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22980 72 65 65 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20  ree(aPoslist);. 
22990 20 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65           pPhrase
229a0 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20  ->doclist.pList 
229b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
229c0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
229d0 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  nList = 0;.     
229e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
229f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
22a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22a10 50 72 65 76 20 3d 20 69 54 6f 6b 65 6e 3b 0a 20  Prev = iToken;. 
22a20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
22a30 69 50 72 65 76 3e 3d 30 20 29 7b 0a 20 20 20 20  iPrev>=0 ){.    
22a40 69 6e 74 20 6e 4d 61 78 55 6e 64 65 66 65 72 72  int nMaxUndeferr
22a50 65 64 20 3d 20 70 50 68 72 61 73 65 2d 3e 69 44  ed = pPhrase->iD
22a60 6f 63 6c 69 73 74 54 6f 6b 65 6e 3b 0a 20 20 20  oclistToken;.   
22a70 20 69 66 28 20 6e 4d 61 78 55 6e 64 65 66 65 72   if( nMaxUndefer
22a80 72 65 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 70  red<0 ){.      p
22a90 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
22aa0 70 4c 69 73 74 20 3d 20 61 50 6f 73 6c 69 73 74  pList = aPoslist
22ab0 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
22ac0 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d  >doclist.nList =
22ad0 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20   nPoslist;.     
22ae0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
22af0 74 2e 69 44 6f 63 69 64 20 3d 20 70 43 73 72 2d  t.iDocid = pCsr-
22b00 3e 69 50 72 65 76 49 64 3b 0a 20 20 20 20 20 20  >iPrevId;.      
22b10 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
22b20 2e 62 46 72 65 65 4c 69 73 74 20 3d 20 31 3b 0a  .bFreeList = 1;.
22b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22b40 20 69 6e 74 20 6e 44 69 73 74 61 6e 63 65 3b 0a   int nDistance;.
22b50 20 20 20 20 20 20 63 68 61 72 20 2a 70 31 3b 0a        char *p1;.
22b60 20 20 20 20 20 20 63 68 61 72 20 2a 70 32 3b 0a        char *p2;.
22b70 20 20 20 20 20 20 63 68 61 72 20 2a 61 4f 75 74        char *aOut
22b80 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4d 61  ;..      if( nMa
22b90 78 55 6e 64 65 66 65 72 72 65 64 3e 69 50 72 65  xUndeferred>iPre
22ba0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 20  v ){.        p1 
22bb0 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  = aPoslist;.    
22bc0 20 20 20 20 70 32 20 3d 20 70 50 68 72 61 73 65      p2 = pPhrase
22bd0 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b  ->doclist.pList;
22be0 0a 20 20 20 20 20 20 20 20 6e 44 69 73 74 61 6e  .        nDistan
22bf0 63 65 20 3d 20 6e 4d 61 78 55 6e 64 65 66 65 72  ce = nMaxUndefer
22c00 72 65 64 20 2d 20 69 50 72 65 76 3b 0a 20 20 20  red - iPrev;.   
22c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c20 20 20 70 31 20 3d 20 70 50 68 72 61 73 65 2d 3e    p1 = pPhrase->
22c30 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  doclist.pList;. 
22c40 20 20 20 20 20 20 20 70 32 20 3d 20 61 50 6f 73         p2 = aPos
22c50 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 44  list;.        nD
22c60 69 73 74 61 6e 63 65 20 3d 20 69 50 72 65 76 20  istance = iPrev 
22c70 2d 20 6e 4d 61 78 55 6e 64 65 66 65 72 72 65 64  - nMaxUndeferred
22c80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
22c90 20 61 4f 75 74 20 3d 20 28 63 68 61 72 20 2a 29   aOut = (char *)
22ca0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
22cb0 50 6f 73 6c 69 73 74 2b 38 29 3b 0a 20 20 20 20  Poslist+8);.    
22cc0 20 20 69 66 28 20 21 61 4f 75 74 20 29 7b 0a 20    if( !aOut ){. 
22cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22ce0 72 65 65 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20  ree(aPoslist);. 
22cf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
22d00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22d10 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
22d20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
22d30 74 2e 70 4c 69 73 74 20 3d 20 61 4f 75 74 3b 0a  t.pList = aOut;.
22d40 20 20 20 20 20 20 69 66 28 20 66 74 73 33 50 6f        if( fts3Po
22d50 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
22d60 28 26 61 4f 75 74 2c 20 6e 44 69 73 74 61 6e 63  (&aOut, nDistanc
22d70 65 2c 20 30 2c 20 31 2c 20 26 70 31 2c 20 26 70  e, 0, 1, &p1, &p
22d80 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  2) ){.        pP
22d90 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62  hrase->doclist.b
22da0 46 72 65 65 4c 69 73 74 20 3d 20 31 3b 0a 20 20  FreeList = 1;.  
22db0 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
22dc0 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20 28  oclist.nList = (
22dd0 69 6e 74 29 28 61 4f 75 74 20 2d 20 70 50 68 72  int)(aOut - pPhr
22de0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
22df0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
22e00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22e10 33 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20  3_free(aOut);.  
22e20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
22e30 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30  oclist.pList = 0
22e40 3b 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73  ;.        pPhras
22e50 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74  e->doclist.nList
22e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
22e70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22e80 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  (aPoslist);.    
22e90 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
22ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22eb0 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62  .** Maximum numb
22ec0 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 61 20 70  er of tokens a p
22ed0 68 72 61 73 65 20 6d 61 79 20 68 61 76 65 20 74  hrase may have t
22ee0 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
22ef0 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 63 72 65  for the.** incre
22f00 6d 65 6e 74 61 6c 20 64 6f 63 6c 69 73 74 73 20  mental doclists 
22f10 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 23 64 65  strategy..*/.#de
22f20 66 69 6e 65 20 4d 41 58 5f 49 4e 43 52 5f 50 48  fine MAX_INCR_PH
22f30 52 41 53 45 5f 54 4f 4b 45 4e 53 20 34 0a 0a 2f  RASE_TOKENS 4../
22f40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22f50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  on is called for
22f60 20 65 61 63 68 20 46 74 73 33 50 68 72 61 73 65   each Fts3Phrase
22f70 20 69 6e 20 61 20 66 75 6c 6c 2d 74 65 78 74 20   in a full-text 
22f80 71 75 65 72 79 20 0a 2a 2a 20 65 78 70 72 65 73  query .** expres
22f90 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69 61 6c 69  sion to initiali
22fa0 7a 65 20 74 68 65 20 6d 65 63 68 61 6e 69 73 6d  ze the mechanism
22fb0 20 66 6f 72 20 72 65 74 75 72 6e 69 6e 67 20 72   for returning r
22fc0 6f 77 73 2e 20 4f 6e 63 65 20 74 68 69 73 0a 2a  ows. Once this.*
22fd0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  * function has b
22fe0 65 65 6e 20 63 61 6c 6c 65 64 20 73 75 63 63 65  een called succe
22ff0 73 73 66 75 6c 6c 79 20 6f 6e 20 61 6e 20 46 74  ssfully on an Ft
23000 73 33 50 68 72 61 73 65 2c 20 69 74 20 6d 61 79  s3Phrase, it may
23010 20 62 65 0a 2a 2a 20 75 73 65 64 20 77 69 74 68   be.** used with
23020 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65 4e   fts3EvalPhraseN
23030 65 78 74 28 29 20 74 6f 20 69 74 65 72 61 74 65  ext() to iterate
23040 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 74   through the mat
23050 63 68 69 6e 67 20 64 6f 63 69 64 73 2e 0a 2a 2a  ching docids..**
23060 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
23070 20 62 4f 70 74 4f 6b 20 69 73 20 74 72 75 65 2c   bOptOk is true,
23080 20 74 68 65 6e 20 74 68 65 20 70 68 72 61 73 65   then the phrase
23090 20 6d 61 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74   may (or may not
230a0 29 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 63  ) use the.** inc
230b0 72 65 6d 65 6e 74 61 6c 20 6c 6f 61 64 69 6e 67  remental loading
230c0 20 73 74 72 61 74 65 67 79 2e 20 4f 74 68 65 72   strategy. Other
230d0 77 69 73 65 2c 20 74 68 65 20 65 6e 74 69 72 65  wise, the entire
230e0 20 64 6f 63 6c 69 73 74 20 69 73 20 6c 6f 61 64   doclist is load
230f0 65 64 20 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72  ed into.** memor
23100 79 20 77 69 74 68 69 6e 20 74 68 69 73 20 63 61  y within this ca
23110 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ll..**.** SQLITE
23120 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
23130 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
23140 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  rs, otherwise an
23150 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
23160 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
23170 74 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65  t fts3EvalPhrase
23180 53 74 61 72 74 28 46 74 73 33 43 75 72 73 6f 72  Start(Fts3Cursor
23190 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 4f 70 74   *pCsr, int bOpt
231a0 4f 6b 2c 20 46 74 73 33 50 68 72 61 73 65 20 2a  Ok, Fts3Phrase *
231b0 70 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  p){.  Fts3Table 
231c0 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
231d0 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
231e0 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVtab;.  int rc 
231f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
23200 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
23210 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
23220 69 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  i;..  /* Determi
23230 6e 65 20 69 66 20 64 6f 63 6c 69 73 74 73 20 6d  ne if doclists m
23240 61 79 20 62 65 20 6c 6f 61 64 65 64 20 66 72 6f  ay be loaded fro
23250 6d 20 64 69 73 6b 20 69 6e 63 72 65 6d 65 6e 74  m disk increment
23260 61 6c 6c 79 2e 20 54 68 69 73 20 69 73 0a 20 20  ally. This is.  
23270 2a 2a 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ** possible if t
23280 68 65 20 62 4f 70 74 4f 6b 20 61 72 67 75 6d 65  he bOptOk argume
23290 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  nt is true, the 
232a0 46 54 53 20 64 6f 63 6c 69 73 74 73 20 77 69 6c  FTS doclists wil
232b0 6c 20 62 65 0a 20 20 2a 2a 20 73 63 61 6e 6e 65  l be.  ** scanne
232c0 64 20 69 6e 20 66 6f 72 77 61 72 64 20 6f 72 64  d in forward ord
232d0 65 72 2c 20 61 6e 64 20 74 68 65 20 70 68 72 61  er, and the phra
232e0 73 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 0a  se consists of .
232f0 20 20 2a 2a 20 4d 41 58 5f 49 4e 43 52 5f 50 48    ** MAX_INCR_PH
23300 52 41 53 45 5f 54 4f 4b 45 4e 53 20 6f 72 20 66  RASE_TOKENS or f
23310 65 77 65 72 20 74 6f 6b 65 6e 73 2c 20 6e 6f 6e  ewer tokens, non
23320 65 20 6f 66 20 77 68 69 63 68 20 61 72 65 20 61  e of which are a
23330 72 65 20 22 5e 66 69 72 73 74 22 0a 20 20 2a 2a  re "^first".  **
23340 20 74 6f 6b 65 6e 73 20 6f 72 20 70 72 65 66 69   tokens or prefi
23350 78 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 63 61  x tokens that ca
23360 6e 6e 6f 74 20 75 73 65 20 61 20 70 72 65 66 69  nnot use a prefi
23370 78 2d 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 69  x-index.  */.  i
23380 6e 74 20 62 48 61 76 65 49 6e 63 72 20 3d 20 30  nt bHaveIncr = 0
23390 3b 0a 20 20 69 6e 74 20 62 49 6e 63 72 4f 6b 20  ;.  int bIncrOk 
233a0 3d 20 28 62 4f 70 74 4f 6b 20 0a 20 20 20 26 26  = (bOptOk .   &&
233b0 20 70 43 73 72 2d 3e 62 44 65 73 63 3d 3d 70 54   pCsr->bDesc==pT
233c0 61 62 2d 3e 62 44 65 73 63 49 64 78 20 0a 20 20  ab->bDescIdx .  
233d0 20 26 26 20 70 2d 3e 6e 54 6f 6b 65 6e 3c 3d 4d   && p->nToken<=M
233e0 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54  AX_INCR_PHRASE_T
233f0 4f 4b 45 4e 53 20 26 26 20 70 2d 3e 6e 54 6f 6b  OKENS && p->nTok
23400 65 6e 3e 30 0a 23 69 66 64 65 66 20 53 51 4c 49  en>0.#ifdef SQLI
23410 54 45 5f 54 45 53 54 0a 20 20 20 26 26 20 70 54  TE_TEST.   && pT
23420 61 62 2d 3e 62 4e 6f 49 6e 63 72 44 6f 63 6c 69  ab->bNoIncrDocli
23430 73 74 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29  st==0.#endif.  )
23440 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 62 49 6e  ;.  for(i=0; bIn
23450 63 72 4f 6b 3d 3d 31 20 26 26 20 69 3c 70 2d 3e  crOk==1 && i<p->
23460 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  nToken; i++){.  
23470 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
23480 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70 2d 3e  n *pToken = &p->
23490 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 69  aToken[i];.    i
234a0 66 28 20 70 54 6f 6b 65 6e 2d 3e 62 46 69 72 73  f( pToken->bFirs
234b0 74 20 7c 7c 20 28 70 54 6f 6b 65 6e 2d 3e 70 53  t || (pToken->pS
234c0 65 67 63 73 72 21 3d 30 20 26 26 20 21 70 54 6f  egcsr!=0 && !pTo
234d0 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2d 3e 62 4c  ken->pSegcsr->bL
234e0 6f 6f 6b 75 70 29 20 29 7b 0a 20 20 20 20 20 20  ookup) ){.      
234f0 62 49 6e 63 72 4f 6b 20 3d 20 30 3b 0a 20 20 20  bIncrOk = 0;.   
23500 20 7d 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65   }.    if( pToke
23510 6e 2d 3e 70 53 65 67 63 73 72 20 29 20 62 48 61  n->pSegcsr ) bHa
23520 76 65 49 6e 63 72 20 3d 20 31 3b 0a 20 20 7d 0a  veIncr = 1;.  }.
23530 0a 20 20 69 66 28 20 62 49 6e 63 72 4f 6b 20 26  .  if( bIncrOk &
23540 26 20 62 48 61 76 65 49 6e 63 72 20 29 7b 0a 20  & bHaveIncr ){. 
23550 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 69 6e     /* Use the in
23560 63 72 65 6d 65 6e 74 61 6c 20 61 70 70 72 6f 61  cremental approa
23570 63 68 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ch. */.    int i
23580 43 6f 6c 20 3d 20 28 70 2d 3e 69 43 6f 6c 75 6d  Col = (p->iColum
23590 6e 20 3e 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 75  n >= pTab->nColu
235a0 6d 6e 20 3f 20 2d 31 20 3a 20 70 2d 3e 69 43 6f  mn ? -1 : p->iCo
235b0 6c 75 6d 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69  lumn);.    for(i
235c0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
235d0 4b 20 26 26 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e  K && i<p->nToken
235e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
235f0 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
23600 54 6f 6b 65 6e 20 3d 20 26 70 2d 3e 61 54 6f 6b  Token = &p->aTok
23610 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73  en[i];.      Fts
23620 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20  3MultiSegReader 
23630 2a 70 53 65 67 63 73 72 20 3d 20 70 54 6f 6b 65  *pSegcsr = pToke
23640 6e 2d 3e 70 53 65 67 63 73 72 3b 0a 20 20 20 20  n->pSegcsr;.    
23650 20 20 69 66 28 20 70 53 65 67 63 73 72 20 29 7b    if( pSegcsr ){
23660 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23670 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72  lite3Fts3MsrIncr
23680 53 74 61 72 74 28 70 54 61 62 2c 20 70 53 65 67  Start(pTab, pSeg
23690 63 73 72 2c 20 69 43 6f 6c 2c 20 70 54 6f 6b 65  csr, iCol, pToke
236a0 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 29  n->z, pToken->n)
236b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
236c0 20 20 20 20 70 2d 3e 62 49 6e 63 72 20 3d 20 31      p->bIncr = 1
236d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
236e0 2a 20 4c 6f 61 64 20 74 68 65 20 66 75 6c 6c 20  * Load the full 
236f0 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20  doclist for the 
23700 70 68 72 61 73 65 20 69 6e 74 6f 20 6d 65 6d 6f  phrase into memo
23710 72 79 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ry. */.    rc = 
23720 66 74 73 33 45 76 61 6c 50 68 72 61 73 65 4c 6f  fts3EvalPhraseLo
23730 61 64 28 70 43 73 72 2c 20 70 29 3b 0a 20 20 20  ad(pCsr, p);.   
23740 20 70 2d 3e 62 49 6e 63 72 20 3d 20 30 3b 0a 20   p->bIncr = 0;. 
23750 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
23760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
23770 2d 3e 6e 54 6f 6b 65 6e 3c 31 20 7c 7c 20 70 2d  ->nToken<1 || p-
23780 3e 61 54 6f 6b 65 6e 5b 30 5d 2e 70 53 65 67 63  >aToken[0].pSegc
23790 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 62 49 6e 63  sr==0 || p->bInc
237a0 72 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  r );.  return rc
237b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
237c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
237d0 20 74 6f 20 69 74 65 72 61 74 65 20 62 61 63 6b   to iterate back
237e0 77 61 72 64 73 20 28 66 72 6f 6d 20 74 68 65 20  wards (from the 
237f0 65 6e 64 20 74 6f 20 73 74 61 72 74 29 20 0a 2a  end to start) .*
23800 2a 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73  * through doclis
23810 74 73 2e 20 49 74 20 69 73 20 75 73 65 64 20 62  ts. It is used b
23820 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 6f  y this module to
23830 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
23840 20 70 68 72 61 73 65 0a 2a 2a 20 64 6f 63 6c 69   phrase.** docli
23850 73 74 73 20 69 6e 20 72 65 76 65 72 73 65 20 61  sts in reverse a
23860 6e 64 20 62 79 20 74 68 65 20 66 74 73 33 5f 77  nd by the fts3_w
23870 72 69 74 65 2e 63 20 6d 6f 64 75 6c 65 20 74 6f  rite.c module to
23880 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
23890 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d  .** pending-term
238a0 73 20 6c 69 73 74 73 20 77 68 65 6e 20 77 72 69  s lists when wri
238b0 74 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ting to database
238c0 73 20 77 69 74 68 20 22 6f 72 64 65 72 3d 64 65  s with "order=de
238d0 73 63 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  sc"..**.** The d
238e0 6f 63 6c 69 73 74 20 6d 61 79 20 62 65 20 73 6f  oclist may be so
238f0 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64 69 6e  rted in ascendin
23900 67 20 28 70 61 72 61 6d 65 74 65 72 20 62 44 65  g (parameter bDe
23910 73 63 49 64 78 3d 3d 30 29 20 6f 72 20 0a 2a 2a  scIdx==0) or .**
23920 20 64 65 73 63 65 6e 64 69 6e 67 20 28 70 61 72   descending (par
23930 61 6d 65 74 65 72 20 62 44 65 73 63 49 64 78 3d  ameter bDescIdx=
23940 3d 31 29 20 6f 72 64 65 72 20 6f 66 20 64 6f 63  =1) order of doc
23950 69 64 2e 20 52 65 67 61 72 64 6c 65 73 73 2c 20  id. Regardless, 
23960 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
23970 20 69 74 65 72 61 74 65 73 20 66 72 6f 6d 20 74   iterates from t
23980 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 6f  he end of the do
23990 63 6c 69 73 74 20 74 6f 20 74 68 65 20 62 65 67  clist to the beg
239a0 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  inning..*/.void 
239b0 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
239c0 73 74 50 72 65 76 28 0a 20 20 69 6e 74 20 62 44  stPrev(.  int bD
239d0 65 73 63 49 64 78 2c 20 20 20 20 20 20 20 20 20  escIdx,         
239e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
239f0 65 20 69 66 20 74 68 65 20 64 6f 63 6c 69 73 74  e if the doclist
23a00 20 69 73 20 64 65 73 63 20 2a 2f 0a 20 20 63 68   is desc */.  ch
23a10 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20  ar *aDoclist,   
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a30 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 69   Pointer to enti
23a40 72 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  re doclist */.  
23a50 69 6e 74 20 6e 44 6f 63 6c 69 73 74 2c 20 20 20  int nDoclist,   
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 44 6f  /* Length of aDo
23a80 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  clist in bytes *
23a90 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 49 74 65  /.  char **ppIte
23aa0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
23ab0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49      /* IN/OUT: I
23ac0 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 65 72 20  terator pointer 
23ad0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
23ae0 36 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20  64 *piDocid,    
23af0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
23b00 44 6f 63 69 64 20 70 6f 69 6e 74 65 72 20 2a 2f  Docid pointer */
23b10 0a 20 20 69 6e 74 20 2a 70 6e 4c 69 73 74 2c 20  .  int *pnList, 
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 69 73 74 20     /* OUT: List 
23b40 6c 65 6e 67 74 68 20 70 6f 69 6e 74 65 72 20 2a  length pointer *
23b50 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66 20 20 20  /.  u8 *pbEof   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 2d      /* OUT: End-
23b80 6f 66 2d 66 69 6c 65 20 66 6c 61 67 20 2a 2f 0a  of-file flag */.
23b90 29 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 2a  ){.  char *p = *
23ba0 70 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  ppIter;..  asser
23bb0 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 3b  t( nDoclist>0 );
23bc0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 45 6f  .  assert( *pbEo
23bd0 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  f==0 );.  assert
23be0 28 20 70 20 7c 7c 20 2a 70 69 44 6f 63 69 64 3d  ( p || *piDocid=
23bf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23c00 21 70 20 7c 7c 20 28 70 3e 61 44 6f 63 6c 69 73  !p || (p>aDoclis
23c10 74 20 26 26 20 70 3c 26 61 44 6f 63 6c 69 73 74  t && p<&aDoclist
23c20 5b 6e 44 6f 63 6c 69 73 74 5d 29 20 29 3b 0a 0a  [nDoclist]) );..
23c30 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
23c40 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
23c50 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20  iDocid = 0;.    
23c60 63 68 61 72 20 2a 70 4e 65 78 74 20 3d 20 30 3b  char *pNext = 0;
23c70 0a 20 20 20 20 63 68 61 72 20 2a 70 44 6f 63 69  .    char *pDoci
23c80 64 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20 20  d = aDoclist;.  
23c90 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26    char *pEnd = &
23ca0 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73  aDoclist[nDoclis
23cb0 74 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4d 75 6c  t];.    int iMul
23cc0 20 3d 20 31 3b 0a 0a 20 20 20 20 77 68 69 6c 65   = 1;..    while
23cd0 28 20 70 44 6f 63 69 64 3c 70 45 6e 64 20 29 7b  ( pDocid<pEnd ){
23ce0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
23cf0 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20  nt64 iDelta;.   
23d00 20 20 20 70 44 6f 63 69 64 20 2b 3d 20 73 71 6c     pDocid += sql
23d10 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e  ite3Fts3GetVarin
23d20 74 28 70 44 6f 63 69 64 2c 20 26 69 44 65 6c 74  t(pDocid, &iDelt
23d30 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64  a);.      iDocid
23d40 20 2b 3d 20 28 69 4d 75 6c 20 2a 20 69 44 65 6c   += (iMul * iDel
23d50 74 61 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  ta);.      pNext
23d60 20 3d 20 70 44 6f 63 69 64 3b 0a 20 20 20 20 20   = pDocid;.     
23d70 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79   fts3PoslistCopy
23d80 28 30 2c 20 26 70 44 6f 63 69 64 29 3b 0a 20 20  (0, &pDocid);.  
23d90 20 20 20 20 77 68 69 6c 65 28 20 70 44 6f 63 69      while( pDoci
23da0 64 3c 70 45 6e 64 20 26 26 20 2a 70 44 6f 63 69  d<pEnd && *pDoci
23db0 64 3d 3d 30 20 29 20 70 44 6f 63 69 64 2b 2b 3b  d==0 ) pDocid++;
23dc0 0a 20 20 20 20 20 20 69 4d 75 6c 20 3d 20 28 62  .      iMul = (b
23dd0 44 65 73 63 49 64 78 20 3f 20 2d 31 20 3a 20 31  DescIdx ? -1 : 1
23de0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70  );.    }..    *p
23df0 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 45  nList = (int)(pE
23e00 6e 64 20 2d 20 70 4e 65 78 74 29 3b 0a 20 20 20  nd - pNext);.   
23e10 20 2a 70 70 49 74 65 72 20 3d 20 70 4e 65 78 74   *ppIter = pNext
23e20 3b 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 3d  ;.    *piDocid =
23e30 20 69 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73 65   iDocid;.  }else
23e40 7b 0a 20 20 20 20 69 6e 74 20 69 4d 75 6c 20 3d  {.    int iMul =
23e50 20 28 62 44 65 73 63 49 64 78 20 3f 20 2d 31 20   (bDescIdx ? -1 
23e60 3a 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  : 1);.    sqlite
23e70 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a  3_int64 iDelta;.
23e80 20 20 20 20 66 74 73 33 47 65 74 52 65 76 65 72      fts3GetRever
23e90 73 65 56 61 72 69 6e 74 28 26 70 2c 20 61 44 6f  seVarint(&p, aDo
23ea0 63 6c 69 73 74 2c 20 26 69 44 65 6c 74 61 29 3b  clist, &iDelta);
23eb0 0a 20 20 20 20 2a 70 69 44 6f 63 69 64 20 2d 3d  .    *piDocid -=
23ec0 20 28 69 4d 75 6c 20 2a 20 69 44 65 6c 74 61 29   (iMul * iDelta)
23ed0 3b 0a 0a 20 20 20 20 69 66 28 20 70 3d 3d 61 44  ;..    if( p==aD
23ee0 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
23ef0 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  *pbEof = 1;.    
23f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
23f10 72 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20 20  r *pSave = p;.  
23f20 20 20 20 20 66 74 73 33 52 65 76 65 72 73 65 50      fts3ReverseP
23f30 6f 73 6c 69 73 74 28 61 44 6f 63 6c 69 73 74 2c  oslist(aDoclist,
23f40 20 26 70 29 3b 0a 20 20 20 20 20 20 2a 70 6e 4c   &p);.      *pnL
23f50 69 73 74 20 3d 20 28 69 6e 74 29 28 70 53 61 76  ist = (int)(pSav
23f60 65 20 2d 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  e - p);.    }.  
23f70 20 20 2a 70 70 49 74 65 72 20 3d 20 70 3b 0a 20    *ppIter = p;. 
23f80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
23f90 61 74 65 20 66 6f 72 77 61 72 64 73 20 74 68 72  ate forwards thr
23fa0 6f 75 67 68 20 61 20 64 6f 63 6c 69 73 74 2e 0a  ough a doclist..
23fb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
23fc0 74 73 33 44 6f 63 6c 69 73 74 4e 65 78 74 28 0a  ts3DoclistNext(.
23fd0 20 20 69 6e 74 20 62 44 65 73 63 49 64 78 2c 20    int bDescIdx, 
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
24000 20 64 6f 63 6c 69 73 74 20 69 73 20 64 65 73 63   doclist is desc
24010 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63   */.  char *aDoc
24020 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  list,           
24030 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24040 20 74 6f 20 65 6e 74 69 72 65 20 64 6f 63 6c 69   to entire docli
24050 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63  st */.  int nDoc
24060 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  list,           
24070 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
24080 68 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 6e  h of aDoclist in
24090 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
240a0 20 2a 2a 70 70 49 74 65 72 2c 20 20 20 20 20 20   **ppIter,      
240b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
240c0 4e 2f 4f 55 54 3a 20 49 74 65 72 61 74 6f 72 20  N/OUT: Iterator 
240d0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  pointer */.  sql
240e0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f  ite3_int64 *piDo
240f0 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  cid,         /* 
24100 49 4e 2f 4f 55 54 3a 20 44 6f 63 69 64 20 70 6f  IN/OUT: Docid po
24110 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
24120 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
24130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24140 54 3a 20 45 6e 64 2d 6f 66 2d 66 69 6c 65 20 66  T: End-of-file f
24150 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  lag */.){.  char
24160 20 2a 70 20 3d 20 2a 70 70 49 74 65 72 3b 0a 0a   *p = *ppIter;..
24170 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c 69    assert( nDocli
24180 73 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  st>0 );.  assert
24190 28 20 2a 70 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  ( *pbEof==0 );. 
241a0 20 61 73 73 65 72 74 28 20 70 20 7c 7c 20 2a 70   assert( p || *p
241b0 69 44 6f 63 69 64 3d 3d 30 20 29 3b 0a 20 20 61  iDocid==0 );.  a
241c0 73 73 65 72 74 28 20 21 70 20 7c 7c 20 28 70 3e  ssert( !p || (p>
241d0 3d 61 44 6f 63 6c 69 73 74 20 26 26 20 70 3c 3d  =aDoclist && p<=
241e0 26 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69  &aDoclist[nDocli
241f0 73 74 5d 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  st]) );..  if( p
24200 3d 3d 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 61  ==0 ){.    p = a
24210 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 70 20 2b  Doclist;.    p +
24220 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
24230 56 61 72 69 6e 74 28 70 2c 20 70 69 44 6f 63 69  Varint(p, piDoci
24240 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
24250 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79   fts3PoslistCopy
24260 28 30 2c 20 26 70 29 3b 0a 20 20 20 20 77 68 69  (0, &p);.    whi
24270 6c 65 28 20 70 3c 26 61 44 6f 63 6c 69 73 74 5b  le( p<&aDoclist[
24280 6e 44 6f 63 6c 69 73 74 5d 20 26 26 20 2a 70 3d  nDoclist] && *p=
24290 3d 30 20 29 20 70 2b 2b 3b 20 0a 20 20 20 20 69  =0 ) p++; .    i
242a0 66 28 20 70 3e 3d 26 61 44 6f 63 6c 69 73 74 5b  f( p>=&aDoclist[
242b0 6e 44 6f 63 6c 69 73 74 5d 20 29 7b 0a 20 20 20  nDoclist] ){.   
242c0 20 20 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20     *pbEof = 1;. 
242d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
242e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56  sqlite3_int64 iV
242f0 61 72 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 73  ar;.      p += s
24300 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
24310 69 6e 74 28 70 2c 20 26 69 56 61 72 29 3b 0a 20  int(p, &iVar);. 
24320 20 20 20 20 20 2a 70 69 44 6f 63 69 64 20 2b 3d       *piDocid +=
24330 20 28 28 62 44 65 73 63 49 64 78 20 3f 20 2d 31   ((bDescIdx ? -1
24340 20 3a 20 31 29 20 2a 20 69 56 61 72 29 3b 0a 20   : 1) * iVar);. 
24350 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 49     }.  }..  *ppI
24360 74 65 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter = p;.}../*.*
24370 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
24380 65 72 61 74 6f 72 20 70 44 4c 20 74 6f 20 74 68  erator pDL to th
24390 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
243a0 70 44 4c 2d 3e 61 41 6c 6c 2f 6e 41 6c 6c 2e 20  pDL->aAll/nAll. 
243b0 53 65 74 20 2a 70 62 45 6f 66 0a 2a 2a 20 74 6f  Set *pbEof.** to
243c0 20 74 72 75 65 20 69 66 20 45 4f 46 20 69 73 20   true if EOF is 
243d0 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 73 74 61 74  reached..*/.stat
243e0 69 63 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c  ic void fts3Eval
243f0 44 6c 50 68 72 61 73 65 4e 65 78 74 28 0a 20 20  DlPhraseNext(.  
24400 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c  Fts3Table *pTab,
24410 0a 20 20 46 74 73 33 44 6f 63 6c 69 73 74 20 2a  .  Fts3Doclist *
24420 70 44 4c 2c 0a 20 20 75 38 20 2a 70 62 45 6f 66  pDL,.  u8 *pbEof
24430 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 49 74 65  .){.  char *pIte
24440 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24460 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
24470 20 74 68 72 6f 75 67 68 20 61 41 6c 6c 20 2a 2f   through aAll */
24480 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20  .  char *pEnd = 
24490 26 70 44 4c 2d 3e 61 41 6c 6c 5b 70 44 4c 2d 3e  &pDL->aAll[pDL->
244a0 6e 41 6c 6c 5d 3b 20 20 20 20 20 2f 2a 20 31 20  nAll];     /* 1 
244b0 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
244c0 20 61 41 6c 6c 20 2a 2f 0a 20 0a 20 20 69 66 28   aAll */. .  if(
244d0 20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64   pDL->pNextDocid
244e0 20 29 7b 0a 20 20 20 20 70 49 74 65 72 20 3d 20   ){.    pIter = 
244f0 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3b  pDL->pNextDocid;
24500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
24510 74 65 72 20 3d 20 70 44 4c 2d 3e 61 41 6c 6c 3b  ter = pDL->aAll;
24520 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
24530 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 2f  r>=pEnd ){.    /
24540 2a 20 57 65 20 68 61 76 65 20 61 6c 72 65 61 64  * We have alread
24550 79 20 72 65 61 63 68 65 64 20 74 68 65 20 65 6e  y reached the en
24560 64 20 6f 66 20 74 68 69 73 20 64 6f 63 6c 69 73  d of this doclis
24570 74 2e 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 2a  t. EOF. */.    *
24580 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  pbEof = 1;.  }el
24590 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
245a0 69 6e 74 36 34 20 69 44 65 6c 74 61 3b 0a 20 20  int64 iDelta;.  
245b0 20 20 70 49 74 65 72 20 2b 3d 20 73 71 6c 69 74    pIter += sqlit
245c0 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
245d0 70 49 74 65 72 2c 20 26 69 44 65 6c 74 61 29 3b  pIter, &iDelta);
245e0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 62  .    if( pTab->b
245f0 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 70 44  DescIdx==0 || pD
24600 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3d 3d 30  L->pNextDocid==0
24610 20 29 7b 0a 20 20 20 20 20 20 70 44 4c 2d 3e 69   ){.      pDL->i
24620 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Docid += iDelta;
24630 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24640 20 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20 2d 3d    pDL->iDocid -=
24650 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 7d 0a 20   iDelta;.    }. 
24660 20 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d 20     pDL->pList = 
24670 70 49 74 65 72 3b 0a 20 20 20 20 66 74 73 33 50  pIter;.    fts3P
24680 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  oslistCopy(0, &p
24690 49 74 65 72 29 3b 0a 20 20 20 20 70 44 4c 2d 3e  Iter);.    pDL->
246a0 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 49  nList = (int)(pI
246b0 74 65 72 20 2d 20 70 44 4c 2d 3e 70 4c 69 73 74  ter - pDL->pList
246c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72  );..    /* pIter
246d0 20 6e 6f 77 20 70 6f 69 6e 74 73 20 6a 75 73 74   now points just
246e0 20 70 61 73 74 20 74 68 65 20 30 78 30 30 20 74   past the 0x00 t
246f0 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
24700 68 65 20 70 6f 73 69 74 69 6f 6e 2d 0a 20 20 20  he position-.   
24710 20 2a 2a 20 6c 69 73 74 20 66 6f 72 20 64 6f 63   ** list for doc
24720 75 6d 65 6e 74 20 70 44 4c 2d 3e 69 44 6f 63 69  ument pDL->iDoci
24730 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  d. However, if t
24740 68 69 73 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  his position-lis
24750 74 20 77 61 73 0a 20 20 20 20 2a 2a 20 65 64 69  t was.    ** edi
24760 74 65 64 20 69 6e 20 70 6c 61 63 65 20 62 79 20  ted in place by 
24770 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d  fts3EvalNearTrim
24780 28 29 2c 20 74 68 65 6e 20 70 49 74 65 72 20 6d  (), then pIter m
24790 61 79 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 0a  ay not actually.
247a0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 20 74 6f 20      ** point to 
247b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
247c0 20 6e 65 78 74 20 64 6f 63 69 64 20 76 61 6c 75   next docid valu
247d0 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
247e0 20 6c 69 6e 65 20 64 65 61 6c 73 0a 20 20 20 20   line deals.    
247f0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 63 61 73  ** with this cas
24800 65 20 62 79 20 61 64 76 61 6e 63 69 6e 67 20 70  e by advancing p
24810 49 74 65 72 20 70 61 73 74 20 74 68 65 20 7a 65  Iter past the ze
24820 72 6f 2d 70 61 64 64 69 6e 67 20 61 64 64 65 64  ro-padding added
24830 20 62 79 0a 20 20 20 20 2a 2a 20 66 74 73 33 45   by.    ** fts3E
24840 76 61 6c 4e 65 61 72 54 72 69 6d 28 29 2e 20 20  valNearTrim().  
24850 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49  */.    while( pI
24860 74 65 72 3c 70 45 6e 64 20 26 26 20 2a 70 49 74  ter<pEnd && *pIt
24870 65 72 3d 3d 30 20 29 20 70 49 74 65 72 2b 2b 3b  er==0 ) pIter++;
24880 0a 0a 20 20 20 20 70 44 4c 2d 3e 70 4e 65 78 74  ..    pDL->pNext
24890 44 6f 63 69 64 20 3d 20 70 49 74 65 72 3b 0a 20  Docid = pIter;. 
248a0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
248b0 3e 3d 26 70 44 4c 2d 3e 61 41 6c 6c 5b 70 44 4c  >=&pDL->aAll[pDL
248c0 2d 3e 6e 41 6c 6c 5d 20 7c 7c 20 2a 70 49 74 65  ->nAll] || *pIte
248d0 72 20 29 3b 0a 20 20 20 20 2a 70 62 45 6f 66 20  r );.    *pbEof 
248e0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
248f0 2a 20 48 65 6c 70 65 72 20 74 79 70 65 20 75 73  * Helper type us
24900 65 64 20 62 79 20 66 74 73 33 45 76 61 6c 49 6e  ed by fts3EvalIn
24910 63 72 50 68 72 61 73 65 4e 65 78 74 28 29 20 61  crPhraseNext() a
24920 6e 64 20 69 6e 63 72 50 68 72 61 73 65 54 6f 6b  nd incrPhraseTok
24930 65 6e 4e 65 78 74 28 29 2e 0a 2a 2f 0a 74 79 70  enNext()..*/.typ
24940 65 64 65 66 20 73 74 72 75 63 74 20 54 6f 6b 65  edef struct Toke
24950 6e 44 6f 63 6c 69 73 74 20 54 6f 6b 65 6e 44 6f  nDoclist TokenDo
24960 63 6c 69 73 74 3b 0a 73 74 72 75 63 74 20 54 6f  clist;.struct To
24970 6b 65 6e 44 6f 63 6c 69 73 74 20 7b 0a 20 20 69  kenDoclist {.  i
24980 6e 74 20 62 49 67 6e 6f 72 65 3b 0a 20 20 73 71  nt bIgnore;.  sq
24990 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63  lite3_int64 iDoc
249a0 69 64 3b 0a 20 20 63 68 61 72 20 2a 70 4c 69 73  id;.  char *pLis
249b0 74 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a  t;.  int nList;.
249c0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 20  };../*.** Token 
249d0 70 54 6f 6b 65 6e 20 69 73 20 61 6e 20 69 6e 63  pToken is an inc
249e0 72 65 6d 65 6e 74 61 6c 6c 79 20 6c 6f 61 64 65  rementally loade
249f0 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 69 73 20  d token that is 
24a00 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 6d 75  part of a .** mu
24a10 6c 74 69 2d 74 6f 6b 65 6e 20 70 68 72 61 73 65  lti-token phrase
24a20 2e 20 41 64 76 61 6e 63 65 20 69 74 20 74 6f 20  . Advance it to 
24a30 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
24a40 67 20 64 6f 63 75 6d 65 6e 74 20 69 6e 20 74 68  g document in th
24a50 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e  e.** database an
24a60 64 20 70 6f 70 75 6c 61 74 65 20 6f 75 74 70 75  d populate outpu
24a70 74 20 76 61 72 69 61 62 6c 65 20 2a 70 20 77 69  t variable *p wi
24a80 74 68 20 74 68 65 20 64 65 74 61 69 6c 73 20 6f  th the details o
24a90 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 65 6e 74  f the new.** ent
24aa0 72 79 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 69  ry. Or, if the i
24ab0 74 65 72 61 74 6f 72 20 68 61 73 20 72 65 61 63  terator has reac
24ac0 68 65 64 20 45 4f 46 2c 20 73 65 74 20 2a 70 62  hed EOF, set *pb
24ad0 45 6f 66 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 0a  Eof to true..**.
24ae0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
24af0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e  ccurs, return an
24b00 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
24b10 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  de. Otherwise, r
24b20 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
24b30 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
24b40 6e 74 20 69 6e 63 72 50 68 72 61 73 65 54 6f 6b  nt incrPhraseTok
24b50 65 6e 4e 65 78 74 28 0a 20 20 46 74 73 33 54 61  enNext(.  Fts3Ta
24b60 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
24b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
24b80 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
24b90 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73  e */.  Fts3Phras
24ba0 65 20 2a 70 50 68 72 61 73 65 2c 20 20 20 20 20  e *pPhrase,     
24bb0 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65         /* Phrase
24bc0 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 6b 65   to advance toke
24bd0 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 54  n of */.  int iT
24be0 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
24bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 65            /* Spe
24c00 63 69 66 69 63 20 74 6f 6b 65 6e 20 74 6f 20 61  cific token to a
24c10 64 76 61 6e 63 65 20 2a 2f 0a 20 20 54 6f 6b 65  dvance */.  Toke
24c20 6e 44 6f 63 6c 69 73 74 20 2a 70 2c 20 20 20 20  nDoclist *p,    
24c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24c40 55 54 3a 20 44 6f 63 69 64 20 61 6e 64 20 64 6f  UT: Docid and do
24c50 63 6c 69 73 74 20 66 6f 72 20 6e 65 77 20 65 6e  clist for new en
24c60 74 72 79 20 2a 2f 0a 20 20 75 38 20 2a 70 62 45  try */.  u8 *pbE
24c70 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  of              
24c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
24c90 20 54 72 75 65 20 69 66 20 69 74 65 72 61 74 6f   True if iterato
24ca0 72 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 29  r is at EOF */.)
24cb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24cc0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
24cd0 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74  Phrase->iDoclist
24ce0 54 6f 6b 65 6e 3d 3d 69 54 6f 6b 65 6e 20 29 7b  Token==iToken ){
24cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
24d00 62 49 67 6e 6f 72 65 3d 3d 30 20 29 3b 0a 20 20  bIgnore==0 );.  
24d10 20 20 61 73 73 65 72 74 28 20 70 50 68 72 61 73    assert( pPhras
24d20 65 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65 6e  e->aToken[iToken
24d30 5d 2e 70 53 65 67 63 73 72 3d 3d 30 20 29 3b 0a  ].pSegcsr==0 );.
24d40 20 20 20 20 66 74 73 33 45 76 61 6c 44 6c 50 68      fts3EvalDlPh
24d50 72 61 73 65 4e 65 78 74 28 70 54 61 62 2c 20 26  raseNext(pTab, &
24d60 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
24d70 2c 20 70 62 45 6f 66 29 3b 0a 20 20 20 20 70 2d  , pbEof);.    p-
24d80 3e 70 4c 69 73 74 20 3d 20 70 50 68 72 61 73 65  >pList = pPhrase
24d90 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b  ->doclist.pList;
24da0 0a 20 20 20 20 70 2d 3e 6e 4c 69 73 74 20 3d 20  .    p->nList = 
24db0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
24dc0 2e 6e 4c 69 73 74 3b 0a 20 20 20 20 70 2d 3e 69  .nList;.    p->i
24dd0 44 6f 63 69 64 20 3d 20 70 50 68 72 61 73 65 2d  Docid = pPhrase-
24de0 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 3b  >doclist.iDocid;
24df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
24e00 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
24e10 54 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61 73 65  Token = &pPhrase
24e20 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65 6e 5d  ->aToken[iToken]
24e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
24e40 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d  oken->pDeferred=
24e50 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
24e60 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  ( pToken->pSegcs
24e70 72 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 69 44  r || pPhrase->iD
24e80 6f 63 6c 69 73 74 54 6f 6b 65 6e 3e 3d 30 20 29  oclistToken>=0 )
24e90 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
24ea0 2d 3e 70 53 65 67 63 73 72 20 29 7b 0a 20 20 20  ->pSegcsr ){.   
24eb0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49     assert( p->bI
24ec0 67 6e 6f 72 65 3d 3d 30 20 29 3b 0a 20 20 20 20  gnore==0 );.    
24ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
24ee0 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a 20  s3MsrIncrNext(. 
24ef0 20 20 20 20 20 20 20 20 20 70 54 61 62 2c 20 70           pTab, p
24f00 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2c 20  Token->pSegcsr, 
24f10 26 70 2d 3e 69 44 6f 63 69 64 2c 20 26 70 2d 3e  &p->iDocid, &p->
24f20 70 4c 69 73 74 2c 20 26 70 2d 3e 6e 4c 69 73 74  pList, &p->nList
24f30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
24f40 69 66 28 20 70 2d 3e 70 4c 69 73 74 3d 3d 30 20  if( p->pList==0 
24f50 29 20 2a 70 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ) *pbEof = 1;.  
24f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
24f70 2d 3e 62 49 67 6e 6f 72 65 20 3d 20 31 3b 0a 20  ->bIgnore = 1;. 
24f80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
24f90 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
24fa0 20 54 68 65 20 70 68 72 61 73 65 20 69 74 65 72   The phrase iter
24fb0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
24fc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
24fd0 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 66 65  nt:.**.**   * fe
24fe0 61 74 75 72 65 73 20 61 74 20 6c 65 61 73 74 20  atures at least 
24ff0 6f 6e 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 75  one token that u
25000 73 65 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ses an increment
25010 61 6c 20 64 6f 63 6c 69 73 74 2c 20 61 6e 64 20  al doclist, and 
25020 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 6f 65 73 20  .**.**   * does 
25030 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20  not contain any 
25040 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2e  deferred tokens.
25050 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  .**.** Advance i
25060 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  t to the next ma
25070 74 63 68 69 6e 67 20 64 6f 63 75 6d 6e 65 6e 74  tching documnent
25080 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25090 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 0a 2a 2a   and populate.**
250a0 20 74 68 65 20 46 74 73 33 44 6f 63 6c 69 73 74   the Fts3Doclist
250b0 2e 70 4c 69 73 74 20 61 6e 64 20 6e 4c 69 73 74  .pList and nList
250c0 20 66 69 65 6c 64 73 2e 20 0a 2a 2a 0a 2a 2a 20   fields. .**.** 
250d0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  If there is no "
250e0 6e 65 78 74 22 20 65 6e 74 72 79 20 61 6e 64 20  next" entry and 
250f0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
25100 20 74 68 65 6e 20 2a 70 62 45 6f 66 20 69 73 20   then *pbEof is 
25110 73 65 74 20 74 6f 0a 2a 2a 20 31 20 62 65 66 6f  set to.** 1 befo
25120 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74  re returning. Ot
25130 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 65  herwise, if no e
25140 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
25150 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a  the iterator is.
25160 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
25170 61 64 76 61 6e 63 65 64 2c 20 2a 70 62 45 6f 66  advanced, *pbEof
25180 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
25190 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
251a0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
251b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
251c0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
251d0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
251e0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
251f0 69 6e 74 20 66 74 73 33 45 76 61 6c 49 6e 63 72  int fts3EvalIncr
25200 50 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46 74  PhraseNext(.  Ft
25210 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25230 20 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64   FTS Cursor hand
25240 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61  le */.  Fts3Phra
25250 73 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  se *p,          
25260 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
25270 65 20 6f 62 6a 65 63 74 20 74 6f 20 61 64 76 61  e object to adva
25280 6e 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69  nce to next doci
25290 64 20 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66  d */.  u8 *pbEof
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
252c0 65 74 20 74 6f 20 31 20 69 66 20 45 4f 46 20 2a  et to 1 if EOF *
252d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
252e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
252f0 33 44 6f 63 6c 69 73 74 20 2a 70 44 4c 20 3d 20  3Doclist *pDL = 
25300 26 70 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 46  &p->doclist;.  F
25310 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts3Table *pTab =
25320 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
25330 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
25340 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 0a    u8 bEof = 0;..
25350 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 6c    /* This is onl
25360 79 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  y called if it i
25370 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
25380 74 20 74 68 65 20 70 68 72 61 73 65 20 68 61 73  t the phrase has
25390 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 6f   at least.  ** o
253a0 6e 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 74  ne incremental t
253b0 6f 6b 65 6e 2e 20 49 6e 20 77 68 69 63 68 20 63  oken. In which c
253c0 61 73 65 20 74 68 65 20 62 49 6e 63 72 20 66 6c  ase the bIncr fl
253d0 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20  ag is set. */.  
253e0 61 73 73 65 72 74 28 20 70 2d 3e 62 49 6e 63 72  assert( p->bIncr
253f0 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==1 );..  if( p-
25400 3e 6e 54 6f 6b 65 6e 3d 3d 31 20 29 7b 0a 20 20  >nToken==1 ){.  
25410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
25420 73 33 4d 73 72 49 6e 63 72 4e 65 78 74 28 70 54  s3MsrIncrNext(pT
25430 61 62 2c 20 70 2d 3e 61 54 6f 6b 65 6e 5b 30 5d  ab, p->aToken[0]
25440 2e 70 53 65 67 63 73 72 2c 20 0a 20 20 20 20 20  .pSegcsr, .     
25450 20 20 20 26 70 44 4c 2d 3e 69 44 6f 63 69 64 2c     &pDL->iDocid,
25460 20 26 70 44 4c 2d 3e 70 4c 69 73 74 2c 20 26 70   &pDL->pList, &p
25470 44 4c 2d 3e 6e 4c 69 73 74 0a 20 20 20 20 29 3b  DL->nList.    );
25480 0a 20 20 20 20 69 66 28 20 70 44 4c 2d 3e 70 4c  .    if( pDL->pL
25490 69 73 74 3d 3d 30 20 29 20 62 45 6f 66 20 3d 20  ist==0 ) bEof = 
254a0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
254b0 69 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74  int bDescDoclist
254c0 20 3d 20 70 43 73 72 2d 3e 62 44 65 73 63 3b 0a   = pCsr->bDesc;.
254d0 20 20 20 20 73 74 72 75 63 74 20 54 6f 6b 65 6e      struct Token
254e0 44 6f 63 6c 69 73 74 20 61 5b 4d 41 58 5f 49 4e  Doclist a[MAX_IN
254f0 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45 4e 53  CR_PHRASE_TOKENS
25500 5d 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 61  ];..    memset(a
25510 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b  , 0, sizeof(a));
25520 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
25530 6e 54 6f 6b 65 6e 3c 3d 4d 41 58 5f 49 4e 43 52  nToken<=MAX_INCR
25540 5f 50 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20 29  _PHRASE_TOKENS )
25550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
25560 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3c 4d  >iDoclistToken<M
25570 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54  AX_INCR_PHRASE_T
25580 4f 4b 45 4e 53 20 29 3b 0a 0a 20 20 20 20 77 68  OKENS );..    wh
25590 69 6c 65 28 20 62 45 6f 66 3d 3d 30 20 29 7b 0a  ile( bEof==0 ){.
255a0 20 20 20 20 20 20 69 6e 74 20 62 4d 61 78 53 65        int bMaxSe
255b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  t = 0;.      sql
255c0 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 78 20  ite3_int64 iMax 
255d0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4c 61 72 67  = 0;     /* Larg
255e0 65 73 74 20 64 6f 63 69 64 20 66 6f 72 20 61 6c  est docid for al
255f0 6c 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20  l iterators */. 
25600 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25620 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
25630 61 74 65 20 74 68 72 6f 75 67 68 20 74 6f 6b 65  ate through toke
25640 6e 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ns */..      /* 
25650 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
25660 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 74 6f  ator for each to
25670 6b 65 6e 20 69 6e 20 74 68 65 20 70 68 72 61 73  ken in the phras
25680 65 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  e once. */.     
25690 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
256a0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e  LITE_OK && i<p->
256b0 6e 54 6f 6b 65 6e 20 26 26 20 62 45 6f 66 3d 3d  nToken && bEof==
256c0 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
256d0 20 72 63 20 3d 20 69 6e 63 72 50 68 72 61 73 65   rc = incrPhrase
256e0 54 6f 6b 65 6e 4e 65 78 74 28 70 54 61 62 2c 20  TokenNext(pTab, 
256f0 70 2c 20 69 2c 20 26 61 5b 69 5d 2c 20 26 62 45  p, i, &a[i], &bE
25700 6f 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  of);.        if(
25710 20 61 5b 69 5d 2e 62 49 67 6e 6f 72 65 3d 3d 30   a[i].bIgnore==0
25720 20 26 26 20 28 62 4d 61 78 53 65 74 3d 3d 30 20   && (bMaxSet==0 
25730 7c 7c 20 44 4f 43 49 44 5f 43 4d 50 28 69 4d 61  || DOCID_CMP(iMa
25740 78 2c 20 61 5b 69 5d 2e 69 44 6f 63 69 64 29 3c  x, a[i].iDocid)<
25750 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
25760 69 4d 61 78 20 3d 20 61 5b 69 5d 2e 69 44 6f 63  iMax = a[i].iDoc
25770 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 62 4d  id;.          bM
25780 61 78 53 65 74 20 3d 20 31 3b 0a 20 20 20 20 20  axSet = 1;.     
25790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
257a0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
257b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
257c0 6e 54 6f 6b 65 6e 3e 3d 31 20 26 26 20 61 5b 70  nToken>=1 && a[p
257d0 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e 62 49 67 6e  ->nToken-1].bIgn
257e0 6f 72 65 3d 3d 30 29 20 29 3b 0a 20 20 20 20 20  ore==0) );.     
257f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
25800 49 54 45 5f 4f 4b 20 7c 7c 20 62 4d 61 78 53 65  ITE_OK || bMaxSe
25810 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4b  t );..      /* K
25820 65 65 70 20 61 64 76 61 6e 63 69 6e 67 20 69 74  eep advancing it
25830 65 72 61 74 6f 72 73 20 75 6e 74 69 6c 20 74 68  erators until th
25840 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
25850 74 68 65 20 73 61 6d 65 20 64 6f 63 75 6d 65 6e  the same documen
25860 74 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  t */.      for(i
25870 3d 30 3b 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b  =0; i<p->nToken;
25880 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77   i++){.        w
25890 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
258a0 5f 4f 4b 20 26 26 20 62 45 6f 66 3d 3d 30 20 0a  _OK && bEof==0 .
258b0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61              && a
258c0 5b 69 5d 2e 62 49 67 6e 6f 72 65 3d 3d 30 20 26  [i].bIgnore==0 &
258d0 26 20 44 4f 43 49 44 5f 43 4d 50 28 61 5b 69 5d  & DOCID_CMP(a[i]
258e0 2e 69 44 6f 63 69 64 2c 20 69 4d 61 78 29 3c 30  .iDocid, iMax)<0
258f0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
25900 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
25910 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28  PhraseTokenNext(
25920 70 54 61 62 2c 20 70 2c 20 69 2c 20 26 61 5b 69  pTab, p, i, &a[i
25930 5d 2c 20 26 62 45 6f 66 29 3b 0a 20 20 20 20 20  ], &bEof);.     
25940 20 20 20 20 20 69 66 28 20 44 4f 43 49 44 5f 43       if( DOCID_C
25950 4d 50 28 61 5b 69 5d 2e 69 44 6f 63 69 64 2c 20  MP(a[i].iDocid, 
25960 69 4d 61 78 29 3e 30 20 29 7b 0a 20 20 20 20 20  iMax)>0 ){.     
25970 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 61 5b         iMax = a[
25980 69 5d 2e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20  i].iDocid;.     
25990 20 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20         i = 0;.  
259a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
259b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
259c0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
259d0 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 69  he current entri
259e0 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 61 20  es really are a 
259f0 70 68 72 61 73 65 20 6d 61 74 63 68 20 2a 2f 0a  phrase match */.
25a00 20 20 20 20 20 20 69 66 28 20 62 45 6f 66 3d 3d        if( bEof==
25a10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
25a20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
25a30 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
25a40 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e 6e  a[p->nToken-1].n
25a50 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 63 68  List;.        ch
25a60 61 72 20 2a 61 44 6f 63 6c 69 73 74 20 3d 20 73  ar *aDoclist = s
25a70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
25a80 79 74 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  yte+1);.        
25a90 69 66 28 20 21 61 44 6f 63 6c 69 73 74 20 29 20  if( !aDoclist ) 
25aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25ab0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  MEM;.        mem
25ac0 63 70 79 28 61 44 6f 63 6c 69 73 74 2c 20 61 5b  cpy(aDoclist, a[
25ad0 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e 70 4c 69  p->nToken-1].pLi
25ae0 73 74 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 0a 20  st, nByte+1);.. 
25af0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
25b00 69 3c 28 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 29 3b  i<(p->nToken-1);
25b10 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
25b20 20 69 66 28 20 61 5b 69 5d 2e 62 49 67 6e 6f 72   if( a[i].bIgnor
25b30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
25b40 20 20 20 20 63 68 61 72 20 2a 70 4c 20 3d 20 61      char *pL = a
25b50 5b 69 5d 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  [i].pList;.     
25b60 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 52 20         char *pR 
25b70 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  = aDoclist;.    
25b80 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4f          char *pO
25b90 75 74 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20  ut = aDoclist;. 
25ba0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
25bb0 44 69 73 74 20 3d 20 70 2d 3e 6e 54 6f 6b 65 6e  Dist = p->nToken
25bc0 2d 31 2d 69 3b 0a 20 20 20 20 20 20 20 20 20 20  -1-i;.          
25bd0 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 33    int res = fts3
25be0 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72  PoslistPhraseMer
25bf0 67 65 28 26 70 4f 75 74 2c 20 6e 44 69 73 74 2c  ge(&pOut, nDist,
25c00 20 30 2c 20 31 2c 20 26 70 4c 2c 20 26 70 52 29   0, 1, &pL, &pR)
25c10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25c20 28 20 72 65 73 3d 3d 30 20 29 20 62 72 65 61 6b  ( res==0 ) break
25c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c  ;.            nL
25c40 69 73 74 20 3d 20 28 69 6e 74 29 28 70 4f 75 74  ist = (int)(pOut
25c50 20 2d 20 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20   - aDoclist);.  
25c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25c70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25c80 69 3d 3d 28 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 29  i==(p->nToken-1)
25c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44   ){.          pD
25ca0 4c 2d 3e 69 44 6f 63 69 64 20 3d 20 69 4d 61 78  L->iDocid = iMax
25cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 4c 2d  ;.          pDL-
25cc0 3e 70 4c 69 73 74 20 3d 20 61 44 6f 63 6c 69 73  >pList = aDoclis
25cd0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 4c  t;.          pDL
25ce0 2d 3e 6e 4c 69 73 74 20 3d 20 6e 4c 69 73 74 3b  ->nList = nList;
25cf0 0a 20 20 20 20 20 20 20 20 20 20 70 44 4c 2d 3e  .          pDL->
25d00 62 46 72 65 65 4c 69 73 74 20 3d 20 31 3b 0a 20  bFreeList = 1;. 
25d10 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25d20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25d30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
25d40 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
25d50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  }.    }.  }..  *
25d60 70 62 45 6f 66 20 3d 20 62 45 6f 66 3b 0a 20 20  pbEof = bEof;.  
25d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25d80 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6d  .** Attempt to m
25d90 6f 76 65 20 74 68 65 20 70 68 72 61 73 65 20 69  ove the phrase i
25da0 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74  terator to point
25db0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
25dc0 63 68 69 6e 67 20 64 6f 63 69 64 2e 20 0a 2a 2a  ching docid. .**
25dd0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25de0 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  urs, return an S
25df0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
25e00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
25e10 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  urn .** SQLITE_O
25e20 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
25e30 65 20 69 73 20 6e 6f 20 22 6e 65 78 74 22 20 65  e is no "next" e
25e40 6e 74 72 79 20 61 6e 64 20 6e 6f 20 65 72 72 6f  ntry and no erro
25e50 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a  r occurs, then *
25e60 70 62 45 6f 66 20 69 73 20 73 65 74 20 74 6f 0a  pbEof is set to.
25e70 2a 2a 20 31 20 62 65 66 6f 72 65 20 72 65 74 75  ** 1 before retu
25e80 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  rning. Otherwise
25e90 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  , if no error oc
25ea0 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74 65  curs and the ite
25eb0 72 61 74 6f 72 20 69 73 0a 2a 2a 20 73 75 63 63  rator is.** succ
25ec0 65 73 73 66 75 6c 6c 79 20 61 64 76 61 6e 63 65  essfully advance
25ed0 64 2c 20 2a 70 62 45 6f 66 20 69 73 20 73 65 74  d, *pbEof is set
25ee0 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
25ef0 20 69 6e 74 20 66 74 73 33 45 76 61 6c 50 68 72   int fts3EvalPhr
25f00 61 73 65 4e 65 78 74 28 0a 20 20 46 74 73 33 43  aseNext(.  Fts3C
25f10 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
25f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
25f30 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20  S Cursor handle 
25f40 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 20  */.  Fts3Phrase 
25f50 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
25f60 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20 6f       /* Phrase o
25f70 62 6a 65 63 74 20 74 6f 20 61 64 76 61 6e 63 65  bject to advance
25f80 20 74 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a   to next docid *
25f90 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66 20 20 20  /.  u8 *pbEof   
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
25fc0 74 6f 20 31 20 69 66 20 45 4f 46 20 2a 2f 0a 29  to 1 if EOF */.)
25fd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25fe0 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 33 44 6f  ITE_OK;.  Fts3Do
25ff0 63 6c 69 73 74 20 2a 70 44 4c 20 3d 20 26 70 2d  clist *pDL = &p-
26000 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73 33  >doclist;.  Fts3
26010 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
26020 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d  ts3Table *)pCsr-
26030 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 0a 20 20  >base.pVtab;..  
26040 69 66 28 20 70 2d 3e 62 49 6e 63 72 20 29 7b 0a  if( p->bIncr ){.
26050 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76 61      rc = fts3Eva
26060 6c 49 6e 63 72 50 68 72 61 73 65 4e 65 78 74 28  lIncrPhraseNext(
26070 70 43 73 72 2c 20 70 2c 20 70 62 45 6f 66 29 3b  pCsr, p, pbEof);
26080 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 73  .  }else if( pCs
26090 72 2d 3e 62 44 65 73 63 21 3d 70 54 61 62 2d 3e  r->bDesc!=pTab->
260a0 62 44 65 73 63 49 64 78 20 26 26 20 70 44 4c 2d  bDescIdx && pDL-
260b0 3e 6e 41 6c 6c 20 29 7b 0a 20 20 20 20 73 71 6c  >nAll ){.    sql
260c0 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50  ite3Fts3DoclistP
260d0 72 65 76 28 70 54 61 62 2d 3e 62 44 65 73 63 49  rev(pTab->bDescI
260e0 64 78 2c 20 70 44 4c 2d 3e 61 41 6c 6c 2c 20 70  dx, pDL->aAll, p
260f0 44 4c 2d 3e 6e 41 6c 6c 2c 20 0a 20 20 20 20 20  DL->nAll, .     
26100 20 20 20 26 70 44 4c 2d 3e 70 4e 65 78 74 44 6f     &pDL->pNextDo
26110 63 69 64 2c 20 26 70 44 4c 2d 3e 69 44 6f 63 69  cid, &pDL->iDoci
26120 64 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73 74 2c 20  d, &pDL->nList, 
26130 70 62 45 6f 66 0a 20 20 20 20 29 3b 0a 20 20 20  pbEof.    );.   
26140 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d 20 70 44   pDL->pList = pD
26150 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 3b 0a 20  L->pNextDocid;. 
26160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 33   }else{.    fts3
26170 45 76 61 6c 44 6c 50 68 72 61 73 65 4e 65 78 74  EvalDlPhraseNext
26180 28 70 54 61 62 2c 20 70 44 4c 2c 20 70 62 45 6f  (pTab, pDL, pbEo
26190 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  f);.  }..  retur
261a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
261b0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
261c0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
261d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
261e0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
261f0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
26200 77 69 73 65 2c 20 66 74 73 33 45 76 61 6c 50 68  wise, fts3EvalPh
26210 72 61 73 65 53 74 61 72 74 28 29 20 69 73 20 63  raseStart() is c
26220 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20 70 68 72  alled on all phr
26230 61 73 65 73 20 77 69 74 68 69 6e 20 74 68 65 0a  ases within the.
26240 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 41  ** expression. A
26250 6c 73 6f 20 74 68 65 20 46 74 73 33 45 78 70 72  lso the Fts3Expr
26260 2e 62 44 65 66 65 72 72 65 64 20 76 61 72 69 61  .bDeferred varia
26270 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 72  ble is set to tr
26280 75 65 20 66 6f 72 20 61 6e 79 0a 2a 2a 20 65 78  ue for any.** ex
26290 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 77 68  pressions for wh
262a0 69 63 68 20 61 6c 6c 20 64 65 73 63 65 6e 64 65  ich all descende
262b0 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65 20 64 65  nt tokens are de
262c0 66 65 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ferred..**.** If
262d0 20 70 61 72 61 6d 65 74 65 72 20 62 4f 70 74 4f   parameter bOptO
262e0 6b 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  k is zero, then 
262f0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
26300 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 46 74 73   that the.** Fts
26310 33 50 68 72 61 73 65 2e 64 6f 63 6c 69 73 74 2e  3Phrase.doclist.
26320 61 41 6c 6c 2f 6e 41 6c 6c 20 76 61 72 69 61 62  aAll/nAll variab
26330 6c 65 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  les contain the 
26340 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 66  entire doclist f
26350 6f 72 0a 2a 2a 20 65 61 63 68 20 70 68 72 61 73  or.** each phras
26360 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
26370 69 6f 6e 20 28 73 75 62 6a 65 63 74 20 74 6f 20  ion (subject to 
26380 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 70  deferred token p
26390 72 6f 63 65 73 73 69 6e 67 29 2e 0a 2a 2a 20 4f  rocessing)..** O
263a0 72 2c 20 69 66 20 62 4f 70 74 4f 6b 20 69 73 20  r, if bOptOk is 
263b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 6f  non-zero, then o
263c0 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e  ne or more token
263d0 73 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 70  s within the exp
263e0 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d 61 79 20 62  ression.** may b
263f0 65 20 6c 6f 61 64 65 64 20 69 6e 63 72 65 6d 65  e loaded increme
26400 6e 74 61 6c 6c 79 2c 20 6d 65 61 6e 69 6e 67 20  ntally, meaning 
26410 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c  doclist.aAll/nAl
26420 6c 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  l is not availab
26430 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
26440 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
26450 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
26460 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  n, *pRc is set t
26470 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  o an SQLite erro
26480 72 0a 2a 2a 20 63 6f 64 65 20 62 65 66 6f 72 65  r.** code before
26490 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
264a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45  tatic void fts3E
264b0 76 61 6c 53 74 61 72 74 52 65 61 64 65 72 73 28  valStartReaders(
264c0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
264d0 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
264e0 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72     /* FTS Cursor
264f0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73   handle */.  Fts
26500 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  3Expr *pExpr,   
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26520 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e  Expression to in
26530 69 74 69 61 6c 69 7a 65 20 70 68 72 61 73 65 73  itialize phrases
26540 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52   in */.  int *pR
26550 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
26560 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
26570 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
26580 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72  /.){.  if( pExpr
26590 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 2a   && SQLITE_OK==*
265a0 70 52 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pRc ){.    if( p
265b0 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
265c0 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 7b 0a  QUERY_PHRASE ){.
265d0 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e        int nToken
265e0 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73   = pExpr->pPhras
265f0 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  e->nToken;.     
26600 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b 0a 20   if( nToken ){. 
26610 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
26620 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
26630 3c 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20  <nToken; i++){. 
26640 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
26650 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f  pr->pPhrase->aTo
26660 6b 65 6e 5b 69 5d 2e 70 44 65 66 65 72 72 65 64  ken[i].pDeferred
26670 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
26690 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64 20  Expr->bDeferred 
266a0 3d 20 28 69 3d 3d 6e 54 6f 6b 65 6e 29 3b 0a 20  = (i==nToken);. 
266b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
266c0 63 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61  c = fts3EvalPhra
266d0 73 65 53 74 61 72 74 28 70 43 73 72 2c 20 31 2c  seStart(pCsr, 1,
266e0 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 29   pExpr->pPhrase)
266f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26700 20 20 20 66 74 73 33 45 76 61 6c 53 74 61 72 74     fts3EvalStart
26710 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 45  Readers(pCsr, pE
26720 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29  xpr->pLeft, pRc)
26730 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  ;.      fts3Eval
26740 53 74 61 72 74 52 65 61 64 65 72 73 28 70 43 73  StartReaders(pCs
26750 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
26760 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 70 45  , pRc);.      pE
26770 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64 20 3d  xpr->bDeferred =
26780 20 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e   (pExpr->pLeft->
26790 62 44 65 66 65 72 72 65 64 20 26 26 20 70 45 78  bDeferred && pEx
267a0 70 72 2d 3e 70 52 69 67 68 74 2d 3e 62 44 65 66  pr->pRight->bDef
267b0 65 72 72 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  erred);.    }.  
267c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 72  }.}../*.** An ar
267d0 72 61 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ray of the follo
267e0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 73 20  wing structures 
267f0 69 73 20 61 73 73 65 6d 62 6c 65 64 20 61 73 20  is assembled as 
26800 70 61 72 74 20 6f 66 20 74 68 65 20 70 72 6f 63  part of the proc
26810 65 73 73 0a 2a 2a 20 6f 66 20 73 65 6c 65 63 74  ess.** of select
26820 69 6e 67 20 74 6f 6b 65 6e 73 20 74 6f 20 64 65  ing tokens to de
26830 66 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 71  fer before the q
26840 75 65 72 79 20 73 74 61 72 74 73 20 65 78 65 63  uery starts exec
26850 75 74 69 6e 67 20 28 61 73 20 70 61 72 74 0a 2a  uting (as part.*
26860 2a 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72  * of the xFilter
26870 28 29 20 6d 65 74 68 6f 64 29 2e 20 54 68 65 72  () method). Ther
26880 65 20 69 73 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  e is one element
26890 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 66 6f   in the array fo
268a0 72 20 65 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20  r each.** token 
268b0 69 6e 20 74 68 65 20 46 54 53 20 65 78 70 72 65  in the FTS expre
268c0 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  ssion..**.** Tok
268d0 65 6e 73 20 61 72 65 20 64 69 76 69 64 65 64 20  ens are divided 
268e0 69 6e 74 6f 20 41 4e 44 2f 4e 45 41 52 20 63 6c  into AND/NEAR cl
268f0 75 73 74 65 72 73 2e 20 41 6c 6c 20 74 6f 6b 65  usters. All toke
26900 6e 73 20 69 6e 20 61 20 63 6c 75 73 74 65 72 20  ns in a cluster 
26910 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 70 68 72  belong.** to phr
26920 61 73 65 73 20 74 68 61 74 20 61 72 65 20 63 6f  ases that are co
26930 6e 6e 65 63 74 65 64 20 6f 6e 6c 79 20 62 79 20  nnected only by 
26940 41 4e 44 20 61 6e 64 20 4e 45 41 52 20 6f 70 65  AND and NEAR ope
26950 72 61 74 6f 72 73 20 28 6e 6f 74 20 4f 52 20 6f  rators (not OR o
26960 72 0a 2a 2a 20 4e 4f 54 29 2e 20 57 68 65 6e 20  r.** NOT). When 
26970 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 6f 6b 65  determining toke
26980 6e 73 20 74 6f 20 64 65 66 65 72 2c 20 65 61 63  ns to defer, eac
26990 68 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74  h AND/NEAR clust
269a0 65 72 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  er is considered
269b0 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c 79 2e 20  .** separately. 
269c0 54 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 74 6f  The root of a to
269d0 6b 65 6e 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c  kens AND/NEAR cl
269e0 75 73 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  uster is stored 
269f0 69 6e 20 0a 2a 2a 20 46 74 73 33 54 6f 6b 65 6e  in .** Fts3Token
26a00 41 6e 64 43 6f 73 74 2e 70 52 6f 6f 74 2e 0a 2a  AndCost.pRoot..*
26a10 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
26a20 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73   Fts3TokenAndCos
26a30 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f  t Fts3TokenAndCo
26a40 73 74 3b 0a 73 74 72 75 63 74 20 46 74 73 33 54  st;.struct Fts3T
26a50 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 7b 0a 20 20  okenAndCost {.  
26a60 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68 72  Fts3Phrase *pPhr
26a70 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
26a80 2f 2a 20 54 68 65 20 70 68 72 61 73 65 20 74 68  /* The phrase th
26a90 65 20 74 6f 6b 65 6e 20 62 65 6c 6f 6e 67 73 20  e token belongs 
26aa0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 6b  to */.  int iTok
26ab0 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
26ac0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
26ad0 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20  ion of token in 
26ae0 70 68 72 61 73 65 20 2a 2f 0a 20 20 46 74 73 33  phrase */.  Fts3
26af0 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
26b00 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ken;        /* T
26b10 68 65 20 74 6f 6b 65 6e 20 69 74 73 65 6c 66 20  he token itself 
26b20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70  */.  Fts3Expr *p
26b30 52 6f 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Root;           
26b40 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f 66 20       /* Root of 
26b50 4e 45 41 52 2f 41 4e 44 20 63 6c 75 73 74 65 72  NEAR/AND cluster
26b60 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b   */.  int nOvfl;
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26b90 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
26ba0 73 20 74 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73  s to load doclis
26bb0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  t */.  int iCol;
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
26be0 6c 75 6d 6e 20 74 68 65 20 74 6f 6b 65 6e 20 6d  lumn the token m
26bf0 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a 7d 3b 0a  ust match */.};.
26c00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26c10 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
26c20 70 6f 70 75 6c 61 74 65 20 61 6e 20 61 6c 6c 6f  populate an allo
26c30 63 61 74 65 64 20 46 74 73 33 54 6f 6b 65 6e 41  cated Fts3TokenA
26c40 6e 64 43 6f 73 74 20 61 72 72 61 79 2e 0a 2a 2a  ndCost array..**
26c50 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e  .** If *pRc is n
26c60 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  ot SQLITE_OK whe
26c70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26c80 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
26c90 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
26ca0 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
26cb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
26cc0 67 20 65 78 65 63 75 74 69 6f 6e 2c 20 2a 70 52  g execution, *pR
26cd0 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 0a 2a  c is set to an.*
26ce0 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
26cf0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
26d00 6f 69 64 20 66 74 73 33 45 76 61 6c 54 6f 6b 65  oid fts3EvalToke
26d10 6e 43 6f 73 74 73 28 0a 20 20 46 74 73 33 43 75  nCosts(.  Fts3Cu
26d20 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
26d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
26d40 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a   Cursor handle *
26d50 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 52  /.  Fts3Expr *pR
26d60 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
26d70 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f 66 20 63      /* Root of c
26d80 75 72 72 65 6e 74 20 41 4e 44 2f 4e 45 41 52 20  urrent AND/NEAR 
26d90 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 46 74 73  cluster */.  Fts
26da0 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20  3Expr *pExpr,   
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26dc0 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f  Expression to co
26dd0 6e 73 69 64 65 72 20 2a 2f 0a 20 20 46 74 73 33  nsider */.  Fts3
26de0 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 2a 70  TokenAndCost **p
26df0 70 54 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  pTC,        /* W
26e00 72 69 74 65 20 6e 65 77 20 65 6e 74 72 69 65 73  rite new entries
26e10 20 74 6f 20 2a 28 2a 70 70 54 43 29 2b 2b 20 2a   to *(*ppTC)++ *
26e20 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 2a 2a  /.  Fts3Expr ***
26e30 70 70 4f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ppOr,           
26e40 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
26e50 20 4f 52 20 72 6f 6f 74 20 74 6f 20 2a 28 2a 70   OR root to *(*p
26e60 70 4f 72 29 2b 2b 20 2a 2f 0a 20 20 69 6e 74 20  pOr)++ */.  int 
26e70 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
26e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26e90 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
26ea0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70  e */.){.  if( *p
26eb0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
26ec0 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
26ed0 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
26ee0 50 48 52 41 53 45 20 29 7b 0a 20 20 20 20 20 20  PHRASE ){.      
26ef0 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68 72  Fts3Phrase *pPhr
26f00 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50 68  ase = pExpr->pPh
26f10 72 61 73 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  rase;.      int 
26f20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
26f30 3b 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ; *pRc==SQLITE_O
26f40 4b 20 26 26 20 69 3c 70 50 68 72 61 73 65 2d 3e  K && i<pPhrase->
26f50 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  nToken; i++){.  
26f60 20 20 20 20 20 20 46 74 73 33 54 6f 6b 65 6e 41        Fts3TokenA
26f70 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d 20 28 2a  ndCost *pTC = (*
26f80 70 70 54 43 29 2b 2b 3b 0a 20 20 20 20 20 20 20  ppTC)++;.       
26f90 20 70 54 43 2d 3e 70 50 68 72 61 73 65 20 3d 20   pTC->pPhrase = 
26fa0 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20  pPhrase;.       
26fb0 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 20 3d 20 69   pTC->iToken = i
26fc0 3b 0a 20 20 20 20 20 20 20 20 70 54 43 2d 3e 70  ;.        pTC->p
26fd0 52 6f 6f 74 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  Root = pRoot;.  
26fe0 20 20 20 20 20 20 70 54 43 2d 3e 70 54 6f 6b 65        pTC->pToke
26ff0 6e 20 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54  n = &pPhrase->aT
27000 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  oken[i];.       
27010 20 70 54 43 2d 3e 69 43 6f 6c 20 3d 20 70 50 68   pTC->iCol = pPh
27020 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  rase->iColumn;. 
27030 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 73 71         *pRc = sq
27040 6c 69 74 65 33 46 74 73 33 4d 73 72 4f 76 66 6c  lite3Fts3MsrOvfl
27050 28 70 43 73 72 2c 20 70 54 43 2d 3e 70 54 6f 6b  (pCsr, pTC->pTok
27060 65 6e 2d 3e 70 53 65 67 63 73 72 2c 20 26 70 54  en->pSegcsr, &pT
27070 43 2d 3e 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  C->nOvfl);.     
27080 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
27090 20 70 45 78 70 72 2d 3e 65 54 79 70 65 21 3d 46   pExpr->eType!=F
270a0 54 53 51 55 45 52 59 5f 4e 4f 54 20 29 7b 0a 20  TSQUERY_NOT ){. 
270b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
270c0 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
270d0 45 52 59 5f 4f 52 0a 20 20 20 20 20 20 20 20 20  ERY_OR.         
270e0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70    || pExpr->eTyp
270f0 65 3d 3d 46 54 53 51 55 45 52 59 5f 41 4e 44 0a  e==FTSQUERY_AND.
27100 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
27110 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  xpr->eType==FTSQ
27120 55 45 52 59 5f 4e 45 41 52 0a 20 20 20 20 20 20  UERY_NEAR.      
27130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27140 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 26 26   pExpr->pLeft &&
27150 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
27160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
27170 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
27180 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  RY_OR ){.       
27190 20 70 52 6f 6f 74 20 3d 20 70 45 78 70 72 2d 3e   pRoot = pExpr->
271a0 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 2a  pLeft;.        *
271b0 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74 3b 0a 20  *ppOr = pRoot;. 
271c0 20 20 20 20 20 20 20 28 2a 70 70 4f 72 29 2b 2b         (*ppOr)++
271d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
271e0 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43 6f 73  fts3EvalTokenCos
271f0 74 73 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c 20  ts(pCsr, pRoot, 
27200 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 70  pExpr->pLeft, pp
27210 54 43 2c 20 70 70 4f 72 2c 20 70 52 63 29 3b 0a  TC, ppOr, pRc);.
27220 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
27230 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59  >eType==FTSQUERY
27240 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OR ){.        p
27250 52 6f 6f 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  Root = pExpr->pR
27260 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 2a 2a  ight;.        **
27270 70 70 4f 72 20 3d 20 70 52 6f 6f 74 3b 0a 20 20  ppOr = pRoot;.  
27280 20 20 20 20 20 20 28 2a 70 70 4f 72 29 2b 2b 3b        (*ppOr)++;
27290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
272a0 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43 6f 73 74  ts3EvalTokenCost
272b0 73 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c 20 70  s(pCsr, pRoot, p
272c0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 70  Expr->pRight, pp
272d0 54 43 2c 20 70 70 4f 72 2c 20 70 52 63 29 3b 0a  TC, ppOr, pRc);.
272e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
272f0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
27300 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e   average documen
27310 74 20 28 72 6f 77 29 20 73 69 7a 65 20 69 6e 20  t (row) size in 
27320 70 61 67 65 73 2e 20 49 66 20 73 75 63 63 65 73  pages. If succes
27330 73 66 75 6c 2c 0a 2a 2a 20 77 72 69 74 65 20 74  sful,.** write t
27340 68 69 73 20 76 61 6c 75 65 20 74 6f 20 2a 70 6e  his value to *pn
27350 50 61 67 65 20 61 6e 64 20 72 65 74 75 72 6e 20  Page and return 
27360 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
27370 77 69 73 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  wise, return.** 
27380 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27390 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
273a0 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e 74  average document
273b0 20 73 69 7a 65 20 69 6e 20 70 61 67 65 73 20 69   size in pages i
273c0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20  s calculated by 
273d0 66 69 72 73 74 20 63 61 6c 63 75 6c 61 74 69 6e  first calculatin
273e0 67 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 69 6e  g .** determinin
273f0 67 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  g the average si
27400 7a 65 20 69 6e 20 62 79 74 65 73 2c 20 42 2e 20  ze in bytes, B. 
27410 49 66 20 42 20 69 73 20 6c 65 73 73 20 74 68 61  If B is less tha
27420 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  n the amount.** 
27430 6f 66 20 64 61 74 61 20 74 68 61 74 20 77 69 6c  of data that wil
27440 6c 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  l fit on a singl
27450 65 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 61  e leaf page of a
27460 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 69  n intkey table i
27470 6e 0a 2a 2a 20 74 68 69 73 20 64 61 74 61 62 61  n.** this databa
27480 73 65 2c 20 74 68 65 6e 20 74 68 65 20 61 76 65  se, then the ave
27490 72 61 67 65 20 64 6f 63 73 69 7a 65 20 69 73 20  rage docsize is 
274a0 31 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  1. Otherwise, it
274b0 20 69 73 20 31 20 70 6c 75 73 0a 2a 2a 20 74 68   is 1 plus.** th
274c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72  e number of over
274d0 66 6c 6f 77 20 70 61 67 65 73 20 63 6f 6e 73 75  flow pages consu
274e0 6d 65 64 20 62 79 20 61 20 72 65 63 6f 72 64 20  med by a record 
274f0 42 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  B bytes in size.
27500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27510 74 73 33 45 76 61 6c 41 76 65 72 61 67 65 44 6f  ts3EvalAverageDo
27520 63 73 69 7a 65 28 46 74 73 33 43 75 72 73 6f 72  csize(Fts3Cursor
27530 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 6e 50   *pCsr, int *pnP
27540 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
27550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
27560 28 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3d  ( pCsr->nRowAvg=
27570 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
27580 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e   average documen
27590 74 20 73 69 7a 65 2c 20 77 68 69 63 68 20 69 73  t size, which is
275a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 61 6c   required to cal
275b0 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 0a  culate the cost.
275c0 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 64      ** of each d
275d0 6f 63 6c 69 73 74 2c 20 68 61 73 20 6e 6f 74 20  oclist, has not 
275e0 79 65 74 20 62 65 65 6e 20 64 65 74 65 72 6d 69  yet been determi
275f0 6e 65 64 2e 20 52 65 61 64 20 74 68 65 20 72 65  ned. Read the re
27600 71 75 69 72 65 64 20 0a 20 20 20 20 2a 2a 20 64  quired .    ** d
27610 61 74 61 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  ata from the %_s
27620 74 61 74 20 74 61 62 6c 65 20 74 6f 20 63 61 6c  tat table to cal
27630 63 75 6c 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  culate it..    *
27640 2a 0a 20 20 20 20 2a 2a 20 45 6e 74 72 79 20 30  *.    ** Entry 0
27650 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74   of the %_stat t
27660 61 62 6c 65 20 69 73 20 61 20 62 6c 6f 62 20 63  able is a blob c
27670 6f 6e 74 61 69 6e 69 6e 67 20 28 6e 43 6f 6c 2b  ontaining (nCol+
27680 31 29 20 46 54 53 33 20 0a 20 20 20 20 2a 2a 20  1) FTS3 .    ** 
27690 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20 6e  varints, where n
276a0 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Col is the numbe
276b0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
276c0 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 0a  the FTS3 table..
276d0 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
276e0 20 76 61 72 69 6e 74 20 69 73 20 74 68 65 20 6e   varint is the n
276f0 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
27700 74 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ts currently sto
27710 72 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  red in.    ** th
27720 65 20 74 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c  e table. The fol
27730 6c 6f 77 69 6e 67 20 6e 43 6f 6c 20 76 61 72 69  lowing nCol vari
27740 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  nts contain the 
27750 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 0a  total amount of.
27760 20 20 20 20 2a 2a 20 64 61 74 61 20 73 74 6f 72      ** data stor
27770 65 64 20 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f  ed in all rows o
27780 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  f each column of
27790 20 74 68 65 20 74 61 62 6c 65 2c 20 66 72 6f 6d   the table, from
277a0 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 74 6f 20   left.    ** to 
277b0 72 69 67 68 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  right..    */.  
277c0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
277d0 20 28 46 74 73 33 54 61 62 6c 65 2a 29 70 43 73   (Fts3Table*)pCs
277e0 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
277f0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
27800 2a 70 53 74 6d 74 3b 0a 20 20 20 20 73 71 6c 69  *pStmt;.    sqli
27810 74 65 33 5f 69 6e 74 36 34 20 6e 44 6f 63 20 3d  te3_int64 nDoc =
27820 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
27830 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20 30 3b  int64 nByte = 0;
27840 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
27850 2a 70 45 6e 64 3b 0a 20 20 20 20 63 6f 6e 73 74  *pEnd;.    const
27860 20 63 68 61 72 20 2a 61 3b 0a 0a 20 20 20 20 72   char *a;..    r
27870 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
27880 65 6c 65 63 74 44 6f 63 74 6f 74 61 6c 28 70 2c  electDoctotal(p,
27890 20 26 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66   &pStmt);.    if
278a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
278b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
278c0 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   a = sqlite3_col
278d0 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
278e0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
278f0 61 20 29 3b 0a 0a 20 20 20 20 70 45 6e 64 20 3d  a );..    pEnd =
27900 20 26 61 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75   &a[sqlite3_colu
27910 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
27920 30 29 5d 3b 0a 20 20 20 20 61 20 2b 3d 20 73 71  0)];.    a += sq
27930 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
27940 6e 74 28 61 2c 20 26 6e 44 6f 63 29 3b 0a 20 20  nt(a, &nDoc);.  
27950 20 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20    while( a<pEnd 
27960 29 7b 0a 20 20 20 20 20 20 61 20 2b 3d 20 73 71  ){.      a += sq
27970 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
27980 6e 74 28 61 2c 20 26 6e 42 79 74 65 29 3b 0a 20  nt(a, &nByte);. 
27990 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 44 6f     }.    if( nDo
279a0 63 3d 3d 30 20 7c 7c 20 6e 42 79 74 65 3d 3d 30  c==0 || nByte==0
279b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
279c0 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
279d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 54 53        return FTS
279e0 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20  _CORRUPT_VTAB;. 
279f0 20 20 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e     }..    pCsr->
27a00 6e 44 6f 63 20 3d 20 6e 44 6f 63 3b 0a 20 20 20  nDoc = nDoc;.   
27a10 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 20 3d   pCsr->nRowAvg =
27a20 20 28 69 6e 74 29 28 28 28 6e 42 79 74 65 20 2f   (int)(((nByte /
27a30 20 6e 44 6f 63 29 20 2b 20 70 2d 3e 6e 50 67 73   nDoc) + p->nPgs
27a40 7a 29 20 2f 20 70 2d 3e 6e 50 67 73 7a 29 3b 0a  z) / p->nPgsz);.
27a50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
27a60 2d 3e 6e 52 6f 77 41 76 67 3e 30 20 29 3b 20 0a  ->nRowAvg>0 ); .
27a70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27a80 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
27a90 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   }..  *pnPage = 
27aa0 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3b 0a 20  pCsr->nRowAvg;. 
27ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27ac0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27ad0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
27ae0 73 65 6c 65 63 74 20 74 68 65 20 74 6f 6b 65 6e  select the token
27af0 73 20 28 69 66 20 61 6e 79 29 20 74 68 61 74 20  s (if any) that 
27b00 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 64 65 66 65  will be .** defe
27b10 72 72 65 64 2e 20 54 68 65 20 61 72 72 61 79 20  rred. The array 
27b20 61 54 43 5b 5d 20 68 61 73 20 61 6c 72 65 61 64  aTC[] has alread
27b30 79 20 62 65 65 6e 20 70 6f 70 75 6c 61 74 65 64  y been populated
27b40 20 77 68 65 6e 20 74 68 69 73 20 69 73 0a 2a 2a   when this is.**
27b50 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
27b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27b70 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
27b80 65 61 63 68 20 41 4e 44 2f 4e 45 41 52 20 63 6c  each AND/NEAR cl
27b90 75 73 74 65 72 20 69 6e 20 74 68 65 20 0a 2a 2a  uster in the .**
27ba0 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 45 61 63   expression. Eac
27bb0 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20 64 65 74  h invocation det
27bc0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 74 6f  ermines which to
27bd0 6b 65 6e 73 20 74 6f 20 64 65 66 65 72 20 77 69  kens to defer wi
27be0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 63 6c 75 73  thin.** the clus
27bf0 74 65 72 20 77 69 74 68 20 72 6f 6f 74 20 6e 6f  ter with root no
27c00 64 65 20 70 52 6f 6f 74 2e 20 53 65 65 20 63 6f  de pRoot. See co
27c10 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 74 68 65  mments above the
27c20 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a 2a 20 6f   definition.** o
27c30 66 20 73 74 72 75 63 74 20 46 74 73 33 54 6f 6b  f struct Fts3Tok
27c40 65 6e 41 6e 64 43 6f 73 74 20 66 6f 72 20 6d 6f  enAndCost for mo
27c50 72 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  re details..**.*
27c60 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
27c70 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
27c80 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
27c90 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72  sqlite3Fts3Defer
27ca0 54 6f 6b 65 6e 28 29 0a 2a 2a 20 63 61 6c 6c 65  Token().** calle
27cb0 64 20 6f 6e 20 65 61 63 68 20 74 6f 6b 65 6e 20  d on each token 
27cc0 74 6f 20 64 65 66 65 72 2e 20 4f 74 68 65 72 77  to defer. Otherw
27cd0 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ise, an SQLite e
27ce0 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20  rror code is.** 
27cf0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
27d00 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c  tic int fts3Eval
27d10 53 65 6c 65 63 74 44 65 66 65 72 72 65 64 28 0a  SelectDeferred(.
27d20 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
27d30 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
27d40 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72 20    /* FTS Cursor 
27d50 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33  handle */.  Fts3
27d60 45 78 70 72 20 2a 70 52 6f 6f 74 2c 20 20 20 20  Expr *pRoot,    
27d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
27d80 6f 6e 73 69 64 65 72 20 74 6f 6b 65 6e 73 20 77  onsider tokens w
27d90 69 74 68 20 74 68 69 73 20 72 6f 6f 74 20 6e 6f  ith this root no
27da0 64 65 20 2a 2f 0a 20 20 46 74 73 33 54 6f 6b 65  de */.  Fts3Toke
27db0 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43 2c 20 20  nAndCost *aTC,  
27dc0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
27dd0 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 74   of expression t
27de0 6f 6b 65 6e 73 20 61 6e 64 20 63 6f 73 74 73 20  okens and costs 
27df0 2a 2f 0a 20 20 69 6e 74 20 6e 54 43 20 20 20 20  */.  int nTC    
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27e20 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 43  f entries in aTC
27e30 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54  [] */.){.  Fts3T
27e40 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74  able *pTab = (Ft
27e50 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e  s3Table *)pCsr->
27e60 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e  base.pVtab;.  in
27e70 74 20 6e 44 6f 63 53 69 7a 65 20 3d 20 30 3b 20  t nDocSize = 0; 
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27e90 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
27ea0 20 70 65 72 20 64 6f 63 20 6c 6f 61 64 65 64 20   per doc loaded 
27eb0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
27ec0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
27ed0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
27ee0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ode */.  int ii;
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
27f10 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 66 6f  ator variable fo
27f20 72 20 76 61 72 69 6f 75 73 20 70 75 72 70 6f 73  r various purpos
27f30 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 76 66  es */.  int nOvf
27f40 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
27f50 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
27f60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
27f70 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 73  used by doclists
27f80 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
27f90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27fa0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
27fb0 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20  umber of tokens 
27fc0 69 6e 20 63 6c 75 73 74 65 72 20 2a 2f 0a 0a 20  in cluster */.. 
27fd0 20 69 6e 74 20 6e 4d 69 6e 45 73 74 20 3d 20 30   int nMinEst = 0
27fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27ff0 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
28000 63 6f 75 6e 74 20 66 6f 72 20 61 6e 79 20 70 68  count for any ph
28010 72 61 73 65 20 73 6f 20 66 61 72 2e 20 2a 2f 0a  rase so far. */.
28020 20 20 69 6e 74 20 6e 4c 6f 61 64 34 20 3d 20 31    int nLoad4 = 1
28030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28040 20 20 2f 2a 20 28 50 68 72 61 73 65 73 20 74 68    /* (Phrases th
28050 61 74 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64 65  at will be loade
28060 64 29 5e 34 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  d)^4. */..  /* T
28070 6f 6b 65 6e 73 20 61 72 65 20 6e 65 76 65 72 20  okens are never 
28080 64 65 66 65 72 72 65 64 20 66 6f 72 20 46 54 53  deferred for FTS
28090 20 74 61 62 6c 65 73 20 63 72 65 61 74 65 64 20   tables created 
280a0 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  using the conten
280b0 74 3d 78 78 78 0a 20 20 2a 2a 20 6f 70 74 69 6f  t=xxx.  ** optio
280c0 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e 20 62 65  n. The reason be
280d0 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 6e  ing that it is n
280e0 6f 74 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  ot guaranteed th
280f0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 20  at the content. 
28100 20 2a 2a 20 74 61 62 6c 65 20 61 63 74 75 61 6c   ** table actual
28110 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ly contains the 
28120 73 61 6d 65 20 64 61 74 61 20 61 73 20 74 68 65  same data as the
28130 20 69 6e 64 65 78 2e 20 54 6f 20 70 72 65 76 65   index. To preve
28140 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 2a  nt this from.  *
28150 2a 20 63 61 75 73 69 6e 67 20 61 6e 79 20 70 72  * causing any pr
28160 6f 62 6c 65 6d 73 2c 20 74 68 65 20 64 65 66 65  oblems, the defe
28170 72 72 65 64 20 74 6f 6b 65 6e 20 6f 70 74 69 6d  rred token optim
28180 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c  ization is compl
28190 65 74 65 6c 79 0a 20 20 2a 2a 20 64 69 73 61 62  etely.  ** disab
281a0 6c 65 64 20 66 6f 72 20 63 6f 6e 74 65 6e 74 3d  led for content=
281b0 78 78 78 20 74 61 62 6c 65 73 2e 20 2a 2f 0a 20  xxx tables. */. 
281c0 20 69 66 28 20 70 54 61 62 2d 3e 7a 43 6f 6e 74   if( pTab->zCont
281d0 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20 20 72 65  entTbl ){.    re
281e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
281f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20    }..  /* Count 
28200 74 68 65 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68  the tokens in th
28210 69 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73  is AND/NEAR clus
28220 74 65 72 2e 20 49 66 20 6e 6f 6e 65 20 6f 66 20  ter. If none of 
28230 74 68 65 20 64 6f 63 6c 69 73 74 73 0a 20 20 2a  the doclists.  *
28240 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
28250 68 20 74 68 65 20 74 6f 6b 65 6e 73 20 73 70 69  h the tokens spi
28260 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll onto overflow
28270 20 70 61 67 65 73 2c 20 6f 72 20 69 66 20 74 68   pages, or if th
28280 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 6c 79  ere is.  ** only
28290 20 31 20 74 6f 6b 65 6e 2c 20 65 78 69 74 20 65   1 token, exit e
282a0 61 72 6c 79 2e 20 4e 6f 20 74 6f 6b 65 6e 73 20  arly. No tokens 
282b0 74 6f 20 64 65 66 65 72 20 69 6e 20 74 68 69 73  to defer in this
282c0 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66 6f 72 28   case. */.  for(
282d0 69 69 3d 30 3b 20 69 69 3c 6e 54 43 3b 20 69 69  ii=0; ii<nTC; ii
282e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 54 43  ++){.    if( aTC
282f0 5b 69 69 5d 2e 70 52 6f 6f 74 3d 3d 70 52 6f 6f  [ii].pRoot==pRoo
28300 74 20 29 7b 0a 20 20 20 20 20 20 6e 4f 76 66 6c  t ){.      nOvfl
28310 20 2b 3d 20 61 54 43 5b 69 69 5d 2e 6e 4f 76 66   += aTC[ii].nOvf
28320 6c 3b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 2b  l;.      nToken+
28330 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
28340 66 28 20 6e 4f 76 66 6c 3d 3d 30 20 7c 7c 20 6e  f( nOvfl==0 || n
28350 54 6f 6b 65 6e 3c 32 20 29 20 72 65 74 75 72 6e  Token<2 ) return
28360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
28370 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 61 76 65  * Obtain the ave
28380 72 61 67 65 20 64 6f 63 73 69 7a 65 20 28 69 6e  rage docsize (in
28390 20 70 61 67 65 73 29 2e 20 2a 2f 0a 20 20 72 63   pages). */.  rc
283a0 20 3d 20 66 74 73 33 45 76 61 6c 41 76 65 72 61   = fts3EvalAvera
283b0 67 65 44 6f 63 73 69 7a 65 28 70 43 73 72 2c 20  geDocsize(pCsr, 
283c0 26 6e 44 6f 63 53 69 7a 65 29 3b 0a 20 20 61 73  &nDocSize);.  as
283d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
283e0 5f 4f 4b 20 7c 7c 20 6e 44 6f 63 53 69 7a 65 3e  _OK || nDocSize>
283f0 30 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49 74 65 72  0 );...  /* Iter
28400 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
28410 74 6f 6b 65 6e 73 20 69 6e 20 74 68 69 73 20 41  tokens in this A
28420 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74 65 72 2c  ND/NEAR cluster,
28430 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
28440 64 65 72 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65  der .  ** of the
28450 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72 66   number of overf
28460 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 77  low pages that w
28470 69 6c 6c 20 62 65 20 6c 6f 61 64 65 64 20 62 79  ill be loaded by
28480 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
28490 20 0a 20 20 2a 2a 20 74 6f 20 72 65 74 72 69 65   .  ** to retrie
284a0 76 65 20 74 68 65 20 65 6e 74 69 72 65 20 64 6f  ve the entire do
284b0 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 6f  clist for the to
284c0 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20 66 75 6c  ken from the ful
284d0 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e 0a 20 20  l-text index..  
284e0 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64 6f 63 6c  ** Load the docl
284f0 69 73 74 73 20 66 6f 72 20 74 6f 6b 65 6e 73 20  ists for tokens 
28500 74 68 61 74 20 61 72 65 20 65 69 74 68 65 72 3a  that are either:
28510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 61 2e 20  .  **.  **   a. 
28520 54 68 65 20 63 68 65 61 70 65 73 74 20 74 6f 6b  The cheapest tok
28530 65 6e 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  en in the entire
28540 20 71 75 65 72 79 20 28 69 2e 65 2e 20 74 68 65   query (i.e. the
28550 20 6f 6e 65 20 76 69 73 69 74 65 64 20 62 79 20   one visited by 
28560 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 66 69  the.  **      fi
28570 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
28580 20 74 68 69 73 20 6c 6f 6f 70 29 2c 20 6f 72 0a   this loop), or.
28590 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62 2e 20 50    **.  **   b. P
285a0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 74  art of a multi-t
285b0 6f 6b 65 6e 20 70 68 72 61 73 65 2e 0a 20 20 2a  oken phrase..  *
285c0 2a 0a 20 20 2a 2a 20 41 66 74 65 72 20 65 61 63  *.  ** After eac
285d0 68 20 74 6f 6b 65 6e 20 64 6f 63 6c 69 73 74 20  h token doclist 
285e0 69 73 20 6c 6f 61 64 65 64 2c 20 6d 65 72 67 65  is loaded, merge
285f0 20 69 74 20 77 69 74 68 20 74 68 65 20 6f 74 68   it with the oth
28600 65 72 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ers from the.  *
28610 2a 20 73 61 6d 65 20 70 68 72 61 73 65 20 61 6e  * same phrase an
28620 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
28630 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
28640 74 68 61 74 20 74 68 65 20 6d 65 72 67 65 64 20  that the merged 
28650 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 63 6f 6e  doclist.  ** con
28660 74 61 69 6e 73 2e 20 53 65 74 20 76 61 72 69 61  tains. Set varia
28670 62 6c 65 20 22 6e 4d 69 6e 45 73 74 22 20 74 6f  ble "nMinEst" to
28680 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6e 75   the smallest nu
28690 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74  mber of document
286a0 73 20 69 6e 20 0a 20 20 2a 2a 20 61 6e 79 20 70  s in .  ** any p
286b0 68 72 61 73 65 20 64 6f 63 6c 69 73 74 20 66 6f  hrase doclist fo
286c0 72 20 77 68 69 63 68 20 31 20 6f 72 20 6d 6f 72  r which 1 or mor
286d0 65 20 74 6f 6b 65 6e 20 64 6f 63 6c 69 73 74 73  e token doclists
286e0 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 61 64 65   have been loade
286f0 64 2e 0a 20 20 2a 2a 20 4c 65 74 20 6e 4f 74 68  d..  ** Let nOth
28700 65 72 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  er be the number
28710 20 6f 66 20 6f 74 68 65 72 20 70 68 72 61 73 65   of other phrase
28720 73 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  s for which it i
28730 73 20 63 65 72 74 61 69 6e 20 74 68 61 74 0a 20  s certain that. 
28740 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   ** one or more 
28750 74 6f 6b 65 6e 73 20 77 69 6c 6c 20 6e 6f 74 20  tokens will not 
28760 62 65 20 64 65 66 65 72 72 65 64 2e 0a 20 20 2a  be deferred..  *
28770 2a 0a 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f 72  *.  ** Then, for
28780 20 65 61 63 68 20 74 6f 6b 65 6e 2c 20 64 65 66   each token, def
28790 65 72 20 69 74 20 69 66 20 6c 6f 61 64 69 6e 67  er it if loading
287a0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 77 6f 75   the doclist wou
287b0 6c 64 20 72 65 73 75 6c 74 20 69 6e 0a 20 20 2a  ld result in.  *
287c0 2a 20 6c 6f 61 64 69 6e 67 20 4e 20 6f 72 20 6d  * loading N or m
287d0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
287e0 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2c 20  es into memory, 
287f0 77 68 65 72 65 20 4e 20 69 73 20 63 6f 6d 70 75  where N is compu
28800 74 65 64 20 61 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ted as:.  **.  *
28810 2a 20 20 20 20 28 6e 4d 69 6e 45 73 74 20 2b 20  *    (nMinEst + 
28820 34 5e 6e 4f 74 68 65 72 20 2d 20 31 29 20 2f 20  4^nOther - 1) / 
28830 28 34 5e 6e 4f 74 68 65 72 29 0a 20 20 2a 2f 0a  (4^nOther).  */.
28840 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
28850 54 6f 6b 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  Token && rc==SQL
28860 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
28870 20 20 20 69 6e 74 20 69 54 43 3b 20 20 20 20 20     int iTC;     
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
288a0 61 74 65 20 74 68 72 6f 75 67 68 20 61 54 43 5b  ate through aTC[
288b0 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20  ] array. */.    
288c0 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74  Fts3TokenAndCost
288d0 20 2a 70 54 43 20 3d 20 30 3b 20 20 20 20 2f 2a   *pTC = 0;    /*
288e0 20 53 65 74 20 74 6f 20 63 68 65 61 70 65 73 74   Set to cheapest
288f0 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 6b 65 6e   remaining token
28900 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  . */..    /* Set
28910 20 70 54 43 20 74 6f 20 70 6f 69 6e 74 20 74 6f   pTC to point to
28920 20 74 68 65 20 63 68 65 61 70 65 73 74 20 72 65   the cheapest re
28930 6d 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 2e 20 2a  maining token. *
28940 2f 0a 20 20 20 20 66 6f 72 28 69 54 43 3d 30 3b  /.    for(iTC=0;
28950 20 69 54 43 3c 6e 54 43 3b 20 69 54 43 2b 2b 29   iTC<nTC; iTC++)
28960 7b 0a 20 20 20 20 20 20 69 66 28 20 61 54 43 5b  {.      if( aTC[
28970 69 54 43 5d 2e 70 54 6f 6b 65 6e 20 26 26 20 61  iTC].pToken && a
28980 54 43 5b 69 54 43 5d 2e 70 52 6f 6f 74 3d 3d 70  TC[iTC].pRoot==p
28990 52 6f 6f 74 20 0a 20 20 20 20 20 20 20 26 26 20  Root .       && 
289a0 28 21 70 54 43 20 7c 7c 20 61 54 43 5b 69 54 43  (!pTC || aTC[iTC
289b0 5d 2e 6e 4f 76 66 6c 3c 70 54 43 2d 3e 6e 4f 76  ].nOvfl<pTC->nOv
289c0 66 6c 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  fl) .      ){.  
289d0 20 20 20 20 20 20 70 54 43 20 3d 20 26 61 54 43        pTC = &aTC
289e0 5b 69 54 43 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  [iTC];.      }. 
289f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
28a00 20 70 54 43 20 29 3b 0a 0a 20 20 20 20 69 66 28   pTC );..    if(
28a10 20 69 69 20 26 26 20 70 54 43 2d 3e 6e 4f 76 66   ii && pTC->nOvf
28a20 6c 3e 3d 28 28 6e 4d 69 6e 45 73 74 2b 28 6e 4c  l>=((nMinEst+(nL
28a30 6f 61 64 34 2f 34 29 2d 31 29 2f 28 6e 4c 6f 61  oad4/4)-1)/(nLoa
28a40 64 34 2f 34 29 29 2a 6e 44 6f 63 53 69 7a 65 20  d4/4))*nDocSize 
28a50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
28a60 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72 66 6c  number of overfl
28a70 6f 77 20 70 61 67 65 73 20 74 6f 20 6c 6f 61 64  ow pages to load
28a80 20 66 6f 72 20 74 68 69 73 20 28 61 6e 64 20 74   for this (and t
28a90 68 65 72 65 66 6f 72 65 20 61 6c 6c 0a 20 20 20  herefore all.   
28aa0 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
28ab0 29 20 74 6f 6b 65 6e 73 20 69 73 20 67 72 65 61  ) tokens is grea
28ac0 74 65 72 20 74 68 61 6e 20 74 68 65 20 65 73 74  ter than the est
28ad0 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
28ae0 20 70 61 67 65 73 20 0a 20 20 20 20 20 20 2a 2a   pages .      **
28af0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6c 6f   that will be lo
28b00 61 64 65 64 20 69 66 20 61 6c 6c 20 73 75 62 73  aded if all subs
28b10 65 71 75 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72  equent tokens ar
28b20 65 20 64 65 66 65 72 72 65 64 2e 0a 20 20 20 20  e deferred..    
28b30 20 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 33 50    */.      Fts3P
28b40 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b  hraseToken *pTok
28b50 65 6e 20 3d 20 70 54 43 2d 3e 70 54 6f 6b 65 6e  en = pTC->pToken
28b60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
28b70 69 74 65 33 46 74 73 33 44 65 66 65 72 54 6f 6b  ite3Fts3DeferTok
28b80 65 6e 28 70 43 73 72 2c 20 70 54 6f 6b 65 6e 2c  en(pCsr, pToken,
28b90 20 70 54 43 2d 3e 69 43 6f 6c 29 3b 0a 20 20 20   pTC->iCol);.   
28ba0 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72     fts3SegReader
28bb0 43 75 72 73 6f 72 46 72 65 65 28 70 54 6f 6b 65  CursorFree(pToke
28bc0 6e 2d 3e 70 53 65 67 63 73 72 29 3b 0a 20 20 20  n->pSegcsr);.   
28bd0 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63     pToken->pSegc
28be0 73 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  sr = 0;.    }els
28bf0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e{.      /* Set 
28c00 6e 4c 6f 61 64 34 20 74 6f 20 74 68 65 20 76 61  nLoad4 to the va
28c10 6c 75 65 20 6f 66 20 28 34 5e 6e 4f 74 68 65 72  lue of (4^nOther
28c20 29 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69  ) for the next i
28c30 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
28c40 20 20 20 20 20 20 2a 2a 20 66 6f 72 2d 6c 6f 6f        ** for-loo
28c50 70 2e 20 45 78 63 65 70 74 2c 20 6c 69 6d 69 74  p. Except, limit
28c60 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 32 5e   the value to 2^
28c70 32 34 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  24 to prevent it
28c80 20 66 72 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20   from .      ** 
28c90 6f 76 65 72 66 6c 6f 77 69 6e 67 20 74 68 65 20  overflowing the 
28ca0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
28cb0 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 2e 20  t is stored in. 
28cc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c  */.      if( ii<
28cd0 31 32 20 29 20 6e 4c 6f 61 64 34 20 3d 20 6e 4c  12 ) nLoad4 = nL
28ce0 6f 61 64 34 2a 34 3b 0a 0a 20 20 20 20 20 20 69  oad4*4;..      i
28cf0 66 28 20 69 69 3d 3d 30 20 7c 7c 20 28 70 54 43  f( ii==0 || (pTC
28d00 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65  ->pPhrase->nToke
28d10 6e 3e 31 20 26 26 20 69 69 21 3d 6e 54 6f 6b 65  n>1 && ii!=nToke
28d20 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-1) ){.        
28d30 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 69  /* Either this i
28d40 73 20 74 68 65 20 63 68 65 61 70 65 73 74 20 74  s the cheapest t
28d50 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 6e 74 69  oken in the enti
28d60 72 65 20 71 75 65 72 79 2c 20 6f 72 20 69 74 20  re query, or it 
28d70 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  is.        ** pa
28d80 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 74 6f  rt of a multi-to
28d90 6b 65 6e 20 70 68 72 61 73 65 2e 20 45 69 74 68  ken phrase. Eith
28da0 65 72 20 77 61 79 2c 20 74 68 65 20 65 6e 74 69  er way, the enti
28db0 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 0a  re doclist will.
28dc0 20 20 20 20 20 20 20 20 2a 2a 20 28 65 76 65 6e          ** (even
28dd0 74 75 61 6c 6c 79 29 20 62 65 20 6c 6f 61 64 65  tually) be loade
28de0 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
28df0 74 20 6d 61 79 20 61 73 20 77 65 6c 6c 20 62 65  t may as well be
28e00 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 20   now. */.       
28e10 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e   Fts3PhraseToken
28e20 20 2a 70 54 6f 6b 65 6e 20 3d 20 70 54 43 2d 3e   *pToken = pTC->
28e30 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  pToken;.        
28e40 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
28e50 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69         char *pLi
28e60 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
28e70 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65 6c  rc = fts3TermSel
28e80 65 63 74 28 70 54 61 62 2c 20 70 54 6f 6b 65 6e  ect(pTab, pToken
28e90 2c 20 70 54 43 2d 3e 69 43 6f 6c 2c 20 26 6e 4c  , pTC->iCol, &nL
28ea0 69 73 74 2c 20 26 70 4c 69 73 74 29 3b 0a 20 20  ist, &pList);.  
28eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
28ec0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
28ed0 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
28ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28f00 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 50    rc = fts3EvalP
28f10 68 72 61 73 65 4d 65 72 67 65 54 6f 6b 65 6e 28  hraseMergeToken(
28f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28f30 54 61 62 2c 20 70 54 43 2d 3e 70 50 68 72 61 73  Tab, pTC->pPhras
28f40 65 2c 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 2c 70  e, pTC->iToken,p
28f50 4c 69 73 74 2c 6e 4c 69 73 74 0a 20 20 20 20 20  List,nList.     
28f60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28f70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
28f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28f90 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f           int nCo
28fa0 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  unt;.          n
28fb0 43 6f 75 6e 74 20 3d 20 66 74 73 33 44 6f 63 6c  Count = fts3Docl
28fc0 69 73 74 43 6f 75 6e 74 44 6f 63 69 64 73 28 0a  istCountDocids(.
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
28fe0 43 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  C->pPhrase->docl
28ff0 69 73 74 2e 61 41 6c 6c 2c 20 70 54 43 2d 3e 70  ist.aAll, pTC->p
29000 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
29010 6e 41 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29  nAll.          )
29020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29030 69 69 3d 3d 30 20 7c 7c 20 6e 43 6f 75 6e 74 3c  ii==0 || nCount<
29040 6e 4d 69 6e 45 73 74 20 29 20 6e 4d 69 6e 45 73  nMinEst ) nMinEs
29050 74 20 3d 20 6e 43 6f 75 6e 74 3b 0a 20 20 20 20  t = nCount;.    
29060 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29070 20 20 7d 0a 20 20 20 20 70 54 43 2d 3e 70 54 6f    }.    pTC->pTo
29080 6b 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ken = 0;.  }..  
29090 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
290a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
290b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
290c0 20 77 69 74 68 69 6e 20 74 68 65 20 78 46 69 6c   within the xFil
290d0 74 65 72 20 6d 65 74 68 6f 64 2e 20 49 74 20 69  ter method. It i
290e0 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a 20 74 68  nitializes.** th
290f0 65 20 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72  e full-text quer
29100 79 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  y currently stor
29110 65 64 20 69 6e 20 70 43 73 72 2d 3e 70 45 78 70  ed in pCsr->pExp
29120 72 2e 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  r. To iterate th
29130 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 72 65 73  rough.** the res
29140 75 6c 74 73 20 6f 66 20 61 20 71 75 65 72 79 2c  ults of a query,
29150 20 74 68 65 20 63 61 6c 6c 65 72 20 64 6f 65 73   the caller does
29160 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 74 73 33 45  :.**.**    fts3E
29170 76 61 6c 53 74 61 72 74 28 70 43 73 72 29 3b 0a  valStart(pCsr);.
29180 2a 2a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  **    while( 1 )
29190 7b 0a 2a 2a 20 20 20 20 20 20 66 74 73 33 45 76  {.**      fts3Ev
291a0 61 6c 4e 65 78 74 28 70 43 73 72 29 3b 0a 2a 2a  alNext(pCsr);.**
291b0 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e        if( pCsr->
291c0 62 45 6f 66 20 29 20 62 72 65 61 6b 3b 0a 2a 2a  bEof ) break;.**
291d0 20 20 20 20 20 20 2e 2e 2e 20 72 65 74 75 72 6e        ... return
291e0 20 72 6f 77 20 70 43 73 72 2d 3e 69 50 72 65 76   row pCsr->iPrev
291f0 49 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  Id to the caller
29200 20 2e 2e 2e 0a 2a 2a 20 20 20 20 7d 0a 2a 2f 0a   ....**    }.*/.
29210 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
29220 76 61 6c 53 74 61 72 74 28 46 74 73 33 43 75 72  valStart(Fts3Cur
29230 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74  sor *pCsr){.  Ft
29240 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s3Table *pTab = 
29250 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
29260 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
29270 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29280 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  _OK;.  int nToke
29290 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f 72  n = 0;.  int nOr
292a0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f   = 0;..  /* Allo
292b0 63 61 74 65 20 61 20 4d 75 6c 74 69 53 65 67 52  cate a MultiSegR
292c0 65 61 64 65 72 20 66 6f 72 20 65 61 63 68 20 74  eader for each t
292d0 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 78 70 72  oken in the expr
292e0 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 66 74 73  ession. */.  fts
292f0 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65 52 65 61  3EvalAllocateRea
29300 64 65 72 73 28 70 43 73 72 2c 20 70 43 73 72 2d  ders(pCsr, pCsr-
29310 3e 70 45 78 70 72 2c 20 26 6e 54 6f 6b 65 6e 2c  >pExpr, &nToken,
29320 20 26 6e 4f 72 2c 20 26 72 63 29 3b 0a 0a 20 20   &nOr, &rc);..  
29330 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69  /* Determine whi
29340 63 68 2c 20 69 66 20 61 6e 79 2c 20 74 6f 6b 65  ch, if any, toke
29350 6e 73 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ns in the expres
29360 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 64  sion should be d
29370 65 66 65 72 72 65 64 2e 20 2a 2f 0a 23 69 66 6e  eferred. */.#ifn
29380 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
29390 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45 44  LE_FTS4_DEFERRED
293a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
293b0 45 5f 4f 4b 20 26 26 20 6e 54 6f 6b 65 6e 3e 31  E_OK && nToken>1
293c0 20 26 26 20 70 54 61 62 2d 3e 62 46 74 73 34 20   && pTab->bFts4 
293d0 29 7b 0a 20 20 20 20 46 74 73 33 54 6f 6b 65 6e  ){.    Fts3Token
293e0 41 6e 64 43 6f 73 74 20 2a 61 54 43 3b 0a 20 20  AndCost *aTC;.  
293f0 20 20 46 74 73 33 45 78 70 72 20 2a 2a 61 70 4f    Fts3Expr **apO
29400 72 3b 0a 20 20 20 20 61 54 43 20 3d 20 28 46 74  r;.    aTC = (Ft
29410 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a  s3TokenAndCost *
29420 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
29430 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
29440 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74  Fts3TokenAndCost
29450 29 20 2a 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 20  ) * nToken.     
29460 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 33 45 78   + sizeof(Fts3Ex
29470 70 72 20 2a 29 20 2a 20 6e 4f 72 20 2a 20 32 0a  pr *) * nOr * 2.
29480 20 20 20 20 29 3b 0a 20 20 20 20 61 70 4f 72 20      );.    apOr 
29490 3d 20 28 46 74 73 33 45 78 70 72 20 2a 2a 29 26  = (Fts3Expr **)&
294a0 61 54 43 5b 6e 54 6f 6b 65 6e 5d 3b 0a 0a 20 20  aTC[nToken];..  
294b0 20 20 69 66 28 20 21 61 54 43 20 29 7b 0a 20 20    if( !aTC ){.  
294c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
294d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
294e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
294f0 20 20 20 20 20 20 46 74 73 33 54 6f 6b 65 6e 41        Fts3TokenA
29500 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d 20 61 54  ndCost *pTC = aT
29510 43 3b 0a 20 20 20 20 20 20 46 74 73 33 45 78 70  C;.      Fts3Exp
29520 72 20 2a 2a 70 70 4f 72 20 3d 20 61 70 4f 72 3b  r **ppOr = apOr;
29530 0a 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  ..      fts3Eval
29540 54 6f 6b 65 6e 43 6f 73 74 73 28 70 43 73 72 2c  TokenCosts(pCsr,
29550 20 30 2c 20 70 43 73 72 2d 3e 70 45 78 70 72 2c   0, pCsr->pExpr,
29560 20 26 70 54 43 2c 20 26 70 70 4f 72 2c 20 26 72   &pTC, &ppOr, &r
29570 63 29 3b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e  c);.      nToken
29580 20 3d 20 28 69 6e 74 29 28 70 54 43 2d 61 54 43   = (int)(pTC-aTC
29590 29 3b 0a 20 20 20 20 20 20 6e 4f 72 20 3d 20 28  );.      nOr = (
295a0 69 6e 74 29 28 70 70 4f 72 2d 61 70 4f 72 29 3b  int)(ppOr-apOr);
295b0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ..      if( rc==
295c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
295d0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76       rc = fts3Ev
295e0 61 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65 64  alSelectDeferred
295f0 28 70 43 73 72 2c 20 30 2c 20 61 54 43 2c 20 6e  (pCsr, 0, aTC, n
29600 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
29610 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
29620 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4f  LITE_OK && ii<nO
29630 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
29640 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76 61      rc = fts3Eva
29650 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65 64 28  lSelectDeferred(
29660 70 43 73 72 2c 20 61 70 4f 72 5b 69 69 5d 2c 20  pCsr, apOr[ii], 
29670 61 54 43 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  aTC, nToken);.  
29680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
296a0 72 65 65 28 61 54 43 29 3b 0a 20 20 20 20 7d 0a  ree(aTC);.    }.
296b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 66 74    }.#endif..  ft
296c0 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64 65  s3EvalStartReade
296d0 72 73 28 70 43 73 72 2c 20 70 43 73 72 2d 3e 70  rs(pCsr, pCsr->p
296e0 45 78 70 72 2c 20 26 72 63 29 3b 0a 20 20 72 65  Expr, &rc);.  re
296f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29700 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
29710 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
29720 6e 20 6c 69 73 74 20 66 6f 72 20 70 68 72 61 73  n list for phras
29730 65 20 70 50 68 72 61 73 65 2e 0a 2a 2f 0a 73 74  e pPhrase..*/.st
29740 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 76  atic void fts3Ev
29750 61 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f 73 6c  alInvalidatePosl
29760 69 73 74 28 46 74 73 33 50 68 72 61 73 65 20 2a  ist(Fts3Phrase *
29770 70 50 68 72 61 73 65 29 7b 0a 20 20 69 66 28 20  pPhrase){.  if( 
29780 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
29790 2e 62 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20  .bFreeList ){.  
297a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
297b0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
297c0 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70 50  pList);.  }.  pP
297d0 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
297e0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70 50 68 72  List = 0;.  pPhr
297f0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69  ase->doclist.nLi
29800 73 74 20 3d 20 30 3b 0a 20 20 70 50 68 72 61 73  st = 0;.  pPhras
29810 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65 65  e->doclist.bFree
29820 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  List = 0;.}../*.
29830 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29840 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 64   is called to ed
29850 69 74 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  it the position 
29860 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20  list associated 
29870 77 69 74 68 0a 2a 2a 20 74 68 65 20 70 68 72 61  with.** the phra
29880 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  se object passed
29890 20 61 73 20 74 68 65 20 66 69 66 74 68 20 61 72   as the fifth ar
298a0 67 75 6d 65 6e 74 20 61 63 63 6f 72 64 69 6e 67  gument according
298b0 20 74 6f 20 61 20 4e 45 41 52 0a 2a 2a 20 63 6f   to a NEAR.** co
298c0 6e 64 69 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61  ndition. For exa
298d0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
298e0 61 62 63 20 4e 45 41 52 2f 35 20 22 64 65 66 20  abc NEAR/5 "def 
298f0 67 68 69 22 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ghi".**.** Param
29900 65 74 65 72 20 6e 4e 65 61 72 20 69 73 20 70 61  eter nNear is pa
29910 73 73 65 64 20 74 68 65 20 4e 45 41 52 20 64 69  ssed the NEAR di
29920 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 65 78  stance of the ex
29930 70 72 65 73 73 69 6f 6e 20 28 35 20 69 6e 0a 2a  pression (5 in.*
29940 2a 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  * the example ab
29950 6f 76 65 29 2e 20 57 68 65 6e 20 74 68 69 73 20  ove). When this 
29960 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
29970 65 64 2c 20 2a 70 61 50 6f 73 6c 69 73 74 20 70  ed, *paPoslist p
29980 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
29990 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20 61  position list, a
299a0 6e 64 20 2a 70 6e 54 6f 6b 65 6e 20 69 73 20 74  nd *pnToken is t
299b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 68 72  he number of phr
299c0 61 73 65 20 74 6f 6b 65 6e 73 20 69 6e 2c 20 74  ase tokens in, t
299d0 68 65 0a 2a 2a 20 70 68 72 61 73 65 20 6f 6e 20  he.** phrase on 
299e0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 6f  the other side o
299f0 66 20 74 68 65 20 4e 45 41 52 20 6f 70 65 72 61  f the NEAR opera
29a00 74 6f 72 20 74 6f 20 70 50 68 72 61 73 65 2e 20  tor to pPhrase. 
29a10 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20  For example,.** 
29a20 69 66 20 70 50 68 72 61 73 65 20 72 65 66 65 72  if pPhrase refer
29a30 73 20 74 6f 20 74 68 65 20 22 64 65 66 20 67 68  s to the "def gh
29a40 69 22 20 70 68 72 61 73 65 2c 20 74 68 65 6e 20  i" phrase, then 
29a50 2a 70 61 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74  *paPoslist point
29a60 73 20 74 6f 0a 2a 2a 20 74 68 65 20 70 6f 73 69  s to.** the posi
29a70 74 69 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63 69  tion list associ
29a80 61 74 65 64 20 77 69 74 68 20 70 68 72 61 73 65  ated with phrase
29a90 20 22 61 62 63 22 2e 0a 2a 2a 0a 2a 2a 20 41 6c   "abc"..**.** Al
29aa0 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74  l positions in t
29ab0 68 65 20 70 50 68 72 61 73 65 20 70 6f 73 69 74  he pPhrase posit
29ac0 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 61 72  ion list that ar
29ad0 65 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  e not sufficient
29ae0 6c 79 0a 2a 2a 20 63 6c 6f 73 65 20 74 6f 20 61  ly.** close to a
29af0 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
29b00 20 2a 70 61 50 6f 73 6c 69 73 74 20 70 6f 73 69   *paPoslist posi
29b10 74 69 6f 6e 20 6c 69 73 74 20 61 72 65 20 72 65  tion list are re
29b20 6d 6f 76 65 64 2e 20 49 66 20 74 68 69 73 0a 2a  moved. If this.*
29b30 2a 20 6c 65 61 76 65 73 20 30 20 70 6f 73 69 74  * leaves 0 posit
29b40 69 6f 6e 73 2c 20 7a 65 72 6f 20 69 73 20 72 65  ions, zero is re
29b50 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
29b60 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  e, non-zero..**.
29b70 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
29b80 69 6e 67 2c 20 2a 70 61 50 6f 73 6c 69 73 74 20  ing, *paPoslist 
29b90 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
29ba0 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
29bb0 6c 73 69 74 20 0a 2a 2a 20 61 73 73 6f 63 69 61  lsit .** associa
29bc0 74 65 64 20 77 69 74 68 20 70 50 68 72 61 73 65  ted with pPhrase
29bd0 2e 20 41 6e 64 20 2a 70 6e 54 6f 6b 65 6e 20 69  . And *pnToken i
29be0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
29bf0 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e  ber of tokens in
29c00 0a 2a 2a 20 70 50 68 72 61 73 65 2e 0a 2a 2f 0a  .** pPhrase..*/.
29c10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
29c20 76 61 6c 4e 65 61 72 54 72 69 6d 28 0a 20 20 69  valNearTrim(.  i
29c30 6e 74 20 6e 4e 65 61 72 2c 20 20 20 20 20 20 20  nt nNear,       
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c50 2a 20 4e 45 41 52 20 64 69 73 74 61 6e 63 65 2e  * NEAR distance.
29c60 20 41 73 20 69 6e 20 22 4e 45 41 52 2f 6e 4e 65   As in "NEAR/nNe
29c70 61 72 22 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ar". */.  char *
29c80 61 54 6d 70 2c 20 20 20 20 20 20 20 20 20 20 20  aTmp,           
29c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
29ca0 70 6f 72 61 72 79 20 73 70 61 63 65 20 74 6f 20  porary space to 
29cb0 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  use */.  char **
29cc0 70 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20  paPoslist,      
29cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
29ce0 55 54 3a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73  UT: Position lis
29cf0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54 6f  t */.  int *pnTo
29d00 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
29d10 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
29d20 3a 20 54 6f 6b 65 6e 73 20 69 6e 20 70 68 72 61  : Tokens in phra
29d30 73 65 20 6f 66 20 2a 70 61 50 6f 73 6c 69 73 74  se of *paPoslist
29d40 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65   */.  Fts3Phrase
29d50 20 2a 70 50 68 72 61 73 65 20 20 20 20 20 20 20   *pPhrase       
29d60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 68 72        /* The phr
29d70 61 73 65 20 6f 62 6a 65 63 74 20 74 6f 20 74 72  ase object to tr
29d80 69 6d 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6f  im the doclist o
29d90 66 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  f */.){.  int nP
29da0 61 72 61 6d 31 20 3d 20 6e 4e 65 61 72 20 2b 20  aram1 = nNear + 
29db0 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
29dc0 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d 32 20 3d  .  int nParam2 =
29dd0 20 6e 4e 65 61 72 20 2b 20 2a 70 6e 54 6f 6b 65   nNear + *pnToke
29de0 6e 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 0a 20  n;.  int nNew;. 
29df0 20 63 68 61 72 20 2a 70 32 3b 20 0a 20 20 63 68   char *p2; .  ch
29e00 61 72 20 2a 70 4f 75 74 3b 20 0a 20 20 69 6e 74  ar *pOut; .  int
29e10 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   res;..  assert(
29e20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
29e30 74 2e 70 4c 69 73 74 20 29 3b 0a 0a 20 20 70 32  t.pList );..  p2
29e40 20 3d 20 70 4f 75 74 20 3d 20 70 50 68 72 61 73   = pOut = pPhras
29e50 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
29e60 3b 0a 20 20 72 65 73 20 3d 20 66 74 73 33 50 6f  ;.  res = fts3Po
29e70 73 6c 69 73 74 4e 65 61 72 4d 65 72 67 65 28 0a  slistNearMerge(.
29e80 20 20 20 20 26 70 4f 75 74 2c 20 61 54 6d 70 2c      &pOut, aTmp,
29e90 20 6e 50 61 72 61 6d 31 2c 20 6e 50 61 72 61 6d   nParam1, nParam
29ea0 32 2c 20 70 61 50 6f 73 6c 69 73 74 2c 20 26 70  2, paPoslist, &p
29eb0 32 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 65 73  2.  );.  if( res
29ec0 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 28   ){.    nNew = (
29ed0 69 6e 74 29 28 70 4f 75 74 20 2d 20 70 50 68 72  int)(pOut - pPhr
29ee0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
29ef0 73 74 29 20 2d 20 31 3b 0a 20 20 20 20 61 73 73  st) - 1;.    ass
29f00 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64 6f  ert( pPhrase->do
29f10 63 6c 69 73 74 2e 70 4c 69 73 74 5b 6e 4e 65 77  clist.pList[nNew
29f20 5d 3d 3d 27 5c 30 27 20 29 3b 0a 20 20 20 20 61  ]=='\0' );.    a
29f30 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 50 68  ssert( nNew<=pPh
29f40 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c  rase->doclist.nL
29f50 69 73 74 20 26 26 20 6e 4e 65 77 3e 30 20 29 3b  ist && nNew>0 );
29f60 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 50 68  .    memset(&pPh
29f70 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
29f80 69 73 74 5b 6e 4e 65 77 5d 2c 20 30 2c 20 70 50  ist[nNew], 0, pP
29f90 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e  hrase->doclist.n
29fa0 4c 69 73 74 20 2d 20 6e 4e 65 77 29 3b 0a 20 20  List - nNew);.  
29fb0 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69    pPhrase->docli
29fc0 73 74 2e 6e 4c 69 73 74 20 3d 20 6e 4e 65 77 3b  st.nList = nNew;
29fd0 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69 73 74 20  .    *paPoslist 
29fe0 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  = pPhrase->docli
29ff0 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 2a 70  st.pList;.    *p
2a000 6e 54 6f 6b 65 6e 20 3d 20 70 50 68 72 61 73 65  nToken = pPhrase
2a010 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 0a 20  ->nToken;.  }.. 
2a020 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
2a030 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2a040 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
2a050 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20  f *pRc is other 
2a060 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77  than SQLITE_OK w
2a070 68 65 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64  hen it is called
2a080 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
2a090 69 74 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  it advances the 
2a0a0 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73 65  expression passe
2a0b0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2a0c0 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 70  argument to.** p
2a0d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
2a0e0 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 20 69 6e   matching row in
2a0f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 45   the database. E
2a100 78 70 72 65 73 73 69 6f 6e 73 20 69 74 65 72 61  xpressions itera
2a110 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 6d 61  te through.** ma
2a120 74 63 68 69 6e 67 20 72 6f 77 73 20 69 6e 20 64  tching rows in d
2a130 6f 63 69 64 20 6f 72 64 65 72 2e 20 41 73 63 65  ocid order. Asce
2a140 6e 64 69 6e 67 20 6f 72 64 65 72 20 69 66 20 46  nding order if F
2a150 74 73 33 43 75 72 73 6f 72 2e 62 44 65 73 63 20  ts3Cursor.bDesc 
2a160 69 73 20 7a 65 72 6f 2c 0a 2a 2a 20 6f 72 20 64  is zero,.** or d
2a170 65 73 63 65 6e 64 69 6e 67 20 69 66 20 69 74 20  escending if it 
2a180 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  is non-zero..**.
2a190 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2a1a0 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20 73  ccurs, *pRc is s
2a1b0 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20  et to an SQLite 
2a1c0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
2a1d0 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 73 75 63  rwise, if.** suc
2a1e0 63 65 73 73 66 75 6c 2c 20 74 68 65 20 66 6f 6c  cessful, the fol
2a1f0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
2a200 20 69 6e 20 70 45 78 70 72 20 61 72 65 20 73 65   in pExpr are se
2a210 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 33 45  t:.**.**   Fts3E
2a220 78 70 72 2e 62 45 6f 66 20 20 20 20 20 20 20 20  xpr.bEof        
2a230 20 20 20 20 20 20 20 20 28 6e 6f 6e 2d 7a 65 72          (non-zer
2a240 6f 20 69 66 20 45 4f 46 20 2d 20 74 68 65 72 65  o if EOF - there
2a250 20 69 73 20 6e 6f 20 6e 65 78 74 20 72 6f 77 29   is no next row)
2a260 0a 2a 2a 20 20 20 46 74 73 33 45 78 70 72 2e 69  .**   Fts3Expr.i
2a270 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20 20  Docid           
2a280 20 20 20 28 76 61 6c 69 64 20 69 66 20 62 45 6f     (valid if bEo
2a290 66 3d 3d 30 2e 20 54 68 65 20 64 6f 63 69 64 20  f==0. The docid 
2a2a0 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77 29  of the next row)
2a2b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
2a2c0 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74  pression is of t
2a2d0 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48 52  ype FTSQUERY_PHR
2a2e0 41 53 45 2c 20 61 6e 64 20 74 68 65 20 65 78 70  ASE, and the exp
2a2f0 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ression is not.*
2a300 2a 20 61 74 20 45 4f 46 2c 20 74 68 65 6e 20 74  * at EOF, then t
2a310 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2a320 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
2a330 61 74 65 64 20 77 69 74 68 20 74 68 65 20 70 6f  ated with the po
2a340 73 69 74 69 6f 6e 20 6c 69 73 74 0a 2a 2a 20 66  sition list.** f
2a350 6f 72 20 74 68 65 20 70 68 72 61 73 65 20 66 6f  or the phrase fo
2a360 72 20 74 68 65 20 76 69 73 69 74 65 64 20 72 6f  r the visited ro
2a370 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54 73 33 45  w:.**.**   FTs3E
2a380 78 70 72 2e 70 50 68 72 61 73 65 2d 3e 64 6f 63  xpr.pPhrase->doc
2a390 6c 69 73 74 2e 6e 4c 69 73 74 20 20 20 20 20 20  list.nList      
2a3a0 20 20 28 6c 65 6e 67 74 68 20 6f 66 20 70 4c 69    (length of pLi
2a3b0 73 74 20 69 6e 20 62 79 74 65 73 29 0a 2a 2a 20  st in bytes).** 
2a3c0 20 20 46 54 73 33 45 78 70 72 2e 70 50 68 72 61    FTs3Expr.pPhra
2a3d0 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73  se->doclist.pLis
2a3e0 74 20 20 20 20 20 20 20 20 28 70 6f 69 6e 74 65  t        (pointe
2a3f0 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69  r to position li
2a400 73 74 29 0a 2a 2a 0a 2a 2a 20 49 74 20 73 61 79  st).**.** It say
2a410 73 20 61 62 6f 76 65 20 74 68 61 74 20 74 68 69  s above that thi
2a420 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e  s function advan
2a430 63 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ces the expressi
2a440 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 2a  on to the next.*
2a450 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 2e 20  * matching row. 
2a460 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
2a470 74 72 75 65 2c 20 62 75 74 20 74 68 65 72 65 20  true, but there 
2a480 61 72 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  are the followin
2a490 67 20 65 78 63 65 70 74 69 6f 6e 73 3a 0a 2a 2a  g exceptions:.**
2a4a0 0a 2a 2a 20 20 20 31 2e 20 44 65 66 65 72 72 65  .**   1. Deferre
2a4b0 64 20 74 6f 6b 65 6e 73 20 61 72 65 20 6e 6f 74  d tokens are not
2a4c0 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f   taken into acco
2a4d0 75 6e 74 2e 20 49 66 20 61 20 70 68 72 61 73 65  unt. If a phrase
2a4e0 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 20 20 20   consists.**    
2a4f0 20 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 64 65    entirely of de
2a500 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c 20 69  ferred tokens, i
2a510 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
2a520 6d 61 74 63 68 20 65 76 65 72 79 20 72 6f 77 20  match every row 
2a530 69 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 64  in.**      the d
2a540 62 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  b. In this case 
2a550 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
2a560 74 20 69 73 20 6e 6f 74 20 70 6f 70 75 6c 61 74  t is not populat
2a570 65 64 20 61 74 20 61 6c 6c 2e 20 0a 2a 2a 0a 2a  ed at all. .**.*
2a580 2a 20 20 20 20 20 20 4f 72 2c 20 69 66 20 61 20  *      Or, if a 
2a590 70 68 72 61 73 65 20 63 6f 6e 74 61 69 6e 73 20  phrase contains 
2a5a0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 65 66 65  one or more defe
2a5b0 72 72 65 64 20 74 6f 6b 65 6e 73 20 61 6e 64 20  rred tokens and 
2a5c0 6f 6e 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 6d  one or.**      m
2a5d0 6f 72 65 20 6e 6f 6e 2d 64 65 66 65 72 72 65 64  ore non-deferred
2a5e0 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e 20 74 68   tokens, then th
2a5f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
2a600 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
2a610 0a 2a 2a 20 20 20 20 20 20 6e 65 78 74 20 70 6f  .**      next po
2a620 73 73 69 62 6c 65 20 6d 61 74 63 68 2c 20 63 6f  ssible match, co
2a630 6e 73 69 64 65 72 69 6e 67 20 6f 6e 6c 79 20 6e  nsidering only n
2a640 6f 6e 2d 64 65 66 65 72 72 65 64 20 74 6f 6b 65  on-deferred toke
2a650 6e 73 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  ns. In other.** 
2a660 20 20 20 20 20 77 6f 72 64 73 2c 20 69 66 20 74       words, if t
2a670 68 65 20 70 68 72 61 73 65 20 69 73 20 22 41 20  he phrase is "A 
2a680 42 20 43 22 2c 20 61 6e 64 20 22 42 22 20 69 73  B C", and "B" is
2a690 20 64 65 66 65 72 72 65 64 2c 20 74 68 65 20 65   deferred, the e
2a6a0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20  xpression.**    
2a6b0 20 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f    is advanced to
2a6c0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 68   the next row th
2a6d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  at contains an i
2a6e0 6e 73 74 61 6e 63 65 20 6f 66 20 22 41 20 2a 20  nstance of "A * 
2a6f0 43 22 2c 20 0a 2a 2a 20 20 20 20 20 20 77 68 65  C", .**      whe
2a700 72 65 20 22 2a 22 20 6d 61 79 20 6d 61 74 63 68  re "*" may match
2a710 20 61 6e 79 20 73 69 6e 67 6c 65 20 74 6f 6b 65   any single toke
2a720 6e 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  n. The position 
2a730 6c 69 73 74 20 69 6e 20 74 68 69 73 20 63 61 73  list in this cas
2a740 65 0a 2a 2a 20 20 20 20 20 20 69 73 20 70 6f 70  e.**      is pop
2a750 75 6c 61 74 65 64 20 61 73 20 66 6f 72 20 22 41  ulated as for "A
2a760 20 2a 20 43 22 20 62 65 66 6f 72 65 20 72 65 74   * C" before ret
2a770 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  urning..**.**   
2a780 32 2e 20 4e 45 41 52 20 69 73 20 74 72 65 61 74  2. NEAR is treat
2a790 65 64 20 61 73 20 41 4e 44 2e 20 49 66 20 74 68  ed as AND. If th
2a7a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
2a7b0 22 78 20 4e 45 41 52 20 79 22 2c 20 69 74 20 69  "x NEAR y", it i
2a7c0 73 20 0a 2a 2a 20 20 20 20 20 20 61 64 76 61 6e  s .**      advan
2a7d0 63 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ced to point to 
2a7e0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 68 61  the next row tha
2a7f0 74 20 6d 61 74 63 68 65 73 20 22 78 20 41 4e 44  t matches "x AND
2a800 20 79 22 2e 0a 2a 2a 20 0a 2a 2a 20 53 65 65 20   y"..** .** See 
2a810 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 54  sqlite3Fts3EvalT
2a820 65 73 74 44 65 66 65 72 72 65 64 28 29 20 66 6f  estDeferred() fo
2a830 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 74 65 73  r details on tes
2a840 74 69 6e 67 20 69 66 20 61 20 72 6f 77 20 69 73  ting if a row is
2a850 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 20 6d 61 74  .** really a mat
2a860 63 68 2c 20 74 61 6b 69 6e 67 20 69 6e 74 6f 20  ch, taking into 
2a870 61 63 63 6f 75 6e 74 20 64 65 66 65 72 72 65 64  account deferred
2a880 20 74 6f 6b 65 6e 73 20 61 6e 64 20 4e 45 41 52   tokens and NEAR
2a890 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73   operators..*/.s
2a8a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45  tatic void fts3E
2a8b0 76 61 6c 4e 65 78 74 52 6f 77 28 0a 20 20 46 74  valNextRow(.  Ft
2a8c0 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a8e0 20 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64   FTS Cursor hand
2a8f0 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  le */.  Fts3Expr
2a900 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
2a910 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 2e          /* Expr.
2a920 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e   to advance to n
2a930 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
2a940 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20   */.  int *pRc  
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a960 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2a970 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29   Error code */.)
2a980 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
2a990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a9a0 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74 20  nt bDescDoclist 
2a9b0 3d 20 70 43 73 72 2d 3e 62 44 65 73 63 3b 20 20  = pCsr->bDesc;  
2a9c0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
2a9d0 79 20 44 4f 43 49 44 5f 43 4d 50 28 29 20 6d 61  y DOCID_CMP() ma
2a9e0 63 72 6f 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  cro */.    asser
2a9f0 74 28 20 70 45 78 70 72 2d 3e 62 45 6f 66 3d 3d  t( pExpr->bEof==
2aa00 30 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  0 );.    pExpr->
2aa10 62 53 74 61 72 74 20 3d 20 31 3b 0a 0a 20 20 20  bStart = 1;..   
2aa20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
2aa30 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  eType ){.      c
2aa40 61 73 65 20 46 54 53 51 55 45 52 59 5f 4e 45 41  ase FTSQUERY_NEA
2aa50 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 46 54  R:.      case FT
2aa60 53 51 55 45 52 59 5f 41 4e 44 3a 20 7b 0a 20 20  SQUERY_AND: {.  
2aa70 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20 2a        Fts3Expr *
2aa80 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
2aa90 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 46 74  Left;.        Ft
2aaa0 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d  s3Expr *pRight =
2aab0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
2aac0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2aad0 21 70 4c 65 66 74 2d 3e 62 44 65 66 65 72 72 65  !pLeft->bDeferre
2aae0 64 20 7c 7c 20 21 70 52 69 67 68 74 2d 3e 62 44  d || !pRight->bD
2aaf0 65 66 65 72 72 65 64 20 29 3b 0a 0a 20 20 20 20  eferred );..    
2ab00 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 62      if( pLeft->b
2ab10 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20  Deferred ){.    
2ab20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20 69 73 20        /* LHS is 
2ab30 65 6e 74 69 72 65 6c 79 20 64 65 66 65 72 72 65  entirely deferre
2ab40 64 2e 20 53 6f 20 77 65 20 61 73 73 75 6d 65 20  d. So we assume 
2ab50 69 74 20 6d 61 74 63 68 65 73 20 65 76 65 72 79  it matches every
2ab60 20 72 6f 77 2e 0a 20 20 20 20 20 20 20 20 20 20   row..          
2ab70 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 52  ** Advance the R
2ab80 48 53 20 69 74 65 72 61 74 6f 72 20 74 6f 20 66  HS iterator to f
2ab90 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
2aba0 20 76 69 73 69 74 65 64 2e 20 2a 2f 0a 20 20 20   visited. */.   
2abb0 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e         fts3EvalN
2abc0 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52 69  extRow(pCsr, pRi
2abd0 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  ght, pRc);.     
2abe0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63       pExpr->iDoc
2abf0 69 64 20 3d 20 70 52 69 67 68 74 2d 3e 69 44 6f  id = pRight->iDo
2ac00 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  cid;.          p
2ac10 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 70 52 69  Expr->bEof = pRi
2ac20 67 68 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 20  ght->bEof;.     
2ac30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69     }else if( pRi
2ac40 67 68 74 2d 3e 62 44 65 66 65 72 72 65 64 20 29  ght->bDeferred )
2ac50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  {.          /* R
2ac60 48 53 20 69 73 20 65 6e 74 69 72 65 6c 79 20 64  HS is entirely d
2ac70 65 66 65 72 72 65 64 2e 20 53 6f 20 77 65 20 61  eferred. So we a
2ac80 73 73 75 6d 65 20 69 74 20 6d 61 74 63 68 65 73  ssume it matches
2ac90 20 65 76 65 72 79 20 72 6f 77 2e 0a 20 20 20 20   every row..    
2aca0 20 20 20 20 20 20 2a 2a 20 41 64 76 61 6e 63 65        ** Advance
2acb0 20 74 68 65 20 4c 48 53 20 69 74 65 72 61 74 6f   the LHS iterato
2acc0 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  r to find the ne
2acd0 78 74 20 72 6f 77 20 76 69 73 69 74 65 64 2e 20  xt row visited. 
2ace0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  */.          fts
2acf0 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2ad00 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a  r, pLeft, pRc);.
2ad10 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2ad20 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d  >iDocid = pLeft-
2ad30 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20  >iDocid;.       
2ad40 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d     pExpr->bEof =
2ad50 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3b 0a 20 20   pLeft->bEof;.  
2ad60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ad70 20 20 20 20 20 20 20 2f 2a 20 4e 65 69 74 68 65         /* Neithe
2ad80 72 20 74 68 65 20 52 48 53 20 6f 72 20 4c 48 53  r the RHS or LHS
2ad90 20 61 72 65 20 64 65 66 65 72 72 65 64 2e 20 2a   are deferred. *
2ada0 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  /.          fts3
2adb0 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2adc0 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20  , pLeft, pRc);. 
2add0 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
2ade0 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2adf0 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20  Right, pRc);.   
2ae00 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 21 70         while( !p
2ae10 4c 65 66 74 2d 3e 62 45 6f 66 20 26 26 20 21 70  Left->bEof && !p
2ae20 52 69 67 68 74 2d 3e 62 45 6f 66 20 26 26 20 2a  Right->bEof && *
2ae30 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
2ae40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2ae50 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 69 66  lite3_int64 iDif
2ae60 66 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28 70 4c  f = DOCID_CMP(pL
2ae70 65 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52 69  eft->iDocid, pRi
2ae80 67 68 74 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20  ght->iDocid);.  
2ae90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2aea0 69 66 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  iff==0 ) break;.
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2aec0 69 44 69 66 66 3c 30 20 29 7b 0a 20 20 20 20 20  iDiff<0 ){.     
2aed0 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61           fts3Eva
2aee0 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2aef0 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  Left, pRc);.    
2af00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
2af20 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2af30 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b  r, pRight, pRc);
2af40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2af50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2af60 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63       pExpr->iDoc
2af70 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69 44 6f 63  id = pLeft->iDoc
2af80 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  id;.          pE
2af90 78 70 72 2d 3e 62 45 6f 66 20 3d 20 28 70 4c 65  xpr->bEof = (pLe
2afa0 66 74 2d 3e 62 45 6f 66 20 7c 7c 20 70 52 69 67  ft->bEof || pRig
2afb0 68 74 2d 3e 62 45 6f 66 29 3b 0a 20 20 20 20 20  ht->bEof);.     
2afc0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
2afd0 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
2afe0 4e 45 41 52 20 26 26 20 70 45 78 70 72 2d 3e 62  NEAR && pExpr->b
2aff0 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Eof ){.         
2b000 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
2b010 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  t->eType==FTSQUE
2b020 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 20  RY_PHRASE );.   
2b030 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
2b040 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f  ght->pPhrase->do
2b050 63 6c 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20 20  clist.aAll ){.  
2b060 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73 33              Fts3
2b070 44 6f 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20 26  Doclist *pDl = &
2b080 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d  pRight->pPhrase-
2b090 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  >doclist;.      
2b0a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
2b0b0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  pRc==SQLITE_OK &
2b0c0 26 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 3d 3d  & pRight->bEof==
2b0d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b0e0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 44 6c 2d       memset(pDl-
2b0f0 3e 70 4c 69 73 74 2c 20 30 2c 20 70 44 6c 2d 3e  >pList, 0, pDl->
2b100 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
2b110 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2b120 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52  NextRow(pCsr, pR
2b130 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  ight, pRc);.    
2b140 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b160 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
2b170 3e 70 50 68 72 61 73 65 20 26 26 20 70 4c 65 66  >pPhrase && pLef
2b180 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  t->pPhrase->docl
2b190 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20 20 20 20  ist.aAll ){.    
2b1a0 20 20 20 20 20 20 20 20 20 20 46 74 73 33 44 6f            Fts3Do
2b1b0 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20 26 70 4c  clist *pDl = &pL
2b1c0 65 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f  eft->pPhrase->do
2b1d0 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
2b1e0 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 52 63       while( *pRc
2b1f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b200 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b  Left->bEof==0 ){
2b210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b220 20 6d 65 6d 73 65 74 28 70 44 6c 2d 3e 70 4c 69   memset(pDl->pLi
2b230 73 74 2c 20 30 2c 20 70 44 6c 2d 3e 6e 4c 69 73  st, 0, pDl->nLis
2b240 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2b250 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74      fts3EvalNext
2b260 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c  Row(pCsr, pLeft,
2b270 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20   pRc);.         
2b280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2b2a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b2b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b2c0 7d 0a 20 20 0a 20 20 20 20 20 20 63 61 73 65 20  }.  .      case 
2b2d0 46 54 53 51 55 45 52 59 5f 4f 52 3a 20 7b 0a 20  FTSQUERY_OR: {. 
2b2e0 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20         Fts3Expr 
2b2f0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
2b300 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 46  pLeft;.        F
2b310 74 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 20  ts3Expr *pRight 
2b320 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
2b330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b340 5f 69 6e 74 36 34 20 69 43 6d 70 20 3d 20 44 4f  _int64 iCmp = DO
2b350 43 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d 3e 69  CID_CMP(pLeft->i
2b360 44 6f 63 69 64 2c 20 70 52 69 67 68 74 2d 3e 69  Docid, pRight->i
2b370 44 6f 63 69 64 29 3b 0a 0a 20 20 20 20 20 20 20  Docid);..       
2b380 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2b390 62 53 74 61 72 74 20 7c 7c 20 70 4c 65 66 74 2d  bStart || pLeft-
2b3a0 3e 69 44 6f 63 69 64 3d 3d 70 52 69 67 68 74 2d  >iDocid==pRight-
2b3b0 3e 69 44 6f 63 69 64 20 29 3b 0a 20 20 20 20 20  >iDocid );.     
2b3c0 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
2b3d0 74 2d 3e 62 53 74 61 72 74 20 7c 7c 20 70 4c 65  t->bStart || pLe
2b3e0 66 74 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 69 67  ft->iDocid==pRig
2b3f0 68 74 2d 3e 69 44 6f 63 69 64 20 29 3b 0a 0a 20  ht->iDocid );.. 
2b400 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
2b410 74 2d 3e 62 45 6f 66 20 7c 7c 20 28 70 4c 65 66  t->bEof || (pLef
2b420 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 69 43  t->bEof==0 && iC
2b430 6d 70 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  mp<0) ){.       
2b440 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
2b450 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20  ow(pCsr, pLeft, 
2b460 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  pRc);.        }e
2b470 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 62  lse if( pLeft->b
2b480 45 6f 66 20 7c 7c 20 69 43 6d 70 3e 30 20 29 7b  Eof || iCmp>0 ){
2b490 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45  .          fts3E
2b4a0 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
2b4b0 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20   pRight, pRc);. 
2b4c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b4d0 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2b4e0 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4c  NextRow(pCsr, pL
2b4f0 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  eft, pRc);.     
2b500 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78       fts3EvalNex
2b510 74 52 6f 77 28 70 43 73 72 2c 20 70 52 69 67 68  tRow(pCsr, pRigh
2b520 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20  t, pRc);.       
2b530 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70   }..        pExp
2b540 72 2d 3e 62 45 6f 66 20 3d 20 28 70 4c 65 66 74  r->bEof = (pLeft
2b550 2d 3e 62 45 6f 66 20 26 26 20 70 52 69 67 68 74  ->bEof && pRight
2b560 2d 3e 62 45 6f 66 29 3b 0a 20 20 20 20 20 20 20  ->bEof);.       
2b570 20 69 43 6d 70 20 3d 20 44 4f 43 49 44 5f 43 4d   iCmp = DOCID_CM
2b580 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c  P(pLeft->iDocid,
2b590 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 29   pRight->iDocid)
2b5a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
2b5b0 69 67 68 74 2d 3e 62 45 6f 66 20 7c 7c 20 28 70  ight->bEof || (p
2b5c0 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Left->bEof==0 &&
2b5d0 20 20 69 43 6d 70 3c 30 29 20 29 7b 0a 20 20 20    iCmp<0) ){.   
2b5e0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
2b5f0 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69 44  ocid = pLeft->iD
2b600 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65  ocid;.        }e
2b610 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
2b620 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70  Expr->iDocid = p
2b630 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 3b 0a 20  Right->iDocid;. 
2b640 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2b650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2b660 0a 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53  ..      case FTS
2b670 51 55 45 52 59 5f 4e 4f 54 3a 20 7b 0a 20 20 20  QUERY_NOT: {.   
2b680 20 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70       Fts3Expr *p
2b690 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
2b6a0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 46 74 73  eft;.        Fts
2b6b0 33 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20  3Expr *pRight = 
2b6c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 0a  pExpr->pRight;..
2b6d0 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
2b6e0 68 74 2d 3e 62 53 74 61 72 74 3d 3d 30 20 29 7b  ht->bStart==0 ){
2b6f0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45  .          fts3E
2b700 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
2b710 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20   pRight, pRc);. 
2b720 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b730 20 2a 70 52 63 21 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc!=SQLITE_OK
2b740 20 7c 7c 20 70 52 69 67 68 74 2d 3e 62 53 74 61   || pRight->bSta
2b750 72 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rt );.        }.
2b760 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61  .        fts3Eva
2b770 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2b780 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  Left, pRc);.    
2b790 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 62      if( pLeft->b
2b7a0 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
2b7b0 20 20 20 20 77 68 69 6c 65 28 20 21 2a 70 52 63      while( !*pRc
2b7c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2b7d0 26 26 20 21 70 52 69 67 68 74 2d 3e 62 45 6f 66  && !pRight->bEof
2b7e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2b7f0 26 26 20 44 4f 43 49 44 5f 43 4d 50 28 70 4c 65  && DOCID_CMP(pLe
2b800 66 74 2d 3e 69 44 6f 63 69 64 2c 20 70 52 69 67  ft->iDocid, pRig
2b810 68 74 2d 3e 69 44 6f 63 69 64 29 3e 30 20 0a 20  ht->iDocid)>0 . 
2b820 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2b830 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2b840 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52  NextRow(pCsr, pR
2b850 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  ight, pRc);.    
2b860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b870 7d 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  }.        pExpr-
2b880 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d  >iDocid = pLeft-
2b890 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20  >iDocid;.       
2b8a0 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 70   pExpr->bEof = p
2b8b0 4c 65 66 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  Left->bEof;.    
2b8c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b8d0 20 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c   }..      defaul
2b8e0 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 46 74 73  t: {.        Fts
2b8f0 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65  3Phrase *pPhrase
2b900 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73   = pExpr->pPhras
2b910 65 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 45  e;.        fts3E
2b920 76 61 6c 49 6e 76 61 6c 69 64 61 74 65 50 6f 73  valInvalidatePos
2b930 6c 69 73 74 28 70 50 68 72 61 73 65 29 3b 0a 20  list(pPhrase);. 
2b940 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 66 74         *pRc = ft
2b950 73 33 45 76 61 6c 50 68 72 61 73 65 4e 65 78 74  s3EvalPhraseNext
2b960 28 70 43 73 72 2c 20 70 50 68 72 61 73 65 2c 20  (pCsr, pPhrase, 
2b970 26 70 45 78 70 72 2d 3e 62 45 6f 66 29 3b 0a 20  &pExpr->bEof);. 
2b980 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
2b990 6f 63 69 64 20 3d 20 70 50 68 72 61 73 65 2d 3e  ocid = pPhrase->
2b9a0 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 3b 0a  doclist.iDocid;.
2b9b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2b9c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52  .}../*.** If *pR
2b9e0 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
2b9f0 4f 4b 2c 20 6f 72 20 69 66 20 70 45 78 70 72 20  OK, or if pExpr 
2ba00 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 20  is not the root 
2ba10 6e 6f 64 65 20 6f 66 20 61 20 4e 45 41 52 0a 2a  node of a NEAR.*
2ba20 2a 20 63 6c 75 73 74 65 72 2c 20 74 68 65 6e 20  * cluster, then 
2ba30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2ba40 74 75 72 6e 73 20 31 20 69 6d 6d 65 64 69 61 74  turns 1 immediat
2ba50 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ely..**.** Other
2ba60 77 69 73 65 2c 20 69 74 20 63 68 65 63 6b 73 20  wise, it checks 
2ba70 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  if the current r
2ba80 6f 77 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6d  ow really does m
2ba90 61 74 63 68 20 74 68 65 20 4e 45 41 52 20 0a 2a  atch the NEAR .*
2baa0 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 75 73  * expression, us
2bab0 69 6e 67 20 74 68 65 20 64 61 74 61 20 63 75 72  ing the data cur
2bac0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
2bad0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
2bae0 73 74 73 20 0a 2a 2a 20 28 46 74 73 33 45 78 70  sts .** (Fts3Exp
2baf0 72 2d 3e 70 50 68 72 61 73 65 2e 64 6f 63 6c 69  r->pPhrase.docli
2bb00 73 74 2e 70 4c 69 73 74 2f 6e 4c 69 73 74 29 20  st.pList/nList) 
2bb10 66 6f 72 20 65 61 63 68 20 70 68 72 61 73 65 20  for each phrase 
2bb20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
2bb30 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
2bb40 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
2bb50 61 20 6d 61 74 63 68 2c 20 74 68 65 20 70 6f 73  a match, the pos
2bb60 69 74 69 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63  ition list assoc
2bb70 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 0a  iated with each.
2bb80 2a 2a 20 70 68 72 61 73 65 20 69 6e 20 74 68 65  ** phrase in the
2bb90 20 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e   NEAR expression
2bba0 20 69 73 20 65 64 69 74 65 64 20 69 6e 20 70 6c   is edited in pl
2bbb0 61 63 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 6f  ace to contain o
2bbc0 6e 6c 79 20 74 68 6f 73 65 0a 2a 2a 20 70 68 72  nly those.** phr
2bbd0 61 73 65 20 69 6e 73 74 61 6e 63 65 73 20 73 75  ase instances su
2bbe0 66 66 69 63 69 65 6e 74 6c 79 20 63 6c 6f 73 65  fficiently close
2bbf0 20 74 6f 20 74 68 65 69 72 20 70 65 65 72 73 20   to their peers 
2bc00 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 4e  to satisfy all N
2bc10 45 41 52 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  EAR.** constrain
2bc20 74 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ts. In this case
2bc30 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 49   it returns 1. I
2bc40 66 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65  f the NEAR expre
2bc50 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 0a  ssion does not .
2bc60 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 63 75 72  ** match the cur
2bc70 72 65 6e 74 20 72 6f 77 2c 20 30 20 69 73 20 72  rent row, 0 is r
2bc80 65 74 75 72 6e 65 64 2e 20 54 68 65 20 70 6f 73  eturned. The pos
2bc90 69 74 69 6f 6e 20 6c 69 73 74 73 20 6d 61 79 20  ition lists may 
2bca0 6f 72 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 62 65  or may not.** be
2bcb0 20 65 64 69 74 65 64 20 69 66 20 30 20 69 73 20   edited if 0 is 
2bcc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
2bcd0 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c  tic int fts3Eval
2bce0 4e 65 61 72 54 65 73 74 28 46 74 73 33 45 78 70  NearTest(Fts3Exp
2bcf0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 2a 70  r *pExpr, int *p
2bd00 52 63 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d  Rc){.  int res =
2bd10 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   1;..  /* The fo
2bd20 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 72 75  llowing block ru
2bd30 6e 73 20 69 66 20 70 45 78 70 72 20 69 73 20 74  ns if pExpr is t
2bd40 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 4e 45 41  he root of a NEA
2bd50 52 20 71 75 65 72 79 2e 0a 20 20 2a 2a 20 46 6f  R query..  ** Fo
2bd60 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 71  r example, the q
2bd70 75 65 72 79 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery:.  **.  ** 
2bd80 20 20 20 20 20 20 20 20 22 77 22 20 4e 45 41 52          "w" NEAR
2bd90 20 22 78 22 20 4e 45 41 52 20 22 79 22 20 4e 45   "x" NEAR "y" NE
2bda0 41 52 20 22 7a 22 0a 20 20 2a 2a 0a 20 20 2a 2a  AR "z".  **.  **
2bdb0 20 77 68 69 63 68 20 69 73 20 72 65 70 72 65 73   which is repres
2bdc0 65 6e 74 65 64 20 69 6e 20 74 72 65 65 20 66 6f  ented in tree fo
2bdd0 72 6d 20 61 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rm as:.  **.  **
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2be00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
2be20 2d 2d 4e 45 41 52 2d 2d 2b 20 20 20 20 20 20 3c  --NEAR--+      <
2be30 2d 2d 20 72 6f 6f 74 20 6f 66 20 4e 45 41 52 20  -- root of NEAR 
2be40 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 20 20  query.  **      
2be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be60 20 20 20 20 7c 20 20 20 20 20 20 20 20 7c 0a 20      |        |. 
2be70 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
2be80 20 20 20 20 20 20 20 20 2b 2d 2d 4e 45 41 52 2d          +--NEAR-
2be90 2d 2b 20 20 20 22 7a 22 0a 20 20 2a 2a 20 20 20  -+   "z".  **   
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2beb0 20 20 7c 20 20 20 20 20 20 20 20 7c 0a 20 20 2a    |        |.  *
2bec0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2bed0 20 2b 2d 2d 4e 45 41 52 2d 2d 2b 20 20 20 22 79   +--NEAR--+   "y
2bee0 22 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ".  **          
2bef0 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 7c        |        |
2bf00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2bf10 20 20 20 20 22 77 22 20 20 20 20 20 20 22 78 22      "w"      "x"
2bf20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
2bf30 69 67 68 74 2d 68 61 6e 64 20 63 68 69 6c 64 20  ight-hand child 
2bf40 6f 66 20 61 20 4e 45 41 52 20 6e 6f 64 65 20 69  of a NEAR node i
2bf50 73 20 61 6c 77 61 79 73 20 61 20 70 68 72 61 73  s always a phras
2bf60 65 2e 20 54 68 65 20 0a 20 20 2a 2a 20 6c 65 66  e. The .  ** lef
2bf70 74 2d 68 61 6e 64 20 63 68 69 6c 64 20 6d 61 79  t-hand child may
2bf80 20 62 65 20 65 69 74 68 65 72 20 61 20 70 68 72   be either a phr
2bf90 61 73 65 20 6f 72 20 61 20 4e 45 41 52 20 6e 6f  ase or a NEAR no
2bfa0 64 65 2e 20 54 68 65 72 65 20 61 72 65 0a 20 20  de. There are.  
2bfb0 2a 2a 20 6e 6f 20 65 78 63 65 70 74 69 6f 6e 73  ** no exceptions
2bfc0 20 74 6f 20 74 68 69 73 20 2d 20 69 74 27 73 20   to this - it's 
2bfd0 74 68 65 20 77 61 79 20 74 68 65 20 70 61 72 73  the way the pars
2bfe0 65 72 20 69 6e 20 66 74 73 33 5f 65 78 70 72 2e  er in fts3_expr.
2bff0 63 20 77 6f 72 6b 73 2e 0a 20 20 2a 2f 0a 20 20  c works..  */.  
2c000 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
2c010 5f 4f 4b 20 0a 20 20 20 26 26 20 70 45 78 70 72  _OK .   && pExpr
2c020 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
2c030 59 5f 4e 45 41 52 20 0a 20 20 20 26 26 20 28 70  Y_NEAR .   && (p
2c040 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Expr->pParent==0
2c050 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50 61 72 65   || pExpr->pPare
2c060 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55  nt->eType!=FTSQU
2c070 45 52 59 5f 4e 45 41 52 29 0a 20 20 29 7b 0a 20  ERY_NEAR).  ){. 
2c080 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 3b 20     Fts3Expr *p; 
2c090 0a 20 20 20 20 69 6e 74 20 6e 54 6d 70 20 3d 20  .    int nTmp = 
2c0a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c0b0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 74     /* Bytes of t
2c0c0 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
2c0d0 20 63 68 61 72 20 2a 61 54 6d 70 3b 20 20 20 20   char *aTmp;    
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c0f0 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72  * Temp space for
2c100 20 50 6f 73 6c 69 73 74 4e 65 61 72 4d 65 72 67   PoslistNearMerg
2c110 65 28 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  e() */..    /* A
2c120 6c 6c 6f 63 61 74 65 20 74 65 6d 70 6f 72 61 72  llocate temporar
2c130 79 20 77 6f 72 6b 69 6e 67 20 73 70 61 63 65 2e  y working space.
2c140 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 45   */.    for(p=pE
2c150 78 70 72 3b 20 70 2d 3e 70 4c 65 66 74 3b 20 70  xpr; p->pLeft; p
2c160 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20 20 20 20  =p->pLeft){.    
2c170 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
2c180 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f  ght->pPhrase->do
2c190 63 6c 69 73 74 2e 6e 4c 69 73 74 3e 30 20 29 3b  clist.nList>0 );
2c1a0 0a 20 20 20 20 20 20 6e 54 6d 70 20 2b 3d 20 70  .      nTmp += p
2c1b0 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73  ->pRight->pPhras
2c1c0 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74  e->doclist.nList
2c1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 54 6d 70  ;.    }.    nTmp
2c1e0 20 2b 3d 20 70 2d 3e 70 50 68 72 61 73 65 2d 3e   += p->pPhrase->
2c1f0 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3b 0a 20  doclist.nList;. 
2c200 20 20 20 61 54 6d 70 20 3d 20 73 71 6c 69 74 65     aTmp = sqlite
2c210 33 5f 6d 61 6c 6c 6f 63 28 6e 54 6d 70 2a 32 29  3_malloc(nTmp*2)
2c220 3b 0a 20 20 20 20 69 66 28 20 21 61 54 6d 70 20  ;.    if( !aTmp 
2c230 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
2c240 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c250 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20      res = 0;.   
2c260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2c270 61 72 20 2a 61 50 6f 73 6c 69 73 74 20 3d 20 70  ar *aPoslist = p
2c280 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  ->pPhrase->docli
2c290 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  st.pList;.      
2c2a0 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 70 2d 3e  int nToken = p->
2c2b0 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
2c2c0 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 2d  ..      for(p=p-
2c2d0 3e 70 50 61 72 65 6e 74 3b 72 65 73 20 26 26 20  >pParent;res && 
2c2e0 70 20 26 26 20 70 2d 3e 65 54 79 70 65 3d 3d 46  p && p->eType==F
2c2f0 54 53 51 55 45 52 59 5f 4e 45 41 52 3b 20 70 3d  TSQUERY_NEAR; p=
2c300 70 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20 20 20  p->pParent){.   
2c310 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20       Fts3Phrase 
2c320 2a 70 50 68 72 61 73 65 20 3d 20 70 2d 3e 70 52  *pPhrase = p->pR
2c330 69 67 68 74 2d 3e 70 50 68 72 61 73 65 3b 0a 20  ight->pPhrase;. 
2c340 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 61 72         int nNear
2c350 20 3d 20 70 2d 3e 6e 4e 65 61 72 3b 0a 20 20 20   = p->nNear;.   
2c360 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 33 45       res = fts3E
2c370 76 61 6c 4e 65 61 72 54 72 69 6d 28 6e 4e 65 61  valNearTrim(nNea
2c380 72 2c 20 61 54 6d 70 2c 20 26 61 50 6f 73 6c 69  r, aTmp, &aPosli
2c390 73 74 2c 20 26 6e 54 6f 6b 65 6e 2c 20 70 50 68  st, &nToken, pPh
2c3a0 72 61 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  rase);.      }..
2c3b0 20 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d        aPoslist =
2c3c0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e   pExpr->pRight->
2c3d0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
2c3e0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 54  .pList;.      nT
2c3f0 6f 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70 52  oken = pExpr->pR
2c400 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 6e  ight->pPhrase->n
2c410 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 66 6f 72  Token;.      for
2c420 28 70 3d 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  (p=pExpr->pLeft;
2c430 20 70 20 26 26 20 72 65 73 3b 20 70 3d 70 2d 3e   p && res; p=p->
2c440 70 4c 65 66 74 29 7b 0a 20 20 20 20 20 20 20 20  pLeft){.        
2c450 69 6e 74 20 6e 4e 65 61 72 3b 0a 20 20 20 20 20  int nNear;.     
2c460 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70     Fts3Phrase *p
2c470 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20  Phrase;.        
2c480 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 65  assert( p->pPare
2c490 6e 74 20 26 26 20 70 2d 3e 70 50 61 72 65 6e 74  nt && p->pParent
2c4a0 2d 3e 70 4c 65 66 74 3d 3d 70 20 29 3b 0a 20 20  ->pLeft==p );.  
2c4b0 20 20 20 20 20 20 6e 4e 65 61 72 20 3d 20 70 2d        nNear = p-
2c4c0 3e 70 50 61 72 65 6e 74 2d 3e 6e 4e 65 61 72 3b  >pParent->nNear;
2c4d0 0a 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65  .        pPhrase
2c4e0 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
2c4f0 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55   p->eType==FTSQU
2c500 45 52 59 5f 4e 45 41 52 20 3f 20 70 2d 3e 70 52  ERY_NEAR ? p->pR
2c510 69 67 68 74 2d 3e 70 50 68 72 61 73 65 20 3a 20  ight->pPhrase : 
2c520 70 2d 3e 70 50 68 72 61 73 65 0a 20 20 20 20 20  p->pPhrase.     
2c530 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65     );.        re
2c540 73 20 3d 20 66 74 73 33 45 76 61 6c 4e 65 61 72  s = fts3EvalNear
2c550 54 72 69 6d 28 6e 4e 65 61 72 2c 20 61 54 6d 70  Trim(nNear, aTmp
2c560 2c 20 26 61 50 6f 73 6c 69 73 74 2c 20 26 6e 54  , &aPoslist, &nT
2c570 6f 6b 65 6e 2c 20 70 50 68 72 61 73 65 29 3b 0a  oken, pPhrase);.
2c580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c590 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c5a0 61 54 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  aTmp);.  }..  re
2c5b0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
2c5c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c5d0 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e   is a helper fun
2c5e0 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65  ction for sqlite
2c5f0 33 46 74 73 33 45 76 61 6c 54 65 73 74 44 65 66  3Fts3EvalTestDef
2c600 65 72 72 65 64 28 29 2e 0a 2a 2a 20 41 73 73 75  erred()..** Assu
2c610 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
2c620 63 75 72 73 20 6f 72 20 68 61 73 20 6f 63 63 75  curs or has occu
2c630 72 72 65 64 2c 20 49 74 20 72 65 74 75 72 6e 73  rred, It returns
2c640 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2c650 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
2c660 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2c670 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 61 74  ond argument mat
2c680 63 68 65 73 20 74 68 65 20 72 6f 77 20 74 68 61  ches the row tha
2c690 74 20 70 43 73 72 20 0a 2a 2a 20 63 75 72 72 65  t pCsr .** curre
2c6a0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20  ntly points to, 
2c6b0 6f 72 20 7a 65 72 6f 20 69 66 20 69 74 20 64 6f  or zero if it do
2c6c0 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
2c6d0 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2c6e0 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2c6f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c700 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2c710 6f 70 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  op..** If an err
2c720 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
2c730 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
2c740 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52  is function, *pR
2c750 63 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  c is set to .** 
2c760 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2c770 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2c780 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2c790 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
2c7a0 75 65 20 69 73 20 0a 2a 2a 20 75 6e 64 65 66 69  ue is .** undefi
2c7b0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2c7c0 6e 74 20 66 74 73 33 45 76 61 6c 54 65 73 74 45  nt fts3EvalTestE
2c7d0 78 70 72 28 0a 20 20 46 74 73 33 43 75 72 73 6f  xpr(.  Fts3Curso
2c7e0 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
2c7f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 63 75         /* FTS cu
2c800 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  rsor handle */. 
2c810 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72   Fts3Expr *pExpr
2c820 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c830 20 2f 2a 20 45 78 70 72 20 74 6f 20 74 65 73 74   /* Expr to test
2c840 2e 20 4d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  . May or may not
2c850 20 62 65 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 69   be root. */.  i
2c860 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
2c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c880 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
2c890 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
2c8a0 20 62 48 69 74 20 3d 20 31 3b 20 20 20 20 20 20   bHit = 1;      
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8c0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
2c8d0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
2c8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77 69  TE_OK ){.    swi
2c8f0 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70  tch( pExpr->eTyp
2c900 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
2c910 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3a 0a 20  FTSQUERY_NEAR:. 
2c920 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45       case FTSQUE
2c930 52 59 5f 41 4e 44 3a 0a 20 20 20 20 20 20 20 20  RY_AND:.        
2c940 62 48 69 74 20 3d 20 28 0a 20 20 20 20 20 20 20  bHit = (.       
2c950 20 20 20 20 20 66 74 73 33 45 76 61 6c 54 65 73       fts3EvalTes
2c960 74 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70  tExpr(pCsr, pExp
2c970 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 0a 20  r->pLeft, pRc). 
2c980 20 20 20 20 20 20 20 20 26 26 20 66 74 73 33 45          && fts3E
2c990 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2c9a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2c9b0 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 20 26   pRc).         &
2c9c0 26 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 65  & fts3EvalNearTe
2c9d0 73 74 28 70 45 78 70 72 2c 20 70 52 63 29 0a 20  st(pExpr, pRc). 
2c9e0 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
2c9f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4e 45 41     /* If the NEA
2ca00 52 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  R expression doe
2ca10 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
2ca20 72 6f 77 73 2c 20 7a 65 72 6f 20 74 68 65 20 64  rows, zero the d
2ca30 6f 63 6c 69 73 74 20 66 6f 72 20 0a 20 20 20 20  oclist for .    
2ca40 20 20 20 20 2a 2a 20 61 6c 6c 20 70 68 72 61 73      ** all phras
2ca50 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2ca60 68 65 20 4e 45 41 52 2e 20 54 68 69 73 20 69 73  he NEAR. This is
2ca70 20 62 65 63 61 75 73 65 20 74 68 65 20 73 6e 69   because the sni
2ca80 70 70 65 74 28 29 2c 0a 20 20 20 20 20 20 20 20  ppet(),.        
2ca90 2a 2a 20 6f 66 66 73 65 74 73 28 29 20 61 6e 64  ** offsets() and
2caa0 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e   matchinfo() fun
2cab0 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 73  ctions are not s
2cac0 75 70 70 6f 73 65 64 20 74 6f 20 72 65 63 6f 67  upposed to recog
2cad0 6e 69 7a 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  nize .        **
2cae0 20 61 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f   any instances o
2caf0 66 20 70 68 72 61 73 65 73 20 74 68 61 74 20 61  f phrases that a
2cb00 72 65 20 70 61 72 74 20 6f 66 20 75 6e 6d 61 74  re part of unmat
2cb10 63 68 65 64 20 4e 45 41 52 20 71 75 65 72 69 65  ched NEAR querie
2cb20 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 46  s. .        ** F
2cb30 6f 72 20 65 78 61 6d 70 6c 65 20 69 66 20 74 68  or example if th
2cb40 69 73 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a 20  is expression:. 
2cb50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2cb60 20 20 2a 2a 20 20 20 20 2e 2e 2e 20 4d 41 54 43    **    ... MATC
2cb70 48 20 27 61 20 4f 52 20 28 62 20 4e 45 41 52 20  H 'a OR (b NEAR 
2cb80 63 29 27 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  c)'.        **. 
2cb90 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 74         ** is mat
2cba0 63 68 65 64 20 61 67 61 69 6e 73 74 20 61 20 72  ched against a r
2cbb0 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 3a 0a 20  ow containing:. 
2cbc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2cbd0 20 20 2a 2a 20 20 20 20 20 20 20 20 27 61 20 62    **        'a b
2cbe0 20 64 20 65 27 0a 20 20 20 20 20 20 20 20 2a 2a   d e'.        **
2cbf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2cc00 20 61 6e 79 20 73 6e 69 70 70 65 74 28 29 20 73   any snippet() s
2cc10 68 6f 75 6c 64 20 6f 6e 79 20 68 69 67 68 6c 69  hould ony highli
2cc20 67 68 74 20 74 68 65 20 22 61 22 20 74 65 72 6d  ght the "a" term
2cc30 2c 20 6e 6f 74 20 74 68 65 20 22 62 22 0a 20 20  , not the "b".  
2cc40 20 20 20 20 20 20 2a 2a 20 28 61 73 20 22 62 22        ** (as "b"
2cc50 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 6f   is part of a no
2cc60 6e 2d 6d 61 74 63 68 69 6e 67 20 4e 45 41 52 20  n-matching NEAR 
2cc70 63 6c 61 75 73 65 29 2e 0a 20 20 20 20 20 20 20  clause)..       
2cc80 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2cc90 62 48 69 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  bHit==0 .       
2cca0 20 20 26 26 20 70 45 78 70 72 2d 3e 65 54 79 70    && pExpr->eTyp
2ccb0 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52  e==FTSQUERY_NEAR
2ccc0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70   .         && (p
2ccd0 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Expr->pParent==0
2cce0 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50 61 72 65   || pExpr->pPare
2ccf0 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55  nt->eType!=FTSQU
2cd00 45 52 59 5f 4e 45 41 52 29 0a 20 20 20 20 20 20  ERY_NEAR).      
2cd10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46    ){.          F
2cd20 74 73 33 45 78 70 72 20 2a 70 3b 0a 20 20 20 20  ts3Expr *p;.    
2cd30 20 20 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70        for(p=pExp
2cd40 72 3b 20 70 2d 3e 70 50 68 72 61 73 65 3d 3d 30  r; p->pPhrase==0
2cd50 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20  ; p=p->pLeft){. 
2cd60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2cd70 2d 3e 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64  ->pRight->iDocid
2cd80 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20  ==pCsr->iPrevId 
2cd90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cda0 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64   fts3EvalInvalid
2cdb0 61 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e 70 52  atePoslist(p->pR
2cdc0 69 67 68 74 2d 3e 70 50 68 72 61 73 65 29 3b 0a  ight->pPhrase);.
2cdd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cde0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cdf0 20 20 20 20 69 66 28 20 70 2d 3e 69 44 6f 63 69      if( p->iDoci
2ce00 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64  d==pCsr->iPrevId
2ce10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ce20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61  fts3EvalInvalida
2ce30 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e 70 50 68  tePoslist(p->pPh
2ce40 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
2ce50 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
2ce60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2ce70 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52      case FTSQUER
2ce80 59 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  Y_OR: {.        
2ce90 69 6e 74 20 62 48 69 74 31 20 3d 20 66 74 73 33  int bHit1 = fts3
2cea0 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73  EvalTestExpr(pCs
2ceb0 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  r, pExpr->pLeft,
2cec0 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 69   pRc);.        i
2ced0 6e 74 20 62 48 69 74 32 20 3d 20 66 74 73 33 45  nt bHit2 = fts3E
2cee0 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2cef0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2cf00 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62   pRc);.        b
2cf10 48 69 74 20 3d 20 62 48 69 74 31 20 7c 7c 20 62  Hit = bHit1 || b
2cf20 48 69 74 32 3b 0a 20 20 20 20 20 20 20 20 62 72  Hit2;.        br
2cf30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
2cf40 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52      case FTSQUER
2cf50 59 5f 4e 4f 54 3a 0a 20 20 20 20 20 20 20 20 62  Y_NOT:.        b
2cf60 48 69 74 20 3d 20 28 0a 20 20 20 20 20 20 20 20  Hit = (.        
2cf70 20 20 20 20 66 74 73 33 45 76 61 6c 54 65 73 74      fts3EvalTest
2cf80 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72  Expr(pCsr, pExpr
2cf90 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 0a 20 20  ->pLeft, pRc).  
2cfa0 20 20 20 20 20 20 20 26 26 20 21 66 74 73 33 45         && !fts3E
2cfb0 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2cfc0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2cfd0 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 29 3b   pRc).        );
2cfe0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2cff0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
2d000 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2d010 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45  _DISABLE_FTS4_DE
2d020 46 45 52 52 45 44 0a 20 20 20 20 20 20 20 20 69  FERRED.        i
2d030 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  f( pCsr->pDeferr
2d040 65 64 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  ed .         && 
2d050 28 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 3d 3d  (pExpr->iDocid==
2d060 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20 7c 7c  pCsr->iPrevId ||
2d070 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65   pExpr->bDeferre
2d080 64 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  d).        ){.  
2d090 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61          Fts3Phra
2d0a0 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45  se *pPhrase = pE
2d0b0 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20  xpr->pPhrase;.  
2d0c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d0d0 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64  pExpr->bDeferred
2d0e0 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 64 6f 63   || pPhrase->doc
2d0f0 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 3d 3d  list.bFreeList==
2d100 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
2d110 66 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72  f( pExpr->bDefer
2d120 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  red ){.         
2d130 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c     fts3EvalInval
2d140 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68  idatePoslist(pPh
2d150 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
2d160 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52   }.          *pR
2d170 63 20 3d 20 66 74 73 33 45 76 61 6c 44 65 66 65  c = fts3EvalDefe
2d180 72 72 65 64 50 68 72 61 73 65 28 70 43 73 72 2c  rredPhrase(pCsr,
2d190 20 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20   pPhrase);.     
2d1a0 20 20 20 20 20 62 48 69 74 20 3d 20 28 70 50 68       bHit = (pPh
2d1b0 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
2d1c0 69 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ist!=0);.       
2d1d0 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64     pExpr->iDocid
2d1e0 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64   = pCsr->iPrevId
2d1f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2d200 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2d210 0a 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20  .          bHit 
2d220 3d 20 28 70 45 78 70 72 2d 3e 62 45 6f 66 3d 3d  = (pExpr->bEof==
2d230 30 20 26 26 20 70 45 78 70 72 2d 3e 69 44 6f 63  0 && pExpr->iDoc
2d240 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49  id==pCsr->iPrevI
2d250 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
2d260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2d270 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2d280 20 72 65 74 75 72 6e 20 62 48 69 74 3b 0a 7d 0a   return bHit;.}.
2d290 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2d2a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2d2b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
2d2c0 74 20 6f 66 20 65 61 63 68 20 78 4e 65 78 74 20  t of each xNext 
2d2d0 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e 0a 2a  operation when.*
2d2e0 2a 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  * iterating thro
2d2f0 75 67 68 20 74 68 65 20 72 65 73 75 6c 74 73 20  ugh the results 
2d300 6f 66 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71  of a full-text q
2d310 75 65 72 79 2e 20 41 74 20 74 68 69 73 20 70 6f  uery. At this po
2d320 69 6e 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  int the.** curso
2d330 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f  r points to a ro
2d340 77 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  w that matches t
2d350 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
2d360 69 6f 6e 2c 20 77 69 74 68 20 74 68 65 0a 2a 2a  ion, with the.**
2d370 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 76 65 61   following cavea
2d380 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 55 70  ts:.**.**   * Up
2d390 20 75 6e 74 69 6c 20 74 68 69 73 20 70 6f 69 6e   until this poin
2d3a0 74 2c 20 22 4e 45 41 52 22 20 6f 70 65 72 61 74  t, "NEAR" operat
2d3b0 6f 72 73 20 69 6e 20 74 68 65 20 65 78 70 72 65  ors in the expre
2d3c0 73 73 69 6f 6e 20 68 61 76 65 20 62 65 65 6e 0a  ssion have been.
2d3d0 2a 2a 20 20 20 20 20 74 72 65 61 74 65 64 20 61  **     treated a
2d3e0 73 20 22 41 4e 44 22 2e 0a 2a 2a 0a 2a 2a 20 20  s "AND"..**.**  
2d3f0 20 2a 20 44 65 66 65 72 72 65 64 20 74 6f 6b 65   * Deferred toke
2d400 6e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  ns have not yet 
2d410 62 65 65 6e 20 63 6f 6e 73 69 64 65 72 65 64 2e  been considered.
2d420 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
2d430 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
2d440 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2d450 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2d460 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
2d470 72 65 74 75 72 6e 73 20 30 2e 20 4f 74 68 65 72  returns 0. Other
2d480 77 69 73 65 2c 20 69 74 20 74 65 73 74 73 20 77  wise, it tests w
2d490 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 66  hether or not af
2d4a0 74 65 72 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ter considering 
2d4b0 4e 45 41 52 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  NEAR.** operator
2d4c0 73 20 61 6e 64 20 64 65 66 65 72 72 65 64 20 74  s and deferred t
2d4d0 6f 6b 65 6e 73 20 74 68 65 20 63 75 72 72 65 6e  okens the curren
2d4e0 74 20 72 6f 77 20 69 73 20 73 74 69 6c 6c 20 61  t row is still a
2d4f0 20 6d 61 74 63 68 20 66 6f 72 20 74 68 65 0a 2a   match for the.*
2d500 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 74  * expression. It
2d510 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 62 6f   returns 1 if bo
2d520 74 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  th of the follow
2d530 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
2d540 0a 2a 2a 20 20 20 31 2e 20 2a 70 52 63 20 69 73  .**   1. *pRc is
2d550 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2d560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2d570 74 75 72 6e 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  turns, and.**.**
2d580 20 20 20 32 2e 20 41 66 74 65 72 20 73 63 61 6e     2. After scan
2d590 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
2d5a0 20 46 54 53 20 74 61 62 6c 65 20 72 6f 77 20 66   FTS table row f
2d5b0 6f 72 20 74 68 65 20 64 65 66 65 72 72 65 64 20  or the deferred 
2d5c0 74 6f 6b 65 6e 73 2c 0a 2a 2a 20 20 20 20 20 20  tokens,.**      
2d5d0 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
2d5e0 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 64 6f   that the row do
2d5f0 65 73 20 2a 6e 6f 74 2a 20 6d 61 74 63 68 20 74  es *not* match t
2d600 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  he query..**.** 
2d610 4f 72 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  Or, if no error 
2d620 6f 63 63 75 72 73 20 61 6e 64 20 69 74 20 73 65  occurs and it se
2d630 65 6d 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ems the current 
2d640 72 6f 77 20 64 6f 65 73 20 6d 61 74 63 68 20 74  row does match t
2d650 68 65 20 46 54 53 0a 2a 2a 20 71 75 65 72 79 2c  he FTS.** query,
2d660 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e   return 0..*/.in
2d670 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61  t sqlite3Fts3Eva
2d680 6c 54 65 73 74 44 65 66 65 72 72 65 64 28 46 74  lTestDeferred(Ft
2d690 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2d6a0 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74  int *pRc){.  int
2d6b0 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 6e   rc = *pRc;.  in
2d6c0 74 20 62 4d 69 73 73 20 3d 20 30 3b 0a 20 20 69  t bMiss = 0;.  i
2d6d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d6e0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
2d6f0 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
2d700 6d 6f 72 65 20 64 65 66 65 72 72 65 64 20 74 6f  more deferred to
2d710 6b 65 6e 73 2c 20 6c 6f 61 64 20 74 68 65 20 63  kens, load the c
2d720 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 74 6f 0a  urrent row into.
2d730 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e      ** memory an
2d740 64 20 73 63 61 6e 20 69 74 20 74 6f 20 64 65 74  d scan it to det
2d750 65 72 6d 69 6e 65 20 74 68 65 20 70 6f 73 69 74  ermine the posit
2d760 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 65 61 63  ion list for eac
2d770 68 20 64 65 66 65 72 72 65 64 0a 20 20 20 20 2a  h deferred.    *
2d780 2a 20 74 6f 6b 65 6e 2e 20 54 68 65 6e 2c 20 73  * token. Then, s
2d790 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 69  ee if this row i
2d7a0 73 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63 68  s really a match
2d7b0 2c 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 64 65  , considering de
2d7c0 66 65 72 72 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ferred.    ** to
2d7d0 6b 65 6e 73 20 61 6e 64 20 4e 45 41 52 20 6f 70  kens and NEAR op
2d7e0 65 72 61 74 6f 72 73 20 28 6e 65 69 74 68 65 72  erators (neither
2d7f0 20 6f 66 20 77 68 69 63 68 20 77 65 72 65 20 74   of which were t
2d800 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e  aken into accoun
2d810 74 0a 20 20 20 20 2a 2a 20 65 61 72 6c 69 65 72  t.    ** earlier
2d820 2c 20 62 79 20 66 74 73 33 45 76 61 6c 4e 65 78  , by fts3EvalNex
2d830 74 52 6f 77 28 29 29 2e 20 0a 20 20 20 20 2a 2f  tRow()). .    */
2d840 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70  .    if( pCsr->p
2d850 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20  Deferred ){.    
2d860 20 20 72 63 20 3d 20 66 74 73 33 43 75 72 73 6f    rc = fts3Curso
2d870 72 53 65 65 6b 28 30 2c 20 70 43 73 72 29 3b 0a  rSeek(0, pCsr);.
2d880 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d8a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
2d8b0 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64  ts3CacheDeferred
2d8c0 44 6f 63 6c 69 73 74 73 28 70 43 73 72 29 3b 0a  Doclists(pCsr);.
2d8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d8e0 20 20 62 4d 69 73 73 20 3d 20 28 30 3d 3d 66 74    bMiss = (0==ft
2d8f0 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70  s3EvalTestExpr(p
2d900 43 73 72 2c 20 70 43 73 72 2d 3e 70 45 78 70 72  Csr, pCsr->pExpr
2d910 2c 20 26 72 63 29 29 3b 0a 0a 20 20 20 20 2f 2a  , &rc));..    /*
2d920 20 46 72 65 65 20 74 68 65 20 70 6f 73 69 74 69   Free the positi
2d930 6f 6e 2d 6c 69 73 74 73 20 61 63 63 75 6d 75 6c  on-lists accumul
2d940 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 64 65  ated for each de
2d950 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 61 62 6f  ferred token abo
2d960 76 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ve. */.    sqlit
2d970 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72  e3Fts3FreeDeferr
2d980 65 64 44 6f 63 6c 69 73 74 73 28 70 43 73 72 29  edDoclists(pCsr)
2d990 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  ;.    *pRc = rc;
2d9a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
2d9b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d9c0 62 4d 69 73 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bMiss);.}../*.**
2d9d0 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
2d9e0 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 74 68  next document th
2d9f0 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 46  at matches the F
2da00 54 53 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  TS expression in
2da10 0a 2a 2a 20 46 74 73 33 43 75 72 73 6f 72 2e 70  .** Fts3Cursor.p
2da20 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Expr..*/.static 
2da30 69 6e 74 20 66 74 73 33 45 76 61 6c 4e 65 78 74  int fts3EvalNext
2da40 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73  (Fts3Cursor *pCs
2da50 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2da60 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2da70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2da80 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  Code */.  Fts3Ex
2da90 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 73 72  pr *pExpr = pCsr
2daa0 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
2dab0 74 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d  t( pCsr->isEof==
2dac0 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
2dad0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 73 72 2d  ==0 ){.    pCsr-
2dae0 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  >isEof = 1;.  }e
2daf0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
2db00 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 73      if( pCsr->is
2db10 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29  RequireSeek==0 )
2db20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2db30 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 53  3_reset(pCsr->pS
2db40 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tmt);.      }.  
2db50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2db60 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
2db70 43 73 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29  Csr->pStmt)==0 )
2db80 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  ;.      fts3Eval
2db90 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 45  NextRow(pCsr, pE
2dba0 78 70 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  xpr, &rc);.     
2dbb0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 70   pCsr->isEof = p
2dbc0 45 78 70 72 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  Expr->bEof;.    
2dbd0 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72    pCsr->isRequir
2dbe0 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20 20  eSeek = 1;.     
2dbf0 20 70 43 73 72 2d 3e 69 73 4d 61 74 63 68 69 6e   pCsr->isMatchin
2dc00 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b 0a 20 20  foNeeded = 1;.  
2dc10 20 20 20 20 70 43 73 72 2d 3e 69 50 72 65 76 49      pCsr->iPrevI
2dc20 64 20 3d 20 70 45 78 70 72 2d 3e 69 44 6f 63 69  d = pExpr->iDoci
2dc30 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  d;.    }while( p
2dc40 43 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20 26 26  Csr->isEof==0 &&
2dc50 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
2dc60 54 65 73 74 44 65 66 65 72 72 65 64 28 70 43 73  TestDeferred(pCs
2dc70 72 2c 20 26 72 63 29 20 29 3b 0a 20 20 7d 0a 0a  r, &rc) );.  }..
2dc80 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2dc90 65 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  e cursor is past
2dca0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2dcb0 64 6f 63 69 64 20 72 61 6e 67 65 20 73 70 65 63  docid range spec
2dcc0 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 46 74  ified.  ** by Ft
2dcd0 73 33 43 75 72 73 6f 72 2e 69 4d 69 6e 44 6f 63  s3Cursor.iMinDoc
2dce0 69 64 2f 69 4d 61 78 44 6f 63 69 64 2e 20 49 66  id/iMaxDocid. If
2dcf0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 45 4f 46   so, set the EOF
2dd00 20 66 6c 61 67 2e 20 20 2a 2f 0a 20 20 69 66 28   flag.  */.  if(
2dd10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2dd20 26 20 28 0a 20 20 20 20 20 20 20 20 28 70 43 73  & (.        (pCs
2dd30 72 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26 20 70  r->bDesc==0 && p
2dd40 43 73 72 2d 3e 69 50 72 65 76 49 64 3e 70 43 73  Csr->iPrevId>pCs
2dd50 72 2d 3e 69 4d 61 78 44 6f 63 69 64 29 0a 20 20  r->iMaxDocid).  
2dd60 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 62 44 65     || (pCsr->bDe
2dd70 73 63 21 3d 30 20 26 26 20 70 43 73 72 2d 3e 69  sc!=0 && pCsr->i
2dd80 50 72 65 76 49 64 3c 70 43 73 72 2d 3e 69 4d 69  PrevId<pCsr->iMi
2dd90 6e 44 6f 63 69 64 29 0a 20 20 29 29 7b 0a 20 20  nDocid).  )){.  
2dda0 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
2ddb0 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
2ddc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2ddd0 73 74 61 72 74 20 69 6e 74 65 72 61 74 69 6f 6e  start interation
2dde0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
2ddf0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68  pExpr so that th
2de00 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 2a  e next call to.*
2de10 2a 20 66 74 73 33 45 76 61 6c 4e 65 78 74 28 29  * fts3EvalNext()
2de20 20 76 69 73 69 74 73 20 74 68 65 20 66 69 72 73   visits the firs
2de30 74 20 72 6f 77 2e 20 44 6f 20 6e 6f 74 20 61 6c  t row. Do not al
2de40 6c 6f 77 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  low incremental 
2de50 0a 2a 2a 20 6c 6f 61 64 69 6e 67 20 6f 72 20 6d  .** loading or m
2de60 65 72 67 69 6e 67 20 6f 66 20 70 68 72 61 73 65  erging of phrase
2de70 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 74 68   doclists for th
2de80 69 73 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is iteration..**
2de90 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f  .** If *pRc is o
2dea0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2deb0 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
2dec0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2ded0 2c 20 69 74 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  , it is.** a no-
2dee0 6f 70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  op. If an error 
2def0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
2df00 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52  is function, *pR
2df10 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 0a 2a  c is set to an.*
2df20 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
2df30 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ode before retur
2df40 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
2df50 76 6f 69 64 20 66 74 73 33 45 76 61 6c 52 65 73  void fts3EvalRes
2df60 74 61 72 74 28 0a 20 20 46 74 73 33 43 75 72 73  tart(.  Fts3Curs
2df70 6f 72 20 2a 70 43 73 72 2c 0a 20 20 46 74 73 33  or *pCsr,.  Fts3
2df80 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 69  Expr *pExpr,.  i
2df90 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69 66 28  nt *pRc.){.  if(
2dfa0 20 70 45 78 70 72 20 26 26 20 2a 70 52 63 3d 3d   pExpr && *pRc==
2dfb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dfc0 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
2dfd0 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50  rase = pExpr->pP
2dfe0 68 72 61 73 65 3b 0a 0a 20 20 20 20 69 66 28 20  hrase;..    if( 
2dff0 70 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20 20  pPhrase ){.     
2e000 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64   fts3EvalInvalid
2e010 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72 61  atePoslist(pPhra
2e020 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
2e030 50 68 72 61 73 65 2d 3e 62 49 6e 63 72 20 29 7b  Phrase->bIncr ){
2e040 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2e050 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2e060 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b   i<pPhrase->nTok
2e070 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  en; i++){.      
2e080 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
2e090 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70  ken *pToken = &p
2e0a0 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
2e0b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
2e0c0 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44 65  ert( pToken->pDe
2e0d0 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ferred==0 );.   
2e0e0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
2e0f0 6e 2d 3e 70 53 65 67 63 73 72 20 29 7b 0a 20 20  n->pSegcsr ){.  
2e100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e110 33 46 74 73 33 4d 73 72 49 6e 63 72 52 65 73 74  3Fts3MsrIncrRest
2e120 61 72 74 28 70 54 6f 6b 65 6e 2d 3e 70 53 65 67  art(pToken->pSeg
2e130 63 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  csr);.          
2e140 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e150 20 20 20 20 2a 70 52 63 20 3d 20 66 74 73 33 45      *pRc = fts3E
2e160 76 61 6c 50 68 72 61 73 65 53 74 61 72 74 28 70  valPhraseStart(p
2e170 43 73 72 2c 20 30 2c 20 70 50 68 72 61 73 65 29  Csr, 0, pPhrase)
2e180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e190 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
2e1a0 2e 70 4e 65 78 74 44 6f 63 69 64 20 3d 20 30 3b  .pNextDocid = 0;
2e1b0 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
2e1c0 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 20 3d  doclist.iDocid =
2e1d0 20 30 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73   0;.      pPhras
2e1e0 65 2d 3e 70 4f 72 50 6f 73 6c 69 73 74 20 3d 20  e->pOrPoslist = 
2e1f0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 45  0;.    }..    pE
2e200 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b  xpr->iDocid = 0;
2e210 0a 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66  .    pExpr->bEof
2e220 20 3d 20 30 3b 0a 20 20 20 20 70 45 78 70 72 2d   = 0;.    pExpr-
2e230 3e 62 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20  >bStart = 0;..  
2e240 20 20 66 74 73 33 45 76 61 6c 52 65 73 74 61 72    fts3EvalRestar
2e250 74 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70  t(pCsr, pExpr->p
2e260 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  Left, pRc);.    
2e270 66 74 73 33 45 76 61 6c 52 65 73 74 61 72 74 28  fts3EvalRestart(
2e280 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  pCsr, pExpr->pRi
2e290 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 7d 0a 7d  ght, pRc);.  }.}
2e2a0 0a 0a 2f 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c  ../*.** After al
2e2b0 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 46 74 73  locating the Fts
2e2c0 33 45 78 70 72 2e 61 4d 49 5b 5d 20 61 72 72 61  3Expr.aMI[] arra
2e2d0 79 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73  y for each phras
2e2e0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 65 78 70  e in the .** exp
2e2f0 72 65 73 73 69 6f 6e 20 72 6f 6f 74 65 64 20 61  ression rooted a
2e300 74 20 70 45 78 70 72 2c 20 74 68 65 20 63 75 72  t pExpr, the cur
2e310 73 6f 72 20 69 74 65 72 61 74 65 73 20 74 68 72  sor iterates thr
2e320 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6d 61  ough all rows ma
2e330 74 63 68 65 64 0a 2a 2a 20 62 79 20 70 45 78 70  tched.** by pExp
2e340 72 2c 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  r, calling this 
2e350 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
2e360 68 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63  h row. This func
2e370 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 0a  tion increments.
2e380 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  ** the values in
2e390 20 46 74 73 33 45 78 70 72 2e 61 4d 49 5b 5d 20   Fts3Expr.aMI[] 
2e3a0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2e3b0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
2e3c0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 6f 75 6e  urrently.** foun
2e3d0 64 20 69 6e 20 46 74 73 33 45 78 70 72 2e 70 50  d in Fts3Expr.pP
2e3e0 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
2e3f0 4c 69 73 74 20 66 6f 72 20 65 61 63 68 20 6f 66  List for each of
2e400 20 74 68 65 20 70 68 72 61 73 65 20 0a 2a 2a 20   the phrase .** 
2e410 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73  expression nodes
2e420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e430 20 66 74 73 33 45 76 61 6c 55 70 64 61 74 65 43   fts3EvalUpdateC
2e440 6f 75 6e 74 73 28 46 74 73 33 45 78 70 72 20 2a  ounts(Fts3Expr *
2e450 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2e460 78 70 72 20 29 7b 0a 20 20 20 20 46 74 73 33 50  xpr ){.    Fts3P
2e470 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
2e480 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b   pExpr->pPhrase;
2e490 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65  .    if( pPhrase
2e4a0 20 26 26 20 70 50 68 72 61 73 65 2d 3e 64 6f 63   && pPhrase->doc
2e4b0 6c 69 73 74 2e 70 4c 69 73 74 20 29 7b 0a 20 20  list.pList ){.  
2e4c0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30      int iCol = 0
2e4d0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 20  ;.      char *p 
2e4e0 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  = pPhrase->docli
2e4f0 73 74 2e 70 4c 69 73 74 3b 0a 0a 20 20 20 20 20  st.pList;..     
2e500 20 61 73 73 65 72 74 28 20 2a 70 20 29 3b 0a 20   assert( *p );. 
2e510 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
2e520 0a 20 20 20 20 20 20 20 20 75 38 20 63 20 3d 20  .        u8 c = 
2e530 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
2e540 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cnt = 0;.       
2e550 20 77 68 69 6c 65 28 20 30 78 46 45 20 26 20 28   while( 0xFE & (
2e560 2a 70 20 7c 20 63 29 20 29 7b 0a 20 20 20 20 20  *p | c) ){.     
2e570 20 20 20 20 20 69 66 28 20 28 63 26 30 78 38 30       if( (c&0x80
2e580 29 3d 3d 30 20 29 20 69 43 6e 74 2b 2b 3b 0a 20  )==0 ) iCnt++;. 
2e590 20 20 20 20 20 20 20 20 20 63 20 3d 20 2a 70 2b           c = *p+
2e5a0 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20 20  + & 0x80;.      
2e5b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2e5c0 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20  aMI[iCol*3 + 1] 
2e5d0 3d 20 4e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75  = Number of occu
2e5e0 72 72 65 6e 63 65 73 0a 20 20 20 20 20 20 20 20  rrences.        
2e5f0 2a 2a 20 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20  ** aMI[iCol*3 + 
2e600 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20 72  2] = Number of r
2e610 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ows containing a
2e620 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73 74  t least one inst
2e630 61 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ance.        */.
2e640 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
2e650 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 2b  MI[iCol*3 + 1] +
2e660 3d 20 69 43 6e 74 3b 0a 20 20 20 20 20 20 20 20  = iCnt;.        
2e670 70 45 78 70 72 2d 3e 61 4d 49 5b 69 43 6f 6c 2a  pExpr->aMI[iCol*
2e680 33 20 2b 20 32 5d 20 2b 3d 20 28 69 43 6e 74 3e  3 + 2] += (iCnt>
2e690 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2e6a0 2a 70 3d 3d 30 78 30 30 20 29 20 62 72 65 61 6b  *p==0x00 ) break
2e6b0 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20  ;.        p++;. 
2e6c0 20 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73 33         p += fts3
2e6d0 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 26  GetVarint32(p, &
2e6e0 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iCol);.      }. 
2e6f0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 45 76     }..    fts3Ev
2e700 61 6c 55 70 64 61 74 65 43 6f 75 6e 74 73 28 70  alUpdateCounts(p
2e710 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2e720 20 20 66 74 73 33 45 76 61 6c 55 70 64 61 74 65    fts3EvalUpdate
2e730 43 6f 75 6e 74 73 28 70 45 78 70 72 2d 3e 70 52  Counts(pExpr->pR
2e740 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2e750 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
2e760 45 78 70 72 20 6d 75 73 74 20 62 65 20 6f 66 20  Expr must be of 
2e770 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48  type FTSQUERY_PH
2e780 52 41 53 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  RASE..**.** If i
2e790 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2e7a0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
2e7b0 6f 70 75 6c 61 74 65 64 2c 20 74 68 69 73 20 66  opulated, this f
2e7c0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
2e7d0 73 20 61 6e 64 0a 2a 2a 20 70 6f 70 75 6c 61 74  s and.** populat
2e7e0 65 73 20 74 68 65 20 46 74 73 33 45 78 70 72 2e  es the Fts3Expr.
2e7f0 61 4d 49 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  aMI[] array for 
2e800 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2e810 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 70 61  . If pExpr is pa
2e820 72 74 0a 2a 2a 20 6f 66 20 61 20 4e 45 41 52 20  rt.** of a NEAR 
2e830 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
2e840 20 69 74 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74   it also allocat
2e850 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73  es and populates
2e860 20 74 68 65 20 73 61 6d 65 20 61 72 72 61 79 0a   the same array.
2e870 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72  ** for all other
2e880 20 70 68 72 61 73 65 73 20 74 68 61 74 20 61 72   phrases that ar
2e890 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 4e 45  e part of the NE
2e8a0 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  AR expression..*
2e8b0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2e8c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
2e8d0 65 20 61 4d 49 5b 5d 20 61 72 72 61 79 20 69 73  e aMI[] array is
2e8e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6c   successfully al
2e8f0 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 70  located and.** p
2e900 6f 70 75 6c 61 74 65 64 2e 20 4f 74 68 65 72 77  opulated. Otherw
2e910 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
2e920 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2e930 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2e940 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2e950 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
2e960 6c 47 61 74 68 65 72 53 74 61 74 73 28 0a 20 20  lGatherStats(.  
2e970 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
2e980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e990 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
2e9a0 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a   */.  Fts3Expr *
2e9b0 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
2e9c0 20 20 20 20 20 20 2f 2a 20 46 54 53 51 55 45 52        /* FTSQUER
2e9d0 59 5f 50 48 52 41 53 45 20 65 78 70 72 65 73 73  Y_PHRASE express
2e9e0 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
2e9f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ea00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2ea10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2ea20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2ea30 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
2ea40 50 48 52 41 53 45 20 29 3b 0a 20 20 69 66 28 20  PHRASE );.  if( 
2ea50 70 45 78 70 72 2d 3e 61 4d 49 3d 3d 30 20 29 7b  pExpr->aMI==0 ){
2ea60 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a  .    Fts3Table *
2ea70 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c  pTab = (Fts3Tabl
2ea80 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
2ea90 56 74 61 62 3b 0a 20 20 20 20 46 74 73 33 45 78  Vtab;.    Fts3Ex
2eaa0 70 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20  pr *pRoot;      
2eab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2eac0 74 20 6f 66 20 4e 45 41 52 20 65 78 70 72 65 73  t of NEAR expres
2ead0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 74 73 33  sion */.    Fts3
2eae0 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2eb00 74 65 72 61 74 6f 72 20 75 73 65 64 20 66 6f 72  terator used for
2eb10 20 73 65 76 65 72 61 6c 20 70 75 72 70 6f 73 65   several purpose
2eb20 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  s */..    sqlite
2eb30 33 5f 69 6e 74 36 34 20 69 50 72 65 76 49 64 20  3_int64 iPrevId 
2eb40 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3b  = pCsr->iPrevId;
2eb50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
2eb60 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 75  64 iDocid;.    u
2eb70 38 20 62 45 6f 66 3b 0a 0a 20 20 20 20 2f 2a 20  8 bEof;..    /* 
2eb80 46 69 6e 64 20 74 68 65 20 72 6f 6f 74 20 6f 66  Find the root of
2eb90 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65 73   the NEAR expres
2eba0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 52 6f 6f  sion */.    pRoo
2ebb0 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 77  t = pExpr;.    w
2ebc0 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 70 50 61  hile( pRoot->pPa
2ebd0 72 65 6e 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  rent && pRoot->p
2ebe0 50 61 72 65 6e 74 2d 3e 65 54 79 70 65 3d 3d 46  Parent->eType==F
2ebf0 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b 0a  TSQUERY_NEAR ){.
2ec00 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 52        pRoot = pR
2ec10 6f 6f 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  oot->pParent;.  
2ec20 20 20 7d 0a 20 20 20 20 69 44 6f 63 69 64 20 3d    }.    iDocid =
2ec30 20 70 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 3b 0a   pRoot->iDocid;.
2ec40 20 20 20 20 62 45 6f 66 20 3d 20 70 52 6f 6f 74      bEof = pRoot
2ec50 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 61 73 73 65  ->bEof;.    asse
2ec60 72 74 28 20 70 52 6f 6f 74 2d 3e 62 53 74 61 72  rt( pRoot->bStar
2ec70 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  t );..    /* All
2ec80 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
2ec90 74 68 65 20 61 4d 53 49 5b 5d 20 61 72 72 61 79  the aMSI[] array
2eca0 20 6f 66 20 65 61 63 68 20 46 54 53 51 55 45 52   of each FTSQUER
2ecb0 59 5f 50 48 52 41 53 45 20 6e 6f 64 65 20 2a 2f  Y_PHRASE node */
2ecc0 0a 20 20 20 20 66 6f 72 28 70 3d 70 52 6f 6f 74  .    for(p=pRoot
2ecd0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29  ; p; p=p->pLeft)
2ece0 7b 0a 20 20 20 20 20 20 46 74 73 33 45 78 70 72  {.      Fts3Expr
2ecf0 20 2a 70 45 20 3d 20 28 70 2d 3e 65 54 79 70 65   *pE = (p->eType
2ed00 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  ==FTSQUERY_PHRAS
2ed10 45 3f 70 3a 70 2d 3e 70 52 69 67 68 74 29 3b 0a  E?p:p->pRight);.
2ed20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2ed30 2d 3e 61 4d 49 3d 3d 30 20 29 3b 0a 20 20 20 20  ->aMI==0 );.    
2ed40 20 20 70 45 2d 3e 61 4d 49 20 3d 20 28 75 33 32    pE->aMI = (u32
2ed50 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2ed60 63 28 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20  c(pTab->nColumn 
2ed70 2a 20 33 20 2a 20 73 69 7a 65 6f 66 28 75 33 32  * 3 * sizeof(u32
2ed80 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
2ed90 45 2d 3e 61 4d 49 20 29 20 72 65 74 75 72 6e 20  E->aMI ) return 
2eda0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2edb0 20 20 20 20 6d 65 6d 73 65 74 28 70 45 2d 3e 61      memset(pE->a
2edc0 4d 49 2c 20 30 2c 20 70 54 61 62 2d 3e 6e 43 6f  MI, 0, pTab->nCo
2edd0 6c 75 6d 6e 20 2a 20 33 20 2a 20 73 69 7a 65 6f  lumn * 3 * sizeo
2ede0 66 28 75 33 32 29 29 3b 0a 20 20 20 20 7d 0a 0a  f(u32));.    }..
2edf0 20 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74      fts3EvalRest
2ee00 61 72 74 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c  art(pCsr, pRoot,
2ee10 20 26 72 63 29 3b 0a 0a 20 20 20 20 77 68 69 6c   &rc);..    whil
2ee20 65 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d  e( pCsr->isEof==
2ee30 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
2ee40 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 64 6f 20  OK ){..      do 
2ee50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 73  {.        /* Ens
2ee60 75 72 65 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  ure the %_conten
2ee70 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  t statement is r
2ee80 65 73 65 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  eset. */.       
2ee90 20 69 66 28 20 70 43 73 72 2d 3e 69 73 52 65 71   if( pCsr->isReq
2eea0 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 20 73 71  uireSeek==0 ) sq
2eeb0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72  lite3_reset(pCsr
2eec0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
2eed0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2eee0 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 43 73  3_data_count(pCs
2eef0 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 3b 0a  r->pStmt)==0 );.
2ef00 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61  .        /* Adva
2ef10 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
2ef20 64 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  document */.    
2ef30 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74      fts3EvalNext
2ef40 52 6f 77 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c  Row(pCsr, pRoot,
2ef50 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70   &rc);.        p
2ef60 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 70 52 6f  Csr->isEof = pRo
2ef70 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 20 20  ot->bEof;.      
2ef80 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72    pCsr->isRequir
2ef90 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20 20  eSeek = 1;.     
2efa0 20 20 20 70 43 73 72 2d 3e 69 73 4d 61 74 63 68     pCsr->isMatch
2efb0 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b 0a  infoNeeded = 1;.
2efc0 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50          pCsr->iP
2efd0 72 65 76 49 64 20 3d 20 70 52 6f 6f 74 2d 3e 69  revId = pRoot->i
2efe0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 7d 77 68  Docid;.      }wh
2eff0 69 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f 66  ile( pCsr->isEof
2f000 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
2f010 26 26 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 3d  && pRoot->eType=
2f020 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 0a  =FTSQUERY_NEAR .
2f030 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
2f040 6c 69 74 65 33 46 74 73 33 45 76 61 6c 54 65 73  lite3Fts3EvalTes
2f050 74 44 65 66 65 72 72 65 64 28 70 43 73 72 2c 20  tDeferred(pCsr, 
2f060 26 72 63 29 20 0a 20 20 20 20 20 20 29 3b 0a 0a  &rc) .      );..
2f070 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f080 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 73 72 2d  LITE_OK && pCsr-
2f090 3e 69 73 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  >isEof==0 ){.   
2f0a0 20 20 20 20 20 66 74 73 33 45 76 61 6c 55 70 64       fts3EvalUpd
2f0b0 61 74 65 43 6f 75 6e 74 73 28 70 52 6f 6f 74 29  ateCounts(pRoot)
2f0c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f0d0 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66  .    pCsr->isEof
2f0e0 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
2f0f0 69 50 72 65 76 49 64 20 3d 20 69 50 72 65 76 49  iPrevId = iPrevI
2f100 64 3b 0a 0a 20 20 20 20 69 66 28 20 62 45 6f 66  d;..    if( bEof
2f110 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
2f120 3e 62 45 6f 66 20 3d 20 62 45 6f 66 3b 0a 20 20  >bEof = bEof;.  
2f130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2f140 2a 20 43 61 75 74 69 6f 6e 3a 20 70 52 6f 6f 74  * Caution: pRoot
2f150 20 6d 61 79 20 69 74 65 72 61 74 65 20 74 68 72   may iterate thr
2f160 6f 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 61  ough docids in a
2f170 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
2f180 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ending.      ** 
2f190 6f 72 64 65 72 2e 20 46 6f 72 20 74 68 69 73 20  order. For this 
2f1a0 72 65 61 73 6f 6e 2c 20 65 76 65 6e 20 74 68 6f  reason, even tho
2f1b0 75 67 68 20 69 74 20 73 65 65 6d 73 20 6d 6f 72  ugh it seems mor
2f1c0 65 20 64 65 66 65 6e 73 69 76 65 2c 20 74 68 65  e defensive, the
2f1d0 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6c 6f   .      ** do lo
2f1e0 6f 70 20 63 61 6e 20 6e 6f 74 20 62 65 20 77 72  op can not be wr
2f1f0 69 74 74 65 6e 3a 0a 20 20 20 20 20 20 2a 2a 0a  itten:.      **.
2f200 20 20 20 20 20 20 2a 2a 20 20 20 64 6f 20 7b 2e        **   do {.
2f210 2e 2e 7d 20 77 68 69 6c 65 28 20 70 52 6f 6f 74  ..} while( pRoot
2f220 2d 3e 69 44 6f 63 69 64 3c 69 44 6f 63 69 64 20  ->iDocid<iDocid 
2f230 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2f240 20 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   );.      */.   
2f250 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74 61     fts3EvalResta
2f260 72 74 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c 20  rt(pCsr, pRoot, 
2f270 26 72 63 29 3b 0a 20 20 20 20 20 20 64 6f 20 7b  &rc);.      do {
2f280 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61  .        fts3Eva
2f290 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2f2a0 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  Root, &rc);.    
2f2b0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
2f2c0 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  t->bEof==0 );.  
2f2d0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f      }while( pRoo
2f2e0 74 2d 3e 69 44 6f 63 69 64 21 3d 69 44 6f 63 69  t->iDocid!=iDoci
2f2f0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
2f300 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OK );.    }.  }.
2f310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f320 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2f330 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
2f340 68 65 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 6d  he matchinfo() m
2f350 6f 64 75 6c 65 20 74 6f 20 71 75 65 72 79 20 61  odule to query a
2f360 20 70 68 72 61 73 65 20 0a 2a 2a 20 65 78 70 72   phrase .** expr
2f370 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
2f380 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
2f390 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  formation:.**.**
2f3a0 20 20 20 31 2e 20 54 68 65 20 74 6f 74 61 6c 20     1. The total 
2f3b0 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72  number of occurr
2f3c0 65 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68 72  ences of the phr
2f3d0 61 73 65 20 69 6e 20 65 61 63 68 20 63 6f 6c 75  ase in each colu
2f3e0 6d 6e 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 74  mn of .**      t
2f3f0 68 65 20 46 54 53 20 74 61 62 6c 65 20 28 63 6f  he FTS table (co
2f400 6e 73 69 64 65 72 69 6e 67 20 61 6c 6c 20 72 6f  nsidering all ro
2f410 77 73 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ws), and.**.**  
2f420 20 32 2e 20 46 6f 72 20 65 61 63 68 20 63 6f 6c   2. For each col
2f430 75 6d 6e 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  umn, the number 
2f440 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2f450 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20 74  able for which t
2f460 68 65 0a 2a 2a 20 20 20 20 20 20 63 6f 6c 75 6d  he.**      colum
2f470 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  n contains at le
2f480 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  ast one instance
2f490 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e 0a   of the phrase..
2f4a0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
2f4b0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
2f4c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2f4d0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 66  and the values f
2f4e0 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a  or each column.*
2f4f0 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
2f500 68 65 20 61 72 72 61 79 20 61 69 4f 75 74 20 61  he array aiOut a
2f510 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2f520 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20     aiOut[iCol*3 
2f530 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66  + 1] = Number of
2f540 20 6f 63 63 75 72 72 65 6e 63 65 73 0a 2a 2a 20   occurrences.** 
2f550 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b    aiOut[iCol*3 +
2f560 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20   2] = Number of 
2f570 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rows containing 
2f580 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73  at least one ins
2f590 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 43 61 76 65  tance.**.** Cave
2f5a0 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ats:.**.**   * I
2f5b0 66 20 61 20 70 68 72 61 73 65 20 63 6f 6e 73 69  f a phrase consi
2f5c0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
2f5d0 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c  deferred tokens,
2f5e0 20 74 68 65 6e 20 61 6c 6c 20 6f 75 74 70 75 74   then all output
2f5f0 20 0a 2a 2a 20 20 20 20 20 76 61 6c 75 65 73 20   .**     values 
2f600 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e  are set to the n
2f610 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
2f620 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ts in the table.
2f630 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   In other.**    
2f640 20 77 6f 72 64 73 20 77 65 20 61 73 73 75 6d 65   words we assume
2f650 20 74 68 61 74 20 76 65 72 79 20 63 6f 6d 6d 6f   that very commo
2f660 6e 20 74 6f 6b 65 6e 73 20 6f 63 63 75 72 20 65  n tokens occur e
2f670 78 61 63 74 6c 79 20 6f 6e 63 65 20 69 6e 20 65  xactly once in e
2f680 61 63 68 20 0a 2a 2a 20 20 20 20 20 63 6f 6c 75  ach .**     colu
2f690 6d 6e 20 6f 66 20 65 61 63 68 20 72 6f 77 20 6f  mn of each row o
2f6a0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2f6b0 2a 2a 20 20 20 2a 20 49 66 20 61 20 70 68 72 61  **   * If a phra
2f6c0 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  se contains some
2f6d0 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
2f6e0 20 28 61 6e 64 20 73 6f 6d 65 20 6e 6f 6e 2d 64   (and some non-d
2f6f0 65 66 65 72 72 65 64 20 0a 2a 2a 20 20 20 20 20  eferred .**     
2f700 74 6f 6b 65 6e 73 29 2c 20 63 6f 75 6e 74 20 74  tokens), count t
2f710 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6f 63 63  he potential occ
2f720 75 72 72 65 6e 63 65 20 69 64 65 6e 74 69 66 69  urrence identifi
2f730 65 64 20 62 79 20 63 6f 6e 73 69 64 65 72 69 6e  ed by considerin
2f740 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6e 6f 6e  g.**     the non
2f750 2d 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73  -deferred tokens
2f760 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74 75   instead of actu
2f770 61 6c 20 70 68 72 61 73 65 20 6f 63 63 75 72 72  al phrase occurr
2f780 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  ences..**.**   *
2f790 20 49 66 20 74 68 65 20 70 68 72 61 73 65 20 69   If the phrase i
2f7a0 73 20 70 61 72 74 20 6f 66 20 61 20 4e 45 41 52  s part of a NEAR
2f7b0 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
2f7c0 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 69 6e  n only phrase in
2f7d0 73 74 61 6e 63 65 73 0a 2a 2a 20 20 20 20 20 74  stances.**     t
2f7e0 68 61 74 20 6d 65 65 74 20 74 68 65 20 4e 45 41  hat meet the NEA
2f7f0 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72 65  R constraint are
2f800 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2f810 20 63 6f 75 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20   counts..*/.int 
2f820 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 50  sqlite3Fts3EvalP
2f830 68 72 61 73 65 53 74 61 74 73 28 0a 20 20 46 74  hraseStats(.  Ft
2f840 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f860 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e 64   FTS cursor hand
2f870 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  le */.  Fts3Expr
2f880 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
2f890 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
2f8a0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
2f8b0 20 20 75 33 32 20 2a 61 69 4f 75 74 20 20 20 20    u32 *aiOut    
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 77 72    /* Array to wr
2f8e0 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
2f8f0 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
2f900 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
2f910 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c  pTab = (Fts3Tabl
2f920 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
2f930 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Vtab;.  int rc =
2f940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2f950 74 20 69 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70  t iCol;..  if( p
2f960 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64 20  Expr->bDeferred 
2f970 26 26 20 70 45 78 70 72 2d 3e 70 50 61 72 65 6e  && pExpr->pParen
2f980 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55 45  t->eType!=FTSQUE
2f990 52 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20 61  RY_NEAR ){.    a
2f9a0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44 6f  ssert( pCsr->nDo
2f9b0 63 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  c>0 );.    for(i
2f9c0 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
2f9d0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b  ->nColumn; iCol+
2f9e0 2b 29 7b 0a 20 20 20 20 20 20 61 69 4f 75 74 5b  +){.      aiOut[
2f9f0 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 28 75  iCol*3 + 1] = (u
2fa00 33 32 29 70 43 73 72 2d 3e 6e 44 6f 63 3b 0a 20  32)pCsr->nDoc;. 
2fa10 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a       aiOut[iCol*
2fa20 33 20 2b 20 32 5d 20 3d 20 28 75 33 32 29 70 43  3 + 2] = (u32)pC
2fa30 73 72 2d 3e 6e 44 6f 63 3b 0a 20 20 20 20 7d 0a  sr->nDoc;.    }.
2fa40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2fa50 3d 20 66 74 73 33 45 76 61 6c 47 61 74 68 65 72  = fts3EvalGather
2fa60 53 74 61 74 73 28 70 43 73 72 2c 20 70 45 78 70  Stats(pCsr, pExp
2fa70 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
2fa80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fa90 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
2faa0 2d 3e 61 4d 49 20 29 3b 0a 20 20 20 20 20 20 66  ->aMI );.      f
2fab0 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
2fac0 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pTab->nColumn; i
2fad0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2fae0 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b 20 31  aiOut[iCol*3 + 1
2faf0 5d 20 3d 20 70 45 78 70 72 2d 3e 61 4d 49 5b 69  ] = pExpr->aMI[i
2fb00 43 6f 6c 2a 33 20 2b 20 31 5d 3b 0a 20 20 20 20  Col*3 + 1];.    
2fb10 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33      aiOut[iCol*3
2fb20 20 2b 20 32 5d 20 3d 20 70 45 78 70 72 2d 3e 61   + 2] = pExpr->a
2fb30 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 32 5d 3b 0a  MI[iCol*3 + 2];.
2fb40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fb50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2fb60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
2fb70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 70 61  ression pExpr pa
2fb80 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2fb90 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
2fba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
2fbb0 6d 75 73 74 20 62 65 20 6f 66 20 74 79 70 65 20  must be of type 
2fbc0 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 2e  FTSQUERY_PHRASE.
2fbd0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
2fbe0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
2fbf0 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70  ther NULL or a p
2fc00 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
2fc10 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
2fc20 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74   a position-list
2fc30 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
2fc40 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74  occurrences of t
2fc50 68 65 20 70 68 72 61 73 65 20 69 6e 20 63 6f 6c  he phrase in col
2fc60 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 6f 66 20 74  umn iCol.** of t
2fc70 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
2fc80 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
2fc90 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 72 65  ifically, the re
2fca0 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 63 6f  turned buffer co
2fcb0 6e 74 61 69 6e 73 20 31 20 76 61 72 69 6e 74 20  ntains 1 varint 
2fcc0 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 6f 63 63  for each .** occ
2fcd0 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70  urrence of the p
2fce0 68 72 61 73 65 20 69 6e 20 74 68 65 20 63 6f 6c  hrase in the col
2fcf0 75 6d 6e 2c 20 73 74 6f 72 65 64 20 75 73 69 6e  umn, stored usin
2fd00 67 20 74 68 65 20 6e 6f 72 6d 61 6c 20 28 64 65  g the normal (de
2fd10 6c 74 61 2b 32 29 20 0a 2a 2a 20 63 6f 6d 70 72  lta+2) .** compr
2fd20 65 73 73 69 6f 6e 20 61 6e 64 20 69 73 20 74 65  ession and is te
2fd30 72 6d 69 6e 61 74 65 64 20 62 79 20 65 69 74 68  rminated by eith
2fd40 65 72 20 61 6e 20 30 78 30 31 20 6f 72 20 30 78  er an 0x01 or 0x
2fd50 30 30 20 62 79 74 65 2e 20 46 6f 72 20 65 78 61  00 byte. For exa
2fd60 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  mple,.** if the 
2fd70 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
2fd80 20 63 6f 6e 74 61 69 6e 73 20 22 61 20 62 20 58   contains "a b X
2fd90 20 63 20 64 20 58 20 58 22 20 61 6e 64 20 74 68   c d X X" and th
2fda0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
2fdb0 2a 2a 20 66 6f 72 20 27 58 27 20 69 73 20 72 65  ** for 'X' is re
2fdc0 71 75 65 73 74 65 64 2c 20 74 68 65 20 62 75 66  quested, the buf
2fdd0 66 65 72 20 72 65 74 75 72 6e 65 64 20 6d 61 79  fer returned may
2fde0 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20   contain:.**.** 
2fdf0 20 20 20 20 30 78 30 34 20 30 78 30 35 20 30 78      0x04 0x05 0x
2fe00 30 33 20 30 78 30 31 20 20 20 6f 72 20 20 20 30  03 0x01   or   0
2fe10 78 30 34 20 30 78 30 35 20 30 78 30 33 20 30 78  x04 0x05 0x03 0x
2fe20 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  00.**.** This fu
2fe30 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 72 65 67  nction works reg
2fe40 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2fe50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 68  er or not the ph
2fe60 72 61 73 65 20 69 73 20 64 65 66 65 72 72 65 64  rase is deferred
2fe70 2c 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  ,.** incremental
2fe80 2c 20 6f 72 20 6e 65 69 74 68 65 72 2e 0a 2a 2f  , or neither..*/
2fe90 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2fea0 45 76 61 6c 50 68 72 61 73 65 50 6f 73 6c 69 73  EvalPhrasePoslis
2feb0 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  t(.  Fts3Cursor 
2fec0 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
2fed0 20 20 20 20 20 2f 2a 20 46 54 53 33 20 63 75 72       /* FTS3 cur
2fee0 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
2fef0 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff10 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 72 65 74  /* Phrase to ret
2ff20 75 72 6e 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  urn doclist for 
2ff30 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff50 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
2ff60 6f 20 72 65 74 75 72 6e 20 70 6f 73 69 74 69 6f  o return positio
2ff70 6e 20 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20  n list for */.  
2ff80 63 68 61 72 20 2a 2a 70 70 4f 75 74 20 20 20 20  char **ppOut    
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
2ffb0 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  to position list
2ffc0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 50 68 72   */.){.  Fts3Phr
2ffd0 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
2ffe0 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20  Expr->pPhrase;. 
2fff0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
30000 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
30010 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
30020 3b 0a 20 20 63 68 61 72 20 2a 70 49 74 65 72 3b  ;.  char *pIter;
30030 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20 20  .  int iThis;.  
30040 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
30050 6f 63 69 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ocid;..  /* If t
30060 68 69 73 20 70 68 72 61 73 65 20 69 73 20 61 70  his phrase is ap
30070 70 6c 69 65 73 20 73 70 65 63 69 66 69 63 61 6c  plies specifical
30080 6c 79 20 74 6f 20 73 6f 6d 65 20 63 6f 6c 75 6d  ly to some colum
30090 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 0a 20 20  n other than .  
300a0 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  ** column iCol, 
300b0 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70 6f  return a NULL po
300c0 69 6e 74 65 72 2e 20 20 2a 2f 0a 20 20 2a 70 70  inter.  */.  *pp
300d0 4f 75 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Out = 0;.  asser
300e0 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
300f0 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pTab->nColumn
30100 20 29 3b 0a 20 20 69 66 28 20 28 70 50 68 72 61   );.  if( (pPhra
30110 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  se->iColumn<pTab
30120 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50 68  ->nColumn && pPh
30130 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  rase->iColumn!=i
30140 43 6f 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Col) ){.    retu
30150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30160 7d 0a 0a 20 20 69 44 6f 63 69 64 20 3d 20 70 45  }..  iDocid = pE
30170 78 70 72 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 70  xpr->iDocid;.  p
30180 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e  Iter = pPhrase->
30190 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  doclist.pList;. 
301a0 20 69 66 28 20 69 44 6f 63 69 64 21 3d 70 43 73   if( iDocid!=pCs
301b0 72 2d 3e 69 50 72 65 76 49 64 20 7c 7c 20 70 45  r->iPrevId || pE
301c0 78 70 72 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20  xpr->bEof ){.   
301d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
301e0 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 62 44 65  _OK;.    int bDe
301f0 73 63 44 6f 63 6c 69 73 74 20 3d 20 70 54 61 62  scDoclist = pTab
30200 2d 3e 62 44 65 73 63 49 64 78 3b 20 20 20 20 20  ->bDescIdx;     
30210 20 2f 2a 20 46 6f 72 20 44 4f 43 49 44 5f 43 4d   /* For DOCID_CM
30220 50 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 20 20 69  P macro */.    i
30230 6e 74 20 62 4f 72 20 3d 20 30 3b 0a 20 20 20 20  nt bOr = 0;.    
30240 75 38 20 62 54 72 65 65 45 6f 66 20 3d 20 30 3b  u8 bTreeEof = 0;
30250 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70  .    Fts3Expr *p
30260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30270 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
30280 65 72 61 74 65 20 66 72 6f 6d 20 70 45 78 70 72  erate from pExpr
30290 20 74 6f 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20   to root */.    
302a0 46 74 73 33 45 78 70 72 20 2a 70 4e 65 61 72 3b  Fts3Expr *pNear;
302b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
302c0 20 4d 6f 73 74 20 73 65 6e 69 6f 72 20 4e 45 41   Most senior NEA
302d0 52 20 61 6e 63 65 73 74 6f 72 20 28 6f 72 20 70  R ancestor (or p
302e0 45 78 70 72 29 20 2a 2f 0a 20 20 20 20 69 6e 74  Expr) */.    int
302f0 20 62 4d 61 74 63 68 3b 0a 0a 20 20 20 20 2f 2a   bMatch;..    /*
30300 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 70   Check if this p
30310 68 72 61 73 65 20 64 65 73 63 65 6e 64 73 20 66  hrase descends f
30320 72 6f 6d 20 61 6e 20 4f 52 20 65 78 70 72 65 73  rom an OR expres
30330 73 69 6f 6e 20 6e 6f 64 65 2e 20 49 66 20 6e 6f  sion node. If no
30340 74 2c 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  t, .    ** retur
30350 6e 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  n NULL. Otherwis
30360 65 2c 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  e, the entry tha
30370 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
30380 20 64 6f 63 69 64 20 0a 20 20 20 20 2a 2a 20 70   docid .    ** p
30390 43 73 72 2d 3e 69 50 72 65 76 49 64 20 6d 61 79  Csr->iPrevId may
303a0 20 6c 69 65 20 65 61 72 6c 69 65 72 20 69 6e 20   lie earlier in 
303b0 74 68 65 20 64 6f 63 6c 69 73 74 20 62 75 66 66  the doclist buff
303c0 65 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20  er. Or, if the. 
303d0 20 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20     ** tree that 
303e0 74 68 65 20 6e 6f 64 65 20 69 73 20 70 61 72 74  the node is part
303f0 20 6f 66 20 68 61 73 20 62 65 65 6e 20 6d 61 72   of has been mar
30400 6b 65 64 20 61 73 20 45 4f 46 2c 20 62 75 74 20  ked as EOF, but 
30410 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 2a 2a 20  the node.    ** 
30420 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 45 4f  itself is not EO
30430 46 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 70  F, then it may p
30440 6f 69 6e 74 20 74 6f 20 61 6e 20 65 61 72 6c 69  oint to an earli
30450 65 72 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20  er entry. */.   
30460 20 70 4e 65 61 72 20 3d 20 70 45 78 70 72 3b 0a   pNear = pExpr;.
30470 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70 72 2d      for(p=pExpr-
30480 3e 70 50 61 72 65 6e 74 3b 20 70 3b 20 70 3d 70  >pParent; p; p=p
30490 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20 20 20 20  ->pParent){.    
304a0 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
304b0 46 54 53 51 55 45 52 59 5f 4f 52 20 29 20 62 4f  FTSQUERY_OR ) bO
304c0 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
304d0 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55   p->eType==FTSQU
304e0 45 52 59 5f 4e 45 41 52 20 29 20 70 4e 65 61 72  ERY_NEAR ) pNear
304f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
30500 70 2d 3e 62 45 6f 66 20 29 20 62 54 72 65 65 45  p->bEof ) bTreeE
30510 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
30520 20 20 69 66 28 20 62 4f 72 3d 3d 30 20 29 20 72    if( bOr==0 ) r
30530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30540 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  ..    /* This is
30550 20 74 68 65 20 64 65 73 63 65 6e 64 65 6e 74 20   the descendent 
30560 6f 66 20 61 6e 20 4f 52 20 6e 6f 64 65 2e 20 49  of an OR node. I
30570 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
30580 61 6e 6e 6f 74 20 75 73 65 0a 20 20 20 20 2a 2a  annot use.    **
30590 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
305a0 70 68 72 61 73 65 2e 20 4c 6f 61 64 20 74 68 65  phrase. Load the
305b0 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
305c0 66 6f 72 20 74 68 65 20 70 68 72 61 73 65 0a 20  for the phrase. 
305d0 20 20 20 2a 2a 20 69 6e 74 6f 20 6d 65 6d 6f 72     ** into memor
305e0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
305f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 68 72   */.    if( pPhr
30600 61 73 65 2d 3e 62 49 6e 63 72 20 29 7b 0a 20 20  ase->bIncr ){.  
30610 20 20 20 20 69 6e 74 20 62 45 6f 66 53 61 76 65      int bEofSave
30620 20 3d 20 70 4e 65 61 72 2d 3e 62 45 6f 66 3b 0a   = pNear->bEof;.
30630 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 52 65        fts3EvalRe
30640 73 74 61 72 74 28 70 43 73 72 2c 20 70 4e 65 61  start(pCsr, pNea
30650 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 77  r, &rc);.      w
30660 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
30670 5f 4f 4b 20 26 26 20 21 70 4e 65 61 72 2d 3e 62  _OK && !pNear->b
30680 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Eof ){.        f
30690 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70  ts3EvalNextRow(p
306a0 43 73 72 2c 20 70 4e 65 61 72 2c 20 26 72 63 29  Csr, pNear, &rc)
306b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 45  ;.        if( bE
306c0 6f 66 53 61 76 65 3d 3d 30 20 26 26 20 70 4e 65  ofSave==0 && pNe
306d0 61 72 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63  ar->iDocid==iDoc
306e0 69 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  id ) break;.    
306f0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
30700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30710 7c 7c 20 70 50 68 72 61 73 65 2d 3e 62 49 6e 63  || pPhrase->bInc
30720 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  r==0 );.    }.  
30730 20 20 69 66 28 20 62 54 72 65 65 45 6f 66 20 29    if( bTreeEof )
30740 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72  {.      while( r
30750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30760 21 70 4e 65 61 72 2d 3e 62 45 6f 66 20 29 7b 0a  !pNear->bEof ){.
30770 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
30780 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4e  NextRow(pCsr, pN
30790 65 61 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ear, &rc);.     
307a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
307b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
307c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
307d0 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
307e0 20 66 6f 72 28 70 3d 70 4e 65 61 72 3b 20 70 3b   for(p=pNear; p;
307f0 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20 20   p=p->pLeft){.  
30800 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b      u8 bEof = 0;
30810 0a 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20  .      Fts3Expr 
30820 2a 70 54 65 73 74 20 3d 20 70 3b 0a 20 20 20 20  *pTest = p;.    
30830 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50    Fts3Phrase *pP
30840 68 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  h;.      assert(
30850 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46   pTest->eType==F
30860 54 53 51 55 45 52 59 5f 4e 45 41 52 20 7c 7c 20  TSQUERY_NEAR || 
30870 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54  pTest->eType==FT
30880 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 3b  SQUERY_PHRASE );
30890 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 73 74  .      if( pTest
308a0 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
308b0 59 5f 4e 45 41 52 20 29 20 70 54 65 73 74 20 3d  Y_NEAR ) pTest =
308c0 20 70 54 65 73 74 2d 3e 70 52 69 67 68 74 3b 0a   pTest->pRight;.
308d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
308e0 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  est->eType==FTSQ
308f0 55 45 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20  UERY_PHRASE );. 
30900 20 20 20 20 20 70 50 68 20 3d 20 70 54 65 73 74       pPh = pTest
30910 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20 20 20 20  ->pPhrase;..    
30920 20 20 70 49 74 65 72 20 3d 20 70 50 68 2d 3e 70    pIter = pPh->p
30930 4f 72 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20  OrPoslist;.     
30940 20 69 44 6f 63 69 64 20 3d 20 70 50 68 2d 3e 69   iDocid = pPh->i
30950 4f 72 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 69  OrDocid;.      i
30960 66 28 20 70 43 73 72 2d 3e 62 44 65 73 63 3d 3d  f( pCsr->bDesc==
30970 62 44 65 73 63 44 6f 63 6c 69 73 74 20 29 7b 0a  bDescDoclist ){.
30980 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20 21          bEof = !
30990 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c  pPh->doclist.nAl
309a0 6c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  l ||.          (
309b0 70 49 74 65 72 20 3e 3d 20 28 70 50 68 2d 3e 64  pIter >= (pPh->d
309c0 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 2b 20 70 50  oclist.aAll + pP
309d0 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 29  h->doclist.nAll)
309e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
309f0 28 20 28 70 49 74 65 72 3d 3d 30 20 7c 7c 20 44  ( (pIter==0 || D
30a00 4f 43 49 44 5f 43 4d 50 28 69 44 6f 63 69 64 2c  OCID_CMP(iDocid,
30a10 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 29 3c   pCsr->iPrevId)<
30a20 30 20 29 20 26 26 20 62 45 6f 66 3d 3d 30 20 29  0 ) && bEof==0 )
30a30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30a40 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 4e 65  te3Fts3DoclistNe
30a50 78 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt(.            
30a60 20 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20    bDescDoclist, 
30a70 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c  pPh->doclist.aAl
30a80 6c 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e  l, pPh->doclist.
30a90 6e 41 6c 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  nAll, .         
30aa0 20 20 20 20 20 26 70 49 74 65 72 2c 20 26 69 44       &pIter, &iD
30ab0 6f 63 69 64 2c 20 26 62 45 6f 66 0a 20 20 20 20  ocid, &bEof.    
30ac0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
30ad0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
30ae0 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20 21          bEof = !
30af0 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c  pPh->doclist.nAl
30b00 6c 20 7c 7c 20 28 70 49 74 65 72 20 26 26 20 70  l || (pIter && p
30b10 49 74 65 72 3c 3d 70 50 68 2d 3e 64 6f 63 6c 69  Iter<=pPh->docli
30b20 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20 20 20 20  st.aAll);.      
30b30 20 20 77 68 69 6c 65 28 20 28 70 49 74 65 72 3d    while( (pIter=
30b40 3d 30 20 7c 7c 20 44 4f 43 49 44 5f 43 4d 50 28  =0 || DOCID_CMP(
30b50 69 44 6f 63 69 64 2c 20 70 43 73 72 2d 3e 69 50  iDocid, pCsr->iP
30b60 72 65 76 49 64 29 3e 30 20 29 20 26 26 20 62 45  revId)>0 ) && bE
30b70 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
30b80 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20     int dummy;.  
30b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
30ba0 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 0a  ts3DoclistPrev(.
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 44                bD
30bc0 65 73 63 44 6f 63 6c 69 73 74 2c 20 70 50 68 2d  escDoclist, pPh-
30bd0 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c 20 70  >doclist.aAll, p
30be0 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c  Ph->doclist.nAll
30bf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
30c00 20 26 70 49 74 65 72 2c 20 26 69 44 6f 63 69 64   &pIter, &iDocid
30c10 2c 20 26 64 75 6d 6d 79 2c 20 26 62 45 6f 66 0a  , &dummy, &bEof.
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
30c30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30c40 20 7d 0a 20 20 20 20 20 20 70 50 68 2d 3e 70 4f   }.      pPh->pO
30c50 72 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72  rPoslist = pIter
30c60 3b 0a 20 20 20 20 20 20 70 50 68 2d 3e 69 4f 72  ;.      pPh->iOr
30c70 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
30c80 20 20 20 20 20 20 69 66 28 20 62 45 6f 66 20 7c        if( bEof |
30c90 7c 20 69 44 6f 63 69 64 21 3d 70 43 73 72 2d 3e  | iDocid!=pCsr->
30ca0 69 50 72 65 76 49 64 20 29 20 62 4d 61 74 63 68  iPrevId ) bMatch
30cb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
30cc0 20 69 66 28 20 62 4d 61 74 63 68 20 29 7b 0a 20   if( bMatch ){. 
30cd0 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 50 68       pIter = pPh
30ce0 72 61 73 65 2d 3e 70 4f 72 50 6f 73 6c 69 73 74  rase->pOrPoslist
30cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30d00 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
30d10 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 49    }.  }.  if( pI
30d20 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
30d30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
30d40 28 20 2a 70 49 74 65 72 3d 3d 30 78 30 31 20 29  ( *pIter==0x01 )
30d50 7b 0a 20 20 20 20 70 49 74 65 72 2b 2b 3b 0a 20  {.    pIter++;. 
30d60 20 20 20 70 49 74 65 72 20 2b 3d 20 66 74 73 33     pIter += fts3
30d70 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  GetVarint32(pIte
30d80 72 2c 20 26 69 54 68 69 73 29 3b 0a 20 20 7d 65  r, &iThis);.  }e
30d90 6c 73 65 7b 0a 20 20 20 20 69 54 68 69 73 20 3d  lse{.    iThis =
30da0 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
30db0 20 69 54 68 69 73 3c 69 43 6f 6c 20 29 7b 0a 20   iThis<iCol ){. 
30dc0 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
30dd0 74 43 6f 70 79 28 30 2c 20 26 70 49 74 65 72 29  tCopy(0, &pIter)
30de0 3b 0a 20 20 20 20 69 66 28 20 2a 70 49 74 65 72  ;.    if( *pIter
30df0 3d 3d 30 78 30 30 20 29 20 72 65 74 75 72 6e 20  ==0x00 ) return 
30e00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
30e10 49 74 65 72 2b 2b 3b 0a 20 20 20 20 70 49 74 65  Iter++;.    pIte
30e20 72 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  r += fts3GetVari
30e30 6e 74 33 32 28 70 49 74 65 72 2c 20 26 69 54 68  nt32(pIter, &iTh
30e40 69 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  is);.  }.  if( *
30e50 70 49 74 65 72 3d 3d 30 78 30 30 20 29 7b 0a 20  pIter==0x00 ){. 
30e60 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
30e70 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 28 28  }..  *ppOut = ((
30e80 69 43 6f 6c 3d 3d 69 54 68 69 73 29 3f 70 49 74  iCol==iThis)?pIt
30e90 65 72 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  er:0);.  return 
30ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
30eb0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 63 6f 6d  .** Free all com
30ec0 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65 20 46  ponents of the F
30ed0 74 73 33 50 68 72 61 73 65 20 73 74 72 75 63 74  ts3Phrase struct
30ee0 75 72 65 20 74 68 61 74 20 77 65 72 65 20 61 6c  ure that were al
30ef0 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
30f00 65 20 65 76 61 6c 20 6d 6f 64 75 6c 65 2e 20 53  e eval module. S
30f10 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
30f20 73 20 6d 65 61 6e 73 20 74 6f 20 66 72 65 65 3a  s means to free:
30f30 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 63  .**.**   * the c
30f40 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 68 72 61  ontents of pPhra
30f50 73 65 2d 3e 64 6f 63 6c 69 73 74 2c 20 61 6e 64  se->doclist, and
30f60 0a 2a 2a 20 20 20 2a 20 61 6e 79 20 46 74 73 33  .**   * any Fts3
30f70 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 6f  MultiSegReader o
30f80 62 6a 65 63 74 73 20 68 65 6c 64 20 62 79 20 70  bjects held by p
30f90 68 72 61 73 65 20 74 6f 6b 65 6e 73 2e 0a 2a 2f  hrase tokens..*/
30fa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
30fb0 33 45 76 61 6c 50 68 72 61 73 65 43 6c 65 61 6e  3EvalPhraseClean
30fc0 75 70 28 46 74 73 33 50 68 72 61 73 65 20 2a 70  up(Fts3Phrase *p
30fd0 50 68 72 61 73 65 29 7b 0a 20 20 69 66 28 20 70  Phrase){.  if( p
30fe0 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20 69 6e  Phrase ){.    in
30ff0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
31000 5f 66 72 65 65 28 70 50 68 72 61 73 65 2d 3e 64  _free(pPhrase->d
31010 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20  oclist.aAll);.  
31020 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69    fts3EvalInvali
31030 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72  datePoslist(pPhr
31040 61 73 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ase);.    memset
31050 28 26 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  (&pPhrase->docli
31060 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  st, 0, sizeof(Ft
31070 73 33 44 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20  s3Doclist));.   
31080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
31090 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b  ase->nToken; i++
310a0 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67  ){.      fts3Seg
310b0 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65 65  ReaderCursorFree
310c0 28 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e  (pPhrase->aToken
310d0 5b 69 5d 2e 70 53 65 67 63 73 72 29 3b 0a 20 20  [i].pSegcsr);.  
310e0 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 6f      pPhrase->aTo
310f0 6b 65 6e 5b 69 5d 2e 70 53 65 67 63 73 72 20 3d  ken[i].pSegcsr =
31100 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
31110 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ../*.** Return S
31120 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
31130 41 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  AB..*/.#ifdef SQ
31140 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
31150 71 6c 69 74 65 33 46 74 73 33 43 6f 72 72 75 70  qlite3Fts3Corrup
31160 74 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  t(){.  return SQ
31170 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
31180 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  B;.}.#endif..#if
31190 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a 2f 2a   !SQLITE_CORE./*
311a0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 41  .** Initialize A
311b0 50 49 20 70 6f 69 6e 74 65 72 20 74 61 62 6c 65  PI pointer table
311c0 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  , if required..*
311d0 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  /.#ifdef _WIN32.
311e0 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
311f0 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74  port).#endif.int
31200 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 69 6e   sqlite3_fts3_in
31210 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
31220 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  b, .  char **pzE
31230 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73  rrMsg,.  const s
31240 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
31250 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53  nes *pApi.){.  S
31260 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
31270 49 4e 49 54 32 28 70 41 70 69 29 0a 20 20 72 65  INIT2(pApi).  re
31280 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 33  turn sqlite3Fts3
31290 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64  Init(db);.}.#end
312a0 69 66 0a 0a 23 65 6e 64 69 66 0a                 if..#endif.