/ Hex Artifact Content
Login

Artifact b04b0c57761fdba2ae562d9d9ba50c7c4a95d9ea:


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 2c 20 73 71 6c 69 74 65 5f 69  har *p, sqlite_i
3880: 6e 74 36 34 20 2a 76 29 7b 0a 20 20 63 6f 6e 73  nt64 *v){.  cons
3890: 74 20 63 68 61 72 20 2a 70 53 74 61 72 74 20 3d  t char *pStart =
38a0: 20 70 3b 0a 20 20 75 33 32 20 61 3b 0a 20 20 75   p;.  u32 a;.  u
38b0: 36 34 20 62 3b 0a 20 20 69 6e 74 20 73 68 69 66  64 b;.  int shif
38c0: 74 3b 0a 0a 20 20 47 45 54 56 41 52 49 4e 54 5f  t;..  GETVARINT_
38d0: 49 4e 49 54 28 61 2c 20 70 2c 20 30 2c 20 20 30  INIT(a, p, 0,  0
38e0: 78 30 30 2c 20 20 20 20 20 30 78 38 30 2c 20 2a  x00,     0x80, *
38f0: 76 2c 20 31 29 3b 0a 20 20 47 45 54 56 41 52 49  v, 1);.  GETVARI
3900: 4e 54 5f 53 54 45 50 28 61 2c 20 70 2c 20 37 2c  NT_STEP(a, p, 7,
3910: 20 20 30 78 37 46 2c 20 20 20 20 20 30 78 34 30    0x7F,     0x40
3920: 30 30 2c 20 2a 76 2c 20 32 29 3b 0a 20 20 47 45  00, *v, 2);.  GE
3930: 54 56 41 52 49 4e 54 5f 53 54 45 50 28 61 2c 20  TVARINT_STEP(a, 
3940: 70 2c 20 31 34 2c 20 30 78 33 46 46 46 2c 20 20  p, 14, 0x3FFF,  
3950: 20 30 78 32 30 30 30 30 30 2c 20 2a 76 2c 20 33   0x200000, *v, 3
3960: 29 3b 0a 20 20 47 45 54 56 41 52 49 4e 54 5f 53  );.  GETVARINT_S
3970: 54 45 50 28 61 2c 20 70 2c 20 32 31 2c 20 30 78  TEP(a, p, 21, 0x
3980: 31 46 46 46 46 46 2c 20 30 78 31 30 30 30 30 30  1FFFFF, 0x100000
3990: 30 30 2c 20 2a 76 2c 20 34 29 3b 0a 20 20 62 20  00, *v, 4);.  b 
39a0: 3d 20 28 61 20 26 20 30 78 30 46 46 46 46 46 46  = (a & 0x0FFFFFF
39b0: 46 20 29 3b 0a 0a 20 20 66 6f 72 28 73 68 69 66  F );..  for(shif
39c0: 74 3d 32 38 3b 20 73 68 69 66 74 3c 3d 36 33 3b  t=28; shift<=63;
39d0: 20 73 68 69 66 74 2b 3d 37 29 7b 0a 20 20 20 20   shift+=7){.    
39e0: 75 36 34 20 63 20 3d 20 2a 70 2b 2b 3b 0a 20 20  u64 c = *p++;.  
39f0: 20 20 62 20 2b 3d 20 28 63 26 30 78 37 46 29 20    b += (c&0x7F) 
3a00: 3c 3c 20 73 68 69 66 74 3b 0a 20 20 20 20 69 66  << shift;.    if
3a10: 28 20 28 63 20 26 20 30 78 38 30 29 3d 3d 30 20  ( (c & 0x80)==0 
3a20: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a  ) break;.  }.  *
3a30: 76 20 3d 20 62 3b 0a 20 20 72 65 74 75 72 6e 20  v = b;.  return 
3a40: 28 69 6e 74 29 28 70 20 2d 20 70 53 74 61 72 74  (int)(p - pStart
3a50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 69  );.}../*.** Simi
3a60: 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lar to sqlite3Ft
3a70: 73 33 47 65 74 56 61 72 69 6e 74 28 29 2c 20 65  s3GetVarint(), e
3a80: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 6f  xcept that the o
3a90: 75 74 70 75 74 20 69 73 20 74 72 75 6e 63 61 74  utput is truncat
3aa0: 65 64 20 74 6f 20 61 0a 2a 2a 20 33 32 2d 62 69  ed to a.** 32-bi
3ab0: 74 20 69 6e 74 65 67 65 72 20 62 65 66 6f 72 65  t integer before
3ac0: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
3ad0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
3ae0: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 63  ts3GetVarint32(c
3af0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69 6e  onst char *p, in
3b00: 74 20 2a 70 69 29 7b 0a 20 20 75 33 32 20 61 3b  t *pi){.  u32 a;
3b10: 0a 0a 23 69 66 6e 64 65 66 20 66 74 73 33 47 65  ..#ifndef fts3Ge
3b20: 74 56 61 72 69 6e 74 33 32 0a 20 20 47 45 54 56  tVarint32.  GETV
3b30: 41 52 49 4e 54 5f 49 4e 49 54 28 61 2c 20 70 2c  ARINT_INIT(a, p,
3b40: 20 30 2c 20 20 30 78 30 30 2c 20 20 20 20 20 30   0,  0x00,     0
3b50: 78 38 30 2c 20 2a 70 69 2c 20 31 29 3b 0a 23 65  x80, *pi, 1);.#e
3b60: 6c 73 65 0a 20 20 61 20 3d 20 28 2a 70 2b 2b 29  lse.  a = (*p++)
3b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 20 26 20  ;.  assert( a & 
3b80: 30 78 38 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  0x80 );.#endif..
3b90: 20 20 47 45 54 56 41 52 49 4e 54 5f 53 54 45 50    GETVARINT_STEP
3ba0: 28 61 2c 20 70 2c 20 37 2c 20 20 30 78 37 46 2c  (a, p, 7,  0x7F,
3bb0: 20 20 20 20 20 30 78 34 30 30 30 2c 20 2a 70 69       0x4000, *pi
3bc0: 2c 20 32 29 3b 0a 20 20 47 45 54 56 41 52 49 4e  , 2);.  GETVARIN
3bd0: 54 5f 53 54 45 50 28 61 2c 20 70 2c 20 31 34 2c  T_STEP(a, p, 14,
3be0: 20 30 78 33 46 46 46 2c 20 20 20 30 78 32 30 30   0x3FFF,   0x200
3bf0: 30 30 30 2c 20 2a 70 69 2c 20 33 29 3b 0a 20 20  000, *pi, 3);.  
3c00: 47 45 54 56 41 52 49 4e 54 5f 53 54 45 50 28 61  GETVARINT_STEP(a
3c10: 2c 20 70 2c 20 32 31 2c 20 30 78 31 46 46 46 46  , p, 21, 0x1FFFF
3c20: 46 2c 20 30 78 31 30 30 30 30 30 30 30 2c 20 2a  F, 0x10000000, *
3c30: 70 69 2c 20 34 29 3b 0a 20 20 61 20 3d 20 28 61  pi, 4);.  a = (a
3c40: 20 26 20 30 78 30 46 46 46 46 46 46 46 20 29 3b   & 0x0FFFFFFF );
3c50: 0a 20 20 2a 70 69 20 3d 20 28 69 6e 74 29 28 61  .  *pi = (int)(a
3c60: 20 7c 20 28 28 75 33 32 29 28 2a 70 20 26 20 30   | ((u32)(*p & 0
3c70: 78 30 46 29 20 3c 3c 20 32 38 29 29 3b 0a 20 20  x0F) << 28));.  
3c80: 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a 0a  return 5;.}../*.
3c90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
3ca0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
3cb0: 71 75 69 72 65 64 20 74 6f 20 65 6e 63 6f 64 65  quired to encode
3cc0: 20 76 20 61 73 20 61 20 76 61 72 69 6e 74 0a 2a   v as a varint.*
3cd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
3ce0: 33 56 61 72 69 6e 74 4c 65 6e 28 73 71 6c 69 74  3VarintLen(sqlit
3cf0: 65 33 5f 75 69 6e 74 36 34 20 76 29 7b 0a 20 20  e3_uint64 v){.  
3d00: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 64 6f 7b  int i = 0;.  do{
3d10: 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 76 20  .    i++;.    v 
3d20: 3e 3e 3d 20 37 3b 0a 20 20 7d 77 68 69 6c 65 28  >>= 7;.  }while(
3d30: 20 76 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   v!=0 );.  retur
3d40: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n i;.}../*.** Co
3d50: 6e 76 65 72 74 20 61 6e 20 53 51 4c 2d 73 74 79  nvert an SQL-sty
3d60: 6c 65 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le quoted string
3d70: 20 69 6e 74 6f 20 61 20 6e 6f 72 6d 61 6c 20 73   into a normal s
3d80: 74 72 69 6e 67 20 62 79 20 72 65 6d 6f 76 69 6e  tring by removin
3d90: 67 0a 2a 2a 20 74 68 65 20 71 75 6f 74 65 20 63  g.** the quote c
3da0: 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20  haracters.  The 
3db0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 64 6f  conversion is do
3dc0: 6e 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 49 66  ne in-place.  If
3dd0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 64 6f   the.** input do
3de0: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
3df0: 68 20 61 20 71 75 6f 74 65 20 63 68 61 72 61 63  h a quote charac
3e00: 74 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ter, then this r
3e10: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e  outine.** is a n
3e20: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d  o-op..**.** Exam
3e30: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
3e40: 22 61 62 63 22 20 20 20 62 65 63 6f 6d 65 73 20  "abc"   becomes 
3e50: 20 20 61 62 63 0a 2a 2a 20 20 20 20 20 27 78 79    abc.**     'xy
3e60: 7a 27 20 20 20 62 65 63 6f 6d 65 73 20 20 20 78  z'   becomes   x
3e70: 79 7a 0a 2a 2a 20 20 20 20 20 5b 70 71 72 5d 20  yz.**     [pqr] 
3e80: 20 20 62 65 63 6f 6d 65 73 20 20 20 70 71 72 0a    becomes   pqr.
3e90: 2a 2a 20 20 20 20 20 60 6d 6e 6f 60 20 20 20 62  **     `mno`   b
3ea0: 65 63 6f 6d 65 73 20 20 20 6d 6e 6f 0a 2a 2a 0a  ecomes   mno.**.
3eb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
3ec0: 74 73 33 44 65 71 75 6f 74 65 28 63 68 61 72 20  ts3Dequote(char 
3ed0: 2a 7a 29 7b 0a 20 20 63 68 61 72 20 71 75 6f 74  *z){.  char quot
3ee0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3ef0: 20 20 20 20 20 20 20 2f 2a 20 51 75 6f 74 65 20         /* Quote 
3f00: 63 68 61 72 61 63 74 65 72 20 28 69 66 20 61 6e  character (if an
3f10: 79 20 29 20 2a 2f 0a 0a 20 20 71 75 6f 74 65 20  y ) */..  quote 
3f20: 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28 20 71 75  = z[0];.  if( qu
3f30: 6f 74 65 3d 3d 27 5b 27 20 7c 7c 20 71 75 6f 74  ote=='[' || quot
3f40: 65 3d 3d 27 5c 27 27 20 7c 7c 20 71 75 6f 74 65  e=='\'' || quote
3f50: 3d 3d 27 22 27 20 7c 7c 20 71 75 6f 74 65 3d 3d  =='"' || quote==
3f60: 27 60 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  '`' ){.    int i
3f70: 49 6e 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  In = 1;         
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
3f90: 78 20 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74  x of next byte t
3fa0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 70 75  o read from inpu
3fb0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  t */.    int iOu
3fc0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
3fd0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3fe0: 6f 66 20 6e 65 78 74 20 62 79 74 65 20 74 6f 20  of next byte to 
3ff0: 77 72 69 74 65 20 74 6f 20 6f 75 74 70 75 74 20  write to output 
4000: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  */..    /* If th
4010: 65 20 66 69 72 73 74 20 62 79 74 65 20 77 61 73  e first byte was
4020: 20 61 20 27 5b 27 2c 20 74 68 65 6e 20 74 68 65   a '[', then the
4030: 20 63 6c 6f 73 65 2d 71 75 6f 74 65 20 63 68 61   close-quote cha
4040: 72 61 63 74 65 72 20 69 73 20 61 20 27 5d 27 20  racter is a ']' 
4050: 2a 2f 0a 20 20 20 20 69 66 28 20 71 75 6f 74 65  */.    if( quote
4060: 3d 3d 27 5b 27 20 29 20 71 75 6f 74 65 20 3d 20  =='[' ) quote = 
4070: 27 5d 27 3b 20 20 0a 0a 20 20 20 20 77 68 69 6c  ']';  ..    whil
4080: 65 28 20 7a 5b 69 49 6e 5d 20 29 7b 0a 20 20 20  e( z[iIn] ){.   
4090: 20 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71     if( z[iIn]==q
40a0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  uote ){.        
40b0: 69 66 28 20 7a 5b 69 49 6e 2b 31 5d 21 3d 71 75  if( z[iIn+1]!=qu
40c0: 6f 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ote ) break;.   
40d0: 20 20 20 20 20 7a 5b 69 4f 75 74 2b 2b 5d 20 3d       z[iOut++] =
40e0: 20 71 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20   quote;.        
40f0: 69 49 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  iIn += 2;.      
4100: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
4110: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a 5b 69 49 6e  [iOut++] = z[iIn
4120: 2b 2b 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++];.      }.   
4130: 20 7d 0a 20 20 20 20 7a 5b 69 4f 75 74 5d 20 3d   }.    z[iOut] =
4140: 20 27 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   '\0';.  }.}../*
4150: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
4160: 65 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74 68  e varint from th
4170: 65 20 64 6f 63 6c 69 73 74 20 61 74 20 2a 70 70  e doclist at *pp
4180: 20 61 6e 64 20 61 64 76 61 6e 63 65 20 2a 70 70   and advance *pp
4190: 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
41a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
41b0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
41c0: 68 65 20 76 61 72 69 6e 74 2e 20 20 41 64 64 20  he varint.  Add 
41d0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
41e0: 20 76 61 72 69 6e 74 0a 2a 2a 20 74 6f 20 2a 70   varint.** to *p
41f0: 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Val..*/.static v
4200: 6f 69 64 20 66 74 73 33 47 65 74 44 65 6c 74 61  oid fts3GetDelta
4210: 56 61 72 69 6e 74 28 63 68 61 72 20 2a 2a 70 70  Varint(char **pp
4220: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
4230: 2a 70 56 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *pVal){.  sqlite
4240: 33 5f 69 6e 74 36 34 20 69 56 61 6c 3b 0a 20 20  3_int64 iVal;.  
4250: 2a 70 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  *pp += sqlite3Ft
4260: 73 33 47 65 74 56 61 72 69 6e 74 28 2a 70 70 2c  s3GetVarint(*pp,
4270: 20 26 69 56 61 6c 29 3b 0a 20 20 2a 70 56 61 6c   &iVal);.  *pVal
4280: 20 2b 3d 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a   += iVal;.}../*.
4290: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
42a0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
42b0: 20 2a 70 70 20 70 6f 69 6e 74 73 20 74 6f 20 74   *pp points to t
42c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 66 6f  he first byte fo
42d0: 6c 6c 6f 77 69 6e 67 20 61 0a 2a 2a 20 76 61 72  llowing a.** var
42e0: 69 6e 74 20 74 68 61 74 20 69 73 20 70 61 72 74  int that is part
42f0: 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 20 28 6f   of a doclist (o
4300: 72 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2c  r position-list,
4310: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6c 69   or any other li
4320: 73 74 0a 2a 2a 20 6f 66 20 76 61 72 69 6e 74 73  st.** of varints
4330: 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
4340: 20 6d 6f 76 65 73 20 2a 70 70 20 74 6f 20 70 6f   moves *pp to po
4350: 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  int to the start
4360: 20 6f 66 20 74 68 61 74 20 76 61 72 69 6e 74 2c   of that varint,
4370: 0a 2a 2a 20 61 6e 64 20 73 65 74 73 20 2a 70 56  .** and sets *pV
4380: 61 6c 20 62 79 20 74 68 65 20 76 61 72 69 6e 74  al by the varint
4390: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 41 72   value..**.** Ar
43a0: 67 75 6d 65 6e 74 20 70 53 74 61 72 74 20 70 6f  gument pStart po
43b0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
43c0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 6f  t byte of the do
43d0: 63 6c 69 73 74 20 74 68 61 74 20 74 68 65 0a 2a  clist that the.*
43e0: 2a 20 76 61 72 69 6e 74 20 69 73 20 70 61 72 74  * varint is part
43f0: 20 6f 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   of..*/.static v
4400: 6f 69 64 20 66 74 73 33 47 65 74 52 65 76 65 72  oid fts3GetRever
4410: 73 65 56 61 72 69 6e 74 28 0a 20 20 63 68 61 72  seVarint(.  char
4420: 20 2a 2a 70 70 2c 20 0a 20 20 63 68 61 72 20 2a   **pp, .  char *
4430: 70 53 74 61 72 74 2c 20 0a 20 20 73 71 6c 69 74  pStart, .  sqlit
4440: 65 33 5f 69 6e 74 36 34 20 2a 70 56 61 6c 0a 29  e3_int64 *pVal.)
4450: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
4460: 34 20 69 56 61 6c 3b 0a 20 20 63 68 61 72 20 2a  4 iVal;.  char *
4470: 70 3b 0a 0a 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;..  /* Pointer
4480: 20 70 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74   p now points at
4490: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
44a0: 70 61 73 74 20 74 68 65 20 76 61 72 69 6e 74 20  past the varint 
44b0: 77 65 20 61 72 65 20 0a 20 20 2a 2a 20 69 6e 74  we are .  ** int
44c0: 65 72 65 73 74 65 64 20 69 6e 2e 20 53 6f 2c 20  erested in. So, 
44d0: 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 63 6c 69  unless the docli
44e0: 73 74 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  st is corrupt, t
44f0: 68 65 20 30 78 38 30 20 62 69 74 20 69 73 0a 20  he 0x80 bit is. 
4500: 20 2a 2a 20 63 6c 65 61 72 20 6f 6e 20 63 68 61   ** clear on cha
4510: 72 61 63 74 65 72 20 70 5b 2d 31 5d 2e 20 2a 2f  racter p[-1]. */
4520: 0a 20 20 66 6f 72 28 70 20 3d 20 28 2a 70 70 29  .  for(p = (*pp)
4530: 2d 32 3b 20 70 3e 3d 70 53 74 61 72 74 20 26 26  -2; p>=pStart &&
4540: 20 2a 70 26 30 78 38 30 3b 20 70 2d 2d 29 3b 0a   *p&0x80; p--);.
4550: 20 20 70 2b 2b 3b 0a 20 20 2a 70 70 20 3d 20 70    p++;.  *pp = p
4560: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  ;..  sqlite3Fts3
4570: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 56  GetVarint(p, &iV
4580: 61 6c 29 3b 0a 20 20 2a 70 56 61 6c 20 3d 20 69  al);.  *pVal = i
4590: 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Val;.}../*.** Th
45a0: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
45b0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 65  virtual table me
45c0: 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
45d0: 69 6e 74 20 66 74 73 33 44 69 73 63 6f 6e 6e 65  int fts3Disconne
45e0: 63 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33  ctMethod(sqlite3
45f0: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
4600: 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20   Fts3Table *p = 
4610: 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74  (Fts3Table *)pVt
4620: 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ab;.  int i;..  
4630: 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64  assert( p->nPend
4640: 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ingData==0 );.  
4650: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d  assert( p->pSegm
4660: 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ents==0 );..  /*
4670: 20 46 72 65 65 20 61 6e 79 20 70 72 65 70 61 72   Free any prepar
4680: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 68 65  ed statements he
4690: 6c 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ld */.  for(i=0;
46a0: 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 70   i<SizeofArray(p
46b0: 2d 3e 61 53 74 6d 74 29 3b 20 69 2b 2b 29 7b 0a  ->aStmt); i++){.
46c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
46d0: 6c 69 7a 65 28 70 2d 3e 61 53 74 6d 74 5b 69 5d  lize(p->aStmt[i]
46e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
46f0: 5f 66 72 65 65 28 70 2d 3e 7a 53 65 67 6d 65 6e  _free(p->zSegmen
4700: 74 73 54 62 6c 29 3b 0a 20 20 73 71 6c 69 74 65  tsTbl);.  sqlite
4710: 33 5f 66 72 65 65 28 70 2d 3e 7a 52 65 61 64 45  3_free(p->zReadE
4720: 78 70 72 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69  xprlist);.  sqli
4730: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 57 72 69  te3_free(p->zWri
4740: 74 65 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 73  teExprlist);.  s
4750: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
4760: 43 6f 6e 74 65 6e 74 54 62 6c 29 3b 0a 20 20 73  ContentTbl);.  s
4770: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
4780: 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a 0a 20 20  Languageid);..  
4790: 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 74 6f  /* Invoke the to
47a0: 6b 65 6e 69 7a 65 72 20 64 65 73 74 72 75 63 74  kenizer destruct
47b0: 6f 72 20 74 6f 20 66 72 65 65 20 74 68 65 20 74  or to free the t
47c0: 6f 6b 65 6e 69 7a 65 72 2e 20 2a 2f 0a 20 20 70  okenizer. */.  p
47d0: 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d  ->pTokenizer->pM
47e0: 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72 6f 79 28  odule->xDestroy(
47f0: 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a  p->pTokenizer);.
4800: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4810: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
4820: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
4830: 20 57 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   Write an error 
4840: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 2a 70 7a  message into *pz
4850: 45 72 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Err.*/.void sqli
4860: 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 63 68  te3Fts3ErrMsg(ch
4870: 61 72 20 2a 2a 70 7a 45 72 72 2c 20 63 6f 6e 73  ar **pzErr, cons
4880: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
4890: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
48a0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   ap;.  sqlite3_f
48b0: 72 65 65 28 2a 70 7a 45 72 72 29 3b 0a 20 20 76  ree(*pzErr);.  v
48c0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
48d0: 6d 61 74 29 3b 0a 20 20 2a 70 7a 45 72 72 20 3d  mat);.  *pzErr =
48e0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
48f0: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
4900: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
4910: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
4920: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c   one or more SQL
4930: 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d   statements from
4940: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
4950: 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20  ng given.** and 
4960: 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
4970: 6f 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ose statements. 
4980: 54 68 65 20 73 75 63 63 65 73 73 20 63 6f 64 65  The success code
4990: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
49a0: 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20  nto *pRc..**.** 
49b0: 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69  If *pRc is initi
49c0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  ally non-zero th
49d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
49e0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
49f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 44  tatic void fts3D
4a00: 62 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  bExec(.  int *pR
4a10: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4a20: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
4a30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4a40: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
4a50: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
4a60: 20 74 6f 20 72 75 6e 20 53 51 4c 20 2a 2f 0a 20   to run SQL */. 
4a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
4a80: 72 6d 61 74 2c 20 20 20 2f 2a 20 46 6f 72 6d 61  rmat,   /* Forma
4a90: 74 20 73 74 72 69 6e 67 20 66 6f 72 20 53 51 4c  t string for SQL
4aa0: 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20   */.  ...       
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ac0: 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  Arguments to the
4ad0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a   format string *
4ae0: 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  /.){.  va_list a
4af0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
4b00: 0a 20 20 69 66 28 20 2a 70 52 63 20 29 20 72 65  .  if( *pRc ) re
4b10: 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74  turn;.  va_start
4b20: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
4b30: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
4b40: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
4b50: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
4b60: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
4b70: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  =0 ){.    *pRc =
4b80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4b90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 63   }else{.    *pRc
4ba0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4bb0: 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
4bc0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
4bd0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
4be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 44 65  }../*.** The xDe
4bf0: 73 74 72 6f 79 28 29 20 76 69 72 74 75 61 6c 20  stroy() virtual 
4c00: 74 61 62 6c 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f  table method..*/
4c10: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
4c20: 44 65 73 74 72 6f 79 4d 65 74 68 6f 64 28 73 71  DestroyMethod(sq
4c30: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
4c40: 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  b){.  Fts3Table 
4c50: 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
4c60: 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  *)pVtab;.  int r
4c70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
4c90: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
4ca0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
4cb0: 3d 20 70 2d 3e 7a 44 62 3b 20 20 20 20 20 20 20  = p->zDb;       
4cc0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
4cd0: 62 61 73 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e  base (e.g. "main
4ce0: 22 2c 20 22 74 65 6d 70 22 29 20 2a 2f 0a 20 20  ", "temp") */.  
4cf0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4d00: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
4d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
4d20: 64 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 72 6f  dle */..  /* Dro
4d30: 70 20 74 68 65 20 73 68 61 64 6f 77 20 74 61 62  p the shadow tab
4d40: 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  les */.  if( p->
4d50: 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29  zContentTbl==0 )
4d60: 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78 65 63  {.    fts3DbExec
4d70: 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20  (&rc, db, "DROP 
4d80: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
4d90: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22  %Q.'%q_content'"
4da0: 2c 20 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  , zDb, p->zName)
4db0: 3b 0a 20 20 7d 0a 20 20 66 74 73 33 44 62 45 78  ;.  }.  fts3DbEx
4dc0: 65 63 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f  ec(&rc, db, "DRO
4dd0: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
4de0: 53 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e 74  S %Q.'%q_segment
4df0: 73 27 22 2c 20 7a 44 62 2c 70 2d 3e 7a 4e 61 6d  s'", zDb,p->zNam
4e00: 65 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65 63  e);.  fts3DbExec
4e10: 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20  (&rc, db, "DROP 
4e20: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
4e30: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c  %Q.'%q_segdir'",
4e40: 20 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b   zDb, p->zName);
4e50: 0a 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72  .  fts3DbExec(&r
4e60: 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42  c, db, "DROP TAB
4e70: 4c 45 20 49 46 20 45 58 49 53 54 53 20 25 51 2e  LE IF EXISTS %Q.
4e80: 27 25 71 5f 64 6f 63 73 69 7a 65 27 22 2c 20 7a  '%q_docsize'", z
4e90: 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Db, p->zName);. 
4ea0: 20 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c   fts3DbExec(&rc,
4eb0: 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42 4c 45   db, "DROP TABLE
4ec0: 20 49 46 20 45 58 49 53 54 53 20 25 51 2e 27 25   IF EXISTS %Q.'%
4ed0: 71 5f 73 74 61 74 27 22 2c 20 7a 44 62 2c 20 70  q_stat'", zDb, p
4ee0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  ->zName);..  /* 
4ef0: 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 68 61  If everything ha
4f00: 73 20 77 6f 72 6b 65 64 2c 20 69 6e 76 6f 6b 65  s worked, invoke
4f10: 20 66 74 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d   fts3DisconnectM
4f20: 65 74 68 6f 64 28 29 20 74 6f 20 66 72 65 65 20  ethod() to free 
4f30: 74 68 65 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  the.  ** memory 
4f40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4f50: 74 68 65 20 46 74 73 33 54 61 62 6c 65 20 73 74  the Fts3Table st
4f60: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
4f70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  rn SQLITE_OK..  
4f80: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
4f90: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
4fa0: 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  rror code..  */.
4fb0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
4fc0: 4c 49 54 45 5f 4f 4b 20 3f 20 66 74 73 33 44 69  LITE_OK ? fts3Di
4fd0: 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 70  sconnectMethod(p
4fe0: 56 74 61 62 29 20 3a 20 72 63 29 3b 0a 7d 0a 0a  Vtab) : rc);.}..
4ff0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ./*.** Invoke sq
5000: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
5010: 61 62 28 29 20 74 6f 20 64 65 63 6c 61 72 65 20  ab() to declare 
5020: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
5030: 68 65 20 46 54 53 33 20 74 61 62 6c 65 0a 2a 2a  he FTS3 table.**
5040: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
5050: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
5060: 68 69 73 20 69 73 20 64 6f 6e 65 20 61 73 20 70  his is done as p
5070: 61 72 74 20 6f 66 20 74 68 65 20 78 43 6f 6e 6e  art of the xConn
5080: 65 63 74 28 29 0a 2a 2a 20 61 6e 64 20 78 43 72  ect().** and xCr
5090: 65 61 74 65 28 29 20 6d 65 74 68 6f 64 73 2e 0a  eate() methods..
50a0: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
50b0: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 74   non-zero when t
50c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
50d0: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
50e0: 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65 72  no-op. .** Other
50f0: 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f  wise, if an erro
5100: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
5110: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
5120: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 52 63  s stored in *pRc
5130: 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
5140: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
5150: 76 6f 69 64 20 66 74 73 33 44 65 63 6c 61 72 65  void fts3Declare
5160: 56 74 61 62 28 69 6e 74 20 2a 70 52 63 2c 20 46  Vtab(int *pRc, F
5170: 74 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20  ts3Table *p){.  
5180: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
5190: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
51a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
51b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
51c0: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
51d0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
5200: 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  e */.    char *z
5210: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
5220: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
5230: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 74  atement passed t
5240: 6f 20 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29  o declare_vtab()
5250: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   */.    char *zC
5260: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ols;            
5270: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
5280: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
5290: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  lumns */.    con
52a0: 73 74 20 63 68 61 72 20 2a 7a 4c 61 6e 67 75 61  st char *zLangua
52b0: 67 65 69 64 3b 0a 0a 20 20 20 20 7a 4c 61 6e 67  geid;..    zLang
52c0: 75 61 67 65 69 64 20 3d 20 28 70 2d 3e 7a 4c 61  uageid = (p->zLa
52d0: 6e 67 75 61 67 65 69 64 20 3f 20 70 2d 3e 7a 4c  nguageid ? p->zL
52e0: 61 6e 67 75 61 67 65 69 64 20 3a 20 22 5f 5f 6c  anguageid : "__l
52f0: 61 6e 67 69 64 22 29 3b 0a 20 20 20 20 73 71 6c  angid");.    sql
5300: 69 74 65 33 5f 76 74 61 62 5f 63 6f 6e 66 69 67  ite3_vtab_config
5310: 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 56  (p->db, SQLITE_V
5320: 54 41 42 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 53  TAB_CONSTRAINT_S
5330: 55 50 50 4f 52 54 2c 20 31 29 3b 0a 0a 20 20 20  UPPORT, 1);..   
5340: 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 69 73   /* Create a lis
5350: 74 20 6f 66 20 75 73 65 72 20 63 6f 6c 75 6d 6e  t of user column
5360: 73 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  s for the virtua
5370: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 7a  l table */.    z
5380: 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cols = sqlite3_m
5390: 70 72 69 6e 74 66 28 22 25 51 2c 20 22 2c 20 70  printf("%Q, ", p
53a0: 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 30 5d 29 3b 0a  ->azColumn[0]);.
53b0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 7a 43 6f      for(i=1; zCo
53c0: 6c 73 20 26 26 20 69 3c 70 2d 3e 6e 43 6f 6c 75  ls && i<p->nColu
53d0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
53e0: 7a 43 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f  zCols = sqlite3_
53f0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 51 2c 20 22  mprintf("%z%Q, "
5400: 2c 20 7a 43 6f 6c 73 2c 20 70 2d 3e 61 7a 43 6f  , zCols, p->azCo
5410: 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  lumn[i]);.    }.
5420: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
5430: 68 65 20 77 68 6f 6c 65 20 22 43 52 45 41 54 45  he whole "CREATE
5440: 20 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e   TABLE" statemen
5450: 74 20 74 6f 20 70 61 73 73 20 74 6f 20 53 51 4c  t to pass to SQL
5460: 69 74 65 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20  ite */.    zSql 
5470: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5480: 66 28 0a 20 20 20 20 20 20 20 20 22 43 52 45 41  f(.        "CREA
5490: 54 45 20 54 41 42 4c 45 20 78 28 25 73 20 25 51  TE TABLE x(%s %Q
54a0: 20 48 49 44 44 45 4e 2c 20 64 6f 63 69 64 20 48   HIDDEN, docid H
54b0: 49 44 44 45 4e 2c 20 25 51 20 48 49 44 44 45 4e  IDDEN, %Q HIDDEN
54c0: 29 22 2c 20 0a 20 20 20 20 20 20 20 20 7a 43 6f  )", .        zCo
54d0: 6c 73 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4c  ls, p->zName, zL
54e0: 61 6e 67 75 61 67 65 69 64 0a 20 20 20 20 29 3b  anguageid.    );
54f0: 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 73 20  .    if( !zCols 
5500: 7c 7c 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  || !zSql ){.    
5510: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5520: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
5530: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5540: 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28  e3_declare_vtab(
5550: 70 2d 3e 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  p->db, zSql);.  
5560: 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
5570: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
5580: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
5590: 6f 6c 73 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d  ols);.    *pRc =
55a0: 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
55b0: 2a 20 43 72 65 61 74 65 20 74 68 65 20 25 5f 73  * Create the %_s
55c0: 74 61 74 20 74 61 62 6c 65 20 69 66 20 69 74 20  tat table if it 
55d0: 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
55e0: 20 65 78 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20   exist..*/.void 
55f0: 73 71 6c 69 74 65 33 46 74 73 33 43 72 65 61 74  sqlite3Fts3Creat
5600: 65 53 74 61 74 54 61 62 6c 65 28 69 6e 74 20 2a  eStatTable(int *
5610: 70 52 63 2c 20 46 74 73 33 54 61 62 6c 65 20 2a  pRc, Fts3Table *
5620: 70 29 7b 0a 20 20 66 74 73 33 44 62 45 78 65 63  p){.  fts3DbExec
5630: 28 70 52 63 2c 20 70 2d 3e 64 62 2c 20 0a 20 20  (pRc, p->db, .  
5640: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
5650: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
5660: 25 51 2e 27 25 71 5f 73 74 61 74 27 22 0a 20 20  %Q.'%q_stat'".  
5670: 20 20 20 20 20 20 20 20 22 28 69 64 20 49 4e 54          "(id INT
5680: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5690: 2c 20 76 61 6c 75 65 20 42 4c 4f 42 29 3b 22 2c  , value BLOB);",
56a0: 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20 70  .      p->zDb, p
56b0: 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69  ->zName.  );.  i
56c0: 66 28 20 28 2a 70 52 63 29 3d 3d 53 51 4c 49 54  f( (*pRc)==SQLIT
56d0: 45 5f 4f 4b 20 29 20 70 2d 3e 62 48 61 73 53 74  E_OK ) p->bHasSt
56e0: 61 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  at = 1;.}../*.**
56f0: 20 43 72 65 61 74 65 20 74 68 65 20 62 61 63 6b   Create the back
5700: 69 6e 67 20 73 74 6f 72 65 20 74 61 62 6c 65 73  ing store tables
5710: 20 28 25 5f 63 6f 6e 74 65 6e 74 2c 20 25 5f 73   (%_content, %_s
5720: 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 65  egments and %_se
5730: 67 64 69 72 29 0a 2a 2a 20 72 65 71 75 69 72 65  gdir).** require
5740: 64 20 62 79 20 74 68 65 20 46 54 53 33 20 74 61  d by the FTS3 ta
5750: 62 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ble passed as th
5760: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
5770: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 0a 2a 2a   This is done.**
5780: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
5790: 76 74 61 62 20 78 43 72 65 61 74 65 28 29 20 6d  vtab xCreate() m
57a0: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ethod..**.** If 
57b0: 74 68 65 20 70 2d 3e 62 48 61 73 44 6f 63 73 69  the p->bHasDocsi
57c0: 7a 65 20 62 6f 6f 6c 65 61 6e 20 69 73 20 74 72  ze boolean is tr
57d0: 75 65 20 28 69 6e 64 69 63 61 74 69 6e 67 20 74  ue (indicating t
57e0: 68 61 74 20 74 68 69 73 20 69 73 20 61 6e 0a 2a  hat this is an.*
57f0: 2a 20 46 54 53 34 20 74 61 62 6c 65 2c 20 6e 6f  * FTS4 table, no
5800: 74 20 61 6e 20 46 54 53 33 20 74 61 62 6c 65 29  t an FTS3 table)
5810: 20 74 68 65 6e 20 61 6c 73 6f 20 63 72 65 61 74   then also creat
5820: 65 20 74 68 65 20 25 5f 64 6f 63 73 69 7a 65 20  e the %_docsize 
5830: 61 6e 64 0a 2a 2a 20 25 5f 73 74 61 74 20 74 61  and.** %_stat ta
5840: 62 6c 65 73 20 72 65 71 75 69 72 65 64 20 62 79  bles required by
5850: 20 46 54 53 34 2e 0a 2a 2f 0a 73 74 61 74 69 63   FTS4..*/.static
5860: 20 69 6e 74 20 66 74 73 33 43 72 65 61 74 65 54   int fts3CreateT
5870: 61 62 6c 65 73 28 46 74 73 33 54 61 62 6c 65 20  ables(Fts3Table 
5880: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
5890: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
58a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
58b0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
58c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
58d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
58e0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
58f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5900: 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20   = p->db;       
5910: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
5920: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5930: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f  */..  if( p->zCo
5940: 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20  ntentTbl==0 ){. 
5950: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5960: 4c 61 6e 67 75 61 67 65 69 64 20 3d 20 70 2d 3e  Languageid = p->
5970: 7a 4c 61 6e 67 75 61 67 65 69 64 3b 0a 20 20 20  zLanguageid;.   
5980: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 43   char *zContentC
5990: 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ols;           /
59a0: 2a 20 43 6f 6c 75 6d 6e 73 20 6f 66 20 25 5f 63  * Columns of %_c
59b0: 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  ontent table */.
59c0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
59d0: 20 6c 69 73 74 20 6f 66 20 75 73 65 72 20 63 6f   list of user co
59e0: 6c 75 6d 6e 73 20 66 6f 72 20 74 68 65 20 63 6f  lumns for the co
59f0: 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
5a00: 20 20 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 20     zContentCols 
5a10: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5a20: 66 28 22 64 6f 63 69 64 20 49 4e 54 45 47 45 52  f("docid INTEGER
5a30: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a   PRIMARY KEY");.
5a40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 43 6f      for(i=0; zCo
5a50: 6e 74 65 6e 74 43 6f 6c 73 20 26 26 20 69 3c 70  ntentCols && i<p
5a60: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
5a70: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
5a80: 20 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 69 5d 3b   p->azColumn[i];
5a90: 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 43  .      zContentC
5aa0: 6f 6c 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ols = sqlite3_mp
5ab0: 72 69 6e 74 66 28 22 25 7a 2c 20 27 63 25 64 25  rintf("%z, 'c%d%
5ac0: 71 27 22 2c 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c  q'", zContentCol
5ad0: 73 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a  s, i, z);.    }.
5ae0: 20 20 20 20 69 66 28 20 7a 4c 61 6e 67 75 61 67      if( zLanguag
5af0: 65 69 64 20 26 26 20 7a 43 6f 6e 74 65 6e 74 43  eid && zContentC
5b00: 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  ols ){.      zCo
5b10: 6e 74 65 6e 74 43 6f 6c 73 20 3d 20 73 71 6c 69  ntentCols = sqli
5b20: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c  te3_mprintf("%z,
5b30: 20 6c 61 6e 67 69 64 22 2c 20 7a 43 6f 6e 74 65   langid", zConte
5b40: 6e 74 43 6f 6c 73 2c 20 7a 4c 61 6e 67 75 61 67  ntCols, zLanguag
5b50: 65 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eid);.    }.    
5b60: 69 66 28 20 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73  if( zContentCols
5b70: 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
5b80: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 0a 20 20 20 20  E_NOMEM;.  .    
5b90: 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 63 6f  /* Create the co
5ba0: 6e 74 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  ntent table */. 
5bb0: 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72     fts3DbExec(&r
5bc0: 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 20 22  c, db, .       "
5bd0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
5be0: 27 25 71 5f 63 6f 6e 74 65 6e 74 27 28 25 73 29  '%q_content'(%s)
5bf0: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 7a 44 62  ",.       p->zDb
5c00: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6e  , p->zName, zCon
5c10: 74 65 6e 74 43 6f 6c 73 0a 20 20 20 20 29 3b 0a  tentCols.    );.
5c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5c30: 28 7a 43 6f 6e 74 65 6e 74 43 6f 6c 73 29 3b 0a  (zContentCols);.
5c40: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
5c50: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 2a 2f   other tables */
5c60: 0a 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72  .  fts3DbExec(&r
5c70: 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 20 22 43  c, db, .      "C
5c80: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 27  REATE TABLE %Q.'
5c90: 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62 6c 6f  %q_segments'(blo
5ca0: 63 6b 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  ckid INTEGER PRI
5cb0: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
5cc0: 42 4c 4f 42 29 3b 22 2c 0a 20 20 20 20 20 20 70  BLOB);",.      p
5cd0: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 0a  ->zDb, p->zName.
5ce0: 20 20 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65    );.  fts3DbExe
5cf0: 63 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20  c(&rc, db, .    
5d00: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
5d10: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 28 22  %Q.'%q_segdir'("
5d20: 0a 20 20 20 20 20 20 20 20 22 6c 65 76 65 6c 20  .        "level 
5d30: 49 4e 54 45 47 45 52 2c 22 0a 20 20 20 20 20 20  INTEGER,".      
5d40: 20 20 22 69 64 78 20 49 4e 54 45 47 45 52 2c 22    "idx INTEGER,"
5d50: 0a 20 20 20 20 20 20 20 20 22 73 74 61 72 74 5f  .        "start_
5d60: 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 22 0a  block INTEGER,".
5d70: 20 20 20 20 20 20 20 20 22 6c 65 61 76 65 73 5f          "leaves_
5d80: 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45  end_block INTEGE
5d90: 52 2c 22 0a 20 20 20 20 20 20 20 20 22 65 6e 64  R,".        "end
5da0: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 22  _block INTEGER,"
5db0: 0a 20 20 20 20 20 20 20 20 22 72 6f 6f 74 20 42  .        "root B
5dc0: 4c 4f 42 2c 22 0a 20 20 20 20 20 20 20 20 22 50  LOB,".        "P
5dd0: 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c  RIMARY KEY(level
5de0: 2c 20 69 64 78 29 22 0a 20 20 20 20 20 20 22 29  , idx)".      ")
5df0: 3b 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62  ;",.      p->zDb
5e00: 2c 20 70 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a  , p->zName.  );.
5e10: 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63    if( p->bHasDoc
5e20: 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33  size ){.    fts3
5e30: 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
5e40: 0a 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45  .        "CREATE
5e50: 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 64 6f   TABLE %Q.'%q_do
5e60: 63 73 69 7a 65 27 28 64 6f 63 69 64 20 49 4e 54  csize'(docid INT
5e70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
5e80: 2c 20 73 69 7a 65 20 42 4c 4f 42 29 3b 22 2c 0a  , size BLOB);",.
5e90: 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20          p->zDb, 
5ea0: 70 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  p->zName.    );.
5eb0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5ec0: 3e 62 48 61 73 53 74 61 74 3d 3d 70 2d 3e 62 46  >bHasStat==p->bF
5ed0: 74 73 34 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ts4 );.  if( p->
5ee0: 62 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20  bHasStat ){.    
5ef0: 73 71 6c 69 74 65 33 46 74 73 33 43 72 65 61 74  sqlite3Fts3Creat
5f00: 65 53 74 61 74 54 61 62 6c 65 28 26 72 63 2c 20  eStatTable(&rc, 
5f10: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
5f20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
5f30: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
5f40: 64 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69  database page-si
5f50: 7a 65 20 69 6e 20 62 79 74 65 73 20 69 6e 20 70  ze in bytes in p
5f60: 2d 3e 6e 50 67 73 7a 2e 0a 2a 2a 0a 2a 2a 20 49  ->nPgsz..**.** I
5f70: 66 20 2a 70 52 63 20 69 73 20 6e 6f 6e 2d 7a 65  f *pRc is non-ze
5f80: 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ro when this fun
5f90: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
5fa0: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20   it is a no-op. 
5fb0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
5fc0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5fd0: 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
5fe0: 6f 72 20 63 6f 64 65 20 69 73 20 73 74 6f 72 65  or code is store
5ff0: 64 20 69 6e 20 2a 70 52 63 0a 2a 2a 20 62 65 66  d in *pRc.** bef
6000: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
6010: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6020: 73 33 44 61 74 61 62 61 73 65 50 61 67 65 53 69  s3DatabasePageSi
6030: 7a 65 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  ze(int *pRc, Fts
6040: 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 66  3Table *p){.  if
6050: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
6060: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  K ){.    int rc;
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
6090: 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61   code */.    cha
60a0: 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
60b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
60c0: 4c 20 74 65 78 74 20 22 50 52 41 47 4d 41 20 25  L text "PRAGMA %
60d0: 51 2e 70 61 67 65 5f 73 69 7a 65 22 20 2a 2f 0a  Q.page_size" */.
60e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
60f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
6100: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 22 50    /* Compiled "P
6110: 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f 73 69  RAGMA %Q.page_si
6120: 7a 65 22 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ze" statement */
6130: 0a 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  .  .    zSql = s
6140: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
6150: 50 52 41 47 4d 41 20 25 51 2e 70 61 67 65 5f 73  PRAGMA %Q.page_s
6160: 69 7a 65 22 2c 20 70 2d 3e 7a 44 62 29 3b 0a 20  ize", p->zDb);. 
6170: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a     if( !zSql ){.
6180: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6190: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
61a0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
61b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 70  qlite3_prepare(p
61c0: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
61d0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
61e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
61f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
6200: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
6210: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  t);.        p->n
6220: 50 67 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63  Pgsz = sqlite3_c
6230: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
6240: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   0);.        rc 
6250: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
6260: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
6270: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
6280: 51 4c 49 54 45 5f 41 55 54 48 20 29 7b 0a 20 20  QLITE_AUTH ){.  
6290: 20 20 20 20 20 20 70 2d 3e 6e 50 67 73 7a 20 3d        p->nPgsz =
62a0: 20 31 30 32 34 3b 0a 20 20 20 20 20 20 20 20 72   1024;.        r
62b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
62c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
62d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 67 73   assert( p->nPgs
62e0: 7a 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  z>0 || rc!=SQLIT
62f0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 73 71 6c 69  E_OK );.    sqli
6300: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6310: 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
6320: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 22 53 70 65   }.}../*.** "Spe
6330: 63 69 61 6c 22 20 46 54 53 34 20 61 72 67 75 6d  cial" FTS4 argum
6340: 65 6e 74 73 20 61 72 65 20 63 6f 6c 75 6d 6e 20  ents are column 
6350: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 73 20 6f  specifications o
6360: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6370: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 6b  form:.**.**   <k
6380: 65 79 3e 20 3d 20 3c 76 61 6c 75 65 3e 0a 2a 2a  ey> = <value>.**
6390: 0a 2a 2a 20 54 68 65 72 65 20 6d 61 79 20 6e 6f  .** There may no
63a0: 74 20 62 65 20 77 68 69 74 65 73 70 61 63 65 20  t be whitespace 
63b0: 73 75 72 72 6f 75 6e 64 69 6e 67 20 74 68 65 20  surrounding the 
63c0: 22 3d 22 20 63 68 61 72 61 63 74 65 72 2e 20 54  "=" character. T
63d0: 68 65 20 3c 76 61 6c 75 65 3e 20 0a 2a 2a 20 74  he <value> .** t
63e0: 65 72 6d 20 6d 61 79 20 62 65 20 71 75 6f 74 65  erm may be quote
63f0: 64 2c 20 62 75 74 20 74 68 65 20 3c 6b 65 79 3e  d, but the <key>
6400: 20 6d 61 79 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61   may not..*/.sta
6410: 74 69 63 20 69 6e 74 20 66 74 73 33 49 73 53 70  tic int fts3IsSp
6420: 65 63 69 61 6c 43 6f 6c 75 6d 6e 28 0a 20 20 63  ecialColumn(.  c
6430: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 0a 20  onst char *z, . 
6440: 20 69 6e 74 20 2a 70 6e 4b 65 79 2c 0a 20 20 63   int *pnKey,.  c
6450: 68 61 72 20 2a 2a 70 7a 56 61 6c 75 65 0a 29 7b  har **pzValue.){
6460: 0a 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b  .  char *zValue;
6470: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6480: 43 73 72 20 3d 20 7a 3b 0a 0a 20 20 77 68 69 6c  Csr = z;..  whil
6490: 65 28 20 2a 7a 43 73 72 21 3d 27 3d 27 20 29 7b  e( *zCsr!='=' ){
64a0: 0a 20 20 20 20 69 66 28 20 2a 7a 43 73 72 3d 3d  .    if( *zCsr==
64b0: 27 5c 30 27 20 29 20 72 65 74 75 72 6e 20 30 3b  '\0' ) return 0;
64c0: 0a 20 20 20 20 7a 43 73 72 2b 2b 3b 0a 20 20 7d  .    zCsr++;.  }
64d0: 0a 0a 20 20 2a 70 6e 4b 65 79 20 3d 20 28 69 6e  ..  *pnKey = (in
64e0: 74 29 28 7a 43 73 72 2d 7a 29 3b 0a 20 20 7a 56  t)(zCsr-z);.  zV
64f0: 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  alue = sqlite3_m
6500: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 26 7a 43  printf("%s", &zC
6510: 73 72 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 56  sr[1]);.  if( zV
6520: 61 6c 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  alue ){.    sqli
6530: 74 65 33 46 74 73 33 44 65 71 75 6f 74 65 28 7a  te3Fts3Dequote(z
6540: 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 20 20 2a 70  Value);.  }.  *p
6550: 7a 56 61 6c 75 65 20 3d 20 7a 56 61 6c 75 65 3b  zValue = zValue;
6560: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
6570: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65  /*.** Append the
6580: 20 6f 75 74 70 75 74 20 6f 66 20 61 20 70 72 69   output of a pri
6590: 6e 74 66 28 29 20 73 74 79 6c 65 20 66 6f 72 6d  ntf() style form
65a0: 61 74 74 69 6e 67 20 74 6f 20 61 6e 20 65 78 69  atting to an exi
65b0: 73 74 69 6e 67 20 73 74 72 69 6e 67 2e 0a 2a 2f  sting string..*/
65c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
65d0: 33 41 70 70 65 6e 64 66 28 0a 20 20 69 6e 74 20  3Appendf(.  int 
65e0: 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6600: 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
6610: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
6620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6630: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
6640: 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 72  : Pointer to str
6650: 69 6e 67 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ing buffer */.  
6660: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
6670: 6d 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mat,            
6680: 2f 2a 20 50 72 69 6e 74 66 20 66 6f 72 6d 61 74  /* Printf format
6690: 20 73 74 72 69 6e 67 20 74 6f 20 61 70 70 65 6e   string to appen
66a0: 64 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20  d */.  ...      
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66c0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
66d0: 6e 74 73 20 66 6f 72 20 70 72 69 6e 74 66 20 66  nts for printf f
66e0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a  ormat string */.
66f0: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
6700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6710: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20  va_list ap;.    
6720: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f  char *z;.    va_
6730: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6740: 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  t);.    z = sqli
6750: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
6760: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
6770: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 69  a_end(ap);.    i
6780: 66 28 20 7a 20 26 26 20 2a 70 7a 20 29 7b 0a 20  f( z && *pz ){. 
6790: 20 20 20 20 20 63 68 61 72 20 2a 7a 32 20 3d 20       char *z2 = 
67a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
67b0: 22 25 73 25 73 22 2c 20 2a 70 7a 2c 20 7a 29 3b  "%s%s", *pz, z);
67c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
67d0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 7a 20  ree(z);.      z 
67e0: 3d 20 7a 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = z2;.    }.    
67f0: 69 66 28 20 7a 3d 3d 30 20 29 20 2a 70 52 63 20  if( z==0 ) *pRc 
6800: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6810: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6820: 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d  (*pz);.    *pz =
6830: 20 7a 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   z;.  }.}../*.**
6840: 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
6850: 66 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 7a  f input string z
6860: 49 6e 70 75 74 20 65 6e 63 6c 6f 73 65 64 20 69  Input enclosed i
6870: 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20  n double-quotes 
6880: 28 22 29 20 61 6e 64 0a 2a 2a 20 77 69 74 68 20  (") and.** with 
6890: 61 6c 6c 20 64 6f 75 62 6c 65 20 71 75 6f 74 65  all double quote
68a0: 20 63 68 61 72 61 63 74 65 72 73 20 65 73 63 61   characters esca
68b0: 70 65 64 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ped. For example
68c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 66 74 73 33  :.**.**     fts3
68d0: 51 75 6f 74 65 49 64 28 22 75 6e 20 5c 22 7a 69  QuoteId("un \"zi
68e0: 70 5c 22 22 29 20 20 20 2d 3e 20 20 20 20 22 75  p\"")   ->    "u
68f0: 6e 20 5c 22 5c 22 7a 69 70 5c 22 5c 22 22 0a 2a  n \"\"zip\"\"".*
6900: 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
6910: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 73   returned points
6920: 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   to memory obtai
6930: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
6940: 5f 6d 61 6c 6c 6f 63 28 29 2e 20 49 74 0a 2a 2a  _malloc(). It.**
6950: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
6960: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
6970: 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  o call sqlite3_f
6980: 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ree() to release
6990: 20 74 68 69 73 0a 2a 2a 20 6d 65 6d 6f 72 79 2e   this.** memory.
69a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
69b0: 2a 66 74 73 33 51 75 6f 74 65 49 64 28 63 68 61  *fts3QuoteId(cha
69c0: 72 20 63 6f 6e 73 74 20 2a 7a 49 6e 70 75 74 29  r const *zInput)
69d0: 7b 0a 20 20 69 6e 74 20 6e 52 65 74 3b 0a 20 20  {.  int nRet;.  
69e0: 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 6e 52  char *zRet;.  nR
69f0: 65 74 20 3d 20 32 20 2b 20 28 69 6e 74 29 73 74  et = 2 + (int)st
6a00: 72 6c 65 6e 28 7a 49 6e 70 75 74 29 2a 32 20 2b  rlen(zInput)*2 +
6a10: 20 31 3b 0a 20 20 7a 52 65 74 20 3d 20 73 71 6c   1;.  zRet = sql
6a20: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 52 65 74  ite3_malloc(nRet
6a30: 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
6a40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6a50: 63 68 61 72 20 2a 7a 20 3d 20 7a 52 65 74 3b 0a  char *z = zRet;.
6a60: 20 20 20 20 2a 28 7a 2b 2b 29 20 3d 20 27 22 27      *(z++) = '"'
6a70: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
6a80: 49 6e 70 75 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  Input[i]; i++){.
6a90: 20 20 20 20 20 20 69 66 28 20 7a 49 6e 70 75 74        if( zInput
6aa0: 5b 69 5d 3d 3d 27 22 27 20 29 20 2a 28 7a 2b 2b  [i]=='"' ) *(z++
6ab0: 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 2a  ) = '"';.      *
6ac0: 28 7a 2b 2b 29 20 3d 20 7a 49 6e 70 75 74 5b 69  (z++) = zInput[i
6ad0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 28 7a  ];.    }.    *(z
6ae0: 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 2a  ++) = '"';.    *
6af0: 28 7a 2b 2b 29 20 3d 20 27 5c 30 27 3b 0a 20 20  (z++) = '\0';.  
6b00: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  }.  return zRet;
6b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6b20: 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61   a list of comma
6b30: 20 73 65 70 61 72 61 74 65 64 20 53 51 4c 20 65   separated SQL e
6b40: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 61  xpressions and a
6b50: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
6b60: 74 20 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75  t .** could be u
6b70: 73 65 64 20 69 6e 20 61 20 53 45 4c 45 43 54 20  sed in a SELECT 
6b80: 73 74 61 74 65 6d 65 6e 74 20 73 75 63 68 20 61  statement such a
6b90: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
6ba0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
6bb0: 54 20 3c 6c 69 73 74 20 6f 66 20 65 78 70 72 65  T <list of expre
6bc0: 73 73 69 6f 6e 73 3e 20 46 52 4f 4d 20 25 5f 63  ssions> FROM %_c
6bd0: 6f 6e 74 65 6e 74 20 41 53 20 78 20 2e 2e 2e 0a  ontent AS x ....
6be0: 2a 2a 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  **.** to return 
6bf0: 74 68 65 20 64 6f 63 69 64 2c 20 66 6f 6c 6c 6f  the docid, follo
6c00: 77 65 64 20 62 79 20 65 61 63 68 20 63 6f 6c 75  wed by each colu
6c10: 6d 6e 20 6f 66 20 74 65 78 74 20 64 61 74 61 20  mn of text data 
6c20: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 72 6f 6d  in order.** from
6c30: 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 2e 20   left to write. 
6c40: 49 66 20 70 61 72 61 6d 65 74 65 72 20 7a 46 75  If parameter zFu
6c50: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
6c60: 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 0a  then instead of.
6c70: 2a 2a 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65  ** being returne
6c80: 64 20 64 69 72 65 63 74 6c 79 20 65 61 63 68 20  d directly each 
6c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 65 78 74 20 64  column of text d
6ca0: 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
6cb0: 20 61 6e 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74   an SQL.** funct
6cc0: 69 6f 6e 20 6e 61 6d 65 64 20 7a 46 75 6e 63 20  ion named zFunc 
6cd0: 66 69 72 73 74 2e 20 46 6f 72 20 65 78 61 6d 70  first. For examp
6ce0: 6c 65 2c 20 69 66 20 7a 46 75 6e 63 20 69 73 20  le, if zFunc is 
6cf0: 22 75 6e 7a 69 70 22 20 61 6e 64 20 74 68 65 0a  "unzip" and the.
6d00: 2a 2a 20 74 61 62 6c 65 20 68 61 73 20 74 68 65  ** table has the
6d10: 20 74 68 72 65 65 20 75 73 65 72 2d 64 65 66 69   three user-defi
6d20: 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 22 61 22 2c  ned columns "a",
6d30: 20 22 62 22 2c 20 61 6e 64 20 22 63 22 2c 20 74   "b", and "c", t
6d40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
6d50: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
6d60: 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 64  ed:.**.**     "d
6d70: 6f 63 69 64 2c 20 75 6e 7a 69 70 28 78 2e 27 61  ocid, unzip(x.'a
6d80: 27 29 2c 20 75 6e 7a 69 70 28 78 2e 27 62 27 29  '), unzip(x.'b')
6d90: 2c 20 75 6e 7a 69 70 28 78 2e 27 63 27 29 20 46  , unzip(x.'c') F
6da0: 52 4f 4d 20 25 5f 63 6f 6e 74 65 6e 74 20 41 53  ROM %_content AS
6db0: 20 78 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f   x".**.** The po
6dc0: 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 70  inter returned p
6dd0: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
6de0: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 73  r allocated by s
6df0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
6e00: 20 49 74 0a 2a 2a 20 69 73 20 74 68 65 20 72 65   It.** is the re
6e10: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
6e20: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
6e30: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 69 74  entually free it
6e40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
6e50: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
6e60: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
6e70: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
6e80: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 61 6e  t is a no-op (an
6e90: 64 0a 2a 2a 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  d.** a NULL poin
6ea0: 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 29  ter is returned)
6eb0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
6ec0: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
6ed0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 62  encountered.** b
6ee0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
6ef0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
6f00: 64 20 61 6e 64 20 2a 70 52 63 20 69 73 20 73 65  d and *pRc is se
6f10: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
6f20: 4d 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65 72 72 6f  M. If.** no erro
6f30: 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69  r occurs, *pRc i
6f40: 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
6f50: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  d..*/.static cha
6f60: 72 20 2a 66 74 73 33 52 65 61 64 45 78 70 72 4c  r *fts3ReadExprL
6f70: 69 73 74 28 46 74 73 33 54 61 62 6c 65 20 2a 70  ist(Fts3Table *p
6f80: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6f90: 75 6e 63 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a  unc, int *pRc){.
6fa0: 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30    char *zRet = 0
6fb0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 20  ;.  char *zFree 
6fc0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  = 0;.  char *zFu
6fd0: 6e 63 74 69 6f 6e 3b 0a 20 20 69 6e 74 20 69 3b  nction;.  int i;
6fe0: 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74  ..  if( p->zCont
6ff0: 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
7000: 20 69 66 28 20 21 7a 46 75 6e 63 20 29 7b 0a 20   if( !zFunc ){. 
7010: 20 20 20 20 20 7a 46 75 6e 63 74 69 6f 6e 20 3d       zFunction =
7020: 20 22 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   "";.    }else{.
7030: 20 20 20 20 20 20 7a 46 72 65 65 20 3d 20 7a 46        zFree = zF
7040: 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73 33 51 75  unction = fts3Qu
7050: 6f 74 65 49 64 28 7a 46 75 6e 63 29 3b 0a 20 20  oteId(zFunc);.  
7060: 20 20 7d 0a 20 20 20 20 66 74 73 33 41 70 70 65    }.    fts3Appe
7070: 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20  ndf(pRc, &zRet, 
7080: 22 64 6f 63 69 64 22 29 3b 0a 20 20 20 20 66 6f  "docid");.    fo
7090: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  r(i=0; i<p->nCol
70a0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
70b0: 20 66 74 73 33 41 70 70 65 6e 64 66 28 70 52 63   fts3Appendf(pRc
70c0: 2c 20 26 7a 52 65 74 2c 20 22 2c 25 73 28 78 2e  , &zRet, ",%s(x.
70d0: 27 63 25 64 25 71 27 29 22 2c 20 7a 46 75 6e 63  'c%d%q')", zFunc
70e0: 74 69 6f 6e 2c 20 69 2c 20 70 2d 3e 61 7a 43 6f  tion, i, p->azCo
70f0: 6c 75 6d 6e 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  lumn[i]);.    }.
7100: 20 20 20 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67      if( p->zLang
7110: 75 61 67 65 69 64 20 29 7b 0a 20 20 20 20 20 20  uageid ){.      
7120: 66 74 73 33 41 70 70 65 6e 64 66 28 70 52 63 2c  fts3Appendf(pRc,
7130: 20 26 7a 52 65 74 2c 20 22 2c 20 78 2e 25 51 22   &zRet, ", x.%Q"
7140: 2c 20 22 6c 61 6e 67 69 64 22 29 3b 0a 20 20 20  , "langid");.   
7150: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
7160: 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 7d 65  ree(zFree);.  }e
7170: 6c 73 65 7b 0a 20 20 20 20 66 74 73 33 41 70 70  lse{.    fts3App
7180: 65 6e 64 66 28 70 52 63 2c 20 26 7a 52 65 74 2c  endf(pRc, &zRet,
7190: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 66   "rowid");.    f
71a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
71b0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
71c0: 20 20 66 74 73 33 41 70 70 65 6e 64 66 28 70 52    fts3Appendf(pR
71d0: 63 2c 20 26 7a 52 65 74 2c 20 22 2c 20 78 2e 27  c, &zRet, ", x.'
71e0: 25 71 27 22 2c 20 70 2d 3e 61 7a 43 6f 6c 75 6d  %q'", p->azColum
71f0: 6e 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  n[i]);.    }.   
7200: 20 69 66 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67   if( p->zLanguag
7210: 65 69 64 20 29 7b 0a 20 20 20 20 20 20 66 74 73  eid ){.      fts
7220: 33 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a  3Appendf(pRc, &z
7230: 52 65 74 2c 20 22 2c 20 78 2e 25 51 22 2c 20 70  Ret, ", x.%Q", p
7240: 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a  ->zLanguageid);.
7250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 33      }.  }.  fts3
7260: 41 70 70 65 6e 64 66 28 70 52 63 2c 20 26 7a 52  Appendf(pRc, &zR
7270: 65 74 2c 20 22 20 46 52 4f 4d 20 27 25 71 27 2e  et, " FROM '%q'.
7280: 27 25 71 25 73 27 20 41 53 20 78 22 2c 20 0a 20  '%q%s' AS x", . 
7290: 20 20 20 20 20 70 2d 3e 7a 44 62 2c 0a 20 20 20       p->zDb,.   
72a0: 20 20 20 28 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54     (p->zContentT
72b0: 62 6c 20 3f 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74  bl ? p->zContent
72c0: 54 62 6c 20 3a 20 70 2d 3e 7a 4e 61 6d 65 29 2c  Tbl : p->zName),
72d0: 0a 20 20 20 20 20 20 28 70 2d 3e 7a 43 6f 6e 74  .      (p->zCont
72e0: 65 6e 74 54 62 6c 20 3f 20 22 22 20 3a 20 22 5f  entTbl ? "" : "_
72f0: 63 6f 6e 74 65 6e 74 22 29 0a 20 20 29 3b 0a 20  content").  );. 
7300: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
7310: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7320: 6c 69 73 74 20 6f 66 20 4e 20 63 6f 6d 6d 61 20  list of N comma 
7330: 73 65 70 61 72 61 74 65 64 20 71 75 65 73 74 69  separated questi
7340: 6f 6e 20 6d 61 72 6b 73 2c 20 77 68 65 72 65 20  on marks, where 
7350: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  N is the number.
7360: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  ** of columns in
7370: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74   the %_content t
7380: 61 62 6c 65 20 28 6f 6e 65 20 66 6f 72 20 74 68  able (one for th
7390: 65 20 64 6f 63 69 64 20 70 6c 75 73 20 6f 6e 65  e docid plus one
73a0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 73 65   for each.** use
73b0: 72 2d 64 65 66 69 6e 65 64 20 74 65 78 74 20 63  r-defined text c
73c0: 6f 6c 75 6d 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  olumn)..**.** If
73d0: 20 61 72 67 75 6d 65 6e 74 20 7a 46 75 6e 63 20   argument zFunc 
73e0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
73f0: 6e 20 61 6c 6c 20 62 75 74 20 74 68 65 20 66 69  n all but the fi
7400: 72 73 74 20 71 75 65 73 74 69 6f 6e 20 6d 61 72  rst question mar
7410: 6b 0a 2a 2a 20 69 73 20 70 72 65 63 65 64 65 64  k.** is preceded
7420: 20 62 79 20 7a 46 75 6e 63 20 61 6e 64 20 61 6e   by zFunc and an
7430: 20 6f 70 65 6e 20 62 72 61 63 6b 65 74 2c 20 61   open bracket, a
7440: 6e 64 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  nd followed by a
7450: 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 72 61 63 6b   closed.** brack
7460: 65 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  et. For example,
7470: 20 69 66 20 7a 46 75 6e 63 20 69 73 20 22 7a 69   if zFunc is "zi
7480: 70 22 20 61 6e 64 20 74 68 65 20 46 54 53 33 20  p" and the FTS3 
7490: 74 61 62 6c 65 20 68 61 73 20 74 68 72 65 65 20  table has three 
74a0: 0a 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64  .** user-defined
74b0: 20 74 65 78 74 20 63 6f 6c 75 6d 6e 73 2c 20 74   text columns, t
74c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
74d0: 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 3a  ing is returned:
74e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 22 3f 2c 20 7a  .**.**     "?, z
74f0: 69 70 28 3f 29 2c 20 7a 69 70 28 3f 29 2c 20 7a  ip(?), zip(?), z
7500: 69 70 28 3f 29 22 0a 2a 2a 0a 2a 2a 20 54 68 65  ip(?)".**.** The
7510: 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
7520: 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  d points to a bu
7530: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
7540: 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  y sqlite3_malloc
7550: 28 29 2e 20 49 74 0a 2a 2a 20 69 73 20 74 68 65  (). It.** is the
7560: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
7570: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
7580: 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
7590: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70   it..**.** If *p
75a0: 52 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  Rc is not SQLITE
75b0: 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
75c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
75d0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  , it is a no-op 
75e0: 28 61 6e 64 0a 2a 2a 20 61 20 4e 55 4c 4c 20 70  (and.** a NULL p
75f0: 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e  ointer is return
7600: 65 64 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ed). Otherwise, 
7610: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
7620: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 2a  is encountered.*
7630: 2a 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  * by this functi
7640: 6f 6e 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  on, NULL is retu
7650: 72 6e 65 64 20 61 6e 64 20 2a 70 52 63 20 69 73  rned and *pRc is
7660: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
7670: 4f 4d 45 4d 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  OMEM. If.** no e
7680: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52  rror occurs, *pR
7690: 63 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69  c is left unmodi
76a0: 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
76b0: 63 68 61 72 20 2a 66 74 73 33 57 72 69 74 65 45  char *fts3WriteE
76c0: 78 70 72 4c 69 73 74 28 46 74 73 33 54 61 62 6c  xprList(Fts3Tabl
76d0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
76e0: 20 2a 7a 46 75 6e 63 2c 20 69 6e 74 20 2a 70 52   *zFunc, int *pR
76f0: 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  c){.  char *zRet
7700: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
7710: 72 65 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ree = 0;.  char 
7720: 2a 7a 46 75 6e 63 74 69 6f 6e 3b 0a 20 20 69 6e  *zFunction;.  in
7730: 74 20 69 3b 0a 0a 20 20 69 66 28 20 21 7a 46 75  t i;..  if( !zFu
7740: 6e 63 20 29 7b 0a 20 20 20 20 7a 46 75 6e 63 74  nc ){.    zFunct
7750: 69 6f 6e 20 3d 20 22 22 3b 0a 20 20 7d 65 6c 73  ion = "";.  }els
7760: 65 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d 20 7a  e{.    zFree = z
7770: 46 75 6e 63 74 69 6f 6e 20 3d 20 66 74 73 33 51  Function = fts3Q
7780: 75 6f 74 65 49 64 28 7a 46 75 6e 63 29 3b 0a 20  uoteId(zFunc);. 
7790: 20 7d 0a 20 20 66 74 73 33 41 70 70 65 6e 64 66   }.  fts3Appendf
77a0: 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 3f 22  (pRc, &zRet, "?"
77b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
77c0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  p->nColumn; i++)
77d0: 7b 0a 20 20 20 20 66 74 73 33 41 70 70 65 6e 64  {.    fts3Append
77e0: 66 28 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 2c  f(pRc, &zRet, ",
77f0: 25 73 28 3f 29 22 2c 20 7a 46 75 6e 63 74 69 6f  %s(?)", zFunctio
7800: 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  n);.  }.  if( p-
7810: 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b 0a  >zLanguageid ){.
7820: 20 20 20 20 66 74 73 33 41 70 70 65 6e 64 66 28      fts3Appendf(
7830: 70 52 63 2c 20 26 7a 52 65 74 2c 20 22 2c 20 3f  pRc, &zRet, ", ?
7840: 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
7850: 33 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20  3_free(zFree);. 
7860: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
7870: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7880: 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
7890: 74 68 65 20 73 74 72 69 6e 67 20 61 74 20 28 2a  the string at (*
78a0: 70 70 29 20 61 73 20 61 20 6e 6f 6e 2d 6e 65 67  pp) as a non-neg
78b0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a  ative integer.**
78c0: 20 76 61 6c 75 65 2e 20 49 74 20 72 65 61 64 73   value. It reads
78d0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 61 6e 64   the integer and
78e0: 20 73 65 74 73 20 2a 70 6e 4f 75 74 20 74 6f 20   sets *pnOut to 
78f0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 2c 20  the value read, 
7900: 74 68 65 6e 20 0a 2a 2a 20 73 65 74 73 20 2a 70  then .** sets *p
7910: 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
7920: 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
7930: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
7940: 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
7950: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
7960: 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 64  ue..**.** Only d
7970: 65 63 69 6d 61 6c 20 64 69 67 69 74 73 20 28 27  ecimal digits ('
7980: 30 27 2e 2e 27 39 27 29 20 6d 61 79 20 62 65 20  0'..'9') may be 
7990: 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 74 65 67  part of an integ
79a0: 65 72 20 76 61 6c 75 65 2e 20 0a 2a 2a 0a 2a 2a  er value. .**.**
79b0: 20 49 66 20 2a 70 70 20 64 6f 65 73 20 6e 6f 74   If *pp does not
79c0: 20 62 65 69 6e 67 20 77 69 74 68 20 61 20 64 65   being with a de
79d0: 63 69 6d 61 6c 20 64 69 67 69 74 20 53 51 4c 49  cimal digit SQLI
79e0: 54 45 5f 45 52 52 4f 52 20 69 73 20 72 65 74 75  TE_ERROR is retu
79f0: 72 6e 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rned and.** the 
7a00: 6f 75 74 70 75 74 20 76 61 6c 75 65 20 75 6e 64  output value und
7a10: 65 66 69 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  efined. Otherwis
7a20: 65 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  e SQLITE_OK is r
7a30: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
7a40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
7a50: 75 73 65 64 20 77 68 65 6e 20 70 61 72 73 69 6e  used when parsin
7a60: 67 20 74 68 65 20 22 70 72 65 66 69 78 3d 22 20  g the "prefix=" 
7a70: 46 54 53 34 20 70 61 72 61 6d 65 74 65 72 2e 0a  FTS4 parameter..
7a80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
7a90: 73 33 47 6f 62 62 6c 65 49 6e 74 28 63 6f 6e 73  s3GobbleInt(cons
7aa0: 74 20 63 68 61 72 20 2a 2a 70 70 2c 20 69 6e 74  t char **pp, int
7ab0: 20 2a 70 6e 4f 75 74 29 7b 0a 20 20 63 6f 6e 73   *pnOut){.  cons
7ac0: 74 20 69 6e 74 20 4d 41 58 5f 4e 50 52 45 46 49  t int MAX_NPREFI
7ad0: 58 20 3d 20 31 30 30 30 30 30 30 30 3b 0a 20 20  X = 10000000;.  
7ae0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 3b 20 20  const char *p;  
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 2f 2a 20 49 74 65 72 61 74 6f 72 20 70 6f 69 6e  /* Iterator poin
7b10: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ter */.  int nIn
7b20: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
7b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
7b40: 75 74 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 66  ut value */..  f
7b50: 6f 72 28 70 3d 2a 70 70 3b 20 70 5b 30 5d 3e 3d  or(p=*pp; p[0]>=
7b60: 27 30 27 20 26 26 20 70 5b 30 5d 3c 3d 27 39 27  '0' && p[0]<='9'
7b70: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 6e 49 6e 74  ; p++){.    nInt
7b80: 20 3d 20 6e 49 6e 74 20 2a 20 31 30 20 2b 20 28   = nInt * 10 + (
7b90: 70 5b 30 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20  p[0] - '0');.   
7ba0: 20 69 66 28 20 6e 49 6e 74 3e 4d 41 58 5f 4e 50   if( nInt>MAX_NP
7bb0: 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 6e  REFIX ){.      n
7bc0: 49 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  Int = 0;.      b
7bd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7be0: 20 20 69 66 28 20 70 3d 3d 2a 70 70 20 29 20 72    if( p==*pp ) r
7bf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
7c00: 4f 52 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 6e  OR;.  *pnOut = n
7c10: 49 6e 74 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a  Int;.  *pp = p;.
7c20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
7c40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
7c50: 6c 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  lled to allocate
7c60: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 46 74 73   an array of Fts
7c70: 33 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65  3Index structure
7c80: 73 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 69 6e  s.** representin
7c90: 67 20 74 68 65 20 69 6e 64 65 78 65 73 20 6d 61  g the indexes ma
7ca0: 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  intained by the 
7cb0: 63 75 72 72 65 6e 74 20 46 54 53 20 74 61 62 6c  current FTS tabl
7cc0: 65 2e 20 46 54 53 20 74 61 62 6c 65 73 0a 2a 2a  e. FTS tables.**
7cd0: 20 61 6c 77 61 79 73 20 6d 61 69 6e 74 61 69 6e   always maintain
7ce0: 20 74 68 65 20 6d 61 69 6e 20 22 74 65 72 6d 73   the main "terms
7cf0: 22 20 69 6e 64 65 78 2c 20 62 75 74 20 6d 61 79  " index, but may
7d00: 20 61 6c 73 6f 20 6d 61 69 6e 74 61 69 6e 20 6f   also maintain o
7d10: 6e 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 22 70  ne or.** more "p
7d20: 72 65 66 69 78 22 20 69 6e 64 65 78 65 73 2c 20  refix" indexes, 
7d30: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
7d40: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 22 70   value of the "p
7d50: 72 65 66 69 78 3d 22 20 70 61 72 61 6d 65 74 65  refix=" paramete
7d60: 72 0a 2a 2a 20 28 69 66 20 61 6e 79 29 20 73 70  r.** (if any) sp
7d70: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
7d80: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
7d90: 52 54 55 41 4c 20 54 41 42 4c 45 20 73 74 61 74  RTUAL TABLE stat
7da0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  ement..**.** Arg
7db0: 75 6d 65 6e 74 20 7a 50 61 72 61 6d 20 69 73 20  ument zParam is 
7dc0: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
7dd0: 20 6f 66 20 74 68 65 20 22 70 72 65 66 69 78 3d   of the "prefix=
7de0: 22 20 6f 70 74 69 6f 6e 20 69 66 20 6f 6e 65 20  " option if one 
7df0: 77 61 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  was.** specified
7e00: 2c 20 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77  , or NULL otherw
7e10: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ise..**.** If no
7e20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
7e30: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
7e40: 72 6e 65 64 20 61 6e 64 20 2a 61 70 49 6e 64 65  rned and *apInde
7e50: 78 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  x set to point t
7e60: 6f 0a 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74  o.** the allocat
7e70: 65 64 20 61 72 72 61 79 2e 20 2a 70 6e 49 6e 64  ed array. *pnInd
7e80: 65 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ex is set to the
7e90: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
7ea0: 6e 74 73 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  nts in the.** ar
7eb0: 72 61 79 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ray. If an error
7ec0: 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
7ed0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7ee0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
7ef0: 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
7f00: 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
7f10: 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
7f20: 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74 68  turned, it is th
7f30: 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
7f40: 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
7f50: 72 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  r to call sqlite
7f60: 33 5f 66 72 65 65 28 29 20 6f 6e 20 74 68 65 20  3_free() on the 
7f70: 6f 75 74 70 75 74 20 61 72 72 61 79 20 74 6f 20  output array to 
7f80: 66 72 65 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  free it..*/.stat
7f90: 69 63 20 69 6e 74 20 66 74 73 33 50 72 65 66 69  ic int fts3Prefi
7fa0: 78 50 61 72 61 6d 65 74 65 72 28 0a 20 20 63 6f  xParameter(.  co
7fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
7fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7fd0: 20 41 42 43 20 69 6e 20 70 72 65 66 69 78 3d 41   ABC in prefix=A
7fe0: 42 43 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  BC parameter to 
7ff0: 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  parse */.  int *
8000: 70 6e 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  pnIndex,        
8010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
8020: 54 3a 20 73 69 7a 65 20 6f 66 20 2a 61 70 49 6e  T: size of *apIn
8030: 64 65 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  dex[] array */. 
8040: 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65   struct Fts3Inde
8050: 78 20 2a 2a 61 70 49 6e 64 65 78 20 20 20 20 20  x **apIndex     
8060: 20 2f 2a 20 4f 55 54 3a 20 41 72 72 61 79 20 6f   /* OUT: Array o
8070: 66 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74 68  f indexes for th
8080: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
8090: 20 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65   struct Fts3Inde
80a0: 78 20 2a 61 49 6e 64 65 78 3b 20 20 20 20 20 20  x *aIndex;      
80b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 61 72   /* Allocated ar
80c0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ray */.  int nIn
80d0: 64 65 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  dex = 1;        
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
80f0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
8100: 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 69 66 28   array */..  if(
8110: 20 7a 50 61 72 61 6d 20 26 26 20 7a 50 61 72 61   zParam && zPara
8120: 6d 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  m[0] ){.    cons
8130: 74 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 6e  t char *p;.    n
8140: 49 6e 64 65 78 2b 2b 3b 0a 20 20 20 20 66 6f 72  Index++;.    for
8150: 28 70 3d 7a 50 61 72 61 6d 3b 20 2a 70 3b 20 70  (p=zParam; *p; p
8160: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a  ++){.      if( *
8170: 70 3d 3d 27 2c 27 20 29 20 6e 49 6e 64 65 78 2b  p==',' ) nIndex+
8180: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
8190: 61 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  aIndex = sqlite3
81a0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73  _malloc(sizeof(s
81b0: 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78 29  truct Fts3Index)
81c0: 20 2a 20 6e 49 6e 64 65 78 29 3b 0a 20 20 2a 61   * nIndex);.  *a
81d0: 70 49 6e 64 65 78 20 3d 20 61 49 6e 64 65 78 3b  pIndex = aIndex;
81e0: 0a 20 20 69 66 28 20 21 61 49 6e 64 65 78 20 29  .  if( !aIndex )
81f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8200: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
8210: 20 20 6d 65 6d 73 65 74 28 61 49 6e 64 65 78 2c    memset(aIndex,
8220: 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63   0, sizeof(struc
8230: 74 20 46 74 73 33 49 6e 64 65 78 29 20 2a 20 6e  t Fts3Index) * n
8240: 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 7a 50  Index);.  if( zP
8250: 61 72 61 6d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  aram ){.    cons
8260: 74 20 63 68 61 72 20 2a 70 20 3d 20 7a 50 61 72  t char *p = zPar
8270: 61 6d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  am;.    int i;. 
8280: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 49     for(i=1; i<nI
8290: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
82a0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 20 3d 20    int nPrefix = 
82b0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  0;.      if( fts
82c0: 33 47 6f 62 62 6c 65 49 6e 74 28 26 70 2c 20 26  3GobbleInt(&p, &
82d0: 6e 50 72 65 66 69 78 29 20 29 20 72 65 74 75 72  nPrefix) ) retur
82e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
82f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 50        assert( nP
8300: 72 65 66 69 78 3e 3d 30 20 29 3b 0a 20 20 20 20  refix>=0 );.    
8310: 20 20 69 66 28 20 6e 50 72 65 66 69 78 3d 3d 30    if( nPrefix==0
8320: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 49 6e 64   ){.        nInd
8330: 65 78 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 2d  ex--;.        i-
8340: 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  -;.      }else{.
8350: 20 20 20 20 20 20 20 20 61 49 6e 64 65 78 5b 69          aIndex[i
8360: 5d 2e 6e 50 72 65 66 69 78 20 3d 20 6e 50 72 65  ].nPrefix = nPre
8370: 66 69 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fix;.      }.   
8380: 20 20 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     p++;.    }.  
8390: 7d 0a 0a 20 20 2a 70 6e 49 6e 64 65 78 20 3d 20  }..  *pnIndex = 
83a0: 6e 49 6e 64 65 78 3b 0a 20 20 72 65 74 75 72 6e  nIndex;.  return
83b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
83c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
83d0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
83e0: 6e 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61  n initializing a
83f0: 6e 20 46 54 53 34 20 74 61 62 6c 65 20 74 68 61  n FTS4 table tha
8400: 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 63 6f  t uses the.** co
8410: 6e 74 65 6e 74 3d 78 78 78 20 6f 70 74 69 6f 6e  ntent=xxx option
8420: 2e 20 49 74 20 64 65 74 65 72 6d 69 6e 65 73 20  . It determines 
8430: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  the number of an
8440: 64 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63  d names of the c
8450: 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
8460: 20 6e 65 77 20 46 54 53 34 20 74 61 62 6c 65 2e   new FTS4 table.
8470: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
8480: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
8490: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
84a0: 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 20 70  n is the value p
84b0: 61 73 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  assed to the.** 
84c0: 63 6f 6e 66 69 67 3d 78 78 78 20 6f 70 74 69 6f  config=xxx optio
84d0: 6e 20 28 69 2e 65 2e 20 22 78 78 78 22 29 2e 20  n (i.e. "xxx"). 
84e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  This function qu
84f0: 65 72 69 65 73 20 74 68 65 20 64 61 74 61 62 61  eries the databa
8500: 73 65 20 66 6f 72 0a 2a 2a 20 61 20 74 61 62 6c  se for.** a tabl
8510: 65 20 6f 66 20 74 68 61 74 20 6e 61 6d 65 2e 20  e of that name. 
8520: 49 66 20 66 6f 75 6e 64 2c 20 74 68 65 20 6f 75  If found, the ou
8530: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 61  tput variables a
8540: 72 65 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20  re populated.** 
8550: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8560: 2a 20 20 20 2a 70 6e 43 6f 6c 3a 20 20 20 53 65  *   *pnCol:   Se
8570: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
8580: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 61 62 6c 65  of columns table
8590: 20 78 78 78 20 68 61 73 2c 0a 2a 2a 0a 2a 2a 20   xxx has,.**.** 
85a0: 20 20 2a 70 6e 53 74 72 3a 20 20 20 53 65 74 20    *pnStr:   Set 
85b0: 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 61 6d 6f  to the total amo
85c0: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 72 65 71  unt of space req
85d0: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 61  uired to store a
85e0: 20 63 6f 70 79 0a 2a 2a 20 20 20 20 20 20 20 20   copy.**        
85f0: 20 20 20 20 20 6f 66 20 65 61 63 68 20 63 6f 6c       of each col
8600: 75 6d 6e 73 20 6e 61 6d 65 2c 20 69 6e 63 6c 75  umns name, inclu
8610: 64 69 6e 67 20 74 68 65 20 6e 75 6c 2d 74 65 72  ding the nul-ter
8620: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  minator..**.**  
8630: 20 2a 70 61 7a 43 6f 6c 3a 20 20 53 65 74 20 74   *pazCol:  Set t
8640: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  o point to an ar
8650: 72 61 79 20 6f 66 20 2a 70 6e 43 6f 6c 20 73 74  ray of *pnCol st
8660: 72 69 6e 67 73 2e 20 45 61 63 68 20 73 74 72 69  rings. Each stri
8670: 6e 67 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  ng is.**        
8680: 20 20 20 20 20 74 68 65 20 6e 61 6d 65 20 6f 66       the name of
8690: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
86a0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62  ng column in tab
86b0: 6c 65 20 78 78 78 2e 20 54 68 65 20 61 72 72 61  le xxx. The arra
86c0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
86d0: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
86e0: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
86f0: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 61  using a single a
8700: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 49 74 0a 2a 2a  llocation. It.**
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
8720: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
8730: 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
8740: 20 74 6f 20 66 72 65 65 20 74 68 69 73 20 61 6c   to free this al
8750: 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  location.**     
8760: 20 20 20 20 20 20 20 20 62 79 20 65 76 65 6e 74          by event
8770: 75 61 6c 6c 79 20 70 61 73 73 69 6e 67 20 74 68  ually passing th
8780: 65 20 2a 70 61 7a 43 6f 6c 20 76 61 6c 75 65 20  e *pazCol value 
8790: 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  to sqlite3_free(
87a0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
87b0: 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20  table cannot be 
87c0: 66 6f 75 6e 64 2c 20 61 6e 20 65 72 72 6f 72 20  found, an error 
87d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
87e0: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
87f0: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ** variables are
8800: 20 75 6e 64 65 66 69 6e 65 64 2e 20 4f 72 2c 20   undefined. Or, 
8810: 69 66 20 61 6e 20 4f 4f 4d 20 69 73 20 65 6e 63  if an OOM is enc
8820: 6f 75 6e 74 65 72 65 64 2c 20 53 51 4c 49 54 45  ountered, SQLITE
8830: 5f 4e 4f 4d 45 4d 20 69 73 0a 2a 2a 20 72 65 74  _NOMEM is.** ret
8840: 75 72 6e 65 64 20 28 61 6e 64 20 74 68 65 20 6f  urned (and the o
8850: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
8860: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 29 2e 0a  are undefined)..
8870: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
8880: 73 33 43 6f 6e 74 65 6e 74 43 6f 6c 75 6d 6e 73  s3ContentColumns
8890: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
88c0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
88d0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
88f0: 61 6d 65 20 6f 66 20 64 62 20 28 69 2e 65 2e 20  ame of db (i.e. 
8900: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
8910: 74 63 2e 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tc.) */.  const 
8920: 63 68 61 72 20 2a 7a 54 62 6c 2c 20 20 20 20 20  char *zTbl,     
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8940: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 74 61 62  e of content tab
8950: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
8960: 61 72 20 2a 2a 2a 70 61 7a 43 6f 6c 2c 20 20 20  ar ***pazCol,   
8970: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8980: 4d 61 6c 6c 6f 63 27 64 20 61 72 72 61 79 20 6f  Malloc'd array o
8990: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  f column names *
89a0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6c 2c 20  /.  int *pnCol, 
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
89d0: 20 6f 66 20 61 72 72 61 79 20 2a 70 61 7a 43 6f   of array *pazCo
89e0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 74  l */.  int *pnSt
89f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8a00: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42         /* OUT: B
8a10: 79 74 65 73 20 6f 66 20 73 74 72 69 6e 67 20 63  ytes of string c
8a20: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72  ontent */.  char
8a30: 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20   **pzErr        
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8a50: 55 54 3a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  UT: error messag
8a60: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
8a70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
8a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
8a90: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
8aa0: 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ac0: 20 22 53 45 4c 45 43 54 20 2a 22 20 73 74 61 74   "SELECT *" stat
8ad0: 65 6d 65 6e 74 20 6f 6e 20 7a 54 62 6c 20 2a 2f  ement on zTbl */
8ae0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d    .  sqlite3_stm
8af0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20  t *pStmt = 0;   
8b00: 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64       /* Compiled
8b10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 7a 53 71 6c   version of zSql
8b20: 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71   */..  zSql = sq
8b30: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
8b40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 51 2e  ELECT * FROM %Q.
8b50: 25 51 22 2c 20 7a 44 62 2c 20 7a 54 62 6c 29 3b  %Q", zDb, zTbl);
8b60: 0a 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a  .  if( !zSql ){.
8b70: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8b80: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
8b90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8ba0: 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
8bb0: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
8bc0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8bd0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8be0: 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 72 72    sqlite3Fts3Err
8bf0: 4d 73 67 28 70 7a 45 72 72 2c 20 22 25 73 22 2c  Msg(pzErr, "%s",
8c00: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
8c10: 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  db));.    }.  }.
8c20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8c30: 53 71 6c 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  Sql);..  if( rc=
8c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8c50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
8c60: 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zCol;           
8c70: 2f 2a 20 4f 75 74 70 75 74 20 61 72 72 61 79 20  /* Output array 
8c80: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 20  */.    int nStr 
8c90: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8ca0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
8cb0: 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  all column names
8cc0: 20 28 69 6e 63 6c 2e 20 30 78 30 30 29 20 2a 2f   (incl. 0x00) */
8cd0: 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8d00: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f  table columns */
8d10: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8d40: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 63 6f  erate through co
8d50: 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lumns */..    /*
8d60: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
8d70: 65 20 72 65 74 75 72 6e 65 64 20 63 6f 6c 75 6d  e returned colum
8d80: 6e 73 2e 20 53 65 74 20 6e 53 74 72 20 74 6f 20  ns. Set nStr to 
8d90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
8da0: 74 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73 70  tes of.    ** sp
8db0: 61 63 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  ace required to 
8dc0: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
8dd0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  each column name
8de0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  , including the.
8df0: 20 20 20 20 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69      ** nul-termi
8e00: 6e 61 74 6f 72 20 62 79 74 65 2e 20 20 2a 2f 0a  nator byte.  */.
8e10: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
8e20: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
8e30: 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28  pStmt);.    for(
8e40: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
8e50: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
8e60: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69  har *zCol = sqli
8e70: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
8e80: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
8e90: 20 6e 53 74 72 20 2b 3d 20 28 69 6e 74 29 73 74   nStr += (int)st
8ea0: 72 6c 65 6e 28 7a 43 6f 6c 29 20 2b 20 31 3b 0a  rlen(zCol) + 1;.
8eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
8ec0: 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
8ed0: 61 74 65 20 74 68 65 20 61 72 72 61 79 20 74 6f  ate the array to
8ee0: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 20 20   return. */.    
8ef0: 61 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  azCol = (const c
8f00: 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 6d  har **)sqlite3_m
8f10: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 63 68 61  alloc(sizeof(cha
8f20: 72 20 2a 29 20 2a 20 6e 43 6f 6c 20 2b 20 6e 53  r *) * nCol + nS
8f30: 74 72 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  tr);.    if( azC
8f40: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ol==0 ){.      r
8f50: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8f60: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8f70: 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
8f80: 61 72 20 2a 29 26 61 7a 43 6f 6c 5b 6e 43 6f 6c  ar *)&azCol[nCol
8f90: 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ];.      for(i=0
8fa0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
8fb0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
8fc0: 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
8fd0: 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
8fe0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
8ff0: 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73    int n = (int)s
9000: 74 72 6c 65 6e 28 7a 43 6f 6c 29 2b 31 3b 0a 20  trlen(zCol)+1;. 
9010: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c         memcpy(p,
9020: 20 7a 43 6f 6c 2c 20 6e 29 3b 0a 20 20 20 20 20   zCol, n);.     
9030: 20 20 20 61 7a 43 6f 6c 5b 69 5d 20 3d 20 70 3b     azCol[i] = p;
9040: 0a 20 20 20 20 20 20 20 20 70 20 2b 3d 20 6e 3b  .        p += n;
9050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9060: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
9070: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 0a 20 20 20  ize(pStmt);..   
9080: 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
9090: 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20 2a 2f  ut variables. */
90a0: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43  .    *pnCol = nC
90b0: 6f 6c 3b 0a 20 20 20 20 2a 70 6e 53 74 72 20 3d  ol;.    *pnStr =
90c0: 20 6e 53 74 72 3b 0a 20 20 20 20 2a 70 61 7a 43   nStr;.    *pazC
90d0: 6f 6c 20 3d 20 61 7a 43 6f 6c 3b 0a 20 20 7d 0a  ol = azCol;.  }.
90e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
9100: 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d 70 6c  tion is the impl
9110: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 6f  ementation of bo
9120: 74 68 20 74 68 65 20 78 43 6f 6e 6e 65 63 74 20  th the xConnect 
9130: 61 6e 64 20 78 43 72 65 61 74 65 0a 2a 2a 20 6d  and xCreate.** m
9140: 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 46 54  ethods of the FT
9150: 53 33 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  S3 virtual table
9160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67 76  ..**.** The argv
9170: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
9180: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
9190: 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d  .**.**   argv[0]
91a0: 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d     -> module nam
91b0: 65 20 20 28 22 66 74 73 33 22 20 6f 72 20 22 66  e  ("fts3" or "f
91c0: 74 73 34 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b  ts4").**   argv[
91d0: 31 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65  1]   -> database
91e0: 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
91f0: 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61  2]   -> table na
9200: 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 2e 2e 2e  me.**   argv[...
9210: 5d 20 2d 3e 20 22 63 6f 6c 75 6d 6e 20 6e 61 6d  ] -> "column nam
9220: 65 22 20 61 6e 64 20 6f 74 68 65 72 20 6d 6f 64  e" and other mod
9230: 75 6c 65 20 61 72 67 75 6d 65 6e 74 20 66 69 65  ule argument fie
9240: 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lds..*/.static i
9250: 6e 74 20 66 74 73 33 49 6e 69 74 56 74 61 62 28  nt fts3InitVtab(
9260: 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 2c  .  int isCreate,
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 78     /* True for x
9290: 43 72 65 61 74 65 2c 20 66 61 6c 73 65 20 66 6f  Create, false fo
92a0: 72 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  r xConnect */.  
92b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 2f 2a 20 54 68 65 20 53 51 4c 69 74 65 20 64 61  /* The SQLite da
92e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
92f0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 75  n */.  void *pAu
9300: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
9310: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
9320: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
9330: 74 6f 6b 65 6e 69 7a 65 72 73 20 2a 2f 0a 20 20  tokenizers */.  
9340: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
9370: 6d 65 6e 74 73 20 69 6e 20 61 72 67 76 20 61 72  ments in argv ar
9380: 72 61 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ray */.  const c
9390: 68 61 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67  har * const *arg
93a0: 76 2c 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65  v,       /* xCre
93b0: 61 74 65 2f 78 43 6f 6e 6e 65 63 74 20 61 72 67  ate/xConnect arg
93c0: 75 6d 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  ument array */. 
93d0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
93e0: 70 70 56 54 61 62 2c 20 20 20 20 20 20 20 20 20  ppVTab,         
93f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
9400: 73 75 6c 74 69 6e 67 20 76 74 61 62 20 73 74 72  sulting vtab str
9410: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
9420: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 2f 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72   /* Write any er
9450: 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72 65  ror message here
9460: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 48 61 73   */.){.  Fts3Has
9470: 68 20 2a 70 48 61 73 68 20 3d 20 28 46 74 73 33  h *pHash = (Fts3
9480: 48 61 73 68 20 2a 29 70 41 75 78 3b 0a 20 20 46  Hash *)pAux;.  F
9490: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  ts3Table *p = 0;
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
94b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6c 6c  * Pointer to all
94c0: 6f 63 61 74 65 64 20 76 74 61 62 20 2a 2f 0a 20  ocated vtab */. 
94d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
94e0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
94f0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9500: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
9530: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
9540: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9560: 2a 20 53 69 7a 65 20 6f 66 20 61 6c 6c 6f 63 61  * Size of alloca
9570: 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 2a 70  tion used for *p
9580: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
95b0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
95c0: 53 74 72 69 6e 67 20 3d 20 30 3b 20 20 20 20 20  String = 0;     
95d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
95e0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
95f0: 68 6f 6c 64 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  hold all column 
9600: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  names */.  int n
9610: 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Col = 0;        
9620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9630: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
9640: 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  in the FTS table
9650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 73 72   */.  char *zCsr
9660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9670: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
9680: 6f 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6c 75 6d  or holding colum
9690: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
96a0: 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96c0: 42 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74  Bytes required t
96d0: 6f 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  o hold database 
96e0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
96f0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
9700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
9710: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  es required to h
9720: 6f 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a  old table name *
9730: 2f 0a 20 20 69 6e 74 20 69 73 46 74 73 34 20 3d  /.  int isFts4 =
9740: 20 28 61 72 67 76 5b 30 5d 5b 33 5d 3d 3d 27 34   (argv[0][3]=='4
9750: 27 29 3b 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  '); /* True for 
9760: 46 54 53 34 2c 20 66 61 6c 73 65 20 66 6f 72 20  FTS4, false for 
9770: 46 54 53 33 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  FTS3 */.  const 
9780: 63 68 61 72 20 2a 2a 61 43 6f 6c 3b 20 20 20 20  char **aCol;    
9790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
97a0: 61 79 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ay of column nam
97b0: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
97c0: 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65  tokenizer *pToke
97d0: 6e 69 7a 65 72 20 3d 20 30 3b 20 20 20 20 20 20  nizer = 0;      
97e0: 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 66    /* Tokenizer f
97f0: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  or this table */
9800: 0a 0a 20 20 69 6e 74 20 6e 49 6e 64 65 78 20 3d  ..  int nIndex =
9810: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9820: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
9830: 49 6e 64 65 78 5b 5d 20 61 72 72 61 79 20 2a 2f  Index[] array */
9840: 0a 20 20 73 74 72 75 63 74 20 46 74 73 33 49 6e  .  struct Fts3In
9850: 64 65 78 20 2a 61 49 6e 64 65 78 20 3d 20 30 3b  dex *aIndex = 0;
9860: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69     /* Array of i
9870: 6e 64 65 78 65 73 20 66 6f 72 20 74 68 69 73 20  ndexes for this 
9880: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  table */..  /* T
9890: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 70 61  he results of pa
98a0: 72 73 69 6e 67 20 73 75 70 70 6f 72 74 65 64 20  rsing supported 
98b0: 46 54 53 34 20 6b 65 79 3d 76 61 6c 75 65 20 6f  FTS4 key=value o
98c0: 70 74 69 6f 6e 73 3a 20 2a 2f 0a 20 20 69 6e 74  ptions: */.  int
98d0: 20 62 4e 6f 44 6f 63 73 69 7a 65 20 3d 20 30 3b   bNoDocsize = 0;
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98f0: 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 25 5f 64  True to omit %_d
9900: 6f 63 73 69 7a 65 20 74 61 62 6c 65 20 2a 2f 0a  ocsize table */.
9910: 20 20 69 6e 74 20 62 44 65 73 63 49 64 78 20 3d    int bDescIdx =
9920: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9930: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 74 6f    /* True to sto
9940: 72 65 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e  re descending in
9950: 64 65 78 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  dexes */.  char 
9960: 2a 7a 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20  *zPrefix = 0;   
9970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9980: 65 66 69 78 20 70 61 72 61 6d 65 74 65 72 20 76  efix parameter v
9990: 61 6c 75 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  alue (or NULL) *
99a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6d 70 72  /.  char *zCompr
99b0: 65 73 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ess = 0;        
99c0: 20 20 20 20 2f 2a 20 63 6f 6d 70 72 65 73 73 3d      /* compress=
99d0: 3f 20 70 61 72 61 6d 65 74 65 72 20 28 6f 72 20  ? parameter (or 
99e0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72 20  NULL) */.  char 
99f0: 2a 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20 30  *zUncompress = 0
9a00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  ;          /* un
9a10: 63 6f 6d 70 72 65 73 73 3d 3f 20 70 61 72 61 6d  compress=? param
9a20: 65 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  eter (or NULL) *
9a30: 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
9a40: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
9a50: 20 20 20 20 2f 2a 20 63 6f 6e 74 65 6e 74 3d 3f      /* content=?
9a60: 20 70 61 72 61 6d 65 74 65 72 20 28 6f 72 20 4e   parameter (or N
9a70: 55 4c 4c 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ULL) */.  char *
9a80: 7a 4c 61 6e 67 75 61 67 65 69 64 20 3d 20 30 3b  zLanguageid = 0;
9a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 61 6e            /* lan
9aa0: 67 75 61 67 65 69 64 3d 3f 20 70 61 72 61 6d 65  guageid=? parame
9ab0: 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ter (or NULL) */
9ac0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 69  .  char **azNoti
9ad0: 6e 64 65 78 65 64 20 3d 20 30 3b 20 20 20 20 20  ndexed = 0;     
9ae0: 20 20 20 2f 2a 20 54 68 65 20 73 65 74 20 6f 66     /* The set of
9af0: 20 6e 6f 74 69 6e 64 65 78 65 64 3d 20 63 6f 6c   notindexed= col
9b00: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  umns */.  int nN
9b10: 6f 74 69 6e 64 65 78 65 64 20 3d 20 30 3b 20 20  otindexed = 0;  
9b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9b30: 65 20 6f 66 20 61 7a 4e 6f 74 69 6e 64 65 78 65  e of azNotindexe
9b40: 64 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20  d[] array */..  
9b50: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 61  assert( strlen(a
9b60: 72 67 76 5b 30 5d 29 3d 3d 34 20 29 3b 0a 20 20  rgv[0])==4 );.  
9b70: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
9b80: 5f 73 74 72 6e 69 63 6d 70 28 61 72 67 76 5b 30  _strnicmp(argv[0
9b90: 5d 2c 20 22 66 74 73 34 22 2c 20 34 29 3d 3d 30  ], "fts4", 4)==0
9ba0: 20 26 26 20 69 73 46 74 73 34 29 0a 20 20 20 20   && isFts4).    
9bb0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 5f 73     || (sqlite3_s
9bc0: 74 72 6e 69 63 6d 70 28 61 72 67 76 5b 30 5d 2c  trnicmp(argv[0],
9bd0: 20 22 66 74 73 33 22 2c 20 34 29 3d 3d 30 20 26   "fts3", 4)==0 &
9be0: 26 20 21 69 73 46 74 73 34 29 0a 20 20 29 3b 0a  & !isFts4).  );.
9bf0: 0a 20 20 6e 44 62 20 3d 20 28 69 6e 74 29 73 74  .  nDb = (int)st
9c00: 72 6c 65 6e 28 61 72 67 76 5b 31 5d 29 20 2b 20  rlen(argv[1]) + 
9c10: 31 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e  1;.  nName = (in
9c20: 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d  t)strlen(argv[2]
9c30: 29 20 2b 20 31 3b 0a 0a 20 20 6e 42 79 74 65 20  ) + 1;..  nByte 
9c40: 3d 20 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20 63  = sizeof(const c
9c50: 68 61 72 20 2a 29 20 2a 20 28 61 72 67 63 2d 32  har *) * (argc-2
9c60: 29 3b 0a 20 20 61 43 6f 6c 20 3d 20 28 63 6f 6e  );.  aCol = (con
9c70: 73 74 20 63 68 61 72 20 2a 2a 29 73 71 6c 69 74  st char **)sqlit
9c80: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
9c90: 3b 0a 20 20 69 66 28 20 61 43 6f 6c 20 29 7b 0a  ;.  if( aCol ){.
9ca0: 20 20 20 20 6d 65 6d 73 65 74 28 28 76 6f 69 64      memset((void
9cb0: 2a 29 61 43 6f 6c 2c 20 30 2c 20 6e 42 79 74 65  *)aCol, 0, nByte
9cc0: 29 3b 0a 20 20 20 20 61 7a 4e 6f 74 69 6e 64 65  );.    azNotinde
9cd0: 78 65 64 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  xed = (char **)s
9ce0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
9cf0: 79 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  yte);.  }.  if( 
9d00: 61 7a 4e 6f 74 69 6e 64 65 78 65 64 20 29 7b 0a  azNotindexed ){.
9d10: 20 20 20 20 6d 65 6d 73 65 74 28 61 7a 4e 6f 74      memset(azNot
9d20: 69 6e 64 65 78 65 64 2c 20 30 2c 20 6e 42 79 74  indexed, 0, nByt
9d30: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 61  e);.  }.  if( !a
9d40: 43 6f 6c 20 7c 7c 20 21 61 7a 4e 6f 74 69 6e 64  Col || !azNotind
9d50: 65 78 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  exed ){.    rc =
9d60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9d70: 20 20 20 67 6f 74 6f 20 66 74 73 33 5f 69 6e 69     goto fts3_ini
9d80: 74 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  t_out;.  }..  /*
9d90: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
9da0: 6c 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e  l of the argumen
9db0: 74 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  ts passed by the
9dc0: 20 75 73 65 72 20 74 6f 20 74 68 65 20 46 54 53   user to the FTS
9dd0: 33 2f 34 0a 20 20 2a 2a 20 6d 6f 64 75 6c 65 20  3/4.  ** module 
9de0: 28 69 2e 65 2e 20 61 6c 6c 20 74 68 65 20 63 6f  (i.e. all the co
9df0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 73  lumn names and s
9e00: 70 65 63 69 61 6c 20 61 72 67 75 6d 65 6e 74 73  pecial arguments
9e10: 29 2e 20 54 68 69 73 20 6c 6f 6f 70 0a 20 20 2a  ). This loop.  *
9e20: 2a 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f  * does the follo
9e30: 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
9e40: 20 20 2b 20 46 69 67 75 72 65 73 20 6f 75 74 20    + Figures out 
9e50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
9e60: 6c 75 6d 6e 73 20 74 68 65 20 46 54 53 58 20 74  lumns the FTSX t
9e70: 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2c 20  able will have, 
9e80: 61 6e 64 0a 20 20 2a 2a 20 20 20 20 20 74 68 65  and.  **     the
9e90: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9ea0: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 6d   of space that m
9eb0: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
9ec0: 20 74 6f 20 73 74 6f 72 65 20 63 6f 70 69 65 73   to store copies
9ed0: 0a 20 20 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  .  **     of the
9ee0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 0a 20   column names.. 
9ef0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 49 66 20   **.  **   + If 
9f00: 74 68 65 72 65 20 69 73 20 61 20 74 6f 6b 65 6e  there is a token
9f10: 69 7a 65 72 20 73 70 65 63 69 66 69 63 61 74 69  izer specificati
9f20: 6f 6e 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  on included in t
9f30: 68 65 20 61 72 67 75 6d 65 6e 74 73 2c 0a 20 20  he arguments,.  
9f40: 2a 2a 20 20 20 20 20 69 6e 69 74 69 61 6c 69 7a  **     initializ
9f50: 65 73 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  es the tokenizer
9f60: 20 70 54 6f 6b 65 6e 69 7a 65 72 2e 0a 20 20 2a   pTokenizer..  *
9f70: 2f 0a 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d  /.  for(i=3; rc=
9f80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
9f90: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
9fa0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 20 3d 20  char const *z = 
9fb0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  argv[i];.    int
9fc0: 20 6e 4b 65 79 3b 0a 20 20 20 20 63 68 61 72 20   nKey;.    char 
9fd0: 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 2f 2a 20 43  *zVal;..    /* C
9fe0: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
9ff0: 61 20 74 6f 6b 65 6e 69 7a 65 72 20 73 70 65 63  a tokenizer spec
a000: 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  ification */.   
a010: 20 69 66 28 20 21 70 54 6f 6b 65 6e 69 7a 65 72   if( !pTokenizer
a020: 20 0a 20 20 20 20 20 26 26 20 73 74 72 6c 65 6e   .     && strlen
a030: 28 7a 29 3e 38 0a 20 20 20 20 20 26 26 20 30 3d  (z)>8.     && 0=
a040: 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d  =sqlite3_strnicm
a050: 70 28 7a 2c 20 22 74 6f 6b 65 6e 69 7a 65 22 2c  p(z, "tokenize",
a060: 20 38 29 20 0a 20 20 20 20 20 26 26 20 30 3d 3d   8) .     && 0==
a070: 73 71 6c 69 74 65 33 46 74 73 33 49 73 49 64 43  sqlite3Fts3IsIdC
a080: 68 61 72 28 7a 5b 38 5d 29 0a 20 20 20 20 29 7b  har(z[8]).    ){
a090: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a0a0: 74 65 33 46 74 73 33 49 6e 69 74 54 6f 6b 65 6e  te3Fts3InitToken
a0b0: 69 7a 65 72 28 70 48 61 73 68 2c 20 26 7a 5b 39  izer(pHash, &z[9
a0c0: 5d 2c 20 26 70 54 6f 6b 65 6e 69 7a 65 72 2c 20  ], &pTokenizer, 
a0d0: 70 7a 45 72 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  pzErr);.    }.. 
a0e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 69     /* Check if i
a0f0: 74 20 69 73 20 61 6e 20 46 54 53 34 20 73 70 65  t is an FTS4 spe
a100: 63 69 61 6c 20 61 72 67 75 6d 65 6e 74 2e 20 2a  cial argument. *
a110: 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69  /.    else if( i
a120: 73 46 74 73 34 20 26 26 20 66 74 73 33 49 73 53  sFts4 && fts3IsS
a130: 70 65 63 69 61 6c 43 6f 6c 75 6d 6e 28 7a 2c 20  pecialColumn(z, 
a140: 26 6e 4b 65 79 2c 20 26 7a 56 61 6c 29 20 29 7b  &nKey, &zVal) ){
a150: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 46 74  .      struct Ft
a160: 73 34 4f 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20  s4Option {.     
a170: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a180: 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Opt;.        int
a190: 20 6e 4f 70 74 3b 0a 20 20 20 20 20 20 7d 20 61   nOpt;.      } a
a1a0: 46 74 73 34 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20  Fts4Opt[] = {.  
a1b0: 20 20 20 20 20 20 7b 20 22 6d 61 74 63 68 69 6e        { "matchin
a1c0: 66 6f 22 2c 20 20 20 39 20 7d 2c 20 20 20 20 20  fo",   9 },     
a1d0: 2f 2a 20 30 20 2d 3e 20 4d 41 54 43 48 49 4e 46  /* 0 -> MATCHINF
a1e0: 4f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 20 22  O */.        { "
a1f0: 70 72 65 66 69 78 22 2c 20 20 20 20 20 20 36 20  prefix",      6 
a200: 7d 2c 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 50  },     /* 1 -> P
a210: 52 45 46 49 58 20 2a 2f 0a 20 20 20 20 20 20 20  REFIX */.       
a220: 20 7b 20 22 63 6f 6d 70 72 65 73 73 22 2c 20 20   { "compress",  
a230: 20 20 38 20 7d 2c 20 20 20 20 20 2f 2a 20 32 20    8 },     /* 2 
a240: 2d 3e 20 43 4f 4d 50 52 45 53 53 20 2a 2f 0a 20  -> COMPRESS */. 
a250: 20 20 20 20 20 20 20 7b 20 22 75 6e 63 6f 6d 70         { "uncomp
a260: 72 65 73 73 22 2c 20 31 30 20 7d 2c 20 20 20 20  ress", 10 },    
a270: 20 2f 2a 20 33 20 2d 3e 20 55 4e 43 4f 4d 50 52   /* 3 -> UNCOMPR
a280: 45 53 53 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  ESS */.        {
a290: 20 22 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20   "order",       
a2a0: 35 20 7d 2c 20 20 20 20 20 2f 2a 20 34 20 2d 3e  5 },     /* 4 ->
a2b0: 20 4f 52 44 45 52 20 2a 2f 0a 20 20 20 20 20 20   ORDER */.      
a2c0: 20 20 7b 20 22 63 6f 6e 74 65 6e 74 22 2c 20 20    { "content",  
a2d0: 20 20 20 37 20 7d 2c 20 20 20 20 20 2f 2a 20 35     7 },     /* 5
a2e0: 20 2d 3e 20 43 4f 4e 54 45 4e 54 20 2a 2f 0a 20   -> CONTENT */. 
a2f0: 20 20 20 20 20 20 20 7b 20 22 6c 61 6e 67 75 61         { "langua
a300: 67 65 69 64 22 2c 20 31 30 20 7d 2c 20 20 20 20  geid", 10 },    
a310: 20 2f 2a 20 36 20 2d 3e 20 4c 41 4e 47 55 41 47   /* 6 -> LANGUAG
a320: 45 49 44 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  EID */.        {
a330: 20 22 6e 6f 74 69 6e 64 65 78 65 64 22 2c 20 31   "notindexed", 1
a340: 30 20 7d 20 20 20 20 20 20 2f 2a 20 37 20 2d 3e  0 }      /* 7 ->
a350: 20 4e 4f 54 49 4e 44 45 58 45 44 20 2a 2f 0a 20   NOTINDEXED */. 
a360: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 69       };..      i
a370: 6e 74 20 69 4f 70 74 3b 0a 20 20 20 20 20 20 69  nt iOpt;.      i
a380: 66 28 20 21 7a 56 61 6c 20 29 7b 0a 20 20 20 20  f( !zVal ){.    
a390: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a3a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
a3b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
a3c0: 69 4f 70 74 3d 30 3b 20 69 4f 70 74 3c 53 69 7a  iOpt=0; iOpt<Siz
a3d0: 65 6f 66 41 72 72 61 79 28 61 46 74 73 34 4f 70  eofArray(aFts4Op
a3e0: 74 29 3b 20 69 4f 70 74 2b 2b 29 7b 0a 20 20 20  t); iOpt++){.   
a3f0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 46 74         struct Ft
a400: 73 34 4f 70 74 69 6f 6e 20 2a 70 4f 70 20 3d 20  s4Option *pOp = 
a410: 26 61 46 74 73 34 4f 70 74 5b 69 4f 70 74 5d 3b  &aFts4Opt[iOpt];
a420: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
a430: 4b 65 79 3d 3d 70 4f 70 2d 3e 6e 4f 70 74 20 26  Key==pOp->nOpt &
a440: 26 20 21 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  & !sqlite3_strni
a450: 63 6d 70 28 7a 2c 20 70 4f 70 2d 3e 7a 4f 70 74  cmp(z, pOp->zOpt
a460: 2c 20 70 4f 70 2d 3e 6e 4f 70 74 29 20 29 7b 0a  , pOp->nOpt) ){.
a470: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a480: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
a490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a4a0: 20 69 66 28 20 69 4f 70 74 3d 3d 53 69 7a 65 6f   if( iOpt==Sizeo
a4b0: 66 41 72 72 61 79 28 61 46 74 73 34 4f 70 74 29  fArray(aFts4Opt)
a4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
a4d0: 6c 69 74 65 33 46 74 73 33 45 72 72 4d 73 67 28  lite3Fts3ErrMsg(
a4e0: 70 7a 45 72 72 2c 20 22 75 6e 72 65 63 6f 67 6e  pzErr, "unrecogn
a4f0: 69 7a 65 64 20 70 61 72 61 6d 65 74 65 72 3a 20  ized parameter: 
a500: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
a510: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
a520: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65  RROR;.        }e
a530: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
a540: 77 69 74 63 68 28 20 69 4f 70 74 20 29 7b 0a 20  witch( iOpt ){. 
a550: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
a560: 30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0:              
a570: 20 2f 2a 20 4d 41 54 43 48 49 4e 46 4f 20 2a 2f   /* MATCHINFO */
a580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
a590: 66 28 20 73 74 72 6c 65 6e 28 7a 56 61 6c 29 21  f( strlen(zVal)!
a5a0: 3d 34 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =4 || sqlite3_st
a5b0: 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 66 74  rnicmp(zVal, "ft
a5c0: 73 33 22 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  s3", 4) ){.     
a5d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a5e0: 65 33 46 74 73 33 45 72 72 4d 73 67 28 70 7a 45  e3Fts3ErrMsg(pzE
a5f0: 72 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  rr, "unrecognize
a600: 64 20 6d 61 74 63 68 69 6e 66 6f 3a 20 25 73 22  d matchinfo: %s"
a610: 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
a620: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
a630: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_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 20 20 62 4e 6f 44 6f 63            bNoDoc
a660: 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  size = 1;.      
a670: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
a680: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
a690: 20 31 3a 20 20 20 20 20 20 20 20 20 20 20 20 20   1:             
a6a0: 20 20 2f 2a 20 50 52 45 46 49 58 20 2a 2f 0a 20    /* PREFIX */. 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a6c0: 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 66 69  ite3_free(zPrefi
a6d0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
a6e0: 20 20 7a 50 72 65 66 69 78 20 3d 20 7a 56 61 6c    zPrefix = zVal
a6f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a700: 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zVal = 0;.      
a710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
a720: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
a730: 20 32 3a 20 20 20 20 20 20 20 20 20 20 20 20 20   2:             
a740: 20 20 2f 2a 20 43 4f 4d 50 52 45 53 53 20 2a 2f    /* COMPRESS */
a750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
a760: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6d  qlite3_free(zCom
a770: 70 72 65 73 73 29 3b 0a 20 20 20 20 20 20 20 20  press);.        
a780: 20 20 20 20 20 20 7a 43 6f 6d 70 72 65 73 73 20        zCompress 
a790: 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = zVal;.        
a7a0: 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 30 3b 0a        zVal = 0;.
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a7c0: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
a7d0: 20 20 63 61 73 65 20 33 3a 20 20 20 20 20 20 20    case 3:       
a7e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 43 4f 4d          /* UNCOM
a7f0: 50 52 45 53 53 20 2a 2f 0a 20 20 20 20 20 20 20  PRESS */.       
a800: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
a810: 72 65 65 28 7a 55 6e 63 6f 6d 70 72 65 73 73 29  ree(zUncompress)
a820: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
a830: 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20 7a 56  zUncompress = zV
a840: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
a850: 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    zVal = 0;.    
a860: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a870: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
a880: 73 65 20 34 3a 20 20 20 20 20 20 20 20 20 20 20  se 4:           
a890: 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 2a 2f 0a      /* ORDER */.
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
a8b0: 28 20 28 73 74 72 6c 65 6e 28 7a 56 61 6c 29 21  ( (strlen(zVal)!
a8c0: 3d 33 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =3 || sqlite3_st
a8d0: 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 61 73  rnicmp(zVal, "as
a8e0: 63 22 2c 20 33 29 29 20 0a 20 20 20 20 20 20 20  c", 3)) .       
a8f0: 20 20 20 20 20 20 20 20 26 26 20 28 73 74 72 6c          && (strl
a900: 65 6e 28 7a 56 61 6c 29 21 3d 34 20 7c 7c 20 73  en(zVal)!=4 || s
a910: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
a920: 7a 56 61 6c 2c 20 22 64 65 73 63 22 2c 20 34 29  zVal, "desc", 4)
a930: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
a940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a950: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 45      sqlite3Fts3E
a960: 72 72 4d 73 67 28 70 7a 45 72 72 2c 20 22 75 6e  rrMsg(pzErr, "un
a970: 72 65 63 6f 67 6e 69 7a 65 64 20 6f 72 64 65 72  recognized order
a980: 3a 20 25 73 22 2c 20 7a 56 61 6c 29 3b 0a 20 20  : %s", zVal);.  
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
a9a0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
a9b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
a9d0: 44 65 73 63 49 64 78 20 3d 20 28 7a 56 61 6c 5b  DescIdx = (zVal[
a9e0: 30 5d 3d 3d 27 64 27 20 7c 7c 20 7a 56 61 6c 5b  0]=='d' || zVal[
a9f0: 30 5d 3d 3d 27 44 27 29 3b 0a 20 20 20 20 20 20  0]=='D');.      
aa00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
aa20: 20 35 3a 20 20 20 20 20 20 20 20 20 20 20 20 20   5:             
aa30: 20 2f 2a 20 43 4f 4e 54 45 4e 54 20 2a 2f 0a 20   /* CONTENT */. 
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
aa50: 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 74 65  ite3_free(zConte
aa60: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
aa70: 20 20 20 7a 43 6f 6e 74 65 6e 74 20 3d 20 7a 56     zContent = zV
aa80: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  al;.            
aa90: 20 20 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    zVal = 0;.    
aaa0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
aab0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ..            ca
aac0: 73 65 20 36 3a 20 20 20 20 20 20 20 20 20 20 20  se 6:           
aad0: 20 20 20 2f 2a 20 4c 41 4e 47 55 41 47 45 49 44     /* LANGUAGEID
aae0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
aaf0: 20 20 61 73 73 65 72 74 28 20 69 4f 70 74 3d 3d    assert( iOpt==
ab00: 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6 );.           
ab10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ab20: 7a 4c 61 6e 67 75 61 67 65 69 64 29 3b 0a 20 20  zLanguageid);.  
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4c 61 6e              zLan
ab40: 67 75 61 67 65 69 64 20 3d 20 7a 56 61 6c 3b 0a  guageid = zVal;.
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 56                zV
ab60: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
ab70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ab80: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 37            case 7
ab90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  :              /
aba0: 2a 20 4e 4f 54 49 4e 44 45 58 45 44 20 2a 2f 0a  * NOTINDEXED */.
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
abc0: 4e 6f 74 69 6e 64 65 78 65 64 5b 6e 4e 6f 74 69  Notindexed[nNoti
abd0: 6e 64 65 78 65 64 2b 2b 5d 20 3d 20 7a 56 61 6c  ndexed++] = zVal
abe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
abf0: 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zVal = 0;.      
ac00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ac10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ac20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
ac30: 69 74 65 33 5f 66 72 65 65 28 7a 56 61 6c 29 3b  ite3_free(zVal);
ac40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
ac50: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
ac60: 2c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  , the argument i
ac70: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  s a column name.
ac80: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
ac90: 20 20 20 20 20 6e 53 74 72 69 6e 67 20 2b 3d 20       nString += 
aca0: 28 69 6e 74 29 28 73 74 72 6c 65 6e 28 7a 29 20  (int)(strlen(z) 
acb0: 2b 20 31 29 3b 0a 20 20 20 20 20 20 61 43 6f 6c  + 1);.      aCol
acc0: 5b 6e 43 6f 6c 2b 2b 5d 20 3d 20 7a 3b 0a 20 20  [nCol++] = z;.  
acd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
ace0: 20 61 20 63 6f 6e 74 65 6e 74 3d 78 78 78 20 6f   a content=xxx o
acf0: 70 74 69 6f 6e 20 77 61 73 20 73 70 65 63 69 66  ption was specif
ad00: 69 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ied, the followi
ad10: 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
ad20: 31 2e 20 49 67 6e 6f 72 65 20 61 6e 79 20 63 6f  1. Ignore any co
ad30: 6d 70 72 65 73 73 3d 20 61 6e 64 20 75 6e 63 6f  mpress= and unco
ad40: 6d 70 72 65 73 73 3d 20 6f 70 74 69 6f 6e 73 2e  mpress= options.
ad50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20  .  **.  **   2. 
ad60: 49 66 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  If no column nam
ad70: 65 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  es were specifie
ad80: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
ad90: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 0a   CREATE VIRTUAL.
ada0: 20 20 2a 2a 20 20 20 20 20 20 54 41 42 4c 45 20    **      TABLE 
adb0: 73 74 61 74 65 6d 65 6e 74 2c 20 75 73 65 20 61  statement, use a
adc0: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  ll columns from 
add0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c  the content tabl
ade0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
adf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
ae00: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 73  Content ){.    s
ae10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6d  qlite3_free(zCom
ae20: 70 72 65 73 73 29 3b 20 0a 20 20 20 20 73 71 6c  press); .    sql
ae30: 69 74 65 33 5f 66 72 65 65 28 7a 55 6e 63 6f 6d  ite3_free(zUncom
ae40: 70 72 65 73 73 29 3b 20 0a 20 20 20 20 7a 43 6f  press); .    zCo
ae50: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  mpress = 0;.    
ae60: 7a 55 6e 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b  zUncompress = 0;
ae70: 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30  .    if( nCol==0
ae80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ae90: 33 5f 66 72 65 65 28 28 76 6f 69 64 2a 29 61 43  3_free((void*)aC
aea0: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 61 43 6f 6c  ol); .      aCol
aeb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
aec0: 20 66 74 73 33 43 6f 6e 74 65 6e 74 43 6f 6c 75   fts3ContentColu
aed0: 6d 6e 73 28 64 62 2c 20 61 72 67 76 5b 31 5d 2c  mns(db, argv[1],
aee0: 20 7a 43 6f 6e 74 65 6e 74 2c 26 61 43 6f 6c 2c   zContent,&aCol,
aef0: 26 6e 43 6f 6c 2c 26 6e 53 74 72 69 6e 67 2c 70  &nCol,&nString,p
af00: 7a 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  zErr);..      /*
af10: 20 49 66 20 61 20 6c 61 6e 67 75 61 67 65 69 64   If a languageid
af20: 3d 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 70 65  = option was spe
af30: 63 69 66 69 65 64 2c 20 72 65 6d 6f 76 65 20 74  cified, remove t
af40: 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 0a 20  he language id. 
af50: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 66       ** column f
af60: 72 6f 6d 20 74 68 65 20 61 43 6f 6c 5b 5d 20 61  rom the aCol[] a
af70: 72 72 61 79 2e 20 2a 2f 20 0a 20 20 20 20 20 20  rray. */ .      
af80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
af90: 4b 20 26 26 20 7a 4c 61 6e 67 75 61 67 65 69 64  K && zLanguageid
afa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
afb0: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
afc0: 3d 30 3b 20 6a 3c 6e 43 6f 6c 3b 20 6a 2b 2b 29  =0; j<nCol; j++)
afd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
afe0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
aff0: 7a 4c 61 6e 67 75 61 67 65 69 64 2c 20 61 43 6f  zLanguageid, aCo
b000: 6c 5b 6a 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  l[j])==0 ){.    
b010: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
b020: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
b030: 3d 6a 3b 20 6b 3c 6e 43 6f 6c 3b 20 6b 2b 2b 29  =j; k<nCol; k++)
b040: 20 61 43 6f 6c 5b 6b 5d 20 3d 20 61 43 6f 6c 5b   aCol[k] = aCol[
b050: 6b 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  k+1];.          
b060: 20 20 6e 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20    nCol--;.      
b070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b080: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b090: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b0a0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
b0b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b0c0: 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a 0a  fts3_init_out;..
b0d0: 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20 29 7b    if( nCol==0 ){
b0e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 53 74  .    assert( nSt
b0f0: 72 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ring==0 );.    a
b100: 43 6f 6c 5b 30 5d 20 3d 20 22 63 6f 6e 74 65 6e  Col[0] = "conten
b110: 74 22 3b 0a 20 20 20 20 6e 53 74 72 69 6e 67 20  t";.    nString 
b120: 3d 20 38 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  = 8;.    nCol = 
b130: 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54  1;.  }..  if( pT
b140: 6f 6b 65 6e 69 7a 65 72 3d 3d 30 20 29 7b 0a 20  okenizer==0 ){. 
b150: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
b160: 74 73 33 49 6e 69 74 54 6f 6b 65 6e 69 7a 65 72  ts3InitTokenizer
b170: 28 70 48 61 73 68 2c 20 22 73 69 6d 70 6c 65 22  (pHash, "simple"
b180: 2c 20 26 70 54 6f 6b 65 6e 69 7a 65 72 2c 20 70  , &pTokenizer, p
b190: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
b1a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b1b0: 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75  oto fts3_init_ou
b1c0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
b1d0: 20 70 54 6f 6b 65 6e 69 7a 65 72 20 29 3b 0a 0a   pTokenizer );..
b1e0: 20 20 72 63 20 3d 20 66 74 73 33 50 72 65 66 69    rc = fts3Prefi
b1f0: 78 50 61 72 61 6d 65 74 65 72 28 7a 50 72 65 66  xParameter(zPref
b200: 69 78 2c 20 26 6e 49 6e 64 65 78 2c 20 26 61 49  ix, &nIndex, &aI
b210: 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 72 63 3d  ndex);.  if( rc=
b220: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 7b  =SQLITE_ERROR ){
b230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 72  .    assert( zPr
b240: 65 66 69 78 20 29 3b 0a 20 20 20 20 73 71 6c 69  efix );.    sqli
b250: 74 65 33 46 74 73 33 45 72 72 4d 73 67 28 70 7a  te3Fts3ErrMsg(pz
b260: 45 72 72 2c 20 22 65 72 72 6f 72 20 70 61 72 73  Err, "error pars
b270: 69 6e 67 20 70 72 65 66 69 78 20 70 61 72 61 6d  ing prefix param
b280: 65 74 65 72 3a 20 25 73 22 2c 20 7a 50 72 65 66  eter: %s", zPref
b290: 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ix);.  }.  if( r
b2a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b2b0: 6f 74 6f 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75  oto fts3_init_ou
b2c0: 74 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  t;..  /* Allocat
b2d0: 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74  e and populate t
b2e0: 68 65 20 46 74 73 33 54 61 62 6c 65 20 73 74 72  he Fts3Table str
b2f0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 6e 42 79  ucture. */.  nBy
b300: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 33  te = sizeof(Fts3
b310: 54 61 62 6c 65 29 20 2b 20 20 20 20 20 20 20 20  Table) +        
b320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
b330: 33 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  3Table */.      
b340: 20 20 20 20 6e 43 6f 6c 20 2a 20 73 69 7a 65 6f      nCol * sizeo
b350: 66 28 63 68 61 72 20 2a 29 20 2b 20 20 20 20 20  f(char *) +     
b360: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 43 6f           /* azCo
b370: 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lumn */.        
b380: 20 20 6e 49 6e 64 65 78 20 2a 20 73 69 7a 65 6f    nIndex * sizeo
b390: 66 28 73 74 72 75 63 74 20 46 74 73 33 49 6e 64  f(struct Fts3Ind
b3a0: 65 78 29 20 2b 20 20 2f 2a 20 61 49 6e 64 65 78  ex) +  /* aIndex
b3b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 43   */.          nC
b3c0: 6f 6c 20 2a 20 73 69 7a 65 6f 66 28 75 38 29 20  ol * sizeof(u8) 
b3d0: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
b3e0: 20 20 20 2f 2a 20 61 62 4e 6f 74 69 6e 64 65 78     /* abNotindex
b3f0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
b400: 6e 4e 61 6d 65 20 2b 20 20 20 20 20 20 20 20 20  nName +         
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
b430: 0a 20 20 20 20 20 20 20 20 20 20 6e 44 62 20 2b  .          nDb +
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 2f 2a 20 7a 44 62 20 2a 2f 0a 20 20 20 20 20 20  /* zDb */.      
b470: 20 20 20 20 6e 53 74 72 69 6e 67 3b 20 20 20 20      nString;    
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
b4a0: 65 20 66 6f 72 20 61 7a 43 6f 6c 75 6d 6e 20 73  e for azColumn s
b4b0: 74 72 69 6e 67 73 20 2a 2f 0a 20 20 70 20 3d 20  trings */.  p = 
b4c0: 28 46 74 73 33 54 61 62 6c 65 2a 29 73 71 6c 69  (Fts3Table*)sqli
b4d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
b4e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
b4f0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b500: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
b510: 20 66 74 73 33 5f 69 6e 69 74 5f 6f 75 74 3b 0a   fts3_init_out;.
b520: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
b530: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 2d 3e  0, nByte);.  p->
b540: 64 62 20 3d 20 64 62 3b 0a 20 20 70 2d 3e 6e 43  db = db;.  p->nC
b550: 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20  olumn = nCol;.  
b560: 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
b570: 3d 20 30 3b 0a 20 20 70 2d 3e 61 7a 43 6f 6c 75  = 0;.  p->azColu
b580: 6d 6e 20 3d 20 28 63 68 61 72 20 2a 2a 29 26 70  mn = (char **)&p
b590: 5b 31 5d 3b 0a 20 20 70 2d 3e 70 54 6f 6b 65 6e  [1];.  p->pToken
b5a0: 69 7a 65 72 20 3d 20 70 54 6f 6b 65 6e 69 7a 65  izer = pTokenize
b5b0: 72 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  r;.  p->nMaxPend
b5c0: 69 6e 67 44 61 74 61 20 3d 20 46 54 53 33 5f 4d  ingData = FTS3_M
b5d0: 41 58 5f 50 45 4e 44 49 4e 47 5f 44 41 54 41 3b  AX_PENDING_DATA;
b5e0: 0a 20 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a  .  p->bHasDocsiz
b5f0: 65 20 3d 20 28 69 73 46 74 73 34 20 26 26 20 62  e = (isFts4 && b
b600: 4e 6f 44 6f 63 73 69 7a 65 3d 3d 30 29 3b 0a 20  NoDocsize==0);. 
b610: 20 70 2d 3e 62 48 61 73 53 74 61 74 20 3d 20 69   p->bHasStat = i
b620: 73 46 74 73 34 3b 0a 20 20 70 2d 3e 62 46 74 73  sFts4;.  p->bFts
b630: 34 20 3d 20 69 73 46 74 73 34 3b 0a 20 20 70 2d  4 = isFts4;.  p-
b640: 3e 62 44 65 73 63 49 64 78 20 3d 20 62 44 65 73  >bDescIdx = bDes
b650: 63 49 64 78 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f  cIdx;.  p->nAuto
b660: 69 6e 63 72 6d 65 72 67 65 20 3d 20 30 78 66 66  incrmerge = 0xff
b670: 3b 20 20 20 2f 2a 20 30 78 66 66 20 6d 65 61 6e  ;   /* 0xff mean
b680: 73 20 73 65 74 74 69 6e 67 20 75 6e 6b 6e 6f 77  s setting unknow
b690: 6e 20 2a 2f 0a 20 20 70 2d 3e 7a 43 6f 6e 74 65  n */.  p->zConte
b6a0: 6e 74 54 62 6c 20 3d 20 7a 43 6f 6e 74 65 6e 74  ntTbl = zContent
b6b0: 3b 0a 20 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65  ;.  p->zLanguage
b6c0: 69 64 20 3d 20 7a 4c 61 6e 67 75 61 67 65 69 64  id = zLanguageid
b6d0: 3b 0a 20 20 7a 43 6f 6e 74 65 6e 74 20 3d 20 30  ;.  zContent = 0
b6e0: 3b 0a 20 20 7a 4c 61 6e 67 75 61 67 65 69 64 20  ;.  zLanguageid 
b6f0: 3d 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  = 0;.  TESTONLY(
b700: 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f   p->inTransactio
b710: 6e 20 3d 20 2d 31 20 29 3b 0a 20 20 54 45 53 54  n = -1 );.  TEST
b720: 4f 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70  ONLY( p->mxSavep
b730: 6f 69 6e 74 20 3d 20 2d 31 20 29 3b 0a 0a 20 20  oint = -1 );..  
b740: 70 2d 3e 61 49 6e 64 65 78 20 3d 20 28 73 74 72  p->aIndex = (str
b750: 75 63 74 20 46 74 73 33 49 6e 64 65 78 20 2a 29  uct Fts3Index *)
b760: 26 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b 6e 43 6f  &p->azColumn[nCo
b770: 6c 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e  l];.  memcpy(p->
b780: 61 49 6e 64 65 78 2c 20 61 49 6e 64 65 78 2c 20  aIndex, aIndex, 
b790: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 46 74  sizeof(struct Ft
b7a0: 73 33 49 6e 64 65 78 29 20 2a 20 6e 49 6e 64 65  s3Index) * nInde
b7b0: 78 29 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 78 20  x);.  p->nIndex 
b7c0: 3d 20 6e 49 6e 64 65 78 3b 0a 20 20 66 6f 72 28  = nIndex;.  for(
b7d0: 69 3d 30 3b 20 69 3c 6e 49 6e 64 65 78 3b 20 69  i=0; i<nIndex; i
b7e0: 2b 2b 29 7b 0a 20 20 20 20 66 74 73 33 48 61 73  ++){.    fts3Has
b7f0: 68 49 6e 69 74 28 26 70 2d 3e 61 49 6e 64 65 78  hInit(&p->aIndex
b800: 5b 69 5d 2e 68 50 65 6e 64 69 6e 67 2c 20 46 54  [i].hPending, FT
b810: 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20  S3_HASH_STRING, 
b820: 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 62 4e  1);.  }.  p->abN
b830: 6f 74 69 6e 64 65 78 65 64 20 3d 20 28 75 38 20  otindexed = (u8 
b840: 2a 29 26 70 2d 3e 61 49 6e 64 65 78 5b 6e 49 6e  *)&p->aIndex[nIn
b850: 64 65 78 5d 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  dex];..  /* Fill
b860: 20 69 6e 20 74 68 65 20 7a 4e 61 6d 65 20 61 6e   in the zName an
b870: 64 20 7a 44 62 20 66 69 65 6c 64 73 20 6f 66 20  d zDb fields of 
b880: 74 68 65 20 76 74 61 62 20 73 74 72 75 63 74 75  the vtab structu
b890: 72 65 2e 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20  re. */.  zCsr = 
b8a0: 28 63 68 61 72 20 2a 29 26 70 2d 3e 61 62 4e 6f  (char *)&p->abNo
b8b0: 74 69 6e 64 65 78 65 64 5b 6e 43 6f 6c 5d 3b 0a  tindexed[nCol];.
b8c0: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 43 73    p->zName = zCs
b8d0: 72 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43 73 72  r;.  memcpy(zCsr
b8e0: 2c 20 61 72 67 76 5b 32 5d 2c 20 6e 4e 61 6d 65  , argv[2], nName
b8f0: 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 4e 61  );.  zCsr += nNa
b900: 6d 65 3b 0a 20 20 70 2d 3e 7a 44 62 20 3d 20 7a  me;.  p->zDb = z
b910: 43 73 72 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 43  Csr;.  memcpy(zC
b920: 73 72 2c 20 61 72 67 76 5b 31 5d 2c 20 6e 44 62  sr, argv[1], nDb
b930: 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 6e 44 62  );.  zCsr += nDb
b940: 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
b950: 74 68 65 20 61 7a 43 6f 6c 75 6d 6e 20 61 72 72  the azColumn arr
b960: 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 43 6f 6c  ay */.  for(iCol
b970: 3d 30 3b 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69  =0; iCol<nCol; i
b980: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  Col++){.    char
b990: 20 2a 7a 3b 20 0a 20 20 20 20 69 6e 74 20 6e 20   *z; .    int n 
b9a0: 3d 20 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  = 0;.    z = (ch
b9b0: 61 72 20 2a 29 73 71 6c 69 74 65 33 46 74 73 33  ar *)sqlite3Fts3
b9c0: 4e 65 78 74 54 6f 6b 65 6e 28 61 43 6f 6c 5b 69  NextToken(aCol[i
b9d0: 43 6f 6c 5d 2c 20 26 6e 29 3b 0a 20 20 20 20 6d  Col], &n);.    m
b9e0: 65 6d 63 70 79 28 7a 43 73 72 2c 20 7a 2c 20 6e  emcpy(zCsr, z, n
b9f0: 29 3b 0a 20 20 20 20 7a 43 73 72 5b 6e 5d 20 3d  );.    zCsr[n] =
ba00: 20 27 5c 30 27 3b 0a 20 20 20 20 73 71 6c 69 74   '\0';.    sqlit
ba10: 65 33 46 74 73 33 44 65 71 75 6f 74 65 28 7a 43  e3Fts3Dequote(zC
ba20: 73 72 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f  sr);.    p->azCo
ba30: 6c 75 6d 6e 5b 69 43 6f 6c 5d 20 3d 20 7a 43 73  lumn[iCol] = zCs
ba40: 72 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 6e  r;.    zCsr += n
ba50: 2b 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +1;.    assert( 
ba60: 7a 43 73 72 20 3c 3d 20 26 28 28 63 68 61 72 20  zCsr <= &((char 
ba70: 2a 29 70 29 5b 6e 42 79 74 65 5d 20 29 3b 0a 20  *)p)[nByte] );. 
ba80: 20 7d 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e   }..  /* Fill in
ba90: 20 74 68 65 20 61 62 4e 6f 74 69 6e 64 65 78 65   the abNotindexe
baa0: 64 20 61 72 72 61 79 20 2a 2f 0a 20 20 66 6f 72  d array */.  for
bab0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 6e 43  (iCol=0; iCol<nC
bac0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
bad0: 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
bae0: 72 6c 65 6e 28 70 2d 3e 61 7a 43 6f 6c 75 6d 6e  rlen(p->azColumn
baf0: 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 66 6f 72  [iCol]);.    for
bb00: 28 69 3d 30 3b 20 69 3c 6e 4e 6f 74 69 6e 64 65  (i=0; i<nNotinde
bb10: 78 65 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xed; i++){.     
bb20: 20 63 68 61 72 20 2a 7a 4e 6f 74 20 3d 20 61 7a   char *zNot = az
bb30: 4e 6f 74 69 6e 64 65 78 65 64 5b 69 5d 3b 0a 20  Notindexed[i];. 
bb40: 20 20 20 20 20 69 66 28 20 7a 4e 6f 74 20 26 26       if( zNot &&
bb50: 20 6e 3d 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28   n==(int)strlen(
bb60: 7a 4e 6f 74 29 0a 20 20 20 20 20 20 20 26 26 20  zNot).       && 
bb70: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  0==sqlite3_strni
bb80: 63 6d 70 28 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 5b  cmp(p->azColumn[
bb90: 69 43 6f 6c 5d 2c 20 7a 4e 6f 74 2c 20 6e 29 20  iCol], zNot, n) 
bba0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
bbb0: 20 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65    p->abNotindexe
bbc0: 64 5b 69 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20 20  d[iCol] = 1;.   
bbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
bbe0: 65 28 7a 4e 6f 74 29 3b 0a 20 20 20 20 20 20 20  e(zNot);.       
bbf0: 20 61 7a 4e 6f 74 69 6e 64 65 78 65 64 5b 69 5d   azNotindexed[i]
bc00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
bc10: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
bc20: 30 3b 20 69 3c 6e 4e 6f 74 69 6e 64 65 78 65 64  0; i<nNotindexed
bc30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
bc40: 61 7a 4e 6f 74 69 6e 64 65 78 65 64 5b 69 5d 20  azNotindexed[i] 
bc50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bc60: 46 74 73 33 45 72 72 4d 73 67 28 70 7a 45 72 72  Fts3ErrMsg(pzErr
bc70: 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  , "no such colum
bc80: 6e 3a 20 25 73 22 2c 20 61 7a 4e 6f 74 69 6e 64  n: %s", azNotind
bc90: 65 78 65 64 5b 69 5d 29 3b 0a 20 20 20 20 20 20  exed[i]);.      
bca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
bcb0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
bcc0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
bcd0: 4b 20 26 26 20 28 7a 43 6f 6d 70 72 65 73 73 3d  K && (zCompress=
bce0: 3d 30 29 21 3d 28 7a 55 6e 63 6f 6d 70 72 65 73  =0)!=(zUncompres
bcf0: 73 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63 68 61  s==0) ){.    cha
bd00: 72 20 63 6f 6e 73 74 20 2a 7a 4d 69 73 73 20 3d  r const *zMiss =
bd10: 20 28 7a 43 6f 6d 70 72 65 73 73 3d 3d 30 20 3f   (zCompress==0 ?
bd20: 20 22 63 6f 6d 70 72 65 73 73 22 20 3a 20 22 75   "compress" : "u
bd30: 6e 63 6f 6d 70 72 65 73 73 22 29 3b 0a 20 20 20  ncompress");.   
bd40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
bd50: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  OR;.    sqlite3F
bd60: 74 73 33 45 72 72 4d 73 67 28 70 7a 45 72 72 2c  ts3ErrMsg(pzErr,
bd70: 20 22 6d 69 73 73 69 6e 67 20 25 73 20 70 61 72   "missing %s par
bd80: 61 6d 65 74 65 72 20 69 6e 20 66 74 73 34 20 63  ameter in fts4 c
bd90: 6f 6e 73 74 72 75 63 74 6f 72 22 2c 20 7a 4d 69  onstructor", zMi
bda0: 73 73 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 52  ss);.  }.  p->zR
bdb0: 65 61 64 45 78 70 72 6c 69 73 74 20 3d 20 66 74  eadExprlist = ft
bdc0: 73 33 52 65 61 64 45 78 70 72 4c 69 73 74 28 70  s3ReadExprList(p
bdd0: 2c 20 7a 55 6e 63 6f 6d 70 72 65 73 73 2c 20 26  , zUncompress, &
bde0: 72 63 29 3b 0a 20 20 70 2d 3e 7a 57 72 69 74 65  rc);.  p->zWrite
bdf0: 45 78 70 72 6c 69 73 74 20 3d 20 66 74 73 33 57  Exprlist = fts3W
be00: 72 69 74 65 45 78 70 72 4c 69 73 74 28 70 2c 20  riteExprList(p, 
be10: 7a 43 6f 6d 70 72 65 73 73 2c 20 26 72 63 29 3b  zCompress, &rc);
be20: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
be30: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 74 73 33  E_OK ) goto fts3
be40: 5f 69 6e 69 74 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  _init_out;..  /*
be50: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 78   If this is an x
be60: 43 72 65 61 74 65 20 63 61 6c 6c 2c 20 63 72 65  Create call, cre
be70: 61 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ate the underlyi
be80: 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
be90: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e   .  ** database.
bea0: 20 54 4f 44 4f 3a 20 46 6f 72 20 78 43 6f 6e 6e   TODO: For xConn
beb0: 65 63 74 28 29 2c 20 69 74 20 63 6f 75 6c 64 20  ect(), it could 
bec0: 76 65 72 69 66 79 20 74 68 61 74 20 73 61 69 64  verify that said
bed0: 20 74 61 62 6c 65 73 20 65 78 69 73 74 2e 0a 20   tables exist.. 
bee0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 72 65 61   */.  if( isCrea
bef0: 74 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  te ){.    rc = f
bf00: 74 73 33 43 72 65 61 74 65 54 61 62 6c 65 73 28  ts3CreateTables(
bf10: 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  p);.  }..  /* Ch
bf20: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
bf30: 6c 65 67 61 63 79 20 66 74 73 33 20 74 61 62 6c  legacy fts3 tabl
bf40: 65 20 68 61 73 20 62 65 65 6e 20 22 75 70 67 72  e has been "upgr
bf50: 61 64 65 64 22 20 62 79 20 74 68 65 0a 20 20 2a  aded" by the.  *
bf60: 2a 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 61 20  * addition of a 
bf70: 25 5f 73 74 61 74 20 74 61 62 6c 65 20 73 6f 20  %_stat table so 
bf80: 74 68 61 74 20 69 74 20 63 61 6e 20 75 73 65 20  that it can use 
bf90: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
bfa0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  e..  */.  if( !i
bfb0: 73 46 74 73 34 20 26 26 20 21 69 73 43 72 65 61  sFts4 && !isCrea
bfc0: 74 65 20 29 7b 0a 20 20 20 20 70 2d 3e 62 48 61  te ){.    p->bHa
bfd0: 73 53 74 61 74 20 3d 20 32 3b 0a 20 20 7d 0a 0a  sStat = 2;.  }..
bfe0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
bff0: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 6f  the page-size fo
c000: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  r the database. 
c010: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
c020: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
c030: 2a 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 63  * estimate the c
c040: 6f 73 74 20 6f 66 20 6c 6f 61 64 69 6e 67 20 6c  ost of loading l
c050: 61 72 67 65 20 64 6f 63 6c 69 73 74 73 20 66 72  arge doclists fr
c060: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
c070: 20 20 2a 2f 0a 20 20 66 74 73 33 44 61 74 61 62    */.  fts3Datab
c080: 61 73 65 50 61 67 65 53 69 7a 65 28 26 72 63 2c  asePageSize(&rc,
c090: 20 70 29 3b 0a 20 20 70 2d 3e 6e 4e 6f 64 65 53   p);.  p->nNodeS
c0a0: 69 7a 65 20 3d 20 70 2d 3e 6e 50 67 73 7a 2d 33  ize = p->nPgsz-3
c0b0: 35 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  5;..  /* Declare
c0c0: 20 74 68 65 20 74 61 62 6c 65 20 73 63 68 65 6d   the table schem
c0d0: 61 20 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a  a to SQLite. */.
c0e0: 20 20 66 74 73 33 44 65 63 6c 61 72 65 56 74 61    fts3DeclareVta
c0f0: 62 28 26 72 63 2c 20 70 29 3b 0a 0a 66 74 73 33  b(&rc, p);..fts3
c100: 5f 69 6e 69 74 5f 6f 75 74 3a 0a 20 20 73 71 6c  _init_out:.  sql
c110: 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 66 69  ite3_free(zPrefi
c120: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  x);.  sqlite3_fr
c130: 65 65 28 61 49 6e 64 65 78 29 3b 0a 20 20 73 71  ee(aIndex);.  sq
c140: 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6d 70  lite3_free(zComp
c150: 72 65 73 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  ress);.  sqlite3
c160: 5f 66 72 65 65 28 7a 55 6e 63 6f 6d 70 72 65 73  _free(zUncompres
c170: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  s);.  sqlite3_fr
c180: 65 65 28 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  ee(zContent);.  
c190: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4c 61  sqlite3_free(zLa
c1a0: 6e 67 75 61 67 65 69 64 29 3b 0a 20 20 66 6f 72  nguageid);.  for
c1b0: 28 69 3d 30 3b 20 69 3c 6e 4e 6f 74 69 6e 64 65  (i=0; i<nNotinde
c1c0: 78 65 64 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65  xed; i++) sqlite
c1d0: 33 5f 66 72 65 65 28 61 7a 4e 6f 74 69 6e 64 65  3_free(azNotinde
c1e0: 78 65 64 5b 69 5d 29 3b 0a 20 20 73 71 6c 69 74  xed[i]);.  sqlit
c1f0: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
c200: 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
c210: 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 61 7a  _free((void *)az
c220: 4e 6f 74 69 6e 64 65 78 65 64 29 3b 0a 20 20 69  Notindexed);.  i
c230: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c240: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 20 29 7b   ){.    if( p ){
c250: 0a 20 20 20 20 20 20 66 74 73 33 44 69 73 63 6f  .      fts3Disco
c260: 6e 6e 65 63 74 4d 65 74 68 6f 64 28 28 73 71 6c  nnectMethod((sql
c270: 69 74 65 33 5f 76 74 61 62 20 2a 29 70 29 3b 0a  ite3_vtab *)p);.
c280: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
c290: 6f 6b 65 6e 69 7a 65 72 20 29 7b 0a 20 20 20 20  okenizer ){.    
c2a0: 20 20 70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d    pTokenizer->pM
c2b0: 6f 64 75 6c 65 2d 3e 78 44 65 73 74 72 6f 79 28  odule->xDestroy(
c2c0: 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20 20  pTokenizer);.   
c2d0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c2e0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d  assert( p->pSegm
c2f0: 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  ents==0 );.    *
c300: 70 70 56 54 61 62 20 3d 20 26 70 2d 3e 62 61 73  ppVTab = &p->bas
c310: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
c320: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
c330: 20 78 43 6f 6e 6e 65 63 74 28 29 20 61 6e 64 20   xConnect() and 
c340: 78 43 72 65 61 74 65 28 29 20 6d 65 74 68 6f 64  xCreate() method
c350: 73 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61  s for the virtua
c360: 6c 20 74 61 62 6c 65 2e 20 41 6c 6c 20 74 68 65  l table. All the
c370: 0a 2a 2a 20 77 6f 72 6b 20 69 73 20 64 6f 6e 65  .** work is done
c380: 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 66 74 73   in function fts
c390: 33 49 6e 69 74 56 74 61 62 28 29 2e 0a 2a 2f 0a  3InitVtab()..*/.
c3a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 43  static int fts3C
c3b0: 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 28 0a 20 20  onnectMethod(.  
c3c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
c3f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  ection */.  void
c400: 20 2a 70 41 75 78 2c 20 20 20 20 20 20 20 20 20   *pAux,         
c410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c420: 6f 69 6e 74 65 72 20 74 6f 20 74 6f 6b 65 6e 69  ointer to tokeni
c430: 7a 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  zer hash table *
c440: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c470: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 72 67   elements in arg
c480: 76 20 61 72 72 61 79 20 2a 2f 0a 20 20 63 6f 6e  v array */.  con
c490: 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
c4a0: 2a 61 72 67 76 2c 20 20 20 20 20 20 20 2f 2a 20  *argv,       /* 
c4b0: 78 43 72 65 61 74 65 2f 78 43 6f 6e 6e 65 63 74  xCreate/xConnect
c4c0: 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20   argument array 
c4d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  */.  sqlite3_vta
c4e0: 62 20 2a 2a 70 70 56 74 61 62 2c 20 20 20 20 20  b **ppVtab,     
c4f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
c500: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62   sqlite3_vtab ob
c510: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
c520: 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20  *pzErr          
c530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
c540: 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  : sqlite3_malloc
c550: 27 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  'd error message
c560: 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
c570: 66 74 73 33 49 6e 69 74 56 74 61 62 28 30 2c 20  fts3InitVtab(0, 
c580: 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
c590: 61 72 67 76 2c 20 70 70 56 74 61 62 2c 20 70 7a  argv, ppVtab, pz
c5a0: 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Err);.}.static i
c5b0: 6e 74 20 66 74 73 33 43 72 65 61 74 65 4d 65 74  nt fts3CreateMet
c5c0: 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  hod(.  sqlite3 *
c5d0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
c5e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
c5f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
c600: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 20 20  .  void *pAux,  
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
c630: 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20   tokenizer hash 
c640: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61  table */.  int a
c650: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
c660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c670: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
c680: 20 69 6e 20 61 72 67 76 20 61 72 72 61 79 20 2a   in argv array *
c690: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c6a0: 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c 20 20 20   const *argv,   
c6b0: 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 2f 78      /* xCreate/x
c6c0: 43 6f 6e 6e 65 63 74 20 61 72 67 75 6d 65 6e 74  Connect argument
c6d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
c6e0: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
c6f0: 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  b,          /* O
c700: 55 54 3a 20 4e 65 77 20 73 71 6c 69 74 65 33 5f  UT: New sqlite3_
c710: 76 74 61 62 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  vtab object */. 
c720: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65 33   /* OUT: sqlite3
c750: 5f 6d 61 6c 6c 6f 63 27 64 20 65 72 72 6f 72 20  _malloc'd error 
c760: 6d 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  message */.){.  
c770: 72 65 74 75 72 6e 20 66 74 73 33 49 6e 69 74 56  return fts3InitV
c780: 74 61 62 28 31 2c 20 64 62 2c 20 70 41 75 78 2c  tab(1, db, pAux,
c790: 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56   argc, argv, ppV
c7a0: 74 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  tab, pzErr);.}..
c7b0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49  /*.** Set the pI
c7c0: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
c7d0: 64 52 6f 77 73 20 76 61 72 69 61 62 6c 65 20 74  dRows variable t
c7e0: 6f 20 6e 52 6f 77 2e 20 55 6e 6c 65 73 73 20 74  o nRow. Unless t
c7f0: 68 69 73 0a 2a 2a 20 65 78 74 65 6e 73 69 6f 6e  his.** extension
c800: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65   is currently be
c810: 69 6e 67 20 75 73 65 64 20 62 79 20 61 20 76 65  ing used by a ve
c820: 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20  rsion of SQLite 
c830: 74 6f 6f 20 6f 6c 64 20 74 6f 0a 2a 2a 20 73 75  too old to.** su
c840: 70 70 6f 72 74 20 65 73 74 69 6d 61 74 65 64 52  pport estimatedR
c850: 6f 77 73 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ows. In that cas
c860: 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
c870: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
c880: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53  tatic void fts3S
c890: 65 74 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28  etEstimatedRows(
c8a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
c8b0: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 69 36  fo *pIdxInfo, i6
c8c0: 34 20 6e 52 6f 77 29 7b 0a 23 69 66 20 53 51 4c  4 nRow){.#if SQL
c8d0: 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
c8e0: 45 52 3e 3d 33 30 30 38 30 30 32 0a 20 20 69 66  ER>=3008002.  if
c8f0: 28 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  ( sqlite3_libver
c900: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 3e 3d 33  sion_number()>=3
c910: 30 30 38 30 30 32 20 29 7b 0a 20 20 20 20 70 49  008002 ){.    pI
c920: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
c930: 64 52 6f 77 73 20 3d 20 6e 52 6f 77 3b 0a 20 20  dRows = nRow;.  
c940: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a  }.#endif.}../* .
c950: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
c960: 6e 20 6f 66 20 74 68 65 20 78 42 65 73 74 49 6e  n of the xBestIn
c970: 64 65 78 20 6d 65 74 68 6f 64 20 66 6f 72 20 46  dex method for F
c980: 54 53 33 20 74 61 62 6c 65 73 2e 20 54 68 65 72  TS3 tables. Ther
c990: 65 0a 2a 2a 20 61 72 65 20 74 68 72 65 65 20 70  e.** are three p
c9a0: 6f 73 73 69 62 6c 65 20 73 74 72 61 74 65 67 69  ossible strategi
c9b0: 65 73 2c 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  es, in order of 
c9c0: 70 72 65 66 65 72 65 6e 63 65 3a 0a 2a 2a 0a 2a  preference:.**.*
c9d0: 2a 20 20 20 31 2e 20 44 69 72 65 63 74 20 6c 6f  *   1. Direct lo
c9e0: 6f 6b 75 70 20 62 79 20 72 6f 77 69 64 20 6f 72  okup by rowid or
c9f0: 20 64 6f 63 69 64 2e 20 0a 2a 2a 20 20 20 32 2e   docid. .**   2.
ca00: 20 46 75 6c 6c 2d 74 65 78 74 20 73 65 61 72 63   Full-text searc
ca10: 68 20 75 73 69 6e 67 20 61 20 4d 41 54 43 48 20  h using a MATCH 
ca20: 6f 70 65 72 61 74 6f 72 20 6f 6e 20 61 20 6e 6f  operator on a no
ca30: 6e 2d 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e 0a  n-docid column..
ca40: 2a 2a 20 20 20 33 2e 20 4c 69 6e 65 61 72 20 73  **   3. Linear s
ca50: 63 61 6e 20 6f 66 20 25 5f 63 6f 6e 74 65 6e 74  can of %_content
ca60: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
ca70: 63 20 69 6e 74 20 66 74 73 33 42 65 73 74 49 6e  c int fts3BestIn
ca80: 64 65 78 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  dexMethod(sqlite
ca90: 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73  3_vtab *pVTab, s
caa0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
cab0: 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 46 74 73  o *pInfo){.  Fts
cac0: 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
cad0: 33 54 61 62 6c 65 20 2a 29 70 56 54 61 62 3b 0a  3Table *)pVTab;.
cae0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
cb10: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
cb20: 69 43 6f 6e 73 20 3d 20 2d 31 3b 20 20 20 20 20  iCons = -1;     
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cb40: 6e 64 65 78 20 6f 66 20 63 6f 6e 73 74 72 61 69  ndex of constrai
cb50: 6e 74 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20  nt to use */..  
cb60: 69 6e 74 20 69 4c 61 6e 67 69 64 43 6f 6e 73 20  int iLangidCons 
cb70: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
cb80: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 61 6e 67  /* Index of lang
cb90: 69 64 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74 2c  id=x constraint,
cba0: 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   if present */. 
cbb0: 20 69 6e 74 20 69 44 6f 63 69 64 47 65 20 3d 20   int iDocidGe = 
cbc0: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
cbd0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 6f 63   /* Index of doc
cbe0: 69 64 3e 3d 78 20 63 6f 6e 73 74 72 61 69 6e 74  id>=x constraint
cbf0: 2c 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f 0a  , if present */.
cc00: 20 20 69 6e 74 20 69 44 6f 63 69 64 4c 65 20 3d    int iDocidLe =
cc10: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
cc20: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 6f    /* Index of do
cc30: 63 69 64 3c 3d 78 20 63 6f 6e 73 74 72 61 69 6e  cid<=x constrain
cc40: 74 2c 20 69 66 20 70 72 65 73 65 6e 74 20 2a 2f  t, if present */
cc50: 0a 20 20 69 6e 74 20 69 49 64 78 3b 0a 0a 20 20  .  int iIdx;..  
cc60: 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 20 75 73  /* By default us
cc70: 65 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  e a full table s
cc80: 63 61 6e 2e 20 54 68 69 73 20 69 73 20 61 6e 20  can. This is an 
cc90: 65 78 70 65 6e 73 69 76 65 20 6f 70 74 69 6f 6e  expensive option
cca0: 2c 0a 20 20 2a 2a 20 73 6f 20 73 65 61 72 63 68  ,.  ** so search
ccb0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
ccc0: 73 74 72 61 69 6e 74 73 20 74 6f 20 73 65 65 20  straints to see 
ccd0: 69 66 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69  if a more effici
cce0: 65 6e 74 20 0a 20 20 2a 2a 20 73 74 72 61 74 65  ent .  ** strate
ccf0: 67 79 20 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a  gy is possible..
cd00: 20 20 2a 2f 0a 20 20 70 49 6e 66 6f 2d 3e 69 64    */.  pInfo->id
cd10: 78 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c  xNum = FTS3_FULL
cd20: 53 43 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 70  SCAN_SEARCH;.  p
cd30: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
cd40: 6f 73 74 20 3d 20 35 30 30 30 30 30 30 3b 0a 20  ost = 5000000;. 
cd50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 66   for(i=0; i<pInf
cd60: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
cd70: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  i++){.    int bD
cd80: 6f 63 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  ocid;           
cd90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
cda0: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
cdb0: 20 69 73 20 6f 6e 20 64 6f 63 69 64 20 2a 2f 0a   is on docid */.
cdc0: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
cdd0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
cde0: 69 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49  int *pCons = &pI
cdf0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
ce00: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  [i];.    if( pCo
ce10: 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 7b  ns->usable==0 ){
ce20: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73  .      if( pCons
ce30: 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
ce40: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
ce50: 54 43 48 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  TCH ){.        /
ce60: 2a 20 54 68 65 72 65 20 65 78 69 73 74 73 20 61  * There exists a
ce70: 6e 20 75 6e 75 73 61 62 6c 65 20 4d 41 54 43 48  n unusable MATCH
ce80: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69   constraint. Thi
ce90: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 0a  s means that if.
cea0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
ceb0: 6c 61 6e 6e 65 72 20 64 6f 65 73 20 65 6c 65 63  lanner does elec
cec0: 74 20 74 6f 20 75 73 65 20 74 68 65 20 72 65 73  t to use the res
ced0: 75 6c 74 73 20 6f 66 20 74 68 69 73 20 63 61 6c  ults of this cal
cee0: 6c 20 61 73 20 70 61 72 74 0a 20 20 20 20 20 20  l as part.      
cef0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 76 65 72    ** of the over
cf00: 61 6c 6c 20 71 75 65 72 79 20 70 6c 61 6e 20 74  all query plan t
cf10: 68 65 20 75 73 65 72 20 77 69 6c 6c 20 73 65 65  he user will see
cf20: 20 61 6e 20 22 75 6e 61 62 6c 65 20 74 6f 20 75   an "unable to u
cf30: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  se.        ** fu
cf40: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20  nction MATCH in 
cf50: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
cf60: 6e 74 65 78 74 22 20 65 72 72 6f 72 2e 20 54 6f  ntext" error. To
cf70: 20 64 69 73 63 6f 75 72 61 67 65 0a 20 20 20 20   discourage.    
cf80: 20 20 20 20 2a 2a 20 74 68 69 73 2c 20 72 65 74      ** this, ret
cf90: 75 72 6e 20 61 20 76 65 72 79 20 68 69 67 68 20  urn a very high 
cfa0: 63 6f 73 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20  cost here.  */. 
cfb0: 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64         pInfo->id
cfc0: 78 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c  xNum = FTS3_FULL
cfd0: 53 43 41 4e 5f 53 45 41 52 43 48 3b 0a 20 20 20  SCAN_SEARCH;.   
cfe0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69       pInfo->esti
cff0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65 35 30  matedCost = 1e50
d000: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 53 65  ;.        fts3Se
d010: 74 45 73 74 69 6d 61 74 65 64 52 6f 77 73 28 70  tEstimatedRows(p
d020: 49 6e 66 6f 2c 20 28 28 73 71 6c 69 74 65 33 5f  Info, ((sqlite3_
d030: 69 6e 74 36 34 29 31 29 20 3c 3c 20 35 30 29 3b  int64)1) << 50);
d040: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d050: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
d060: 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
d070: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 62 44  e;.    }..    bD
d080: 6f 63 69 64 20 3d 20 28 70 43 6f 6e 73 2d 3e 69  ocid = (pCons->i
d090: 43 6f 6c 75 6d 6e 3c 30 20 7c 7c 20 70 43 6f 6e  Column<0 || pCon
d0a0: 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e  s->iColumn==p->n
d0b0: 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 0a 20 20 20 20  Column+1);..    
d0c0: 2f 2a 20 41 20 64 69 72 65 63 74 20 6c 6f 6f 6b  /* A direct look
d0d0: 75 70 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  up on the rowid 
d0e0: 6f 72 20 64 6f 63 69 64 20 63 6f 6c 75 6d 6e 2e  or docid column.
d0f0: 20 41 73 73 69 67 6e 20 61 20 63 6f 73 74 20 6f   Assign a cost o
d100: 66 20 31 2e 30 2e 20 2a 2f 0a 20 20 20 20 69 66  f 1.0. */.    if
d110: 28 20 69 43 6f 6e 73 3c 30 20 26 26 20 70 43 6f  ( iCons<0 && pCo
d120: 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  ns->op==SQLITE_I
d130: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
d140: 45 51 20 26 26 20 62 44 6f 63 69 64 20 29 7b 0a  EQ && bDocid ){.
d150: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
d160: 4e 75 6d 20 3d 20 46 54 53 33 5f 44 4f 43 49 44  Num = FTS3_DOCID
d170: 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20 20 70  _SEARCH;.      p
d180: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
d190: 6f 73 74 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20  ost = 1.0;.     
d1a0: 20 69 43 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20   iCons = i;.    
d1b0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 4d 41 54 43  }..    /* A MATC
d1c0: 48 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 55 73  H constraint. Us
d1d0: 65 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 73 65  e a full-text se
d1e0: 61 72 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  arch..    **.   
d1f0: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
d200: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 4d 41  more than one MA
d210: 54 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  TCH constraint a
d220: 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68  vailable, use th
d230: 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 6f  e first.    ** o
d240: 6e 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20  ne encountered. 
d250: 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
d260: 20 61 20 4d 41 54 43 48 20 63 6f 6e 73 74 72 61   a MATCH constra
d270: 69 6e 74 20 61 6e 64 20 61 20 64 69 72 65 63 74  int and a direct
d280: 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2f 64 6f  .    ** rowid/do
d290: 63 69 64 20 6c 6f 6f 6b 75 70 2c 20 70 72 65 66  cid lookup, pref
d2a0: 65 72 20 74 68 65 20 4d 41 54 43 48 20 73 74 72  er the MATCH str
d2b0: 61 74 65 67 79 2e 20 54 68 69 73 20 69 73 20 64  ategy. This is d
d2c0: 6f 6e 65 20 65 76 65 6e 20 0a 20 20 20 20 2a 2a  one even .    **
d2d0: 20 74 68 6f 75 67 68 20 74 68 65 20 72 6f 77 69   though the rowi
d2e0: 64 2f 64 6f 63 69 64 20 6c 6f 6f 6b 75 70 20 69  d/docid lookup i
d2f0: 73 20 66 61 73 74 65 72 20 74 68 61 6e 20 61 20  s faster than a 
d300: 4d 41 54 43 48 20 71 75 65 72 79 2c 20 73 65 6c  MATCH query, sel
d310: 65 63 74 69 6e 67 0a 20 20 20 20 2a 2a 20 69 74  ecting.    ** it
d320: 20 77 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   would lead to a
d330: 6e 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  n "unable to use
d340: 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20   function MATCH 
d350: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
d360: 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 78 74   .    ** context
d370: 22 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  " error..    */.
d380: 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f      if( pCons->o
d390: 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
d3a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48  CONSTRAINT_MATCH
d3b0: 20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 2d   .     && pCons-
d3c0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
d3d0: 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3c 3d 70  Cons->iColumn<=p
d3e0: 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b  ->nColumn.    ){
d3f0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64  .      pInfo->id
d400: 78 4e 75 6d 20 3d 20 46 54 53 33 5f 46 55 4c 4c  xNum = FTS3_FULL
d410: 54 45 58 54 5f 53 45 41 52 43 48 20 2b 20 70 43  TEXT_SEARCH + pC
d420: 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  ons->iColumn;.  
d430: 20 20 20 20 70 49 6e 66 6f 2d 3e 65 73 74 69 6d      pInfo->estim
d440: 61 74 65 64 43 6f 73 74 20 3d 20 32 2e 30 3b 0a  atedCost = 2.0;.
d450: 20 20 20 20 20 20 69 43 6f 6e 73 20 3d 20 69 3b        iCons = i;
d460: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
d470: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
d480: 6e 74 20 6f 6e 20 74 68 65 20 6c 61 6e 67 69 64  nt on the langid
d490: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 20 20 69   column */.    i
d4a0: 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51  f( pCons->op==SQ
d4b0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
d4c0: 52 41 49 4e 54 5f 45 51 20 0a 20 20 20 20 20 26  RAINT_EQ .     &
d4d0: 26 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e  & pCons->iColumn
d4e0: 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32  ==p->nColumn + 2
d4f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4c  .    ){.      iL
d500: 61 6e 67 69 64 43 6f 6e 73 20 3d 20 69 3b 0a 20  angidCons = i;. 
d510: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 44     }..    if( bD
d520: 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 73 77  ocid ){.      sw
d530: 69 74 63 68 28 20 70 43 6f 6e 73 2d 3e 6f 70 20  itch( pCons->op 
d540: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
d550: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
d560: 53 54 52 41 49 4e 54 5f 47 45 3a 0a 20 20 20 20  STRAINT_GE:.    
d570: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
d580: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
d590: 5f 47 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69  _GT:.          i
d5a0: 44 6f 63 69 64 47 65 20 3d 20 69 3b 0a 20 20 20  DocidGe = i;.   
d5b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
d5c0: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
d5d0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
d5e0: 49 4e 54 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20  INT_LE:.        
d5f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45  case SQLITE_INDE
d600: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 3a  X_CONSTRAINT_LT:
d610: 0a 20 20 20 20 20 20 20 20 20 20 69 44 6f 63 69  .          iDoci
d620: 64 4c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  dLe = i;.       
d630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d640: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
d650: 49 64 78 20 3d 20 31 3b 0a 20 20 69 66 28 20 69  Idx = 1;.  if( i
d660: 43 6f 6e 73 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Cons>=0 ){.    p
d670: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
d680: 74 55 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 61 72  tUsage[iCons].ar
d690: 67 76 49 6e 64 65 78 20 3d 20 69 49 64 78 2b 2b  gvIndex = iIdx++
d6a0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f  ;.    pInfo->aCo
d6b0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 43  nstraintUsage[iC
d6c0: 6f 6e 73 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  ons].omit = 1;. 
d6d0: 20 7d 20 0a 20 20 69 66 28 20 69 4c 61 6e 67 69   } .  if( iLangi
d6e0: 64 43 6f 6e 73 3e 3d 30 20 29 7b 0a 20 20 20 20  dCons>=0 ){.    
d6f0: 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 7c 3d  pInfo->idxNum |=
d700: 20 46 54 53 33 5f 48 41 56 45 5f 4c 41 4e 47 49   FTS3_HAVE_LANGI
d710: 44 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  D;.    pInfo->aC
d720: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d730: 4c 61 6e 67 69 64 43 6f 6e 73 5d 2e 61 72 67 76  LangidCons].argv
d740: 49 6e 64 65 78 20 3d 20 69 49 64 78 2b 2b 3b 0a  Index = iIdx++;.
d750: 20 20 7d 20 0a 20 20 69 66 28 20 69 44 6f 63 69    } .  if( iDoci
d760: 64 47 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49  dGe>=0 ){.    pI
d770: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 7c 3d 20 46  nfo->idxNum |= F
d780: 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f 47  TS3_HAVE_DOCID_G
d790: 45 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  E;.    pInfo->aC
d7a0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
d7b0: 44 6f 63 69 64 47 65 5d 2e 61 72 67 76 49 6e 64  DocidGe].argvInd
d7c0: 65 78 20 3d 20 69 49 64 78 2b 2b 3b 0a 20 20 7d  ex = iIdx++;.  }
d7d0: 20 0a 20 20 69 66 28 20 69 44 6f 63 69 64 4c 65   .  if( iDocidLe
d7e0: 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  >=0 ){.    pInfo
d7f0: 2d 3e 69 64 78 4e 75 6d 20 7c 3d 20 46 54 53 33  ->idxNum |= FTS3
d800: 5f 48 41 56 45 5f 44 4f 43 49 44 5f 4c 45 3b 0a  _HAVE_DOCID_LE;.
d810: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73      pInfo->aCons
d820: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 44 6f 63  traintUsage[iDoc
d830: 69 64 4c 65 5d 2e 61 72 67 76 49 6e 64 65 78 20  idLe].argvIndex 
d840: 3d 20 69 49 64 78 2b 2b 3b 0a 20 20 7d 20 0a 0a  = iIdx++;.  } ..
d850: 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20    /* Regardless 
d860: 6f 66 20 74 68 65 20 73 74 72 61 74 65 67 79 20  of the strategy 
d870: 73 65 6c 65 63 74 65 64 2c 20 46 54 53 20 63 61  selected, FTS ca
d880: 6e 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  n deliver rows i
d890: 6e 20 72 6f 77 69 64 20 28 6f 72 0a 20 20 2a 2a  n rowid (or.  **
d8a0: 20 64 6f 63 69 64 29 20 6f 72 64 65 72 2e 20 42   docid) order. B
d8b0: 6f 74 68 20 61 73 63 65 6e 64 69 6e 67 20 61 6e  oth ascending an
d8c0: 64 20 64 65 73 63 65 6e 64 69 6e 67 20 61 72 65  d descending are
d8d0: 20 70 6f 73 73 69 62 6c 65 2e 20 0a 20 20 2a 2f   possible. .  */
d8e0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4f  .  if( pInfo->nO
d8f0: 72 64 65 72 42 79 3d 3d 31 20 29 7b 0a 20 20 20  rderBy==1 ){.   
d900: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
d910: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
d920: 4f 72 64 65 72 20 3d 20 26 70 49 6e 66 6f 2d 3e  Order = &pInfo->
d930: 61 4f 72 64 65 72 42 79 5b 30 5d 3b 0a 20 20 20  aOrderBy[0];.   
d940: 20 69 66 28 20 70 4f 72 64 65 72 2d 3e 69 43 6f   if( pOrder->iCo
d950: 6c 75 6d 6e 3c 30 20 7c 7c 20 70 4f 72 64 65 72  lumn<0 || pOrder
d960: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43  ->iColumn==p->nC
d970: 6f 6c 75 6d 6e 2b 31 20 29 7b 0a 20 20 20 20 20  olumn+1 ){.     
d980: 20 69 66 28 20 70 4f 72 64 65 72 2d 3e 64 65 73   if( pOrder->des
d990: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  c ){.        pIn
d9a0: 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 22 44 45  fo->idxStr = "DE
d9b0: 53 43 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  SC";.      }else
d9c0: 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 66 6f 2d  {.        pInfo-
d9d0: 3e 69 64 78 53 74 72 20 3d 20 22 41 53 43 22 3b  >idxStr = "ASC";
d9e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d9f0: 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
da00: 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  sumed = 1;.    }
da10: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
da20: 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  p->pSegments==0 
da30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
da40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
da50: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
da60: 66 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 2e 0a  f xOpen method..
da70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
da80: 73 33 4f 70 65 6e 4d 65 74 68 6f 64 28 73 71 6c  s3OpenMethod(sql
da90: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
daa0: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
dab0: 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 29 7b 0a  ursor **ppCsr){.
dac0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
dad0: 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20  ursor *pCsr;    
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
daf0: 6c 6f 63 61 74 65 64 20 63 75 72 73 6f 72 20 2a  located cursor *
db00: 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  /..  UNUSED_PARA
db10: 4d 45 54 45 52 28 70 56 54 61 62 29 3b 0a 0a 20  METER(pVTab);.. 
db20: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
db30: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
db40: 67 68 20 66 6f 72 20 61 6e 20 46 74 73 33 43 75  gh for an Fts3Cu
db50: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 2e 20  rsor structure. 
db60: 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 6c 6c 6f  If the.  ** allo
db70: 63 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2c  cation succeeds,
db80: 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 72 65 74   zero it and ret
db90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
dba0: 74 68 65 72 77 69 73 65 2c 20 0a 20 20 2a 2a 20  therwise, .  ** 
dbb0: 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  if the allocatio
dbc0: 6e 20 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20  n fails, return 
dbd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
dbe0: 2a 2f 0a 20 20 2a 70 70 43 73 72 20 3d 20 70 43  */.  *ppCsr = pC
dbf0: 73 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  sr = (sqlite3_vt
dc00: 61 62 5f 63 75 72 73 6f 72 20 2a 29 73 71 6c 69  ab_cursor *)sqli
dc10: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
dc20: 66 28 46 74 73 33 43 75 72 73 6f 72 29 29 3b 0a  f(Fts3Cursor));.
dc30: 20 20 69 66 28 20 21 70 43 73 72 20 29 7b 0a 20    if( !pCsr ){. 
dc40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dc50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
dc60: 6d 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69  mset(pCsr, 0, si
dc70: 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72 29  zeof(Fts3Cursor)
dc80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dc90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dca0: 43 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  Close the cursor
dcb0: 2e 20 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  .  For additiona
dcc0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 65  l information se
dcd0: 65 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  e the documentat
dce0: 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 78 43  ion.** on the xC
dcf0: 6c 6f 73 65 20 6d 65 74 68 6f 64 20 6f 66 20 74  lose method of t
dd00: 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
dd10: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
dd20: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6c  tatic int fts3Cl
dd30: 6f 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  oseMethod(sqlite
dd40: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
dd50: 43 75 72 73 6f 72 29 7b 0a 20 20 46 74 73 33 43  Cursor){.  Fts3C
dd60: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
dd70: 74 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ts3Cursor *)pCur
dd80: 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28  sor;.  assert( (
dd90: 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
dda0: 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e  r->base.pVtab)->
ddb0: 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a  pSegments==0 );.
ddc0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
ddd0: 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  ze(pCsr->pStmt);
dde0: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 45 78  .  sqlite3Fts3Ex
ddf0: 70 72 46 72 65 65 28 70 43 73 72 2d 3e 70 45 78  prFree(pCsr->pEx
de00: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  pr);.  sqlite3Ft
de10: 73 33 46 72 65 65 44 65 66 65 72 72 65 64 54 6f  s3FreeDeferredTo
de20: 6b 65 6e 73 28 70 43 73 72 29 3b 0a 20 20 73 71  kens(pCsr);.  sq
de30: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d  lite3_free(pCsr-
de40: 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 73 71  >aDoclist);.  sq
de50: 6c 69 74 65 33 46 74 73 33 4d 49 42 75 66 66 65  lite3Fts3MIBuffe
de60: 72 46 72 65 65 28 70 43 73 72 2d 3e 70 4d 49 42  rFree(pCsr->pMIB
de70: 75 66 66 65 72 29 3b 0a 20 20 61 73 73 65 72 74  uffer);.  assert
de80: 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
de90: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
dea0: 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  )->pSegments==0 
deb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
dec0: 65 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72  e(pCsr);.  retur
ded0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dee0: 2f 2a 0a 2a 2a 20 49 66 20 70 43 73 72 2d 3e 70  /*.** If pCsr->p
def0: 53 74 6d 74 20 68 61 73 20 6e 6f 74 20 62 65 65  Stmt has not bee
df00: 6e 20 70 72 65 70 61 72 65 64 20 28 69 2e 65 2e  n prepared (i.e.
df10: 20 69 66 20 70 43 73 72 2d 3e 70 53 74 6d 74 3d   if pCsr->pStmt=
df20: 3d 30 29 2c 20 74 68 65 6e 0a 2a 2a 20 63 6f 6d  =0), then.** com
df30: 70 6f 73 65 20 61 6e 64 20 70 72 65 70 61 72 65  pose and prepare
df40: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
df50: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  t of the form:.*
df60: 2a 0a 2a 2a 20 20 20 20 22 53 45 4c 45 43 54 20  *.**    "SELECT 
df70: 3c 63 6f 6c 75 6d 6e 73 3e 20 46 52 4f 4d 20 25  <columns> FROM %
df80: 5f 63 6f 6e 74 65 6e 74 20 57 48 45 52 45 20 72  _content WHERE r
df90: 6f 77 69 64 20 3d 20 3f 22 0a 2a 2a 0a 2a 2a 20  owid = ?".**.** 
dfa0: 28 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65  (or the equivale
dfb0: 6e 74 20 66 6f 72 20 61 20 63 6f 6e 74 65 6e 74  nt for a content
dfc0: 3d 78 78 78 20 74 61 62 6c 65 29 20 61 6e 64 20  =xxx table) and 
dfd0: 73 65 74 20 70 43 73 72 2d 3e 70 53 74 6d 74 20  set pCsr->pStmt 
dfe0: 74 6f 0a 2a 2a 20 69 74 2e 20 49 66 20 61 6e 20  to.** it. If an 
dff0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
e000: 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
e010: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
e020: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
e030: 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f 69 6e 74  *ppStmt to point
e040: 20 74 6f 20 70 43 73 72 2d 3e 70 53 74 6d 74 20   to pCsr->pStmt 
e050: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
e060: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
e070: 69 6e 74 20 66 74 73 33 43 75 72 73 6f 72 53 65  int fts3CursorSe
e080: 65 6b 53 74 6d 74 28 46 74 73 33 43 75 72 73 6f  ekStmt(Fts3Curso
e090: 72 20 2a 70 43 73 72 2c 20 73 71 6c 69 74 65 33  r *pCsr, sqlite3
e0a0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 29 7b  _stmt **ppStmt){
e0b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e0c0: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73  TE_OK;.  if( pCs
e0d0: 72 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  r->pStmt==0 ){. 
e0e0: 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20     Fts3Table *p 
e0f0: 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
e100: 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
e110: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  .    char *zSql;
e120: 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
e130: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
e140: 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f 77  ECT %s WHERE row
e150: 69 64 20 3d 20 3f 22 2c 20 70 2d 3e 7a 52 65 61  id = ?", p->zRea
e160: 64 45 78 70 72 6c 69 73 74 29 3b 0a 20 20 20 20  dExprlist);.    
e170: 69 66 28 20 21 7a 53 71 6c 20 29 20 72 65 74 75  if( !zSql ) retu
e180: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e190: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e1a0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
e1b0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
e1c0: 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
e1d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e1e0: 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 2a 70  (zSql);.  }.  *p
e1f0: 70 53 74 6d 74 20 3d 20 70 43 73 72 2d 3e 70 53  pStmt = pCsr->pS
e200: 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  tmt;.  return rc
e210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 73 69 74  ;.}../*.** Posit
e220: 69 6f 6e 20 74 68 65 20 70 43 73 72 2d 3e 70 53  ion the pCsr->pS
e230: 74 6d 74 20 73 74 61 74 65 6d 65 6e 74 20 73 6f  tmt statement so
e240: 20 74 68 61 74 20 69 74 20 69 73 20 6f 6e 20 74   that it is on t
e250: 68 65 20 72 6f 77 0a 2a 2a 20 6f 66 20 74 68 65  he row.** of the
e260: 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
e270: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
e280: 68 65 20 6c 61 73 74 20 6d 61 74 63 68 2e 20 20  he last match.  
e290: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
e2a0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e2b0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
e2c0: 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28 73  fts3CursorSeek(s
e2d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
e2e0: 70 43 6f 6e 74 65 78 74 2c 20 46 74 73 33 43 75  pContext, Fts3Cu
e2f0: 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
e300: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e310: 4b 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 69  K;.  if( pCsr->i
e320: 73 52 65 71 75 69 72 65 53 65 65 6b 20 29 7b 0a  sRequireSeek ){.
e330: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
e340: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20   *pStmt = 0;..  
e350: 20 20 72 63 20 3d 20 66 74 73 33 43 75 72 73 6f    rc = fts3Curso
e360: 72 53 65 65 6b 53 74 6d 74 28 70 43 73 72 2c 20  rSeekStmt(pCsr, 
e370: 26 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  &pStmt);.    if(
e380: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e390: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
e3a0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 73 72 2d  bind_int64(pCsr-
e3b0: 3e 70 53 74 6d 74 2c 20 31 2c 20 70 43 73 72 2d  >pStmt, 1, pCsr-
e3c0: 3e 69 50 72 65 76 49 64 29 3b 0a 20 20 20 20 20  >iPrevId);.     
e3d0: 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72 65   pCsr->isRequire
e3e0: 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Seek = 0;.      
e3f0: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
e400: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73  sqlite3_step(pCs
e410: 72 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  r->pStmt) ){.   
e420: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e430: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
e440: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
e450: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
e460: 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  Csr->pStmt);.   
e470: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e480: 49 54 45 5f 4f 4b 20 26 26 20 28 28 46 74 73 33  ITE_OK && ((Fts3
e490: 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
e4a0: 73 65 2e 70 56 74 61 62 29 2d 3e 7a 43 6f 6e 74  se.pVtab)->zCont
e4b0: 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  entTbl==0 ){.   
e4c0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20         /* If no 
e4d0: 72 6f 77 20 77 61 73 20 66 6f 75 6e 64 20 61 6e  row was found an
e4e0: 64 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f  d no error has o
e4f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
e500: 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 20 20  e %_content.    
e510: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69        ** table i
e520: 73 20 6d 69 73 73 69 6e 67 20 61 20 72 6f 77 20  s missing a row 
e530: 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
e540: 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74  in the full-text
e550: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
e560: 20 20 2a 2a 20 54 68 65 20 64 61 74 61 20 73 74    ** The data st
e570: 72 75 63 74 75 72 65 73 20 61 72 65 20 63 6f 72  ructures are cor
e580: 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rupt.  */.      
e590: 20 20 20 20 72 63 20 3d 20 46 54 53 5f 43 4f 52      rc = FTS_COR
e5a0: 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 20  RUPT_VTAB;.     
e5b0: 20 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66       pCsr->isEof
e5c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
e5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e5e0: 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
e5f0: 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 74 65  ITE_OK && pConte
e600: 78 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  xt ){.    sqlite
e610: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
e620: 6f 64 65 28 70 43 6f 6e 74 65 78 74 2c 20 72 63  ode(pContext, rc
e630: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e640: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
e650: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
e660: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
e670: 73 69 6e 67 6c 65 20 69 6e 74 65 72 69 6f 72 20  single interior 
e680: 6e 6f 64 65 20 77 68 65 6e 20 73 65 61 72 63 68  node when search
e690: 69 6e 67 0a 2a 2a 20 61 20 62 2d 74 72 65 65 20  ing.** a b-tree 
e6a0: 66 6f 72 20 61 20 74 65 72 6d 20 6f 72 20 74 65  for a term or te
e6b0: 72 6d 20 70 72 65 66 69 78 2e 20 54 68 65 20 6e  rm prefix. The n
e6c0: 6f 64 65 20 64 61 74 61 20 69 73 20 70 61 73 73  ode data is pass
e6d0: 65 64 20 74 6f 20 74 68 69 73 20 0a 2a 2a 20 66  ed to this .** f
e6e0: 75 6e 63 74 69 6f 6e 20 76 69 61 20 74 68 65 20  unction via the 
e6f0: 7a 4e 6f 64 65 2f 6e 4e 6f 64 65 20 70 61 72 61  zNode/nNode para
e700: 6d 65 74 65 72 73 2e 20 54 68 65 20 74 65 72 6d  meters. The term
e710: 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 69   to search for i
e720: 73 0a 2a 2a 20 70 61 73 73 65 64 20 69 6e 20 7a  s.** passed in z
e730: 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a  Term/nTerm..**.*
e740: 2a 20 49 66 20 70 69 46 69 72 73 74 20 69 73 20  * If piFirst is 
e750: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
e760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
e770: 73 20 2a 70 69 46 69 72 73 74 20 74 6f 20 74 68  s *piFirst to th
e780: 65 20 62 6c 6f 63 6b 69 64 0a 2a 2a 20 6f 66 20  e blockid.** of 
e790: 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 74  the child node t
e7a0: 68 61 74 20 68 65 61 64 73 20 74 68 65 20 73 75  hat heads the su
e7b0: 62 2d 74 72 65 65 20 74 68 61 74 20 6d 61 79 20  b-tree that may 
e7c0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 65 72 6d  contain the term
e7d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 69 4c 61 73  ..**.** If piLas
e7e0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  t is not NULL, t
e7f0: 68 65 6e 20 2a 70 69 4c 61 73 74 20 69 73 20 73  hen *piLast is s
e800: 65 74 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  et to the right-
e810: 6d 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64 65 0a  most child node.
e820: 2a 2a 20 74 68 61 74 20 68 65 61 64 73 20 61 20  ** that heads a 
e830: 73 75 62 2d 74 72 65 65 20 74 68 61 74 20 6d 61  sub-tree that ma
e840: 79 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d  y contain a term
e850: 20 66 6f 72 20 77 68 69 63 68 20 7a 54 65 72 6d   for which zTerm
e860: 2f 6e 54 65 72 6d 20 69 73 0a 2a 2a 20 61 20 70  /nTerm is.** a p
e870: 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  refix..**.** If 
e880: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
e890: 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
e8a0: 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
e8b0: 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
e8c0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
e8d0: 6e 74 20 66 74 73 33 53 63 61 6e 49 6e 74 65 72  nt fts3ScanInter
e8e0: 69 6f 72 4e 6f 64 65 28 0a 20 20 63 6f 6e 73 74  iorNode(.  const
e8f0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20   char *zTerm,   
e900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
e910: 72 6d 20 74 6f 20 73 65 6c 65 63 74 20 6c 65 61  rm to select lea
e920: 76 65 73 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ves for */.  int
e930: 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20   nTerm,         
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e950: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65  Size of term zTe
e960: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
e970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 6f   const char *zNo
e980: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
e990: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
e9a0: 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20 69 6e  ining segment in
e9b0: 74 65 72 69 6f 72 20 6e 6f 64 65 20 2a 2f 0a 20  terior node */. 
e9c0: 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20 20 20 20   int nNode,     
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
e9f0: 65 72 20 61 74 20 7a 4e 6f 64 65 20 2a 2f 0a 20  er at zNode */. 
ea00: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
ea10: 70 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20  piFirst,        
ea20: 20 2f 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74 65   /* OUT: Selecte
ea30: 64 20 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f 0a  d child node */.
ea40: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
ea50: 2a 70 69 4c 61 73 74 20 20 20 20 20 20 20 20 20  *piLast         
ea60: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 6c 65 63 74    /* OUT: Select
ea70: 65 64 20 63 68 69 6c 64 20 6e 6f 64 65 20 2a 2f  ed child node */
ea80: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
ea90: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
eaa0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
eab0: 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  code */.  const 
eac0: 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 7a 4e 6f  char *zCsr = zNo
ead0: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72  de;       /* Cur
eae0: 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  sor to iterate t
eaf0: 68 72 6f 75 67 68 20 6e 6f 64 65 20 2a 2f 0a 20  hrough node */. 
eb00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e   const char *zEn
eb10: 64 20 3d 20 26 7a 43 73 72 5b 6e 4e 6f 64 65 5d  d = &zCsr[nNode]
eb20: 3b 2f 2a 20 45 6e 64 20 6f 66 20 69 6e 74 65 72  ;/* End of inter
eb30: 69 6f 72 20 6e 6f 64 65 20 62 75 66 66 65 72 20  ior node buffer 
eb40: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 66  */.  char *zBuff
eb50: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
eb60: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
eb70: 6f 20 6c 6f 61 64 20 74 65 72 6d 73 20 69 6e 74  o load terms int
eb80: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  o */.  int nAllo
eb90: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
eba0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ebb0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  f allocated buff
ebc0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 69  er */.  int isFi
ebd0: 72 73 74 54 65 72 6d 20 3d 20 31 3b 20 20 20 20  rstTerm = 1;    
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
ebf0: 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
ec00: 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
ec10: 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ge */.  sqlite3_
ec20: 69 6e 74 36 34 20 69 43 68 69 6c 64 3b 20 20 20  int64 iChild;   
ec30: 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b          /* Block
ec40: 20 69 64 20 6f 66 20 63 68 69 6c 64 20 6e 6f 64   id of child nod
ec50: 65 20 74 6f 20 64 65 73 63 65 6e 64 20 74 6f 20  e to descend to 
ec60: 2a 2f 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 6f 76  */..  /* Skip ov
ec70: 65 72 20 74 68 65 20 27 68 65 69 67 68 74 27 20  er the 'height' 
ec80: 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
ec90: 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
eca0: 6f 66 20 65 76 65 72 79 20 0a 20 20 2a 2a 20 69  of every .  ** i
ecb0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 54 68  nterior node. Th
ecc0: 65 6e 20 6c 6f 61 64 20 74 68 65 20 62 6c 6f 63  en load the bloc
ecd0: 6b 69 64 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  kid of the left-
ece0: 63 68 69 6c 64 20 6f 66 20 74 68 65 20 62 2d 74  child of the b-t
ecf0: 72 65 65 0a 20 20 2a 2a 20 6e 6f 64 65 20 69 6e  ree.  ** node in
ed00: 74 6f 20 76 61 72 69 61 62 6c 65 20 69 43 68 69  to variable iChi
ed10: 6c 64 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ld.  .  **.  ** 
ed20: 45 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  Even if the data
ed30: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 20 64 69   structure on di
ed40: 73 6b 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  sk is corrupted,
ed50: 20 74 68 69 73 20 28 72 65 61 64 69 6e 67 20 74   this (reading t
ed60: 77 6f 0a 20 20 2a 2a 20 76 61 72 69 6e 74 73 20  wo.  ** varints 
ed70: 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 29  from the buffer)
ed80: 20 64 6f 65 73 20 6e 6f 74 20 72 69 73 6b 20 61   does not risk a
ed90: 6e 20 6f 76 65 72 72 65 61 64 2e 20 49 66 20 7a  n overread. If z
eda0: 4e 6f 64 65 20 69 73 20 61 0a 20 20 2a 2a 20 72  Node is a.  ** r
edb0: 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65 6e 20 74  oot node, then t
edc0: 68 65 20 62 75 66 66 65 72 20 63 6f 6d 65 73 20  he buffer comes 
edd0: 66 72 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74  from a SELECT st
ede0: 61 74 65 6d 65 6e 74 2e 20 53 51 4c 69 74 65 20  atement. SQLite 
edf0: 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 6d 61  does.  ** not ma
ee00: 6b 65 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  ke this guarante
ee10: 65 20 65 78 70 6c 69 63 69 74 6c 79 2c 20 62 75  e explicitly, bu
ee20: 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 74 68  t in practice th
ee30: 65 72 65 20 61 72 65 20 61 6c 77 61 79 73 0a 20  ere are always. 
ee40: 20 2a 2a 20 65 69 74 68 65 72 20 6d 6f 72 65 20   ** either more 
ee50: 74 68 61 6e 20 32 30 20 62 79 74 65 73 20 6f 66  than 20 bytes of
ee60: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
ee70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6e   following the n
ee80: 4e 6f 64 65 20 62 79 74 65 73 20 6f 66 0a 20 20  Node bytes of.  
ee90: 2a 2a 20 63 6f 6e 74 65 6e 74 73 2c 20 6f 72 20  ** contents, or 
eea0: 74 77 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 20  two zero bytes. 
eeb0: 4f 72 2c 20 69 66 20 74 68 65 20 6e 6f 64 65 20  Or, if the node 
eec0: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
eed0: 20 25 5f 73 65 67 6d 65 6e 74 73 0a 20 20 2a 2a   %_segments.  **
eee0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
eef0: 72 65 20 61 72 65 20 61 6c 77 61 79 73 20 32 30  re are always 20
ef00: 20 62 79 74 65 73 20 6f 66 20 7a 65 72 6f 65 64   bytes of zeroed
ef10: 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
ef20: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6e 4e 6f 64  ng the.  ** nNod
ef30: 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  e bytes of conte
ef40: 6e 74 20 28 73 65 65 20 73 71 6c 69 74 65 33 46  nt (see sqlite3F
ef50: 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 29 20 66  ts3ReadBlock() f
ef60: 6f 72 20 64 65 74 61 69 6c 73 29 2e 0a 20 20 2a  or details)..  *
ef70: 2f 0a 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69  /.  zCsr += sqli
ef80: 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
ef90: 28 7a 43 73 72 2c 20 26 69 43 68 69 6c 64 29 3b  (zCsr, &iChild);
efa0: 0a 20 20 7a 43 73 72 20 2b 3d 20 73 71 6c 69 74  .  zCsr += sqlit
efb0: 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
efc0: 7a 43 73 72 2c 20 26 69 43 68 69 6c 64 29 3b 0a  zCsr, &iChild);.
efd0: 20 20 69 66 28 20 7a 43 73 72 3e 7a 45 6e 64 20    if( zCsr>zEnd 
efe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54  ){.    return FT
eff0: 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a  S_CORRUPT_VTAB;.
f000: 20 20 7d 0a 20 20 0a 20 20 77 68 69 6c 65 28 20    }.  .  while( 
f010: 7a 43 73 72 3c 7a 45 6e 64 20 26 26 20 28 70 69  zCsr<zEnd && (pi
f020: 46 69 72 73 74 20 7c 7c 20 70 69 4c 61 73 74 29  First || piLast)
f030: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6d 70 3b   ){.    int cmp;
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 2f 2a 20 6d 65 6d 63 6d 70 28        /* memcmp(
f060: 29 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  ) result */.    
f070: 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f090: 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75   Size of term su
f0a0: 66 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ffix */.    int 
f0b0: 6e 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20 20  nPrefix = 0;    
f0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f0d0: 65 20 6f 66 20 74 65 72 6d 20 70 72 65 66 69 78  e of term prefix
f0e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 75 66   */.    int nBuf
f0f0: 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  fer;            
f100: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74        /* Total t
f110: 65 72 6d 20 73 69 7a 65 20 2a 2f 0a 20 20 0a 20  erm size */.  . 
f120: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6e     /* Load the n
f130: 65 78 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ext term on the 
f140: 6e 6f 64 65 20 69 6e 74 6f 20 7a 42 75 66 66 65  node into zBuffe
f150: 72 2e 20 55 73 65 20 72 65 61 6c 6c 6f 63 28 29  r. Use realloc()
f160: 20 74 6f 20 65 78 70 61 6e 64 0a 20 20 20 20 2a   to expand.    *
f170: 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 7a 42  * the size of zB
f180: 75 66 66 65 72 20 69 66 20 72 65 71 75 69 72 65  uffer if require
f190: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  d.  */.    if( !
f1a0: 69 73 46 69 72 73 74 54 65 72 6d 20 29 7b 0a 20  isFirstTerm ){. 
f1b0: 20 20 20 20 20 7a 43 73 72 20 2b 3d 20 66 74 73       zCsr += fts
f1c0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 7a 43 73  3GetVarint32(zCs
f1d0: 72 2c 20 26 6e 50 72 65 66 69 78 29 3b 0a 20 20  r, &nPrefix);.  
f1e0: 20 20 7d 0a 20 20 20 20 69 73 46 69 72 73 74 54    }.    isFirstT
f1f0: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 7a 43 73  erm = 0;.    zCs
f200: 72 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  r += fts3GetVari
f210: 6e 74 33 32 28 7a 43 73 72 2c 20 26 6e 53 75 66  nt32(zCsr, &nSuf
f220: 66 69 78 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  fix);.    .    i
f230: 66 28 20 6e 50 72 65 66 69 78 3c 30 20 7c 7c 20  f( nPrefix<0 || 
f240: 6e 53 75 66 66 69 78 3c 30 20 7c 7c 20 26 7a 43  nSuffix<0 || &zC
f250: 73 72 5b 6e 53 75 66 66 69 78 5d 3e 7a 45 6e 64  sr[nSuffix]>zEnd
f260: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
f270: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b  TS_CORRUPT_VTAB;
f280: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69  .      goto fini
f290: 73 68 5f 73 63 61 6e 3b 0a 20 20 20 20 7d 0a 20  sh_scan;.    }. 
f2a0: 20 20 20 69 66 28 20 6e 50 72 65 66 69 78 2b 6e     if( nPrefix+n
f2b0: 53 75 66 66 69 78 3e 6e 41 6c 6c 6f 63 20 29 7b  Suffix>nAlloc ){
f2c0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
f2d0: 77 3b 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20  w;.      nAlloc 
f2e0: 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53 75 66 66  = (nPrefix+nSuff
f2f0: 69 78 29 20 2a 20 32 3b 0a 20 20 20 20 20 20 7a  ix) * 2;.      z
f300: 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
f310: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 7a 42  lite3_realloc(zB
f320: 75 66 66 65 72 2c 20 6e 41 6c 6c 6f 63 29 3b 0a  uffer, nAlloc);.
f330: 20 20 20 20 20 20 69 66 28 20 21 7a 4e 65 77 20        if( !zNew 
f340: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f350: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f360: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
f370: 68 5f 73 63 61 6e 3b 0a 20 20 20 20 20 20 7d 0a  h_scan;.      }.
f380: 20 20 20 20 20 20 7a 42 75 66 66 65 72 20 3d 20        zBuffer = 
f390: 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zNew;.    }.    
f3a0: 61 73 73 65 72 74 28 20 7a 42 75 66 66 65 72 20  assert( zBuffer 
f3b0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
f3c0: 42 75 66 66 65 72 5b 6e 50 72 65 66 69 78 5d 2c  Buffer[nPrefix],
f3d0: 20 7a 43 73 72 2c 20 6e 53 75 66 66 69 78 29 3b   zCsr, nSuffix);
f3e0: 0a 20 20 20 20 6e 42 75 66 66 65 72 20 3d 20 6e  .    nBuffer = n
f3f0: 50 72 65 66 69 78 20 2b 20 6e 53 75 66 66 69 78  Prefix + nSuffix
f400: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 6e 53  ;.    zCsr += nS
f410: 75 66 66 69 78 3b 0a 0a 20 20 20 20 2f 2a 20 43  uffix;..    /* C
f420: 6f 6d 70 61 72 65 20 74 68 65 20 74 65 72 6d 20  ompare the term 
f430: 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67  we are searching
f440: 20 66 6f 72 20 77 69 74 68 20 74 68 65 20 74 65   for with the te
f450: 72 6d 20 6a 75 73 74 20 6c 6f 61 64 65 64 20 66  rm just loaded f
f460: 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  rom.    ** the i
f470: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 49 66  nterior node. If
f480: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
f490: 65 72 6d 20 69 73 20 67 72 65 61 74 65 72 20 74  erm is greater t
f4a0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 20  han or equal.   
f4b0: 20 2a 2a 20 74 6f 20 74 68 65 20 74 65 72 6d 20   ** to the term 
f4c0: 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 69 6f  from the interio
f4d0: 72 20 6e 6f 64 65 2c 20 74 68 65 6e 20 61 6c 6c  r node, then all
f4e0: 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 75   terms on the su
f4f0: 62 2d 74 72 65 65 20 0a 20 20 20 20 2a 2a 20 68  b-tree .    ** h
f500: 65 61 64 65 64 20 62 79 20 6e 6f 64 65 20 69 43  eaded by node iC
f510: 68 69 6c 64 20 61 72 65 20 73 6d 61 6c 6c 65 72  hild are smaller
f520: 20 74 68 61 6e 20 7a 54 65 72 6d 2e 20 4e 6f 20   than zTerm. No 
f530: 6e 65 65 64 20 74 6f 20 73 65 61 72 63 68 20 0a  need to search .
f540: 20 20 20 20 2a 2a 20 69 43 68 69 6c 64 2e 0a 20      ** iChild.. 
f550: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
f560: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
f570: 65 20 74 65 72 6d 20 69 73 20 6c 61 72 67 65 72  e term is larger
f580: 20 74 68 61 6e 20 74 68 65 20 73 70 65 63 69 66   than the specif
f590: 69 65 64 20 74 65 72 6d 2c 20 74 68 65 6e 0a 20  ied term, then. 
f5a0: 20 20 20 2a 2a 20 74 68 65 20 74 72 65 65 20 68     ** the tree h
f5b0: 65 61 64 65 64 20 62 79 20 69 43 68 69 6c 64 20  eaded by iChild 
f5c0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  may contain the 
f5d0: 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 0a  specified term..
f5e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6d 70 20 3d      */.    cmp =
f5f0: 20 6d 65 6d 63 6d 70 28 7a 54 65 72 6d 2c 20 7a   memcmp(zTerm, z
f600: 42 75 66 66 65 72 2c 20 28 6e 42 75 66 66 65 72  Buffer, (nBuffer
f610: 3e 6e 54 65 72 6d 20 3f 20 6e 54 65 72 6d 20 3a  >nTerm ? nTerm :
f620: 20 6e 42 75 66 66 65 72 29 29 3b 0a 20 20 20 20   nBuffer));.    
f630: 69 66 28 20 70 69 46 69 72 73 74 20 26 26 20 28  if( piFirst && (
f640: 63 6d 70 3c 30 20 7c 7c 20 28 63 6d 70 3d 3d 30  cmp<0 || (cmp==0
f650: 20 26 26 20 6e 42 75 66 66 65 72 3e 6e 54 65 72   && nBuffer>nTer
f660: 6d 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 69  m)) ){.      *pi
f670: 46 69 72 73 74 20 3d 20 69 43 68 69 6c 64 3b 0a  First = iChild;.
f680: 20 20 20 20 20 20 70 69 46 69 72 73 74 20 3d 20        piFirst = 
f690: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
f6a0: 28 20 70 69 4c 61 73 74 20 26 26 20 63 6d 70 3c  ( piLast && cmp<
f6b0: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 69 4c 61  0 ){.      *piLa
f6c0: 73 74 20 3d 20 69 43 68 69 6c 64 3b 0a 20 20 20  st = iChild;.   
f6d0: 20 20 20 70 69 4c 61 73 74 20 3d 20 30 3b 0a 20     piLast = 0;. 
f6e0: 20 20 20 7d 0a 0a 20 20 20 20 69 43 68 69 6c 64     }..    iChild
f6f0: 2b 2b 3b 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20  ++;.  };..  if( 
f700: 70 69 46 69 72 73 74 20 29 20 2a 70 69 46 69 72  piFirst ) *piFir
f710: 73 74 20 3d 20 69 43 68 69 6c 64 3b 0a 20 20 69  st = iChild;.  i
f720: 66 28 20 70 69 4c 61 73 74 20 29 20 2a 70 69 4c  f( piLast ) *piL
f730: 61 73 74 20 3d 20 69 43 68 69 6c 64 3b 0a 0a 20  ast = iChild;.. 
f740: 66 69 6e 69 73 68 5f 73 63 61 6e 3a 0a 20 20 73  finish_scan:.  s
f750: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
f760: 66 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  fer);.  return r
f770: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
f780: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
f790: 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20 7a  to by argument z
f7a0: 4e 6f 64 65 20 28 73 69 7a 65 20 6e 4e 6f 64 65  Node (size nNode
f7b0: 20 62 79 74 65 73 29 20 63 6f 6e 74 61 69 6e 73   bytes) contains
f7c0: 20 61 6e 0a 2a 2a 20 69 6e 74 65 72 69 6f 72 20   an.** interior 
f7d0: 6e 6f 64 65 20 6f 66 20 61 20 62 2d 74 72 65 65  node of a b-tree
f7e0: 20 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 7a 54   segment. The zT
f7f0: 65 72 6d 20 62 75 66 66 65 72 20 28 73 69 7a 65  erm buffer (size
f800: 20 6e 54 65 72 6d 20 62 79 74 65 73 29 0a 2a 2a   nTerm bytes).**
f810: 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d   contains a term
f820: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
f830: 73 65 61 72 63 68 65 73 20 74 68 65 20 73 75 62  searches the sub
f840: 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20  -tree headed by 
f850: 74 68 65 20 7a 4e 6f 64 65 0a 2a 2a 20 6e 6f 64  the zNode.** nod
f860: 65 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 20  e for the range 
f870: 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73 20 74 68  of leaf nodes th
f880: 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 74  at may contain t
f890: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
f8a0: 6d 0a 2a 2a 20 6f 72 20 74 65 72 6d 73 20 66 6f  m.** or terms fo
f8b0: 72 20 77 68 69 63 68 20 74 68 65 20 73 70 65 63  r which the spec
f8c0: 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 61 20  ified term is a 
f8d0: 70 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  prefix..**.** If
f8e0: 20 70 69 4c 65 61 66 20 69 73 20 6e 6f 74 20 4e   piLeaf is not N
f8f0: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 69 4c 65 61  ULL, then *piLea
f900: 66 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  f is set to the 
f910: 62 6c 6f 63 6b 69 64 20 6f 66 20 74 68 65 20 0a  blockid of the .
f920: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  ** left-most lea
f930: 66 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74 72  f node in the tr
f940: 65 65 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74  ee that may cont
f950: 61 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65  ain the specifie
f960: 64 20 74 65 72 6d 2e 0a 2a 2a 20 49 66 20 70 69  d term..** If pi
f970: 4c 65 61 66 32 20 69 73 20 6e 6f 74 20 4e 55 4c  Leaf2 is not NUL
f980: 4c 2c 20 74 68 65 6e 20 2a 70 69 4c 65 61 66 32  L, then *piLeaf2
f990: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 62   is set to the b
f9a0: 6c 6f 63 6b 69 64 20 6f 66 20 74 68 65 0a 2a 2a  lockid of the.**
f9b0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
f9c0: 20 6e 6f 64 65 20 74 68 61 74 20 6d 61 79 20 63   node that may c
f9d0: 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d 20 66 6f  ontain a term fo
f9e0: 72 20 77 68 69 63 68 20 74 68 65 20 73 70 65 63  r which the spec
f9f0: 69 66 69 65 64 0a 2a 2a 20 74 65 72 6d 20 69 73  ified.** term is
fa00: 20 61 20 70 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a   a prefix..**.**
fa10: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
fa20: 74 68 61 74 20 74 68 65 20 72 61 6e 67 65 20 6f  that the range o
fa30: 66 20 72 65 74 75 72 6e 65 64 20 6c 65 61 66 20  f returned leaf 
fa40: 6e 6f 64 65 73 20 64 6f 65 73 20 6e 6f 74 20 63  nodes does not c
fa50: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 74 68 65 20 73  ontain .** the s
fa60: 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 6f 72  pecified term or
fa70: 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77   any terms for w
fa80: 68 69 63 68 20 69 74 20 69 73 20 61 20 70 72 65  hich it is a pre
fa90: 66 69 78 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  fix. However, if
faa0: 20 74 68 65 20 0a 2a 2a 20 73 65 67 6d 65 6e 74   the .** segment
fab0: 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 6e   does contain an
fac0: 79 20 73 75 63 68 20 74 65 72 6d 73 2c 20 74 68  y such terms, th
fad0: 65 79 20 61 72 65 20 73 74 6f 72 65 64 20 77 69  ey are stored wi
fae0: 74 68 69 6e 20 74 68 65 20 69 64 65 6e 74 69 66  thin the identif
faf0: 69 65 64 0a 2a 2a 20 72 61 6e 67 65 2e 20 42 65  ied.** range. Be
fb00: 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
fb10: 69 6f 6e 20 6f 6e 6c 79 20 69 6e 73 70 65 63 74  ion only inspect
fb20: 73 20 69 6e 74 65 72 69 6f 72 20 73 65 67 6d 65  s interior segme
fb30: 6e 74 20 6e 6f 64 65 73 20 28 61 6e 64 0a 2a 2a  nt nodes (and.**
fb40: 20 6e 65 76 65 72 20 6c 6f 61 64 73 20 6c 65 61   never loads lea
fb50: 66 20 6e 6f 64 65 73 20 69 6e 74 6f 20 6d 65 6d  f nodes into mem
fb60: 6f 72 79 29 2c 20 69 74 20 69 73 20 6e 6f 74 20  ory), it is not 
fb70: 70 6f 73 73 69 62 6c 65 20 74 6f 20 62 65 20 73  possible to be s
fb80: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ure..**.** If an
fb90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
fba0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
fbb0: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
fbc0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
fbd0: 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  / .static int ft
fbe0: 73 33 53 65 6c 65 63 74 4c 65 61 66 28 0a 20 20  s3SelectLeaf(.  
fbf0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  /* Virtual table
fc20: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
fc30: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc50: 54 65 72 6d 20 74 6f 20 73 65 6c 65 63 74 20 6c  Term to select l
fc60: 65 61 76 65 73 20 66 6f 72 20 2a 2f 0a 20 20 69  eaves for */.  i
fc70: 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc90: 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a  * Size of term z
fca0: 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
fcb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fcc0: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
fcd0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
fce0: 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20  taining segment 
fcf0: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 2a 2f  interior node */
fd00: 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20 20  .  int nNode,   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
fd30: 66 66 65 72 20 61 74 20 7a 4e 6f 64 65 20 2a 2f  ffer at zNode */
fd40: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
fd50: 20 2a 70 69 4c 65 61 66 2c 20 20 20 20 20 20 20   *piLeaf,       
fd60: 20 20 20 2f 2a 20 53 65 6c 65 63 74 65 64 20 6c     /* Selected l
fd70: 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  eaf node */.  sq
fd80: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4c  lite3_int64 *piL
fd90: 65 61 66 32 20 20 20 20 20 20 20 20 20 20 2f 2a  eaf2          /*
fda0: 20 53 65 6c 65 63 74 65 64 20 6c 65 61 66 20 6e   Selected leaf n
fdb0: 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ode */.){.  int 
fdc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
fdd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
fde0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
fdf0: 69 6e 74 20 69 48 65 69 67 68 74 3b 20 20 20 20  int iHeight;    
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 74 68 69  /* Height of thi
fe20: 73 20 6e 6f 64 65 20 69 6e 20 74 72 65 65 20 2a  s node in tree *
fe30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 69 4c  /..  assert( piL
fe40: 65 61 66 20 7c 7c 20 70 69 4c 65 61 66 32 20 29  eaf || piLeaf2 )
fe50: 3b 0a 0a 20 20 66 74 73 33 47 65 74 56 61 72 69  ;..  fts3GetVari
fe60: 6e 74 33 32 28 7a 4e 6f 64 65 2c 20 26 69 48 65  nt32(zNode, &iHe
fe70: 69 67 68 74 29 3b 0a 20 20 72 63 20 3d 20 66 74  ight);.  rc = ft
fe80: 73 33 53 63 61 6e 49 6e 74 65 72 69 6f 72 4e 6f  s3ScanInteriorNo
fe90: 64 65 28 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  de(zTerm, nTerm,
fea0: 20 7a 4e 6f 64 65 2c 20 6e 4e 6f 64 65 2c 20 70   zNode, nNode, p
feb0: 69 4c 65 61 66 2c 20 70 69 4c 65 61 66 32 29 3b  iLeaf, piLeaf2);
fec0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 69 4c 65  .  assert( !piLe
fed0: 61 66 32 20 7c 7c 20 21 70 69 4c 65 61 66 20 7c  af2 || !piLeaf |
fee0: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
fef0: 7c 7c 20 28 2a 70 69 4c 65 61 66 3c 3d 2a 70 69  || (*piLeaf<=*pi
ff00: 4c 65 61 66 32 29 20 29 3b 0a 0a 20 20 69 66 28  Leaf2) );..  if(
ff10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ff20: 26 20 69 48 65 69 67 68 74 3e 31 20 29 7b 0a 20  & iHeight>1 ){. 
ff30: 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d     char *zBlob =
ff40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ff50: 20 2f 2a 20 42 6c 6f 62 20 72 65 61 64 20 66 72   /* Blob read fr
ff60: 6f 6d 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61  om %_segments ta
ff70: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
ff80: 42 6c 6f 62 20 3d 20 30 3b 20 20 20 20 20 20 20  Blob = 0;       
ff90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ffa0: 20 6f 66 20 7a 42 6c 6f 62 20 69 6e 20 62 79 74   of zBlob in byt
ffb0: 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  es */..    if( p
ffc0: 69 4c 65 61 66 20 26 26 20 70 69 4c 65 61 66 32  iLeaf && piLeaf2
ffd0: 20 26 26 20 28 2a 70 69 4c 65 61 66 21 3d 2a 70   && (*piLeaf!=*p
ffe0: 69 4c 65 61 66 32 29 20 29 7b 0a 20 20 20 20 20  iLeaf2) ){.     
fff0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
10000 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c 20 2a 70  3ReadBlock(p, *p
10010 69 4c 65 61 66 2c 20 26 7a 42 6c 6f 62 2c 20 26  iLeaf, &zBlob, &
10020 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 20 20 20  nBlob, 0);.     
10030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
10050 20 3d 20 66 74 73 33 53 65 6c 65 63 74 4c 65 61   = fts3SelectLea
10060 66 28 70 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  f(p, zTerm, nTer
10070 6d 2c 20 7a 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  m, zBlob, nBlob,
10080 20 70 69 4c 65 61 66 2c 20 30 29 3b 0a 20 20 20   piLeaf, 0);.   
10090 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
100a0 65 33 5f 66 72 65 65 28 7a 42 6c 6f 62 29 3b 0a  e3_free(zBlob);.
100b0 20 20 20 20 20 20 70 69 4c 65 61 66 20 3d 20 30        piLeaf = 0
100c0 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
100d0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  0;.    }..    if
100e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
100f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
10100 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 6c 6f  lite3Fts3ReadBlo
10110 63 6b 28 70 2c 20 70 69 4c 65 61 66 3f 2a 70 69  ck(p, piLeaf?*pi
10120 4c 65 61 66 3a 2a 70 69 4c 65 61 66 32 2c 20 26  Leaf:*piLeaf2, &
10130 7a 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62 2c 20 30  zBlob, &nBlob, 0
10140 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
10150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10160 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  {.      rc = fts
10170 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a  3SelectLeaf(p, z
10180 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 42 6c  Term, nTerm, zBl
10190 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 69 4c 65 61  ob, nBlob, piLea
101a0 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a 20 20 20  f, piLeaf2);.   
101b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
101c0 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20 20 7d 0a  ree(zBlob);.  }.
101d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
101e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
101f0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
10200 63 72 65 61 74 65 20 64 65 6c 74 61 2d 65 6e 63  create delta-enc
10210 6f 64 65 64 20 73 65 72 69 61 6c 69 7a 65 64 20  oded serialized 
10220 6c 69 73 74 73 20 6f 66 20 46 54 53 33 20 0a 2a  lists of FTS3 .*
10230 2a 20 76 61 72 69 6e 74 73 2e 20 45 61 63 68 20  * varints. Each 
10240 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
10250 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
10260 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 74 6f  single varint to
10270 20 61 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74   a list..*/.stat
10280 69 63 20 76 6f 69 64 20 66 74 73 33 50 75 74 44  ic void fts3PutD
10290 65 6c 74 61 56 61 72 69 6e 74 28 0a 20 20 63 68  eltaVarint(.  ch
102a0 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  ar **pp,        
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102c0 20 49 4e 2f 4f 55 54 3a 20 4f 75 74 70 75 74 20   IN/OUT: Output 
102d0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c  pointer */.  sql
102e0 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 50 72  ite3_int64 *piPr
102f0 65 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev,          /* 
10300 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73  IN/OUT: Previous
10310 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
10320 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  o list */.  sqli
10330 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c 20 20  te3_int64 iVal  
10340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10350 72 69 74 65 20 74 68 69 73 20 76 61 6c 75 65 20  rite this value 
10360 74 6f 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 29  to the list */.)
10370 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 6c  {.  assert( iVal
10380 2d 2a 70 69 50 72 65 76 20 3e 20 30 20 7c 7c 20  -*piPrev > 0 || 
10390 28 2a 70 69 50 72 65 76 3d 3d 30 20 26 26 20 69  (*piPrev==0 && i
103a0 56 61 6c 3d 3d 30 29 20 29 3b 0a 20 20 2a 70 70  Val==0) );.  *pp
103b0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
103c0 75 74 56 61 72 69 6e 74 28 2a 70 70 2c 20 69 56  utVarint(*pp, iV
103d0 61 6c 2d 2a 70 69 50 72 65 76 29 3b 0a 20 20 2a  al-*piPrev);.  *
103e0 70 69 50 72 65 76 20 3d 20 69 56 61 6c 3b 0a 7d  piPrev = iVal;.}
103f0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
10400 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10410 6c 6c 65 64 2c 20 2a 70 70 50 6f 73 6c 69 73 74  lled, *ppPoslist
10420 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
10430 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  oint to the .** 
10440 73 74 61 72 74 20 6f 66 20 61 20 70 6f 73 69 74  start of a posit
10450 69 6f 6e 2d 6c 69 73 74 2e 20 41 66 74 65 72 20  ion-list. After 
10460 69 74 20 72 65 74 75 72 6e 73 2c 20 2a 70 70 50  it returns, *ppP
10470 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73 20 74 6f  oslist points to
10480 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 62 79   the.** first by
10490 74 65 20 61 66 74 65 72 20 74 68 65 20 70 6f 73  te after the pos
104a0 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a  ition-list..**.*
104b0 2a 20 41 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  * A position lis
104c0 74 20 69 73 20 6c 69 73 74 20 6f 66 20 70 6f 73  t is list of pos
104d0 69 74 69 6f 6e 73 20 28 64 65 6c 74 61 20 65 6e  itions (delta en
104e0 63 6f 64 65 64 29 20 61 6e 64 20 63 6f 6c 75 6d  coded) and colum
104f0 6e 73 20 66 6f 72 20 0a 2a 2a 20 61 20 73 69 6e  ns for .** a sin
10500 67 6c 65 20 64 6f 63 75 6d 65 6e 74 20 72 65 63  gle document rec
10510 6f 72 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  ord of a doclist
10520 2e 20 20 53 6f 2c 20 69 6e 20 6f 74 68 65 72 20  .  So, in other 
10530 77 6f 72 64 73 2c 20 74 68 69 73 0a 2a 2a 20 72  words, this.** r
10540 6f 75 74 69 6e 65 20 61 64 76 61 6e 63 65 73 20  outine advances 
10550 2a 70 70 50 6f 73 6c 69 73 74 20 73 6f 20 74 68  *ppPoslist so th
10560 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
10570 74 68 65 20 6e 65 78 74 20 64 6f 63 69 64 20 69  the next docid i
10580 6e 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74  n.** the doclist
10590 2c 20 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  , or to the firs
105a0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
105b0 65 6e 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  end of the docli
105c0 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 20  st..**.** If pp 
105d0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
105e0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
105f0 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
10600 69 73 74 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ist are copied.*
10610 2a 20 74 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73  * to *pp. *pp is
10620 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
10630 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10640 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 62 79  past the last by
10650 74 65 20 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66  te copied.** bef
10660 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
10670 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74  n returns..*/.st
10680 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 50 6f  atic void fts3Po
10690 73 6c 69 73 74 43 6f 70 79 28 63 68 61 72 20 2a  slistCopy(char *
106a0 2a 70 70 2c 20 63 68 61 72 20 2a 2a 70 70 50 6f  *pp, char **ppPo
106b0 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 2a  slist){.  char *
106c0 70 45 6e 64 20 3d 20 2a 70 70 50 6f 73 6c 69 73  pEnd = *ppPoslis
106d0 74 3b 0a 20 20 63 68 61 72 20 63 20 3d 20 30 3b  t;.  char c = 0;
106e0 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e 64 20 6f  ..  /* The end o
106f0 66 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  f a position lis
10700 74 20 69 73 20 6d 61 72 6b 65 64 20 62 79 20 61  t is marked by a
10710 20 7a 65 72 6f 20 65 6e 63 6f 64 65 64 20 61 73   zero encoded as
10720 20 61 6e 20 46 54 53 33 20 0a 20 20 2a 2a 20 76   an FTS3 .  ** v
10730 61 72 69 6e 74 2e 20 41 20 73 69 6e 67 6c 65 20  arint. A single 
10740 50 4f 53 5f 45 4e 44 20 28 30 29 20 62 79 74 65  POS_END (0) byte
10750 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
10760 20 30 20 62 79 74 65 20 69 73 20 70 72 65 63 65   0 byte is prece
10770 64 65 64 20 62 79 0a 20 20 2a 2a 20 61 20 62 79  ded by.  ** a by
10780 74 65 20 77 69 74 68 20 74 68 65 20 30 78 38 30  te with the 0x80
10790 20 62 69 74 20 73 65 74 2c 20 74 68 65 6e 20 69   bit set, then i
107a0 74 20 69 73 20 6e 6f 74 20 61 20 76 61 72 69 6e  t is not a varin
107b0 74 20 30 2c 20 62 75 74 20 74 68 65 20 74 61 69  t 0, but the tai
107c0 6c 0a 20 20 2a 2a 20 6f 66 20 73 6f 6d 65 20 6f  l.  ** of some o
107d0 74 68 65 72 2c 20 6d 75 6c 74 69 2d 62 79 74 65  ther, multi-byte
107e0 2c 20 76 61 6c 75 65 2e 0a 20 20 2a 2a 0a 20 20  , value..  **.  
107f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
10800 20 77 68 69 6c 65 2d 6c 6f 6f 70 20 6d 6f 76 65   while-loop move
10810 73 20 70 45 6e 64 20 74 6f 20 70 6f 69 6e 74 20  s pEnd to point 
10820 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
10830 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 0a 20  e that is not . 
10840 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   ** immediately 
10850 70 72 65 63 65 64 65 64 20 62 79 20 61 20 62 79  preceded by a by
10860 74 65 20 77 69 74 68 20 74 68 65 20 30 78 38 30  te with the 0x80
10870 20 62 69 74 20 73 65 74 2e 20 54 68 65 6e 20 69   bit set. Then i
10880 6e 63 72 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 70  ncrements.  ** p
10890 45 6e 64 20 6f 6e 63 65 20 6d 6f 72 65 20 73 6f  End once more so
108a0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
108b0 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65  to the byte imme
108c0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
108d0 67 20 74 68 65 0a 20 20 2a 2a 20 6c 61 73 74 20  g the.  ** last 
108e0 62 79 74 65 20 69 6e 20 74 68 65 20 70 6f 73 69  byte in the posi
108f0 74 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  tion-list..  */.
10900 20 20 77 68 69 6c 65 28 20 2a 70 45 6e 64 20 7c    while( *pEnd |
10910 20 63 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70   c ){.    c = *p
10920 45 6e 64 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20  End++ & 0x80;.  
10930 20 20 74 65 73 74 63 61 73 65 28 20 63 21 3d 30    testcase( c!=0
10940 20 26 26 20 28 2a 70 45 6e 64 29 3d 3d 30 20 29   && (*pEnd)==0 )
10950 3b 0a 20 20 7d 0a 20 20 70 45 6e 64 2b 2b 3b 20  ;.  }.  pEnd++; 
10960 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 61 73 74   /* Advance past
10970 20 74 68 65 20 50 4f 53 5f 45 4e 44 20 74 65 72   the POS_END ter
10980 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a  minator byte */.
10990 0a 20 20 69 66 28 20 70 70 20 29 7b 0a 20 20 20  .  if( pp ){.   
109a0 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70   int n = (int)(p
109b0 45 6e 64 20 2d 20 2a 70 70 50 6f 73 6c 69 73 74  End - *ppPoslist
109c0 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  );.    char *p =
109d0 20 2a 70 70 3b 0a 20 20 20 20 6d 65 6d 63 70 79   *pp;.    memcpy
109e0 28 70 2c 20 2a 70 70 50 6f 73 6c 69 73 74 2c 20  (p, *ppPoslist, 
109f0 6e 29 3b 0a 20 20 20 20 70 20 2b 3d 20 6e 3b 0a  n);.    p += n;.
10a00 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 7d      *pp = p;.  }
10a10 0a 20 20 2a 70 70 50 6f 73 6c 69 73 74 20 3d 20  .  *ppPoslist = 
10a20 70 45 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  pEnd;.}../*.** W
10a30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
10a40 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70  n is called, *pp
10a50 50 6f 73 6c 69 73 74 20 69 73 20 61 73 73 75 6d  Poslist is assum
10a60 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
10a70 68 65 20 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20  he .** start of 
10a80 61 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 20 41  a column-list. A
10a90 66 74 65 72 20 69 74 20 72 65 74 75 72 6e 73 2c  fter it returns,
10aa0 20 2a 70 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e   *ppPoslist poin
10ab0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 74 6f 20  ts to the.** to 
10ac0 74 68 65 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  the terminator (
10ad0 50 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f  POS_COLUMN or PO
10ae0 53 5f 45 4e 44 29 20 62 79 74 65 20 6f 66 20 74  S_END) byte of t
10af0 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 2e 0a  he column-list..
10b00 2a 2a 0a 2a 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c  **.** A column-l
10b10 69 73 74 20 69 73 20 6c 69 73 74 20 6f 66 20 64  ist is list of d
10b20 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 70 6f 73  elta-encoded pos
10b30 69 74 69 6f 6e 73 20 66 6f 72 20 61 20 73 69 6e  itions for a sin
10b40 67 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 77 69  gle column.** wi
10b50 74 68 69 6e 20 61 20 73 69 6e 67 6c 65 20 64 6f  thin a single do
10b60 63 75 6d 65 6e 74 20 77 69 74 68 69 6e 20 61 20  cument within a 
10b70 64 6f 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  doclist..**.** T
10b80 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69  he column-list i
10b90 73 20 74 65 72 6d 69 6e 61 74 65 64 20 65 69 74  s terminated eit
10ba0 68 65 72 20 62 79 20 61 20 50 4f 53 5f 43 4f 4c  her by a POS_COL
10bb0 55 4d 4e 20 76 61 72 69 6e 74 20 28 31 29 20 6f  UMN varint (1) o
10bc0 72 0a 2a 2a 20 61 20 50 4f 53 5f 45 4e 44 20 76  r.** a POS_END v
10bd0 61 72 69 6e 74 20 28 30 29 2e 20 20 54 68 69 73  arint (0).  This
10be0 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20   routine leaves 
10bf0 2a 70 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74  *ppPoslist point
10c00 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65 20 50 4f  ing to.** the PO
10c10 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53 5f  S_COLUMN or POS_
10c20 45 4e 44 20 74 68 61 74 20 74 65 72 6d 69 6e 61  END that termina
10c30 74 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c  tes the column-l
10c40 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ist..**.** If pp
10c50 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
10c60 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
10c70 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69  of the column-li
10c80 73 74 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  st are copied.**
10c90 20 74 6f 20 2a 70 70 2e 20 2a 70 70 20 69 73 20   to *pp. *pp is 
10ca0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
10cb0 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
10cc0 61 73 74 20 74 68 65 20 6c 61 73 74 20 62 79 74  ast the last byt
10cd0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 62 65 66 6f  e copied.** befo
10ce0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
10cf0 20 72 65 74 75 72 6e 73 2e 20 20 54 68 65 20 50   returns.  The P
10d00 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50 4f 53  OS_COLUMN or POS
10d10 5f 45 4e 44 20 74 65 72 6d 69 6e 61 74 6f 72 0a  _END terminator.
10d20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 70 69 65 64  ** is not copied
10d30 20 69 6e 74 6f 20 2a 70 70 2e 0a 2a 2f 0a 73 74   into *pp..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43 6f  atic void fts3Co
10d50 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 63 68 61  lumnlistCopy(cha
10d60 72 20 2a 2a 70 70 2c 20 63 68 61 72 20 2a 2a 70  r **pp, char **p
10d70 70 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61  pPoslist){.  cha
10d80 72 20 2a 70 45 6e 64 20 3d 20 2a 70 70 50 6f 73  r *pEnd = *ppPos
10d90 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20 3d  list;.  char c =
10da0 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6c 75   0;..  /* A colu
10db0 6d 6e 2d 6c 69 73 74 20 69 73 20 74 65 72 6d 69  mn-list is termi
10dc0 6e 61 74 65 64 20 62 79 20 65 69 74 68 65 72 20  nated by either 
10dd0 61 20 30 78 30 31 20 6f 72 20 30 78 30 30 20 62  a 0x01 or 0x00 b
10de0 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  yte that is.  **
10df0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
10e00 75 6c 74 69 2d 62 79 74 65 20 76 61 72 69 6e 74  ulti-byte varint
10e10 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
10e20 30 78 46 45 20 26 20 28 2a 70 45 6e 64 20 7c 20  0xFE & (*pEnd | 
10e30 63 29 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 70  c) ){.    c = *p
10e40 45 6e 64 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20  End++ & 0x80;.  
10e50 20 20 74 65 73 74 63 61 73 65 28 20 63 21 3d 30    testcase( c!=0
10e60 20 26 26 20 28 28 2a 70 45 6e 64 29 26 30 78 66   && ((*pEnd)&0xf
10e70 65 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  e)==0 );.  }.  i
10e80 66 28 20 70 70 20 29 7b 0a 20 20 20 20 69 6e 74  f( pp ){.    int
10e90 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 20   n = (int)(pEnd 
10ea0 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29 3b 0a 20  - *ppPoslist);. 
10eb0 20 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70     char *p = *pp
10ec0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
10ed0 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e 29 3b 0a  *ppPoslist, n);.
10ee0 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20 20 20 20      p += n;.    
10ef0 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 2a  *pp = p;.  }.  *
10f00 70 70 50 6f 73 6c 69 73 74 20 3d 20 70 45 6e 64  ppPoslist = pEnd
10f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65  ;.}../*.** Value
10f20 20 75 73 65 64 20 74 6f 20 73 69 67 6e 69 66 79   used to signify
10f30 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 70   the end of an p
10f40 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 54 68  osition-list. Th
10f50 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
10f60 73 65 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  se.** it is not 
10f70 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65  possible to have
10f80 20 61 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68   a document with
10f90 20 32 5e 33 31 20 74 65 72 6d 73 2e 0a 2a 2f 0a   2^31 terms..*/.
10fa0 23 64 65 66 69 6e 65 20 50 4f 53 49 54 49 4f 4e  #define POSITION
10fb0 5f 4c 49 53 54 5f 45 4e 44 20 30 78 37 66 66 66  _LIST_END 0x7fff
10fc0 66 66 66 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ffff../*.** This
10fd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
10fe0 64 20 74 6f 20 68 65 6c 70 20 70 61 72 73 65 20  d to help parse 
10ff0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 73 2e 20  position-lists. 
11000 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
11010 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
11020 20 2a 70 70 20 6d 61 79 20 70 6f 69 6e 74 20 74   *pp may point t
11030 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
11040 68 65 20 6e 65 78 74 20 76 61 72 69 6e 74 20 69  he next varint i
11050 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  n the position-l
11060 69 73 74 0a 2a 2a 20 62 65 69 6e 67 20 70 61 72  ist.** being par
11070 73 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 70  sed, or it may p
11080 6f 69 6e 74 20 74 6f 20 31 20 62 79 74 65 20 70  oint to 1 byte p
11090 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
110a0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
110b0 0a 2a 2a 20 28 69 6e 20 77 68 69 63 68 20 63 61  .** (in which ca
110c0 73 65 20 2a 2a 70 70 20 77 69 6c 6c 20 62 65 20  se **pp will be 
110d0 61 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  a terminator byt
110e0 65 73 20 50 4f 53 5f 45 4e 44 20 28 30 29 20 6f  es POS_END (0) o
110f0 72 0a 2a 2a 20 28 31 29 29 2e 0a 2a 2a 0a 2a 2a  r.** (1))..**.**
11100 20 49 66 20 2a 70 70 20 70 6f 69 6e 74 73 20 70   If *pp points p
11110 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
11120 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
11130 69 6f 6e 2d 6c 69 73 74 2c 20 73 65 74 20 2a 70  ion-list, set *p
11140 69 20 74 6f 20 0a 2a 2a 20 50 4f 53 49 54 49 4f  i to .** POSITIO
11150 4e 5f 4c 49 53 54 5f 45 4e 44 20 61 6e 64 20 72  N_LIST_END and r
11160 65 74 75 72 6e 2e 20 4f 74 68 65 72 77 69 73 65  eturn. Otherwise
11170 2c 20 72 65 61 64 20 74 68 65 20 6e 65 78 74 20  , read the next 
11180 76 61 72 69 6e 74 20 66 72 6f 6d 20 2a 70 70 2c  varint from *pp,
11190 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  .** increment th
111a0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
111b0 6f 66 20 2a 70 69 20 62 79 20 74 68 65 20 76 61  of *pi by the va
111c0 6c 75 65 20 72 65 61 64 2c 20 61 6e 64 20 73 65  lue read, and se
111d0 74 20 2a 70 70 20 74 6f 0a 2a 2a 20 70 6f 69 6e  t *pp to.** poin
111e0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61  t to the next va
111f0 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
11200 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ning..**.** Befo
11210 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
11220 72 6f 75 74 69 6e 65 20 2a 70 69 20 6d 75 73 74  routine *pi must
11230 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
11240 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  to the value of.
11250 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
11260 70 6f 73 69 74 69 6f 6e 2c 20 6f 72 20 7a 65 72  position, or zer
11270 6f 20 69 66 20 77 65 20 61 72 65 20 72 65 61 64  o if we are read
11280 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
11290 73 69 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  sition.** in the
112a0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20   position-list. 
112b0 20 42 65 63 61 75 73 65 20 70 6f 73 69 74 69 6f   Because positio
112c0 6e 73 20 61 72 65 20 64 65 6c 74 61 2d 65 6e 63  ns are delta-enc
112d0 6f 64 65 64 2c 20 74 68 65 20 76 61 6c 75 65 0a  oded, the value.
112e0 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  ** of the previo
112f0 75 73 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6e  us position is n
11300 65 65 64 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eeded in order t
11310 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61  o compute the va
11320 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  lue of.** the ne
11330 78 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  xt position..*/.
11340 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
11350 52 65 61 64 4e 65 78 74 50 6f 73 28 0a 20 20 63  ReadNextPos(.  c
11360 68 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20  har **pp,       
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11380 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
11390 69 6e 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  into position-li
113a0 73 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 73  st buffer */.  s
113b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
113d0 49 4e 2f 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  IN/OUT: Value re
113e0 61 64 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  ad from position
113f0 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 66  -list */.){.  if
11400 28 20 28 2a 2a 70 70 29 26 30 78 46 45 20 29 7b  ( (**pp)&0xFE ){
11410 0a 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74  .    fts3GetDelt
11420 61 56 61 72 69 6e 74 28 70 70 2c 20 70 69 29 3b  aVarint(pp, pi);
11430 0a 20 20 20 20 2a 70 69 20 2d 3d 20 32 3b 0a 20  .    *pi -= 2;. 
11440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 20   }else{.    *pi 
11450 3d 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  = POSITION_LIST_
11460 45 4e 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  END;.  }.}../*.*
11470 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
11480 43 6f 6c 20 69 73 20 6e 6f 74 20 30 2c 20 77 72  Col is not 0, wr
11490 69 74 65 20 61 6e 20 50 4f 53 5f 43 4f 4c 55 4d  ite an POS_COLUM
114a0 4e 20 28 31 29 20 62 79 74 65 20 66 6f 6c 6c 6f  N (1) byte follo
114b0 77 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 61  wed by.** the va
114c0 6c 75 65 20 6f 66 20 69 43 6f 6c 20 65 6e 63 6f  lue of iCol enco
114d0 64 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 20  ded as a varint 
114e0 74 6f 20 2a 70 70 2e 20 20 20 54 68 69 73 20 77  to *pp.   This w
114f0 69 6c 6c 20 73 74 61 72 74 20 61 20 6e 65 77 0a  ill start a new.
11500 2a 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a  ** column list..
11510 2a 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 20 74 6f  **.** Set *pp to
11520 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79   point to the by
11530 74 65 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  te just after th
11540 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
11550 74 65 6e 20 62 65 66 6f 72 65 20 0a 2a 2a 20 72  ten before .** r
11560 65 74 75 72 6e 69 6e 67 20 28 64 6f 20 6e 6f 74  eturning (do not
11570 20 6d 6f 64 69 66 79 20 69 74 20 69 66 20 69 43   modify it if iC
11580 6f 6c 3d 3d 30 29 2e 20 52 65 74 75 72 6e 20 74  ol==0). Return t
11590 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
115a0 6f 66 20 62 79 74 65 73 0a 2a 2a 20 77 72 69 74  of bytes.** writ
115b0 74 65 6e 20 28 30 20 69 66 20 69 43 6f 6c 3d 3d  ten (0 if iCol==
115c0 30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  0)..*/.static in
115d0 74 20 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62  t fts3PutColNumb
115e0 65 72 28 63 68 61 72 20 2a 2a 70 70 2c 20 69 6e  er(char **pp, in
115f0 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 6e  t iCol){.  int n
11600 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11620 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
11630 69 74 74 65 6e 20 2a 2f 0a 20 20 69 66 28 20 69  itten */.  if( i
11640 43 6f 6c 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Col ){.    char 
11650 2a 70 20 3d 20 2a 70 70 3b 20 20 20 20 20 20 20  *p = *pp;       
11660 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
11670 75 74 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ut pointer */.  
11680 20 20 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65    n = 1 + sqlite
11690 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26  3Fts3PutVarint(&
116a0 70 5b 31 5d 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  p[1], iCol);.   
116b0 20 2a 70 20 3d 20 30 78 30 31 3b 0a 20 20 20 20   *p = 0x01;.    
116c0 2a 70 70 20 3d 20 26 70 5b 6e 5d 3b 0a 20 20 7d  *pp = &p[n];.  }
116d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
116e0 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
116f0 65 20 75 6e 69 6f 6e 20 6f 66 20 74 77 6f 20 70  e union of two p
11700 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 20  osition lists.  
11710 54 68 65 20 6f 75 74 70 75 74 20 77 72 69 74 74  The output writt
11720 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 70 20 63  en.** into *pp c
11730 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 70 6f 73 69  ontains all posi
11740 74 69 6f 6e 73 20 6f 66 20 62 6f 74 68 20 2a 70  tions of both *p
11750 70 31 20 61 6e 64 20 2a 70 70 32 20 69 6e 20 73  p1 and *pp2 in s
11760 6f 72 74 65 64 0a 2a 2a 20 6f 72 64 65 72 20 61  orted.** order a
11770 6e 64 20 77 69 74 68 20 61 6e 79 20 64 75 70 6c  nd with any dupl
11780 69 63 61 74 65 73 20 72 65 6d 6f 76 65 64 2e 20  icates removed. 
11790 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 72   All pointers ar
117a0 65 0a 2a 2a 20 75 70 64 61 74 65 64 20 61 70 70  e.** updated app
117b0 72 6f 70 72 69 61 74 65 6c 79 2e 20 20 20 54 68  ropriately.   Th
117c0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
117d0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 73 75  onsible for insu
117e0 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
117f0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
11800 63 65 20 69 6e 20 2a 70 70 20 74 6f 20 68 6f 6c  ce in *pp to hol
11810 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6f  d the complete o
11820 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  utput..*/.static
11830 20 76 6f 69 64 20 66 74 73 33 50 6f 73 6c 69 73   void fts3Poslis
11840 74 4d 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a  tMerge(.  char *
11850 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
11860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
11870 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
11880 63 68 61 72 20 2a 2a 70 70 31 2c 20 20 20 20 20  char **pp1,     
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 2f 2a 20 4c 65 66 74 20 69 6e 70 75 74 20 6c 69  /* Left input li
118b0 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  st */.  char **p
118c0 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
118d0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
118e0 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29   input list */.)
118f0 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70  {.  char *p = *p
11900 70 3b 0a 20 20 63 68 61 72 20 2a 70 31 20 3d 20  p;.  char *p1 = 
11910 2a 70 70 31 3b 0a 20 20 63 68 61 72 20 2a 70 32  *pp1;.  char *p2
11920 20 3d 20 2a 70 70 32 3b 0a 0a 20 20 77 68 69 6c   = *pp2;..  whil
11930 65 28 20 2a 70 31 20 7c 7c 20 2a 70 32 20 29 7b  e( *p1 || *p2 ){
11940 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 31 3b 20  .    int iCol1; 
11950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
11960 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e  urrent column in
11970 64 65 78 20 69 6e 20 70 70 31 20 2a 2f 0a 20 20  dex in pp1 */.  
11980 20 20 69 6e 74 20 69 43 6f 6c 32 3b 20 20 20 20    int iCol2;    
11990 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
119a0 65 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  ent column index
119b0 20 69 6e 20 70 70 32 20 2a 2f 0a 0a 20 20 20 20   in pp2 */..    
119c0 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f 43 4f 4c  if( *p1==POS_COL
119d0 55 4d 4e 20 29 20 66 74 73 33 47 65 74 56 61 72  UMN ) fts3GetVar
119e0 69 6e 74 33 32 28 26 70 31 5b 31 5d 2c 20 26 69  int32(&p1[1], &i
119f0 43 6f 6c 31 29 3b 0a 20 20 20 20 65 6c 73 65 20  Col1);.    else 
11a00 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f 45 4e 44  if( *p1==POS_END
11a10 20 29 20 69 43 6f 6c 31 20 3d 20 50 4f 53 49 54   ) iCol1 = POSIT
11a20 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b 0a 20 20  ION_LIST_END;.  
11a30 20 20 65 6c 73 65 20 69 43 6f 6c 31 20 3d 20 30    else iCol1 = 0
11a40 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 32 3d 3d  ;..    if( *p2==
11a50 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 20 66 74 73  POS_COLUMN ) fts
11a60 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 32  3GetVarint32(&p2
11a70 5b 31 5d 2c 20 26 69 43 6f 6c 32 29 3b 0a 20 20  [1], &iCol2);.  
11a80 20 20 65 6c 73 65 20 69 66 28 20 2a 70 32 3d 3d    else if( *p2==
11a90 50 4f 53 5f 45 4e 44 20 29 20 69 43 6f 6c 32 20  POS_END ) iCol2 
11aa0 3d 20 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  = POSITION_LIST_
11ab0 45 4e 44 3b 0a 20 20 20 20 65 6c 73 65 20 69 43  END;.    else iC
11ac0 6f 6c 32 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ol2 = 0;..    if
11ad0 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c 32 20 29  ( iCol1==iCol2 )
11ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
11af0 69 6e 74 36 34 20 69 31 20 3d 20 30 3b 20 20 20  int64 i1 = 0;   
11b00 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 69      /* Last posi
11b10 74 69 6f 6e 20 66 72 6f 6d 20 70 70 31 20 2a 2f  tion from pp1 */
11b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
11b30 6e 74 36 34 20 69 32 20 3d 20 30 3b 20 20 20 20  nt64 i2 = 0;    
11b40 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 69 74     /* Last posit
11b50 69 6f 6e 20 66 72 6f 6d 20 70 70 32 20 2a 2f 0a  ion from pp2 */.
11b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
11b70 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20  t64 iPrev = 0;. 
11b80 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 66 74 73       int n = fts
11b90 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28 26 70  3PutColNumber(&p
11ba0 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20  , iCol1);.      
11bb0 70 31 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 70  p1 += n;.      p
11bc0 32 20 2b 3d 20 6e 3b 0a 0a 20 20 20 20 20 20 2f  2 += n;..      /
11bd0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
11be0 20 62 6f 74 68 20 70 31 20 61 6e 64 20 70 32 20   both p1 and p2 
11bf0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61  point to the sta
11c00 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d 6c 69 73  rt of column-lis
11c10 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ts.      ** for 
11c20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
11c30 28 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 74 68  (the column with
11c40 20 69 6e 64 65 78 20 69 43 6f 6c 31 20 61 6e 64   index iCol1 and
11c50 20 69 43 6f 6c 32 29 2e 0a 20 20 20 20 20 20 2a   iCol2)..      *
11c60 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  * A column-list 
11c70 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 6f 6e  is a list of non
11c80 2d 6e 65 67 61 74 69 76 65 20 64 65 6c 74 61 2d  -negative delta-
11c90 65 6e 63 6f 64 65 64 20 76 61 72 69 6e 74 73 2c  encoded varints,
11ca0 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a 20   each .      ** 
11cb0 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 32  incremented by 2
11cc0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 73 74   before being st
11cd0 6f 72 65 64 2e 20 45 61 63 68 20 6c 69 73 74 20  ored. Each list 
11ce0 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  is terminated by
11cf0 20 61 0a 20 20 20 20 20 20 2a 2a 20 50 4f 53 5f   a.      ** POS_
11d00 45 4e 44 20 28 30 29 20 6f 72 20 50 4f 53 5f 43  END (0) or POS_C
11d10 4f 4c 55 4d 4e 20 28 31 29 2e 20 54 68 65 20 66  OLUMN (1). The f
11d20 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
11d30 65 72 67 65 73 20 74 68 65 20 74 77 6f 20 6c 69  erges the two li
11d40 73 74 73 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  sts.      ** and
11d50 20 77 72 69 74 65 73 20 74 68 65 20 72 65 73 75   writes the resu
11d60 6c 74 73 20 74 6f 20 62 75 66 66 65 72 20 70 2e  lts to buffer p.
11d70 20 70 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74   p is left point
11d80 69 6e 67 20 74 6f 20 74 68 65 20 62 79 74 65 0a  ing to the byte.
11d90 20 20 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74        ** after t
11da0 68 65 20 6c 69 73 74 20 77 72 69 74 74 65 6e 2e  he list written.
11db0 20 4e 6f 20 74 65 72 6d 69 6e 61 74 6f 72 20 28   No terminator (
11dc0 50 4f 53 5f 45 4e 44 20 6f 72 20 50 4f 53 5f 43  POS_END or POS_C
11dd0 4f 4c 55 4d 4e 29 20 69 73 0a 20 20 20 20 20 20  OLUMN) is.      
11de0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
11df0 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  e output..      
11e00 2a 2f 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  */.      fts3Get
11e10 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 31 2c  DeltaVarint(&p1,
11e20 20 26 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73   &i1);.      fts
11e30 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28  3GetDeltaVarint(
11e40 26 70 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 20  &p2, &i2);.     
11e50 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 66 74   do {.        ft
11e60 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74  s3PutDeltaVarint
11e70 28 26 70 2c 20 26 69 50 72 65 76 2c 20 28 69 31  (&p, &iPrev, (i1
11e80 3c 69 32 29 20 3f 20 69 31 20 3a 20 69 32 29 3b  <i2) ? i1 : i2);
11e90 20 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 20   .        iPrev 
11ea0 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 69 66  -= 2;.        if
11eb0 28 20 69 31 3d 3d 69 32 20 29 7b 0a 20 20 20 20  ( i1==i2 ){.    
11ec0 20 20 20 20 20 20 66 74 73 33 52 65 61 64 4e 65        fts3ReadNe
11ed0 78 74 50 6f 73 28 26 70 31 2c 20 26 69 31 29 3b  xtPos(&p1, &i1);
11ee0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 52  .          fts3R
11ef0 65 61 64 4e 65 78 74 50 6f 73 28 26 70 32 2c 20  eadNextPos(&p2, 
11f00 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  &i2);.        }e
11f10 6c 73 65 20 69 66 28 20 69 31 3c 69 32 20 29 7b  lse if( i1<i2 ){
11f20 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33 52  .          fts3R
11f30 65 61 64 4e 65 78 74 50 6f 73 28 26 70 31 2c 20  eadNextPos(&p1, 
11f40 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  &i1);.        }e
11f50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
11f60 74 73 33 52 65 61 64 4e 65 78 74 50 6f 73 28 26  ts3ReadNextPos(&
11f70 70 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 20 20  p2, &i2);.      
11f80 20 20 7d 0a 20 20 20 20 20 20 7d 77 68 69 6c 65    }.      }while
11f90 28 20 69 31 21 3d 50 4f 53 49 54 49 4f 4e 5f 4c  ( i1!=POSITION_L
11fa0 49 53 54 5f 45 4e 44 20 7c 7c 20 69 32 21 3d 50  IST_END || i2!=P
11fb0 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44  OSITION_LIST_END
11fc0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
11fd0 28 20 69 43 6f 6c 31 3c 69 43 6f 6c 32 20 29 7b  ( iCol1<iCol2 ){
11fe0 0a 20 20 20 20 20 20 70 31 20 2b 3d 20 66 74 73  .      p1 += fts
11ff0 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72 28 26 70  3PutColNumber(&p
12000 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20  , iCol1);.      
12010 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f  fts3ColumnlistCo
12020 70 79 28 26 70 2c 20 26 70 31 29 3b 0a 20 20 20  py(&p, &p1);.   
12030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 32   }else{.      p2
12040 20 2b 3d 20 66 74 73 33 50 75 74 43 6f 6c 4e 75   += fts3PutColNu
12050 6d 62 65 72 28 26 70 2c 20 69 43 6f 6c 32 29 3b  mber(&p, iCol2);
12060 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75 6d  .      fts3Colum
12070 6e 6c 69 73 74 43 6f 70 79 28 26 70 2c 20 26 70  nlistCopy(&p, &p
12080 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  2);.    }.  }.. 
12090 20 2a 70 2b 2b 20 3d 20 50 4f 53 5f 45 4e 44 3b   *p++ = POS_END;
120a0 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 2a 70  .  *pp = p;.  *p
120b0 70 31 20 3d 20 70 31 20 2b 20 31 3b 0a 20 20 2a  p1 = p1 + 1;.  *
120c0 70 70 32 20 3d 20 70 32 20 2b 20 31 3b 0a 7d 0a  pp2 = p2 + 1;.}.
120d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
120e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
120f0 6d 65 72 67 65 20 74 77 6f 20 70 6f 73 69 74 69  merge two positi
12100 6f 6e 20 6c 69 73 74 73 20 69 6e 74 6f 20 6f 6e  on lists into on
12110 65 2e 20 57 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e. When it is.**
12120 20 63 61 6c 6c 65 64 2c 20 2a 70 70 31 20 61 6e   called, *pp1 an
12130 64 20 2a 70 70 32 20 6d 75 73 74 20 62 6f 74 68  d *pp2 must both
12140 20 70 6f 69 6e 74 20 74 6f 20 70 6f 73 69 74 69   point to positi
12150 6f 6e 20 6c 69 73 74 73 2e 20 41 20 70 6f 73 69  on lists. A posi
12160 74 69 6f 6e 2d 6c 69 73 74 20 69 73 0a 2a 2a 20  tion-list is.** 
12170 74 68 65 20 70 61 72 74 20 6f 66 20 61 20 64 6f  the part of a do
12180 63 6c 69 73 74 20 74 68 61 74 20 66 6f 6c 6c 6f  clist that follo
12190 77 73 20 65 61 63 68 20 64 6f 63 75 6d 65 6e 74  ws each document
121a0 20 69 64 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65   id. For example
121b0 2c 20 69 66 20 61 20 72 6f 77 0a 2a 2a 20 63 6f  , if a row.** co
121c0 6e 74 61 69 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ntains:.**.**   
121d0 20 20 27 61 20 62 20 63 27 7c 27 78 20 79 20 7a    'a b c'|'x y z
121e0 27 7c 27 61 20 62 20 62 20 61 27 0a 2a 2a 0a 2a  '|'a b b a'.**.*
121f0 2a 20 54 68 65 6e 20 74 68 65 20 70 6f 73 69 74  * Then the posit
12200 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 74 68 69  ion list for thi
12210 73 20 72 6f 77 20 66 6f 72 20 74 6f 6b 65 6e 20  s row for token 
12220 27 62 27 20 77 6f 75 6c 64 20 63 6f 6e 73 69 73  'b' would consis
12230 74 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  t of:.**.**     
12240 30 78 30 32 20 30 78 30 31 20 30 78 30 32 20 30  0x02 0x01 0x02 0
12250 78 30 33 20 30 78 30 33 20 30 78 30 30 0a 2a 2a  x03 0x03 0x00.**
12260 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
12270 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
12280 62 6f 74 68 20 2a 70 70 31 20 61 6e 64 20 2a 70  both *pp1 and *p
12290 70 32 20 61 72 65 20 6c 65 66 74 20 70 6f 69 6e  p2 are left poin
122a0 74 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 62  ting to the.** b
122b0 79 74 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  yte following th
122c0 65 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  e 0x00 terminato
122d0 72 20 6f 66 20 74 68 65 69 72 20 72 65 73 70 65  r of their respe
122e0 63 74 69 76 65 20 70 6f 73 69 74 69 6f 6e 20 6c  ctive position l
122f0 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ists..**.** If i
12300 73 53 61 76 65 4c 65 66 74 20 69 73 20 30 2c 20  sSaveLeft is 0, 
12310 61 6e 20 65 6e 74 72 79 20 69 73 20 61 64 64 65  an entry is adde
12320 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
12330 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
12340 72 20 0a 2a 2a 20 65 61 63 68 20 70 6f 73 69 74  r .** each posit
12350 69 6f 6e 20 69 6e 20 2a 70 70 32 20 66 6f 72 20  ion in *pp2 for 
12360 77 68 69 63 68 20 74 68 65 72 65 20 65 78 69 73  which there exis
12370 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70  ts one or more p
12380 6f 73 69 74 69 6f 6e 73 20 69 6e 0a 2a 2a 20 2a  ositions in.** *
12390 70 70 31 20 73 6f 20 74 68 61 74 20 28 70 6f 73  pp1 so that (pos
123a0 28 2a 70 70 32 29 3e 70 6f 73 28 2a 70 70 31 29  (*pp2)>pos(*pp1)
123b0 20 26 26 20 70 6f 73 28 2a 70 70 32 29 2d 70 6f   && pos(*pp2)-po
123c0 73 28 2a 70 70 31 29 3c 3d 6e 54 6f 6b 65 6e 29  s(*pp1)<=nToken)
123d0 2e 20 69 2e 65 2e 0a 2a 2a 20 77 68 65 6e 20 74  . i.e..** when t
123e0 68 65 20 2a 70 70 31 20 74 6f 6b 65 6e 20 61 70  he *pp1 token ap
123f0 70 65 61 72 73 20 62 65 66 6f 72 65 20 74 68 65  pears before the
12400 20 2a 70 70 32 20 74 6f 6b 65 6e 2c 20 62 75 74   *pp2 token, but
12410 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61 6e 20 6e   not more than n
12420 54 6f 6b 65 6e 0a 2a 2a 20 73 6c 6f 74 73 20 62  Token.** slots b
12430 65 66 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  efore it..**.** 
12440 65 2e 67 2e 20 6e 54 6f 6b 65 6e 3d 3d 31 20 73  e.g. nToken==1 s
12450 65 61 72 63 68 65 73 20 66 6f 72 20 61 64 6a 61  earches for adja
12460 63 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 2e 0a  cent positions..
12470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
12480 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d  s3PoslistPhraseM
12490 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 2a 70  erge(.  char **p
124a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
124b0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
124c0 54 3a 20 50 72 65 61 6c 6c 6f 63 61 74 65 64 20  T: Preallocated 
124d0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
124e0 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20  .  int nToken,  
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 64 69     /* Maximum di
12510 66 66 65 72 65 6e 63 65 20 69 6e 20 74 6f 6b 65  fference in toke
12520 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a 2f 0a 20  n positions */. 
12530 20 69 6e 74 20 69 73 53 61 76 65 4c 65 66 74 2c   int isSaveLeft,
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 2f 2a 20 53 61 76 65 20 74 68 65 20 6c 65 66   /* Save the lef
12560 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20  t position */.  
12570 69 6e 74 20 69 73 45 78 61 63 74 2c 20 20 20 20  int isExact,    
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 2f 2a 20 49 66 20 2a 70 70 31 20 69 73 20 65 78  /* If *pp1 is ex
125a0 61 63 74 6c 79 20 6e 54 6f 6b 65 6e 73 20 62 65  actly nTokens be
125b0 66 6f 72 65 20 2a 70 70 32 20 2a 2f 0a 20 20 63  fore *pp2 */.  c
125c0 68 61 72 20 2a 2a 70 70 31 2c 20 20 20 20 20 20  har **pp1,      
125d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125e0 2a 20 49 4e 2f 4f 55 54 3a 20 4c 65 66 74 20 69  * IN/OUT: Left i
125f0 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 20 20 63  nput list */.  c
12600 68 61 72 20 2a 2a 70 70 32 20 20 20 20 20 20 20  har **pp2       
12610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12620 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 67 68 74 20  * IN/OUT: Right 
12630 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b  input list */.){
12640 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70  .  char *p = *pp
12650 3b 0a 20 20 63 68 61 72 20 2a 70 31 20 3d 20 2a  ;.  char *p1 = *
12660 70 70 31 3b 0a 20 20 63 68 61 72 20 2a 70 32 20  pp1;.  char *p2 
12670 3d 20 2a 70 70 32 3b 0a 20 20 69 6e 74 20 69 43  = *pp2;.  int iC
12680 6f 6c 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ol1 = 0;.  int i
12690 43 6f 6c 32 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Col2 = 0;..  /* 
126a0 4e 65 76 65 72 20 73 65 74 20 62 6f 74 68 20 69  Never set both i
126b0 73 53 61 76 65 4c 65 66 74 20 61 6e 64 20 69 73  sSaveLeft and is
126c0 45 78 61 63 74 20 66 6f 72 20 74 68 65 20 73 61  Exact for the sa
126d0 6d 65 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 2a  me invocation. *
126e0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
126f0 76 65 4c 65 66 74 3d 3d 30 20 7c 7c 20 69 73 45  veLeft==0 || isE
12700 78 61 63 74 3d 3d 30 20 29 3b 0a 0a 20 20 61 73  xact==0 );..  as
12710 73 65 72 74 28 20 70 21 3d 30 20 26 26 20 2a 70  sert( p!=0 && *p
12720 31 21 3d 30 20 26 26 20 2a 70 32 21 3d 30 20 29  1!=0 && *p2!=0 )
12730 3b 0a 20 20 69 66 28 20 2a 70 31 3d 3d 50 4f 53  ;.  if( *p1==POS
12740 5f 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20 20 20 20  _COLUMN ){ .    
12750 70 31 2b 2b 3b 0a 20 20 20 20 70 31 20 2b 3d 20  p1++;.    p1 += 
12760 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
12770 70 31 2c 20 26 69 43 6f 6c 31 29 3b 0a 20 20 7d  p1, &iCol1);.  }
12780 0a 20 20 69 66 28 20 2a 70 32 3d 3d 50 4f 53 5f  .  if( *p2==POS_
12790 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20 20 20 20 70  COLUMN ){ .    p
127a0 32 2b 2b 3b 0a 20 20 20 20 70 32 20 2b 3d 20 66  2++;.    p2 += f
127b0 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
127c0 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20 20 7d 0a  2, &iCol2);.  }.
127d0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
127e0 20 20 20 69 66 28 20 69 43 6f 6c 31 3d 3d 69 43     if( iCol1==iC
127f0 6f 6c 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ol2 ){.      cha
12800 72 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20 20  r *pSave = p;.  
12810 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12820 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  4 iPrev = 0;.   
12830 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
12840 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20   iPos1 = 0;.    
12850 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12860 69 50 6f 73 32 20 3d 20 30 3b 0a 0a 20 20 20 20  iPos2 = 0;..    
12870 20 20 69 66 28 20 69 43 6f 6c 31 20 29 7b 0a 20    if( iCol1 ){. 
12880 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d 20 50 4f         *p++ = PO
12890 53 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  S_COLUMN;.      
128a0 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    p += sqlite3Ft
128b0 73 33 50 75 74 56 61 72 69 6e 74 28 70 2c 20 69  s3PutVarint(p, i
128c0 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Col1);.      }..
128d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
128e0 31 21 3d 50 4f 53 5f 45 4e 44 20 26 26 20 2a 70  1!=POS_END && *p
128f0 31 21 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 3b  1!=POS_COLUMN );
12900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
12910 70 32 21 3d 50 4f 53 5f 45 4e 44 20 26 26 20 2a  p2!=POS_END && *
12920 70 32 21 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29  p2!=POS_COLUMN )
12930 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44  ;.      fts3GetD
12940 65 6c 74 61 56 61 72 69 6e 74 28 26 70 31 2c 20  eltaVarint(&p1, 
12950 26 69 50 6f 73 31 29 3b 20 69 50 6f 73 31 20 2d  &iPos1); iPos1 -
12960 3d 20 32 3b 0a 20 20 20 20 20 20 66 74 73 33 47  = 2;.      fts3G
12970 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70  etDeltaVarint(&p
12980 32 2c 20 26 69 50 6f 73 32 29 3b 20 69 50 6f 73  2, &iPos2); iPos
12990 32 20 2d 3d 20 32 3b 0a 0a 20 20 20 20 20 20 77  2 -= 2;..      w
129a0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
129b0 20 20 20 69 66 28 20 69 50 6f 73 32 3d 3d 69 50     if( iPos2==iP
129c0 6f 73 31 2b 6e 54 6f 6b 65 6e 20 0a 20 20 20 20  os1+nToken .    
129d0 20 20 20 20 20 7c 7c 20 28 69 73 45 78 61 63 74       || (isExact
129e0 3d 3d 30 20 26 26 20 69 50 6f 73 32 3e 69 50 6f  ==0 && iPos2>iPo
129f0 73 31 20 26 26 20 69 50 6f 73 32 3c 3d 69 50 6f  s1 && iPos2<=iPo
12a00 73 31 2b 6e 54 6f 6b 65 6e 29 20 0a 20 20 20 20  s1+nToken) .    
12a10 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12a20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
12a30 53 61 76 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Save;.          
12a40 69 53 61 76 65 20 3d 20 69 73 53 61 76 65 4c 65  iSave = isSaveLe
12a50 66 74 20 3f 20 69 50 6f 73 31 20 3a 20 69 50 6f  ft ? iPos1 : iPo
12a60 73 32 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  s2;.          ft
12a70 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74  s3PutDeltaVarint
12a80 28 26 70 2c 20 26 69 50 72 65 76 2c 20 69 53 61  (&p, &iPrev, iSa
12a90 76 65 2b 32 29 3b 20 69 50 72 65 76 20 2d 3d 20  ve+2); iPrev -= 
12aa0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 61  2;.          pSa
12ab0 76 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ve = 0;.        
12ac0 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
12ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ae0 20 69 66 28 20 28 21 69 73 53 61 76 65 4c 65 66   if( (!isSaveLef
12af0 74 20 26 26 20 69 50 6f 73 32 3c 3d 28 69 50 6f  t && iPos2<=(iPo
12b00 73 31 2b 6e 54 6f 6b 65 6e 29 29 20 7c 7c 20 69  s1+nToken)) || i
12b10 50 6f 73 32 3c 3d 69 50 6f 73 31 20 29 7b 0a 20  Pos2<=iPos1 ){. 
12b20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 2a 70           if( (*p
12b30 32 26 30 78 46 45 29 3d 3d 30 20 29 20 62 72 65  2&0xFE)==0 ) bre
12b40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  ak;.          ft
12b50 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
12b60 28 26 70 32 2c 20 26 69 50 6f 73 32 29 3b 20 69  (&p2, &iPos2); i
12b70 50 6f 73 32 20 2d 3d 20 32 3b 0a 20 20 20 20 20  Pos2 -= 2;.     
12b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b90 20 20 20 20 69 66 28 20 28 2a 70 31 26 30 78 46      if( (*p1&0xF
12ba0 45 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  E)==0 ) break;. 
12bb0 20 20 20 20 20 20 20 20 20 66 74 73 33 47 65 74           fts3Get
12bc0 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70 31 2c  DeltaVarint(&p1,
12bd0 20 26 69 50 6f 73 31 29 3b 20 69 50 6f 73 31 20   &iPos1); iPos1 
12be0 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  -= 2;.        }.
12bf0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
12c00 66 28 20 70 53 61 76 65 20 29 7b 0a 20 20 20 20  f( pSave ){.    
12c10 20 20 20 20 61 73 73 65 72 74 28 20 70 70 20 26      assert( pp &
12c20 26 20 70 20 29 3b 0a 20 20 20 20 20 20 20 20 70  & p );.        p
12c30 20 3d 20 70 53 61 76 65 3b 0a 20 20 20 20 20 20   = pSave;.      
12c40 7d 0a 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c  }..      fts3Col
12c50 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  umnlistCopy(0, &
12c60 70 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 43  p1);.      fts3C
12c70 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c  olumnlistCopy(0,
12c80 20 26 70 32 29 3b 0a 20 20 20 20 20 20 61 73 73   &p2);.      ass
12c90 65 72 74 28 20 28 2a 70 31 26 30 78 46 45 29 3d  ert( (*p1&0xFE)=
12ca0 3d 30 20 26 26 20 28 2a 70 32 26 30 78 46 45 29  =0 && (*p2&0xFE)
12cb0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
12cc0 20 30 3d 3d 2a 70 31 20 7c 7c 20 30 3d 3d 2a 70   0==*p1 || 0==*p
12cd0 32 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  2 ) break;..    
12ce0 20 20 70 31 2b 2b 3b 0a 20 20 20 20 20 20 70 31    p1++;.      p1
12cf0 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e   += fts3GetVarin
12d00 74 33 32 28 70 31 2c 20 26 69 43 6f 6c 31 29 3b  t32(p1, &iCol1);
12d10 0a 20 20 20 20 20 20 70 32 2b 2b 3b 0a 20 20 20  .      p2++;.   
12d20 20 20 20 70 32 20 2b 3d 20 66 74 73 33 47 65 74     p2 += fts3Get
12d30 56 61 72 69 6e 74 33 32 28 70 32 2c 20 26 69 43  Varint32(p2, &iC
12d40 6f 6c 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ol2);.    }..   
12d50 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e   /* Advance poin
12d60 74 65 72 20 70 31 20 6f 72 20 70 32 20 28 77 68  ter p1 or p2 (wh
12d70 69 63 68 65 76 65 72 20 63 6f 72 72 65 73 70 6f  ichever correspo
12d80 6e 64 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c  nds to the small
12d90 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 43 6f  er of.    ** iCo
12da0 6c 31 20 61 6e 64 20 69 43 6f 6c 32 29 20 73 6f  l1 and iCol2) so
12db0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
12dc0 74 6f 20 65 69 74 68 65 72 20 74 68 65 20 30 78  to either the 0x
12dd0 30 30 20 74 68 61 74 20 6d 61 72 6b 73 20 74 68  00 that marks th
12de0 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
12df0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
12e00 74 2c 20 6f 72 20 74 68 65 20 30 78 30 31 20 74  t, or the 0x01 t
12e10 68 61 74 20 70 72 65 63 65 64 65 73 20 74 68 65  hat precedes the
12e20 20 6e 65 78 74 20 0a 20 20 20 20 2a 2a 20 63 6f   next .    ** co
12e30 6c 75 6d 6e 2d 6e 75 6d 62 65 72 20 69 6e 20 74  lumn-number in t
12e40 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
12e50 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c  . .    */.    el
12e60 73 65 20 69 66 28 20 69 43 6f 6c 31 3c 69 43 6f  se if( iCol1<iCo
12e70 6c 32 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33  l2 ){.      fts3
12e80 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30  ColumnlistCopy(0
12e90 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 69 66  , &p1);.      if
12ea0 28 20 30 3d 3d 2a 70 31 20 29 20 62 72 65 61 6b  ( 0==*p1 ) break
12eb0 3b 0a 20 20 20 20 20 20 70 31 2b 2b 3b 0a 20 20  ;.      p1++;.  
12ec0 20 20 20 20 70 31 20 2b 3d 20 66 74 73 33 47 65      p1 += fts3Ge
12ed0 74 56 61 72 69 6e 74 33 32 28 70 31 2c 20 26 69  tVarint32(p1, &i
12ee0 43 6f 6c 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Col1);.    }else
12ef0 7b 0a 20 20 20 20 20 20 66 74 73 33 43 6f 6c 75  {.      fts3Colu
12f00 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
12f10 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  2);.      if( 0=
12f20 3d 2a 70 32 20 29 20 62 72 65 61 6b 3b 0a 20 20  =*p2 ) break;.  
12f30 20 20 20 20 70 32 2b 2b 3b 0a 20 20 20 20 20 20      p2++;.      
12f40 70 32 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72  p2 += fts3GetVar
12f50 69 6e 74 33 32 28 70 32 2c 20 26 69 43 6f 6c 32  int32(p2, &iCol2
12f60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
12f70 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28  fts3PoslistCopy(
12f80 30 2c 20 26 70 32 29 3b 0a 20 20 66 74 73 33 50  0, &p2);.  fts3P
12f90 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  oslistCopy(0, &p
12fa0 31 29 3b 0a 20 20 2a 70 70 31 20 3d 20 70 31 3b  1);.  *pp1 = p1;
12fb0 0a 20 20 2a 70 70 32 20 3d 20 70 32 3b 0a 20 20  .  *pp2 = p2;.  
12fc0 69 66 28 20 2a 70 70 3d 3d 70 20 29 7b 0a 20 20  if( *pp==p ){.  
12fd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
12fe0 20 20 2a 70 2b 2b 20 3d 20 30 78 30 30 3b 0a 20    *p++ = 0x00;. 
12ff0 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72 65 74 75   *pp = p;.  retu
13000 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 1;.}../*.** M
13010 65 72 67 65 20 74 77 6f 20 70 6f 73 69 74 69 6f  erge two positio
13020 6e 2d 6c 69 73 74 73 20 61 73 20 72 65 71 75 69  n-lists as requi
13030 72 65 64 20 62 79 20 74 68 65 20 4e 45 41 52 20  red by the NEAR 
13040 6f 70 65 72 61 74 6f 72 2e 20 54 68 65 20 61 72  operator. The ar
13050 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 73 69 74 69  gument.** positi
13060 6f 6e 20 6c 69 73 74 73 20 63 6f 72 72 65 73 70  on lists corresp
13070 6f 6e 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ond to the left 
13080 61 6e 64 20 72 69 67 68 74 20 70 68 72 61 73 65  and right phrase
13090 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
130a0 6f 6e 20 0a 2a 2a 20 6c 69 6b 65 3a 0a 2a 2a 0a  on .** like:.**.
130b0 2a 2a 20 20 20 20 20 22 70 68 72 61 73 65 20 31  **     "phrase 1
130c0 22 20 4e 45 41 52 20 22 70 68 72 61 73 65 20 6e  " NEAR "phrase n
130d0 75 6d 62 65 72 20 32 22 0a 2a 2a 0a 2a 2a 20 50  umber 2".**.** P
130e0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 70 70  osition list *pp
130f0 31 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  1 corresponds to
13100 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   the left-hand s
13110 69 64 65 20 6f 66 20 74 68 65 20 4e 45 41 52 20  ide of the NEAR 
13120 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61  .** expression a
13130 6e 64 20 2a 70 70 32 20 74 6f 20 74 68 65 20 72  nd *pp2 to the r
13140 69 67 68 74 2e 20 41 73 20 75 73 75 61 6c 2c 20  ight. As usual, 
13150 74 68 65 20 69 6e 64 65 78 65 73 20 69 6e 20 74  the indexes in t
13160 68 65 20 70 6f 73 69 74 69 6f 6e 20 0a 2a 2a 20  he position .** 
13170 6c 69 73 74 73 20 61 72 65 20 74 68 65 20 6f 66  lists are the of
13180 66 73 65 74 73 20 6f 66 20 74 68 65 20 6c 61 73  fsets of the las
13190 74 20 74 6f 6b 65 6e 20 69 6e 20 65 61 63 68 20  t token in each 
131a0 70 68 72 61 73 65 20 28 74 6f 6b 65 6e 73 20 22  phrase (tokens "
131b0 31 22 20 61 6e 64 20 22 32 22 20 0a 2a 2a 20 69  1" and "2" .** i
131c0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
131d0 6f 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ove)..**.** The 
131e0 6f 75 74 70 75 74 20 70 6f 73 69 74 69 6f 6e 20  output position 
131f0 6c 69 73 74 20 2d 20 77 72 69 74 74 65 6e 20 74  list - written t
13200 6f 20 2a 70 70 20 2d 20 69 73 20 61 20 63 6f 70  o *pp - is a cop
13210 79 20 6f 66 20 2a 70 70 32 20 77 69 74 68 20 74  y of *pp2 with t
13220 68 6f 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  hose.** entries 
13230 74 68 61 74 20 61 72 65 20 6e 6f 74 20 73 75 66  that are not suf
13240 66 69 63 69 65 6e 74 6c 79 20 4e 45 41 52 20 65  ficiently NEAR e
13250 6e 74 72 69 65 73 20 69 6e 20 2a 70 70 31 20 72  ntries in *pp1 r
13260 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  emoved..*/.stati
13270 63 20 69 6e 74 20 66 74 73 33 50 6f 73 6c 69 73  c int fts3Poslis
13280 74 4e 65 61 72 4d 65 72 67 65 28 0a 20 20 63 68  tNearMerge(.  ch
13290 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  ar **pp,        
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132b0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
132c0 2f 0a 20 20 63 68 61 72 20 2a 61 54 6d 70 2c 20  /.  char *aTmp, 
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
132f0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f   buffer space */
13300 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c 20 20  .  int nRight,  
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 64 69     /* Maximum di
13330 66 66 65 72 65 6e 63 65 20 69 6e 20 74 6f 6b 65  fference in toke
13340 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a 2f 0a 20  n positions */. 
13350 20 69 6e 74 20 6e 4c 65 66 74 2c 20 20 20 20 20   int nLeft,     
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 64 69 66 66   /* Maximum diff
13380 65 72 65 6e 63 65 20 69 6e 20 74 6f 6b 65 6e 20  erence in token 
13390 70 6f 73 69 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  positions */.  c
133a0 68 61 72 20 2a 2a 70 70 31 2c 20 20 20 20 20 20  har **pp1,      
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133c0 2a 20 49 4e 2f 4f 55 54 3a 20 4c 65 66 74 20 69  * IN/OUT: Left i
133d0 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 20 20 63  nput list */.  c
133e0 68 61 72 20 2a 2a 70 70 32 20 20 20 20 20 20 20  har **pp2       
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13400 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 67 68 74 20  * IN/OUT: Right 
13410 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a 29 7b  input list */.){
13420 0a 20 20 63 68 61 72 20 2a 70 31 20 3d 20 2a 70  .  char *p1 = *p
13430 70 31 3b 0a 20 20 63 68 61 72 20 2a 70 32 20 3d  p1;.  char *p2 =
13440 20 2a 70 70 32 3b 0a 0a 20 20 63 68 61 72 20 2a   *pp2;..  char *
13450 70 54 6d 70 31 20 3d 20 61 54 6d 70 3b 0a 20 20  pTmp1 = aTmp;.  
13460 63 68 61 72 20 2a 70 54 6d 70 32 3b 0a 20 20 63  char *pTmp2;.  c
13470 68 61 72 20 2a 61 54 6d 70 32 3b 0a 20 20 69 6e  har *aTmp2;.  in
13480 74 20 72 65 73 20 3d 20 31 3b 0a 0a 20 20 66 74  t res = 1;..  ft
13490 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d  s3PoslistPhraseM
134a0 65 72 67 65 28 26 70 54 6d 70 31 2c 20 6e 52 69  erge(&pTmp1, nRi
134b0 67 68 74 2c 20 30 2c 20 30 2c 20 70 70 31 2c 20  ght, 0, 0, pp1, 
134c0 70 70 32 29 3b 0a 20 20 61 54 6d 70 32 20 3d 20  pp2);.  aTmp2 = 
134d0 70 54 6d 70 32 20 3d 20 70 54 6d 70 31 3b 0a 20  pTmp2 = pTmp1;. 
134e0 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20 20 2a 70   *pp1 = p1;.  *p
134f0 70 32 20 3d 20 70 32 3b 0a 20 20 66 74 73 33 50  p2 = p2;.  fts3P
13500 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67  oslistPhraseMerg
13510 65 28 26 70 54 6d 70 32 2c 20 6e 4c 65 66 74 2c  e(&pTmp2, nLeft,
13520 20 31 2c 20 30 2c 20 70 70 32 2c 20 70 70 31 29   1, 0, pp2, pp1)
13530 3b 0a 20 20 69 66 28 20 70 54 6d 70 31 21 3d 61  ;.  if( pTmp1!=a
13540 54 6d 70 20 26 26 20 70 54 6d 70 32 21 3d 61 54  Tmp && pTmp2!=aT
13550 6d 70 32 20 29 7b 0a 20 20 20 20 66 74 73 33 50  mp2 ){.    fts3P
13560 6f 73 6c 69 73 74 4d 65 72 67 65 28 70 70 2c 20  oslistMerge(pp, 
13570 26 61 54 6d 70 2c 20 26 61 54 6d 70 32 29 3b 0a  &aTmp, &aTmp2);.
13580 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6d 70    }else if( pTmp
13590 31 21 3d 61 54 6d 70 20 29 7b 0a 20 20 20 20 66  1!=aTmp ){.    f
135a0 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 70  ts3PoslistCopy(p
135b0 70 2c 20 26 61 54 6d 70 29 3b 0a 20 20 7d 65 6c  p, &aTmp);.  }el
135c0 73 65 20 69 66 28 20 70 54 6d 70 32 21 3d 61 54  se if( pTmp2!=aT
135d0 6d 70 32 20 29 7b 0a 20 20 20 20 66 74 73 33 50  mp2 ){.    fts3P
135e0 6f 73 6c 69 73 74 43 6f 70 79 28 70 70 2c 20 26  oslistCopy(pp, &
135f0 61 54 6d 70 32 29 3b 0a 20 20 7d 65 6c 73 65 7b  aTmp2);.  }else{
13600 0a 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20  .    res = 0;.  
13610 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  }..  return res;
13620 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6e  .}../* .** An in
13630 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  stance of this f
13640 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
13650 74 6f 20 6d 65 72 67 65 20 74 6f 67 65 74 68 65  to merge togethe
13660 72 20 74 68 65 20 28 70 6f 74 65 6e 74 69 61 6c  r the (potential
13670 6c 79 0a 2a 2a 20 6c 61 72 67 65 20 6e 75 6d 62  ly.** large numb
13680 65 72 20 6f 66 29 20 64 6f 63 6c 69 73 74 73 20  er of) doclists 
13690 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 74 68  for each term th
136a0 61 74 20 6d 61 74 63 68 65 73 20 61 20 70 72 65  at matches a pre
136b0 66 69 78 20 71 75 65 72 79 2e 0a 2a 2a 20 53 65  fix query..** Se
136c0 65 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 33 54  e function fts3T
136d0 65 72 6d 53 65 6c 65 63 74 4d 65 72 67 65 28 29  ermSelectMerge()
136e0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
136f0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
13700 54 65 72 6d 53 65 6c 65 63 74 20 54 65 72 6d 53  TermSelect TermS
13710 65 6c 65 63 74 3b 0a 73 74 72 75 63 74 20 54 65  elect;.struct Te
13720 72 6d 53 65 6c 65 63 74 20 7b 0a 20 20 63 68 61  rmSelect {.  cha
13730 72 20 2a 61 61 4f 75 74 70 75 74 5b 31 36 5d 3b  r *aaOutput[16];
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13750 4d 61 6c 6c 6f 63 27 64 20 6f 75 74 70 75 74 20  Malloc'd output 
13760 62 75 66 66 65 72 73 20 2a 2f 0a 20 20 69 6e 74  buffers */.  int
13770 20 61 6e 4f 75 74 70 75 74 5b 31 36 5d 3b 20 20   anOutput[16];  
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13790 53 69 7a 65 20 65 61 63 68 20 6f 75 74 70 75 74  Size each output
137a0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
137b0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
137c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
137d0 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 73 69  sed to read a si
137e0 6e 67 6c 65 20 76 61 72 69 6e 74 20 66 72 6f 6d  ngle varint from
137f0 20 61 20 62 75 66 66 65 72 2e 20 50 61 72 61 6d   a buffer. Param
13800 65 74 65 72 0a 2a 2a 20 70 45 6e 64 20 70 6f 69  eter.** pEnd poi
13810 6e 74 73 20 31 20 62 79 74 65 20 70 61 73 74 20  nts 1 byte past 
13820 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
13830 75 66 66 65 72 2e 20 57 68 65 6e 20 74 68 69 73  uffer. When this
13840 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
13850 63 61 6c 6c 65 64 2c 20 69 66 20 2a 70 70 20 70  called, if *pp p
13860 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72  oints to pEnd or
13870 20 67 72 65 61 74 65 72 2c 20 74 68 65 6e 20 74   greater, then t
13880 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
13890 66 66 65 72 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ffer.** has been
138a0 20 72 65 61 63 68 65 64 2e 20 49 6e 20 74 68 69   reached. In thi
138b0 73 20 63 61 73 65 20 2a 70 70 20 69 73 20 73 65  s case *pp is se
138c0 74 20 74 6f 20 30 20 61 6e 64 20 74 68 65 20 66  t to 0 and the f
138d0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
138e0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 70 20 64 6f  .**.** If *pp do
138f0 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  es not point to 
13900 6f 72 20 70 61 73 74 20 70 45 6e 64 2c 20 74 68  or past pEnd, th
13910 65 6e 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69  en a single vari
13920 6e 74 20 69 73 20 72 65 61 64 0a 2a 2a 20 66 72  nt is read.** fr
13930 6f 6d 20 2a 70 70 2e 20 2a 70 70 20 69 73 20 74  om *pp. *pp is t
13940 68 65 6e 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  hen set to point
13950 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
13960 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 61 64   end of the read
13970 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
13980 66 20 62 44 65 73 63 49 64 78 20 69 73 20 66 61  f bDescIdx is fa
13990 6c 73 65 2c 20 74 68 65 20 76 61 6c 75 65 20 72  lse, the value r
139a0 65 61 64 20 69 73 20 61 64 64 65 64 20 74 6f 20  ead is added to 
139b0 2a 70 56 61 6c 20 62 65 66 6f 72 65 20 72 65 74  *pVal before ret
139c0 75 72 6e 69 6e 67 2e 0a 2a 2a 20 49 66 20 69 74  urning..** If it
139d0 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 61   is true, the va
139e0 6c 75 65 20 72 65 61 64 20 69 73 20 73 75 62 74  lue read is subt
139f0 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 70 56 61  racted from *pVa
13a00 6c 20 62 65 66 6f 72 65 20 74 68 69 73 20 0a 2a  l before this .*
13a10 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
13a20 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
13a30 69 64 20 66 74 73 33 47 65 74 44 65 6c 74 61 56  id fts3GetDeltaV
13a40 61 72 69 6e 74 33 28 0a 20 20 63 68 61 72 20 2a  arint3(.  char *
13a50 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
13a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
13a70 4f 55 54 3a 20 50 6f 69 6e 74 20 74 6f 20 72 65  OUT: Point to re
13a80 61 64 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 2a  ad varint from *
13a90 2f 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 2c 20  /.  char *pEnd, 
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 62 75      /* End of bu
13ac0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 44  ffer */.  int bD
13ad0 65 73 63 49 64 78 2c 20 20 20 20 20 20 20 20 20  escIdx,         
13ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13af0 65 20 69 66 20 64 6f 63 69 64 73 20 61 72 65 20  e if docids are 
13b00 64 65 73 63 65 6e 64 69 6e 67 20 2a 2f 0a 20 20  descending */.  
13b10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
13b20 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Val             
13b30 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 74 65 67  /* IN/OUT: Integ
13b40 65 72 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  er value */.){. 
13b50 20 69 66 28 20 2a 70 70 3e 3d 70 45 6e 64 20 29   if( *pp>=pEnd )
13b60 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
13b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
13b80 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c 3b 0a  te3_int64 iVal;.
13b90 20 20 20 20 2a 70 70 20 2b 3d 20 73 71 6c 69 74      *pp += sqlit
13ba0 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28  e3Fts3GetVarint(
13bb0 2a 70 70 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  *pp, &iVal);.   
13bc0 20 69 66 28 20 62 44 65 73 63 49 64 78 20 29 7b   if( bDescIdx ){
13bd0 0a 20 20 20 20 20 20 2a 70 56 61 6c 20 2d 3d 20  .      *pVal -= 
13be0 69 56 61 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iVal;.    }else{
13bf0 0a 20 20 20 20 20 20 2a 70 56 61 6c 20 2b 3d 20  .      *pVal += 
13c00 69 56 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iVal;.    }.  }.
13c10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13c20 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
13c30 6f 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  o write a single
13c40 20 76 61 72 69 6e 74 20 74 6f 20 61 20 62 75 66   varint to a buf
13c50 66 65 72 2e 20 54 68 65 20 76 61 72 69 6e 74 0a  fer. The varint.
13c60 2a 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ** is written to
13c70 20 2a 70 70 2e 20 42 65 66 6f 72 65 20 72 65 74   *pp. Before ret
13c80 75 72 6e 69 6e 67 2c 20 2a 70 70 20 69 73 20 73  urning, *pp is s
13c90 65 74 20 74 6f 20 70 6f 69 6e 74 20 31 20 62 79  et to point 1 by
13ca0 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 65  te past the.** e
13cb0 6e 64 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  nd of the value 
13cc0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 49  written..**.** I
13cd0 66 20 2a 70 62 46 69 72 73 74 20 69 73 20 7a 65  f *pbFirst is ze
13ce0 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ro when this fun
13cf0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
13d00 20 74 68 65 20 76 61 6c 75 65 20 77 72 69 74 74   the value writt
13d10 65 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 62 75 66  en to.** the buf
13d20 66 65 72 20 69 73 20 74 68 61 74 20 6f 66 20 70  fer is that of p
13d30 61 72 61 6d 65 74 65 72 20 69 56 61 6c 2e 20 0a  arameter iVal. .
13d40 2a 2a 0a 2a 2a 20 49 66 20 2a 70 62 46 69 72 73  **.** If *pbFirs
13d50 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  t is non-zero wh
13d60 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13d70 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e   is called, then
13d80 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 77   the value .** w
13d90 72 69 74 74 65 6e 20 69 73 20 65 69 74 68 65 72  ritten is either
13da0 20 28 69 56 61 6c 2d 2a 70 69 50 72 65 76 29 20   (iVal-*piPrev) 
13db0 28 69 66 20 62 44 65 73 63 49 64 78 20 69 73 20  (if bDescIdx is 
13dc0 7a 65 72 6f 29 20 6f 72 20 28 2a 70 69 50 72 65  zero) or (*piPre
13dd0 76 2d 69 56 61 6c 29 0a 2a 2a 20 28 69 66 20 62  v-iVal).** (if b
13de0 44 65 73 63 49 64 78 20 69 73 20 6e 6f 6e 2d 7a  DescIdx is non-z
13df0 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  ero)..**.** Befo
13e00 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 74 68  re returning, th
13e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
13e20 79 73 20 73 65 74 73 20 2a 70 62 46 69 72 73 74  ys sets *pbFirst
13e30 20 74 6f 20 31 20 61 6e 64 20 2a 70 69 50 72 65   to 1 and *piPre
13e40 76 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75  v.** to the valu
13e50 65 20 6f 66 20 70 61 72 61 6d 65 74 65 72 20 69  e of parameter i
13e60 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Val..*/.static v
13e70 6f 69 64 20 66 74 73 33 50 75 74 44 65 6c 74 61  oid fts3PutDelta
13e80 56 61 72 69 6e 74 33 28 0a 20 20 63 68 61 72 20  Varint3(.  char 
13e90 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
13ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
13eb0 2f 4f 55 54 3a 20 4f 75 74 70 75 74 20 70 6f 69  /OUT: Output poi
13ec0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 44  nter */.  int bD
13ed0 65 73 63 49 64 78 2c 20 20 20 20 20 20 20 20 20  escIdx,         
13ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
13ef0 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  e for descending
13f00 20 64 6f 63 69 64 73 20 2a 2f 0a 20 20 73 71 6c   docids */.  sql
13f10 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 50 72  ite3_int64 *piPr
13f20 65 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev,          /* 
13f30 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73  IN/OUT: Previous
13f40 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 74   value written t
13f50 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o list */.  int 
13f60 2a 70 62 46 69 72 73 74 2c 20 20 20 20 20 20 20  *pbFirst,       
13f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13f80 4e 2f 4f 55 54 3a 20 54 72 75 65 20 61 66 74 65  N/OUT: True afte
13f90 72 20 66 69 72 73 74 20 69 6e 74 20 77 72 69 74  r first int writ
13fa0 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ten */.  sqlite3
13fb0 5f 69 6e 74 36 34 20 69 56 61 6c 20 20 20 20 20  _int64 iVal     
13fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
13fd0 65 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  e this value to 
13fe0 74 68 65 20 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  the list */.){. 
13ff0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
14000 57 72 69 74 65 3b 0a 20 20 69 66 28 20 62 44 65  Write;.  if( bDe
14010 73 63 49 64 78 3d 3d 30 20 7c 7c 20 2a 70 62 46  scIdx==0 || *pbF
14020 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  irst==0 ){.    i
14030 57 72 69 74 65 20 3d 20 69 56 61 6c 20 2d 20 2a  Write = iVal - *
14040 70 69 50 72 65 76 3b 0a 20 20 7d 65 6c 73 65 7b  piPrev;.  }else{
14050 0a 20 20 20 20 69 57 72 69 74 65 20 3d 20 2a 70  .    iWrite = *p
14060 69 50 72 65 76 20 2d 20 69 56 61 6c 3b 0a 20 20  iPrev - iVal;.  
14070 7d 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 46  }.  assert( *pbF
14080 69 72 73 74 20 7c 7c 20 2a 70 69 50 72 65 76 3d  irst || *piPrev=
14090 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
140a0 2a 70 62 46 69 72 73 74 3d 3d 30 20 7c 7c 20 69  *pbFirst==0 || i
140b0 57 72 69 74 65 3e 30 20 29 3b 0a 20 20 2a 70 70  Write>0 );.  *pp
140c0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
140d0 75 74 56 61 72 69 6e 74 28 2a 70 70 2c 20 69 57  utVarint(*pp, iW
140e0 72 69 74 65 29 3b 0a 20 20 2a 70 69 50 72 65 76  rite);.  *piPrev
140f0 20 3d 20 69 56 61 6c 3b 0a 20 20 2a 70 62 46 69   = iVal;.  *pbFi
14100 72 73 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  rst = 1;.}.../*.
14110 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
14120 20 75 73 65 64 20 62 79 20 76 61 72 69 6f 75 73   used by various
14130 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
14140 6d 65 72 67 65 20 64 6f 63 6c 69 73 74 73 2e 20  merge doclists. 
14150 54 68 65 20 74 77 6f 0a 2a 2a 20 61 72 67 75 6d  The two.** argum
14160 65 6e 74 73 20 61 72 65 20 36 34 2d 62 69 74 20  ents are 64-bit 
14170 64 6f 63 69 64 20 76 61 6c 75 65 73 2e 20 49 66  docid values. If
14180 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
14190 65 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  e stack variable
141a0 0a 2a 2a 20 62 44 65 73 63 44 6f 63 6c 69 73 74  .** bDescDoclist
141b0 20 69 73 20 30 20 77 68 65 6e 20 74 68 69 73 20   is 0 when this 
141c0 6d 61 63 72 6f 20 69 73 20 69 6e 76 6f 6b 65 64  macro is invoked
141d0 2c 20 74 68 65 6e 20 69 74 20 72 65 74 75 72 6e  , then it return
141e0 73 20 28 69 31 2d 69 32 29 2e 20 0a 2a 2a 20 4f  s (i1-i2). .** O
141f0 74 68 65 72 77 69 73 65 2c 20 28 69 32 2d 69 31  therwise, (i2-i1
14200 29 2e 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 74  )..**.** Using t
14210 68 69 73 20 6d 61 6b 65 73 20 69 74 20 65 61 73  his makes it eas
14220 69 65 72 20 74 6f 20 77 72 69 74 65 20 63 6f 64  ier to write cod
14230 65 20 74 68 61 74 20 63 61 6e 20 6d 65 72 67 65  e that can merge
14240 20 64 6f 63 6c 69 73 74 73 20 74 68 61 74 20 61   doclists that a
14250 72 65 0a 2a 2a 20 73 6f 72 74 65 64 20 69 6e 20  re.** sorted in 
14260 65 69 74 68 65 72 20 61 73 63 65 6e 64 69 6e 67  either ascending
14270 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   or descending o
14280 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
14290 20 44 4f 43 49 44 5f 43 4d 50 28 69 31 2c 20 69   DOCID_CMP(i1, i
142a0 32 29 20 28 28 62 44 65 73 63 44 6f 63 6c 69 73  2) ((bDescDoclis
142b0 74 3f 2d 31 3a 31 29 20 2a 20 28 69 31 2d 69 32  t?-1:1) * (i1-i2
142c0 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  ))../*.** This f
142d0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 61 6e 20  unction does an 
142e0 22 4f 52 22 20 6d 65 72 67 65 20 6f 66 20 74 77  "OR" merge of tw
142f0 6f 20 64 6f 63 6c 69 73 74 73 20 28 6f 75 74 70  o doclists (outp
14300 75 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  ut contains all.
14310 2a 2a 20 70 6f 73 69 74 69 6f 6e 73 20 63 6f 6e  ** positions con
14320 74 61 69 6e 65 64 20 69 6e 20 65 69 74 68 65 72  tained in either
14330 20 61 72 67 75 6d 65 6e 74 20 64 6f 63 6c 69 73   argument doclis
14340 74 29 2e 20 49 66 20 74 68 65 20 64 6f 63 69 64  t). If the docid
14350 73 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 6e 70  s in the .** inp
14360 75 74 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ut doclists are 
14370 73 6f 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64  sorted in ascend
14380 69 6e 67 20 6f 72 64 65 72 2c 20 70 61 72 61 6d  ing order, param
14390 65 74 65 72 20 62 44 65 73 63 44 6f 63 6c 69 73  eter bDescDoclis
143a0 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  t.** should be f
143b0 61 6c 73 65 2e 20 49 66 20 74 68 65 79 20 61 72  alse. If they ar
143c0 65 20 73 6f 72 74 65 64 20 69 6e 20 61 73 63 65  e sorted in asce
143d0 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 69 74 20  nding order, it 
143e0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 70 61 73  should be.** pas
143f0 73 65 64 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76  sed a non-zero v
14400 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  alue..**.** If n
14410 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
14420 2a 70 61 4f 75 74 20 69 73 20 73 65 74 20 74 6f  *paOut is set to
14430 20 70 6f 69 6e 74 20 61 74 20 61 6e 20 73 71 6c   point at an sql
14440 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64 20 62 75  ite3_malloc'd bu
14450 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
14460 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20 64 6f  ng the output do
14470 63 6c 69 73 74 20 61 6e 64 20 53 51 4c 49 54 45  clist and SQLITE
14480 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
14490 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
144a0 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74   *pnOut is set t
144b0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
144c0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6f 75 74  bytes in the out
144d0 70 75 74 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 0a  put doclist..**.
144e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
144f0 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65  ccurs, an SQLite
14500 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14510 65 74 75 72 6e 65 64 2e 20 54 68 65 20 6f 75 74  eturned. The out
14520 70 75 74 20 76 61 6c 75 65 73 0a 2a 2a 20 61 72  put values.** ar
14530 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
14540 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
14550 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 63 6c  tic int fts3Docl
14560 69 73 74 4f 72 4d 65 72 67 65 28 0a 20 20 69 6e  istOrMerge(.  in
14570 74 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20  t bDescDoclist, 
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14590 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
145a0 74 73 20 61 72 65 20 64 65 73 63 20 2a 2f 0a 20  ts are desc */. 
145b0 20 63 68 61 72 20 2a 61 31 2c 20 69 6e 74 20 6e   char *a1, int n
145c0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
145d0 20 2f 2a 20 46 69 72 73 74 20 64 6f 63 6c 69 73   /* First doclis
145e0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 32 2c  t */.  char *a2,
145f0 20 69 6e 74 20 6e 32 2c 20 20 20 20 20 20 20 20   int n2,        
14600 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
14610 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 63 68   doclist */.  ch
14620 61 72 20 2a 2a 70 61 4f 75 74 2c 20 69 6e 74 20  ar **paOut, int 
14630 2a 70 6e 4f 75 74 20 20 20 20 20 20 20 20 2f 2a  *pnOut        /*
14640 20 4f 55 54 3a 20 4d 61 6c 6c 6f 63 27 64 20 64   OUT: Malloc'd d
14650 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 73  oclist */.){.  s
14660 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 31 20  qlite3_int64 i1 
14670 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
14680 6e 74 36 34 20 69 32 20 3d 20 30 3b 0a 20 20 73  nt64 i2 = 0;.  s
14690 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72  qlite3_int64 iPr
146a0 65 76 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ev = 0;.  char *
146b0 70 45 6e 64 31 20 3d 20 26 61 31 5b 6e 31 5d 3b  pEnd1 = &a1[n1];
146c0 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 32 20 3d  .  char *pEnd2 =
146d0 20 26 61 32 5b 6e 32 5d 3b 0a 20 20 63 68 61 72   &a2[n2];.  char
146e0 20 2a 70 31 20 3d 20 61 31 3b 0a 20 20 63 68 61   *p1 = a1;.  cha
146f0 72 20 2a 70 32 20 3d 20 61 32 3b 0a 20 20 63 68  r *p2 = a2;.  ch
14700 61 72 20 2a 70 3b 0a 20 20 63 68 61 72 20 2a 61  ar *p;.  char *a
14710 4f 75 74 3b 0a 20 20 69 6e 74 20 62 46 69 72 73  Out;.  int bFirs
14720 74 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 2a 70 61  tOut = 0;..  *pa
14730 4f 75 74 20 3d 20 30 3b 0a 20 20 2a 70 6e 4f 75  Out = 0;.  *pnOu
14740 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  t = 0;..  /* All
14750 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
14760 74 68 65 20 6f 75 74 70 75 74 2e 20 42 6f 74 68  the output. Both
14770 20 74 68 65 20 69 6e 70 75 74 20 61 6e 64 20 6f   the input and o
14780 75 74 70 75 74 20 64 6f 63 6c 69 73 74 73 0a 20  utput doclists. 
14790 20 2a 2a 20 61 72 65 20 64 65 6c 74 61 20 65 6e   ** are delta en
147a0 63 6f 64 65 64 2e 20 49 66 20 74 68 65 79 20 61  coded. If they a
147b0 72 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  re in ascending 
147c0 6f 72 64 65 72 20 28 62 44 65 73 63 44 6f 63 6c  order (bDescDocl
147d0 69 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68  ist==0),.  ** th
147e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  en the first doc
147f0 69 64 20 69 6e 20 65 61 63 68 20 6c 69 73 74 20  id in each list 
14800 69 73 20 73 69 6d 70 6c 79 20 65 6e 63 6f 64 65  is simply encode
14810 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 20 46  d as a varint. F
14820 6f 72 0a 20 20 2a 2a 20 65 61 63 68 20 73 75 62  or.  ** each sub
14830 73 65 71 75 65 6e 74 20 64 6f 63 69 64 2c 20 74  sequent docid, t
14840 68 65 20 76 61 72 69 6e 74 20 73 74 6f 72 65 64  he varint stored
14850 20 69 73 20 74 68 65 20 64 69 66 66 65 72 65 6e   is the differen
14860 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 0a 20  ce between the. 
14870 20 2a 2a 20 63 75 72 72 65 6e 74 20 61 6e 64 20   ** current and 
14880 70 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 28  previous docid (
14890 61 20 70 6f 73 69 74 69 76 65 20 6e 75 6d 62 65  a positive numbe
148a0 72 20 2d 20 73 69 6e 63 65 20 74 68 65 20 6c 69  r - since the li
148b0 73 74 20 69 73 20 69 6e 0a 20 20 2a 2a 20 61 73  st is in.  ** as
148c0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 29 2e 0a  cending order)..
148d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
148e0 72 73 74 20 64 6f 63 69 64 20 77 72 69 74 74 65  rst docid writte
148f0 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  n to the output 
14900 69 73 20 74 68 65 72 65 66 6f 72 65 20 65 6e 63  is therefore enc
14910 6f 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  oded using the .
14920 20 20 2a 2a 20 73 61 6d 65 20 6e 75 6d 62 65 72    ** same number
14930 20 6f 66 20 62 79 74 65 73 20 61 73 20 69 74 20   of bytes as it 
14940 69 73 20 69 6e 20 77 68 69 63 68 65 76 65 72 20  is in whichever 
14950 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73  of the input lis
14960 74 73 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  ts it is.  ** re
14970 61 64 20 66 72 6f 6d 2e 20 41 6e 64 20 65 61 63  ad from. And eac
14980 68 20 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63  h subsequent doc
14990 69 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  id read from the
149a0 20 73 61 6d 65 20 69 6e 70 75 74 20 6c 69 73 74   same input list
149b0 20 0a 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 73 20   .  ** consumes 
149c0 65 69 74 68 65 72 20 74 68 65 20 73 61 6d 65 20  either the same 
149d0 6f 72 20 6c 65 73 73 20 62 79 74 65 73 20 61 73  or less bytes as
149e0 20 69 74 20 64 69 64 20 69 6e 20 74 68 65 20 69   it did in the i
149f0 6e 70 75 74 20 28 73 69 6e 63 65 0a 20 20 2a 2a  nput (since.  **
14a00 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
14a10 62 65 74 77 65 65 6e 20 69 74 20 61 6e 64 20 74  between it and t
14a20 68 65 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  he previous valu
14a30 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
14a40 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 70  must.  ** be a p
14a50 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 6c 65  ositive value le
14a60 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
14a70 20 74 6f 20 74 68 65 20 64 65 6c 74 61 20 76 61   to the delta va
14a80 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 0a 20  lue read from . 
14a90 20 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 6c 69   ** the input li
14aa0 73 74 29 2e 20 54 68 65 20 73 61 6d 65 20 61 72  st). The same ar
14ab0 67 75 6d 65 6e 74 20 61 70 70 6c 69 65 73 20 74  gument applies t
14ac0 6f 20 61 6c 6c 20 62 75 74 20 74 68 65 20 66 69  o all but the fi
14ad0 72 73 74 20 64 6f 63 69 64 0a 20 20 2a 2a 20 72  rst docid.  ** r
14ae0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 27 6f 74  ead from the 'ot
14af0 68 65 72 27 20 6c 69 73 74 2e 20 41 6e 64 20 74  her' list. And t
14b00 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
14b10 66 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 20 6c  f all position l
14b20 69 73 74 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  ists.  ** that w
14b30 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 61 6e  ill be copied an
14b40 64 20 6d 65 72 67 65 64 20 66 72 6f 6d 20 74 68  d merged from th
14b50 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 6f  e input to the o
14b60 75 74 70 75 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  utput..  **.  **
14b70 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
14b80 20 66 69 72 73 74 20 64 6f 63 69 64 20 63 6f 70   first docid cop
14b90 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ied to the outpu
14ba0 74 20 69 73 20 61 20 6e 65 67 61 74 69 76 65 20  t is a negative 
14bb0 6e 75 6d 62 65 72 2c 0a 20 20 2a 2a 20 74 68 65  number,.  ** the
14bc0 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  n the encoding o
14bd0 66 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  f the first doci
14be0 64 20 66 72 6f 6d 20 74 68 65 20 27 6f 74 68 65  d from the 'othe
14bf0 72 27 20 69 6e 70 75 74 20 6c 69 73 74 20 6d 61  r' input list ma
14c00 79 0a 20 20 2a 2a 20 62 65 20 6c 61 72 67 65 72  y.  ** be larger
14c10 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74   in the output t
14c20 68 61 6e 20 69 74 20 77 61 73 20 69 6e 20 74 68  han it was in th
14c30 65 20 69 6e 70 75 74 20 28 73 69 6e 63 65 20 74  e input (since t
14c40 68 65 20 64 65 6c 74 61 20 76 61 6c 75 65 0a 20  he delta value. 
14c50 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 6c 61 72   ** may be a lar
14c60 67 65 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74  ger positive int
14c70 65 67 65 72 20 74 68 61 6e 20 74 68 65 20 61 63  eger than the ac
14c80 74 75 61 6c 20 64 6f 63 69 64 29 2e 0a 20 20 2a  tual docid)..  *
14c90 2a 0a 20 20 2a 2a 20 54 68 65 20 73 70 61 63 65  *.  ** The space
14ca0 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f   required to sto
14cb0 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  re the output is
14cc0 20 74 68 65 72 65 66 6f 72 65 20 74 68 65 20 73   therefore the s
14cd0 75 6d 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  um of the.  ** s
14ce0 69 7a 65 73 20 6f 66 20 74 68 65 20 74 77 6f 20  izes of the two 
14cf0 69 6e 70 75 74 73 2c 20 70 6c 75 73 20 65 6e 6f  inputs, plus eno
14d00 75 67 68 20 73 70 61 63 65 20 66 6f 72 20 65 78  ugh space for ex
14d10 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
14d20 20 69 6e 70 75 74 0a 20 20 2a 2a 20 64 6f 63 69   input.  ** doci
14d30 64 73 20 74 6f 20 67 72 6f 77 2e 20 0a 20 20 2a  ds to grow. .  *
14d40 2a 0a 20 20 2a 2a 20 41 20 73 79 6d 65 74 72 69  *.  ** A symetri
14d50 63 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 62  c argument may b
14d60 65 20 6d 61 64 65 20 69 66 20 74 68 65 20 64 6f  e made if the do
14d70 63 6c 69 73 74 73 20 61 72 65 20 69 6e 20 64 65  clists are in de
14d80 73 63 65 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 6f  scending .  ** o
14d90 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 61 4f 75  rder..  */.  aOu
14da0 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
14db0 6f 63 28 6e 31 2b 6e 32 2b 46 54 53 33 5f 56 41  oc(n1+n2+FTS3_VA
14dc0 52 49 4e 54 5f 4d 41 58 2d 31 29 3b 0a 20 20 69  RINT_MAX-1);.  i
14dd0 66 28 20 21 61 4f 75 74 20 29 20 72 65 74 75 72  f( !aOut ) retur
14de0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14df0 0a 20 20 70 20 3d 20 61 4f 75 74 3b 0a 20 20 66  .  p = aOut;.  f
14e00 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
14e10 74 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 30  t3(&p1, pEnd1, 0
14e20 2c 20 26 69 31 29 3b 0a 20 20 66 74 73 33 47 65  , &i1);.  fts3Ge
14e30 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70  tDeltaVarint3(&p
14e40 32 2c 20 70 45 6e 64 32 2c 20 30 2c 20 26 69 32  2, pEnd2, 0, &i2
14e50 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 31 20 7c  );.  while( p1 |
14e60 7c 20 70 32 20 29 7b 0a 20 20 20 20 73 71 6c 69  | p2 ){.    sqli
14e70 74 65 33 5f 69 6e 74 36 34 20 69 44 69 66 66 20  te3_int64 iDiff 
14e80 3d 20 44 4f 43 49 44 5f 43 4d 50 28 69 31 2c 20  = DOCID_CMP(i1, 
14e90 69 32 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 32  i2);..    if( p2
14ea0 20 26 26 20 70 31 20 26 26 20 69 44 69 66 66 3d   && p1 && iDiff=
14eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33  =0 ){.      fts3
14ec0 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28  PutDeltaVarint3(
14ed0 26 70 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74  &p, bDescDoclist
14ee0 2c 20 26 69 50 72 65 76 2c 20 26 62 46 69 72 73  , &iPrev, &bFirs
14ef0 74 4f 75 74 2c 20 69 31 29 3b 0a 20 20 20 20 20  tOut, i1);.     
14f00 20 66 74 73 33 50 6f 73 6c 69 73 74 4d 65 72 67   fts3PoslistMerg
14f10 65 28 26 70 2c 20 26 70 31 2c 20 26 70 32 29 3b  e(&p, &p1, &p2);
14f20 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44 65  .      fts3GetDe
14f30 6c 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c 20  ltaVarint3(&p1, 
14f40 70 45 6e 64 31 2c 20 62 44 65 73 63 44 6f 63 6c  pEnd1, bDescDocl
14f50 69 73 74 2c 20 26 69 31 29 3b 0a 20 20 20 20 20  ist, &i1);.     
14f60 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
14f70 69 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32 2c  int3(&p2, pEnd2,
14f80 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26   bDescDoclist, &
14f90 69 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i2);.    }else i
14fa0 66 28 20 21 70 32 20 7c 7c 20 28 70 31 20 26 26  f( !p2 || (p1 &&
14fb0 20 69 44 69 66 66 3c 30 29 20 29 7b 0a 20 20 20   iDiff<0) ){.   
14fc0 20 20 20 66 74 73 33 50 75 74 44 65 6c 74 61 56     fts3PutDeltaV
14fd0 61 72 69 6e 74 33 28 26 70 2c 20 62 44 65 73 63  arint3(&p, bDesc
14fe0 44 6f 63 6c 69 73 74 2c 20 26 69 50 72 65 76 2c  Doclist, &iPrev,
14ff0 20 26 62 46 69 72 73 74 4f 75 74 2c 20 69 31 29   &bFirstOut, i1)
15000 3b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  ;.      fts3Posl
15010 69 73 74 43 6f 70 79 28 26 70 2c 20 26 70 31 29  istCopy(&p, &p1)
15020 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74 44  ;.      fts3GetD
15030 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 31 2c  eltaVarint3(&p1,
15040 20 70 45 6e 64 31 2c 20 62 44 65 73 63 44 6f 63   pEnd1, bDescDoc
15050 6c 69 73 74 2c 20 26 69 31 29 3b 0a 20 20 20 20  list, &i1);.    
15060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
15070 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3PutDeltaVarint3
15080 28 26 70 2c 20 62 44 65 73 63 44 6f 63 6c 69 73  (&p, bDescDoclis
15090 74 2c 20 26 69 50 72 65 76 2c 20 26 62 46 69 72  t, &iPrev, &bFir
150a0 73 74 4f 75 74 2c 20 69 32 29 3b 0a 20 20 20 20  stOut, i2);.    
150b0 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
150c0 79 28 26 70 2c 20 26 70 32 29 3b 0a 20 20 20 20  y(&p, &p2);.    
150d0 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
150e0 72 69 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32  rint3(&p2, pEnd2
150f0 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20  , bDescDoclist, 
15100 26 69 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &i2);.    }.  }.
15110 0a 20 20 2a 70 61 4f 75 74 20 3d 20 61 4f 75 74  .  *paOut = aOut
15120 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20 28 69 6e  ;.  *pnOut = (in
15130 74 29 28 70 2d 61 4f 75 74 29 3b 0a 20 20 61 73  t)(p-aOut);.  as
15140 73 65 72 74 28 20 2a 70 6e 4f 75 74 3c 3d 6e 31  sert( *pnOut<=n1
15150 2b 6e 32 2b 46 54 53 33 5f 56 41 52 49 4e 54 5f  +n2+FTS3_VARINT_
15160 4d 41 58 2d 31 20 29 3b 0a 20 20 72 65 74 75 72  MAX-1 );.  retur
15170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15180 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15190 69 6f 6e 20 64 6f 65 73 20 61 20 22 70 68 72 61  ion does a "phra
151a0 73 65 22 20 6d 65 72 67 65 20 6f 66 20 74 77 6f  se" merge of two
151b0 20 64 6f 63 6c 69 73 74 73 2e 20 49 6e 20 61 20   doclists. In a 
151c0 70 68 72 61 73 65 20 6d 65 72 67 65 2c 0a 2a 2a  phrase merge,.**
151d0 20 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6e 74   the output cont
151e0 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 65  ains a copy of e
151f0 61 63 68 20 70 6f 73 69 74 69 6f 6e 20 66 72 6f  ach position fro
15200 6d 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  m the right-hand
15210 20 69 6e 70 75 74 0a 2a 2a 20 64 6f 63 6c 69 73   input.** doclis
15220 74 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  t for which ther
15230 65 20 69 73 20 61 20 70 6f 73 69 74 69 6f 6e 20  e is a position 
15240 69 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  in the left-hand
15250 20 69 6e 70 75 74 20 64 6f 63 6c 69 73 74 0a 2a   input doclist.*
15260 2a 20 65 78 61 63 74 6c 79 20 6e 44 69 73 74 20  * exactly nDist 
15270 74 6f 6b 65 6e 73 20 62 65 66 6f 72 65 20 69 74  tokens before it
15280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
15290 6f 63 69 64 73 20 69 6e 20 74 68 65 20 69 6e 70  ocids in the inp
152a0 75 74 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20  ut doclists are 
152b0 73 6f 72 74 65 64 20 69 6e 20 61 73 63 65 6e 64  sorted in ascend
152c0 69 6e 67 20 6f 72 64 65 72 2c 0a 2a 2a 20 70 61  ing order,.** pa
152d0 72 61 6d 65 74 65 72 20 62 44 65 73 63 44 6f 63  rameter bDescDoc
152e0 6c 69 73 74 20 73 68 6f 75 6c 64 20 62 65 20 66  list should be f
152f0 61 6c 73 65 2e 20 49 66 20 74 68 65 79 20 61 72  alse. If they ar
15300 65 20 73 6f 72 74 65 64 20 69 6e 20 61 73 63 65  e sorted in asce
15310 6e 64 69 6e 67 20 0a 2a 2a 20 6f 72 64 65 72 2c  nding .** order,
15320 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   it should be pa
15330 73 73 65 64 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  ssed a non-zero 
15340 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  value..**.** The
15350 20 72 69 67 68 74 2d 68 61 6e 64 20 69 6e 70 75   right-hand inpu
15360 74 20 64 6f 63 6c 69 73 74 20 69 73 20 6f 76 65  t doclist is ove
15370 72 77 72 69 74 74 65 6e 20 62 79 20 74 68 69 73  rwritten by this
15380 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
15390 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 6f 63  atic int fts3Doc
153a0 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65 28  listPhraseMerge(
153b0 0a 20 20 69 6e 74 20 62 44 65 73 63 44 6f 63 6c  .  int bDescDocl
153c0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
153d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72     /* True if ar
153e0 67 75 6d 65 6e 74 73 20 61 72 65 20 64 65 73 63  guments are desc
153f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 73 74 2c   */.  int nDist,
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15410 20 20 20 20 20 20 2f 2a 20 44 69 73 74 61 6e 63        /* Distanc
15420 65 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  e from left to r
15430 69 67 68 74 20 28 31 3d 61 64 6a 61 63 65 6e 74  ight (1=adjacent
15440 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 4c 65  ) */.  char *aLe
15450 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 20  ft, int nLeft,  
15460 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 64         /* Left d
15470 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72  oclist */.  char
15480 20 2a 2a 70 61 52 69 67 68 74 2c 20 69 6e 74 20   **paRight, int 
15490 2a 70 6e 52 69 67 68 74 20 20 20 20 2f 2a 20 49  *pnRight    /* I
154a0 4e 2f 4f 55 54 3a 20 52 69 67 68 74 2f 6f 75 74  N/OUT: Right/out
154b0 70 75 74 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 29  put doclist */.)
154c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
154d0 34 20 69 31 20 3d 20 30 3b 0a 20 20 73 71 6c 69  4 i1 = 0;.  sqli
154e0 74 65 33 5f 69 6e 74 36 34 20 69 32 20 3d 20 30  te3_int64 i2 = 0
154f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
15500 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 63  4 iPrev = 0;.  c
15510 68 61 72 20 2a 61 52 69 67 68 74 20 3d 20 2a 70  har *aRight = *p
15520 61 52 69 67 68 74 3b 0a 20 20 63 68 61 72 20 2a  aRight;.  char *
15530 70 45 6e 64 31 20 3d 20 26 61 4c 65 66 74 5b 6e  pEnd1 = &aLeft[n
15540 4c 65 66 74 5d 3b 0a 20 20 63 68 61 72 20 2a 70  Left];.  char *p
15550 45 6e 64 32 20 3d 20 26 61 52 69 67 68 74 5b 2a  End2 = &aRight[*
15560 70 6e 52 69 67 68 74 5d 3b 0a 20 20 63 68 61 72  pnRight];.  char
15570 20 2a 70 31 20 3d 20 61 4c 65 66 74 3b 0a 20 20   *p1 = aLeft;.  
15580 63 68 61 72 20 2a 70 32 20 3d 20 61 52 69 67 68  char *p2 = aRigh
15590 74 3b 0a 20 20 63 68 61 72 20 2a 70 3b 0a 20 20  t;.  char *p;.  
155a0 69 6e 74 20 62 46 69 72 73 74 4f 75 74 20 3d 20  int bFirstOut = 
155b0 30 3b 0a 20 20 63 68 61 72 20 2a 61 4f 75 74 3b  0;.  char *aOut;
155c0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 73  ..  assert( nDis
155d0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 62 44 65  t>0 );.  if( bDe
155e0 73 63 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  scDoclist ){.   
155f0 20 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   aOut = sqlite3_
15600 6d 61 6c 6c 6f 63 28 2a 70 6e 52 69 67 68 74 20  malloc(*pnRight 
15610 2b 20 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41  + FTS3_VARINT_MA
15620 58 29 3b 0a 20 20 20 20 69 66 28 20 61 4f 75 74  X);.    if( aOut
15630 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
15640 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
15650 73 65 7b 0a 20 20 20 20 61 4f 75 74 20 3d 20 61  se{.    aOut = a
15660 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 70 20 3d  Right;.  }.  p =
15670 20 61 4f 75 74 3b 0a 0a 20 20 66 74 73 33 47 65   aOut;..  fts3Ge
15680 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70  tDeltaVarint3(&p
15690 31 2c 20 70 45 6e 64 31 2c 20 30 2c 20 26 69 31  1, pEnd1, 0, &i1
156a0 29 3b 0a 20 20 66 74 73 33 47 65 74 44 65 6c 74  );.  fts3GetDelt
156b0 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70 45  aVarint3(&p2, pE
156c0 6e 64 32 2c 20 30 2c 20 26 69 32 29 3b 0a 0a 20  nd2, 0, &i2);.. 
156d0 20 77 68 69 6c 65 28 20 70 31 20 26 26 20 70 32   while( p1 && p2
156e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
156f0 69 6e 74 36 34 20 69 44 69 66 66 20 3d 20 44 4f  int64 iDiff = DO
15700 43 49 44 5f 43 4d 50 28 69 31 2c 20 69 32 29 3b  CID_CMP(i1, i2);
15710 0a 20 20 20 20 69 66 28 20 69 44 69 66 66 3d 3d  .    if( iDiff==
15720 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
15730 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20 20 20 20  *pSave = p;.    
15740 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
15750 69 50 72 65 76 53 61 76 65 20 3d 20 69 50 72 65  iPrevSave = iPre
15760 76 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  v;.      int bFi
15770 72 73 74 4f 75 74 53 61 76 65 20 3d 20 62 46 69  rstOutSave = bFi
15780 72 73 74 4f 75 74 3b 0a 0a 20 20 20 20 20 20 66  rstOut;..      f
15790 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
157a0 74 33 28 26 70 2c 20 62 44 65 73 63 44 6f 63 6c  t3(&p, bDescDocl
157b0 69 73 74 2c 20 26 69 50 72 65 76 2c 20 26 62 46  ist, &iPrev, &bF
157c0 69 72 73 74 4f 75 74 2c 20 69 31 29 3b 0a 20 20  irstOut, i1);.  
157d0 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 33 50      if( 0==fts3P
157e0 6f 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67  oslistPhraseMerg
157f0 65 28 26 70 2c 20 6e 44 69 73 74 2c 20 30 2c 20  e(&p, nDist, 0, 
15800 31 2c 20 26 70 31 2c 20 26 70 32 29 20 29 7b 0a  1, &p1, &p2) ){.
15810 20 20 20 20 20 20 20 20 70 20 3d 20 70 53 61 76          p = pSav
15820 65 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65 76  e;.        iPrev
15830 20 3d 20 69 50 72 65 76 53 61 76 65 3b 0a 20 20   = iPrevSave;.  
15840 20 20 20 20 20 20 62 46 69 72 73 74 4f 75 74 20        bFirstOut 
15850 3d 20 62 46 69 72 73 74 4f 75 74 53 61 76 65 3b  = bFirstOutSave;
15860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
15870 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
15880 74 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 62  t3(&p1, pEnd1, b
15890 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 31  DescDoclist, &i1
158a0 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65 74  );.      fts3Get
158b0 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 32  DeltaVarint3(&p2
158c0 2c 20 70 45 6e 64 32 2c 20 62 44 65 73 63 44 6f  , pEnd2, bDescDo
158d0 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a 20 20 20  clist, &i2);.   
158e0 20 7d 65 6c 73 65 20 69 66 28 20 69 44 69 66 66   }else if( iDiff
158f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33  <0 ){.      fts3
15900 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26  PoslistCopy(0, &
15910 70 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47  p1);.      fts3G
15920 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15930 70 31 2c 20 70 45 6e 64 31 2c 20 62 44 65 73 63  p1, pEnd1, bDesc
15940 44 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b 0a 20  Doclist, &i1);. 
15950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15960 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28  fts3PoslistCopy(
15970 30 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20 66  0, &p2);.      f
15980 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e  ts3GetDeltaVarin
15990 74 33 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 62  t3(&p2, pEnd2, b
159a0 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 32  DescDoclist, &i2
159b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
159c0 2a 70 6e 52 69 67 68 74 20 3d 20 28 69 6e 74 29  *pnRight = (int)
159d0 28 70 20 2d 20 61 4f 75 74 29 3b 0a 20 20 69 66  (p - aOut);.  if
159e0 28 20 62 44 65 73 63 44 6f 63 6c 69 73 74 20 29  ( bDescDoclist )
159f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
15a00 65 65 28 61 52 69 67 68 74 29 3b 0a 20 20 20 20  ee(aRight);.    
15a10 2a 70 61 52 69 67 68 74 20 3d 20 61 4f 75 74 3b  *paRight = aOut;
15a20 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
15a30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15a40 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 73  ** Argument pLis
15a50 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f  t points to a po
15a60 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 4c 69 73  sition list nLis
15a70 74 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  t bytes in size.
15a80 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
15a90 6e 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  n checks to see 
15aa0 69 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  if the position 
15ab0 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
15ac0 79 20 65 6e 74 72 69 65 73 20 66 6f 72 0a 2a 2a  y entries for.**
15ad0 20 61 20 74 6f 6b 65 6e 20 69 6e 20 70 6f 73 69   a token in posi
15ae0 74 69 6f 6e 20 30 20 28 6f 66 20 61 6e 79 20 63  tion 0 (of any c
15af0 6f 6c 75 6d 6e 29 2e 20 49 66 20 73 6f 2c 20 69  olumn). If so, i
15b00 74 20 77 72 69 74 65 73 20 61 72 67 75 6d 65 6e  t writes argumen
15b10 74 20 69 44 65 6c 74 61 0a 2a 2a 20 74 6f 20 74  t iDelta.** to t
15b20 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
15b30 20 70 4f 75 74 2c 20 66 6f 6c 6c 6f 77 65 64 20   pOut, followed 
15b40 62 79 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69  by a position li
15b50 73 74 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 6e  st consisting on
15b60 6c 79 0a 2a 2a 20 6f 66 20 74 68 65 20 65 6e 74  ly.** of the ent
15b70 72 69 65 73 20 66 72 6f 6d 20 70 4c 69 73 74 20  ries from pList 
15b80 61 74 20 70 6f 73 69 74 69 6f 6e 20 30 2c 20 61  at position 0, a
15b90 6e 64 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79  nd terminated by
15ba0 20 61 6e 20 30 78 30 30 20 62 79 74 65 2e 0a 2a   an 0x00 byte..*
15bb0 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
15bc0 72 6e 65 64 20 69 73 20 74 68 65 20 6e 75 6d 62  rned is the numb
15bd0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
15be0 74 65 6e 20 74 6f 20 70 4f 75 74 20 28 69 66 20  ten to pOut (if 
15bf0 61 6e 79 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  any)..*/.int sql
15c00 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69 6c  ite3Fts3FirstFil
15c10 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 69  ter(.  sqlite3_i
15c20 6e 74 36 34 20 69 44 65 6c 74 61 2c 20 20 20 20  nt64 iDelta,    
15c30 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6e 74         /* Varint
15c40 20 74 68 61 74 20 6d 61 79 20 62 65 20 77 72 69   that may be wri
15c50 74 74 65 6e 20 74 6f 20 70 4f 75 74 20 2a 2f 0a  tten to pOut */.
15c60 20 20 63 68 61 72 20 2a 70 4c 69 73 74 2c 20 20    char *pList,  
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
15c90 73 74 20 28 6e 6f 20 30 78 30 30 20 74 65 72 6d  st (no 0x00 term
15ca0 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  ) */.  int nList
15cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15cc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15cd0 66 20 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73  f pList in bytes
15ce0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f 75 74   */.  char *pOut
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
15d10 75 74 70 75 74 20 68 65 72 65 20 2a 2f 0a 29 7b  utput here */.){
15d20 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  .  int nOut = 0;
15d30 0a 20 20 69 6e 74 20 62 57 72 69 74 74 65 6e 20  .  int bWritten 
15d40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15d50 20 20 20 2f 2a 20 54 72 75 65 20 6f 6e 63 65 20     /* True once 
15d60 69 44 65 6c 74 61 20 68 61 73 20 62 65 65 6e 20  iDelta has been 
15d70 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 68 61  written */.  cha
15d80 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b 0a 20 20  r *p = pList;.  
15d90 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 70 4c  char *pEnd = &pL
15da0 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 0a 20 20 69  ist[nList];..  i
15db0 66 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20  f( *p!=0x01 ){. 
15dc0 20 20 20 69 66 28 20 2a 70 3d 3d 30 78 30 32 20     if( *p==0x02 
15dd0 29 7b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  ){.      nOut +=
15de0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56   sqlite3Fts3PutV
15df0 61 72 69 6e 74 28 26 70 4f 75 74 5b 6e 4f 75 74  arint(&pOut[nOut
15e00 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
15e10 20 20 70 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d    pOut[nOut++] =
15e20 20 30 78 30 32 3b 0a 20 20 20 20 20 20 62 57 72   0x02;.      bWr
15e30 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d  itten = 1;.    }
15e40 0a 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c  .    fts3Columnl
15e50 69 73 74 43 6f 70 79 28 30 2c 20 26 70 29 3b 0a  istCopy(0, &p);.
15e60 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 3c    }..  while( p<
15e70 70 45 6e 64 20 26 26 20 2a 70 3d 3d 30 78 30 31  pEnd && *p==0x01
15e80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15e90 69 6e 74 36 34 20 69 43 6f 6c 3b 0a 20 20 20 20  int64 iCol;.    
15ea0 70 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d 20 73 71  p++;.    p += sq
15eb0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
15ec0 6e 74 28 70 2c 20 26 69 43 6f 6c 29 3b 0a 20 20  nt(p, &iCol);.  
15ed0 20 20 69 66 28 20 2a 70 3d 3d 30 78 30 32 20 29    if( *p==0x02 )
15ee0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 57 72 69  {.      if( bWri
15ef0 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tten==0 ){.     
15f00 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c 69 74     nOut += sqlit
15f10 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28  e3Fts3PutVarint(
15f20 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69 44 65  &pOut[nOut], iDe
15f30 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 62 57  lta);.        bW
15f40 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
15f50 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 5b 6e    }.      pOut[n
15f60 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 31 3b 0a 20  Out++] = 0x01;. 
15f70 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71 6c       nOut += sql
15f80 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
15f90 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20 69  t(&pOut[nOut], i
15fa0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 4f 75 74  Col);.      pOut
15fb0 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 32 3b  [nOut++] = 0x02;
15fc0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 43  .    }.    fts3C
15fd0 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c  olumnlistCopy(0,
15fe0 20 26 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   &p);.  }.  if( 
15ff0 62 57 72 69 74 74 65 6e 20 29 7b 0a 20 20 20 20  bWritten ){.    
16000 70 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30  pOut[nOut++] = 0
16010 78 30 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  x00;.  }..  retu
16020 72 6e 20 6e 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn nOut;.}.../*.
16030 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20 64 6f 63  ** Merge all doc
16040 6c 69 73 74 73 20 69 6e 20 74 68 65 20 54 65 72  lists in the Ter
16050 6d 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74  mSelect.aaOutput
16060 5b 5d 20 61 72 72 61 79 20 69 6e 74 6f 20 61 20  [] array into a 
16070 73 69 6e 67 6c 65 0a 2a 2a 20 64 6f 63 6c 69 73  single.** doclis
16080 74 20 73 74 6f 72 65 64 20 69 6e 20 54 65 72 6d  t stored in Term
16090 53 65 6c 65 63 74 2e 61 61 4f 75 74 70 75 74 5b  Select.aaOutput[
160a0 30 5d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  0]. If successfu
160b0 6c 2c 20 64 65 6c 65 74 65 20 61 6c 6c 0a 2a 2a  l, delete all.**
160c0 20 6f 74 68 65 72 20 64 6f 63 6c 69 73 74 73 20   other doclists 
160d0 28 65 78 63 65 70 74 20 74 68 65 20 61 61 4f 75  (except the aaOu
160e0 74 70 75 74 5b 30 5d 20 6f 6e 65 29 20 61 6e 64  tput[0] one) and
160f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16100 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  K..**.** If an O
16110 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
16120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16130 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
16140 73 65 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20  se it is.** the 
16150 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
16160 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
16170 66 72 65 65 20 61 6e 79 20 64 6f 63 6c 69 73 74  free any doclist
16180 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  s left in the.**
16190 20 54 65 72 6d 53 65 6c 65 63 74 2e 61 61 4f 75   TermSelect.aaOu
161a0 74 70 75 74 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  tput[] array..*/
161b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
161c0 54 65 72 6d 53 65 6c 65 63 74 46 69 6e 69 73 68  TermSelectFinish
161d0 4d 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20  Merge(Fts3Table 
161e0 2a 70 2c 20 54 65 72 6d 53 65 6c 65 63 74 20 2a  *p, TermSelect *
161f0 70 54 53 29 7b 0a 20 20 63 68 61 72 20 2a 61 4f  pTS){.  char *aO
16200 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4f  ut = 0;.  int nO
16210 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  ut = 0;.  int i;
16220 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
16230 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 73  ugh the doclists
16240 20 69 6e 20 74 68 65 20 61 61 4f 75 74 70 75 74   in the aaOutput
16250 5b 5d 20 61 72 72 61 79 2e 20 4d 65 72 67 65 20  [] array. Merge 
16260 74 68 65 6d 20 61 6c 6c 0a 20 20 2a 2a 20 69 6e  them all.  ** in
16270 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 6f 63 6c  to a single docl
16280 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ist..  */.  for(
16290 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72  i=0; i<SizeofArr
162a0 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  ay(pTS->aaOutput
162b0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
162c0 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69   pTS->aaOutput[i
162d0 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ] ){.      if( !
162e0 61 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  aOut ){.        
162f0 61 4f 75 74 20 3d 20 70 54 53 2d 3e 61 61 4f 75  aOut = pTS->aaOu
16300 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20  tput[i];.       
16310 20 6e 4f 75 74 20 3d 20 70 54 53 2d 3e 61 6e 4f   nOut = pTS->anO
16320 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20  utput[i];.      
16330 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
16340 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  i] = 0;.      }e
16350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
16360 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63   nNew;.        c
16370 68 61 72 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20  har *aNew;..    
16380 20 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73      int rc = fts
16390 33 44 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28  3DoclistOrMerge(
163a0 70 2d 3e 62 44 65 73 63 49 64 78 2c 20 0a 20 20  p->bDescIdx, .  
163b0 20 20 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61            pTS->a
163c0 61 4f 75 74 70 75 74 5b 69 5d 2c 20 70 54 53 2d  aOutput[i], pTS-
163d0 3e 61 6e 4f 75 74 70 75 74 5b 69 5d 2c 20 61 4f  >anOutput[i], aO
163e0 75 74 2c 20 6e 4f 75 74 2c 20 26 61 4e 65 77 2c  ut, nOut, &aNew,
163f0 20 26 6e 4e 65 77 0a 20 20 20 20 20 20 20 20 29   &nNew.        )
16400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16430 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20  _free(aOut);.   
16440 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
16460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16470 65 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b  e(pTS->aaOutput[
16480 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i]);.        sql
16490 69 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b  ite3_free(aOut);
164a0 0a 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61  .        pTS->aa
164b0 4f 75 74 70 75 74 5b 69 5d 20 3d 20 30 3b 0a 20  Output[i] = 0;. 
164c0 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20 61 4e         aOut = aN
164d0 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  ew;.        nOut
164e0 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = nNew;.      }
164f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
16500 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20 3d  S->aaOutput[0] =
16510 20 61 4f 75 74 3b 0a 20 20 70 54 53 2d 3e 61 6e   aOut;.  pTS->an
16520 4f 75 74 70 75 74 5b 30 5d 20 3d 20 6e 4f 75 74  Output[0] = nOut
16530 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16540 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
16550 65 72 67 65 20 74 68 65 20 64 6f 63 6c 69 73 74  erge the doclist
16560 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f 63 6c 69   aDoclist/nDocli
16570 73 74 20 69 6e 74 6f 20 74 68 65 20 54 65 72 6d  st into the Term
16580 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61  Select object pa
16590 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
165a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
165b0 68 65 20 6d 65 72 67 65 20 69 73 20 61 6e 20 22  he merge is an "
165c0 4f 52 22 20 6d 65 72 67 65 20 28 73 65 65 20 66  OR" merge (see f
165d0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 74 73 33 44  unction.** fts3D
165e0 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 29 20  oclistOrMerge() 
165f0 66 6f 72 20 64 65 74 61 69 6c 73 29 2e 0a 2a 2a  for details)..**
16600 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16610 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
16620 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
16630 20 65 61 63 68 20 74 65 72 6d 20 74 68 61 74 20   each term that 
16640 6d 61 74 63 68 65 73 0a 2a 2a 20 61 20 71 75 65  matches.** a que
16650 72 69 65 64 20 70 72 65 66 69 78 2e 20 49 74 20  ried prefix. It 
16660 6d 65 72 67 65 73 20 61 6c 6c 20 74 68 65 73 65  merges all these
16670 20 64 6f 63 6c 69 73 74 73 20 69 6e 74 6f 20 6f   doclists into o
16680 6e 65 2c 20 74 68 65 20 64 6f 63 6c 69 73 74 0a  ne, the doclist.
16690 2a 2a 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ** for the speci
166a0 66 69 65 64 20 70 72 65 66 69 78 2e 20 53 69 6e  fied prefix. Sin
166b0 63 65 20 74 68 65 72 65 20 63 61 6e 20 62 65 20  ce there can be 
166c0 61 20 76 65 72 79 20 6c 61 72 67 65 20 6e 75 6d  a very large num
166d0 62 65 72 20 6f 66 0a 2a 2a 20 64 6f 63 6c 69 73  ber of.** doclis
166e0 74 73 20 74 6f 20 6d 65 72 67 65 2c 20 74 68 65  ts to merge, the
166f0 20 6d 65 72 67 69 6e 67 20 69 73 20 64 6f 6e 65   merging is done
16700 20 70 61 69 72 2d 77 69 73 65 20 75 73 69 6e 67   pair-wise using
16710 20 74 68 65 20 54 65 72 6d 53 65 6c 65 63 74 0a   the TermSelect.
16720 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  ** object..**.**
16730 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
16740 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
16750 20 69 66 20 74 68 65 20 6d 65 72 67 65 20 69 73   if the merge is
16760 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
16770 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72  an.** SQLite err
16780 6f 72 20 63 6f 64 65 20 28 53 51 4c 49 54 45 5f  or code (SQLITE_
16790 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72 72  NOMEM) if an err
167a0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
167b0 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 65 72  atic int fts3Ter
167c0 6d 53 65 6c 65 63 74 4d 65 72 67 65 28 0a 20 20  mSelectMerge(.  
167d0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20  Fts3Table *p,   
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 2f 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e  /* FTS table han
16800 64 6c 65 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  dle */.  TermSel
16810 65 63 74 20 2a 70 54 53 2c 20 20 20 20 20 20 20  ect *pTS,       
16820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
16830 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 74 6f  Select object to
16840 20 6d 65 72 67 65 20 69 6e 74 6f 20 2a 2f 0a 20   merge into */. 
16850 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c   char *aDoclist,
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
16880 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
16890 6e 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20  nDoclist        
168a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
168b0 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20  ize of aDoclist 
168c0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
168d0 20 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70   if( pTS->aaOutp
168e0 75 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ut[0]==0 ){.    
168f0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
16900 65 20 66 69 72 73 74 20 74 65 72 6d 20 73 65 6c  e first term sel
16910 65 63 74 65 64 2c 20 63 6f 70 79 20 74 68 65 20  ected, copy the 
16920 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 6f  doclist to the o
16930 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 62 75 66  utput.    ** buf
16940 66 65 72 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  fer using memcpy
16950 28 29 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  (). .    **.    
16960 2a 2a 20 41 64 64 20 46 54 53 33 5f 56 41 52 49  ** Add FTS3_VARI
16970 4e 54 5f 4d 41 58 20 62 79 74 65 73 20 6f 66 20  NT_MAX bytes of 
16980 75 6e 75 73 65 64 20 73 70 61 63 65 20 74 6f 20  unused space to 
16990 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
169a0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f      ** allocatio
169b0 6e 2e 20 54 68 69 73 20 69 73 20 73 6f 20 61 73  n. This is so as
169c0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
169d0 74 68 65 20 62 75 66 66 65 72 20 69 73 20 62 69  the buffer is bi
169e0 67 20 65 6e 6f 75 67 68 0a 20 20 20 20 2a 2a 20  g enough.    ** 
169f0 74 6f 20 68 6f 6c 64 20 74 68 65 20 63 75 72 72  to hold the curr
16a00 65 6e 74 20 64 6f 63 6c 69 73 74 20 41 4e 44 27  ent doclist AND'
16a10 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
16a20 20 64 6f 63 6c 69 73 74 2e 20 49 66 20 74 68 65   doclist. If the
16a30 0a 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 73  .    ** doclists
16a40 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 6f   are stored in o
16a50 72 64 65 72 3d 41 53 43 20 6f 72 64 65 72 2c 20  rder=ASC order, 
16a60 74 68 69 73 20 70 61 64 64 69 6e 67 20 77 6f 75  this padding wou
16a70 6c 64 20 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a  ld not be.    **
16a80 20 72 65 71 75 69 72 65 64 20 28 73 69 6e 63 65   required (since
16a90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 5b 64 6f   the size of [do
16aa0 63 6c 69 73 74 41 20 41 4e 44 20 64 6f 63 6c 69  clistA AND docli
16ab0 73 74 42 5d 20 69 73 20 61 6c 77 61 79 73 20 6c  stB] is always l
16ac0 65 73 73 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ess.    ** than 
16ad0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
16ae0 73 69 7a 65 20 6f 66 20 5b 64 6f 63 6c 69 73 74  size of [doclist
16af0 41 5d 20 69 6e 20 74 68 61 74 20 63 61 73 65 29  A] in that case)
16b00 2e 20 42 75 74 20 74 68 69 73 20 69 73 0a 20 20  . But this is.  
16b10 20 20 2a 2a 20 6e 6f 74 20 74 72 75 65 20 66 6f    ** not true fo
16b20 72 20 6f 72 64 65 72 3d 44 45 53 43 2e 20 46 6f  r order=DESC. Fo
16b30 72 20 65 78 61 6d 70 6c 65 2c 20 61 20 64 6f 63  r example, a doc
16b40 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
16b50 28 31 2c 20 2d 31 29 20 0a 20 20 20 20 2a 2a 20  (1, -1) .    ** 
16b60 6d 61 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  may be smaller t
16b70 68 61 6e 20 28 2d 31 29 2c 20 61 73 20 69 6e 20  han (-1), as in 
16b80 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
16b90 65 20 74 68 65 20 2d 31 20 6d 61 79 20 62 65 20  e the -1 may be 
16ba0 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 61 73  stored.    ** as
16bb0 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 64   a single-byte d
16bc0 65 6c 74 61 2c 20 77 68 65 72 65 61 73 20 69 6e  elta, whereas in
16bd0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 20 6d   the second it m
16be0 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 61 73  ust be stored as
16bf0 20 61 0a 20 20 20 20 2a 2a 20 46 54 53 33 5f 56   a.    ** FTS3_V
16c00 41 52 49 4e 54 5f 4d 41 58 20 62 79 74 65 20 76  ARINT_MAX byte v
16c10 61 72 69 6e 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  arint..    **.  
16c20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 20 70 61 64    ** Similar pad
16c30 64 69 6e 67 20 69 73 20 61 64 64 65 64 20 69 6e  ding is added in
16c40 20 74 68 65 20 66 74 73 33 44 6f 63 6c 69 73 74   the fts3Doclist
16c50 4f 72 4d 65 72 67 65 28 29 20 66 75 6e 63 74 69  OrMerge() functi
16c60 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
16c70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20  TS->aaOutput[0] 
16c80 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
16c90 28 6e 44 6f 63 6c 69 73 74 20 2b 20 46 54 53 33  (nDoclist + FTS3
16ca0 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2b 20 31 29  _VARINT_MAX + 1)
16cb0 3b 0a 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74  ;.    pTS->anOut
16cc0 70 75 74 5b 30 5d 20 3d 20 6e 44 6f 63 6c 69 73  put[0] = nDoclis
16cd0 74 3b 0a 20 20 20 20 69 66 28 20 70 54 53 2d 3e  t;.    if( pTS->
16ce0 61 61 4f 75 74 70 75 74 5b 30 5d 20 29 7b 0a 20  aaOutput[0] ){. 
16cf0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 53 2d       memcpy(pTS-
16d00 3e 61 61 4f 75 74 70 75 74 5b 30 5d 2c 20 61 44  >aaOutput[0], aD
16d10 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
16d20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16d30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16d40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
16d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
16d60 20 2a 61 4d 65 72 67 65 20 3d 20 61 44 6f 63 6c   *aMerge = aDocl
16d70 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 65  ist;.    int nMe
16d80 72 67 65 20 3d 20 6e 44 6f 63 6c 69 73 74 3b 0a  rge = nDoclist;.
16d90 20 20 20 20 69 6e 74 20 69 4f 75 74 3b 0a 0a 20      int iOut;.. 
16da0 20 20 20 66 6f 72 28 69 4f 75 74 3d 30 3b 20 69     for(iOut=0; i
16db0 4f 75 74 3c 53 69 7a 65 6f 66 41 72 72 61 79 28  Out<SizeofArray(
16dc0 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 29 3b 20  pTS->aaOutput); 
16dd0 69 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iOut++){.      i
16de0 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  f( pTS->aaOutput
16df0 5b 69 4f 75 74 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOut]==0 ){.   
16e00 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
16e10 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  t>0 );.        p
16e20 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75  TS->aaOutput[iOu
16e30 74 5d 20 3d 20 61 4d 65 72 67 65 3b 0a 20 20 20  t] = aMerge;.   
16e40 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70       pTS->anOutp
16e50 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67  ut[iOut] = nMerg
16e60 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
16e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16e80 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65         char *aNe
16e90 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  w;.        int n
16ea0 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20 20 69 6e  New;..        in
16eb0 74 20 72 63 20 3d 20 66 74 73 33 44 6f 63 6c 69  t rc = fts3Docli
16ec0 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e 62 44 65  stOrMerge(p->bDe
16ed0 73 63 49 64 78 2c 20 61 4d 65 72 67 65 2c 20 6e  scIdx, aMerge, n
16ee0 4d 65 72 67 65 2c 20 0a 20 20 20 20 20 20 20 20  Merge, .        
16ef0 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75      pTS->aaOutpu
16f00 74 5b 69 4f 75 74 5d 2c 20 70 54 53 2d 3e 61 6e  t[iOut], pTS->an
16f10 4f 75 74 70 75 74 5b 69 4f 75 74 5d 2c 20 26 61  Output[iOut], &a
16f20 4e 65 77 2c 20 26 6e 4e 65 77 0a 20 20 20 20 20  New, &nNew.     
16f30 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
16f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
16f60 20 61 4d 65 72 67 65 21 3d 61 44 6f 63 6c 69 73   aMerge!=aDoclis
16f70 74 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  t ) sqlite3_free
16f80 28 61 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  (aMerge);.      
16f90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16fa0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16fb0 20 20 69 66 28 20 61 4d 65 72 67 65 21 3d 61 44    if( aMerge!=aD
16fc0 6f 63 6c 69 73 74 20 29 20 73 71 6c 69 74 65 33  oclist ) sqlite3
16fd0 5f 66 72 65 65 28 61 4d 65 72 67 65 29 3b 0a 20  _free(aMerge);. 
16fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
16ff0 72 65 65 28 70 54 53 2d 3e 61 61 4f 75 74 70 75  ree(pTS->aaOutpu
17000 74 5b 69 4f 75 74 5d 29 3b 0a 20 20 20 20 20 20  t[iOut]);.      
17010 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
17020 69 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 0a 20 20  iOut] = 0;.  .  
17030 20 20 20 20 20 20 61 4d 65 72 67 65 20 3d 20 61        aMerge = a
17040 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e 4d 65  New;.        nMe
17050 72 67 65 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  rge = nNew;.    
17060 20 20 20 20 69 66 28 20 28 69 4f 75 74 2b 31 29      if( (iOut+1)
17070 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28 70 54  ==SizeofArray(pT
17080 53 2d 3e 61 61 4f 75 74 70 75 74 29 20 29 7b 0a  S->aaOutput) ){.
17090 20 20 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61            pTS->a
170a0 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20  aOutput[iOut] = 
170b0 61 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  aMerge;.        
170c0 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b    pTS->anOutput[
170d0 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67 65 3b 0a  iOut] = nMerge;.
170e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
170f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
17100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17110 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17120 53 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74  SegReader object
17130 20 70 4e 65 77 20 74 6f 20 74 68 65 20 65 6e 64   pNew to the end
17140 20 6f 66 20 74 68 65 20 70 43 73 72 2d 3e 61 70   of the pCsr->ap
17150 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 79 2e  Segment[] array.
17160 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17170 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
17180 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74 73 33  orAppend(.  Fts3
17190 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
171a0 70 43 73 72 2c 20 0a 20 20 46 74 73 33 53 65 67  pCsr, .  Fts3Seg
171b0 52 65 61 64 65 72 20 2a 70 4e 65 77 0a 29 7b 0a  Reader *pNew.){.
171c0 20 20 69 66 28 20 28 70 43 73 72 2d 3e 6e 53 65    if( (pCsr->nSe
171d0 67 6d 65 6e 74 25 31 36 29 3d 3d 30 20 29 7b 0a  gment%16)==0 ){.
171e0 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65      Fts3SegReade
171f0 72 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 69  r **apNew;.    i
17200 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 43 73 72  nt nByte = (pCsr
17210 2d 3e 6e 53 65 67 6d 65 6e 74 20 2b 20 31 36 29  ->nSegment + 16)
17220 2a 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52  *sizeof(Fts3SegR
17230 65 61 64 65 72 2a 29 3b 0a 20 20 20 20 61 70 4e  eader*);.    apN
17240 65 77 20 3d 20 28 46 74 73 33 53 65 67 52 65 61  ew = (Fts3SegRea
17250 64 65 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  der **)sqlite3_r
17260 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e 61 70 53  ealloc(pCsr->apS
17270 65 67 6d 65 6e 74 2c 20 6e 42 79 74 65 29 3b 0a  egment, nByte);.
17280 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29      if( !apNew )
17290 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
172a0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65  ts3SegReaderFree
172b0 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72 65  (pNew);.      re
172c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
172d0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73  M;.    }.    pCs
172e0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 61  r->apSegment = a
172f0 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 73 72  pNew;.  }.  pCsr
17300 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 70 43 73 72  ->apSegment[pCsr
17310 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 5d 20 3d 20  ->nSegment++] = 
17320 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 53  pNew;.  return S
17330 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17340 2a 2a 20 41 64 64 20 73 65 67 2d 72 65 61 64 65  ** Add seg-reade
17350 72 20 6f 62 6a 65 63 74 73 20 74 6f 20 74 68 65  r objects to the
17360 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
17370 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  der object passe
17380 64 20 61 73 20 74 68 65 0a 2a 2a 20 38 74 68 20  d as the.** 8th 
17390 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
173a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
173b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
173c0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
173d0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
173e0 72 20 63 6f 64 65 0a 2a 2a 20 6f 74 68 65 72 77  r code.** otherw
173f0 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
17400 6e 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72  nt fts3SegReader
17410 43 75 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61  Cursor(.  Fts3Ta
17420 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
17430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
17440 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  3 table handle *
17450 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c  /.  int iLangid,
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
17480 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64  id */.  int iInd
17490 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ex,             
174a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
174b0 20 74 6f 20 73 65 61 72 63 68 20 28 66 72 6f 6d   to search (from
174c0 20 30 20 74 6f 20 70 2d 3e 6e 49 6e 64 65 78 2d   0 to p->nIndex-
174d0 31 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  1) */.  int iLev
174e0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
174f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
17500 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
17510 73 63 61 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  scan */.  const 
17520 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20  char *zTerm,    
17530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72            /* Ter
17540 6d 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  m to query for *
17550 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17570 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
17580 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  Term in bytes */
17590 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 2c  .  int isPrefix,
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
175c0 20 70 72 65 66 69 78 20 73 65 61 72 63 68 20 2a   prefix search *
175d0 2f 0a 20 20 69 6e 74 20 69 73 53 63 61 6e 2c 20  /.  int isScan, 
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
17600 63 61 6e 20 66 72 6f 6d 20 7a 54 65 72 6d 20 74  can from zTerm t
17610 6f 20 45 4f 46 20 2a 2f 0a 20 20 46 74 73 33 4d  o EOF */.  Fts3M
17620 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70  ultiSegReader *p
17630 43 73 72 20 20 20 20 20 20 20 20 2f 2a 20 43 75  Csr        /* Cu
17640 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 70  rsor object to p
17650 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
17660 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17670 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
17680 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
17690 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
176a0 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
176b0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
176c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
176d0 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
176e0 20 69 6e 74 20 72 63 32 3b 20 20 20 20 20 20 20   int rc2;       
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17700 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 73 71   /* Result of sq
17710 6c 69 74 65 33 5f 72 65 73 65 74 28 29 20 2a 2f  lite3_reset() */
17720 0a 0a 20 20 2f 2a 20 49 66 20 69 4c 65 76 65 6c  ..  /* If iLevel
17730 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 30 20   is less than 0 
17740 61 6e 64 20 74 68 69 73 20 69 73 20 6e 6f 74 20  and this is not 
17750 61 20 73 63 61 6e 2c 20 69 6e 63 6c 75 64 65 20  a scan, include 
17760 61 20 73 65 67 2d 72 65 61 64 65 72 20 0a 20 20  a seg-reader .  
17770 2a 2a 20 66 6f 72 20 74 68 65 20 70 65 6e 64 69  ** for the pendi
17780 6e 67 2d 74 65 72 6d 73 2e 20 49 66 20 74 68 69  ng-terms. If thi
17790 73 20 69 73 20 61 20 73 63 61 6e 2c 20 74 68 65  s is a scan, the
177a0 6e 20 74 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  n this call must
177b0 20 62 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 6d   be being.  ** m
177c0 61 64 65 20 62 79 20 61 6e 20 66 74 73 34 61 75  ade by an fts4au
177d0 78 20 6d 6f 64 75 6c 65 2c 20 6e 6f 74 20 61 6e  x module, not an
177e0 20 46 54 53 20 74 61 62 6c 65 2e 20 49 6e 20 74   FTS table. In t
177f0 68 69 73 20 63 61 73 65 20 63 61 6c 6c 69 6e 67  his case calling
17800 0a 20 20 2a 2a 20 46 74 73 33 53 65 67 52 65 61  .  ** Fts3SegRea
17810 64 65 72 50 65 6e 64 69 6e 67 20 6d 69 67 68 74  derPending might
17820 20 73 65 67 66 61 75 6c 74 2c 20 61 73 20 74 68   segfault, as th
17830 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
17840 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
17850 66 74 73 34 61 75 78 20 61 72 65 20 6e 6f 74 20  fts4aux are not 
17860 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f 70 75 6c  completely popul
17870 61 74 65 64 2e 20 53 6f 20 69 74 27 73 20 65 61  ated. So it's ea
17880 73 69 65 73 74 20 74 6f 20 66 69 6c 74 65 72 20  siest to filter 
17890 74 68 65 73 65 0a 20 20 2a 2a 20 63 61 6c 6c 73  these.  ** calls
178a0 20 6f 75 74 20 68 65 72 65 2e 20 20 2a 2f 0a 20   out here.  */. 
178b0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 26 26   if( iLevel<0 &&
178c0 20 70 2d 3e 61 49 6e 64 65 78 20 29 7b 0a 20 20   p->aIndex ){.  
178d0 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20    Fts3SegReader 
178e0 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 72  *pSeg = 0;.    r
178f0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
17900 65 67 52 65 61 64 65 72 50 65 6e 64 69 6e 67 28  egReaderPending(
17910 70 2c 20 69 49 6e 64 65 78 2c 20 7a 54 65 72 6d  p, iIndex, zTerm
17920 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66 69  , nTerm, isPrefi
17930 78 7c 7c 69 73 53 63 61 6e 2c 20 26 70 53 65 67  x||isScan, &pSeg
17940 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
17950 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67  QLITE_OK && pSeg
17960 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
17970 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73  ts3SegReaderCurs
17980 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c 20 70  orAppend(pCsr, p
17990 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Seg);.    }.  }.
179a0 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 21 3d 46  .  if( iLevel!=F
179b0 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 50 45  TS3_SEGCURSOR_PE
179c0 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20 69 66 28  NDING ){.    if(
179d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
179e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
179f0 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64 69  ite3Fts3AllSegdi
17a00 72 73 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69  rs(p, iLangid, i
17a10 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 2c 20 26  Index, iLevel, &
17a20 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pStmt);.    }.. 
17a30 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
17a40 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
17a50 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c  E_ROW==(rc = sql
17a60 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17a70 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53  ) ){.      Fts3S
17a80 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d  egReader *pSeg =
17a90 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65   0;..      /* Re
17aa0 61 64 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  ad the values re
17ab0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
17ac0 4c 45 43 54 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  LECT into local 
17ad0 76 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20  variables. */.  
17ae0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
17af0 34 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 3d 20  4 iStartBlock = 
17b00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17b10 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 3b 0a  nt64(pStmt, 1);.
17b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
17b30 74 36 34 20 69 4c 65 61 76 65 73 45 6e 64 42 6c  t64 iLeavesEndBl
17b40 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ock = sqlite3_co
17b50 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
17b60 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 2);.      sqli
17b70 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c  te3_int64 iEndBl
17b80 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ock = sqlite3_co
17b90 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
17ba0 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  , 3);.      int 
17bb0 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f  nRoot = sqlite3_
17bc0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
17bd0 6d 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 68  mt, 4);.      ch
17be0 61 72 20 63 6f 6e 73 74 20 2a 7a 52 6f 6f 74 20  ar const *zRoot 
17bf0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17c00 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 3b  _blob(pStmt, 4);
17c10 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 7a 54  ..      /* If zT
17c20 65 72 6d 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  erm is not NULL,
17c30 20 61 6e 64 20 74 68 69 73 20 73 65 67 6d 65 6e   and this segmen
17c40 74 20 69 73 20 6e 6f 74 20 73 74 6f 72 65 64 20  t is not stored 
17c50 65 6e 74 69 72 65 6c 79 20 6f 6e 20 69 74 73 0a  entirely on its.
17c60 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20 6e 6f        ** root no
17c70 64 65 2c 20 74 68 65 20 72 61 6e 67 65 20 6f 66  de, the range of
17c80 20 6c 65 61 76 65 73 20 73 63 61 6e 6e 65 64 20   leaves scanned 
17c90 63 61 6e 20 62 65 20 72 65 64 75 63 65 64 2e 20  can be reduced. 
17ca0 44 6f 20 74 68 69 73 2e 20 2a 2f 0a 20 20 20 20  Do this. */.    
17cb0 20 20 69 66 28 20 69 53 74 61 72 74 42 6c 6f 63    if( iStartBloc
17cc0 6b 20 26 26 20 7a 54 65 72 6d 20 29 7b 0a 20 20  k && zTerm ){.  
17cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
17ce0 74 36 34 20 2a 70 69 20 3d 20 28 69 73 50 72 65  t64 *pi = (isPre
17cf0 66 69 78 20 3f 20 26 69 4c 65 61 76 65 73 45 6e  fix ? &iLeavesEn
17d00 64 42 6c 6f 63 6b 20 3a 20 30 29 3b 0a 20 20 20  dBlock : 0);.   
17d10 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65       rc = fts3Se
17d20 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a 54 65 72  lectLeaf(p, zTer
17d30 6d 2c 20 6e 54 65 72 6d 2c 20 7a 52 6f 6f 74 2c  m, nTerm, zRoot,
17d40 20 6e 52 6f 6f 74 2c 20 26 69 53 74 61 72 74 42   nRoot, &iStartB
17d50 6c 6f 63 6b 2c 20 70 69 29 3b 0a 20 20 20 20 20  lock, pi);.     
17d60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17d70 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
17d80 73 68 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  shed;.        if
17d90 28 20 69 73 50 72 65 66 69 78 3d 3d 30 20 26 26  ( isPrefix==0 &&
17da0 20 69 73 53 63 61 6e 3d 3d 30 20 29 20 69 4c 65   isScan==0 ) iLe
17db0 61 76 65 73 45 6e 64 42 6c 6f 63 6b 20 3d 20 69  avesEndBlock = i
17dc0 53 74 61 72 74 42 6c 6f 63 6b 3b 0a 20 20 20 20  StartBlock;.    
17dd0 20 20 7d 0a 20 0a 20 20 20 20 20 20 72 63 20 3d    }. .      rc =
17de0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
17df0 65 61 64 65 72 4e 65 77 28 70 43 73 72 2d 3e 6e  eaderNew(pCsr->n
17e00 53 65 67 6d 65 6e 74 2b 31 2c 20 0a 20 20 20 20  Segment+1, .    
17e10 20 20 20 20 20 20 28 69 73 50 72 65 66 69 78 3d        (isPrefix=
17e20 3d 30 20 26 26 20 69 73 53 63 61 6e 3d 3d 30 29  =0 && isScan==0)
17e30 2c 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ,.          iSta
17e40 72 74 42 6c 6f 63 6b 2c 20 69 4c 65 61 76 65 73  rtBlock, iLeaves
17e50 45 6e 64 42 6c 6f 63 6b 2c 20 0a 20 20 20 20 20  EndBlock, .     
17e60 20 20 20 20 20 69 45 6e 64 42 6c 6f 63 6b 2c 20       iEndBlock, 
17e70 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 70  zRoot, nRoot, &p
17e80 53 65 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Seg.      );.   
17e90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17ea0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69  E_OK ) goto fini
17eb0 73 68 65 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  shed;.      rc =
17ec0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75   fts3SegReaderCu
17ed0 72 73 6f 72 41 70 70 65 6e 64 28 70 43 73 72 2c  rsorAppend(pCsr,
17ee0 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20   pSeg);.    }.  
17ef0 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20  }.. finished:.  
17f00 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  rc2 = sqlite3_re
17f10 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
17f20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
17f30 45 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  E ) rc = rc2;.. 
17f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17f50 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 63 75  *.** Set up a cu
17f60 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72 20  rsor object for 
17f70 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
17f80 68 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  h a full-text in
17f90 64 65 78 20 6f 72 20 61 20 0a 2a 2a 20 73 69 6e  dex or a .** sin
17fa0 67 6c 65 20 6c 65 76 65 6c 20 74 68 65 72 65 69  gle level therei
17fb0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
17fc0 33 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75  3Fts3SegReaderCu
17fd0 72 73 6f 72 28 0a 20 20 46 74 73 33 54 61 62 6c  rsor(.  Fts3Tabl
17fe0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
17ff0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
18000 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
18010 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20    int iLangid,  
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 2d 69 64    /* Language-id
18040 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
18050 69 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20  int iIndex,     
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
18080 63 68 20 28 66 72 6f 6d 20 30 20 74 6f 20 70 2d  ch (from 0 to p-
18090 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 20  >nIndex-1) */.  
180a0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73 65 67 6d  /* Level of segm
180d0 65 6e 74 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ents to scan */.
180e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
180f0 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
18100 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 71 75 65    /* Term to que
18110 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
18120 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  nTerm,          
18130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18140 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
18150 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
18160 73 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 20  sPrefix,        
18170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18180 75 65 20 66 6f 72 20 61 20 70 72 65 66 69 78 20  ue for a prefix 
18190 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
181a0 69 73 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20  isScan,         
181b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
181c0 72 75 65 20 74 6f 20 73 63 61 6e 20 66 72 6f 6d  rue to scan from
181d0 20 7a 54 65 72 6d 20 74 6f 20 45 4f 46 20 2a 2f   zTerm to EOF */
181e0 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
181f0 65 61 64 65 72 20 2a 70 43 73 72 20 20 20 20 20  eader *pCsr     
18200 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65    /* Cursor obje
18210 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
18220 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  /.){.  assert( i
18230 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64  Index>=0 && iInd
18240 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a  ex<p->nIndex );.
18250 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c    assert( iLevel
18260 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  ==FTS3_SEGCURSOR
18270 5f 41 4c 4c 0a 20 20 20 20 20 20 7c 7c 20 20 69  _ALL.      ||  i
18280 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43  Level==FTS3_SEGC
18290 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 0a 20  URSOR_PENDING . 
182a0 20 20 20 20 20 7c 7c 20 20 69 4c 65 76 65 6c 3e       ||  iLevel>
182b0 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  =0.  );.  assert
182c0 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45  ( iLevel<FTS3_SE
182d0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b  GDIR_MAXLEVEL );
182e0 0a 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f  .  assert( FTS3_
182f0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 3c 30 20  SEGCURSOR_ALL<0 
18300 26 26 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f  && FTS3_SEGCURSO
18310 52 5f 50 45 4e 44 49 4e 47 3c 30 20 29 3b 0a 20  R_PENDING<0 );. 
18320 20 61 73 73 65 72 74 28 20 69 73 50 72 65 66 69   assert( isPrefi
18330 78 3d 3d 30 20 7c 7c 20 69 73 53 63 61 6e 3d 3d  x==0 || isScan==
18340 30 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  0 );..  memset(p
18350 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Csr, 0, sizeof(F
18360 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
18370 72 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  r));.  return ft
18380 73 33 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  s3SegReaderCurso
18390 72 28 0a 20 20 20 20 20 20 70 2c 20 69 4c 61 6e  r(.      p, iLan
183a0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65  gid, iIndex, iLe
183b0 76 65 6c 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  vel, zTerm, nTer
183c0 6d 2c 20 69 73 50 72 65 66 69 78 2c 20 69 73 53  m, isPrefix, isS
183d0 63 61 6e 2c 20 70 43 73 72 0a 20 20 29 3b 0a 7d  can, pCsr.  );.}
183e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 61 64 64 69 74  ../*.** In addit
183f0 69 6f 6e 20 74 6f 20 69 74 73 20 63 75 72 72 65  ion to its curre
18400 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  nt configuration
18410 2c 20 68 61 76 65 20 74 68 65 20 46 74 73 33 4d  , have the Fts3M
18420 75 6c 74 69 53 65 67 52 65 61 64 65 72 0a 2a 2a  ultiSegReader.**
18430 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 34   passed as the 4
18440 74 68 20 61 72 67 75 6d 65 6e 74 20 61 6c 73 6f  th argument also
18450 20 73 63 61 6e 20 74 68 65 20 64 6f 63 6c 69 73   scan the doclis
18460 74 20 66 6f 72 20 74 65 72 6d 20 7a 54 65 72 6d  t for term zTerm
18470 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 53 51  /nTerm..**.** SQ
18480 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18490 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
184a0 6f 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73  occurs, otherwis
184b0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
184c0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
184d0 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
184e0 64 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f  derCursorAddZero
184f0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
18500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18510 20 20 20 20 2f 2a 20 46 54 53 20 76 69 72 74 75      /* FTS virtu
18520 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
18530 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
18540 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
18550 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20  zTerm,          
18560 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
18570 63 61 6e 20 64 6f 63 6c 69 73 74 20 6f 66 20 2a  can doclist of *
18580 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  /.  int nTerm,  
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
185b0 20 62 79 74 65 73 20 69 6e 20 7a 54 65 72 6d 20   bytes in zTerm 
185c0 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65  */.  Fts3MultiSe
185d0 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20 20  gReader *pCsr   
185e0 20 20 20 20 20 2f 2a 20 46 74 73 33 4d 75 6c 74       /* Fts3Mult
185f0 69 53 65 67 52 65 61 64 65 72 20 74 6f 20 6d 6f  iSegReader to mo
18600 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  dify */.){.  ret
18610 75 72 6e 20 66 74 73 33 53 65 67 52 65 61 64 65  urn fts3SegReade
18620 72 43 75 72 73 6f 72 28 70 2c 20 0a 20 20 20 20  rCursor(p, .    
18630 20 20 69 4c 61 6e 67 69 64 2c 20 30 2c 20 46 54    iLangid, 0, FT
18640 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
18650 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
18660 30 2c 20 30 2c 70 43 73 72 0a 20 20 29 3b 0a 7d  0, 0,pCsr.  );.}
18670 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e 20  ../*.** Open an 
18680 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
18690 65 72 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  er to scan the d
186a0 6f 63 6c 69 73 74 20 66 6f 72 20 74 65 72 6d 20  oclist for term 
186b0 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 4f 72 2c  zTerm/nTerm. Or,
186c0 0a 2a 2a 20 69 66 20 69 73 50 72 65 66 69 78 20  .** if isPrefix 
186d0 69 73 20 74 72 75 65 2c 20 74 6f 20 73 63 61 6e  is true, to scan
186e0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
186f0 20 61 6c 6c 20 74 65 72 6d 73 20 66 6f 72 20 77   all terms for w
18700 68 69 63 68 20 0a 2a 2a 20 7a 54 65 72 6d 2f 6e  hich .** zTerm/n
18710 54 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78  Term is a prefix
18720 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
18730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18740 4b 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61  K and write.** a
18750 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18760 6e 65 77 20 46 74 73 33 4d 75 6c 74 69 53 65 67  new Fts3MultiSeg
18770 52 65 61 64 65 72 20 74 6f 20 2a 70 70 53 65 67  Reader to *ppSeg
18780 63 73 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  csr. Otherwise, 
18790 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c  return.** an SQL
187a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
187b0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
187c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
187d0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
187e0 66 72 65 65 20 74 68 69 73 20 6f 62 6a 65 63 74  free this object
187f0 20 62 79 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   by eventually.*
18800 2a 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f 20  * passing it to 
18810 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  fts3SegReaderCur
18820 73 6f 72 46 72 65 65 28 29 20 0a 2a 2a 0a 2a 2a  sorFree() .**.**
18830 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18840 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
18850 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
18860 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
18870 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 75  rror code..** Ou
18880 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a  tput parameter *
18890 70 70 53 65 67 63 73 72 20 69 73 20 73 65 74 20  ppSegcsr is set 
188a0 74 6f 20 30 20 69 66 20 61 6e 20 65 72 72 6f 72  to 0 if an error
188b0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
188c0 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53  ic int fts3TermS
188d0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 0a  egReaderCursor(.
188e0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
188f0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
18900 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
18910 6c 65 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65  le cursor handle
18920 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18930 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20   *zTerm,        
18940 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f        /* Term to
18950 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
18960 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d  /* Size of zTerm
18990 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
189a0 6e 74 20 69 73 50 72 65 66 69 78 2c 20 20 20 20  nt isPrefix,    
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
189c0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65  * True for a pre
189d0 66 69 78 20 73 65 61 72 63 68 20 2a 2f 0a 20 20  fix search */.  
189e0 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64  Fts3MultiSegRead
189f0 65 72 20 2a 2a 70 70 53 65 67 63 73 72 20 20 20  er **ppSegcsr   
18a00 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  /* OUT: Allocate
18a10 64 20 73 65 67 2d 72 65 61 64 65 72 20 63 75 72  d seg-reader cur
18a20 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  sor */.){.  Fts3
18a30 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a  MultiSegReader *
18a40 70 53 65 67 63 73 72 3b 20 20 20 20 2f 2a 20 4f  pSegcsr;    /* O
18a50 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
18a60 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
18a70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18a80 45 5f 4e 4f 4d 45 4d 3b 20 20 20 20 20 20 20 20  E_NOMEM;        
18a90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18aa0 20 2a 2f 0a 0a 20 20 70 53 65 67 63 73 72 20 3d   */..  pSegcsr =
18ab0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
18ac0 73 69 7a 65 6f 66 28 46 74 73 33 4d 75 6c 74 69  sizeof(Fts3Multi
18ad0 53 65 67 52 65 61 64 65 72 29 29 3b 0a 20 20 69  SegReader));.  i
18ae0 66 28 20 70 53 65 67 63 73 72 20 29 7b 0a 20 20  f( pSegcsr ){.  
18af0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
18b00 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20   bFound = 0;    
18b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18b20 75 65 20 6f 6e 63 65 20 61 6e 20 69 6e 64 65 78  ue once an index
18b30 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 20   has been found 
18b40 2a 2f 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65  */.    Fts3Table
18b50 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
18b60 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
18b70 74 61 62 3b 0a 0a 20 20 20 20 69 66 28 20 69 73  tab;..    if( is
18b80 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
18b90 66 6f 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d  for(i=1; bFound=
18ba0 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65  =0 && i<p->nInde
18bb0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  x; i++){.       
18bc0 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69   if( p->aIndex[i
18bd0 5d 2e 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d  ].nPrefix==nTerm
18be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
18bf0 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
18c00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18c10 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
18c20 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
18c30 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
18c40 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
18c50 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
18c60 6d 2c 20 6e 54 65 72 6d 2c 20 30 2c 20 30 2c 20  m, nTerm, 0, 0, 
18c70 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
18c80 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70    );.          p
18c90 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20  Segcsr->bLookup 
18ca0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
18cb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
18cc0 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64 3d 3d 30  r(i=1; bFound==0
18cd0 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 78 3b   && i<p->nIndex;
18ce0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
18cf0 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b 69 5d 2e  f( p->aIndex[i].
18d00 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72 6d 2b 31  nPrefix==nTerm+1
18d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46   ){.          bF
18d20 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
18d30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18d40 46 74 73 33 53 65 67 52 65 61 64 65 72 43 75 72  Fts3SegReaderCur
18d50 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e 69 4c 61  sor(p, pCsr->iLa
18d60 6e 67 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ngid, .         
18d70 20 20 20 20 20 69 2c 20 46 54 53 33 5f 53 45 47       i, FTS3_SEG
18d80 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
18d90 6d 2c 20 6e 54 65 72 6d 2c 20 31 2c 20 30 2c 20  m, nTerm, 1, 0, 
18da0 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20 20  pSegcsr.        
18db0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
18dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18de0 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64  rc = fts3SegRead
18df0 65 72 43 75 72 73 6f 72 41 64 64 5a 65 72 6f 28  erCursorAddZero(
18e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e10 20 70 2c 20 70 43 73 72 2d 3e 69 4c 61 6e 67 69   p, pCsr->iLangi
18e20 64 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  d, zTerm, nTerm,
18e30 20 70 53 65 67 63 73 72 0a 20 20 20 20 20 20 20   pSegcsr.       
18e40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
18e50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
18e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18e70 20 69 66 28 20 62 46 6f 75 6e 64 3d 3d 30 20 29   if( bFound==0 )
18e80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18e90 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
18ea0 72 43 75 72 73 6f 72 28 70 2c 20 70 43 73 72 2d  rCursor(p, pCsr-
18eb0 3e 69 4c 61 6e 67 69 64 2c 20 0a 20 20 20 20 20  >iLangid, .     
18ec0 20 20 20 20 20 30 2c 20 46 54 53 33 5f 53 45 47       0, FTS3_SEG
18ed0 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a 54 65 72  CURSOR_ALL, zTer
18ee0 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72 65 66  m, nTerm, isPref
18ef0 69 78 2c 20 30 2c 20 70 53 65 67 63 73 72 0a 20  ix, 0, pSegcsr. 
18f00 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 53       );.      pS
18f10 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 20 3d  egcsr->bLookup =
18f20 20 21 69 73 50 72 65 66 69 78 3b 0a 20 20 20 20   !isPrefix;.    
18f30 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53 65 67 63  }.  }..  *ppSegc
18f40 73 72 20 3d 20 70 53 65 67 63 73 72 3b 0a 20 20  sr = pSegcsr;.  
18f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18f60 0a 2a 2a 20 46 72 65 65 20 61 6e 20 46 74 73 33  .** Free an Fts3
18f70 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 61  MultiSegReader a
18f80 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 33  llocated by fts3
18f90 54 65 72 6d 53 65 67 52 65 61 64 65 72 43 75 72  TermSegReaderCur
18fa0 73 6f 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  sor()..*/.static
18fb0 20 76 6f 69 64 20 66 74 73 33 53 65 67 52 65 61   void fts3SegRea
18fc0 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 46 74  derCursorFree(Ft
18fd0 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
18fe0 20 2a 70 53 65 67 63 73 72 29 7b 0a 20 20 73 71   *pSegcsr){.  sq
18ff0 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64  lite3Fts3SegRead
19000 65 72 46 69 6e 69 73 68 28 70 53 65 67 63 73 72  erFinish(pSegcsr
19010 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
19020 65 28 70 53 65 67 63 73 72 29 3b 0a 7d 0a 0a 2f  e(pSegcsr);.}../
19030 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19040 6f 6e 20 72 65 74 72 69 65 76 65 73 20 74 68 65  on retrieves the
19050 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
19060 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20   specified term 
19070 28 6f 72 20 74 65 72 6d 0a 2a 2a 20 70 72 65 66  (or term.** pref
19080 69 78 29 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ix) from the dat
19090 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
190a0 20 69 6e 74 20 66 74 73 33 54 65 72 6d 53 65 6c   int fts3TermSel
190b0 65 63 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ect(.  Fts3Table
190c0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
190d0 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
190e0 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a  l table handle *
190f0 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65 54 6f  /.  Fts3PhraseTo
19100 6b 65 6e 20 2a 70 54 6f 6b 2c 20 20 20 20 20 20  ken *pTok,      
19110 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20      /* Token to 
19120 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
19130 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19150 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 71 75 65 72  * Column to quer
19160 79 20 28 6f 72 20 2d 76 65 20 66 6f 72 20 61 6c  y (or -ve for al
19170 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f 0a 20 20  l columns) */.  
19180 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20 20 20 20  int *pnOut,     
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
191b0 62 75 66 66 65 72 20 61 74 20 2a 70 70 4f 75 74  buffer at *ppOut
191c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f   */.  char **ppO
191d0 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
191e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
191f0 6c 6c 6f 63 65 64 20 72 65 73 75 6c 74 20 62 75  lloced result bu
19200 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ffer */.){.  int
19210 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19230 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19240 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61   Fts3MultiSegRea
19250 64 65 72 20 2a 70 53 65 67 63 73 72 3b 20 20 20  der *pSegcsr;   
19260 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 63   /* Seg-reader c
19270 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74  ursor for this t
19280 65 72 6d 20 2a 2f 0a 20 20 54 65 72 6d 53 65 6c  erm */.  TermSel
19290 65 63 74 20 74 73 63 3b 20 20 20 20 20 20 20 20  ect tsc;        
192a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
192b0 63 74 20 66 6f 72 20 70 61 69 72 2d 77 69 73 65  ct for pair-wise
192c0 20 64 6f 63 6c 69 73 74 20 6d 65 72 67 69 6e 67   doclist merging
192d0 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 6c   */.  Fts3SegFil
192e0 74 65 72 20 66 69 6c 74 65 72 3b 20 20 20 20 20  ter filter;     
192f0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
19300 20 74 65 72 6d 20 66 69 6c 74 65 72 20 63 6f 6e   term filter con
19310 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20  figuration */.. 
19320 20 70 53 65 67 63 73 72 20 3d 20 70 54 6f 6b 2d   pSegcsr = pTok-
19330 3e 70 53 65 67 63 73 72 3b 0a 20 20 6d 65 6d 73  >pSegcsr;.  mems
19340 65 74 28 26 74 73 63 2c 20 30 2c 20 73 69 7a 65  et(&tsc, 0, size
19350 6f 66 28 54 65 72 6d 53 65 6c 65 63 74 29 29 3b  of(TermSelect));
19360 0a 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73  ..  filter.flags
19370 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f   = FTS3_SEGMENT_
19380 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20 7c 20 46  IGNORE_EMPTY | F
19390 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55  TS3_SEGMENT_REQU
193a0 49 52 45 5f 50 4f 53 0a 20 20 20 20 20 20 20 20  IRE_POS.        
193b0 7c 20 28 70 54 6f 6b 2d 3e 69 73 50 72 65 66 69  | (pTok->isPrefi
193c0 78 20 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54  x ? FTS3_SEGMENT
193d0 5f 50 52 45 46 49 58 20 3a 20 30 29 0a 20 20 20  _PREFIX : 0).   
193e0 20 20 20 20 20 7c 20 28 70 54 6f 6b 2d 3e 62 46       | (pTok->bF
193f0 69 72 73 74 20 3f 20 46 54 53 33 5f 53 45 47 4d  irst ? FTS3_SEGM
19400 45 4e 54 5f 46 49 52 53 54 20 3a 20 30 29 0a 20  ENT_FIRST : 0). 
19410 20 20 20 20 20 20 20 7c 20 28 69 43 6f 6c 75 6d         | (iColum
19420 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 46  n<p->nColumn ? F
19430 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 4f 4c 55  TS3_SEGMENT_COLU
19440 4d 4e 5f 46 49 4c 54 45 52 20 3a 20 30 29 3b 0a  MN_FILTER : 0);.
19450 20 20 66 69 6c 74 65 72 2e 69 43 6f 6c 20 3d 20    filter.iCol = 
19460 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66 69 6c 74 65  iColumn;.  filte
19470 72 2e 7a 54 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e  r.zTerm = pTok->
19480 7a 3b 0a 20 20 66 69 6c 74 65 72 2e 6e 54 65 72  z;.  filter.nTer
19490 6d 20 3d 20 70 54 6f 6b 2d 3e 6e 3b 0a 0a 20 20  m = pTok->n;..  
194a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
194b0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 70  SegReaderStart(p
194c0 2c 20 70 53 65 67 63 73 72 2c 20 26 66 69 6c 74  , pSegcsr, &filt
194d0 65 72 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  er);.  while( SQ
194e0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20 20  LITE_OK==rc.    
194f0 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d    && SQLITE_ROW=
19500 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  =(rc = sqlite3Ft
19510 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28  s3SegReaderStep(
19520 70 2c 20 70 53 65 67 63 73 72 29 29 20 0a 20 20  p, pSegcsr)) .  
19530 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
19540 54 65 72 6d 53 65 6c 65 63 74 4d 65 72 67 65 28  TermSelectMerge(
19550 70 2c 20 26 74 73 63 2c 20 70 53 65 67 63 73 72  p, &tsc, pSegcsr
19560 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 53 65 67  ->aDoclist, pSeg
19570 63 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b 0a  csr->nDoclist);.
19580 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
19590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
195a0 72 63 20 3d 20 66 74 73 33 54 65 72 6d 53 65 6c  rc = fts3TermSel
195b0 65 63 74 46 69 6e 69 73 68 4d 65 72 67 65 28 70  ectFinishMerge(p
195c0 2c 20 26 74 73 63 29 3b 0a 20 20 7d 0a 20 20 69  , &tsc);.  }.  i
195d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
195e0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d   ){.    *ppOut =
195f0 20 74 73 63 2e 61 61 4f 75 74 70 75 74 5b 30 5d   tsc.aaOutput[0]
19600 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20 3d 20 74  ;.    *pnOut = t
19610 73 63 2e 61 6e 4f 75 74 70 75 74 5b 30 5d 3b 0a  sc.anOutput[0];.
19620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19630 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
19640 20 69 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 74   i<SizeofArray(t
19650 73 63 2e 61 61 4f 75 74 70 75 74 29 3b 20 69 2b  sc.aaOutput); i+
19660 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
19670 33 5f 66 72 65 65 28 74 73 63 2e 61 61 4f 75 74  3_free(tsc.aaOut
19680 70 75 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  put[i]);.    }. 
19690 20 7d 0a 0a 20 20 66 74 73 33 53 65 67 52 65 61   }..  fts3SegRea
196a0 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70 53  derCursorFree(pS
196b0 65 67 63 73 72 29 3b 0a 20 20 70 54 6f 6b 2d 3e  egcsr);.  pTok->
196c0 70 53 65 67 63 73 72 20 3d 20 30 3b 0a 20 20 72  pSegcsr = 0;.  r
196d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
196e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
196f0 20 63 6f 75 6e 74 73 20 74 68 65 20 74 6f 74 61   counts the tota
19700 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 69  l number of doci
19710 64 73 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  ds in the doclis
19720 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 62  t stored.** in b
19730 75 66 66 65 72 20 61 4c 69 73 74 5b 5d 2c 20 73  uffer aList[], s
19740 69 7a 65 20 6e 4c 69 73 74 20 62 79 74 65 73 2e  ize nList bytes.
19750 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
19760 50 6f 73 6c 69 73 74 20 61 72 67 75 6d 65 6e 74  Poslist argument
19770 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
19780 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
19790 74 20 74 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  t the doclist.**
197a0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 73 69   contains a posi
197b0 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 6c 6c 6f 77  tion-list follow
197c0 69 6e 67 20 65 61 63 68 20 64 6f 63 69 64 2e 20  ing each docid. 
197d0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
197e0 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 68 61 74   assumed.** that
197f0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20   the doclist is 
19800 73 69 6d 70 6c 79 20 61 20 6c 69 73 74 20 6f 66  simply a list of
19810 20 64 6f 63 69 64 73 20 73 74 6f 72 65 64 20 61   docids stored a
19820 73 20 64 65 6c 74 61 20 65 6e 63 6f 64 65 64 20  s delta encoded 
19830 0a 2a 2a 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a  .** varints..*/.
19840 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
19850 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64  oclistCountDocid
19860 73 28 63 68 61 72 20 2a 61 4c 69 73 74 2c 20 69  s(char *aList, i
19870 6e 74 20 6e 4c 69 73 74 29 7b 0a 20 20 69 6e 74  nt nList){.  int
19880 20 6e 44 6f 63 20 3d 20 30 3b 20 20 20 20 20 20   nDoc = 0;      
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
198a0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
198b0 20 20 69 66 28 20 61 4c 69 73 74 20 29 7b 0a 20    if( aList ){. 
198c0 20 20 20 63 68 61 72 20 2a 61 45 6e 64 20 3d 20     char *aEnd = 
198d0 26 61 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 20 20  &aList[nList];  
198e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
198f0 6e 65 20 62 79 74 65 20 61 66 74 65 72 20 45 4f  ne byte after EO
19900 46 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 70  F */.    char *p
19910 20 3d 20 61 4c 69 73 74 3b 20 20 20 20 20 20 20   = aList;       
19920 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
19930 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
19940 3c 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 6e  <aEnd ){.      n
19950 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  Doc++;.      whi
19960 6c 65 28 20 28 2a 70 2b 2b 29 26 30 78 38 30 20  le( (*p++)&0x80 
19970 29 3b 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 64  );     /* Skip d
19980 6f 63 69 64 20 76 61 72 69 6e 74 20 2a 2f 0a 20  ocid varint */. 
19990 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74       fts3Poslist
199a0 43 6f 70 79 28 30 2c 20 26 70 29 3b 20 20 20 2f  Copy(0, &p);   /
199b0 2a 20 53 6b 69 70 20 6f 76 65 72 20 70 6f 73 69  * Skip over posi
199c0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
199d0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
199e0 20 6e 44 6f 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nDoc;.}../*.** 
199f0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
19a00 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  or to the next r
19a10 6f 77 20 69 6e 20 74 68 65 20 25 5f 63 6f 6e 74  ow in the %_cont
19a20 65 6e 74 20 74 61 62 6c 65 20 74 68 61 74 0a 2a  ent table that.*
19a30 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  * matches the se
19a40 61 72 63 68 20 63 72 69 74 65 72 69 61 2e 20 20  arch criteria.  
19a50 46 6f 72 20 61 20 4d 41 54 43 48 20 73 65 61 72  For a MATCH sear
19a60 63 68 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ch, this will be
19a70 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20 72 6f 77  .** the next row
19a80 20 74 68 61 74 20 6d 61 74 63 68 65 73 2e 20 46   that matches. F
19a90 6f 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  or a full-table 
19aa0 73 63 61 6e 2c 20 74 68 69 73 20 77 69 6c 6c 20  scan, this will 
19ab0 62 65 0a 2a 2a 20 73 69 6d 70 6c 79 20 74 68 65  be.** simply the
19ac0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
19ad0 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
19ae0 2e 20 20 46 6f 72 20 61 20 64 6f 63 69 64 20 6c  .  For a docid l
19af0 6f 6f 6b 75 70 2c 0a 2a 2a 20 74 68 69 73 20 72  ookup,.** this r
19b00 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 65  outine simply se
19b10 74 73 20 74 68 65 20 45 4f 46 20 66 6c 61 67 2e  ts the EOF flag.
19b20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
19b30 4c 49 54 45 5f 4f 4b 20 69 66 20 6e 6f 74 68 69  LITE_OK if nothi
19b40 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20  ng goes wrong.  
19b50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19b60 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e 20 69 66  urned.** even if
19b70 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
19b80 2d 66 69 6c 65 2e 20 20 54 68 65 20 66 74 73 33  -file.  The fts3
19b90 45 6f 66 4d 65 74 68 6f 64 28 29 20 77 69 6c 6c  EofMethod() will
19ba0 20 62 65 20 63 61 6c 6c 65 64 0a 2a 2a 20 73 75   be called.** su
19bb0 62 73 65 71 75 65 6e 74 6c 79 20 74 6f 20 64 65  bsequently to de
19bc0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
19bd0 6f 72 20 6e 6f 74 20 61 6e 20 45 4f 46 20 77 61  or not an EOF wa
19be0 73 20 68 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s hit..*/.static
19bf0 20 69 6e 74 20 66 74 73 33 4e 65 78 74 4d 65 74   int fts3NextMet
19c00 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
19c10 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72  _cursor *pCursor
19c20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  ){.  int rc;.  F
19c30 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
19c40 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
19c50 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
19c60 43 73 72 2d 3e 65 53 65 61 72 63 68 3d 3d 46 54  Csr->eSearch==FT
19c70 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20  S3_DOCID_SEARCH 
19c80 7c 7c 20 70 43 73 72 2d 3e 65 53 65 61 72 63 68  || pCsr->eSearch
19c90 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  ==FTS3_FULLSCAN_
19ca0 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66  SEARCH ){.    if
19cb0 28 20 53 51 4c 49 54 45 5f 52 4f 57 21 3d 73 71  ( SQLITE_ROW!=sq
19cc0 6c 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d  lite3_step(pCsr-
19cd0 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20  >pStmt) ){.     
19ce0 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31   pCsr->isEof = 1
19cf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
19d00 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
19d10 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 65 6c  >pStmt);.    }el
19d20 73 65 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  se{.      pCsr->
19d30 69 50 72 65 76 49 64 20 3d 20 73 71 6c 69 74 65  iPrevId = sqlite
19d40 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
19d50 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
19d60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19d70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  E_OK;.    }.  }e
19d80 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74  lse{.    rc = ft
19d90 73 33 45 76 61 6c 4e 65 78 74 28 28 46 74 73 33  s3EvalNext((Fts3
19da0 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
19db0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
19dc0 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70   ((Fts3Table *)p
19dd0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
19de0 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29  ->pSegments==0 )
19df0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19e00 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
19e10 6f 77 69 6e 67 20 61 72 65 20 63 6f 70 69 65 64  owing are copied
19e20 20 66 72 6f 6d 20 73 71 6c 69 74 65 49 6e 74 2e   from sqliteInt.
19e30 68 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  h..**.** Constan
19e40 74 73 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  ts for the large
19e50 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65 73 74 20  st and smallest 
19e60 70 6f 73 73 69 62 6c 65 20 36 34 2d 62 69 74 20  possible 64-bit 
19e70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 73 2e  signed integers.
19e80 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63 72 6f 73  .** These macros
19e90 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 74 6f   are designed to
19ea0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
19eb0 6f 6e 20 62 6f 74 68 20 33 32 2d 62 69 74 20 61  on both 32-bit a
19ec0 6e 64 20 36 34 2d 62 69 74 0a 2a 2a 20 63 6f 6d  nd 64-bit.** com
19ed0 70 69 6c 65 72 73 2e 0a 2a 2f 0a 23 69 66 6e 64  pilers..*/.#ifnd
19ee0 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
19ef0 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  MATION.# define 
19f00 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 20 28  LARGEST_INT64  (
19f10 30 78 66 66 66 66 66 66 66 66 7c 28 28 28 73 71  0xffffffff|(((sq
19f20 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 66  lite3_int64)0x7f
19f30 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a 23 20  ffffff)<<32)).# 
19f40 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53 54 5f  define SMALLEST_
19f50 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74 65 33  INT64 (((sqlite3
19f60 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c 41 52  _int64)-1) - LAR
19f70 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65 6e 64  GEST_INT64).#end
19f80 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
19f90 20 6e 75 6d 65 72 69 63 20 74 79 70 65 20 6f 66   numeric type of
19fa0 20 61 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 69   argument pVal i
19fb0 73 20 22 69 6e 74 65 67 65 72 22 2c 20 74 68 65  s "integer", the
19fc0 6e 20 72 65 74 75 72 6e 20 69 74 0a 2a 2a 20 63  n return it.** c
19fd0 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 36 34  onverted to a 64
19fe0 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
19ff0 67 65 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ger. Otherwise, 
1a000 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  return a copy of
1a010 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 70  .** the second p
1a020 61 72 61 6d 65 74 65 72 2c 20 69 44 65 66 61 75  arameter, iDefau
1a030 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  lt..*/.static sq
1a040 6c 69 74 65 33 5f 69 6e 74 36 34 20 66 74 73 33  lite3_int64 fts3
1a050 44 6f 63 69 64 52 61 6e 67 65 28 73 71 6c 69 74  DocidRange(sqlit
1a060 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
1a070 69 36 34 20 69 44 65 66 61 75 6c 74 29 7b 0a 20  i64 iDefault){. 
1a080 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
1a090 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
1a0a0 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75 6d 65 72  ite3_value_numer
1a0b0 69 63 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 20  ic_type(pVal);. 
1a0c0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51     if( eType==SQ
1a0d0 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
1a0e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1a0f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1a100 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (pVal);.    }.  
1a110 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 65 66 61  }.  return iDefa
1a120 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ult;.}../*.** Th
1a130 69 73 20 69 73 20 74 68 65 20 78 46 69 6c 74 65  is is the xFilte
1a140 72 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  r interface for 
1a150 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
1a160 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 76  e.  See.** the v
1a170 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 46 69  irtual table xFi
1a180 6c 74 65 72 20 6d 65 74 68 6f 64 20 64 6f 63 75  lter method docu
1a190 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 61 64  mentation for ad
1a1a0 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69 6e 66 6f  ditional.** info
1a1b0 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  rmation..**.** I
1a1c0 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 46  f idxNum==FTS3_F
1a1d0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 74  ULLSCAN_SEARCH t
1a1e0 68 65 6e 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  hen do a full ta
1a1f0 62 6c 65 20 73 63 61 6e 20 61 67 61 69 6e 73 74  ble scan against
1a200 0a 2a 2a 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  .** the %_conten
1a210 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  t table..**.** I
1a220 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53 33 5f 44  f idxNum==FTS3_D
1a230 4f 43 49 44 5f 53 45 41 52 43 48 20 74 68 65 6e  OCID_SEARCH then
1a240 20 64 6f 20 61 20 64 6f 63 69 64 20 6c 6f 6f 6b   do a docid look
1a250 75 70 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  up for a single 
1a260 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
1a270 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1a280 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64 78 4e 75 6d  .**.** If idxNum
1a290 3e 3d 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f  >=FTS3_FULLTEXT_
1a2a0 53 45 41 52 43 48 20 74 68 65 6e 20 75 73 65 20  SEARCH then use 
1a2b0 74 68 65 20 66 75 6c 6c 20 74 65 78 74 20 69 6e  the full text in
1a2c0 64 65 78 2e 20 20 54 68 65 0a 2a 2a 20 63 6f 6c  dex.  The.** col
1a2d0 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d  umn on the left-
1a2e0 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1a2f0 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20   MATCH operator 
1a300 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6e 75 6d  is column.** num
1a310 62 65 72 20 69 64 78 4e 75 6d 2d 46 54 53 33 5f  ber idxNum-FTS3_
1a320 46 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 2c  FULLTEXT_SEARCH,
1a330 20 30 20 69 6e 64 65 78 65 64 2e 20 20 61 72 67   0 indexed.  arg
1a340 76 5b 30 5d 20 69 73 20 74 68 65 20 72 69 67 68  v[0] is the righ
1a350 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20 6f  t-hand.** side o
1a360 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
1a370 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
1a380 69 6e 74 20 66 74 73 33 46 69 6c 74 65 72 4d 65  int fts3FilterMe
1a390 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  thod(.  sqlite3_
1a3a0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1a3b0 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  rsor,   /* The c
1a3c0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 74  ursor used for t
1a3d0 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  his query */.  i
1a3e0 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20 20 20 20  nt idxNum,      
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a400 2a 20 53 74 72 61 74 65 67 79 20 69 6e 64 65 78  * Strategy index
1a410 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a420 20 2a 69 64 78 53 74 72 2c 20 20 20 20 20 20 20   *idxStr,       
1a430 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
1a440 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a470 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 70  f elements in ap
1a480 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  Val */.  sqlite3
1a490 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1a4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
1a4b0 6d 65 6e 74 73 20 66 6f 72 20 74 68 65 20 69 6e  ments for the in
1a4c0 64 65 78 69 6e 67 20 73 63 68 65 6d 65 20 2a 2f  dexing scheme */
1a4d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1a4e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
1a4f0 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
1a500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a510 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  QL statement use
1a520 64 20 74 6f 20 61 63 63 65 73 73 20 25 5f 63 6f  d to access %_co
1a530 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntent */.  int e
1a540 53 65 61 72 63 68 3b 0a 20 20 46 74 73 33 54 61  Search;.  Fts3Ta
1a550 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
1a560 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 70  ble *)pCursor->p
1a570 56 74 61 62 3b 0a 20 20 46 74 73 33 43 75 72 73  Vtab;.  Fts3Curs
1a580 6f 72 20 2a 70 43 73 72 20 3d 20 28 46 74 73 33  or *pCsr = (Fts3
1a590 43 75 72 73 6f 72 20 2a 29 70 43 75 72 73 6f 72  Cursor *)pCursor
1a5a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
1a5b0 75 65 20 2a 70 43 6f 6e 73 20 3d 20 30 3b 20 20  ue *pCons = 0;  
1a5c0 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 41 54 43       /* The MATC
1a5d0 48 20 6f 72 20 72 6f 77 69 64 20 63 6f 6e 73 74  H or rowid const
1a5e0 72 61 69 6e 74 2c 20 69 66 20 61 6e 79 20 2a 2f  raint, if any */
1a5f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1a600 20 2a 70 4c 61 6e 67 69 64 20 3d 20 30 3b 20 20   *pLangid = 0;  
1a610 20 20 20 2f 2a 20 54 68 65 20 22 6c 61 6e 67 69     /* The "langi
1a620 64 20 3d 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e  d = ?" constrain
1a630 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 73  t, if any */.  s
1a640 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44  qlite3_value *pD
1a650 6f 63 69 64 47 65 20 3d 20 30 3b 20 20 20 20 2f  ocidGe = 0;    /
1a660 2a 20 54 68 65 20 22 64 6f 63 69 64 20 3e 3d 20  * The "docid >= 
1a670 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69  ?" constraint, i
1a680 66 20 61 6e 79 20 2a 2f 0a 20 20 73 71 6c 69 74  f any */.  sqlit
1a690 65 33 5f 76 61 6c 75 65 20 2a 70 44 6f 63 69 64  e3_value *pDocid
1a6a0 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68  Le = 0;    /* Th
1a6b0 65 20 22 64 6f 63 69 64 20 3c 3d 20 3f 22 20 63  e "docid <= ?" c
1a6c0 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 61 6e  onstraint, if an
1a6d0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  y */.  int iIdx;
1a6e0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1a6f0 45 54 45 52 28 69 64 78 53 74 72 29 3b 0a 20 20  ETER(idxStr);.  
1a700 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a710 28 6e 56 61 6c 29 3b 0a 0a 20 20 65 53 65 61 72  (nVal);..  eSear
1a720 63 68 20 3d 20 28 69 64 78 4e 75 6d 20 26 20 30  ch = (idxNum & 0
1a730 78 30 30 30 30 46 46 46 46 29 3b 0a 20 20 61 73  x0000FFFF);.  as
1a740 73 65 72 74 28 20 65 53 65 61 72 63 68 3e 3d 30  sert( eSearch>=0
1a750 20 26 26 20 65 53 65 61 72 63 68 3c 3d 28 46 54   && eSearch<=(FT
1a760 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
1a770 43 48 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29  CH+p->nColumn) )
1a780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
1a790 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 0a  Segments==0 );..
1a7a0 20 20 2f 2a 20 43 6f 6c 6c 65 63 74 20 61 72 67    /* Collect arg
1a7b0 75 6d 65 6e 74 73 20 69 6e 74 6f 20 6c 6f 63 61  uments into loca
1a7c0 6c 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  l variables */. 
1a7d0 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 69 66 28   iIdx = 0;.  if(
1a7e0 20 65 53 65 61 72 63 68 21 3d 46 54 53 33 5f 46   eSearch!=FTS3_F
1a7f0 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 29  ULLSCAN_SEARCH )
1a800 20 70 43 6f 6e 73 20 3d 20 61 70 56 61 6c 5b 69   pCons = apVal[i
1a810 49 64 78 2b 2b 5d 3b 0a 20 20 69 66 28 20 69 64  Idx++];.  if( id
1a820 78 4e 75 6d 20 26 20 46 54 53 33 5f 48 41 56 45  xNum & FTS3_HAVE
1a830 5f 4c 41 4e 47 49 44 20 29 20 70 4c 61 6e 67 69  _LANGID ) pLangi
1a840 64 20 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b  d = apVal[iIdx++
1a850 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20  ];.  if( idxNum 
1a860 26 20 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49  & FTS3_HAVE_DOCI
1a870 44 5f 47 45 20 29 20 70 44 6f 63 69 64 47 65 20  D_GE ) pDocidGe 
1a880 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b  = apVal[iIdx++];
1a890 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20  .  if( idxNum & 
1a8a0 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f  FTS3_HAVE_DOCID_
1a8b0 4c 45 20 29 20 70 44 6f 63 69 64 4c 65 20 3d 20  LE ) pDocidLe = 
1a8c0 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d 3b 0a 20  apVal[iIdx++];. 
1a8d0 20 61 73 73 65 72 74 28 20 69 49 64 78 3d 3d 6e   assert( iIdx==n
1a8e0 56 61 6c 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  Val );..  /* In 
1a8f0 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
1a900 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 62 65  has been used be
1a910 66 6f 72 65 2c 20 63 6c 65 61 72 20 69 74 20 6e  fore, clear it n
1a920 6f 77 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ow. */.  sqlite3
1a930 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e  _finalize(pCsr->
1a940 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
1a950 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 61 44 6f  3_free(pCsr->aDo
1a960 63 6c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  clist);.  sqlite
1a970 33 46 74 73 33 4d 49 42 75 66 66 65 72 46 72 65  3Fts3MIBufferFre
1a980 65 28 70 43 73 72 2d 3e 70 4d 49 42 75 66 66 65  e(pCsr->pMIBuffe
1a990 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  r);.  sqlite3Fts
1a9a0 33 45 78 70 72 46 72 65 65 28 70 43 73 72 2d 3e  3ExprFree(pCsr->
1a9b0 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d 73 65 74  pExpr);.  memset
1a9c0 28 26 70 43 75 72 73 6f 72 5b 31 5d 2c 20 30 2c  (&pCursor[1], 0,
1a9d0 20 73 69 7a 65 6f 66 28 46 74 73 33 43 75 72 73   sizeof(Fts3Curs
1a9e0 6f 72 29 2d 73 69 7a 65 6f 66 28 73 71 6c 69 74  or)-sizeof(sqlit
1a9f0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 29 29  e3_vtab_cursor))
1aa00 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
1aa10 6c 6f 77 65 72 20 61 6e 64 20 75 70 70 65 72 20  lower and upper 
1aa20 62 6f 75 6e 64 73 20 6f 6e 20 64 6f 63 69 64 73  bounds on docids
1aa30 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1aa40 70 43 73 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 20  pCsr->iMinDocid 
1aa50 3d 20 66 74 73 33 44 6f 63 69 64 52 61 6e 67 65  = fts3DocidRange
1aa60 28 70 44 6f 63 69 64 47 65 2c 20 53 4d 41 4c 4c  (pDocidGe, SMALL
1aa70 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20 70 43  EST_INT64);.  pC
1aa80 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 20 3d 20  sr->iMaxDocid = 
1aa90 66 74 73 33 44 6f 63 69 64 52 61 6e 67 65 28 70  fts3DocidRange(p
1aaa0 44 6f 63 69 64 4c 65 2c 20 4c 41 52 47 45 53 54  DocidLe, LARGEST
1aab0 5f 49 4e 54 36 34 29 3b 0a 0a 20 20 69 66 28 20  _INT64);..  if( 
1aac0 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 70 43  idxStr ){.    pC
1aad0 73 72 2d 3e 62 44 65 73 63 20 3d 20 28 69 64 78  sr->bDesc = (idx
1aae0 53 74 72 5b 30 5d 3d 3d 27 44 27 29 3b 0a 20 20  Str[0]=='D');.  
1aaf0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 2d  }else{.    pCsr-
1ab00 3e 62 44 65 73 63 20 3d 20 70 2d 3e 62 44 65 73  >bDesc = p->bDes
1ab10 63 49 64 78 3b 0a 20 20 7d 0a 20 20 70 43 73 72  cIdx;.  }.  pCsr
1ab20 2d 3e 65 53 65 61 72 63 68 20 3d 20 28 69 31 36  ->eSearch = (i16
1ab30 29 65 53 65 61 72 63 68 3b 0a 0a 20 20 69 66 28  )eSearch;..  if(
1ab40 20 65 53 65 61 72 63 68 21 3d 46 54 53 33 5f 44   eSearch!=FTS3_D
1ab50 4f 43 49 44 5f 53 45 41 52 43 48 20 26 26 20 65  OCID_SEARCH && e
1ab60 53 65 61 72 63 68 21 3d 46 54 53 33 5f 46 55 4c  Search!=FTS3_FUL
1ab70 4c 53 43 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a  LSCAN_SEARCH ){.
1ab80 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 65      int iCol = e
1ab90 53 65 61 72 63 68 2d 46 54 53 33 5f 46 55 4c 4c  Search-FTS3_FULL
1aba0 54 45 58 54 5f 53 45 41 52 43 48 3b 0a 20 20 20  TEXT_SEARCH;.   
1abb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75   const char *zQu
1abc0 65 72 79 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ery = (const cha
1abd0 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  r *)sqlite3_valu
1abe0 65 5f 74 65 78 74 28 70 43 6f 6e 73 29 3b 0a 0a  e_text(pCons);..
1abf0 20 20 20 20 69 66 28 20 7a 51 75 65 72 79 3d 3d      if( zQuery==
1ac00 30 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c  0 && sqlite3_val
1ac10 75 65 5f 74 79 70 65 28 70 43 6f 6e 73 29 21 3d  ue_type(pCons)!=
1ac20 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20  SQLITE_NULL ){. 
1ac30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ac40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1ac50 0a 20 20 20 20 70 43 73 72 2d 3e 69 4c 61 6e 67  .    pCsr->iLang
1ac60 69 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  id = 0;.    if( 
1ac70 70 4c 61 6e 67 69 64 20 29 20 70 43 73 72 2d 3e  pLangid ) pCsr->
1ac80 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65  iLangid = sqlite
1ac90 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70 4c 61 6e  3_value_int(pLan
1aca0 67 69 64 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  gid);..    asser
1acb0 74 28 20 70 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  t( p->base.zErrM
1acc0 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  sg==0 );.    rc 
1acd0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 45 78 70  = sqlite3Fts3Exp
1ace0 72 50 61 72 73 65 28 70 2d 3e 70 54 6f 6b 65 6e  rParse(p->pToken
1acf0 69 7a 65 72 2c 20 70 43 73 72 2d 3e 69 4c 61 6e  izer, pCsr->iLan
1ad00 67 69 64 2c 0a 20 20 20 20 20 20 20 20 70 2d 3e  gid,.        p->
1ad10 61 7a 43 6f 6c 75 6d 6e 2c 20 70 2d 3e 62 46 74  azColumn, p->bFt
1ad20 73 34 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2c 20  s4, p->nColumn, 
1ad30 69 43 6f 6c 2c 20 7a 51 75 65 72 79 2c 20 2d 31  iCol, zQuery, -1
1ad40 2c 20 26 70 43 73 72 2d 3e 70 45 78 70 72 2c 20  , &pCsr->pExpr, 
1ad50 0a 20 20 20 20 20 20 20 20 26 70 2d 3e 62 61 73  .        &p->bas
1ad60 65 2e 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b  e.zErrMsg.    );
1ad70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ad80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ad90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ada0 0a 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 45  ..    rc = fts3E
1adb0 76 61 6c 53 74 61 72 74 28 70 43 73 72 29 3b 0a  valStart(pCsr);.
1adc0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53      sqlite3Fts3S
1add0 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b  egmentsClose(p);
1ade0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1adf0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1ae00 72 63 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e  rc;.    pCsr->pN
1ae10 65 78 74 49 64 20 3d 20 70 43 73 72 2d 3e 61 44  extId = pCsr->aD
1ae20 6f 63 6c 69 73 74 3b 0a 20 20 20 20 70 43 73 72  oclist;.    pCsr
1ae30 2d 3e 69 50 72 65 76 49 64 20 3d 20 30 3b 0a 20  ->iPrevId = 0;. 
1ae40 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65   }..  /* Compile
1ae50 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
1ae60 65 6e 74 20 66 6f 72 20 74 68 69 73 20 63 75 72  ent for this cur
1ae70 73 6f 72 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d  sor. For a full-
1ae80 74 61 62 6c 65 2d 73 63 61 6e 2c 20 74 68 65 0a  table-scan, the.
1ae90 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6c    ** statement l
1aea0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61 6c 6c  oops through all
1aeb0 20 72 6f 77 73 20 6f 66 20 74 68 65 20 25 5f 63   rows of the %_c
1aec0 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 46 6f  ontent table. Fo
1aed0 72 20 61 0a 20 20 2a 2a 20 66 75 6c 6c 2d 74 65  r a.  ** full-te
1aee0 78 74 20 71 75 65 72 79 20 6f 72 20 64 6f 63 69  xt query or doci
1aef0 64 20 6c 6f 6f 6b 75 70 2c 20 74 68 65 20 73 74  d lookup, the st
1af00 61 74 65 6d 65 6e 74 20 72 65 74 72 69 65 76 65  atement retrieve
1af10 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 2a 2a 20  s a single.  ** 
1af20 72 6f 77 20 62 79 20 64 6f 63 69 64 2e 0a 20 20  row by docid..  
1af30 2a 2f 0a 20 20 69 66 28 20 65 53 65 61 72 63 68  */.  if( eSearch
1af40 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f  ==FTS3_FULLSCAN_
1af50 53 45 41 52 43 48 20 29 7b 0a 20 20 20 20 69 66  SEARCH ){.    if
1af60 28 20 70 44 6f 63 69 64 47 65 20 7c 7c 20 70 44  ( pDocidGe || pD
1af70 6f 63 69 64 4c 65 20 29 7b 0a 20 20 20 20 20 20  ocidLe ){.      
1af80 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1af90 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1afa0 20 20 22 53 45 4c 45 43 54 20 25 73 20 57 48 45    "SELECT %s WHE
1afb0 52 45 20 72 6f 77 69 64 20 42 45 54 57 45 45 4e  RE rowid BETWEEN
1afc0 20 25 6c 6c 64 20 41 4e 44 20 25 6c 6c 64 20 4f   %lld AND %lld O
1afd0 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 25 73  RDER BY rowid %s
1afe0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ",.          p->
1aff0 7a 52 65 61 64 45 78 70 72 6c 69 73 74 2c 20 70  zReadExprlist, p
1b000 43 73 72 2d 3e 69 4d 69 6e 44 6f 63 69 64 2c 20  Csr->iMinDocid, 
1b010 70 43 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 2c  pCsr->iMaxDocid,
1b020 0a 20 20 20 20 20 20 20 20 20 20 28 70 43 73 72  .          (pCsr
1b030 2d 3e 62 44 65 73 63 20 3f 20 22 44 45 53 43 22  ->bDesc ? "DESC"
1b040 20 3a 20 22 41 53 43 22 29 0a 20 20 20 20 20 20   : "ASC").      
1b050 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b060 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1b070 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1b080 43 54 20 25 73 20 4f 52 44 45 52 20 42 59 20 72  CT %s ORDER BY r
1b090 6f 77 69 64 20 25 73 22 2c 20 0a 20 20 20 20 20  owid %s", .     
1b0a0 20 20 20 20 20 70 2d 3e 7a 52 65 61 64 45 78 70       p->zReadExp
1b0b0 72 6c 69 73 74 2c 20 28 70 43 73 72 2d 3e 62 44  rlist, (pCsr->bD
1b0c0 65 73 63 20 3f 20 22 44 45 53 43 22 20 3a 20 22  esc ? "DESC" : "
1b0d0 41 53 43 22 29 0a 20 20 20 20 20 20 29 3b 0a 20  ASC").      );. 
1b0e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 71     }.    if( zSq
1b0f0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1b100 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1b110 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
1b120 2d 31 2c 20 26 70 43 73 72 2d 3e 70 53 74 6d 74  -1, &pCsr->pStmt
1b130 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1b140 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1b150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b170 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  EM;.    }.  }els
1b180 65 20 69 66 28 20 65 53 65 61 72 63 68 3d 3d 46  e if( eSearch==F
1b190 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48  TS3_DOCID_SEARCH
1b1a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73   ){.    rc = fts
1b1b0 33 43 75 72 73 6f 72 53 65 65 6b 53 74 6d 74 28  3CursorSeekStmt(
1b1c0 70 43 73 72 2c 20 26 70 43 73 72 2d 3e 70 53 74  pCsr, &pCsr->pSt
1b1d0 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  mt);.    if( rc=
1b1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b1f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b200 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 73 72  _bind_value(pCsr
1b210 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 70 43 6f 6e  ->pStmt, 1, pCon
1b220 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
1b230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b240 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1b250 20 20 72 65 74 75 72 6e 20 66 74 73 33 4e 65 78    return fts3Nex
1b260 74 4d 65 74 68 6f 64 28 70 43 75 72 73 6f 72 29  tMethod(pCursor)
1b270 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
1b280 20 69 73 20 74 68 65 20 78 45 6f 66 20 6d 65 74   is the xEof met
1b290 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
1b2a0 61 6c 20 74 61 62 6c 65 2e 20 53 51 4c 69 74 65  al table. SQLite
1b2b0 20 63 61 6c 6c 73 20 74 68 69 73 20 0a 2a 2a 20   calls this .** 
1b2c0 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 6e 64 20  routine to find 
1b2d0 6f 75 74 20 69 66 20 69 74 20 68 61 73 20 72 65  out if it has re
1b2e0 61 63 68 65 64 20 74 68 65 20 65 6e 64 20 6f 66  ached the end of
1b2f0 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a   a result set..*
1b300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1b310 33 45 6f 66 4d 65 74 68 6f 64 28 73 71 6c 69 74  3EofMethod(sqlit
1b320 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1b330 70 43 75 72 73 6f 72 29 7b 0a 20 20 72 65 74 75  pCursor){.  retu
1b340 72 6e 20 28 28 46 74 73 33 43 75 72 73 6f 72 20  rn ((Fts3Cursor 
1b350 2a 29 70 43 75 72 73 6f 72 29 2d 3e 69 73 45 6f  *)pCursor)->isEo
1b360 66 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  f;.}../* .** Thi
1b370 73 20 69 73 20 74 68 65 20 78 52 6f 77 69 64 20  s is the xRowid 
1b380 6d 65 74 68 6f 64 2e 20 54 68 65 20 53 51 4c 69  method. The SQLi
1b390 74 65 20 63 6f 72 65 20 63 61 6c 6c 73 20 74 68  te core calls th
1b3a0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a  is routine to.**
1b3b0 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 6f   retrieve the ro
1b3c0 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
1b3d0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ent row of the r
1b3e0 65 73 75 6c 74 20 73 65 74 2e 20 66 74 73 33 0a  esult set. fts3.
1b3f0 2a 2a 20 65 78 70 6f 73 65 73 20 25 5f 63 6f 6e  ** exposes %_con
1b400 74 65 6e 74 2e 64 6f 63 69 64 20 61 73 20 74 68  tent.docid as th
1b410 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
1b420 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 54  virtual table. T
1b430 68 65 0a 2a 2a 20 72 6f 77 69 64 20 73 68 6f 75  he.** rowid shou
1b440 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ld be written to
1b450 20 2a 70 52 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61   *pRowid..*/.sta
1b460 74 69 63 20 69 6e 74 20 66 74 73 33 52 6f 77 69  tic int fts3Rowi
1b470 64 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  dMethod(sqlite3_
1b480 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1b490 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74  rsor, sqlite_int
1b4a0 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 46  64 *pRowid){.  F
1b4b0 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ts3Cursor *pCsr 
1b4c0 3d 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29  = (Fts3Cursor *)
1b4d0 20 70 43 75 72 73 6f 72 3b 0a 20 20 2a 70 52 6f   pCursor;.  *pRo
1b4e0 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65  wid = pCsr->iPre
1b4f0 76 49 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  vId;.  return SQ
1b500 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
1b510 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
1b520 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64 2c 20 63  Column method, c
1b530 61 6c 6c 65 64 20 62 79 20 53 51 4c 69 74 65 20  alled by SQLite 
1b540 74 6f 20 72 65 71 75 65 73 74 20 61 20 76 61 6c  to request a val
1b550 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 72  ue from.** the r
1b560 6f 77 20 74 68 61 74 20 74 68 65 20 73 75 70 70  ow that the supp
1b570 6c 69 65 64 20 63 75 72 73 6f 72 20 63 75 72 72  lied cursor curr
1b580 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1b590 0a 2a 2a 0a 2a 2a 20 49 66 3a 0a 2a 2a 0a 2a 2a  .**.** If:.**.**
1b5a0 20 20 20 28 69 43 6f 6c 20 3c 20 20 70 2d 3e 6e     (iCol <  p->n
1b5b0 43 6f 6c 75 6d 6e 29 20 20 20 2d 3e 20 54 68 65  Column)   -> The
1b5c0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
1b5d0 6f 6c 27 74 68 20 75 73 65 72 20 63 6f 6c 75 6d  ol'th user colum
1b5e0 6e 2e 0a 2a 2a 20 20 20 28 69 43 6f 6c 20 3d 3d  n..**   (iCol ==
1b5f0 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 20 20 2d   p->nColumn)   -
1b600 3e 20 4d 61 67 69 63 20 63 6f 6c 75 6d 6e 20 77  > Magic column w
1b610 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
1b620 65 20 61 73 20 74 68 65 20 74 61 62 6c 65 2e 0a  e as the table..
1b630 2a 2a 20 20 20 28 69 43 6f 6c 20 3d 3d 20 70 2d  **   (iCol == p-
1b640 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20 2d 3e 20 44  >nColumn+1) -> D
1b650 6f 63 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20  ocid column.**  
1b660 20 28 69 43 6f 6c 20 3d 3d 20 70 2d 3e 6e 43 6f   (iCol == p->nCo
1b670 6c 75 6d 6e 2b 32 29 20 2d 3e 20 4c 61 6e 67 69  lumn+2) -> Langi
1b680 64 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  d column.*/.stat
1b690 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6c 75 6d  ic int fts3Colum
1b6a0 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  nMethod(.  sqlit
1b6b0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1b6c0 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 43 75  pCursor,   /* Cu
1b6d0 72 73 6f 72 20 74 6f 20 72 65 74 72 69 65 76 65  rsor to retrieve
1b6e0 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 20   value from */. 
1b6f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1b700 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
1b710 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
1b720 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 78  sqlite3_result_x
1b730 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f 0a 20 20  xx() calls */.  
1b740 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20  int iCol        
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
1b770 6d 6e 20 74 6f 20 72 65 61 64 20 76 61 6c 75 65  mn to read value
1b780 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   from */.){.  in
1b790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b7b0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1b7c0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1b7d0 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f 72  sr = (Fts3Cursor
1b7e0 20 2a 29 20 70 43 75 72 73 6f 72 3b 0a 20 20 46   *) pCursor;.  F
1b7f0 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
1b800 74 73 33 54 61 62 6c 65 20 2a 29 70 43 75 72 73  ts3Table *)pCurs
1b810 6f 72 2d 3e 70 56 74 61 62 3b 0a 0a 20 20 2f 2a  or->pVtab;..  /*
1b820 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   The column valu
1b830 65 20 73 75 70 70 6c 69 65 64 20 62 79 20 53 51  e supplied by SQ
1b840 4c 69 74 65 20 6d 75 73 74 20 62 65 20 69 6e 20  Lite must be in 
1b850 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 61 73 73 65  range. */.  asse
1b860 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69  rt( iCol>=0 && i
1b870 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  Col<=p->nColumn+
1b880 32 20 29 3b 0a 0a 20 20 69 66 28 20 69 43 6f 6c  2 );..  if( iCol
1b890 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 20 29  ==p->nColumn+1 )
1b8a0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
1b8b0 6c 6c 20 69 73 20 61 20 72 65 71 75 65 73 74 20  ll is a request 
1b8c0 66 6f 72 20 74 68 65 20 22 64 6f 63 69 64 22 20  for the "docid" 
1b8d0 63 6f 6c 75 6d 6e 2e 20 53 69 6e 63 65 20 22 64  column. Since "d
1b8e0 6f 63 69 64 22 20 69 73 20 61 6e 20 0a 20 20 20  ocid" is an .   
1b8f0 20 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 22 72   ** alias for "r
1b900 6f 77 69 64 22 2c 20 75 73 65 20 74 68 65 20 78  owid", use the x
1b910 52 6f 77 69 64 28 29 20 6d 65 74 68 6f 64 20 74  Rowid() method t
1b920 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1b930 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ue..    */.    s
1b940 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
1b950 74 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d 3e  t64(pCtx, pCsr->
1b960 69 50 72 65 76 49 64 29 3b 0a 20 20 7d 65 6c 73  iPrevId);.  }els
1b970 65 20 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e 6e  e if( iCol==p->n
1b980 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 2f 2a  Column ){.    /*
1b990 20 54 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d   The extra colum
1b9a0 6e 20 77 68 6f 73 65 20 6e 61 6d 65 20 69 73 20  n whose name is 
1b9b0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1b9c0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 52 65  table..    ** Re
1b9d0 74 75 72 6e 20 61 20 62 6c 6f 62 20 77 68 69 63  turn a blob whic
1b9e0 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
1b9f0 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  o the cursor.  *
1ba00 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  /.    sqlite3_re
1ba10 73 75 6c 74 5f 62 6c 6f 62 28 70 43 74 78 2c 20  sult_blob(pCtx, 
1ba20 26 70 43 73 72 2c 20 73 69 7a 65 6f 66 28 70 43  &pCsr, sizeof(pC
1ba30 73 72 29 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  sr), SQLITE_TRAN
1ba40 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20  SIENT);.  }else 
1ba50 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e 6e 43 6f  if( iCol==p->nCo
1ba60 6c 75 6d 6e 2b 32 20 26 26 20 70 43 73 72 2d 3e  lumn+2 && pCsr->
1ba70 70 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  pExpr ){.    sql
1ba80 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
1ba90 34 28 70 43 74 78 2c 20 70 43 73 72 2d 3e 69 4c  4(pCtx, pCsr->iL
1baa0 61 6e 67 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  angid);.  }else{
1bab0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1bac0 65 73 74 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  ested column is 
1bad0 65 69 74 68 65 72 20 61 20 75 73 65 72 20 63 6f  either a user co
1bae0 6c 75 6d 6e 20 28 6f 6e 65 20 74 68 61 74 20 63  lumn (one that c
1baf0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 2a 2a 20  ontains .    ** 
1bb00 69 6e 64 65 78 65 64 20 64 61 74 61 29 2c 20 6f  indexed data), o
1bb10 72 20 74 68 65 20 6c 61 6e 67 75 61 67 65 2d 69  r the language-i
1bb20 64 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a 20 20  d column.  */.  
1bb30 20 20 72 63 20 3d 20 66 74 73 33 43 75 72 73 6f    rc = fts3Curso
1bb40 72 53 65 65 6b 28 30 2c 20 70 43 73 72 29 3b 0a  rSeek(0, pCsr);.
1bb50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bb70 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e 6e 43 6f  if( iCol==p->nCo
1bb80 6c 75 6d 6e 2b 32 20 29 7b 0a 20 20 20 20 20 20  lumn+2 ){.      
1bb90 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20    int iLangid = 
1bba0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  0;.        if( p
1bbb0 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 7b  ->zLanguageid ){
1bbc0 0a 20 20 20 20 20 20 20 20 20 20 69 4c 61 6e 67  .          iLang
1bbd0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
1bbe0 75 6d 6e 5f 69 6e 74 28 70 43 73 72 2d 3e 70 53  umn_int(pCsr->pS
1bbf0 74 6d 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  tmt, p->nColumn+
1bc00 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
1bc10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1bc20 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 69  sult_int(pCtx, i
1bc30 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20 20 20 7d  Langid);.      }
1bc40 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1bc50 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 43 73 72  _data_count(pCsr
1bc60 2d 3e 70 53 74 6d 74 29 3e 28 69 43 6f 6c 2b 31  ->pStmt)>(iCol+1
1bc70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1bc80 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
1bc90 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
1bca0 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 73  column_value(pCs
1bcb0 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 2b 31  r->pStmt, iCol+1
1bcc0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1bcd0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1bce0 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70   ((Fts3Table *)p
1bcf0 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 29  Csr->base.pVtab)
1bd00 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29  ->pSegments==0 )
1bd10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bd20 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75  ../* .** This fu
1bd30 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69 6d  nction is the im
1bd40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1bd50 74 68 65 20 78 55 70 64 61 74 65 20 63 61 6c 6c  the xUpdate call
1bd60 62 61 63 6b 20 75 73 65 64 20 62 79 20 0a 2a 2a  back used by .**
1bd70 20 46 54 53 33 20 76 69 72 74 75 61 6c 20 74 61   FTS3 virtual ta
1bd80 62 6c 65 73 2e 20 49 74 20 69 73 20 69 6e 76 6f  bles. It is invo
1bd90 6b 65 64 20 62 79 20 53 51 4c 69 74 65 20 65 61  ked by SQLite ea
1bda0 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
1bdb0 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74   to be.** insert
1bdc0 65 64 2c 20 75 70 64 61 74 65 64 20 6f 72 20 64  ed, updated or d
1bdd0 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
1bde0 63 20 69 6e 74 20 66 74 73 33 55 70 64 61 74 65  c int fts3Update
1bdf0 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74 65  Method(.  sqlite
1be00 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20  3_vtab *pVtab,  
1be10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
1be20 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
1be30 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1be60 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79  f argument array
1be70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
1be80 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 20 20  lue **apVal,    
1be90 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1bea0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1beb0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
1bec0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
1bed0 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 66 66   /* OUT: The aff
1bee0 65 63 74 65 64 20 28 6f 72 20 65 66 66 65 63 74  ected (or effect
1bef0 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a  ed) rowid */.){.
1bf00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1bf10 46 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64  Fts3UpdateMethod
1bf20 28 70 56 74 61 62 2c 20 6e 41 72 67 2c 20 61 70  (pVtab, nArg, ap
1bf30 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 7d 0a  Val, pRowid);.}.
1bf40 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1bf50 61 74 69 6f 6e 20 6f 66 20 78 53 79 6e 63 28 29  ation of xSync()
1bf60 20 6d 65 74 68 6f 64 2e 20 46 6c 75 73 68 20 74   method. Flush t
1bf70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1bf80 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73  he pending-terms
1bf90 0a 2a 2a 20 68 61 73 68 2d 74 61 62 6c 65 20 74  .** hash-table t
1bfa0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
1bfb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1bfc0 73 33 53 79 6e 63 4d 65 74 68 6f 64 28 73 71 6c  s3SyncMethod(sql
1bfd0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1bfe0 29 7b 0a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ){..  /* Followi
1bff0 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
1c000 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  l-merge operatio
1c010 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  n, assuming that
1c020 20 74 68 65 20 69 6e 70 75 74 0a 20 20 2a 2a 20   the input.  ** 
1c030 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74  segments are not
1c040 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 6e 73   completely cons
1c050 75 6d 65 64 20 28 74 68 65 20 75 73 75 61 6c 20  umed (the usual 
1c060 63 61 73 65 29 2c 20 74 68 65 79 20 61 72 65 20  case), they are 
1c070 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 69 6e 20  updated.  ** in 
1c080 70 6c 61 63 65 20 74 6f 20 72 65 6d 6f 76 65 20  place to remove 
1c090 74 68 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  the entries that
1c0a0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1c0b0 65 6e 20 6d 65 72 67 65 64 2e 20 54 68 69 73 0a  en merged. This.
1c0c0 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 75 70    ** involves up
1c0d0 64 61 74 69 6e 67 20 74 68 65 20 6c 65 61 66 20  dating the leaf 
1c0e0 62 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 74 61  block that conta
1c0f0 69 6e 73 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ins the smallest
1c100 20 75 6e 6d 65 72 67 65 64 0a 20 20 2a 2a 20 65   unmerged.  ** e
1c110 6e 74 72 79 20 61 6e 64 20 65 61 63 68 20 62 6c  ntry and each bl
1c120 6f 63 6b 20 28 69 66 20 61 6e 79 29 20 62 65 74  ock (if any) bet
1c130 77 65 65 6e 20 74 68 65 20 6c 65 61 66 20 61 6e  ween the leaf an
1c140 64 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  d the root node.
1c150 20 53 6f 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   So.  ** if the 
1c160 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 69 6e  height of the in
1c170 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  put segment b-tr
1c180 65 65 73 20 69 73 20 4e 2c 20 61 6e 64 20 69 6e  ees is N, and in
1c190 70 75 74 20 73 65 67 6d 65 6e 74 73 0a 20 20 2a  put segments.  *
1c1a0 2a 20 61 72 65 20 6d 65 72 67 65 64 20 65 69 67  * are merged eig
1c1b0 68 74 20 61 74 20 61 20 74 69 6d 65 2c 20 75 70  ht at a time, up
1c1c0 64 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75 74  dating the input
1c1d0 20 73 65 67 6d 65 6e 74 73 20 61 74 20 74 68 65   segments at the
1c1e0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 61 6e 20   end.  ** of an 
1c1f0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67  incremental-merg
1c200 65 20 72 65 71 75 69 72 65 73 20 77 72 69 74 69  e requires writi
1c210 6e 67 20 28 38 2a 28 31 2b 4e 29 29 20 62 6c 6f  ng (8*(1+N)) blo
1c220 63 6b 73 2e 20 4e 20 69 73 20 75 73 75 61 6c 6c  cks. N is usuall
1c230 79 0a 20 20 2a 2a 20 73 6d 61 6c 6c 20 2d 20 6f  y.  ** small - o
1c240 66 74 65 6e 20 62 65 74 77 65 65 6e 20 30 20 61  ften between 0 a
1c250 6e 64 20 32 2e 20 53 6f 20 74 68 65 20 6f 76 65  nd 2. So the ove
1c260 72 68 65 61 64 20 6f 66 20 74 68 65 20 69 6e 63  rhead of the inc
1c270 72 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a 20 6d 65  remental.  ** me
1c280 72 67 65 20 69 73 20 73 6f 6d 65 77 68 65 72 65  rge is somewhere
1c290 20 62 65 74 77 65 65 6e 20 38 20 61 6e 64 20 32   between 8 and 2
1c2a0 34 20 62 6c 6f 63 6b 73 2e 20 54 6f 20 61 76 6f  4 blocks. To avo
1c2b0 69 64 20 74 68 69 73 20 6f 76 65 72 68 65 61 64  id this overhead
1c2c0 0a 20 20 2a 2a 20 64 77 61 72 66 69 6e 67 20 74  .  ** dwarfing t
1c2d0 68 65 20 61 63 74 75 61 6c 20 70 72 6f 64 75 63  he actual produc
1c2e0 74 69 76 65 20 77 6f 72 6b 20 61 63 63 6f 6d 70  tive work accomp
1c2f0 6c 69 73 68 65 64 2c 20 74 68 65 20 69 6e 63 72  lished, the incr
1c300 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a 20 20  emental merge.  
1c310 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ** is only attem
1c320 70 74 65 64 20 69 66 20 69 74 20 77 69 6c 6c 20  pted if it will 
1c330 77 72 69 74 65 20 61 74 20 6c 65 61 73 74 20 36  write at least 6
1c340 34 20 6c 65 61 66 20 62 6c 6f 63 6b 73 2e 20 48  4 leaf blocks. H
1c350 65 6e 63 65 0a 20 20 2a 2a 20 6e 4d 69 6e 4d 65  ence.  ** nMinMe
1c360 72 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  rge..  **.  ** O
1c370 66 20 63 6f 75 72 73 65 2c 20 75 70 64 61 74 69  f course, updati
1c380 6e 67 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  ng the input seg
1c390 6d 65 6e 74 73 20 61 6c 73 6f 20 69 6e 76 6f 6c  ments also invol
1c3a0 76 65 73 20 64 65 6c 65 74 69 6e 67 20 61 20 62  ves deleting a b
1c3b0 75 6e 63 68 0a 20 20 2a 2a 20 6f 66 20 62 6c 6f  unch.  ** of blo
1c3c0 63 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 65 67  cks from the seg
1c3d0 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20 42 75 74  ments table. But
1c3e0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 63 6f 6e   this is not con
1c3f0 73 69 64 65 72 65 64 20 6f 76 65 72 68 65 61 64  sidered overhead
1c400 0a 20 20 2a 2a 20 61 73 20 69 74 20 77 6f 75 6c  .  ** as it woul
1c410 64 20 61 6c 73 6f 20 62 65 20 72 65 71 75 69 72  d also be requir
1c420 65 64 20 62 79 20 61 20 63 72 69 73 69 73 2d 6d  ed by a crisis-m
1c430 65 72 67 65 20 74 68 61 74 20 75 73 65 64 20 74  erge that used t
1c440 68 65 20 73 61 6d 65 20 69 6e 70 75 74 20 0a 20  he same input . 
1c450 20 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 20 20   ** segments..  
1c460 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 33 32 20 6e  */.  const u32 n
1c470 4d 69 6e 4d 65 72 67 65 20 3d 20 36 34 3b 20 20  MinMerge = 64;  
1c480 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
1c490 61 6d 6f 75 6e 74 20 6f 66 20 69 6e 63 72 2d 6d  amount of incr-m
1c4a0 65 72 67 65 20 77 6f 72 6b 20 74 6f 20 64 6f 20  erge work to do 
1c4b0 2a 2f 0a 0a 20 20 46 74 73 33 54 61 62 6c 65 20  */..  Fts3Table 
1c4c0 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a  *p = (Fts3Table*
1c4d0 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVtab;.  int rc
1c4e0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 65   = sqlite3Fts3Pe
1c4f0 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28  ndingTermsFlush(
1c500 70 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  p);..  if( rc==S
1c510 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
1c520 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 28 6e 4d 69  p->nLeafAdd>(nMi
1c530 6e 4d 65 72 67 65 2f 31 36 29 20 0a 20 20 20 26  nMerge/16) .   &
1c540 26 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  & p->nAutoincrme
1c550 72 67 65 20 26 26 20 70 2d 3e 6e 41 75 74 6f 69  rge && p->nAutoi
1c560 6e 63 72 6d 65 72 67 65 21 3d 30 78 66 66 0a 20  ncrmerge!=0xff. 
1c570 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 4c 65   ){.    int mxLe
1c580 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  vel = 0;        
1c590 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1c5a0 20 72 65 6c 61 74 69 76 65 20 6c 65 76 65 6c 20   relative level 
1c5b0 76 61 6c 75 65 20 69 6e 20 64 62 20 2a 2f 0a 20  value in db */. 
1c5c0 20 20 20 69 6e 74 20 41 3b 20 20 20 20 20 20 20     int A;       
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 20 2f 2a 20 49 6e 63 72 2d 6d 65 72 67 65 20 70   /* Incr-merge p
1c5f0 61 72 61 6d 65 74 65 72 20 41 20 2a 2f 0a 0a 20  arameter A */.. 
1c600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1c610 74 73 33 4d 61 78 4c 65 76 65 6c 28 70 2c 20 26  ts3MaxLevel(p, &
1c620 6d 78 4c 65 76 65 6c 29 3b 0a 20 20 20 20 61 73  mxLevel);.    as
1c630 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1c640 5f 4f 4b 20 7c 7c 20 6d 78 4c 65 76 65 6c 3d 3d  _OK || mxLevel==
1c650 30 20 29 3b 0a 20 20 20 20 41 20 3d 20 70 2d 3e  0 );.    A = p->
1c660 6e 4c 65 61 66 41 64 64 20 2a 20 6d 78 4c 65 76  nLeafAdd * mxLev
1c670 65 6c 3b 0a 20 20 20 20 41 20 2b 3d 20 28 41 2f  el;.    A += (A/
1c680 32 29 3b 0a 20 20 20 20 69 66 28 20 41 3e 28 69  2);.    if( A>(i
1c690 6e 74 29 6e 4d 69 6e 4d 65 72 67 65 20 29 20 72  nt)nMinMerge ) r
1c6a0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
1c6b0 6e 63 72 6d 65 72 67 65 28 70 2c 20 41 2c 20 70  ncrmerge(p, A, p
1c6c0 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65  ->nAutoincrmerge
1c6d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1c6e0 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73  Fts3SegmentsClos
1c6f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1c700 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  c;.}../*.** If i
1c710 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  t is currently u
1c720 6e 6b 6e 6f 77 6e 20 77 68 65 74 68 65 72 20 6f  nknown whether o
1c730 72 20 6e 6f 74 20 74 68 65 20 46 54 53 20 74 61  r not the FTS ta
1c740 62 6c 65 20 68 61 73 20 61 6e 20 25 5f 73 74 61  ble has an %_sta
1c750 74 0a 2a 2a 20 74 61 62 6c 65 20 28 69 66 20 70  t.** table (if p
1c760 2d 3e 62 48 61 73 53 74 61 74 3d 3d 32 29 2c 20  ->bHasStat==2), 
1c770 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  attempt to deter
1c780 6d 69 6e 65 20 74 68 69 73 20 28 73 65 74 20 70  mine this (set p
1c790 2d 3e 62 48 61 73 53 74 61 74 0a 2a 2a 20 74 6f  ->bHasStat.** to
1c7a0 20 30 20 6f 72 20 31 29 2e 20 52 65 74 75 72 6e   0 or 1). Return
1c7b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
1c7c0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
1c7d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1c7e0 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72  e.** if an error
1c7f0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
1c800 69 63 20 69 6e 74 20 66 74 73 33 53 65 74 48 61  ic int fts3SetHa
1c810 73 53 74 61 74 28 46 74 73 33 54 61 62 6c 65 20  sStat(Fts3Table 
1c820 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1c830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1c840 20 70 2d 3e 62 48 61 73 53 74 61 74 3d 3d 32 20   p->bHasStat==2 
1c850 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c860 72 20 2a 7a 46 6d 74 20 3d 22 53 45 4c 45 43 54  r *zFmt ="SELECT
1c870 20 31 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74   1 FROM %Q.sqlit
1c880 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
1c890 62 6c 5f 6e 61 6d 65 3d 27 25 71 5f 73 74 61 74  bl_name='%q_stat
1c8a0 27 22 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  '";.    char *zS
1c8b0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1c8c0 69 6e 74 66 28 7a 46 6d 74 2c 20 70 2d 3e 7a 44  intf(zFmt, p->zD
1c8d0 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
1c8e0 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
1c8f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1c900 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20   *pStmt = 0;.   
1c910 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1c920 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1c930 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1c940 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  mt, 0);.      if
1c950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c960 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  ){.        int b
1c970 48 61 73 53 74 61 74 20 3d 20 28 73 71 6c 69 74  HasStat = (sqlit
1c980 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
1c990 53 51 4c 49 54 45 5f 52 4f 57 29 3b 0a 20 20 20  SQLITE_ROW);.   
1c9a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c9b0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1c9c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c9d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
1c9e0 2d 3e 62 48 61 73 53 74 61 74 20 3d 20 62 48 61  ->bHasStat = bHa
1c9f0 73 53 74 61 74 3b 0a 20 20 20 20 20 20 7d 0a 20  sStat;.      }. 
1ca00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ca10 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  e(zSql);.    }el
1ca20 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1ca30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ca40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ca50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1ca60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78  lementation of x
1ca70 42 65 67 69 6e 28 29 20 6d 65 74 68 6f 64 2e 20  Begin() method. 
1ca80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ca90 74 73 33 42 65 67 69 6e 4d 65 74 68 6f 64 28 73  ts3BeginMethod(s
1caa0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1cab0 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  ab){.  Fts3Table
1cac0 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
1cad0 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53 45  *)pVtab;.  UNUSE
1cae0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 74 61  D_PARAMETER(pVta
1caf0 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  b);.  assert( p-
1cb00 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b  >pSegments==0 );
1cb10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 50  .  assert( p->nP
1cb20 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
1cb30 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1cb40 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 31 20 29  Transaction!=1 )
1cb50 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1cb60 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1cb70 20 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   1 );.  TESTONLY
1cb80 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74  ( p->mxSavepoint
1cb90 20 3d 20 2d 31 3b 20 29 3b 0a 20 20 70 2d 3e 6e   = -1; );.  p->n
1cba0 4c 65 61 66 41 64 64 20 3d 20 30 3b 0a 20 20 72  LeafAdd = 0;.  r
1cbb0 65 74 75 72 6e 20 66 74 73 33 53 65 74 48 61 73  eturn fts3SetHas
1cbc0 53 74 61 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Stat(p);.}../*.*
1cbd0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1cbe0 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29 20 6d 65   of xCommit() me
1cbf0 74 68 6f 64 2e 20 54 68 69 73 20 69 73 20 61 20  thod. This is a 
1cc00 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f 6e 74 65  no-op. The conte
1cc10 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65 20 70 65  nts of.** the pe
1cc20 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68  nding-terms hash
1cc30 2d 74 61 62 6c 65 20 68 61 76 65 20 61 6c 72 65  -table have alre
1cc40 61 64 79 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ady been flushed
1cc50 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1cc60 73 65 0a 2a 2a 20 62 79 20 66 74 73 33 53 79 6e  se.** by fts3Syn
1cc70 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f 0a 73 74  cMethod()..*/.st
1cc80 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f 6d  atic int fts3Com
1cc90 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  mitMethod(sqlite
1cca0 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a  3_vtab *pVtab){.
1ccb0 20 20 54 45 53 54 4f 4e 4c 59 28 20 46 74 73 33    TESTONLY( Fts3
1ccc0 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1ccd0 54 61 62 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a  Table*)pVtab );.
1cce0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ccf0 45 52 28 70 56 74 61 62 29 3b 0a 20 20 61 73 73  ER(pVtab);.  ass
1cd00 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  ert( p->nPending
1cd10 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Data==0 );.  ass
1cd20 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  ert( p->inTransa
1cd30 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73  ction!=0 );.  as
1cd40 73 65 72 74 28 20 70 2d 3e 70 53 65 67 6d 65 6e  sert( p->pSegmen
1cd50 74 73 3d 3d 30 20 29 3b 0a 20 20 54 45 53 54 4f  ts==0 );.  TESTO
1cd60 4e 4c 59 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  NLY( p->inTransa
1cd70 63 74 69 6f 6e 20 3d 20 30 20 29 3b 0a 20 20 54  ction = 0 );.  T
1cd80 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d 78 53 61  ESTONLY( p->mxSa
1cd90 76 65 70 6f 69 6e 74 20 3d 20 2d 31 3b 20 29 3b  vepoint = -1; );
1cda0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cdb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
1cdc0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1cdd0 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 44 69 73  xRollback(). Dis
1cde0 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1cdf0 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
1ce00 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74  -terms.** hash-t
1ce10 61 62 6c 65 2e 20 41 6e 79 20 63 68 61 6e 67 65  able. Any change
1ce20 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  s made to the da
1ce30 74 61 62 61 73 65 20 61 72 65 20 72 65 76 65 72  tabase are rever
1ce40 74 65 64 20 62 79 20 53 51 4c 69 74 65 2e 0a 2a  ted by SQLite..*
1ce50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1ce60 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 28  3RollbackMethod(
1ce70 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1ce80 74 61 62 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  tab){.  Fts3Tabl
1ce90 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
1cea0 65 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69  e*)pVtab;.  sqli
1ceb0 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65  te3Fts3PendingTe
1cec0 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20 61  rmsClear(p);.  a
1ced0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1cee0 73 61 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  saction!=0 );.  
1cef0 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 69 6e 54  TESTONLY( p->inT
1cf00 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 30 20 29  ransaction = 0 )
1cf10 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d  ;.  TESTONLY( p-
1cf20 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 2d  >mxSavepoint = -
1cf30 31 3b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  1; );.  return S
1cf40 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cf50 2a 2a 20 57 68 65 6e 20 63 61 6c 6c 65 64 2c 20  ** When called, 
1cf60 2a 70 70 50 6f 73 6c 69 73 74 20 6d 75 73 74 20  *ppPoslist must 
1cf70 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 62 79 74  point to the byt
1cf80 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  e immediately fo
1cf90 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65  llowing the.** e
1cfa0 6e 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e  nd of a position
1cfb0 2d 6c 69 73 74 2e 20 69 2e 65 2e 20 28 20 28 2a  -list. i.e. ( (*
1cfc0 70 70 50 6f 73 6c 69 73 74 29 5b 2d 31 5d 3d 3d  ppPoslist)[-1]==
1cfd0 50 4f 53 5f 45 4e 44 20 29 2e 20 54 68 69 73 20  POS_END ). This 
1cfe0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 6f 76 65  function.** move
1cff0 73 20 2a 70 70 50 6f 73 6c 69 73 74 20 73 6f 20  s *ppPoslist so 
1d000 74 68 61 74 20 69 74 20 69 6e 73 74 65 61 64 20  that it instead 
1d010 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
1d020 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 0a  rst byte of the.
1d030 2a 2a 20 73 61 6d 65 20 70 6f 73 69 74 69 6f 6e  ** same position
1d040 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1d050 20 76 6f 69 64 20 66 74 73 33 52 65 76 65 72 73   void fts3Revers
1d060 65 50 6f 73 6c 69 73 74 28 63 68 61 72 20 2a 70  ePoslist(char *p
1d070 53 74 61 72 74 2c 20 63 68 61 72 20 2a 2a 70 70  Start, char **pp
1d080 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61 72  Poslist){.  char
1d090 20 2a 70 20 3d 20 26 28 2a 70 70 50 6f 73 6c 69   *p = &(*ppPosli
1d0a0 73 74 29 5b 2d 32 5d 3b 0a 20 20 63 68 61 72 20  st)[-2];.  char 
1d0b0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 6b 69  c = 0;..  /* Ski
1d0c0 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 73  p backwards pass
1d0d0 65 64 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20  ed any trailing 
1d0e0 30 78 30 30 20 62 79 74 65 73 20 61 64 64 65 64  0x00 bytes added
1d0f0 20 62 79 20 4e 65 61 72 54 72 69 6d 28 29 20 2a   by NearTrim() *
1d100 2f 0a 20 20 77 68 69 6c 65 28 20 70 3e 70 53 74  /.  while( p>pSt
1d110 61 72 74 20 26 26 20 28 63 3d 2a 70 2d 2d 29 3d  art && (c=*p--)=
1d120 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  =0 );..  /* Sear
1d130 63 68 20 62 61 63 6b 77 61 72 64 73 20 66 6f 72  ch backwards for
1d140 20 61 20 76 61 72 69 6e 74 20 77 69 74 68 20 76   a varint with v
1d150 61 6c 75 65 20 7a 65 72 6f 20 28 74 68 65 20 65  alue zero (the e
1d160 6e 64 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  nd of the previo
1d170 75 73 20 0a 20 20 2a 2a 20 70 6f 73 6c 69 73 74  us .  ** poslist
1d180 29 2e 20 54 68 69 73 20 69 73 20 61 6e 20 30 78  ). This is an 0x
1d190 30 30 20 62 79 74 65 20 70 72 65 63 65 64 65 64  00 byte preceded
1d1a0 20 62 79 20 73 6f 6d 65 20 62 79 74 65 20 74 68   by some byte th
1d1b0 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
1d1c0 20 68 61 76 65 20 74 68 65 20 30 78 38 30 20 62   have the 0x80 b
1d1d0 69 74 20 73 65 74 2e 20 20 2a 2f 0a 20 20 77 68  it set.  */.  wh
1d1e0 69 6c 65 28 20 70 3e 70 53 74 61 72 74 20 26 26  ile( p>pStart &&
1d1f0 20 28 2a 70 20 26 20 30 78 38 30 29 20 7c 20 63   (*p & 0x80) | c
1d200 20 29 7b 20 0a 20 20 20 20 63 20 3d 20 2a 70 2d   ){ .    c = *p-
1d210 2d 3b 20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  -; .  }.  assert
1d220 28 20 70 3d 3d 70 53 74 61 72 74 20 7c 7c 20 63  ( p==pStart || c
1d230 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 74 20  ==0 );..  /* At 
1d240 74 68 69 73 20 70 6f 69 6e 74 20 70 20 70 6f 69  this point p poi
1d250 6e 74 73 20 74 6f 20 74 68 61 74 20 70 72 65 63  nts to that prec
1d260 65 64 69 6e 67 20 62 79 74 65 20 77 69 74 68 6f  eding byte witho
1d270 75 74 20 74 68 65 20 30 78 38 30 20 62 69 74 0a  ut the 0x80 bit.
1d280 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 6f 20    ** set. So to 
1d290 66 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 6f  find the start o
1d2a0 66 20 74 68 65 20 70 6f 73 6c 69 73 74 2c 20 73  f the poslist, s
1d2b0 6b 69 70 20 66 6f 72 77 61 72 64 20 32 20 62 79  kip forward 2 by
1d2c0 74 65 73 20 74 68 65 6e 0a 20 20 2a 2a 20 6f 76  tes then.  ** ov
1d2d0 65 72 20 61 20 76 61 72 69 6e 74 2e 20 0a 20 20  er a varint. .  
1d2e0 2a 2a 0a 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  **.  ** Normally
1d2f0 2e 20 54 68 65 20 6f 74 68 65 72 20 63 61 73 65  . The other case
1d300 20 69 73 20 74 68 61 74 20 70 3d 3d 70 53 74 61   is that p==pSta
1d310 72 74 20 61 6e 64 20 74 68 65 20 70 6f 73 6c 69  rt and the posli
1d320 73 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  st to return.  *
1d330 2a 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  * is the first i
1d340 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 49  n the doclist. I
1d350 6e 20 74 68 69 73 20 63 61 73 65 20 64 6f 20 6e  n this case do n
1d360 6f 74 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20  ot skip forward 
1d370 32 20 62 79 74 65 73 2e 0a 20 20 2a 2a 20 54 68  2 bytes..  ** Th
1d380 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  e second part of
1d390 20 74 68 65 20 69 66 20 63 6f 6e 64 69 74 69 6f   the if conditio
1d3a0 6e 20 28 63 3d 3d 30 20 26 26 20 2a 70 70 50 6f  n (c==0 && *ppPo
1d3b0 73 6c 69 73 74 3e 26 70 5b 32 5d 29 0a 20 20 2a  slist>&p[2]).  *
1d3c0 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  * is required fo
1d3d0 72 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  r cases where th
1d3e0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
1d3f0 61 20 64 6f 63 6c 69 73 74 20 61 6e 64 20 74 68  a doclist and th
1d400 65 0a 20 20 2a 2a 20 64 6f 63 6c 69 73 74 20 69  e.  ** doclist i
1d410 73 20 65 6d 70 74 79 2e 20 46 6f 72 20 65 78 61  s empty. For exa
1d420 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 66 69 72  mple, if the fir
1d430 73 74 20 64 6f 63 69 64 20 69 73 20 31 30 2c 20  st docid is 10, 
1d440 61 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 74  a doclist.  ** t
1d450 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68 3a  hat begins with:
1d460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 30 78 30  .  **.  **   0x0
1d470 41 20 30 78 30 30 20 3c 6e 65 78 74 20 64 6f 63  A 0x00 <next doc
1d480 69 64 20 64 65 6c 74 61 20 76 61 72 69 6e 74 3e  id delta varint>
1d490 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 3e 70 53  .  */.  if( p>pS
1d4a0 74 61 72 74 20 7c 7c 20 28 63 3d 3d 30 20 26 26  tart || (c==0 &&
1d4b0 20 2a 70 70 50 6f 73 6c 69 73 74 3e 26 70 5b 32   *ppPoslist>&p[2
1d4c0 5d 29 20 29 7b 20 70 20 3d 20 26 70 5b 32 5d 3b  ]) ){ p = &p[2];
1d4d0 20 7d 0a 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b   }.  while( *p++
1d4e0 26 30 78 38 30 20 29 3b 0a 20 20 2a 70 70 50 6f  &0x80 );.  *ppPo
1d4f0 73 6c 69 73 74 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  slist = p;.}../*
1d500 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
1d510 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
1d520 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1d530 66 20 74 68 65 20 6f 76 65 72 6c 6f 61 64 65 64  f the overloaded
1d540 20 73 6e 69 70 70 65 74 28 29 2c 0a 2a 2a 20 6f   snippet(),.** o
1d550 66 66 73 65 74 73 28 29 20 61 6e 64 20 6f 70 74  ffsets() and opt
1d560 69 6d 69 7a 65 28 29 20 53 51 4c 20 66 75 6e 63  imize() SQL func
1d570 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tions..**.** If 
1d580 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
1d590 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
1d5a0 67 75 6d 65 6e 74 20 69 73 20 61 20 62 6c 6f 62  gument is a blob
1d5b0 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 73 69 7a 65   of size.** size
1d5c0 6f 66 28 46 74 73 33 43 75 72 73 6f 72 2a 29 2c  of(Fts3Cursor*),
1d5d0 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 62 20 63   then the blob c
1d5e0 6f 6e 74 65 6e 74 73 20 61 72 65 20 63 6f 70 69  ontents are copi
1d5f0 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6f 75  ed to the .** ou
1d600 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
1d610 70 43 73 72 20 61 6e 64 20 53 51 4c 49 54 45 5f  pCsr and SQLITE_
1d620 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1d630 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72  Otherwise, an er
1d640 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
1d650 73 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f 6e  s written to con
1d660 74 65 78 74 20 70 43 6f 6e 74 65 78 74 20 61 6e  text pContext an
1d670 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 72  d SQLITE_ERROR r
1d680 65 74 75 72 6e 65 64 2e 20 54 68 65 0a 2a 2a 20  eturned. The.** 
1d690 73 74 72 69 6e 67 20 70 61 73 73 65 64 20 76 69  string passed vi
1d6a0 61 20 7a 46 75 6e 63 20 69 73 20 75 73 65 64 20  a zFunc is used 
1d6b0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 65  as part of the e
1d6c0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
1d6d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1d6e0 46 75 6e 63 74 69 6f 6e 41 72 67 28 0a 20 20 73  FunctionArg(.  s
1d6f0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1d700 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f  pContext,      /
1d710 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63  * SQL function c
1d720 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
1d730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
1d740 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1d750 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 6e 61 6d   /* Function nam
1d760 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
1d770 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20 20 20 20  alue *pVal,     
1d780 20 20 20 20 20 20 20 2f 2a 20 61 72 67 76 5b 30         /* argv[0
1d790 5d 20 70 61 73 73 65 64 20 74 6f 20 66 75 6e 63  ] passed to func
1d7a0 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73 33 43 75  tion */.  Fts3Cu
1d7b0 72 73 6f 72 20 2a 2a 70 70 43 73 72 20 20 20 20  rsor **ppCsr    
1d7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d7d0 3a 20 53 74 6f 72 65 20 63 75 72 73 6f 72 20 68  : Store cursor h
1d7e0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 29 7b  andle here */.){
1d7f0 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
1d800 52 65 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  Ret;.  if( sqlit
1d810 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
1d820 61 6c 29 21 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  al)!=SQLITE_BLOB
1d830 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f   .   || sqlite3_
1d840 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
1d850 29 21 3d 73 69 7a 65 6f 66 28 46 74 73 33 43 75  )!=sizeof(Fts3Cu
1d860 72 73 6f 72 20 2a 29 0a 20 20 29 7b 0a 20 20 20  rsor *).  ){.   
1d870 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71   char *zErr = sq
1d880 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
1d890 6c 6c 65 67 61 6c 20 66 69 72 73 74 20 61 72 67  llegal first arg
1d8a0 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c 20 7a 46  ument to %s", zF
1d8b0 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  unc);.    sqlite
1d8c0 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
1d8d0 43 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d  Context, zErr, -
1d8e0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
1d8f0 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20  free(zErr);.    
1d900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1d910 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  ROR;.  }.  memcp
1d920 79 28 26 70 52 65 74 2c 20 73 71 6c 69 74 65 33  y(&pRet, sqlite3
1d930 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70 56 61 6c  _value_blob(pVal
1d940 29 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 43 75  ), sizeof(Fts3Cu
1d950 72 73 6f 72 20 2a 29 29 3b 0a 20 20 2a 70 70 43  rsor *));.  *ppC
1d960 73 72 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74  sr = pRet;.  ret
1d970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d980 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1d990 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 6e  tation of the sn
1d9a0 69 70 70 65 74 28 29 20 66 75 6e 63 74 69 6f 6e  ippet() function
1d9b0 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a 73 74 61   for FTS3.*/.sta
1d9c0 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 6e 69  tic void fts3Sni
1d9d0 70 70 65 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  ppetFunc(.  sqli
1d9e0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f  te3_context *pCo
1d9f0 6e 74 65 78 74 2c 20 20 20 20 20 20 2f 2a 20 53  ntext,      /* S
1da00 51 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 20 63  QLite function c
1da10 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
1da20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20   int nVal,      
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 70 56 61   /* Size of apVa
1da50 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  l[] array */.  s
1da60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1da70 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
1da80 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
1da90 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ents */.){.  Fts
1daa0 33 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20  3Cursor *pCsr;  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dac0 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 70 61  Cursor handle pa
1dad0 73 73 65 64 20 74 68 72 6f 75 67 68 20 61 70 56  ssed through apV
1dae0 61 6c 5b 30 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74  al[0] */.  const
1daf0 20 63 68 61 72 20 2a 7a 53 74 61 72 74 20 3d 20   char *zStart = 
1db00 22 3c 62 3e 22 3b 0a 20 20 63 6f 6e 73 74 20 63  "<b>";.  const c
1db10 68 61 72 20 2a 7a 45 6e 64 20 3d 20 22 3c 2f 62  har *zEnd = "</b
1db20 3e 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  >";.  const char
1db30 20 2a 7a 45 6c 6c 69 70 73 69 73 20 3d 20 22 3c   *zEllipsis = "<
1db40 62 3e 2e 2e 2e 3c 2f 62 3e 22 3b 0a 20 20 69 6e  b>...</b>";.  in
1db50 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 69  t iCol = -1;.  i
1db60 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 31 35 3b 20  nt nToken = 15; 
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db80 2a 20 44 65 66 61 75 6c 74 20 6e 75 6d 62 65 72  * Default number
1db90 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20 73 6e   of tokens in sn
1dba0 69 70 70 65 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ippet */..  /* T
1dbb0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
1dbc0 6c 65 61 73 74 20 6f 6e 65 20 61 72 67 75 6d 65  least one argume
1dbd0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1dbe0 73 20 66 75 6e 63 74 69 6f 6e 20 28 6f 74 68 65  s function (othe
1dbf0 72 77 69 73 65 0a 20 20 2a 2a 20 74 68 65 20 6e  rwise.  ** the n
1dc00 6f 6e 2d 6f 76 65 72 6c 6f 61 64 65 64 20 76 65  on-overloaded ve
1dc10 72 73 69 6f 6e 20 77 6f 75 6c 64 20 68 61 76 65  rsion would have
1dc20 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 69 6e 73   been called ins
1dc30 74 65 61 64 20 6f 66 20 74 68 69 73 20 6f 6e 65  tead of this one
1dc40 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1dc50 28 20 6e 56 61 6c 3e 3d 31 20 29 3b 0a 0a 20 20  ( nVal>=1 );..  
1dc60 69 66 28 20 6e 56 61 6c 3e 36 20 29 7b 0a 20 20  if( nVal>6 ){.  
1dc70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1dc80 5f 65 72 72 6f 72 28 70 43 6f 6e 74 65 78 74 2c  _error(pContext,
1dc90 20 0a 20 20 20 20 20 20 20 20 22 77 72 6f 6e 67   .        "wrong
1dca0 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
1dcb0 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
1dcc0 20 73 6e 69 70 70 65 74 28 29 22 2c 20 2d 31 29   snippet()", -1)
1dcd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1dce0 7d 0a 20 20 69 66 28 20 66 74 73 33 46 75 6e 63  }.  if( fts3Func
1dcf0 74 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74  tionArg(pContext
1dd00 2c 20 22 73 6e 69 70 70 65 74 22 2c 20 61 70 56  , "snippet", apV
1dd10 61 6c 5b 30 5d 2c 20 26 70 43 73 72 29 20 29 20  al[0], &pCsr) ) 
1dd20 72 65 74 75 72 6e 3b 0a 0a 20 20 73 77 69 74 63  return;..  switc
1dd30 68 28 20 6e 56 61 6c 20 29 7b 0a 20 20 20 20 63  h( nVal ){.    c
1dd40 61 73 65 20 36 3a 20 6e 54 6f 6b 65 6e 20 3d 20  ase 6: nToken = 
1dd50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1dd60 74 28 61 70 56 61 6c 5b 35 5d 29 3b 0a 20 20 20  t(apVal[5]);.   
1dd70 20 63 61 73 65 20 35 3a 20 69 43 6f 6c 20 3d 20   case 5: iCol = 
1dd80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1dd90 74 28 61 70 56 61 6c 5b 34 5d 29 3b 0a 20 20 20  t(apVal[4]);.   
1dda0 20 63 61 73 65 20 34 3a 20 7a 45 6c 6c 69 70 73   case 4: zEllips
1ddb0 69 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  is = (const char
1ddc0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1ddd0 74 65 78 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a  text(apVal[3]);.
1dde0 20 20 20 20 63 61 73 65 20 33 3a 20 7a 45 6e 64      case 3: zEnd
1ddf0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1de00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1de10 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
1de20 20 20 63 61 73 65 20 32 3a 20 7a 53 74 61 72 74    case 2: zStart
1de30 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1de40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1de50 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  xt(apVal[1]);.  
1de60 7d 0a 20 20 69 66 28 20 21 7a 45 6c 6c 69 70 73  }.  if( !zEllips
1de70 69 73 20 7c 7c 20 21 7a 45 6e 64 20 7c 7c 20 21  is || !zEnd || !
1de80 7a 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  zStart ){.    sq
1de90 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1dea0 6f 72 5f 6e 6f 6d 65 6d 28 70 43 6f 6e 74 65 78  or_nomem(pContex
1deb0 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
1dec0 6e 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  nToken==0 ){.   
1ded0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dee0 74 65 78 74 28 70 43 6f 6e 74 65 78 74 2c 20 22  text(pContext, "
1def0 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ", -1, SQLITE_ST
1df00 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIC);.  }else i
1df10 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66 74  f( SQLITE_OK==ft
1df20 73 33 43 75 72 73 6f 72 53 65 65 6b 28 70 43 6f  s3CursorSeek(pCo
1df30 6e 74 65 78 74 2c 20 70 43 73 72 29 20 29 7b 0a  ntext, pCsr) ){.
1df40 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 53      sqlite3Fts3S
1df50 6e 69 70 70 65 74 28 70 43 6f 6e 74 65 78 74 2c  nippet(pContext,
1df60 20 70 43 73 72 2c 20 7a 53 74 61 72 74 2c 20 7a   pCsr, zStart, z
1df70 45 6e 64 2c 20 7a 45 6c 6c 69 70 73 69 73 2c 20  End, zEllipsis, 
1df80 69 43 6f 6c 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  iCol, nToken);. 
1df90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
1dfa0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
1dfb0 65 20 6f 66 66 73 65 74 73 28 29 20 66 75 6e 63  e offsets() func
1dfc0 74 69 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f  tion for FTS3.*/
1dfd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1dfe0 33 4f 66 66 73 65 74 73 46 75 6e 63 28 0a 20 20  3OffsetsFunc(.  
1dff0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1e000 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20  *pContext,      
1e010 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69  /* SQLite functi
1e020 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
1e030 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20  */.  int nVal,  
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e060 61 72 67 75 6d 65 6e 74 20 61 72 72 61 79 20 2a  argument array *
1e070 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
1e080 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
1e090 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1e0a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
1e0b0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1e0c0 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
1e0d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64    /* Cursor hand
1e0e0 6c 65 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  le passed throug
1e0f0 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 0a 20  h apVal[0] */.. 
1e100 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1e110 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61 73 73 65  R(nVal);..  asse
1e120 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20  rt( nVal==1 );. 
1e130 20 69 66 28 20 66 74 73 33 46 75 6e 63 74 69 6f   if( fts3Functio
1e140 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c 20 22  nArg(pContext, "
1e150 6f 66 66 73 65 74 73 22 2c 20 61 70 56 61 6c 5b  offsets", apVal[
1e160 30 5d 2c 20 26 70 43 73 72 29 20 29 20 72 65 74  0], &pCsr) ) ret
1e170 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1e180 43 73 72 20 29 3b 0a 20 20 69 66 28 20 53 51 4c  Csr );.  if( SQL
1e190 49 54 45 5f 4f 4b 3d 3d 66 74 73 33 43 75 72 73  ITE_OK==fts3Curs
1e1a0 6f 72 53 65 65 6b 28 70 43 6f 6e 74 65 78 74 2c  orSeek(pContext,
1e1b0 20 70 43 73 72 29 20 29 7b 0a 20 20 20 20 73 71   pCsr) ){.    sq
1e1c0 6c 69 74 65 33 46 74 73 33 4f 66 66 73 65 74 73  lite3Fts3Offsets
1e1d0 28 70 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29  (pContext, pCsr)
1e1e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
1e1f0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1e200 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6f 70  f the special op
1e210 74 69 6d 69 7a 65 28 29 20 66 75 6e 63 74 69 6f  timize() functio
1e220 6e 20 66 6f 72 20 46 54 53 33 2e 20 54 68 69 73  n for FTS3. This
1e230 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 65   .** function me
1e240 72 67 65 73 20 61 6c 6c 20 73 65 67 6d 65 6e 74  rges all segment
1e250 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1e260 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 73 65  e to a single se
1e270 67 6d 65 6e 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  gment..** Exampl
1e280 65 20 75 73 61 67 65 20 69 73 3a 0a 2a 2a 0a 2a  e usage is:.**.*
1e290 2a 20 20 20 53 45 4c 45 43 54 20 6f 70 74 69 6d  *   SELECT optim
1e2a0 69 7a 65 28 74 29 20 46 52 4f 4d 20 74 20 4c 49  ize(t) FROM t LI
1e2b0 4d 49 54 20 31 3b 0a 2a 2a 0a 2a 2a 20 77 68 65  MIT 1;.**.** whe
1e2c0 72 65 20 27 74 27 20 69 73 20 74 68 65 20 6e 61  re 't' is the na
1e2d0 6d 65 20 6f 66 20 61 6e 20 46 54 53 33 20 74 61  me of an FTS3 ta
1e2e0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1e2f0 6f 69 64 20 66 74 73 33 4f 70 74 69 6d 69 7a 65  oid fts3Optimize
1e300 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e310 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
1e320 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
1e330 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1e340 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e350 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e370 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
1e380 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
1e390 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1e3a0 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1e3b0 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
1e3c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
1e3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e3f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
1e400 73 33 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20  s3Table *p;     
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e420 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
1e430 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 43  andle */.  Fts3C
1e440 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 3b 20  ursor *pCursor; 
1e450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1e460 72 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73  rsor handle pass
1e470 65 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c  ed through apVal
1e480 5b 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  [0] */..  UNUSED
1e490 5f 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c 29  _PARAMETER(nVal)
1e4a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61  ;..  assert( nVa
1e4b0 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 66 74  l==1 );.  if( ft
1e4c0 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 70 43  s3FunctionArg(pC
1e4d0 6f 6e 74 65 78 74 2c 20 22 6f 70 74 69 6d 69 7a  ontext, "optimiz
1e4e0 65 22 2c 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70  e", apVal[0], &p
1e4f0 43 75 72 73 6f 72 29 20 29 20 72 65 74 75 72 6e  Cursor) ) return
1e500 3b 0a 20 20 70 20 3d 20 28 46 74 73 33 54 61 62  ;.  p = (Fts3Tab
1e510 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d 3e 62 61  le *)pCursor->ba
1e520 73 65 2e 70 56 74 61 62 3b 0a 20 20 61 73 73 65  se.pVtab;.  asse
1e530 72 74 28 20 70 20 29 3b 0a 0a 20 20 72 63 20 3d  rt( p );..  rc =
1e540 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74 69   sqlite3Fts3Opti
1e550 6d 69 7a 65 28 70 29 3b 0a 0a 20 20 73 77 69 74  mize(p);..  swit
1e560 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61  ch( rc ){.    ca
1e570 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 0a 20 20  se SQLITE_OK:.  
1e580 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1e590 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74 65 78 74  lt_text(pContext
1e5a0 2c 20 22 49 6e 64 65 78 20 6f 70 74 69 6d 69 7a  , "Index optimiz
1e5b0 65 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ed", -1, SQLITE_
1e5c0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62  STATIC);.      b
1e5d0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1e5e0 51 4c 49 54 45 5f 44 4f 4e 45 3a 0a 20 20 20 20  QLITE_DONE:.    
1e5f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1e600 5f 74 65 78 74 28 70 43 6f 6e 74 65 78 74 2c 20  _text(pContext, 
1e610 22 49 6e 64 65 78 20 61 6c 72 65 61 64 79 20 6f  "Index already o
1e620 70 74 69 6d 61 6c 22 2c 20 2d 31 2c 20 53 51 4c  ptimal", -1, SQL
1e630 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1e640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
1e650 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c  fault:.      sql
1e660 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1e670 72 5f 63 6f 64 65 28 70 43 6f 6e 74 65 78 74 2c  r_code(pContext,
1e680 20 72 63 29 3b 0a 20 20 20 20 20 20 62 72 65 61   rc);.      brea
1e690 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
1e6a0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1e6b0 66 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 28  f the matchinfo(
1e6c0 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46  ) function for F
1e6d0 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  TS3.*/.static vo
1e6e0 69 64 20 66 74 73 33 4d 61 74 63 68 69 6e 66 6f  id fts3Matchinfo
1e6f0 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e700 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e 74 65 78  context *pContex
1e710 74 2c 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74  t,      /* SQLit
1e720 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1e730 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1e740 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e760 53 69 7a 65 20 6f 66 20 61 72 67 75 6d 65 6e 74  Size of argument
1e770 20 61 72 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69   array */.  sqli
1e780 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1e790 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1e7a0 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
1e7b0 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 43 75  s */.){.  Fts3Cu
1e7c0 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20  rsor *pCsr;     
1e7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1e7e0 73 6f 72 20 68 61 6e 64 6c 65 20 70 61 73 73 65  sor handle passe
1e7f0 64 20 74 68 72 6f 75 67 68 20 61 70 56 61 6c 5b  d through apVal[
1e800 30 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  0] */.  assert( 
1e810 6e 56 61 6c 3d 3d 31 20 7c 7c 20 6e 56 61 6c 3d  nVal==1 || nVal=
1e820 3d 32 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =2 );.  if( SQLI
1e830 54 45 5f 4f 4b 3d 3d 66 74 73 33 46 75 6e 63 74  TE_OK==fts3Funct
1e840 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74 2c  ionArg(pContext,
1e850 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 61 70   "matchinfo", ap
1e860 56 61 6c 5b 30 5d 2c 20 26 70 43 73 72 29 20 29  Val[0], &pCsr) )
1e870 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1e880 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20 20 20   *zArg = 0;.    
1e890 69 66 28 20 6e 56 61 6c 3e 31 20 29 7b 0a 20 20  if( nVal>1 ){.  
1e8a0 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73      zArg = (cons
1e8b0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
1e8c0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
1e8d0 6c 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l[1]);.    }.   
1e8e0 20 73 71 6c 69 74 65 33 46 74 73 33 4d 61 74 63   sqlite3Fts3Matc
1e8f0 68 69 6e 66 6f 28 70 43 6f 6e 74 65 78 74 2c 20  hinfo(pContext, 
1e900 70 43 73 72 2c 20 7a 41 72 67 29 3b 0a 20 20 7d  pCsr, zArg);.  }
1e910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e920 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1e930 73 20 74 68 65 20 78 46 69 6e 64 46 75 6e 63 74  s the xFindFunct
1e940 69 6f 6e 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  ion method for t
1e950 68 65 20 46 54 53 33 0a 2a 2a 20 76 69 72 74 75  he FTS3.** virtu
1e960 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
1e970 74 69 63 20 69 6e 74 20 66 74 73 33 46 69 6e 64  tic int fts3Find
1e980 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 28 0a  FunctionMethod(.
1e990 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
1e9a0 70 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20  pVtab,          
1e9b0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
1e9c0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
1e9d0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e9f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 51 4c 20  * Number of SQL 
1ea00 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
1ea10 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
1ea20 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
1ea30 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1ea40 6f 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  of SQL function 
1ea50 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 2a 70 78 46  */.  void (**pxF
1ea60 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
1ea70 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
1ea80 33 5f 76 61 6c 75 65 2a 2a 29 2c 20 2f 2a 20 4f  3_value**), /* O
1ea90 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 20 20  UT: Result */.  
1eaa0 76 6f 69 64 20 2a 2a 70 70 41 72 67 20 20 20 20  void **ppArg    
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a  /* Unused */.){.
1ead0 20 20 73 74 72 75 63 74 20 4f 76 65 72 6c 6f 61    struct Overloa
1eae0 64 65 64 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ded {.    const 
1eaf0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
1eb00 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
1eb10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
1eb20 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
1eb30 65 2a 2a 29 3b 0a 20 20 7d 20 61 4f 76 65 72 6c  e**);.  } aOverl
1eb40 6f 61 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  oad[] = {.    { 
1eb50 22 73 6e 69 70 70 65 74 22 2c 20 66 74 73 33 53  "snippet", fts3S
1eb60 6e 69 70 70 65 74 46 75 6e 63 20 7d 2c 0a 20 20  nippetFunc },.  
1eb70 20 20 7b 20 22 6f 66 66 73 65 74 73 22 2c 20 66    { "offsets", f
1eb80 74 73 33 4f 66 66 73 65 74 73 46 75 6e 63 20 7d  ts3OffsetsFunc }
1eb90 2c 0a 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a  ,.    { "optimiz
1eba0 65 22 2c 20 66 74 73 33 4f 70 74 69 6d 69 7a 65  e", fts3Optimize
1ebb0 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6d  Func },.    { "m
1ebc0 61 74 63 68 69 6e 66 6f 22 2c 20 66 74 73 33 4d  atchinfo", fts3M
1ebd0 61 74 63 68 69 6e 66 6f 46 75 6e 63 20 7d 2c 0a  atchinfoFunc },.
1ebe0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20    };.  int i;   
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
1ec10 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
1ec20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1ec30 45 52 28 70 56 74 61 62 29 3b 0a 20 20 55 4e 55  ER(pVtab);.  UNU
1ec40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41  SED_PARAMETER(nA
1ec50 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg);.  UNUSED_PA
1ec60 52 41 4d 45 54 45 52 28 70 70 41 72 67 29 3b 0a  RAMETER(ppArg);.
1ec70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 69  .  for(i=0; i<Si
1ec80 7a 65 6f 66 41 72 72 61 79 28 61 4f 76 65 72 6c  zeofArray(aOverl
1ec90 6f 61 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oad); i++){.    
1eca0 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
1ecb0 2c 20 61 4f 76 65 72 6c 6f 61 64 5b 69 5d 2e 7a  , aOverload[i].z
1ecc0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
1ecd0 20 20 2a 70 78 46 75 6e 63 20 3d 20 61 4f 76 65    *pxFunc = aOve
1ece0 72 6c 6f 61 64 5b 69 5d 2e 78 46 75 6e 63 3b 0a  rload[i].xFunc;.
1ecf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1ed00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ed10 4e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  No function of t
1ed20 68 65 20 73 70 65 63 69 66 69 65 64 20 6e 61 6d  he specified nam
1ed30 65 20 77 61 73 20 66 6f 75 6e 64 2e 20 52 65 74  e was found. Ret
1ed40 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75  urn 0. */.  retu
1ed50 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
1ed60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1ed70 20 46 54 53 33 20 78 52 65 6e 61 6d 65 20 6d 65   FTS3 xRename me
1ed80 74 68 6f 64 2e 20 52 65 6e 61 6d 65 20 61 6e 20  thod. Rename an 
1ed90 66 74 73 33 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  fts3 table..*/.s
1eda0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 65  tatic int fts3Re
1edb0 6e 61 6d 65 4d 65 74 68 6f 64 28 0a 20 20 73 71  nameMethod(.  sq
1edc0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
1edd0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
1ede0 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68   Virtual table h
1edf0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1ee00 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20   char *zName    
1ee10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1ee20 77 20 6e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  w name of table 
1ee30 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  */.){.  Fts3Tabl
1ee40 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c  e *p = (Fts3Tabl
1ee50 65 20 2a 29 70 56 74 61 62 3b 0a 20 20 73 71 6c  e *)pVtab;.  sql
1ee60 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1ee70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1ee80 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1ee90 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1eec0 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn Code */..  /*
1eed0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
1eee0 74 20 6d 75 73 74 20 62 65 20 6b 6e 6f 77 6e 20  t must be known 
1eef0 69 66 20 74 68 65 20 25 5f 73 74 61 74 20 74 61  if the %_stat ta
1ef00 62 6c 65 20 65 78 69 73 74 73 20 6f 72 20 6e 6f  ble exists or no
1ef10 74 2e 0a 20 20 2a 2a 20 53 6f 20 62 48 61 73 53  t..  ** So bHasS
1ef20 74 61 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 32  tat may not be 2
1ef30 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73  .  */.  rc = fts
1ef40 33 53 65 74 48 61 73 53 74 61 74 28 70 29 3b 0a  3SetHasStat(p);.
1ef50 20 20 0a 20 20 2f 2a 20 41 73 20 69 74 20 68 61    .  /* As it ha
1ef60 70 70 65 6e 73 2c 20 74 68 65 20 70 65 6e 64 69  ppens, the pendi
1ef70 6e 67 20 74 65 72 6d 73 20 74 61 62 6c 65 20 69  ng terms table i
1ef80 73 20 61 6c 77 61 79 73 20 65 6d 70 74 79 20 68  s always empty h
1ef90 65 72 65 2e 20 54 68 69 73 20 69 73 0a 20 20 2a  ere. This is.  *
1efa0 2a 20 62 65 63 61 75 73 65 20 61 6e 20 22 41 4c  * because an "AL
1efb0 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41 4d 45  TER TABLE RENAME
1efc0 20 54 41 42 4c 45 22 20 73 74 61 74 65 6d 65 6e   TABLE" statemen
1efd0 74 20 69 6e 73 69 64 65 20 61 20 74 72 61 6e 73  t inside a trans
1efe0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 61 6c 77  action .  ** alw
1eff0 61 79 73 20 6f 70 65 6e 73 20 61 20 73 61 76 65  ays opens a save
1f000 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
1f010 6e 2e 20 41 6e 64 20 74 68 65 20 78 53 61 76 65  n. And the xSave
1f020 70 6f 69 6e 74 28 29 20 6d 65 74 68 6f 64 20 0a  point() method .
1f030 20 20 2a 2a 20 66 6c 75 73 68 65 73 20 74 68 65    ** flushes the
1f040 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 20 74   pending terms t
1f050 61 62 6c 65 2e 20 42 75 74 20 6c 65 61 76 65 20  able. But leave 
1f060 74 68 65 20 28 6e 6f 2d 6f 70 29 20 63 61 6c 6c  the (no-op) call
1f070 20 74 6f 0a 20 20 2a 2a 20 50 65 6e 64 69 6e 67   to.  ** Pending
1f080 54 65 72 6d 73 46 6c 75 73 68 28 29 20 69 6e 20  TermsFlush() in 
1f090 69 6e 20 63 61 73 65 20 74 68 61 74 20 63 68 61  in case that cha
1f0a0 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  nges..  */.  ass
1f0b0 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  ert( p->nPending
1f0c0 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Data==0 );.  if(
1f0d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f0e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f0f0 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72  e3Fts3PendingTer
1f100 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a  msFlush(p);.  }.
1f110 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65  .  if( p->zConte
1f120 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ntTbl==0 ){.    
1f130 66 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20  fts3DbExec(&rc, 
1f140 64 62 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52  db,.      "ALTER
1f150 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 63 6f   TABLE %Q.'%q_co
1f160 6e 74 65 6e 74 27 20 20 52 45 4e 41 4d 45 20 54  ntent'  RENAME T
1f170 4f 20 27 25 71 5f 63 6f 6e 74 65 6e 74 27 3b 22  O '%q_content';"
1f180 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 2c 20  ,.      p->zDb, 
1f190 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a  p->zName, zName.
1f1a0 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
1f1b0 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 69 7a 65  ( p->bHasDocsize
1f1c0 20 29 7b 0a 20 20 20 20 66 74 73 33 44 62 45 78   ){.    fts3DbEx
1f1d0 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
1f1e0 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
1f1f0 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 27 20 20  Q.'%q_docsize'  
1f200 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 64 6f  RENAME TO '%q_do
1f210 63 73 69 7a 65 27 3b 22 2c 0a 20 20 20 20 20 20  csize';",.      
1f220 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65  p->zDb, p->zName
1f230 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  , zName.    );. 
1f240 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62 48 61 73   }.  if( p->bHas
1f250 53 74 61 74 20 29 7b 0a 20 20 20 20 66 74 73 33  Stat ){.    fts3
1f260 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a  DbExec(&rc, db,.
1f270 20 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42        "ALTER TAB
1f280 4c 45 20 25 51 2e 27 25 71 5f 73 74 61 74 27 20  LE %Q.'%q_stat' 
1f290 20 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73   RENAME TO '%q_s
1f2a0 74 61 74 27 3b 22 2c 0a 20 20 20 20 20 20 70 2d  tat';",.      p-
1f2b0 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  >zDb, p->zName, 
1f2c0 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
1f2d0 0a 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72  .  fts3DbExec(&r
1f2e0 63 2c 20 64 62 2c 0a 20 20 20 20 22 41 4c 54 45  c, db,.    "ALTE
1f2f0 52 20 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73  R TABLE %Q.'%q_s
1f300 65 67 6d 65 6e 74 73 27 20 52 45 4e 41 4d 45 20  egments' RENAME 
1f310 54 4f 20 27 25 71 5f 73 65 67 6d 65 6e 74 73 27  TO '%q_segments'
1f320 3b 22 2c 0a 20 20 20 20 70 2d 3e 7a 44 62 2c 20  ;",.    p->zDb, 
1f330 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 0a  p->zName, zName.
1f340 20 20 29 3b 0a 20 20 66 74 73 33 44 62 45 78 65    );.  fts3DbExe
1f350 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 22  c(&rc, db,.    "
1f360 41 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27  ALTER TABLE %Q.'
1f370 25 71 5f 73 65 67 64 69 72 27 20 20 20 52 45 4e  %q_segdir'   REN
1f380 41 4d 45 20 54 4f 20 27 25 71 5f 73 65 67 64 69  AME TO '%q_segdi
1f390 72 27 3b 22 2c 0a 20 20 20 20 70 2d 3e 7a 44 62  r';",.    p->zDb
1f3a0 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  , p->zName, zNam
1f3b0 65 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  e.  );.  return 
1f3c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1f3d0 20 78 53 61 76 65 70 6f 69 6e 74 28 29 20 6d 65   xSavepoint() me
1f3e0 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 75 73  thod..**.** Flus
1f3f0 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
1f400 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
1f410 72 6d 73 20 74 61 62 6c 65 20 74 6f 20 64 69 73  rms table to dis
1f420 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
1f430 20 66 74 73 33 53 61 76 65 70 6f 69 6e 74 4d 65   fts3SavepointMe
1f440 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61  thod(sqlite3_vta
1f450 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20 69 53  b *pVtab, int iS
1f460 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
1f470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f480 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f490 54 45 52 28 69 53 61 76 65 70 6f 69 6e 74 29 3b  TER(iSavepoint);
1f4a0 0a 20 20 61 73 73 65 72 74 28 20 28 28 46 74 73  .  assert( ((Fts
1f4b0 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29 2d  3Table *)pVtab)-
1f4c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1f4d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 46 74  ;.  assert( ((Ft
1f4e0 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29  s3Table *)pVtab)
1f4f0 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3c 20  ->mxSavepoint < 
1f500 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  iSavepoint );.  
1f510 54 45 53 54 4f 4e 4c 59 28 20 28 28 46 74 73 33  TESTONLY( ((Fts3
1f520 54 61 62 6c 65 20 2a 29 70 56 74 61 62 29 2d 3e  Table *)pVtab)->
1f530 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53  mxSavepoint = iS
1f540 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66  avepoint );.  if
1f550 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
1f560 70 56 74 61 62 29 2d 3e 62 49 67 6e 6f 72 65 53  pVtab)->bIgnoreS
1f570 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
1f580 20 20 20 72 63 20 3d 20 66 74 73 33 53 79 6e 63     rc = fts3Sync
1f590 4d 65 74 68 6f 64 28 70 56 74 61 62 29 3b 0a 20  Method(pVtab);. 
1f5a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f5b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 52 65  }../*.** The xRe
1f5c0 6c 65 61 73 65 28 29 20 6d 65 74 68 6f 64 2e 0a  lease() method..
1f5d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
1f5e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1f5f0 20 69 6e 74 20 66 74 73 33 52 65 6c 65 61 73 65   int fts3Release
1f600 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
1f610 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74 20  tab *pVtab, int 
1f620 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 54  iSavepoint){.  T
1f630 45 53 54 4f 4e 4c 59 28 20 46 74 73 33 54 61 62  ESTONLY( Fts3Tab
1f640 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
1f650 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a 20 20 55  le*)pVtab );.  U
1f660 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f670 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 55  iSavepoint);.  U
1f680 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f690 70 56 74 61 62 29 3b 0a 20 20 61 73 73 65 72 74  pVtab);.  assert
1f6a0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  ( p->inTransacti
1f6b0 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  on );.  assert( 
1f6c0 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3e  p->mxSavepoint >
1f6d0 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  = iSavepoint );.
1f6e0 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d    TESTONLY( p->m
1f6f0 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53 61  xSavepoint = iSa
1f700 76 65 70 6f 69 6e 74 2d 31 20 29 3b 0a 20 20 72  vepoint-1 );.  r
1f710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 52  .}../*.** The xR
1f730 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 6d 65 74 68  ollbackTo() meth
1f740 6f 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 63 61 72  od..**.** Discar
1f750 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
1f760 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65  f the pending te
1f770 72 6d 73 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  rms table..*/.st
1f780 61 74 69 63 20 69 6e 74 20 66 74 73 33 52 6f 6c  atic int fts3Rol
1f790 6c 62 61 63 6b 54 6f 4d 65 74 68 6f 64 28 73 71  lbackToMethod(sq
1f7a0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
1f7b0 62 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  b, int iSavepoin
1f7c0 74 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  t){.  Fts3Table 
1f7d0 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 2a  *p = (Fts3Table*
1f7e0 29 70 56 74 61 62 3b 0a 20 20 55 4e 55 53 45 44  )pVtab;.  UNUSED
1f7f0 5f 50 41 52 41 4d 45 54 45 52 28 69 53 61 76 65  _PARAMETER(iSave
1f800 70 6f 69 6e 74 29 3b 0a 20 20 61 73 73 65 72 74  point);.  assert
1f810 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  ( p->inTransacti
1f820 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  on );.  assert( 
1f830 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3e  p->mxSavepoint >
1f840 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  = iSavepoint );.
1f850 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d    TESTONLY( p->m
1f860 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 53 61  xSavepoint = iSa
1f870 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 73 71 6c  vepoint );.  sql
1f880 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 54  ite3Fts3PendingT
1f890 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 20 20  ermsClear(p);.  
1f8a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f8b0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
1f8c0 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
1f8d0 20 66 74 73 33 4d 6f 64 75 6c 65 20 3d 20 7b 0a   fts3Module = {.
1f8e0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20 20    /* iVersion   
1f8f0 20 20 20 2a 2f 20 32 2c 0a 20 20 2f 2a 20 78 43     */ 2,.  /* xC
1f900 72 65 61 74 65 20 20 20 20 20 20 20 2a 2f 20 66  reate       */ f
1f910 74 73 33 43 72 65 61 74 65 4d 65 74 68 6f 64 2c  ts3CreateMethod,
1f920 0a 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 20  .  /* xConnect  
1f930 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6e 6e 65      */ fts3Conne
1f940 63 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  ctMethod,.  /* x
1f950 42 65 73 74 49 6e 64 65 78 20 20 20 20 2a 2f 20  BestIndex    */ 
1f960 66 74 73 33 42 65 73 74 49 6e 64 65 78 4d 65 74  fts3BestIndexMet
1f970 68 6f 64 2c 0a 20 20 2f 2a 20 78 44 69 73 63 6f  hod,.  /* xDisco
1f980 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74 73 33 44  nnect   */ fts3D
1f990 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68 6f 64 2c  isconnectMethod,
1f9a0 0a 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 20  .  /* xDestroy  
1f9b0 20 20 20 20 2a 2f 20 66 74 73 33 44 65 73 74 72      */ fts3Destr
1f9c0 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  oyMethod,.  /* x
1f9d0 4f 70 65 6e 20 20 20 20 20 20 20 20 20 2a 2f 20  Open         */ 
1f9e0 66 74 73 33 4f 70 65 6e 4d 65 74 68 6f 64 2c 0a  fts3OpenMethod,.
1f9f0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20 20 20    /* xClose     
1fa00 20 20 20 2a 2f 20 66 74 73 33 43 6c 6f 73 65 4d     */ fts3CloseM
1fa10 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 46 69 6c  ethod,.  /* xFil
1fa20 74 65 72 20 20 20 20 20 20 20 2a 2f 20 66 74 73  ter       */ fts
1fa30 33 46 69 6c 74 65 72 4d 65 74 68 6f 64 2c 0a 20  3FilterMethod,. 
1fa40 20 2f 2a 20 78 4e 65 78 74 20 20 20 20 20 20 20   /* xNext       
1fa50 20 20 2a 2f 20 66 74 73 33 4e 65 78 74 4d 65 74    */ fts3NextMet
1fa60 68 6f 64 2c 0a 20 20 2f 2a 20 78 45 6f 66 20 20  hod,.  /* xEof  
1fa70 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 45          */ fts3E
1fa80 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  ofMethod,.  /* x
1fa90 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 2a 2f 20  Column       */ 
1faa0 66 74 73 33 43 6f 6c 75 6d 6e 4d 65 74 68 6f 64  fts3ColumnMethod
1fab0 2c 0a 20 20 2f 2a 20 78 52 6f 77 69 64 20 20 20  ,.  /* xRowid   
1fac0 20 20 20 20 20 2a 2f 20 66 74 73 33 52 6f 77 69       */ fts3Rowi
1fad0 64 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 55  dMethod,.  /* xU
1fae0 70 64 61 74 65 20 20 20 20 20 20 20 2a 2f 20 66  pdate       */ f
1faf0 74 73 33 55 70 64 61 74 65 4d 65 74 68 6f 64 2c  ts3UpdateMethod,
1fb00 0a 20 20 2f 2a 20 78 42 65 67 69 6e 20 20 20 20  .  /* xBegin    
1fb10 20 20 20 20 2a 2f 20 66 74 73 33 42 65 67 69 6e      */ fts3Begin
1fb20 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53 79  Method,.  /* xSy
1fb30 6e 63 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74  nc         */ ft
1fb40 73 33 53 79 6e 63 4d 65 74 68 6f 64 2c 0a 20 20  s3SyncMethod,.  
1fb50 2f 2a 20 78 43 6f 6d 6d 69 74 20 20 20 20 20 20  /* xCommit      
1fb60 20 2a 2f 20 66 74 73 33 43 6f 6d 6d 69 74 4d 65   */ fts3CommitMe
1fb70 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 6c 6c  thod,.  /* xRoll
1fb80 62 61 63 6b 20 20 20 20 20 2a 2f 20 66 74 73 33  back     */ fts3
1fb90 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f 64 2c 0a  RollbackMethod,.
1fba0 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
1fbb0 6f 6e 20 2a 2f 20 66 74 73 33 46 69 6e 64 46 75  on */ fts3FindFu
1fbc0 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c 0a 20 20  nctionMethod,.  
1fbd0 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 20 20 20  /* xRename */   
1fbe0 20 20 20 20 66 74 73 33 52 65 6e 61 6d 65 4d 65      fts3RenameMe
1fbf0 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53 61 76 65  thod,.  /* xSave
1fc00 70 6f 69 6e 74 20 20 20 20 2a 2f 20 66 74 73 33  point    */ fts3
1fc10 53 61 76 65 70 6f 69 6e 74 4d 65 74 68 6f 64 2c  SavepointMethod,
1fc20 0a 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 20  .  /* xRelease  
1fc30 20 20 20 20 2a 2f 20 66 74 73 33 52 65 6c 65 61      */ fts3Relea
1fc40 73 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  seMethod,.  /* x
1fc50 52 6f 6c 6c 62 61 63 6b 54 6f 20 20 20 2a 2f 20  RollbackTo   */ 
1fc60 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54 6f 4d 65  fts3RollbackToMe
1fc70 74 68 6f 64 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  thod,.};../*.** 
1fc80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fc90 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20 74   registered as t
1fca0 68 65 20 6d 6f 64 75 6c 65 20 64 65 73 74 72 75  he module destru
1fcb0 63 74 6f 72 20 28 63 61 6c 6c 65 64 20 77 68 65  ctor (called whe
1fcc0 6e 20 61 6e 0a 2a 2a 20 46 54 53 33 20 65 6e 61  n an.** FTS3 ena
1fcd0 62 6c 65 64 20 64 61 74 61 62 61 73 65 20 63 6f  bled database co
1fce0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nnection is clos
1fcf0 65 64 29 2e 20 49 74 20 66 72 65 65 73 20 74 68  ed). It frees th
1fd00 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f  e memory.** allo
1fd10 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 74 6f  cated for the to
1fd20 6b 65 6e 69 7a 65 72 20 68 61 73 68 20 74 61 62  kenizer hash tab
1fd30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
1fd40 69 64 20 68 61 73 68 44 65 73 74 72 6f 79 28 76  id hashDestroy(v
1fd50 6f 69 64 20 2a 70 29 7b 0a 20 20 46 74 73 33 48  oid *p){.  Fts3H
1fd60 61 73 68 20 2a 70 48 61 73 68 20 3d 20 28 46 74  ash *pHash = (Ft
1fd70 73 33 48 61 73 68 20 2a 29 70 3b 0a 20 20 73 71  s3Hash *)p;.  sq
1fd80 6c 69 74 65 33 46 74 73 33 48 61 73 68 43 6c 65  lite3Fts3HashCle
1fd90 61 72 28 70 48 61 73 68 29 3b 0a 20 20 73 71 6c  ar(pHash);.  sql
1fda0 69 74 65 33 5f 66 72 65 65 28 70 48 61 73 68 29  ite3_free(pHash)
1fdb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
1fdc0 74 73 33 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b  ts3 built-in tok
1fdd0 65 6e 69 7a 65 72 73 20 2d 20 22 73 69 6d 70 6c  enizers - "simpl
1fde0 65 22 2c 20 22 70 6f 72 74 65 72 22 20 61 6e 64  e", "porter" and
1fdf0 20 22 69 63 75 22 2d 20 61 72 65 20 0a 2a 2a 20   "icu"- are .** 
1fe00 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 66  implemented in f
1fe10 69 6c 65 73 20 66 74 73 33 5f 74 6f 6b 65 6e 69  iles fts3_tokeni
1fe20 7a 65 72 31 2e 63 2c 20 66 74 73 33 5f 70 6f 72  zer1.c, fts3_por
1fe30 74 65 72 2e 63 20 61 6e 64 20 66 74 73 33 5f 69  ter.c and fts3_i
1fe40 63 75 2e 63 0a 2a 2a 20 72 65 73 70 65 63 74 69  cu.c.** respecti
1fe50 76 65 6c 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  vely. The follow
1fe60 69 6e 67 20 74 68 72 65 65 20 66 6f 72 77 61 72  ing three forwar
1fe70 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61  d declarations a
1fe80 72 65 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 73  re for functions
1fe90 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20 69 6e 20  .** declared in 
1fea0 74 68 65 73 65 20 66 69 6c 65 73 20 75 73 65 64  these files used
1feb0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
1fec0 20 72 65 73 70 65 63 74 69 76 65 20 69 6d 70 6c   respective impl
1fed0 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2a 0a  ementations..**.
1fee0 2a 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  ** Calling sqlit
1fef0 65 33 46 74 73 33 53 69 6d 70 6c 65 54 6f 6b 65  e3Fts3SimpleToke
1ff00 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 29 20 73 65  nizerModule() se
1ff10 74 73 20 74 68 65 20 76 61 6c 75 65 20 70 6f 69  ts the value poi
1ff20 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 74 68  nted.** to by th
1ff30 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 6f  e argument to po
1ff40 69 6e 74 20 74 6f 20 74 68 65 20 22 73 69 6d 70  int to the "simp
1ff50 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  le" tokenizer im
1ff60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a  plementation..**
1ff70 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2f 0a 76   And so on..*/.v
1ff80 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 53  oid sqlite3Fts3S
1ff90 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f  impleTokenizerMo
1ffa0 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f 6b  dule(sqlite3_tok
1ffb0 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f  enizer_module co
1ffc0 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b 0a  nst**ppModule);.
1ffd0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33  void sqlite3Fts3
1ffe0 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 4d  PorterTokenizerM
1fff0 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f  odule(sqlite3_to
20000 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
20010 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b  onst**ppModule);
20020 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20030 44 49 53 41 42 4c 45 5f 46 54 53 33 5f 55 4e 49  DISABLE_FTS3_UNI
20040 43 4f 44 45 0a 76 6f 69 64 20 73 71 6c 69 74 65  CODE.void sqlite
20050 33 46 74 73 33 55 6e 69 63 6f 64 65 54 6f 6b 65  3Fts3UnicodeToke
20060 6e 69 7a 65 72 28 73 71 6c 69 74 65 33 5f 74 6f  nizer(sqlite3_to
20070 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63  kenizer_module c
20080 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b  onst**ppModule);
20090 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
200a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
200b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
200c0 33 49 63 75 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64  3IcuTokenizerMod
200d0 75 6c 65 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65  ule(sqlite3_toke
200e0 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e  nizer_module con
200f0 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29 3b 0a 23  st**ppModule);.#
20100 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  endif../*.** Ini
20110 74 69 61 6c 69 7a 65 20 74 68 65 20 66 74 73 33  tialize the fts3
20120 20 65 78 74 65 6e 73 69 6f 6e 2e 20 49 66 20 74   extension. If t
20130 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 69 73  his extension is
20140 20 62 75 69 6c 74 20 61 73 20 70 61 72 74 0a 2a   built as part.*
20150 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 20  * of the sqlite 
20160 6c 69 62 72 61 72 79 2c 20 74 68 65 6e 20 74 68  library, then th
20170 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20180 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62  alled directly b
20190 79 0a 2a 2a 20 53 51 4c 69 74 65 2e 20 49 66 20  y.** SQLite. If 
201a0 66 74 73 33 20 69 73 20 62 75 69 6c 74 20 61 73  fts3 is built as
201b0 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 6c   a dynamically l
201c0 6f 61 64 61 62 6c 65 20 65 78 74 65 6e 73 69 6f  oadable extensio
201d0 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
201e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
201f0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 74   the sqlite3_ext
20200 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 29 20 65 6e  ension_init() en
20210 74 72 79 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  try point..*/.in
20220 74 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69  t sqlite3Fts3Ini
20230 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
20240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20250 45 5f 4f 4b 3b 0a 20 20 46 74 73 33 48 61 73 68  E_OK;.  Fts3Hash
20260 20 2a 70 48 61 73 68 20 3d 20 30 3b 0a 20 20 63   *pHash = 0;.  c
20270 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b  onst sqlite3_tok
20280 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 70  enizer_module *p
20290 53 69 6d 70 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  Simple = 0;.  co
202a0 6e 73 74 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65  nst sqlite3_toke
202b0 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 2a 70 50  nizer_module *pP
202c0 6f 72 74 65 72 20 3d 20 30 3b 0a 23 69 66 6e 64  orter = 0;.#ifnd
202d0 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
202e0 45 5f 46 54 53 33 5f 55 4e 49 43 4f 44 45 0a 20  E_FTS3_UNICODE. 
202f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
20300 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
20310 2a 70 55 6e 69 63 6f 64 65 20 3d 20 30 3b 0a 23  *pUnicode = 0;.#
20320 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
20330 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
20340 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
20350 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
20360 20 2a 70 49 63 75 20 3d 20 30 3b 0a 20 20 73 71   *pIcu = 0;.  sq
20370 6c 69 74 65 33 46 74 73 33 49 63 75 54 6f 6b 65  lite3Fts3IcuToke
20380 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 26 70 49 63  nizerModule(&pIc
20390 75 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  u);.#endif..#ifn
203a0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
203b0 4c 45 5f 46 54 53 33 5f 55 4e 49 43 4f 44 45 0a  LE_FTS3_UNICODE.
203c0 20 20 73 71 6c 69 74 65 33 46 74 73 33 55 6e 69    sqlite3Fts3Uni
203d0 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 72 28 26 70  codeTokenizer(&p
203e0 55 6e 69 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  Unicode);.#endif
203f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20400 54 45 53 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  TEST.  rc = sqli
20410 74 65 33 46 74 73 33 49 6e 69 74 54 65 72 6d 28  te3Fts3InitTerm(
20420 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  db);.  if( rc!=S
20430 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
20440 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
20450 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
20460 49 6e 69 74 41 75 78 28 64 62 29 3b 0a 20 20 69  InitAux(db);.  i
20470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20480 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
20490 20 73 71 6c 69 74 65 33 46 74 73 33 53 69 6d 70   sqlite3Fts3Simp
204a0 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c  leTokenizerModul
204b0 65 28 26 70 53 69 6d 70 6c 65 29 3b 0a 20 20 73  e(&pSimple);.  s
204c0 71 6c 69 74 65 33 46 74 73 33 50 6f 72 74 65 72  qlite3Fts3Porter
204d0 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28  TokenizerModule(
204e0 26 70 50 6f 72 74 65 72 29 3b 0a 0a 20 20 2f 2a  &pPorter);..  /*
204f0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
20500 69 74 69 61 6c 69 7a 65 20 74 68 65 20 68 61 73  itialize the has
20510 68 2d 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  h-table used to 
20520 73 74 6f 72 65 20 74 6f 6b 65 6e 69 7a 65 72 73  store tokenizers
20530 2e 20 2a 2f 0a 20 20 70 48 61 73 68 20 3d 20 73  . */.  pHash = s
20540 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
20550 7a 65 6f 66 28 46 74 73 33 48 61 73 68 29 29 3b  zeof(Fts3Hash));
20560 0a 20 20 69 66 28 20 21 70 48 61 73 68 20 29 7b  .  if( !pHash ){
20570 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20580 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
20590 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33  .    sqlite3Fts3
205a0 48 61 73 68 49 6e 69 74 28 70 48 61 73 68 2c 20  HashInit(pHash, 
205b0 46 54 53 33 5f 48 41 53 48 5f 53 54 52 49 4e 47  FTS3_HASH_STRING
205c0 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
205d0 4c 6f 61 64 20 74 68 65 20 62 75 69 6c 74 2d 69  Load the built-i
205e0 6e 20 74 6f 6b 65 6e 69 7a 65 72 73 20 69 6e 74  n tokenizers int
205f0 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
20600 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
20610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
20620 66 28 20 73 71 6c 69 74 65 33 46 74 73 33 48 61  f( sqlite3Fts3Ha
20630 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20  shInsert(pHash, 
20640 22 73 69 6d 70 6c 65 22 2c 20 37 2c 20 28 76 6f  "simple", 7, (vo
20650 69 64 20 2a 29 70 53 69 6d 70 6c 65 29 0a 20 20  id *)pSimple).  
20660 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 46 74 73     || sqlite3Fts
20670 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
20680 68 2c 20 22 70 6f 72 74 65 72 22 2c 20 37 2c 20  h, "porter", 7, 
20690 28 76 6f 69 64 20 2a 29 70 50 6f 72 74 65 72 29  (void *)pPorter)
206a0 20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   ..#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 20 20 20 7c 7c 20 73  NICODE.     || s
206d0 71 6c 69 74 65 33 46 74 73 33 48 61 73 68 49 6e  qlite3Fts3HashIn
206e0 73 65 72 74 28 70 48 61 73 68 2c 20 22 75 6e 69  sert(pHash, "uni
206f0 63 6f 64 65 36 31 22 2c 20 31 30 2c 20 28 76 6f  code61", 10, (vo
20700 69 64 20 2a 29 70 55 6e 69 63 6f 64 65 29 20 0a  id *)pUnicode) .
20710 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
20720 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
20730 20 20 20 20 20 7c 7c 20 28 70 49 63 75 20 26 26       || (pIcu &&
20740 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68   sqlite3Fts3Hash
20750 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 22 69  Insert(pHash, "i
20760 63 75 22 2c 20 34 2c 20 28 76 6f 69 64 20 2a 29  cu", 4, (void *)
20770 70 49 63 75 29 29 0a 23 65 6e 64 69 66 0a 20 20  pIcu)).#endif.  
20780 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
20790 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
207a0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
207b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
207c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
207d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
207e0 74 65 33 46 74 73 33 45 78 70 72 49 6e 69 74 54  te3Fts3ExprInitT
207f0 65 73 74 49 6e 74 65 72 66 61 63 65 28 64 62 29  estInterface(db)
20800 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20810 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 76 69  /* Create the vi
20820 72 74 75 61 6c 20 74 61 62 6c 65 20 77 72 61 70  rtual table wrap
20830 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20 68  per around the h
20840 61 73 68 2d 74 61 62 6c 65 20 61 6e 64 20 6f 76  ash-table and ov
20850 65 72 6c 6f 61 64 20 0a 20 20 2a 2a 20 74 68 65  erload .  ** the
20860 20 74 77 6f 20 73 63 61 6c 61 72 20 66 75 6e 63   two scalar func
20870 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69  tions. If this i
20880 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  s successful, re
20890 67 69 73 74 65 72 20 74 68 65 0a 20 20 2a 2a 20  gister the.  ** 
208a0 6d 6f 64 75 6c 65 20 77 69 74 68 20 73 71 6c 69  module with sqli
208b0 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  te..  */.  if( S
208c0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 0a 20 20  QLITE_OK==rc .  
208d0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
208e0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
208f0 49 6e 69 74 48 61 73 68 54 61 62 6c 65 28 64 62  InitHashTable(db
20900 2c 20 70 48 61 73 68 2c 20 22 66 74 73 33 5f 74  , pHash, "fts3_t
20910 6f 6b 65 6e 69 7a 65 72 22 29 29 0a 20 20 20 26  okenizer")).   &
20920 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
20930 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c   = sqlite3_overl
20940 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  oad_function(db,
20950 20 22 73 6e 69 70 70 65 74 22 2c 20 2d 31 29 29   "snippet", -1))
20960 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
20970 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ==(rc = sqlite3_
20980 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
20990 6e 28 64 62 2c 20 22 6f 66 66 73 65 74 73 22 2c  n(db, "offsets",
209a0 20 31 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54   1)).   && SQLIT
209b0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
209c0 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
209d0 63 74 69 6f 6e 28 64 62 2c 20 22 6d 61 74 63 68  ction(db, "match
209e0 69 6e 66 6f 22 2c 20 31 29 29 0a 20 20 20 26 26  info", 1)).   &&
209f0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
20a00 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  = sqlite3_overlo
20a10 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ad_function(db, 
20a20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 32 29 29  "matchinfo", 2))
20a30 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
20a40 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ==(rc = sqlite3_
20a50 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
20a60 6e 28 64 62 2c 20 22 6f 70 74 69 6d 69 7a 65 22  n(db, "optimize"
20a70 2c 20 31 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 1)).  ){.    r
20a80 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
20a90 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 0a 20 20  te_module_v2(.  
20aa0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 33 22        db, "fts3"
20ab0 2c 20 26 66 74 73 33 4d 6f 64 75 6c 65 2c 20 28  , &fts3Module, (
20ac0 76 6f 69 64 20 2a 29 70 48 61 73 68 2c 20 68 61  void *)pHash, ha
20ad0 73 68 44 65 73 74 72 6f 79 0a 20 20 20 20 29 3b  shDestroy.    );
20ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20b00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
20b10 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28 0a 20  ate_module_v2(. 
20b20 20 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74           db, "ft
20b30 73 34 22 2c 20 26 66 74 73 33 4d 6f 64 75 6c 65  s4", &fts3Module
20b40 2c 20 28 76 6f 69 64 20 2a 29 70 48 61 73 68 2c  , (void *)pHash,
20b50 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
20b60 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
20b90 33 49 6e 69 74 54 6f 6b 28 64 62 2c 20 28 76 6f  3InitTok(db, (vo
20ba0 69 64 20 2a 29 70 48 61 73 68 29 3b 0a 20 20 20  id *)pHash);.   
20bb0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
20bc0 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6e 20  ;.  }...  /* An 
20bd0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
20be0 65 64 2e 20 44 65 6c 65 74 65 20 74 68 65 20 68  ed. Delete the h
20bf0 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72 65  ash table and re
20c00 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
20c10 6f 64 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ode. */.  assert
20c20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20c30 29 3b 0a 20 20 69 66 28 20 70 48 61 73 68 20 29  );.  if( pHash )
20c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
20c50 33 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68  3HashClear(pHash
20c60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20c70 72 65 65 28 70 48 61 73 68 29 3b 0a 20 20 7d 0a  ree(pHash);.  }.
20c80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20c90 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
20ca0 6e 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  n Fts3MultiSegRe
20cb0 61 64 65 72 20 66 6f 72 20 65 61 63 68 20 74 6f  ader for each to
20cc0 6b 65 6e 20 69 6e 20 74 68 65 20 65 78 70 72 65  ken in the expre
20cd0 73 73 69 6f 6e 20 68 65 61 64 65 64 0a 2a 2a 20  ssion headed.** 
20ce0 62 79 20 70 45 78 70 72 2e 20 0a 2a 2a 0a 2a 2a  by pExpr. .**.**
20cf0 20 41 6e 20 46 74 73 33 53 65 67 52 65 61 64 65   An Fts3SegReade
20d00 72 20 6f 62 6a 65 63 74 20 69 73 20 61 20 63 75  r object is a cu
20d10 72 73 6f 72 20 74 68 61 74 20 63 61 6e 20 73 65  rsor that can se
20d20 65 6b 20 6f 72 20 73 63 61 6e 20 61 20 72 61 6e  ek or scan a ran
20d30 67 65 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73  ge of.** entries
20d40 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c 65   within a single
20d50 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e   segment b-tree.
20d60 20 41 6e 20 46 74 73 33 4d 75 6c 74 69 53 65 67   An Fts3MultiSeg
20d70 52 65 61 64 65 72 20 75 73 65 73 20 6d 75 6c 74  Reader uses mult
20d80 69 70 6c 65 0a 2a 2a 20 46 74 73 33 53 65 67 52  iple.** Fts3SegR
20d90 65 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 6e  eader objects in
20da0 74 65 72 6e 61 6c 6c 79 20 74 6f 20 70 72 6f 76  ternally to prov
20db0 69 64 65 20 61 6e 20 69 6e 74 65 72 66 61 63 65  ide an interface
20dc0 20 74 6f 20 73 65 65 6b 20 6f 72 20 73 63 61 6e   to seek or scan
20dd0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 75  .** within the u
20de0 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 65 67 6d  nion of all segm
20df0 65 6e 74 73 20 6f 66 20 61 20 62 2d 74 72 65 65  ents of a b-tree
20e00 2e 20 48 65 6e 63 65 20 74 68 65 20 6e 61 6d 65  . Hence the name
20e10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61  ..**.** If the a
20e20 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 4d 75 6c  llocated Fts3Mul
20e30 74 69 53 65 67 52 65 61 64 65 72 20 6a 75 73 74  tiSegReader just
20e40 20 73 65 65 6b 73 20 74 6f 20 61 20 73 69 6e 67   seeks to a sing
20e50 6c 65 20 65 6e 74 72 79 20 69 6e 20 61 0a 2a 2a  le entry in a.**
20e60 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
20e70 28 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20  (if the term is 
20e80 6e 6f 74 20 61 20 70 72 65 66 69 78 20 6f 72 20  not a prefix or 
20e90 69 74 20 69 73 20 61 20 70 72 65 66 69 78 20 66  it is a prefix f
20ea0 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 72  or which.** ther
20eb0 65 20 65 78 69 73 74 73 20 70 72 65 66 69 78 20  e exists prefix 
20ec0 62 2d 74 72 65 65 20 6f 66 20 74 68 65 20 72 69  b-tree of the ri
20ed0 67 68 74 20 6c 65 6e 67 74 68 29 20 74 68 65 6e  ght length) then
20ee0 20 69 74 20 6d 61 79 20 62 65 20 74 72 61 76 65   it may be trave
20ef0 72 73 65 64 0a 2a 2a 20 61 6e 64 20 6d 65 72 67  rsed.** and merg
20f00 65 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79  ed incrementally
20f10 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
20f20 68 61 73 20 74 6f 20 62 65 20 6d 65 72 67 65 64  has to be merged
20f30 20 69 6e 74 6f 20 61 6e 20 69 6e 2d 6d 65 6d 6f   into an in-memo
20f40 72 79 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 61  ry .** doclist a
20f50 6e 64 20 74 68 65 6e 20 74 72 61 76 65 72 73 65  nd then traverse
20f60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
20f70 64 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61  d fts3EvalAlloca
20f80 74 65 52 65 61 64 65 72 73 28 0a 20 20 46 74 73  teReaders(.  Fts
20f90 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  3Cursor *pCsr,  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20fb0 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e 64 6c  FTS cursor handl
20fc0 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  e */.  Fts3Expr 
20fd0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
20fe0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
20ff0 74 65 20 72 65 61 64 65 72 73 20 66 6f 72 20 74  te readers for t
21000 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
21010 2f 0a 20 20 69 6e 74 20 2a 70 6e 54 6f 6b 65 6e  /.  int *pnToken
21020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21030 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
21040 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  l number of toke
21050 6e 73 20 69 6e 20 70 68 72 61 73 65 2e 20 2a 2f  ns in phrase. */
21060 0a 20 20 69 6e 74 20 2a 70 6e 4f 72 2c 20 20 20  .  int *pnOr,   
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c     /* OUT: Total
21090 20 6e 75 6d 62 65 72 20 6f 66 20 4f 52 20 6e 6f   number of OR no
210a0 64 65 73 20 69 6e 20 65 78 70 72 2e 20 2a 2f 0a  des in expr. */.
210b0 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
210c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210d0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
210e0 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
210f0 69 66 28 20 70 45 78 70 72 20 26 26 20 53 51 4c  if( pExpr && SQL
21100 49 54 45 5f 4f 4b 3d 3d 2a 70 52 63 20 29 7b 0a  ITE_OK==*pRc ){.
21110 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 65      if( pExpr->e
21120 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50  Type==FTSQUERY_P
21130 48 52 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69  HRASE ){.      i
21140 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
21150 6e 54 6f 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e  nToken = pExpr->
21160 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
21170 0a 20 20 20 20 20 20 2a 70 6e 54 6f 6b 65 6e 20  .      *pnToken 
21180 2b 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  += nToken;.     
21190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 6f 6b   for(i=0; i<nTok
211a0 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  en; i++){.      
211b0 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
211c0 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78  n *pToken = &pEx
211d0 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 61 54 6f  pr->pPhrase->aTo
211e0 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ken[i];.        
211f0 69 6e 74 20 72 63 20 3d 20 66 74 73 33 54 65 72  int rc = fts3Ter
21200 6d 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72  mSegReaderCursor
21210 28 70 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20  (pCsr, .        
21220 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70      pToken->z, p
21230 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 54 6f 6b 65 6e  Token->n, pToken
21240 2d 3e 69 73 50 72 65 66 69 78 2c 20 26 70 54 6f  ->isPrefix, &pTo
21250 6b 65 6e 2d 3e 70 53 65 67 63 73 72 0a 20 20 20  ken->pSegcsr.   
21260 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  K ){.          *
21290 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRc = rc;.      
212a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
212b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
212c0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
212d0 72 2d 3e 70 50 68 72 61 73 65 2d 3e 69 44 6f 63  r->pPhrase->iDoc
212e0 6c 69 73 74 54 6f 6b 65 6e 3d 3d 30 20 29 3b 0a  listToken==0 );.
212f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 50 68        pExpr->pPh
21300 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f  rase->iDoclistTo
21310 6b 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  ken = -1;.    }e
21320 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 4f 72  lse{.      *pnOr
21330 20 2b 3d 20 28 70 45 78 70 72 2d 3e 65 54 79 70   += (pExpr->eTyp
21340 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52 29 3b  e==FTSQUERY_OR);
21350 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 41  .      fts3EvalA
21360 6c 6c 6f 63 61 74 65 52 65 61 64 65 72 73 28 70  llocateReaders(p
21370 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  Csr, pExpr->pLef
21380 74 2c 20 70 6e 54 6f 6b 65 6e 2c 20 70 6e 4f 72  t, pnToken, pnOr
21390 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 66 74  , pRc);.      ft
213a0 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65 52 65  s3EvalAllocateRe
213b0 61 64 65 72 73 28 70 43 73 72 2c 20 70 45 78 70  aders(pCsr, pExp
213c0 72 2d 3e 70 52 69 67 68 74 2c 20 70 6e 54 6f 6b  r->pRight, pnTok
213d0 65 6e 2c 20 70 6e 4f 72 2c 20 70 52 63 29 3b 0a  en, pnOr, pRc);.
213e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
213f0 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 4c 69  ** Arguments pLi
21400 73 74 2f 6e 4c 69 73 74 20 63 6f 6e 74 61 69 6e  st/nList contain
21410 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
21420 20 74 6f 6b 65 6e 20 69 54 6f 6b 65 6e 20 6f 66   token iToken of
21430 20 70 68 72 61 73 65 20 70 2e 0a 2a 2a 20 49 74   phrase p..** It
21440 20 69 73 20 6d 65 72 67 65 64 20 69 6e 74 6f 20   is merged into 
21450 74 68 65 20 6d 61 69 6e 20 64 6f 63 6c 69 73 74  the main doclist
21460 20 73 74 6f 72 65 64 20 69 6e 20 70 2d 3e 64 6f   stored in p->do
21470 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 2e  clist.aAll/nAll.
21480 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
21490 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
214a0 74 20 70 4c 69 73 74 20 70 6f 69 6e 74 73 20 74  t pList points t
214b0 6f 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  o a buffer alloc
214c0 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ated using.** sq
214d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20  lite3_malloc(). 
214e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
214f0 6b 65 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  kes responsibili
21500 74 79 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c  ty for eventuall
21510 79 0a 2a 2a 20 66 72 65 65 69 6e 67 20 74 68 65  y.** freeing the
21520 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 53   buffer..**.** S
21530 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
21540 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
21550 75 6c 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ul, or SQLITE_NO
21560 4d 45 4d 20 69 66 20 61 6e 20 65 72 72 6f 72 20  MEM if an error 
21570 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
21580 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 50 68  c int fts3EvalPh
21590 72 61 73 65 4d 65 72 67 65 54 6f 6b 65 6e 28 0a  raseMergeToken(.
215a0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
215b0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
215c0 20 20 2f 2a 20 46 54 53 20 54 61 62 6c 65 20 70    /* FTS Table p
215d0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 46 74 73 33  ointer */.  Fts3
215e0 50 68 72 61 73 65 20 2a 70 2c 20 20 20 20 20 20  Phrase *p,      
215f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
21600 68 72 61 73 65 20 74 6f 20 6d 65 72 67 65 20 70  hrase to merge p
21610 4c 69 73 74 2f 6e 4c 69 73 74 20 69 6e 74 6f 20  List/nList into 
21620 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 6b 65 6e 2c  */.  int iToken,
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 70 4c       /* Token pL
21650 69 73 74 2f 6e 4c 69 73 74 20 63 6f 72 72 65 73  ist/nList corres
21660 70 6f 6e 64 73 20 74 6f 20 2a 2f 0a 20 20 63 68  ponds to */.  ch
21670 61 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ar *pList,      
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21690 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
216a0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ist */.  int nLi
216b0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
216c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
216d0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70  er of bytes in p
216e0 4c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  List */.){.  int
216f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21700 0a 20 20 61 73 73 65 72 74 28 20 69 54 6f 6b 65  .  assert( iToke
21710 6e 21 3d 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f  n!=p->iDoclistTo
21720 6b 65 6e 20 29 3b 0a 0a 20 20 69 66 28 20 70 4c  ken );..  if( pL
21730 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ist==0 ){.    sq
21740 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 64 6f  lite3_free(p->do
21750 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20  clist.aAll);.   
21760 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c   p->doclist.aAll
21770 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 64 6f 63   = 0;.    p->doc
21780 6c 69 73 74 2e 6e 41 6c 6c 20 3d 20 30 3b 0a 20  list.nAll = 0;. 
21790 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70   }..  else if( p
217a0 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3c  ->iDoclistToken<
217b0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c  0 ){.    p->docl
217c0 69 73 74 2e 61 41 6c 6c 20 3d 20 70 4c 69 73 74  ist.aAll = pList
217d0 3b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74  ;.    p->doclist
217e0 2e 6e 41 6c 6c 20 3d 20 6e 4c 69 73 74 3b 0a 20  .nAll = nList;. 
217f0 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70   }..  else if( p
21800 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3d 3d  ->doclist.aAll==
21810 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
21820 5f 66 72 65 65 28 70 4c 69 73 74 29 3b 0a 20 20  _free(pList);.  
21830 7d 0a 0a 20 20 65 6c 73 65 20 7b 0a 20 20 20 20  }..  else {.    
21840 63 68 61 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  char *pLeft;.   
21850 20 63 68 61 72 20 2a 70 52 69 67 68 74 3b 0a 20   char *pRight;. 
21860 20 20 20 69 6e 74 20 6e 4c 65 66 74 3b 0a 20 20     int nLeft;.  
21870 20 20 69 6e 74 20 6e 52 69 67 68 74 3b 0a 20 20    int nRight;.  
21880 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 0a 20 20    int nDiff;..  
21890 20 20 69 66 28 20 70 2d 3e 69 44 6f 63 6c 69 73    if( p->iDoclis
218a0 74 54 6f 6b 65 6e 3c 69 54 6f 6b 65 6e 20 29 7b  tToken<iToken ){
218b0 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70  .      pLeft = p
218c0 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3b 0a  ->doclist.aAll;.
218d0 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20 70 2d        nLeft = p-
218e0 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 3b 0a 20  >doclist.nAll;. 
218f0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
21900 69 73 74 3b 0a 20 20 20 20 20 20 6e 52 69 67 68  ist;.      nRigh
21910 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
21920 20 6e 44 69 66 66 20 3d 20 69 54 6f 6b 65 6e 20   nDiff = iToken 
21930 2d 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  - p->iDoclistTok
21940 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  en;.    }else{. 
21950 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 2d       pRight = p-
21960 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 3b 0a 20  >doclist.aAll;. 
21970 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 70 2d       nRight = p-
21980 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 3b 0a 20  >doclist.nAll;. 
21990 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4c 69       pLeft = pLi
219a0 73 74 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74 20  st;.      nLeft 
219b0 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e  = nList;.      n
219c0 44 69 66 66 20 3d 20 70 2d 3e 69 44 6f 63 6c 69  Diff = p->iDocli
219d0 73 74 54 6f 6b 65 6e 20 2d 20 69 54 6f 6b 65 6e  stToken - iToken
219e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
219f0 3d 20 66 74 73 33 44 6f 63 6c 69 73 74 50 68 72  = fts3DoclistPhr
21a00 61 73 65 4d 65 72 67 65 28 0a 20 20 20 20 20 20  aseMerge(.      
21a10 20 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78    pTab->bDescIdx
21a20 2c 20 6e 44 69 66 66 2c 20 70 4c 65 66 74 2c 20  , nDiff, pLeft, 
21a30 6e 4c 65 66 74 2c 20 26 70 52 69 67 68 74 2c 20  nLeft, &pRight, 
21a40 26 6e 52 69 67 68 74 0a 20 20 20 20 29 3b 0a 20  &nRight.    );. 
21a50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21a60 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 2d 3e 64  pLeft);.    p->d
21a70 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 3d 20 70 52  oclist.aAll = pR
21a80 69 67 68 74 3b 0a 20 20 20 20 70 2d 3e 64 6f 63  ight;.    p->doc
21a90 6c 69 73 74 2e 6e 41 6c 6c 20 3d 20 6e 52 69 67  list.nAll = nRig
21aa0 68 74 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  ht;.  }..  if( i
21ab0 54 6f 6b 65 6e 3e 70 2d 3e 69 44 6f 63 6c 69 73  Token>p->iDoclis
21ac0 74 54 6f 6b 65 6e 20 29 20 70 2d 3e 69 44 6f 63  tToken ) p->iDoc
21ad0 6c 69 73 74 54 6f 6b 65 6e 20 3d 20 69 54 6f 6b  listToken = iTok
21ae0 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  en;.  return rc;
21af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
21b00 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 70  he doclist for p
21b10 68 72 61 73 65 20 70 20 69 6e 74 6f 20 70 2d 3e  hrase p into p->
21b20 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c  doclist.aAll/nAl
21b30 6c 2e 20 54 68 65 20 6c 6f 61 64 65 64 20 64 6f  l. The loaded do
21b40 63 6c 69 73 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f  clist.** does no
21b50 74 20 74 61 6b 65 20 64 65 66 65 72 72 65 64 20  t take deferred 
21b60 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 61 63 63 6f  tokens into acco
21b70 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  unt..**.** SQLIT
21b80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21b90 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
21ba0 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  urs, otherwise a
21bb0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
21bc0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
21bd0 6e 74 20 66 74 73 33 45 76 61 6c 50 68 72 61 73  nt fts3EvalPhras
21be0 65 4c 6f 61 64 28 0a 20 20 46 74 73 33 43 75 72  eLoad(.  Fts3Cur
21bf0 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
21c00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
21c10 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f  Cursor handle */
21c20 0a 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70  .  Fts3Phrase *p
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a     /* Phrase obj
21c50 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  ect */.){.  Fts3
21c60 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 46  Table *pTab = (F
21c70 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d  ts3Table *)pCsr-
21c80 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69  >base.pVtab;.  i
21c90 6e 74 20 69 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74  nt iToken;.  int
21ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21cb0 0a 0a 20 20 66 6f 72 28 69 54 6f 6b 65 6e 3d 30  ..  for(iToken=0
21cc0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21cd0 26 26 20 69 54 6f 6b 65 6e 3c 70 2d 3e 6e 54 6f  && iToken<p->nTo
21ce0 6b 65 6e 3b 20 69 54 6f 6b 65 6e 2b 2b 29 7b 0a  ken; iToken++){.
21cf0 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
21d00 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70  ken *pToken = &p
21d10 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b 65 6e 5d  ->aToken[iToken]
21d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
21d30 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3d  oken->pDeferred=
21d40 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 70 53  =0 || pToken->pS
21d50 65 67 63 73 72 3d 3d 30 20 29 3b 0a 0a 20 20 20  egcsr==0 );..   
21d60 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65   if( pToken->pSe
21d70 67 63 73 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  gcsr ){.      in
21d80 74 20 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 20  t nThis = 0;.   
21d90 20 20 20 63 68 61 72 20 2a 70 54 68 69 73 20 3d     char *pThis =
21da0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   0;.      rc = f
21db0 74 73 33 54 65 72 6d 53 65 6c 65 63 74 28 70 54  ts3TermSelect(pT
21dc0 61 62 2c 20 70 54 6f 6b 65 6e 2c 20 70 2d 3e 69  ab, pToken, p->i
21dd0 43 6f 6c 75 6d 6e 2c 20 26 6e 54 68 69 73 2c 20  Column, &nThis, 
21de0 26 70 54 68 69 73 29 3b 0a 20 20 20 20 20 20 69  &pThis);.      i
21df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21e00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21e10 20 66 74 73 33 45 76 61 6c 50 68 72 61 73 65 4d   fts3EvalPhraseM
21e20 65 72 67 65 54 6f 6b 65 6e 28 70 54 61 62 2c 20  ergeToken(pTab, 
21e30 70 2c 20 69 54 6f 6b 65 6e 2c 20 70 54 68 69 73  p, iToken, pThis
21e40 2c 20 6e 54 68 69 73 29 3b 0a 20 20 20 20 20 20  , nThis);.      
21e50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
21e60 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67  rt( pToken->pSeg
21e70 63 73 72 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  csr==0 );.  }.. 
21e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21e90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21ea0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  on is called on 
21eb0 65 61 63 68 20 70 68 72 61 73 65 20 61 66 74 65  each phrase afte
21ec0 72 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  r the position l
21ed0 69 73 74 73 20 66 6f 72 0a 2a 2a 20 61 6e 79 20  ists for.** any 
21ee0 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20  deferred tokens 
21ef0 68 61 76 65 20 62 65 65 6e 20 6c 6f 61 64 65 64  have been loaded
21f00 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 74   into memory. It
21f10 20 75 70 64 61 74 65 73 20 74 68 65 20 70 68 72   updates the phr
21f20 61 73 65 73 0a 2a 2a 20 63 75 72 72 65 6e 74 20  ases.** current 
21f30 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 6f  position list to
21f40 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79 20 74 68   include only th
21f50 6f 73 65 20 70 6f 73 69 74 69 6f 6e 73 20 74 68  ose positions th
21f60 61 74 20 61 72 65 20 72 65 61 6c 6c 79 0a 2a 2a  at are really.**
21f70 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
21f80 65 20 70 68 72 61 73 65 20 28 61 66 74 65 72 20  e phrase (after 
21f90 63 6f 6e 73 69 64 65 72 69 6e 67 20 64 65 66 65  considering defe
21fa0 72 72 65 64 20 74 6f 6b 65 6e 73 29 2e 20 49 66  rred tokens). If
21fb0 20 74 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   this.** means t
21fc0 68 61 74 20 74 68 65 20 70 68 72 61 73 65 20 64  hat the phrase d
21fd0 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69  oes not appear i
21fe0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
21ff0 77 2c 20 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  w, doclist.pList
22000 0a 2a 2a 20 61 6e 64 20 64 6f 63 6c 69 73 74 2e  .** and doclist.
22010 6e 4c 69 73 74 20 61 72 65 20 62 6f 74 68 20 7a  nList are both z
22020 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  eroed..**.** SQL
22030 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22040 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
22050 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73 65  ccurs, otherwise
22060 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
22070 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
22080 20 69 6e 74 20 66 74 73 33 45 76 61 6c 44 65 66   int fts3EvalDef
22090 65 72 72 65 64 50 68 72 61 73 65 28 46 74 73 33  erredPhrase(Fts3
220a0 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 46 74  Cursor *pCsr, Ft
220b0 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
220c0 65 29 7b 0a 20 20 69 6e 74 20 69 54 6f 6b 65 6e  e){.  int iToken
220d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
220e0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
220f0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
22100 20 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 20 2a   phrase tokens *
22110 2f 0a 20 20 63 68 61 72 20 2a 61 50 6f 73 6c 69  /.  char *aPosli
22120 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
22130 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
22140 6c 69 73 74 20 66 6f 72 20 64 65 66 65 72 72 65  list for deferre
22150 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 6e  d tokens */.  in
22160 74 20 6e 50 6f 73 6c 69 73 74 20 3d 20 30 3b 20  t nPoslist = 0; 
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22180 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22190 20 69 6e 20 61 50 6f 73 6c 69 73 74 20 2a 2f 0a   in aPoslist */.
221a0 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 2d 31    int iPrev = -1
221b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
221c0 20 20 2f 2a 20 54 6f 6b 65 6e 20 6e 75 6d 62 65    /* Token numbe
221d0 72 20 6f 66 20 70 72 65 76 69 6f 75 73 20 64 65  r of previous de
221e0 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 2a 2f 0a  ferred token */.
221f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 68 72 61  .  assert( pPhra
22200 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65  se->doclist.bFre
22210 65 4c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 66  eList==0 );..  f
22220 6f 72 28 69 54 6f 6b 65 6e 3d 30 3b 20 69 54 6f  or(iToken=0; iTo
22230 6b 65 6e 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f  ken<pPhrase->nTo
22240 6b 65 6e 3b 20 69 54 6f 6b 65 6e 2b 2b 29 7b 0a  ken; iToken++){.
22250 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
22260 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70  ken *pToken = &p
22270 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
22280 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 46 74 73 33  Token];.    Fts3
22290 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70  DeferredToken *p
222a0 44 65 66 65 72 72 65 64 20 3d 20 70 54 6f 6b 65  Deferred = pToke
222b0 6e 2d 3e 70 44 65 66 65 72 72 65 64 3b 0a 0a 20  n->pDeferred;.. 
222c0 20 20 20 69 66 28 20 70 44 65 66 65 72 72 65 64     if( pDeferred
222d0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
222e0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  pList;.      int
222f0 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e   nList;.      in
22300 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
22310 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 4c  s3DeferredTokenL
22320 69 73 74 28 70 44 65 66 65 72 72 65 64 2c 20 26  ist(pDeferred, &
22330 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
22340 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22350 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
22360 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   rc;..      if( 
22370 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
22380 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22390 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  (aPoslist);.    
223a0 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63      pPhrase->doc
223b0 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a  list.pList = 0;.
223c0 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d          pPhrase-
223d0 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d  >doclist.nList =
223e0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
223f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
22400 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
22410 50 6f 73 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  Poslist==0 ){.  
22420 20 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d        aPoslist =
22430 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   pList;.        
22440 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c 69 73 74  nPoslist = nList
22450 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ;..      }else{.
22460 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 4f          char *aO
22470 75 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ut = pList;.    
22480 20 20 20 20 63 68 61 72 20 2a 70 31 20 3d 20 61      char *p1 = a
22490 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Poslist;.       
224a0 20 63 68 61 72 20 2a 70 32 20 3d 20 61 4f 75 74   char *p2 = aOut
224b0 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
224c0 74 28 20 69 50 72 65 76 3e 3d 30 20 29 3b 0a 20  t( iPrev>=0 );. 
224d0 20 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69         fts3Posli
224e0 73 74 50 68 72 61 73 65 4d 65 72 67 65 28 26 61  stPhraseMerge(&a
224f0 4f 75 74 2c 20 69 54 6f 6b 65 6e 2d 69 50 72 65  Out, iToken-iPre
22500 76 2c 20 30 2c 20 31 2c 20 26 70 31 2c 20 26 70  v, 0, 1, &p1, &p
22510 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
22520 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c 69 73  te3_free(aPoslis
22530 74 29 3b 0a 20 20 20 20 20 20 20 20 61 50 6f 73  t);.        aPos
22540 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  list = pList;.  
22550 20 20 20 20 20 20 6e 50 6f 73 6c 69 73 74 20 3d        nPoslist =
22560 20 28 69 6e 74 29 28 61 4f 75 74 20 2d 20 61 50   (int)(aOut - aP
22570 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
22580 20 69 66 28 20 6e 50 6f 73 6c 69 73 74 3d 3d 30   if( nPoslist==0
22590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
225a0 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c  lite3_free(aPosl
225b0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ist);.          
225c0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
225d0 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  .pList = 0;.    
225e0 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
225f0 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20 30  oclist.nList = 0
22600 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
22610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
22620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22630 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 54        iPrev = iT
22640 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oken;.    }.  }.
22650 0a 20 20 69 66 28 20 69 50 72 65 76 3e 3d 30 20  .  if( iPrev>=0 
22660 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 55  ){.    int nMaxU
22670 6e 64 65 66 65 72 72 65 64 20 3d 20 70 50 68 72  ndeferred = pPhr
22680 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ase->iDoclistTok
22690 65 6e 3b 0a 20 20 20 20 69 66 28 20 6e 4d 61 78  en;.    if( nMax
226a0 55 6e 64 65 66 65 72 72 65 64 3c 30 20 29 7b 0a  Undeferred<0 ){.
226b0 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64        pPhrase->d
226c0 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 61  oclist.pList = a
226d0 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 70  Poslist;.      p
226e0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
226f0 6e 4c 69 73 74 20 3d 20 6e 50 6f 73 6c 69 73 74  nList = nPoslist
22700 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d  ;.      pPhrase-
22710 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 20  >doclist.iDocid 
22720 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3b  = pCsr->iPrevId;
22730 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
22740 64 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73  doclist.bFreeLis
22750 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
22760 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 69 73  {.      int nDis
22770 74 61 6e 63 65 3b 0a 20 20 20 20 20 20 63 68 61  tance;.      cha
22780 72 20 2a 70 31 3b 0a 20 20 20 20 20 20 63 68 61  r *p1;.      cha
22790 72 20 2a 70 32 3b 0a 20 20 20 20 20 20 63 68 61  r *p2;.      cha
227a0 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 20 20 20 20  r *aOut;..      
227b0 69 66 28 20 6e 4d 61 78 55 6e 64 65 66 65 72 72  if( nMaxUndeferr
227c0 65 64 3e 69 50 72 65 76 20 29 7b 0a 20 20 20 20  ed>iPrev ){.    
227d0 20 20 20 20 70 31 20 3d 20 61 50 6f 73 6c 69 73      p1 = aPoslis
227e0 74 3b 0a 20 20 20 20 20 20 20 20 70 32 20 3d 20  t;.        p2 = 
227f0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
22800 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
22810 6e 44 69 73 74 61 6e 63 65 20 3d 20 6e 4d 61 78  nDistance = nMax
22820 55 6e 64 65 66 65 72 72 65 64 20 2d 20 69 50 72  Undeferred - iPr
22830 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ev;.      }else{
22840 0a 20 20 20 20 20 20 20 20 70 31 20 3d 20 70 50  .        p1 = pP
22850 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
22860 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 32  List;.        p2
22870 20 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20   = aPoslist;.   
22880 20 20 20 20 20 6e 44 69 73 74 61 6e 63 65 20 3d       nDistance =
22890 20 69 50 72 65 76 20 2d 20 6e 4d 61 78 55 6e 64   iPrev - nMaxUnd
228a0 65 66 65 72 72 65 64 3b 0a 20 20 20 20 20 20 7d  eferred;.      }
228b0 0a 0a 20 20 20 20 20 20 61 4f 75 74 20 3d 20 28  ..      aOut = (
228c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
228d0 61 6c 6c 6f 63 28 6e 50 6f 73 6c 69 73 74 2b 38  alloc(nPoslist+8
228e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4f  );.      if( !aO
228f0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
22900 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c  lite3_free(aPosl
22910 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ist);.        re
22920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22930 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
22940 20 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d   .      pPhrase-
22950 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d  >doclist.pList =
22960 20 61 4f 75 74 3b 0a 20 20 20 20 20 20 69 66 28   aOut;.      if(
22970 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61   fts3PoslistPhra
22980 73 65 4d 65 72 67 65 28 26 61 4f 75 74 2c 20 6e  seMerge(&aOut, n
22990 44 69 73 74 61 6e 63 65 2c 20 30 2c 20 31 2c 20  Distance, 0, 1, 
229a0 26 70 31 2c 20 26 70 32 29 20 29 7b 0a 20 20 20  &p1, &p2) ){.   
229b0 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f       pPhrase->do
229c0 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 20  clist.bFreeList 
229d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 68  = 1;.        pPh
229e0 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c  rase->doclist.nL
229f0 69 73 74 20 3d 20 28 69 6e 74 29 28 61 4f 75 74  ist = (int)(aOut
22a00 20 2d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   - pPhrase->docl
22a10 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ist.pList);.    
22a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22a30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f   sqlite3_free(aO
22a40 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 50 68  ut);.        pPh
22a50 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
22a60 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
22a70 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
22a80 74 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t.nList = 0;.   
22a90 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
22aa0 65 33 5f 66 72 65 65 28 61 50 6f 73 6c 69 73 74  e3_free(aPoslist
22ab0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
22ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  ;.}../*.** Maxim
22ae0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  um number of tok
22af0 65 6e 73 20 61 20 70 68 72 61 73 65 20 6d 61 79  ens a phrase may
22b00 20 68 61 76 65 20 74 6f 20 62 65 20 63 6f 6e 73   have to be cons
22b10 69 64 65 72 65 64 20 66 6f 72 20 74 68 65 0a 2a  idered for the.*
22b20 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 64 6f  * incremental do
22b30 63 6c 69 73 74 73 20 73 74 72 61 74 65 67 79 2e  clists strategy.
22b40 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
22b50 49 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45  INCR_PHRASE_TOKE
22b60 4e 53 20 34 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  NS 4../*.** This
22b70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22b80 6c 65 64 20 66 6f 72 20 65 61 63 68 20 46 74 73  led for each Fts
22b90 33 50 68 72 61 73 65 20 69 6e 20 61 20 66 75 6c  3Phrase in a ful
22ba0 6c 2d 74 65 78 74 20 71 75 65 72 79 20 0a 2a 2a  l-text query .**
22bb0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
22bc0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
22bd0 63 68 61 6e 69 73 6d 20 66 6f 72 20 72 65 74 75  chanism for retu
22be0 72 6e 69 6e 67 20 72 6f 77 73 2e 20 4f 6e 63 65  rning rows. Once
22bf0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
22c00 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
22c10 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  d successfully o
22c20 6e 20 61 6e 20 46 74 73 33 50 68 72 61 73 65 2c  n an Fts3Phrase,
22c30 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 75 73   it may be.** us
22c40 65 64 20 77 69 74 68 20 66 74 73 33 45 76 61 6c  ed with fts3Eval
22c50 50 68 72 61 73 65 4e 65 78 74 28 29 20 74 6f 20  PhraseNext() to 
22c60 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
22c70 74 68 65 20 6d 61 74 63 68 69 6e 67 20 64 6f 63  the matching doc
22c80 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ids..**.** If pa
22c90 72 61 6d 65 74 65 72 20 62 4f 70 74 4f 6b 20 69  rameter bOptOk i
22ca0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
22cb0 20 70 68 72 61 73 65 20 6d 61 79 20 28 6f 72 20   phrase may (or 
22cc0 6d 61 79 20 6e 6f 74 29 20 75 73 65 20 74 68 65  may not) use the
22cd0 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  .** incremental 
22ce0 6c 6f 61 64 69 6e 67 20 73 74 72 61 74 65 67 79  loading strategy
22cf0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
22d00 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
22d10 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a  is loaded into.*
22d20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  * memory within 
22d30 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  this call..**.**
22d40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
22d50 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
22d60 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
22d70 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
22d80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
22d90 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
22da0 6c 50 68 72 61 73 65 53 74 61 72 74 28 46 74 73  lPhraseStart(Fts
22db0 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69  3Cursor *pCsr, i
22dc0 6e 74 20 62 4f 70 74 4f 6b 2c 20 46 74 73 33 50  nt bOptOk, Fts3P
22dd0 68 72 61 73 65 20 2a 70 29 7b 0a 20 20 46 74 73  hrase *p){.  Fts
22de0 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28  3Table *pTab = (
22df0 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72  Fts3Table *)pCsr
22e00 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20  ->base.pVtab;.  
22e10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22e20 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
22e30 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  /* Error code */
22e40 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
22e50 44 65 74 65 72 6d 69 6e 65 20 69 66 20 64 6f 63  Determine if doc
22e60 6c 69 73 74 73 20 6d 61 79 20 62 65 20 6c 6f 61  lists may be loa
22e70 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 69 6e  ded from disk in
22e80 63 72 65 6d 65 6e 74 61 6c 6c 79 2e 20 54 68 69  crementally. Thi
22e90 73 20 69 73 0a 20 20 2a 2a 20 70 6f 73 73 69 62  s is.  ** possib
22ea0 6c 65 20 69 66 20 74 68 65 20 62 4f 70 74 4f 6b  le if the bOptOk
22eb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
22ec0 65 2c 20 74 68 65 20 46 54 53 20 64 6f 63 6c 69  e, the FTS docli
22ed0 73 74 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  sts will be.  **
22ee0 20 73 63 61 6e 6e 65 64 20 69 6e 20 66 6f 72 77   scanned in forw
22ef0 61 72 64 20 6f 72 64 65 72 2c 20 61 6e 64 20 74  ard order, and t
22f00 68 65 20 70 68 72 61 73 65 20 63 6f 6e 73 69 73  he phrase consis
22f10 74 73 20 6f 66 20 0a 20 20 2a 2a 20 4d 41 58 5f  ts of .  ** MAX_
22f20 49 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45  INCR_PHRASE_TOKE
22f30 4e 53 20 6f 72 20 66 65 77 65 72 20 74 6f 6b 65  NS or fewer toke
22f40 6e 73 2c 20 6e 6f 6e 65 20 6f 66 20 77 68 69 63  ns, none of whic
22f50 68 20 61 72 65 20 61 72 65 20 22 5e 66 69 72 73  h are are "^firs
22f60 74 22 0a 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 6f  t".  ** tokens o
22f70 72 20 70 72 65 66 69 78 20 74 6f 6b 65 6e 73 20  r prefix tokens 
22f80 74 68 61 74 20 63 61 6e 6e 6f 74 20 75 73 65 20  that cannot use 
22f90 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78 2e 20  a prefix-index. 
22fa0 20 2a 2f 0a 20 20 69 6e 74 20 62 48 61 76 65 49   */.  int bHaveI
22fb0 6e 63 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62  ncr = 0;.  int b
22fc0 49 6e 63 72 4f 6b 20 3d 20 28 62 4f 70 74 4f 6b  IncrOk = (bOptOk
22fd0 20 0a 20 20 20 26 26 20 70 43 73 72 2d 3e 62 44   .   && pCsr->bD
22fe0 65 73 63 3d 3d 70 54 61 62 2d 3e 62 44 65 73 63  esc==pTab->bDesc
22ff0 49 64 78 20 0a 20 20 20 26 26 20 70 2d 3e 6e 54  Idx .   && p->nT
23000 6f 6b 65 6e 3c 3d 4d 41 58 5f 49 4e 43 52 5f 50  oken<=MAX_INCR_P
23010 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20 26 26 20  HRASE_TOKENS && 
23020 70 2d 3e 6e 54 6f 6b 65 6e 3e 30 0a 23 69 66 64  p->nToken>0.#ifd
23030 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
23040 20 20 26 26 20 70 54 61 62 2d 3e 62 4e 6f 49 6e    && pTab->bNoIn
23050 63 72 44 6f 63 6c 69 73 74 3d 3d 30 0a 23 65 6e  crDoclist==0.#en
23060 64 69 66 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69  dif.  );.  for(i
23070 3d 30 3b 20 62 49 6e 63 72 4f 6b 3d 3d 31 20 26  =0; bIncrOk==1 &
23080 26 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b 20 69  & i<p->nToken; i
23090 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 50 68 72  ++){.    Fts3Phr
230a0 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  aseToken *pToken
230b0 20 3d 20 26 70 2d 3e 61 54 6f 6b 65 6e 5b 69 5d   = &p->aToken[i]
230c0 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e  ;.    if( pToken
230d0 2d 3e 62 46 69 72 73 74 20 7c 7c 20 28 70 54 6f  ->bFirst || (pTo
230e0 6b 65 6e 2d 3e 70 53 65 67 63 73 72 21 3d 30 20  ken->pSegcsr!=0 
230f0 26 26 20 21 70 54 6f 6b 65 6e 2d 3e 70 53 65 67  && !pToken->pSeg
23100 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 29 20 29 7b  csr->bLookup) ){
23110 0a 20 20 20 20 20 20 62 49 6e 63 72 4f 6b 20 3d  .      bIncrOk =
23120 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
23130 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  ( pToken->pSegcs
23140 72 20 29 20 62 48 61 76 65 49 6e 63 72 20 3d 20  r ) bHaveIncr = 
23150 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 49  1;.  }..  if( bI
23160 6e 63 72 4f 6b 20 26 26 20 62 48 61 76 65 49 6e  ncrOk && bHaveIn
23170 63 72 20 29 7b 0a 20 20 20 20 2f 2a 20 55 73 65  cr ){.    /* Use
23180 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
23190 20 61 70 70 72 6f 61 63 68 2e 20 2a 2f 0a 20 20   approach. */.  
231a0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 28 70 2d    int iCol = (p-
231b0 3e 69 43 6f 6c 75 6d 6e 20 3e 3d 20 70 54 61 62  >iColumn >= pTab
231c0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d 31 20 3a  ->nColumn ? -1 :
231d0 20 70 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20   p->iColumn);.  
231e0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
231f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
23200 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20  >nToken; i++){. 
23210 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54       Fts3PhraseT
23220 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
23230 70 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20  p->aToken[i];.  
23240 20 20 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67      Fts3MultiSeg
23250 52 65 61 64 65 72 20 2a 70 53 65 67 63 73 72 20  Reader *pSegcsr 
23260 3d 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  = pToken->pSegcs
23270 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  r;.      if( pSe
23280 67 63 73 72 20 29 7b 0a 20 20 20 20 20 20 20 20  gcsr ){.        
23290 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
232a0 4d 73 72 49 6e 63 72 53 74 61 72 74 28 70 54 61  MsrIncrStart(pTa
232b0 62 2c 20 70 53 65 67 63 73 72 2c 20 69 43 6f 6c  b, pSegcsr, iCol
232c0 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
232d0 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 7d  ken->n);.      }
232e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 62 49  .    }.    p->bI
232f0 6e 63 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ncr = 1;.  }else
23300 7b 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  {.    /* Load th
23310 65 20 66 75 6c 6c 20 64 6f 63 6c 69 73 74 20 66  e full doclist f
23320 6f 72 20 74 68 65 20 70 68 72 61 73 65 20 69 6e  or the phrase in
23330 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
23340 20 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 50    rc = fts3EvalP
23350 68 72 61 73 65 4c 6f 61 64 28 70 43 73 72 2c 20  hraseLoad(pCsr, 
23360 70 29 3b 0a 20 20 20 20 70 2d 3e 62 49 6e 63 72  p);.    p->bIncr
23370 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 0;.  }..  ass
23380 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23390 4f 4b 20 7c 7c 20 70 2d 3e 6e 54 6f 6b 65 6e 3c  OK || p->nToken<
233a0 31 20 7c 7c 20 70 2d 3e 61 54 6f 6b 65 6e 5b 30  1 || p->aToken[0
233b0 5d 2e 70 53 65 67 63 73 72 3d 3d 30 20 7c 7c 20  ].pSegcsr==0 || 
233c0 70 2d 3e 62 49 6e 63 72 20 29 3b 0a 20 20 72 65  p->bIncr );.  re
233d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
233e0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
233f0 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
23400 74 65 20 62 61 63 6b 77 61 72 64 73 20 28 66 72  te backwards (fr
23410 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f 20 73 74  om the end to st
23420 61 72 74 29 20 0a 2a 2a 20 74 68 72 6f 75 67 68  art) .** through
23430 20 64 6f 63 6c 69 73 74 73 2e 20 49 74 20 69 73   doclists. It is
23440 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6d 6f   used by this mo
23450 64 75 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20  dule to iterate 
23460 74 68 72 6f 75 67 68 20 70 68 72 61 73 65 0a 2a  through phrase.*
23470 2a 20 64 6f 63 6c 69 73 74 73 20 69 6e 20 72 65  * doclists in re
23480 76 65 72 73 65 20 61 6e 64 20 62 79 20 74 68 65  verse and by the
23490 20 66 74 73 33 5f 77 72 69 74 65 2e 63 20 6d 6f   fts3_write.c mo
234a0 64 75 6c 65 20 74 6f 20 69 74 65 72 61 74 65 20  dule to iterate 
234b0 74 68 72 6f 75 67 68 0a 2a 2a 20 70 65 6e 64 69  through.** pendi
234c0 6e 67 2d 74 65 72 6d 73 20 6c 69 73 74 73 20 77  ng-terms lists w
234d0 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 64  hen writing to d
234e0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 22 6f  atabases with "o
234f0 72 64 65 72 3d 64 65 73 63 22 2e 0a 2a 2a 0a 2a  rder=desc"..**.*
23500 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  * The doclist ma
23510 79 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 61  y be sorted in a
23520 73 63 65 6e 64 69 6e 67 20 28 70 61 72 61 6d 65  scending (parame
23530 74 65 72 20 62 44 65 73 63 49 64 78 3d 3d 30 29  ter bDescIdx==0)
23540 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69   or .** descendi
23550 6e 67 20 28 70 61 72 61 6d 65 74 65 72 20 62 44  ng (parameter bD
23560 65 73 63 49 64 78 3d 3d 31 29 20 6f 72 64 65 72  escIdx==1) order
23570 20 6f 66 20 64 6f 63 69 64 2e 20 52 65 67 61 72   of docid. Regar
23580 64 6c 65 73 73 2c 20 74 68 69 73 0a 2a 2a 20 66  dless, this.** f
23590 75 6e 63 74 69 6f 6e 20 69 74 65 72 61 74 65 73  unction iterates
235a0 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
235b0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 6f 20   the doclist to 
235c0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a  the beginning..*
235d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
235e0 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 0a 20  s3DoclistPrev(. 
235f0 20 69 6e 74 20 62 44 65 73 63 49 64 78 2c 20 20   int bDescIdx,  
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
23620 64 6f 63 6c 69 73 74 20 69 73 20 64 65 73 63 20  doclist is desc 
23630 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c  */.  char *aDocl
23640 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
23650 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23660 74 6f 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  to entire doclis
23670 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c  t */.  int nDocl
23680 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
23690 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
236a0 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 6e 20   of aDoclist in 
236b0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
236c0 2a 2a 70 70 49 74 65 72 2c 20 20 20 20 20 20 20  **ppIter,       
236d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
236e0 2f 4f 55 54 3a 20 49 74 65 72 61 74 6f 72 20 70  /OUT: Iterator p
236f0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69  ointer */.  sqli
23700 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f 63  te3_int64 *piDoc
23710 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  id,         /* I
23720 4e 2f 4f 55 54 3a 20 44 6f 63 69 64 20 70 6f 69  N/OUT: Docid poi
23730 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  nter */.  int *p
23740 6e 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  nList,          
23750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
23760 3a 20 4c 69 73 74 20 6c 65 6e 67 74 68 20 70 6f  : List length po
23770 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
23780 62 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20  bEof            
23790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
237a0 54 3a 20 45 6e 64 2d 6f 66 2d 66 69 6c 65 20 66  T: End-of-file f
237b0 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  lag */.){.  char
237c0 20 2a 70 20 3d 20 2a 70 70 49 74 65 72 3b 0a 0a   *p = *ppIter;..
237d0 20 20 61 73 73 65 72 74 28 20 6e 44 6f 63 6c 69    assert( nDocli
237e0 73 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  st>0 );.  assert
237f0 28 20 2a 70 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  ( *pbEof==0 );. 
23800 20 61 73 73 65 72 74 28 20 70 20 7c 7c 20 2a 70   assert( p || *p
23810 69 44 6f 63 69 64 3d 3d 30 20 29 3b 0a 20 20 61  iDocid==0 );.  a
23820 73 73 65 72 74 28 20 21 70 20 7c 7c 20 28 70 3e  ssert( !p || (p>
23830 61 44 6f 63 6c 69 73 74 20 26 26 20 70 3c 26 61  aDoclist && p<&a
23840 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74  Doclist[nDoclist
23850 5d 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 3d 3d  ]) );..  if( p==
23860 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
23870 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20  _int64 iDocid = 
23880 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  0;.    char *pNe
23890 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  xt = 0;.    char
238a0 20 2a 70 44 6f 63 69 64 20 3d 20 61 44 6f 63 6c   *pDocid = aDocl
238b0 69 73 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 70  ist;.    char *p
238c0 45 6e 64 20 3d 20 26 61 44 6f 63 6c 69 73 74 5b  End = &aDoclist[
238d0 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 20 20 69  nDoclist];.    i
238e0 6e 74 20 69 4d 75 6c 20 3d 20 31 3b 0a 0a 20 20  nt iMul = 1;..  
238f0 20 20 77 68 69 6c 65 28 20 70 44 6f 63 69 64 3c    while( pDocid<
23900 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 73 71  pEnd ){.      sq
23910 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c  lite3_int64 iDel
23920 74 61 3b 0a 20 20 20 20 20 20 70 44 6f 63 69 64  ta;.      pDocid
23930 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47   += sqlite3Fts3G
23940 65 74 56 61 72 69 6e 74 28 70 44 6f 63 69 64 2c  etVarint(pDocid,
23950 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
23960 20 69 44 6f 63 69 64 20 2b 3d 20 28 69 4d 75 6c   iDocid += (iMul
23970 20 2a 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20   * iDelta);.    
23980 20 20 70 4e 65 78 74 20 3d 20 70 44 6f 63 69 64    pNext = pDocid
23990 3b 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  ;.      fts3Posl
239a0 69 73 74 43 6f 70 79 28 30 2c 20 26 70 44 6f 63  istCopy(0, &pDoc
239b0 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  id);.      while
239c0 28 20 70 44 6f 63 69 64 3c 70 45 6e 64 20 26 26  ( pDocid<pEnd &&
239d0 20 2a 70 44 6f 63 69 64 3d 3d 30 20 29 20 70 44   *pDocid==0 ) pD
239e0 6f 63 69 64 2b 2b 3b 0a 20 20 20 20 20 20 69 4d  ocid++;.      iM
239f0 75 6c 20 3d 20 28 62 44 65 73 63 49 64 78 20 3f  ul = (bDescIdx ?
23a00 20 2d 31 20 3a 20 31 29 3b 0a 20 20 20 20 7d 0a   -1 : 1);.    }.
23a10 0a 20 20 20 20 2a 70 6e 4c 69 73 74 20 3d 20 28  .    *pnList = (
23a20 69 6e 74 29 28 70 45 6e 64 20 2d 20 70 4e 65 78  int)(pEnd - pNex
23a30 74 29 3b 0a 20 20 20 20 2a 70 70 49 74 65 72 20  t);.    *ppIter 
23a40 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 2a 70 69  = pNext;.    *pi
23a50 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
23a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
23a70 20 69 4d 75 6c 20 3d 20 28 62 44 65 73 63 49 64   iMul = (bDescId
23a80 78 20 3f 20 2d 31 20 3a 20 31 29 3b 0a 20 20 20  x ? -1 : 1);.   
23a90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
23aa0 44 65 6c 74 61 3b 0a 20 20 20 20 66 74 73 33 47  Delta;.    fts3G
23ab0 65 74 52 65 76 65 72 73 65 56 61 72 69 6e 74 28  etReverseVarint(
23ac0 26 70 2c 20 61 44 6f 63 6c 69 73 74 2c 20 26 69  &p, aDoclist, &i
23ad0 44 65 6c 74 61 29 3b 0a 20 20 20 20 2a 70 69 44  Delta);.    *piD
23ae0 6f 63 69 64 20 2d 3d 20 28 69 4d 75 6c 20 2a 20  ocid -= (iMul * 
23af0 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20 20 69 66  iDelta);..    if
23b00 28 20 70 3d 3d 61 44 6f 63 6c 69 73 74 20 29 7b  ( p==aDoclist ){
23b10 0a 20 20 20 20 20 20 2a 70 62 45 6f 66 20 3d 20  .      *pbEof = 
23b20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23b30 20 20 20 20 63 68 61 72 20 2a 70 53 61 76 65 20      char *pSave 
23b40 3d 20 70 3b 0a 20 20 20 20 20 20 66 74 73 33 52  = p;.      fts3R
23b50 65 76 65 72 73 65 50 6f 73 6c 69 73 74 28 61 44  eversePoslist(aD
23b60 6f 63 6c 69 73 74 2c 20 26 70 29 3b 0a 20 20 20  oclist, &p);.   
23b70 20 20 20 2a 70 6e 4c 69 73 74 20 3d 20 28 69 6e     *pnList = (in
23b80 74 29 28 70 53 61 76 65 20 2d 20 70 29 3b 0a 20  t)(pSave - p);. 
23b90 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 74 65 72     }.    *ppIter
23ba0 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = p;.  }.}../*.
23bb0 2a 2a 20 49 74 65 72 61 74 65 20 66 6f 72 77 61  ** Iterate forwa
23bc0 72 64 73 20 74 68 72 6f 75 67 68 20 61 20 64 6f  rds through a do
23bd0 63 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  clist..*/.void s
23be0 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73  qlite3Fts3Doclis
23bf0 74 4e 65 78 74 28 0a 20 20 69 6e 74 20 62 44 65  tNext(.  int bDe
23c00 73 63 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  scIdx,          
23c10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23c20 20 69 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   if the doclist 
23c30 69 73 20 64 65 73 63 20 2a 2f 0a 20 20 63 68 61  is desc */.  cha
23c40 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 20  r *aDoclist,    
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c60 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e 74 69 72  Pointer to entir
23c70 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69  e doclist */.  i
23c80 6e 74 20 6e 44 6f 63 6c 69 73 74 2c 20 20 20 20  nt nDoclist,    
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ca0 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61 44 6f 63  * Length of aDoc
23cb0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
23cc0 0a 20 20 63 68 61 72 20 2a 2a 70 70 49 74 65 72  .  char **ppIter
23cd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ce0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 74     /* IN/OUT: It
23cf0 65 72 61 74 6f 72 20 70 6f 69 6e 74 65 72 20 2a  erator pointer *
23d00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
23d10 34 20 2a 70 69 44 6f 63 69 64 2c 20 20 20 20 20  4 *piDocid,     
23d20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44      /* IN/OUT: D
23d30 6f 63 69 64 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ocid pointer */.
23d40 20 20 75 38 20 2a 70 62 45 6f 66 20 20 20 20 20    u8 *pbEof     
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64 2d 6f 66    /* OUT: End-of
23d70 2d 66 69 6c 65 20 66 6c 61 67 20 2a 2f 0a 29 7b  -file flag */.){
23d80 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 2a 70 70  .  char *p = *pp
23d90 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
23da0 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 3b 0a 20   nDoclist>0 );. 
23db0 20 61 73 73 65 72 74 28 20 2a 70 62 45 6f 66 3d   assert( *pbEof=
23dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23dd0 70 20 7c 7c 20 2a 70 69 44 6f 63 69 64 3d 3d 30  p || *piDocid==0
23de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
23df0 20 7c 7c 20 28 70 3e 3d 61 44 6f 63 6c 69 73 74   || (p>=aDoclist
23e00 20 26 26 20 70 3c 3d 26 61 44 6f 63 6c 69 73 74   && p<=&aDoclist
23e10 5b 6e 44 6f 63 6c 69 73 74 5d 29 20 29 3b 0a 0a  [nDoclist]) );..
23e20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
23e30 20 20 70 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a    p = aDoclist;.
23e40 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33      p += sqlite3
23e50 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c  Fts3GetVarint(p,
23e60 20 70 69 44 6f 63 69 64 29 3b 0a 20 20 7d 65 6c   piDocid);.  }el
23e70 73 65 7b 0a 20 20 20 20 66 74 73 33 50 6f 73 6c  se{.    fts3Posl
23e80 69 73 74 43 6f 70 79 28 30 2c 20 26 70 29 3b 0a  istCopy(0, &p);.
23e90 20 20 20 20 77 68 69 6c 65 28 20 70 3c 26 61 44      while( p<&aD
23ea0 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d  oclist[nDoclist]
23eb0 20 26 26 20 2a 70 3d 3d 30 20 29 20 70 2b 2b 3b   && *p==0 ) p++;
23ec0 20 0a 20 20 20 20 69 66 28 20 70 3e 3d 26 61 44   .    if( p>=&aD
23ed0 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d  oclist[nDoclist]
23ee0 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 45 6f 66   ){.      *pbEof
23ef0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
23f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
23f10 6e 74 36 34 20 69 56 61 72 3b 0a 20 20 20 20 20  nt64 iVar;.     
23f20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   p += sqlite3Fts
23f30 33 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69  3GetVarint(p, &i
23f40 56 61 72 29 3b 0a 20 20 20 20 20 20 2a 70 69 44  Var);.      *piD
23f50 6f 63 69 64 20 2b 3d 20 28 28 62 44 65 73 63 49  ocid += ((bDescI
23f60 64 78 20 3f 20 2d 31 20 3a 20 31 29 20 2a 20 69  dx ? -1 : 1) * i
23f70 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Var);.    }.  }.
23f80 0a 20 20 2a 70 70 49 74 65 72 20 3d 20 70 3b 0a  .  *ppIter = p;.
23f90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
23fa0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 44   the iterator pD
23fb0 4c 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  L to the next en
23fc0 74 72 79 20 69 6e 20 70 44 4c 2d 3e 61 41 6c 6c  try in pDL->aAll
23fd0 2f 6e 41 6c 6c 2e 20 53 65 74 20 2a 70 62 45 6f  /nAll. Set *pbEo
23fe0 66 0a 2a 2a 20 74 6f 20 74 72 75 65 20 69 66 20  f.** to true if 
23ff0 45 4f 46 20 69 73 20 72 65 61 63 68 65 64 2e 0a  EOF is reached..
24000 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
24010 74 73 33 45 76 61 6c 44 6c 50 68 72 61 73 65 4e  ts3EvalDlPhraseN
24020 65 78 74 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ext(.  Fts3Table
24030 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 44 6f   *pTab,.  Fts3Do
24040 63 6c 69 73 74 20 2a 70 44 4c 2c 0a 20 20 75 38  clist *pDL,.  u8
24050 20 2a 70 62 45 6f 66 0a 29 7b 0a 20 20 63 68 61   *pbEof.){.  cha
24060 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
24090 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
240a0 61 41 6c 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  aAll */.  char *
240b0 70 45 6e 64 20 3d 20 26 70 44 4c 2d 3e 61 41 6c  pEnd = &pDL->aAl
240c0 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c 5d 3b 20 20 20  l[pDL->nAll];   
240d0 20 20 2f 2a 20 31 20 62 79 74 65 20 70 61 73 74    /* 1 byte past
240e0 20 65 6e 64 20 6f 66 20 61 41 6c 6c 20 2a 2f 0a   end of aAll */.
240f0 20 0a 20 20 69 66 28 20 70 44 4c 2d 3e 70 4e 65   .  if( pDL->pNe
24100 78 74 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 70  xtDocid ){.    p
24110 49 74 65 72 20 3d 20 70 44 4c 2d 3e 70 4e 65 78  Iter = pDL->pNex
24120 74 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  tDocid;.  }else{
24130 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70 44 4c  .    pIter = pDL
24140 2d 3e 61 41 6c 6c 3b 0a 20 20 7d 0a 0a 20 20 69  ->aAll;.  }..  i
24150 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29  f( pIter>=pEnd )
24160 7b 0a 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65  {.    /* We have
24170 20 61 6c 72 65 61 64 79 20 72 65 61 63 68 65 64   already reached
24180 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
24190 20 64 6f 63 6c 69 73 74 2e 20 45 4f 46 2e 20 2a   doclist. EOF. *
241a0 2f 0a 20 20 20 20 2a 70 62 45 6f 66 20 3d 20 31  /.    *pbEof = 1
241b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
241c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65  qlite3_int64 iDe
241d0 6c 74 61 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  lta;.    pIter +
241e0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74  = sqlite3Fts3Get
241f0 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 26 69  Varint(pIter, &i
24200 44 65 6c 74 61 29 3b 0a 20 20 20 20 69 66 28 20  Delta);.    if( 
24210 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 3d 3d  pTab->bDescIdx==
24220 30 20 7c 7c 20 70 44 4c 2d 3e 70 4e 65 78 74 44  0 || pDL->pNextD
24230 6f 63 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ocid==0 ){.     
24240 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20 2b 3d 20   pDL->iDocid += 
24250 69 44 65 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73  iDelta;.    }els
24260 65 7b 0a 20 20 20 20 20 20 70 44 4c 2d 3e 69 44  e{.      pDL->iD
24270 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  ocid -= iDelta;.
24280 20 20 20 20 7d 0a 20 20 20 20 70 44 4c 2d 3e 70      }.    pDL->p
24290 4c 69 73 74 20 3d 20 70 49 74 65 72 3b 0a 20 20  List = pIter;.  
242a0 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
242b0 79 28 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  y(0, &pIter);.  
242c0 20 20 70 44 4c 2d 3e 6e 4c 69 73 74 20 3d 20 28    pDL->nList = (
242d0 69 6e 74 29 28 70 49 74 65 72 20 2d 20 70 44 4c  int)(pIter - pDL
242e0 2d 3e 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 2f  ->pList);..    /
242f0 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
24300 74 73 20 6a 75 73 74 20 70 61 73 74 20 74 68 65  ts just past the
24310 20 30 78 30 30 20 74 68 61 74 20 74 65 72 6d 69   0x00 that termi
24320 6e 61 74 65 73 20 74 68 65 20 70 6f 73 69 74 69  nates the positi
24330 6f 6e 2d 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  on-.    ** list 
24340 66 6f 72 20 64 6f 63 75 6d 65 6e 74 20 70 44 4c  for document pDL
24350 2d 3e 69 44 6f 63 69 64 2e 20 48 6f 77 65 76 65  ->iDocid. Howeve
24360 72 2c 20 69 66 20 74 68 69 73 20 70 6f 73 69 74  r, if this posit
24370 69 6f 6e 2d 6c 69 73 74 20 77 61 73 0a 20 20 20  ion-list was.   
24380 20 2a 2a 20 65 64 69 74 65 64 20 69 6e 20 70 6c   ** edited in pl
24390 61 63 65 20 62 79 20 66 74 73 33 45 76 61 6c 4e  ace by fts3EvalN
243a0 65 61 72 54 72 69 6d 28 29 2c 20 74 68 65 6e 20  earTrim(), then 
243b0 70 49 74 65 72 20 6d 61 79 20 6e 6f 74 20 61 63  pIter may not ac
243c0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  tually.    ** po
243d0 69 6e 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  int to the start
243e0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 64 6f 63   of the next doc
243f0 69 64 20 76 61 6c 75 65 2e 20 54 68 65 20 66 6f  id value. The fo
24400 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 20 64 65 61  llowing line dea
24410 6c 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ls.    ** with t
24420 68 69 73 20 63 61 73 65 20 62 79 20 61 64 76 61  his case by adva
24430 6e 63 69 6e 67 20 70 49 74 65 72 20 70 61 73 74  ncing pIter past
24440 20 74 68 65 20 7a 65 72 6f 2d 70 61 64 64 69 6e   the zero-paddin
24450 67 20 61 64 64 65 64 20 62 79 0a 20 20 20 20 2a  g added by.    *
24460 2a 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72  * fts3EvalNearTr
24470 69 6d 28 29 2e 20 20 2a 2f 0a 20 20 20 20 77 68  im().  */.    wh
24480 69 6c 65 28 20 70 49 74 65 72 3c 70 45 6e 64 20  ile( pIter<pEnd 
24490 26 26 20 2a 70 49 74 65 72 3d 3d 30 20 29 20 70  && *pIter==0 ) p
244a0 49 74 65 72 2b 2b 3b 0a 0a 20 20 20 20 70 44 4c  Iter++;..    pDL
244b0 2d 3e 70 4e 65 78 74 44 6f 63 69 64 20 3d 20 70  ->pNextDocid = p
244c0 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
244d0 28 20 70 49 74 65 72 3e 3d 26 70 44 4c 2d 3e 61  ( pIter>=&pDL->a
244e0 41 6c 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c 5d 20 7c  All[pDL->nAll] |
244f0 7c 20 2a 70 49 74 65 72 20 29 3b 0a 20 20 20 20  | *pIter );.    
24500 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a  *pbEof = 0;.  }.
24510 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
24520 74 79 70 65 20 75 73 65 64 20 62 79 20 66 74 73  type used by fts
24530 33 45 76 61 6c 49 6e 63 72 50 68 72 61 73 65 4e  3EvalIncrPhraseN
24540 65 78 74 28 29 20 61 6e 64 20 69 6e 63 72 50 68  ext() and incrPh
24550 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28 29 2e  raseTokenNext().
24560 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
24570 63 74 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 20  ct TokenDoclist 
24580 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 3b 0a 73 74  TokenDoclist;.st
24590 72 75 63 74 20 54 6f 6b 65 6e 44 6f 63 6c 69 73  ruct TokenDoclis
245a0 74 20 7b 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72  t {.  int bIgnor
245b0 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  e;.  sqlite3_int
245c0 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 63 68 61  64 iDocid;.  cha
245d0 72 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  r *pList;.  int 
245e0 6e 4c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nList;.};../*.**
245f0 20 54 6f 6b 65 6e 20 70 54 6f 6b 65 6e 20 69 73   Token pToken is
24600 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c   an incrementall
24610 79 20 6c 6f 61 64 65 64 20 74 6f 6b 65 6e 20 74  y loaded token t
24620 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
24630 20 0a 2a 2a 20 6d 75 6c 74 69 2d 74 6f 6b 65 6e   .** multi-token
24640 20 70 68 72 61 73 65 2e 20 41 64 76 61 6e 63 65   phrase. Advance
24650 20 69 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20   it to the next 
24660 6d 61 74 63 68 69 6e 67 20 64 6f 63 75 6d 65 6e  matching documen
24670 74 20 69 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  t in the.** data
24680 62 61 73 65 20 61 6e 64 20 70 6f 70 75 6c 61 74  base and populat
24690 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
246a0 65 20 2a 70 20 77 69 74 68 20 74 68 65 20 64 65  e *p with the de
246b0 74 61 69 6c 73 20 6f 66 20 74 68 65 20 6e 65 77  tails of the new
246c0 0a 2a 2a 20 65 6e 74 72 79 2e 20 4f 72 2c 20 69  .** entry. Or, i
246d0 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 68  f the iterator h
246e0 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2c 20  as reached EOF, 
246f0 73 65 74 20 2a 70 62 45 6f 66 20 74 6f 20 74 72  set *pbEof to tr
24700 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ue..**.** If an 
24710 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
24720 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
24730 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
24740 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
24750 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
24760 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 50 68  tatic int incrPh
24770 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28 0a 20  raseTokenNext(. 
24780 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
24790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
247a0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
247b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
247c0 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
247d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
247e0 20 50 68 72 61 73 65 20 74 6f 20 61 64 76 61 6e   Phrase to advan
247f0 63 65 20 74 6f 6b 65 6e 20 6f 66 20 2a 2f 0a 20  ce token of */. 
24800 20 69 6e 74 20 69 54 6f 6b 65 6e 2c 20 20 20 20   int iToken,    
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24820 20 2f 2a 20 53 70 65 63 69 66 69 63 20 74 6f 6b   /* Specific tok
24830 65 6e 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  en to advance */
24840 0a 20 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 20  .  TokenDoclist 
24850 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24860 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64     /* OUT: Docid
24870 20 61 6e 64 20 64 6f 63 6c 69 73 74 20 66 6f 72   and doclist for
24880 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20   new entry */.  
24890 75 38 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20  u8 *pbEof       
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
248c0 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
248d0 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  OF */.){.  int r
248e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
248f0 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 69    if( pPhrase->i
24900 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3d 3d 69 54  DoclistToken==iT
24910 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
24920 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65 3d 3d  rt( p->bIgnore==
24930 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
24940 20 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e   pPhrase->aToken
24950 5b 69 54 6f 6b 65 6e 5d 2e 70 53 65 67 63 73 72  [iToken].pSegcsr
24960 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 33 45  ==0 );.    fts3E
24970 76 61 6c 44 6c 50 68 72 61 73 65 4e 65 78 74 28  valDlPhraseNext(
24980 70 54 61 62 2c 20 26 70 50 68 72 61 73 65 2d 3e  pTab, &pPhrase->
24990 64 6f 63 6c 69 73 74 2c 20 70 62 45 6f 66 29 3b  doclist, pbEof);
249a0 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74 20 3d 20  .    p->pList = 
249b0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
249c0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 70 2d 3e 6e  .pList;.    p->n
249d0 4c 69 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e  List = pPhrase->
249e0 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 3b 0a 20  doclist.nList;. 
249f0 20 20 20 70 2d 3e 69 44 6f 63 69 64 20 3d 20 70     p->iDocid = p
24a00 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
24a10 69 44 6f 63 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  iDocid;.  }else{
24a20 0a 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54  .    Fts3PhraseT
24a30 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
24a40 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b  pPhrase->aToken[
24a50 69 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 61 73 73  iToken];.    ass
24a60 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44 65  ert( pToken->pDe
24a70 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ferred==0 );.   
24a80 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
24a90 3e 70 53 65 67 63 73 72 20 7c 7c 20 70 50 68 72  >pSegcsr || pPhr
24aa0 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ase->iDoclistTok
24ab0 65 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  en>=0 );.    if(
24ac0 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72   pToken->pSegcsr
24ad0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
24ae0 28 20 70 2d 3e 62 49 67 6e 6f 72 65 3d 3d 30 20  ( p->bIgnore==0 
24af0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
24b00 6c 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72  lite3Fts3MsrIncr
24b10 4e 65 78 74 28 0a 20 20 20 20 20 20 20 20 20 20  Next(.          
24b20 70 54 61 62 2c 20 70 54 6f 6b 65 6e 2d 3e 70 53  pTab, pToken->pS
24b30 65 67 63 73 72 2c 20 26 70 2d 3e 69 44 6f 63 69  egcsr, &p->iDoci
24b40 64 2c 20 26 70 2d 3e 70 4c 69 73 74 2c 20 26 70  d, &p->pList, &p
24b50 2d 3e 6e 4c 69 73 74 0a 20 20 20 20 20 20 29 3b  ->nList.      );
24b60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
24b70 69 73 74 3d 3d 30 20 29 20 2a 70 62 45 6f 66 20  ist==0 ) *pbEof 
24b80 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
24b90 20 20 20 20 20 20 70 2d 3e 62 49 67 6e 6f 72 65        p->bIgnore
24ba0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
24bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24bc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 68 72 61  ../*.** The phra
24bd0 73 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  se iterator pass
24be0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24bf0 20 61 72 67 75 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a   argument:.**.**
24c00 20 20 20 2a 20 66 65 61 74 75 72 65 73 20 61 74     * features at
24c10 20 6c 65 61 73 74 20 6f 6e 65 20 74 6f 6b 65 6e   least one token
24c20 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
24c30 63 72 65 6d 65 6e 74 61 6c 20 64 6f 63 6c 69 73  cremental doclis
24c40 74 2c 20 61 6e 64 20 0a 2a 2a 0a 2a 2a 20 20 20  t, and .**.**   
24c50 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  * does not conta
24c60 69 6e 20 61 6e 79 20 64 65 66 65 72 72 65 64 20  in any deferred 
24c70 74 6f 6b 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 64  tokens..**.** Ad
24c80 76 61 6e 63 65 20 69 74 20 74 6f 20 74 68 65 20  vance it to the 
24c90 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 64 6f  next matching do
24ca0 63 75 6d 6e 65 6e 74 20 69 6e 20 74 68 65 20 64  cumnent in the d
24cb0 61 74 61 62 61 73 65 20 61 6e 64 20 70 6f 70 75  atabase and popu
24cc0 6c 61 74 65 0a 2a 2a 20 74 68 65 20 46 74 73 33  late.** the Fts3
24cd0 44 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 61 6e  Doclist.pList an
24ce0 64 20 6e 4c 69 73 74 20 66 69 65 6c 64 73 2e 20  d nList fields. 
24cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
24d00 69 73 20 6e 6f 20 22 6e 65 78 74 22 20 65 6e 74  is no "next" ent
24d10 72 79 20 61 6e 64 20 6e 6f 20 65 72 72 6f 72 20  ry and no error 
24d20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 62  occurs, then *pb
24d30 45 6f 66 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  Eof is set to.**
24d40 20 31 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e   1 before return
24d50 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
24d60 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
24d70 72 73 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  rs and the itera
24d80 74 6f 72 20 69 73 0a 2a 2a 20 73 75 63 63 65 73  tor is.** succes
24d90 73 66 75 6c 6c 79 20 61 64 76 61 6e 63 65 64 2c  sfully advanced,
24da0 20 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20 74   *pbEof is set t
24db0 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  o 0..**.** If an
24dc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
24dd0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
24de0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
24df0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
24e00 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  * SQLITE_OK..*/.
24e10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
24e20 76 61 6c 49 6e 63 72 50 68 72 61 73 65 4e 65 78  valIncrPhraseNex
24e30 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  t(.  Fts3Cursor 
24e40 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
24e50 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73       /* FTS Curs
24e60 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  or handle */.  F
24e70 74 73 33 50 68 72 61 73 65 20 2a 70 2c 20 20 20  ts3Phrase *p,   
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e90 2a 20 50 68 72 61 73 65 20 6f 62 6a 65 63 74 20  * Phrase object 
24ea0 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
24eb0 78 74 20 64 6f 63 69 64 20 2a 2f 0a 20 20 75 38  xt docid */.  u8
24ec0 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20 20 20   *pbEof         
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ee0 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 31 20 69   OUT: Set to 1 i
24ef0 66 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e  f EOF */.){.  in
24f00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24f10 3b 0a 20 20 46 74 73 33 44 6f 63 6c 69 73 74 20  ;.  Fts3Doclist 
24f20 2a 70 44 4c 20 3d 20 26 70 2d 3e 64 6f 63 6c 69  *pDL = &p->docli
24f30 73 74 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20  st;.  Fts3Table 
24f40 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62  *pTab = (Fts3Tab
24f50 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e  le *)pCsr->base.
24f60 70 56 74 61 62 3b 0a 20 20 75 38 20 62 45 6f 66  pVtab;.  u8 bEof
24f70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
24f80 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
24f90 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
24fa0 65 65 64 20 74 68 61 74 20 74 68 65 20 70 68 72  eed that the phr
24fb0 61 73 65 20 68 61 73 20 61 74 20 6c 65 61 73 74  ase has at least
24fc0 0a 20 20 2a 2a 20 6f 6e 65 20 69 6e 63 72 65 6d  .  ** one increm
24fd0 65 6e 74 61 6c 20 74 6f 6b 65 6e 2e 20 49 6e 20  ental token. In 
24fe0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 62  which case the b
24ff0 49 6e 63 72 20 66 6c 61 67 20 69 73 20 73 65 74  Incr flag is set
25000 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
25010 2d 3e 62 49 6e 63 72 3d 3d 31 20 29 3b 0a 0a 20  ->bIncr==1 );.. 
25020 20 69 66 28 20 70 2d 3e 6e 54 6f 6b 65 6e 3d 3d   if( p->nToken==
25030 31 20 26 26 20 70 2d 3e 62 49 6e 63 72 20 29 7b  1 && p->bIncr ){
25040 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25050 33 46 74 73 33 4d 73 72 49 6e 63 72 4e 65 78 74  3Fts3MsrIncrNext
25060 28 70 54 61 62 2c 20 70 2d 3e 61 54 6f 6b 65 6e  (pTab, p->aToken
25070 5b 30 5d 2e 70 53 65 67 63 73 72 2c 20 0a 20 20  [0].pSegcsr, .  
25080 20 20 20 20 20 20 26 70 44 4c 2d 3e 69 44 6f 63        &pDL->iDoc
25090 69 64 2c 20 26 70 44 4c 2d 3e 70 4c 69 73 74 2c  id, &pDL->pList,
250a0 20 26 70 44 4c 2d 3e 6e 4c 69 73 74 0a 20 20 20   &pDL->nList.   
250b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 44 4c 2d   );.    if( pDL-
250c0 3e 70 4c 69 73 74 3d 3d 30 20 29 20 62 45 6f 66  >pList==0 ) bEof
250d0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
250e0 20 20 20 69 6e 74 20 62 44 65 73 63 44 6f 63 6c     int bDescDocl
250f0 69 73 74 20 3d 20 70 43 73 72 2d 3e 62 44 65 73  ist = pCsr->bDes
25100 63 3b 0a 20 20 20 20 73 74 72 75 63 74 20 54 6f  c;.    struct To
25110 6b 65 6e 44 6f 63 6c 69 73 74 20 61 5b 4d 41 58  kenDoclist a[MAX
25120 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b  _INCR_PHRASE_TOK
25130 45 4e 53 5d 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  ENS];..    memse
25140 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
25150 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
25160 70 2d 3e 6e 54 6f 6b 65 6e 3c 3d 4d 41 58 5f 49  p->nToken<=MAX_I
25170 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45 4e  NCR_PHRASE_TOKEN
25180 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  S );.    assert(
25190 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65   p->iDoclistToke
251a0 6e 3c 4d 41 58 5f 49 4e 43 52 5f 50 48 52 41 53  n<MAX_INCR_PHRAS
251b0 45 5f 54 4f 4b 45 4e 53 20 29 3b 0a 0a 20 20 20  E_TOKENS );..   
251c0 20 77 68 69 6c 65 28 20 62 45 6f 66 3d 3d 30 20   while( bEof==0 
251d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4d 61  ){.      int bMa
251e0 78 53 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  xSet = 0;.      
251f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d  sqlite3_int64 iM
25200 61 78 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4c  ax = 0;     /* L
25210 61 72 67 65 73 74 20 64 6f 63 69 64 20 66 6f 72  argest docid for
25220 20 61 6c 6c 20 69 74 65 72 61 74 6f 72 73 20 2a   all iterators *
25230 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25250 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
25260 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
25270 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 20 20 20 20  okens */..      
25280 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  /* Advance the i
25290 74 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  terator for each
252a0 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 70 68   token in the ph
252b0 72 61 73 65 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20  rase once. */.  
252c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
252d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
252e0 70 2d 3e 6e 54 6f 6b 65 6e 20 26 26 20 62 45 6f  p->nToken && bEo
252f0 66 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  f==0; i++){.    
25300 20 20 20 20 72 63 20 3d 20 69 6e 63 72 50 68 72      rc = incrPhr
25310 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28 70 54 61  aseTokenNext(pTa
25320 62 2c 20 70 2c 20 69 2c 20 26 61 5b 69 5d 2c 20  b, p, i, &a[i], 
25330 26 62 45 6f 66 29 3b 0a 20 20 20 20 20 20 20 20  &bEof);.        
25340 69 66 28 20 61 5b 69 5d 2e 62 49 67 6e 6f 72 65  if( a[i].bIgnore
25350 3d 3d 30 20 26 26 20 28 62 4d 61 78 53 65 74 3d  ==0 && (bMaxSet=
25360 3d 30 20 7c 7c 20 44 4f 43 49 44 5f 43 4d 50 28  =0 || DOCID_CMP(
25370 69 4d 61 78 2c 20 61 5b 69 5d 2e 69 44 6f 63 69  iMax, a[i].iDoci
25380 64 29 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  d)<0) ){.       
25390 20 20 20 69 4d 61 78 20 3d 20 61 5b 69 5d 2e 69     iMax = a[i].i
253a0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
253b0 20 62 4d 61 78 53 65 74 20 3d 20 31 3b 0a 20 20   bMaxSet = 1;.  
253c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
253d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
253e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
253f0 70 2d 3e 6e 54 6f 6b 65 6e 3e 3d 31 20 26 26 20  p->nToken>=1 && 
25400 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e 62  a[p->nToken-1].b
25410 49 67 6e 6f 72 65 3d 3d 30 29 20 29 3b 0a 20 20  Ignore==0) );.  
25420 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
25430 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 62 4d 61  SQLITE_OK || bMa
25440 78 53 65 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  xSet );..      /
25450 2a 20 4b 65 65 70 20 61 64 76 61 6e 63 69 6e 67  * Keep advancing
25460 20 69 74 65 72 61 74 6f 72 73 20 75 6e 74 69 6c   iterators until
25470 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
25480 74 6f 20 74 68 65 20 73 61 6d 65 20 64 6f 63 75  to the same docu
25490 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 66 6f  ment */.      fo
254a0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 54 6f 6b  r(i=0; i<p->nTok
254b0 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  en; i++){.      
254c0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
254d0 49 54 45 5f 4f 4b 20 26 26 20 62 45 6f 66 3d 3d  ITE_OK && bEof==
254e0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  0 .            &
254f0 26 20 61 5b 69 5d 2e 62 49 67 6e 6f 72 65 3d 3d  & a[i].bIgnore==
25500 30 20 26 26 20 44 4f 43 49 44 5f 43 4d 50 28 61  0 && DOCID_CMP(a
25510 5b 69 5d 2e 69 44 6f 63 69 64 2c 20 69 4d 61 78  [i].iDocid, iMax
25520 29 3c 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  )<0 .        ){.
25530 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 69            rc = i
25540 6e 63 72 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65  ncrPhraseTokenNe
25550 78 74 28 70 54 61 62 2c 20 70 2c 20 69 2c 20 26  xt(pTab, p, i, &
25560 61 5b 69 5d 2c 20 26 62 45 6f 66 29 3b 0a 20 20  a[i], &bEof);.  
25570 20 20 20 20 20 20 20 20 69 66 28 20 44 4f 43 49          if( DOCI
25580 44 5f 43 4d 50 28 61 5b 69 5d 2e 69 44 6f 63 69  D_CMP(a[i].iDoci
25590 64 2c 20 69 4d 61 78 29 3e 30 20 29 7b 0a 20 20  d, iMax)>0 ){.  
255a0 20 20 20 20 20 20 20 20 20 20 69 4d 61 78 20 3d            iMax =
255b0 20 61 5b 69 5d 2e 69 44 6f 63 69 64 3b 0a 20 20   a[i].iDocid;.  
255c0 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 30 3b            i = 0;
255d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
255e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
255f0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
25600 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  f the current en
25610 74 72 69 65 73 20 72 65 61 6c 6c 79 20 61 72 65  tries really are
25620 20 61 20 70 68 72 61 73 65 20 6d 61 74 63 68 20   a phrase match 
25630 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 45 6f  */.      if( bEo
25640 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
25650 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
25660 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
25670 20 3d 20 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31   = a[p->nToken-1
25680 5d 2e 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  ].nList;.       
25690 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 20   char *aDoclist 
256a0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
256b0 28 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 20  (nByte+1);.     
256c0 20 20 20 69 66 28 20 21 61 44 6f 63 6c 69 73 74     if( !aDoclist
256d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
256e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
256f0 6d 65 6d 63 70 79 28 61 44 6f 63 6c 69 73 74 2c  memcpy(aDoclist,
25700 20 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2e   a[p->nToken-1].
25710 70 4c 69 73 74 2c 20 6e 42 79 74 65 2b 31 29 3b  pList, nByte+1);
25720 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ..        for(i=
25730 30 3b 20 69 3c 28 70 2d 3e 6e 54 6f 6b 65 6e 2d  0; i<(p->nToken-
25740 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  1); i++){.      
25750 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 62 49 67      if( a[i].bIg
25760 6e 6f 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nore==0 ){.     
25770 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 20         char *pL 
25780 3d 20 61 5b 69 5d 2e 70 4c 69 73 74 3b 0a 20 20  = a[i].pList;.  
25790 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
257a0 70 52 20 3d 20 61 44 6f 63 6c 69 73 74 3b 0a 20  pR = aDoclist;. 
257b0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
257c0 2a 70 4f 75 74 20 3d 20 61 44 6f 63 6c 69 73 74  *pOut = aDoclist
257d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
257e0 74 20 6e 44 69 73 74 20 3d 20 70 2d 3e 6e 54 6f  t nDist = p->nTo
257f0 6b 65 6e 2d 31 2d 69 3b 0a 20 20 20 20 20 20 20  ken-1-i;.       
25800 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66       int res = f
25810 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65  ts3PoslistPhrase
25820 4d 65 72 67 65 28 26 70 4f 75 74 2c 20 6e 44 69  Merge(&pOut, nDi
25830 73 74 2c 20 30 2c 20 31 2c 20 26 70 4c 2c 20 26  st, 0, 1, &pL, &
25840 70 52 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pR);.           
25850 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 62 72   if( res==0 ) br
25860 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
25870 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70   nList = (int)(p
25880 4f 75 74 20 2d 20 61 44 6f 63 6c 69 73 74 29 3b  Out - aDoclist);
25890 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
258a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
258b0 66 28 20 69 3d 3d 28 70 2d 3e 6e 54 6f 6b 65 6e  f( i==(p->nToken
258c0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
258d0 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20 3d 20 69   pDL->iDocid = i
258e0 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Max;.          p
258f0 44 4c 2d 3e 70 4c 69 73 74 20 3d 20 61 44 6f 63  DL->pList = aDoc
25900 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  list;.          
25910 70 44 4c 2d 3e 6e 4c 69 73 74 20 3d 20 6e 4c 69  pDL->nList = nLi
25920 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  st;.          pD
25930 4c 2d 3e 62 46 72 65 65 4c 69 73 74 20 3d 20 31  L->bFreeList = 1
25940 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
25950 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
25960 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25970 65 28 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  e(aDoclist);.   
25980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25990 20 20 2a 70 62 45 6f 66 20 3d 20 62 45 6f 66 3b    *pbEof = bEof;
259a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
259b0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
259c0 6f 20 6d 6f 76 65 20 74 68 65 20 70 68 72 61 73  o move the phras
259d0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
259e0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  int to the next 
259f0 6d 61 74 63 68 69 6e 67 20 64 6f 63 69 64 2e 20  matching docid. 
25a00 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
25a10 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
25a20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
25a30 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
25a40 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
25a50 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
25a60 68 65 72 65 20 69 73 20 6e 6f 20 22 6e 65 78 74  here is no "next
25a70 22 20 65 6e 74 72 79 20 61 6e 64 20 6e 6f 20 65  " entry and no e
25a80 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
25a90 6e 20 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20  n *pbEof is set 
25aa0 74 6f 0a 2a 2a 20 31 20 62 65 66 6f 72 65 20 72  to.** 1 before r
25ab0 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77  eturning. Otherw
25ac0 69 73 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72  ise, if no error
25ad0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
25ae0 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 73  iterator is.** s
25af0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 64 76 61  uccessfully adva
25b00 6e 63 65 64 2c 20 2a 70 62 45 6f 66 20 69 73 20  nced, *pbEof is 
25b10 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
25b20 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c  tic int fts3Eval
25b30 50 68 72 61 73 65 4e 65 78 74 28 0a 20 20 46 74  PhraseNext(.  Ft
25b40 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
25b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b60 20 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64   FTS Cursor hand
25b70 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61  le */.  Fts3Phra
25b80 73 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  se *p,          
25b90 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
25ba0 65 20 6f 62 6a 65 63 74 20 74 6f 20 61 64 76 61  e object to adva
25bb0 6e 63 65 20 74 6f 20 6e 65 78 74 20 64 6f 63 69  nce to next doci
25bc0 64 20 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66  d */.  u8 *pbEof
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
25bf0 65 74 20 74 6f 20 31 20 69 66 20 45 4f 46 20 2a  et to 1 if EOF *
25c00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
25c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
25c20 33 44 6f 63 6c 69 73 74 20 2a 70 44 4c 20 3d 20  3Doclist *pDL = 
25c30 26 70 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 46  &p->doclist;.  F
25c40 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts3Table *pTab =
25c50 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
25c60 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
25c70 0a 20 20 69 66 28 20 70 2d 3e 62 49 6e 63 72 20  .  if( p->bIncr 
25c80 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33  ){.    rc = fts3
25c90 45 76 61 6c 49 6e 63 72 50 68 72 61 73 65 4e 65  EvalIncrPhraseNe
25ca0 78 74 28 70 43 73 72 2c 20 70 2c 20 70 62 45 6f  xt(pCsr, p, pbEo
25cb0 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
25cc0 70 43 73 72 2d 3e 62 44 65 73 63 21 3d 70 54 61  pCsr->bDesc!=pTa
25cd0 62 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 70  b->bDescIdx && p
25ce0 44 4c 2d 3e 6e 41 6c 6c 20 29 7b 0a 20 20 20 20  DL->nAll ){.    
25cf0 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69  sqlite3Fts3Docli
25d00 73 74 50 72 65 76 28 70 54 61 62 2d 3e 62 44 65  stPrev(pTab->bDe
25d10 73 63 49 64 78 2c 20 70 44 4c 2d 3e 61 41 6c 6c  scIdx, pDL->aAll
25d20 2c 20 70 44 4c 2d 3e 6e 41 6c 6c 2c 20 0a 20 20  , pDL->nAll, .  
25d30 20 20 20 20 20 20 26 70 44 4c 2d 3e 70 4e 65 78        &pDL->pNex
25d40 74 44 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 69 44  tDocid, &pDL->iD
25d50 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73  ocid, &pDL->nLis
25d60 74 2c 20 70 62 45 6f 66 0a 20 20 20 20 29 3b 0a  t, pbEof.    );.
25d70 20 20 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d      pDL->pList =
25d80 20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64   pDL->pNextDocid
25d90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
25da0 74 73 33 45 76 61 6c 44 6c 50 68 72 61 73 65 4e  ts3EvalDlPhraseN
25db0 65 78 74 28 70 54 61 62 2c 20 70 44 4c 2c 20 70  ext(pTab, pDL, p
25dc0 62 45 6f 66 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  bEof);.  }..  re
25dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25de0 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
25df0 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  not SQLITE_OK wh
25e00 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
25e10 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
25e20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
25e30 68 65 72 77 69 73 65 2c 20 66 74 73 33 45 76 61  herwise, fts3Eva
25e40 6c 50 68 72 61 73 65 53 74 61 72 74 28 29 20 69  lPhraseStart() i
25e50 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 6c 20  s called on all 
25e60 70 68 72 61 73 65 73 20 77 69 74 68 69 6e 20 74  phrases within t
25e70 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
25e80 2e 20 41 6c 73 6f 20 74 68 65 20 46 74 73 33 45  . Also the Fts3E
25e90 78 70 72 2e 62 44 65 66 65 72 72 65 64 20 76 61  xpr.bDeferred va
25ea0 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
25eb0 20 74 72 75 65 20 66 6f 72 20 61 6e 79 0a 2a 2a   true for any.**
25ec0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72   expressions for
25ed0 20 77 68 69 63 68 20 61 6c 6c 20 64 65 73 63 65   which all desce
25ee0 6e 64 65 6e 74 20 74 6f 6b 65 6e 73 20 61 72 65  ndent tokens are
25ef0 20 64 65 66 65 72 72 65 64 2e 0a 2a 2a 0a 2a 2a   deferred..**.**
25f00 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 62 4f   If parameter bO
25f10 70 74 4f 6b 20 69 73 20 7a 65 72 6f 2c 20 74 68  ptOk is zero, th
25f20 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
25f30 65 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  eed that the.** 
25f40 46 74 73 33 50 68 72 61 73 65 2e 64 6f 63 6c 69  Fts3Phrase.docli
25f50 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 20 76 61 72  st.aAll/nAll var
25f60 69 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 20 74  iables contain t
25f70 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
25f80 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 70 68  t for.** each ph
25f90 72 61 73 65 20 69 6e 20 74 68 65 20 65 78 70 72  rase in the expr
25fa0 65 73 73 69 6f 6e 20 28 73 75 62 6a 65 63 74 20  ession (subject 
25fb0 74 6f 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  to deferred toke
25fc0 6e 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 0a 2a  n processing)..*
25fd0 2a 20 4f 72 2c 20 69 66 20 62 4f 70 74 4f 6b 20  * Or, if bOptOk 
25fe0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
25ff0 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f  n one or more to
26000 6b 65 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20  kens within the 
26010 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6d 61  expression.** ma
26020 79 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 63 72  y be loaded incr
26030 65 6d 65 6e 74 61 6c 6c 79 2c 20 6d 65 61 6e 69  ementally, meani
26040 6e 67 20 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f  ng doclist.aAll/
26050 6e 41 6c 6c 20 69 73 20 6e 6f 74 20 61 76 61 69  nAll is not avai
26060 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
26070 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26080 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
26090 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 20 73 65  tion, *pRc is se
260a0 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
260b0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 62 65 66  rror.** code bef
260c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
260d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
260e0 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64 65  s3EvalStartReade
260f0 72 73 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72  rs(.  Fts3Cursor
26100 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
26110 20 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72        /* FTS Cur
26120 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  sor handle */.  
26130 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
26160 20 69 6e 69 74 69 61 6c 69 7a 65 20 70 68 72 61   initialize phra
26170 73 65 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  ses in */.  int 
26180 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
26190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
261a0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
261b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  e */.){.  if( pE
261c0 78 70 72 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  xpr && SQLITE_OK
261d0 3d 3d 2a 70 52 63 20 29 7b 0a 20 20 20 20 69 66  ==*pRc ){.    if
261e0 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  ( pExpr->eType==
261f0 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20  FTSQUERY_PHRASE 
26200 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ){.      int nTo
26210 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70 50 68  ken = pExpr->pPh
26220 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20  rase->nToken;.  
26230 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29      if( nToken )
26240 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
26250 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
26260 3b 20 69 3c 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29  ; i<nToken; i++)
26270 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
26280 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e  pExpr->pPhrase->
26290 61 54 6f 6b 65 6e 5b 69 5d 2e 70 44 65 66 65 72  aToken[i].pDefer
262a0 72 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  red==0 ) break;.
262b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
262c0 20 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72    pExpr->bDeferr
262d0 65 64 20 3d 20 28 69 3d 3d 6e 54 6f 6b 65 6e 29  ed = (i==nToken)
262e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
262f0 2a 70 52 63 20 3d 20 66 74 73 33 45 76 61 6c 50  *pRc = fts3EvalP
26300 68 72 61 73 65 53 74 61 72 74 28 70 43 73 72 2c  hraseStart(pCsr,
26310 20 31 2c 20 70 45 78 70 72 2d 3e 70 50 68 72 61   1, pExpr->pPhra
26320 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
26330 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 53 74        fts3EvalSt
26340 61 72 74 52 65 61 64 65 72 73 28 70 43 73 72 2c  artReaders(pCsr,
26350 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
26360 52 63 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45  Rc);.      fts3E
26370 76 61 6c 53 74 61 72 74 52 65 61 64 65 72 73 28  valStartReaders(
26380 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  pCsr, pExpr->pRi
26390 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  ght, pRc);.     
263a0 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65   pExpr->bDeferre
263b0 64 20 3d 20 28 70 45 78 70 72 2d 3e 70 4c 65 66  d = (pExpr->pLef
263c0 74 2d 3e 62 44 65 66 65 72 72 65 64 20 26 26 20  t->bDeferred && 
263d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 62  pExpr->pRight->b
263e0 44 65 66 65 72 72 65 64 29 3b 0a 20 20 20 20 7d  Deferred);.    }
263f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
26400 20 61 72 72 61 79 20 6f 66 20 74 68 65 20 66 6f   array of the fo
26410 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
26420 65 73 20 69 73 20 61 73 73 65 6d 62 6c 65 64 20  es is assembled 
26430 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  as part of the p
26440 72 6f 63 65 73 73 0a 2a 2a 20 6f 66 20 73 65 6c  rocess.** of sel
26450 65 63 74 69 6e 67 20 74 6f 6b 65 6e 73 20 74 6f  ecting tokens to
26460 20 64 65 66 65 72 20 62 65 66 6f 72 65 20 74 68   defer before th
26470 65 20 71 75 65 72 79 20 73 74 61 72 74 73 20 65  e query starts e
26480 78 65 63 75 74 69 6e 67 20 28 61 73 20 70 61 72  xecuting (as par
26490 74 0a 2a 2a 20 6f 66 20 74 68 65 20 78 46 69 6c  t.** of the xFil
264a0 74 65 72 28 29 20 6d 65 74 68 6f 64 29 2e 20 54  ter() method). T
264b0 68 65 72 65 20 69 73 20 6f 6e 65 20 65 6c 65 6d  here is one elem
264c0 65 6e 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ent in the array
264d0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 74 6f 6b   for each.** tok
264e0 65 6e 20 69 6e 20 74 68 65 20 46 54 53 20 65 78  en in the FTS ex
264f0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
26500 54 6f 6b 65 6e 73 20 61 72 65 20 64 69 76 69 64  Tokens are divid
26510 65 64 20 69 6e 74 6f 20 41 4e 44 2f 4e 45 41 52  ed into AND/NEAR
26520 20 63 6c 75 73 74 65 72 73 2e 20 41 6c 6c 20 74   clusters. All t
26530 6f 6b 65 6e 73 20 69 6e 20 61 20 63 6c 75 73 74  okens in a clust
26540 65 72 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20  er belong.** to 
26550 70 68 72 61 73 65 73 20 74 68 61 74 20 61 72 65  phrases that are
26560 20 63 6f 6e 6e 65 63 74 65 64 20 6f 6e 6c 79 20   connected only 
26570 62 79 20 41 4e 44 20 61 6e 64 20 4e 45 41 52 20  by AND and NEAR 
26580 6f 70 65 72 61 74 6f 72 73 20 28 6e 6f 74 20 4f  operators (not O
26590 52 20 6f 72 0a 2a 2a 20 4e 4f 54 29 2e 20 57 68  R or.** NOT). Wh
265a0 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  en determining t
265b0 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65 72 2c 20  okens to defer, 
265c0 65 61 63 68 20 41 4e 44 2f 4e 45 41 52 20 63 6c  each AND/NEAR cl
265d0 75 73 74 65 72 20 69 73 20 63 6f 6e 73 69 64 65  uster is conside
265e0 72 65 64 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c  red.** separatel
265f0 79 2e 20 54 68 65 20 72 6f 6f 74 20 6f 66 20 61  y. The root of a
26600 20 74 6f 6b 65 6e 73 20 41 4e 44 2f 4e 45 41 52   tokens AND/NEAR
26610 20 63 6c 75 73 74 65 72 20 69 73 20 73 74 6f 72   cluster is stor
26620 65 64 20 69 6e 20 0a 2a 2a 20 46 74 73 33 54 6f  ed in .** Fts3To
26630 6b 65 6e 41 6e 64 43 6f 73 74 2e 70 52 6f 6f 74  kenAndCost.pRoot
26640 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
26650 75 63 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64  uct Fts3TokenAnd
26660 43 6f 73 74 20 46 74 73 33 54 6f 6b 65 6e 41 6e  Cost Fts3TokenAn
26670 64 43 6f 73 74 3b 0a 73 74 72 75 63 74 20 46 74  dCost;.struct Ft
26680 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 7b  s3TokenAndCost {
26690 0a 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70  .  Fts3Phrase *p
266a0 50 68 72 61 73 65 3b 20 20 20 20 20 20 20 20 20  Phrase;         
266b0 20 20 20 2f 2a 20 54 68 65 20 70 68 72 61 73 65     /* The phrase
266c0 20 74 68 65 20 74 6f 6b 65 6e 20 62 65 6c 6f 6e   the token belon
266d0 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  gs to */.  int i
266e0 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20  Token;          
266f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
26700 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
26710 69 6e 20 70 68 72 61 73 65 20 2a 2f 0a 20 20 46  in phrase */.  F
26720 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a  ts3PhraseToken *
26730 70 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f  pToken;        /
26740 2a 20 54 68 65 20 74 6f 6b 65 6e 20 69 74 73 65  * The token itse
26750 6c 66 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  lf */.  Fts3Expr
26760 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20 20 20   *pRoot;        
26770 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
26780 6f 66 20 4e 45 41 52 2f 41 4e 44 20 63 6c 75 73  of NEAR/AND clus
26790 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 76  ter */.  int nOv
267a0 66 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fl;             
267b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
267c0 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  er of overflow p
267d0 61 67 65 73 20 74 6f 20 6c 6f 61 64 20 64 6f 63  ages to load doc
267e0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  list */.  int iC
267f0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
26800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26810 20 63 6f 6c 75 6d 6e 20 74 68 65 20 74 6f 6b 65   column the toke
26820 6e 20 6d 75 73 74 20 6d 61 74 63 68 20 2a 2f 0a  n must match */.
26830 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
26840 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
26850 74 6f 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 61  to populate an a
26860 6c 6c 6f 63 61 74 65 64 20 46 74 73 33 54 6f 6b  llocated Fts3Tok
26870 65 6e 41 6e 64 43 6f 73 74 20 61 72 72 61 79 2e  enAndCost array.
26880 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
26890 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
268a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
268b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
268c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
268d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
268e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
268f0 72 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 2c 20  ring execution, 
26900 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
26910 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  n.** SQLite erro
26920 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26930 63 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c 54  c void fts3EvalT
26940 6f 6b 65 6e 43 6f 73 74 73 28 0a 20 20 46 74 73  okenCosts(.  Fts
26950 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  3Cursor *pCsr,  
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26970 46 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c  FTS Cursor handl
26980 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  e */.  Fts3Expr 
26990 2a 70 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  *pRoot,         
269a0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 6f         /* Root o
269b0 66 20 63 75 72 72 65 6e 74 20 41 4e 44 2f 4e 45  f current AND/NE
269c0 41 52 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20  AR cluster */.  
269d0 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
26a00 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20 46   consider */.  F
26a10 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20  ts3TokenAndCost 
26a20 2a 2a 70 70 54 43 2c 20 20 20 20 20 20 20 20 2f  **ppTC,        /
26a30 2a 20 57 72 69 74 65 20 6e 65 77 20 65 6e 74 72  * Write new entr
26a40 69 65 73 20 74 6f 20 2a 28 2a 70 70 54 43 29 2b  ies to *(*ppTC)+
26a50 2b 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20  + */.  Fts3Expr 
26a60 2a 2a 2a 70 70 4f 72 2c 20 20 20 20 20 20 20 20  ***ppOr,        
26a70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
26a80 6e 65 77 20 4f 52 20 72 6f 6f 74 20 74 6f 20 2a  new OR root to *
26a90 28 2a 70 70 4f 72 29 2b 2b 20 2a 2f 0a 20 20 69  (*ppOr)++ */.  i
26aa0 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ac0 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
26ad0 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  code */.){.  if(
26ae0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
26af0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
26b00 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
26b10 52 59 5f 50 48 52 41 53 45 20 29 7b 0a 20 20 20  RY_PHRASE ){.   
26b20 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70     Fts3Phrase *p
26b30 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e  Phrase = pExpr->
26b40 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 69  pPhrase;.      i
26b50 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
26b60 69 3d 30 3b 20 2a 70 52 63 3d 3d 53 51 4c 49 54  i=0; *pRc==SQLIT
26b70 45 5f 4f 4b 20 26 26 20 69 3c 70 50 68 72 61 73  E_OK && i<pPhras
26b80 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b  e->nToken; i++){
26b90 0a 20 20 20 20 20 20 20 20 46 74 73 33 54 6f 6b  .        Fts3Tok
26ba0 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d  enAndCost *pTC =
26bb0 20 28 2a 70 70 54 43 29 2b 2b 3b 0a 20 20 20 20   (*ppTC)++;.    
26bc0 20 20 20 20 70 54 43 2d 3e 70 50 68 72 61 73 65      pTC->pPhrase
26bd0 20 3d 20 70 50 68 72 61 73 65 3b 0a 20 20 20 20   = pPhrase;.    
26be0 20 20 20 20 70 54 43 2d 3e 69 54 6f 6b 65 6e 20      pTC->iToken 
26bf0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 54 43  = i;.        pTC
26c00 2d 3e 70 52 6f 6f 74 20 3d 20 70 52 6f 6f 74 3b  ->pRoot = pRoot;
26c10 0a 20 20 20 20 20 20 20 20 70 54 43 2d 3e 70 54  .        pTC->pT
26c20 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61 73 65 2d  oken = &pPhrase-
26c30 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20  >aToken[i];.    
26c40 20 20 20 20 70 54 43 2d 3e 69 43 6f 6c 20 3d 20      pTC->iCol = 
26c50 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e  pPhrase->iColumn
26c60 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  ;.        *pRc =
26c70 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 4f   sqlite3Fts3MsrO
26c80 76 66 6c 28 70 43 73 72 2c 20 70 54 43 2d 3e 70  vfl(pCsr, pTC->p
26c90 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 2c 20  Token->pSegcsr, 
26ca0 26 70 54 43 2d 3e 6e 4f 76 66 6c 29 3b 0a 20 20  &pTC->nOvfl);.  
26cb0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
26cc0 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65  if( pExpr->eType
26cd0 21 3d 46 54 53 51 55 45 52 59 5f 4e 4f 54 20 29  !=FTSQUERY_NOT )
26ce0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26cf0 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
26d00 53 51 55 45 52 59 5f 4f 52 0a 20 20 20 20 20 20  SQUERY_OR.      
26d10 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 65       || pExpr->e
26d20 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 41  Type==FTSQUERY_A
26d30 4e 44 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ND.           ||
26d40 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46   pExpr->eType==F
26d50 54 53 51 55 45 52 59 5f 4e 45 41 52 0a 20 20 20  TSQUERY_NEAR.   
26d60 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
26d70 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
26d80 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
26d90 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
26da0 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
26db0 51 55 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20  QUERY_OR ){.    
26dc0 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 45 78 70      pRoot = pExp
26dd0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
26de0 20 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74    **ppOr = pRoot
26df0 3b 0a 20 20 20 20 20 20 20 20 28 2a 70 70 4f 72  ;.        (*ppOr
26e00 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )++;.      }.   
26e10 20 20 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e     fts3EvalToken
26e20 43 6f 73 74 73 28 70 43 73 72 2c 20 70 52 6f 6f  Costs(pCsr, pRoo
26e30 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  t, pExpr->pLeft,
26e40 20 70 70 54 43 2c 20 70 70 4f 72 2c 20 70 52 63   ppTC, ppOr, pRc
26e50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
26e60 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55  pr->eType==FTSQU
26e70 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  ERY_OR ){.      
26e80 20 20 70 52 6f 6f 74 20 3d 20 70 45 78 70 72 2d    pRoot = pExpr-
26e90 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
26ea0 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f 6f 74 3b   **ppOr = pRoot;
26eb0 0a 20 20 20 20 20 20 20 20 28 2a 70 70 4f 72 29  .        (*ppOr)
26ec0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
26ed0 20 20 66 74 73 33 45 76 61 6c 54 6f 6b 65 6e 43    fts3EvalTokenC
26ee0 6f 73 74 73 28 70 43 73 72 2c 20 70 52 6f 6f 74  osts(pCsr, pRoot
26ef0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
26f00 20 70 70 54 43 2c 20 70 70 4f 72 2c 20 70 52 63   ppTC, ppOr, pRc
26f10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
26f20 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
26f30 74 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75  the average docu
26f40 6d 65 6e 74 20 28 72 6f 77 29 20 73 69 7a 65 20  ment (row) size 
26f50 69 6e 20 70 61 67 65 73 2e 20 49 66 20 73 75 63  in pages. If suc
26f60 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 77 72 69 74  cessful,.** writ
26f70 65 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20  e this value to 
26f80 2a 70 6e 50 61 67 65 20 61 6e 64 20 72 65 74 75  *pnPage and retu
26f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
26fa0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 0a  herwise, return.
26fb0 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
26fc0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  or code..**.** T
26fd0 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d  he average docum
26fe0 65 6e 74 20 73 69 7a 65 20 69 6e 20 70 61 67 65  ent size in page
26ff0 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  s is calculated 
27000 62 79 20 66 69 72 73 74 20 63 61 6c 63 75 6c 61  by first calcula
27010 74 69 6e 67 20 0a 2a 2a 20 64 65 74 65 72 6d 69  ting .** determi
27020 6e 69 6e 67 20 74 68 65 20 61 76 65 72 61 67 65  ning the average
27030 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2c 20   size in bytes, 
27040 42 2e 20 49 66 20 42 20 69 73 20 6c 65 73 73 20  B. If B is less 
27050 74 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  than the amount.
27060 2a 2a 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ** of data that 
27070 77 69 6c 6c 20 66 69 74 20 6f 6e 20 61 20 73 69  will fit on a si
27080 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 20 6f  ngle leaf page o
27090 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  f an intkey tabl
270a0 65 20 69 6e 0a 2a 2a 20 74 68 69 73 20 64 61 74  e in.** this dat
270b0 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
270c0 61 76 65 72 61 67 65 20 64 6f 63 73 69 7a 65 20  average docsize 
270d0 69 73 20 31 2e 20 4f 74 68 65 72 77 69 73 65 2c  is 1. Otherwise,
270e0 20 69 74 20 69 73 20 31 20 70 6c 75 73 0a 2a 2a   it is 1 plus.**
270f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
27100 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 63 6f  verflow pages co
27110 6e 73 75 6d 65 64 20 62 79 20 61 20 72 65 63 6f  nsumed by a reco
27120 72 64 20 42 20 62 79 74 65 73 20 69 6e 20 73 69  rd B bytes in si
27130 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
27140 74 20 66 74 73 33 45 76 61 6c 41 76 65 72 61 67  t fts3EvalAverag
27150 65 44 6f 63 73 69 7a 65 28 46 74 73 33 43 75 72  eDocsize(Fts3Cur
27160 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a  sor *pCsr, int *
27170 70 6e 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  pnPage){.  if( p
27180 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3d 3d 30 20  Csr->nRowAvg==0 
27190 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 76  ){.    /* The av
271a0 65 72 61 67 65 20 64 6f 63 75 6d 65 6e 74 20 73  erage document s
271b0 69 7a 65 2c 20 77 68 69 63 68 20 69 73 20 72 65  ize, which is re
271c0 71 75 69 72 65 64 20 74 6f 20 63 61 6c 63 75 6c  quired to calcul
271d0 61 74 65 20 74 68 65 20 63 6f 73 74 0a 20 20 20  ate the cost.   
271e0 20 2a 2a 20 6f 66 20 65 61 63 68 20 64 6f 63 6c   ** of each docl
271f0 69 73 74 2c 20 68 61 73 20 6e 6f 74 20 79 65 74  ist, has not yet
27200 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64   been determined
27210 2e 20 52 65 61 64 20 74 68 65 20 72 65 71 75 69  . Read the requi
27220 72 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  red .    ** data
27230 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74   from the %_stat
27240 20 74 61 62 6c 65 20 74 6f 20 63 61 6c 63 75 6c   table to calcul
27250 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ate it..    **. 
27260 20 20 20 2a 2a 20 45 6e 74 72 79 20 30 20 6f 66     ** Entry 0 of
27270 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c   the %_stat tabl
27280 65 20 69 73 20 61 20 62 6c 6f 62 20 63 6f 6e 74  e is a blob cont
27290 61 69 6e 69 6e 67 20 28 6e 43 6f 6c 2b 31 29 20  aining (nCol+1) 
272a0 46 54 53 33 20 0a 20 20 20 20 2a 2a 20 76 61 72  FTS3 .    ** var
272b0 69 6e 74 73 2c 20 77 68 65 72 65 20 6e 43 6f 6c  ints, where nCol
272c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
272d0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
272e0 20 46 54 53 33 20 74 61 62 6c 65 2e 0a 20 20 20   FTS3 table..   
272f0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61   ** The first va
27300 72 69 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  rint is the numb
27310 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20  er of documents 
27320 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
27330 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   in.    ** the t
27340 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
27350 69 6e 67 20 6e 43 6f 6c 20 76 61 72 69 6e 74 73  ing nCol varints
27360 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 6f 74   contain the tot
27370 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 0a 20 20 20  al amount of.   
27380 20 2a 2a 20 64 61 74 61 20 73 74 6f 72 65 64 20   ** data stored 
27390 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 65  in all rows of e
273a0 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ach column of th
273b0 65 20 74 61 62 6c 65 2c 20 66 72 6f 6d 20 6c 65  e table, from le
273c0 66 74 0a 20 20 20 20 2a 2a 20 74 6f 20 72 69 67  ft.    ** to rig
273d0 68 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ht..    */.    i
273e0 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 33 54  nt rc;.    Fts3T
273f0 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
27400 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73 65  able*)pCsr->base
27410 2e 70 56 74 61 62 3b 0a 20 20 20 20 73 71 6c 69  .pVtab;.    sqli
27420 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
27430 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
27440 36 34 20 6e 44 6f 63 20 3d 20 30 3b 0a 20 20 20  64 nDoc = 0;.   
27450 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
27460 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f  Byte = 0;.    co
27470 6e 73 74 20 63 68 61 72 20 2a 70 45 6e 64 3b 0a  nst char *pEnd;.
27480 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27490 61 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  a;..    rc = sql
274a0 69 74 65 33 46 74 73 33 53 65 6c 65 63 74 44 6f  ite3Fts3SelectDo
274b0 63 74 6f 74 61 6c 28 70 2c 20 26 70 53 74 6d 74  ctotal(p, &pStmt
274c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
274d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
274e0 6e 20 72 63 3b 0a 20 20 20 20 61 20 3d 20 73 71  n rc;.    a = sq
274f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
27500 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  b(pStmt, 0);.   
27510 20 61 73 73 65 72 74 28 20 61 20 29 3b 0a 0a 20   assert( a );.. 
27520 20 20 20 70 45 6e 64 20 3d 20 26 61 5b 73 71 6c     pEnd = &a[sql
27530 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
27540 73 28 70 53 74 6d 74 2c 20 30 29 5d 3b 0a 20 20  s(pStmt, 0)];.  
27550 20 20 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    a += sqlite3Ft
27560 73 33 47 65 74 56 61 72 69 6e 74 28 61 2c 20 26  s3GetVarint(a, &
27570 6e 44 6f 63 29 3b 0a 20 20 20 20 77 68 69 6c 65  nDoc);.    while
27580 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ( a<pEnd ){.    
27590 20 20 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    a += sqlite3Ft
275a0 73 33 47 65 74 56 61 72 69 6e 74 28 61 2c 20 26  s3GetVarint(a, &
275b0 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
275c0 20 20 69 66 28 20 6e 44 6f 63 3d 3d 30 20 7c 7c    if( nDoc==0 ||
275d0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
275e0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
275f0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
27600 65 74 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50  eturn FTS_CORRUP
27610 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d 0a 0a 20  T_VTAB;.    }.. 
27620 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63 20 3d 20     pCsr->nDoc = 
27630 6e 44 6f 63 3b 0a 20 20 20 20 70 43 73 72 2d 3e  nDoc;.    pCsr->
27640 6e 52 6f 77 41 76 67 20 3d 20 28 69 6e 74 29 28  nRowAvg = (int)(
27650 28 28 6e 42 79 74 65 20 2f 20 6e 44 6f 63 29 20  ((nByte / nDoc) 
27660 2b 20 70 2d 3e 6e 50 67 73 7a 29 20 2f 20 70 2d  + p->nPgsz) / p-
27670 3e 6e 50 67 73 7a 29 3b 0a 20 20 20 20 61 73 73  >nPgsz);.    ass
27680 65 72 74 28 20 70 43 73 72 2d 3e 6e 52 6f 77 41  ert( pCsr->nRowA
27690 76 67 3e 30 20 29 3b 20 0a 20 20 20 20 72 63 20  vg>0 ); .    rc 
276a0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
276b0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
276c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
276d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
276e0 20 20 2a 70 6e 50 61 67 65 20 3d 20 70 43 73 72    *pnPage = pCsr
276f0 2d 3e 6e 52 6f 77 41 76 67 3b 0a 20 20 72 65 74  ->nRowAvg;.  ret
27700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27710 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27720 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27730 74 6f 20 73 65 6c 65 63 74 20 74 68 65 20 74 6f  to select the to
27740 6b 65 6e 73 20 28 69 66 20 61 6e 79 29 20 74 68  kens (if any) th
27750 61 74 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 64  at will be .** d
27760 65 66 65 72 72 65 64 2e 20 54 68 65 20 61 72 72  eferred. The arr
27770 61 79 20 61 54 43 5b 5d 20 68 61 73 20 61 6c 72  ay aTC[] has alr
27780 65 61 64 79 20 62 65 65 6e 20 70 6f 70 75 6c 61  eady been popula
27790 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 69 73  ted when this is
277a0 0a 2a 2a 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a  .** called..**.*
277b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
277c0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  is called once f
277d0 6f 72 20 65 61 63 68 20 41 4e 44 2f 4e 45 41 52  or each AND/NEAR
277e0 20 63 6c 75 73 74 65 72 20 69 6e 20 74 68 65 20   cluster in the 
277f0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
27800 45 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 20  Each invocation 
27810 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
27820 20 74 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65 72   tokens to defer
27830 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 63   within.** the c
27840 6c 75 73 74 65 72 20 77 69 74 68 20 72 6f 6f 74  luster with root
27850 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 20 53 65 65   node pRoot. See
27860 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
27870 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a  the definition.*
27880 2a 20 6f 66 20 73 74 72 75 63 74 20 46 74 73 33  * of struct Fts3
27890 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 66 6f 72  TokenAndCost for
278a0 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 2a   more details..*
278b0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
278c0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
278d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
278e0 6e 64 20 73 71 6c 69 74 65 33 46 74 73 33 44 65  nd sqlite3Fts3De
278f0 66 65 72 54 6f 6b 65 6e 28 29 0a 2a 2a 20 63 61  ferToken().** ca
27900 6c 6c 65 64 20 6f 6e 20 65 61 63 68 20 74 6f 6b  lled on each tok
27910 65 6e 20 74 6f 20 64 65 66 65 72 2e 20 4f 74 68  en to defer. Oth
27920 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74  erwise, an SQLit
27930 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a  e error code is.
27940 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
27950 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
27960 76 61 6c 53 65 6c 65 63 74 44 65 66 65 72 72 65  valSelectDeferre
27970 64 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  d(.  Fts3Cursor 
27980 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
27990 20 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73       /* FTS Curs
279a0 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46  or handle */.  F
279b0 74 73 33 45 78 70 72 20 2a 70 52 6f 6f 74 2c 20  ts3Expr *pRoot, 
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279d0 2a 20 43 6f 6e 73 69 64 65 72 20 74 6f 6b 65 6e  * Consider token
279e0 73 20 77 69 74 68 20 74 68 69 73 20 72 6f 6f 74  s with this root
279f0 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 54   node */.  Fts3T
27a00 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43  okenAndCost *aTC
27a10 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ,          /* Ar
27a20 72 61 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ray of expressio
27a30 6e 20 74 6f 6b 65 6e 73 20 61 6e 64 20 63 6f 73  n tokens and cos
27a40 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 43 20  ts */.  int nTC 
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27a70 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
27a80 61 54 43 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 46 74  aTC[] */.){.  Ft
27a90 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20  s3Table *pTab = 
27aa0 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73  (Fts3Table *)pCs
27ab0 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20  r->base.pVtab;. 
27ac0 20 69 6e 74 20 6e 44 6f 63 53 69 7a 65 20 3d 20   int nDocSize = 
27ad0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
27ae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
27af0 67 65 73 20 70 65 72 20 64 6f 63 20 6c 6f 61 64  ges per doc load
27b00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ed */.  int rc =
27b10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
27b20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27b30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
27b40 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
27b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27b60 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
27b70 20 66 6f 72 20 76 61 72 69 6f 75 73 20 70 75 72   for various pur
27b80 70 6f 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  poses */.  int n
27b90 4f 76 66 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Ovfl = 0;       
27ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
27bb0 74 61 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  tal overflow pag
27bc0 65 73 20 75 73 65 64 20 62 79 20 64 6f 63 6c 69  es used by docli
27bd0 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  sts */.  int nTo
27be0 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ken = 0;        
27bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
27c00 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  l number of toke
27c10 6e 73 20 69 6e 20 63 6c 75 73 74 65 72 20 2a 2f  ns in cluster */
27c20 0a 0a 20 20 69 6e 74 20 6e 4d 69 6e 45 73 74 20  ..  int nMinEst 
27c30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
27c40 20 20 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d      /* The minim
27c50 75 6d 20 63 6f 75 6e 74 20 66 6f 72 20 61 6e 79  um count for any
27c60 20 70 68 72 61 73 65 20 73 6f 20 66 61 72 2e 20   phrase so far. 
27c70 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 61 64 34 20  */.  int nLoad4 
27c80 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
27c90 20 20 20 20 20 2f 2a 20 28 50 68 72 61 73 65 73       /* (Phrases
27ca0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6c 6f   that will be lo
27cb0 61 64 65 64 29 5e 34 2e 20 2a 2f 0a 0a 20 20 2f  aded)^4. */..  /
27cc0 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6e 65 76  * Tokens are nev
27cd0 65 72 20 64 65 66 65 72 72 65 64 20 66 6f 72 20  er deferred for 
27ce0 46 54 53 20 74 61 62 6c 65 73 20 63 72 65 61 74  FTS tables creat
27cf0 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6e  ed using the con
27d00 74 65 6e 74 3d 78 78 78 0a 20 20 2a 2a 20 6f 70  tent=xxx.  ** op
27d10 74 69 6f 6e 2e 20 54 68 65 20 72 65 61 73 6f 6e  tion. The reason
27d20 20 62 65 69 6e 67 20 74 68 61 74 20 69 74 20 69   being that it i
27d30 73 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  s not guaranteed
27d40 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
27d50 74 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 63 74  t.  ** table act
27d60 75 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ually contains t
27d70 68 65 20 73 61 6d 65 20 64 61 74 61 20 61 73 20  he same data as 
27d80 74 68 65 20 69 6e 64 65 78 2e 20 54 6f 20 70 72  the index. To pr
27d90 65 76 65 6e 74 20 74 68 69 73 20 66 72 6f 6d 0a  event this from.
27da0 20 20 2a 2a 20 63 61 75 73 69 6e 67 20 61 6e 79    ** causing any
27db0 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68 65 20 64   problems, the d
27dc0 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 6f 70  eferred token op
27dd0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
27de0 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 64 69  mpletely.  ** di
27df0 73 61 62 6c 65 64 20 66 6f 72 20 63 6f 6e 74 65  sabled for conte
27e00 6e 74 3d 78 78 78 20 74 61 62 6c 65 73 2e 20 2a  nt=xxx tables. *
27e10 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 7a 43  /.  if( pTab->zC
27e20 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 20  ontentTbl ){.   
27e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e40 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75  K;.  }..  /* Cou
27e50 6e 74 20 74 68 65 20 74 6f 6b 65 6e 73 20 69 6e  nt the tokens in
27e60 20 74 68 69 73 20 41 4e 44 2f 4e 45 41 52 20 63   this AND/NEAR c
27e70 6c 75 73 74 65 72 2e 20 49 66 20 6e 6f 6e 65 20  luster. If none 
27e80 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 73 0a  of the doclists.
27e90 20 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20    ** associated 
27ea0 77 69 74 68 20 74 68 65 20 74 6f 6b 65 6e 73 20  with the tokens 
27eb0 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66  spill onto overf
27ec0 6c 6f 77 20 70 61 67 65 73 2c 20 6f 72 20 69 66  low pages, or if
27ed0 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
27ee0 6e 6c 79 20 31 20 74 6f 6b 65 6e 2c 20 65 78 69  nly 1 token, exi
27ef0 74 20 65 61 72 6c 79 2e 20 4e 6f 20 74 6f 6b 65  t early. No toke
27f00 6e 73 20 74 6f 20 64 65 66 65 72 20 69 6e 20 74  ns to defer in t
27f10 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 66  his case. */.  f
27f20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 43 3b  or(ii=0; ii<nTC;
27f30 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
27f40 61 54 43 5b 69 69 5d 2e 70 52 6f 6f 74 3d 3d 70  aTC[ii].pRoot==p
27f50 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 4f  Root ){.      nO
27f60 76 66 6c 20 2b 3d 20 61 54 43 5b 69 69 5d 2e 6e  vfl += aTC[ii].n
27f70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 6e 54 6f 6b  Ovfl;.      nTok
27f80 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  en++;.    }.  }.
27f90 20 20 69 66 28 20 6e 4f 76 66 6c 3d 3d 30 20 7c    if( nOvfl==0 |
27fa0 7c 20 6e 54 6f 6b 65 6e 3c 32 20 29 20 72 65 74  | nToken<2 ) ret
27fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
27fc0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
27fd0 61 76 65 72 61 67 65 20 64 6f 63 73 69 7a 65 20  average docsize 
27fe0 28 69 6e 20 70 61 67 65 73 29 2e 20 2a 2f 0a 20  (in pages). */. 
27ff0 20 72 63 20 3d 20 66 74 73 33 45 76 61 6c 41 76   rc = fts3EvalAv
28000 65 72 61 67 65 44 6f 63 73 69 7a 65 28 70 43 73  erageDocsize(pCs
28010 72 2c 20 26 6e 44 6f 63 53 69 7a 65 29 3b 0a 20  r, &nDocSize);. 
28020 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
28030 49 54 45 5f 4f 4b 20 7c 7c 20 6e 44 6f 63 53 69  ITE_OK || nDocSi
28040 7a 65 3e 30 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49  ze>0 );...  /* I
28050 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
28060 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 69  ll tokens in thi
28070 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c 75 73 74  s AND/NEAR clust
28080 65 72 2c 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  er, in ascending
28090 20 6f 72 64 65 72 20 0a 20 20 2a 2a 20 6f 66 20   order .  ** of 
280a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76  the number of ov
280b0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
280c0 74 20 77 69 6c 6c 20 62 65 20 6c 6f 61 64 65 64  t will be loaded
280d0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 6c 61   by the pager la
280e0 79 65 72 20 0a 20 20 2a 2a 20 74 6f 20 72 65 74  yer .  ** to ret
280f0 72 69 65 76 65 20 74 68 65 20 65 6e 74 69 72 65  rieve the entire
28100 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
28110 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 74 68 65 20   token from the 
28120 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e  full-text index.
28130 0a 20 20 2a 2a 20 4c 6f 61 64 20 74 68 65 20 64  .  ** Load the d
28140 6f 63 6c 69 73 74 73 20 66 6f 72 20 74 6f 6b 65  oclists for toke
28150 6e 73 20 74 68 61 74 20 61 72 65 20 65 69 74 68  ns that are eith
28160 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  er:.  **.  **   
28170 61 2e 20 54 68 65 20 63 68 65 61 70 65 73 74 20  a. The cheapest 
28180 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 6e 74  token in the ent
28190 69 72 65 20 71 75 65 72 79 20 28 69 2e 65 2e 20  ire query (i.e. 
281a0 74 68 65 20 6f 6e 65 20 76 69 73 69 74 65 64 20  the one visited 
281b0 62 79 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  by the.  **     
281c0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
281d0 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 29 2c 20   of this loop), 
281e0 6f 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 62  or.  **.  **   b
281f0 2e 20 50 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  . Part of a mult
28200 69 2d 74 6f 6b 65 6e 20 70 68 72 61 73 65 2e 0a  i-token phrase..
28210 20 20 2a 2a 0a 20 20 2a 2a 20 41 66 74 65 72 20    **.  ** After 
28220 65 61 63 68 20 74 6f 6b 65 6e 20 64 6f 63 6c 69  each token docli
28230 73 74 20 69 73 20 6c 6f 61 64 65 64 2c 20 6d 65  st is loaded, me
28240 72 67 65 20 69 74 20 77 69 74 68 20 74 68 65 20  rge it with the 
28250 6f 74 68 65 72 73 20 66 72 6f 6d 20 74 68 65 0a  others from the.
28260 20 20 2a 2a 20 73 61 6d 65 20 70 68 72 61 73 65    ** same phrase
28270 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 20 6e   and count the n
28280 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
28290 74 73 20 74 68 61 74 20 74 68 65 20 6d 65 72 67  ts that the merg
282a0 65 64 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  ed doclist.  ** 
282b0 63 6f 6e 74 61 69 6e 73 2e 20 53 65 74 20 76 61  contains. Set va
282c0 72 69 61 62 6c 65 20 22 6e 4d 69 6e 45 73 74 22  riable "nMinEst"
282d0 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
282e0 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d   number of docum
282f0 65 6e 74 73 20 69 6e 20 0a 20 20 2a 2a 20 61 6e  ents in .  ** an
28300 79 20 70 68 72 61 73 65 20 64 6f 63 6c 69 73 74  y phrase doclist
28310 20 66 6f 72 20 77 68 69 63 68 20 31 20 6f 72 20   for which 1 or 
28320 6d 6f 72 65 20 74 6f 6b 65 6e 20 64 6f 63 6c 69  more token docli
28330 73 74 73 20 68 61 76 65 20 62 65 65 6e 20 6c 6f  sts have been lo
28340 61 64 65 64 2e 0a 20 20 2a 2a 20 4c 65 74 20 6e  aded..  ** Let n
28350 4f 74 68 65 72 20 62 65 20 74 68 65 20 6e 75 6d  Other be the num
28360 62 65 72 20 6f 66 20 6f 74 68 65 72 20 70 68 72  ber of other phr
28370 61 73 65 73 20 66 6f 72 20 77 68 69 63 68 20 69  ases for which i
28380 74 20 69 73 20 63 65 72 74 61 69 6e 20 74 68 61  t is certain tha
28390 74 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  t.  ** one or mo
283a0 72 65 20 74 6f 6b 65 6e 73 20 77 69 6c 6c 20 6e  re tokens will n
283b0 6f 74 20 62 65 20 64 65 66 65 72 72 65 64 2e 0a  ot be deferred..
283c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 2c 20    **.  ** Then, 
283d0 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 2c 20  for each token, 
283e0 64 65 66 65 72 20 69 74 20 69 66 20 6c 6f 61 64  defer it if load
283f0 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ing the doclist 
28400 77 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 0a  would result in.
28410 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 4e 20 6f    ** loading N o
28420 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
28430 70 61 67 65 73 20 69 6e 74 6f 20 6d 65 6d 6f 72  pages into memor
28440 79 2c 20 77 68 65 72 65 20 4e 20 69 73 20 63 6f  y, where N is co
28450 6d 70 75 74 65 64 20 61 73 3a 0a 20 20 2a 2a 0a  mputed as:.  **.
28460 20 20 2a 2a 20 20 20 20 28 6e 4d 69 6e 45 73 74    **    (nMinEst
28470 20 2b 20 34 5e 6e 4f 74 68 65 72 20 2d 20 31 29   + 4^nOther - 1)
28480 20 2f 20 28 34 5e 6e 4f 74 68 65 72 29 0a 20 20   / (4^nOther).  
28490 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
284a0 69 3c 6e 54 6f 6b 65 6e 20 26 26 20 72 63 3d 3d  i<nToken && rc==
284b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
284c0 7b 0a 20 20 20 20 69 6e 74 20 69 54 43 3b 20 20  {.    int iTC;  
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
284f0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
28500 54 43 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20  TC[] array. */. 
28510 20 20 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43     Fts3TokenAndC
28520 6f 73 74 20 2a 70 54 43 20 3d 20 30 3b 20 20 20  ost *pTC = 0;   
28530 20 2f 2a 20 53 65 74 20 74 6f 20 63 68 65 61 70   /* Set to cheap
28540 65 73 74 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  est remaining to
28550 6b 65 6e 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ken. */..    /* 
28560 53 65 74 20 70 54 43 20 74 6f 20 70 6f 69 6e 74  Set pTC to point
28570 20 74 6f 20 74 68 65 20 63 68 65 61 70 65 73 74   to the cheapest
28580 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 6b 65 6e   remaining token
28590 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 43  . */.    for(iTC
285a0 3d 30 3b 20 69 54 43 3c 6e 54 43 3b 20 69 54 43  =0; iTC<nTC; iTC
285b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
285c0 54 43 5b 69 54 43 5d 2e 70 54 6f 6b 65 6e 20 26  TC[iTC].pToken &
285d0 26 20 61 54 43 5b 69 54 43 5d 2e 70 52 6f 6f 74  & aTC[iTC].pRoot
285e0 3d 3d 70 52 6f 6f 74 20 0a 20 20 20 20 20 20 20  ==pRoot .       
285f0 26 26 20 28 21 70 54 43 20 7c 7c 20 61 54 43 5b  && (!pTC || aTC[
28600 69 54 43 5d 2e 6e 4f 76 66 6c 3c 70 54 43 2d 3e  iTC].nOvfl<pTC->
28610 6e 4f 76 66 6c 29 20 0a 20 20 20 20 20 20 29 7b  nOvfl) .      ){
28620 0a 20 20 20 20 20 20 20 20 70 54 43 20 3d 20 26  .        pTC = &
28630 61 54 43 5b 69 54 43 5d 3b 0a 20 20 20 20 20 20  aTC[iTC];.      
28640 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
28650 72 74 28 20 70 54 43 20 29 3b 0a 0a 20 20 20 20  rt( pTC );..    
28660 69 66 28 20 69 69 20 26 26 20 70 54 43 2d 3e 6e  if( ii && pTC->n
28670 4f 76 66 6c 3e 3d 28 28 6e 4d 69 6e 45 73 74 2b  Ovfl>=((nMinEst+
28680 28 6e 4c 6f 61 64 34 2f 34 29 2d 31 29 2f 28 6e  (nLoad4/4)-1)/(n
28690 4c 6f 61 64 34 2f 34 29 29 2a 6e 44 6f 63 53 69  Load4/4))*nDocSi
286a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ze ){.      /* T
286b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 76 65  he number of ove
286c0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 6f 20 6c  rflow pages to l
286d0 6f 61 64 20 66 6f 72 20 74 68 69 73 20 28 61 6e  oad for this (an
286e0 64 20 74 68 65 72 65 66 6f 72 65 20 61 6c 6c 0a  d therefore all.
286f0 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75        ** subsequ
28700 65 6e 74 29 20 74 6f 6b 65 6e 73 20 69 73 20 67  ent) tokens is g
28710 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
28720 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
28730 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 20   of pages .     
28740 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
28750 20 6c 6f 61 64 65 64 20 69 66 20 61 6c 6c 20 73   loaded if all s
28760 75 62 73 65 71 75 65 6e 74 20 74 6f 6b 65 6e 73  ubsequent tokens
28770 20 61 72 65 20 64 65 66 65 72 72 65 64 2e 0a 20   are deferred.. 
28780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 46 74       */.      Ft
28790 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70  s3PhraseToken *p
287a0 54 6f 6b 65 6e 20 3d 20 70 54 43 2d 3e 70 54 6f  Token = pTC->pTo
287b0 6b 65 6e 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ken;.      rc = 
287c0 73 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72  sqlite3Fts3Defer
287d0 54 6f 6b 65 6e 28 70 43 73 72 2c 20 70 54 6f 6b  Token(pCsr, pTok
287e0 65 6e 2c 20 70 54 43 2d 3e 69 43 6f 6c 29 3b 0a  en, pTC->iCol);.
287f0 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 61        fts3SegRea
28800 64 65 72 43 75 72 73 6f 72 46 72 65 65 28 70 54  derCursorFree(pT
28810 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 29 3b 0a  oken->pSegcsr);.
28820 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 53        pToken->pS
28830 65 67 63 73 72 20 3d 20 30 3b 0a 20 20 20 20 7d  egcsr = 0;.    }
28840 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
28850 65 74 20 6e 4c 6f 61 64 34 20 74 6f 20 74 68 65  et nLoad4 to the
28860 20 76 61 6c 75 65 20 6f 66 20 28 34 5e 6e 4f 74   value of (4^nOt
28870 68 65 72 29 20 66 6f 72 20 74 68 65 20 6e 65 78  her) for the nex
28880 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
28890 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 2d  he.      ** for-
288a0 6c 6f 6f 70 2e 20 45 78 63 65 70 74 2c 20 6c 69  loop. Except, li
288b0 6d 69 74 20 74 68 65 20 76 61 6c 75 65 20 74 6f  mit the value to
288c0 20 32 5e 32 34 20 74 6f 20 70 72 65 76 65 6e 74   2^24 to prevent
288d0 20 69 74 20 66 72 6f 6d 20 0a 20 20 20 20 20 20   it from .      
288e0 2a 2a 20 6f 76 65 72 66 6c 6f 77 69 6e 67 20 74  ** overflowing t
288f0 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  he 32-bit intege
28900 72 20 69 74 20 69 73 20 73 74 6f 72 65 64 20 69  r it is stored i
28910 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  n. */.      if( 
28920 69 69 3c 31 32 20 29 20 6e 4c 6f 61 64 34 20 3d  ii<12 ) nLoad4 =
28930 20 6e 4c 6f 61 64 34 2a 34 3b 0a 0a 20 20 20 20   nLoad4*4;..    
28940 20 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 28    if( ii==0 || (
28950 70 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54  pTC->pPhrase->nT
28960 6f 6b 65 6e 3e 31 20 26 26 20 69 69 21 3d 6e 54  oken>1 && ii!=nT
28970 6f 6b 65 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20  oken-1) ){.     
28980 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69     /* Either thi
28990 73 20 69 73 20 74 68 65 20 63 68 65 61 70 65 73  s is the cheapes
289a0 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65  t token in the e
289b0 6e 74 69 72 65 20 71 75 65 72 79 2c 20 6f 72 20  ntire query, or 
289c0 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
289d0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
289e0 2d 74 6f 6b 65 6e 20 70 68 72 61 73 65 2e 20 45  -token phrase. E
289f0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
28a00 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
28a10 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65  ll.        ** (e
28a20 76 65 6e 74 75 61 6c 6c 79 29 20 62 65 20 6c 6f  ventually) be lo
28a30 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
28a40 2e 20 49 74 20 6d 61 79 20 61 73 20 77 65 6c 6c  . It may as well
28a50 20 62 65 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20   be now. */.    
28a60 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
28a70 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 70 54  ken *pToken = pT
28a80 43 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  C->pToken;.     
28a90 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30     int nList = 0
28aa0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
28ab0 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
28ac0 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d     rc = fts3Term
28ad0 53 65 6c 65 63 74 28 70 54 61 62 2c 20 70 54 6f  Select(pTab, pTo
28ae0 6b 65 6e 2c 20 70 54 43 2d 3e 69 43 6f 6c 2c 20  ken, pTC->iCol, 
28af0 26 6e 4c 69 73 74 2c 20 26 70 4c 69 73 74 29 3b  &nList, &pList);
28b00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
28b20 7c 20 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  | pList==0 );.  
28b30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28b50 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76       rc = fts3Ev
28b60 61 6c 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b  alPhraseMergeTok
28b70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
28b80 20 20 70 54 61 62 2c 20 70 54 43 2d 3e 70 50 68    pTab, pTC->pPh
28b90 72 61 73 65 2c 20 70 54 43 2d 3e 69 54 6f 6b 65  rase, pTC->iToke
28ba0 6e 2c 70 4c 69 73 74 2c 6e 4c 69 73 74 0a 20 20  n,pList,nList.  
28bb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28be0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
28bf0 6e 43 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20  nCount;.        
28c00 20 20 6e 43 6f 75 6e 74 20 3d 20 66 74 73 33 44    nCount = fts3D
28c10 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f 63 69 64  oclistCountDocid
28c20 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s(.             
28c30 20 70 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 64   pTC->pPhrase->d
28c40 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c 20 70 54 43  oclist.aAll, pTC
28c50 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  ->pPhrase->docli
28c60 73 74 2e 6e 41 6c 6c 0a 20 20 20 20 20 20 20 20  st.nAll.        
28c70 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
28c80 66 28 20 69 69 3d 3d 30 20 7c 7c 20 6e 43 6f 75  f( ii==0 || nCou
28c90 6e 74 3c 6e 4d 69 6e 45 73 74 20 29 20 6e 4d 69  nt<nMinEst ) nMi
28ca0 6e 45 73 74 20 3d 20 6e 43 6f 75 6e 74 3b 0a 20  nEst = nCount;. 
28cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28cc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 43 2d 3e  .    }.    pTC->
28cd0 70 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  pToken = 0;.  }.
28ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28cf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
28d00 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
28d10 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 78  rom within the x
28d20 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e 20 49  Filter method. I
28d30 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a  t initializes.**
28d40 20 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 71   the full-text q
28d50 75 65 72 79 20 63 75 72 72 65 6e 74 6c 79 20 73  uery currently s
28d60 74 6f 72 65 64 20 69 6e 20 70 43 73 72 2d 3e 70  tored in pCsr->p
28d70 45 78 70 72 2e 20 54 6f 20 69 74 65 72 61 74 65  Expr. To iterate
28d80 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20   through.** the 
28d90 72 65 73 75 6c 74 73 20 6f 66 20 61 20 71 75 65  results of a que
28da0 72 79 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 64  ry, the caller d
28db0 6f 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 74  oes:.**.**    ft
28dc0 73 33 45 76 61 6c 53 74 61 72 74 28 70 43 73 72  s3EvalStart(pCsr
28dd0 29 3b 0a 2a 2a 20 20 20 20 77 68 69 6c 65 28 20  );.**    while( 
28de0 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 66 74 73  1 ){.**      fts
28df0 33 45 76 61 6c 4e 65 78 74 28 70 43 73 72 29 3b  3EvalNext(pCsr);
28e00 0a 2a 2a 20 20 20 20 20 20 69 66 28 20 70 43 73  .**      if( pCs
28e10 72 2d 3e 62 45 6f 66 20 29 20 62 72 65 61 6b 3b  r->bEof ) break;
28e20 0a 2a 2a 20 20 20 20 20 20 2e 2e 2e 20 72 65 74  .**      ... ret
28e30 75 72 6e 20 72 6f 77 20 70 43 73 72 2d 3e 69 50  urn row pCsr->iP
28e40 72 65 76 49 64 20 74 6f 20 74 68 65 20 63 61 6c  revId to the cal
28e50 6c 65 72 20 2e 2e 2e 0a 2a 2a 20 20 20 20 7d 0a  ler ....**    }.
28e60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
28e70 73 33 45 76 61 6c 53 74 61 72 74 28 46 74 73 33  s3EvalStart(Fts3
28e80 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
28e90 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
28ea0 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
28eb0 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
28ec0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28ed0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
28ee0 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oken = 0;.  int 
28ef0 6e 4f 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41  nOr = 0;..  /* A
28f00 6c 6c 6f 63 61 74 65 20 61 20 4d 75 6c 74 69 53  llocate a MultiS
28f10 65 67 52 65 61 64 65 72 20 66 6f 72 20 65 61 63  egReader for eac
28f20 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65  h token in the e
28f30 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
28f40 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74 65  fts3EvalAllocate
28f50 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70 43  Readers(pCsr, pC
28f60 73 72 2d 3e 70 45 78 70 72 2c 20 26 6e 54 6f 6b  sr->pExpr, &nTok
28f70 65 6e 2c 20 26 6e 4f 72 2c 20 26 72 63 29 3b 0a  en, &nOr, &rc);.
28f80 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
28f90 77 68 69 63 68 2c 20 69 66 20 61 6e 79 2c 20 74  which, if any, t
28fa0 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 65 78 70  okens in the exp
28fb0 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  ression should b
28fc0 65 20 64 65 66 65 72 72 65 64 2e 20 2a 2f 0a 23  e deferred. */.#
28fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
28fe0 53 41 42 4c 45 5f 46 54 53 34 5f 44 45 46 45 52  SABLE_FTS4_DEFER
28ff0 52 45 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  RED.  if( rc==SQ
29000 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 54 6f 6b 65  LITE_OK && nToke
29010 6e 3e 31 20 26 26 20 70 54 61 62 2d 3e 62 46 74  n>1 && pTab->bFt
29020 73 34 20 29 7b 0a 20 20 20 20 46 74 73 33 54 6f  s4 ){.    Fts3To
29030 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 61 54 43 3b  kenAndCost *aTC;
29040 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 2a  .    Fts3Expr **
29050 61 70 4f 72 3b 0a 20 20 20 20 61 54 43 20 3d 20  apOr;.    aTC = 
29060 28 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73  (Fts3TokenAndCos
29070 74 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t *)sqlite3_mall
29080 6f 63 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65  oc(.        size
29090 6f 66 28 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43  of(Fts3TokenAndC
290a0 6f 73 74 29 20 2a 20 6e 54 6f 6b 65 6e 0a 20 20  ost) * nToken.  
290b0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 46 74 73      + sizeof(Fts
290c0 33 45 78 70 72 20 2a 29 20 2a 20 6e 4f 72 20 2a  3Expr *) * nOr *
290d0 20 32 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 70   2.    );.    ap
290e0 4f 72 20 3d 20 28 46 74 73 33 45 78 70 72 20 2a  Or = (Fts3Expr *
290f0 2a 29 26 61 54 43 5b 6e 54 6f 6b 65 6e 5d 3b 0a  *)&aTC[nToken];.
29100 0a 20 20 20 20 69 66 28 20 21 61 54 43 20 29 7b  .    if( !aTC ){
29110 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29120 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
29130 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
29140 69 3b 0a 20 20 20 20 20 20 46 74 73 33 54 6f 6b  i;.      Fts3Tok
29150 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d  enAndCost *pTC =
29160 20 61 54 43 3b 0a 20 20 20 20 20 20 46 74 73 33   aTC;.      Fts3
29170 45 78 70 72 20 2a 2a 70 70 4f 72 20 3d 20 61 70  Expr **ppOr = ap
29180 4f 72 3b 0a 0a 20 20 20 20 20 20 66 74 73 33 45  Or;..      fts3E
29190 76 61 6c 54 6f 6b 65 6e 43 6f 73 74 73 28 70 43  valTokenCosts(pC
291a0 73 72 2c 20 30 2c 20 70 43 73 72 2d 3e 70 45 78  sr, 0, pCsr->pEx
291b0 70 72 2c 20 26 70 54 43 2c 20 26 70 70 4f 72 2c  pr, &pTC, &ppOr,
291c0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 6e 54 6f   &rc);.      nTo
291d0 6b 65 6e 20 3d 20 28 69 6e 74 29 28 70 54 43 2d  ken = (int)(pTC-
291e0 61 54 43 29 3b 0a 20 20 20 20 20 20 6e 4f 72 20  aTC);.      nOr 
291f0 3d 20 28 69 6e 74 29 28 70 70 4f 72 2d 61 70 4f  = (int)(ppOr-apO
29200 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72  r);..      if( r
29210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29220 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
29230 33 45 76 61 6c 53 65 6c 65 63 74 44 65 66 65 72  3EvalSelectDefer
29240 72 65 64 28 70 43 73 72 2c 20 30 2c 20 61 54 43  red(pCsr, 0, aTC
29250 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  , nToken);.     
29260 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
29270 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
29280 3c 6e 4f 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <nOr; ii++){.   
29290 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33         rc = fts3
292a0 45 76 61 6c 53 65 6c 65 63 74 44 65 66 65 72 72  EvalSelectDeferr
292b0 65 64 28 70 43 73 72 2c 20 61 70 4f 72 5b 69 69  ed(pCsr, apOr[ii
292c0 5d 2c 20 61 54 43 2c 20 6e 54 6f 6b 65 6e 29 3b  ], aTC, nToken);
292d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
292e0 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
292f0 33 5f 66 72 65 65 28 61 54 43 29 3b 0a 20 20 20  3_free(aTC);.   
29300 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
29310 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 52 65   fts3EvalStartRe
29320 61 64 65 72 73 28 70 43 73 72 2c 20 70 43 73 72  aders(pCsr, pCsr
29330 2d 3e 70 45 78 70 72 2c 20 26 72 63 29 3b 0a 20  ->pExpr, &rc);. 
29340 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29350 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
29360 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
29370 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 70 68  tion list for ph
29380 72 61 73 65 20 70 50 68 72 61 73 65 2e 0a 2a 2f  rase pPhrase..*/
29390 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
293a0 33 45 76 61 6c 49 6e 76 61 6c 69 64 61 74 65 50  3EvalInvalidateP
293b0 6f 73 6c 69 73 74 28 46 74 73 33 50 68 72 61 73  oslist(Fts3Phras
293c0 65 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69  e *pPhrase){.  i
293d0 66 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  f( pPhrase->docl
293e0 69 73 74 2e 62 46 72 65 65 4c 69 73 74 20 29 7b  ist.bFreeList ){
293f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29400 65 28 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  e(pPhrase->docli
29410 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20  st.pList);.  }. 
29420 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
29430 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70  t.pList = 0;.  p
29440 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
29450 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 70 50 68  nList = 0;.  pPh
29460 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46  rase->doclist.bF
29470 72 65 65 4c 69 73 74 20 3d 20 30 3b 0a 7d 0a 0a  reeList = 0;.}..
29480 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
29490 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
294a0 20 65 64 69 74 20 74 68 65 20 70 6f 73 69 74 69   edit the positi
294b0 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63 69 61 74  on list associat
294c0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 70  ed with.** the p
294d0 68 72 61 73 65 20 6f 62 6a 65 63 74 20 70 61 73  hrase object pas
294e0 73 65 64 20 61 73 20 74 68 65 20 66 69 66 74 68  sed as the fifth
294f0 20 61 72 67 75 6d 65 6e 74 20 61 63 63 6f 72 64   argument accord
29500 69 6e 67 20 74 6f 20 61 20 4e 45 41 52 0a 2a 2a  ing to a NEAR.**
29510 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 46 6f 72 20   condition. For 
29520 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
29530 20 20 20 61 62 63 20 4e 45 41 52 2f 35 20 22 64     abc NEAR/5 "d
29540 65 66 20 67 68 69 22 0a 2a 2a 0a 2a 2a 20 50 61  ef ghi".**.** Pa
29550 72 61 6d 65 74 65 72 20 6e 4e 65 61 72 20 69 73  rameter nNear is
29560 20 70 61 73 73 65 64 20 74 68 65 20 4e 45 41 52   passed the NEAR
29570 20 64 69 73 74 61 6e 63 65 20 6f 66 20 74 68 65   distance of the
29580 20 65 78 70 72 65 73 73 69 6f 6e 20 28 35 20 69   expression (5 i
29590 6e 0a 2a 2a 20 74 68 65 20 65 78 61 6d 70 6c 65  n.** the example
295a0 20 61 62 6f 76 65 29 2e 20 57 68 65 6e 20 74 68   above). When th
295b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
295c0 61 6c 6c 65 64 2c 20 2a 70 61 50 6f 73 6c 69 73  alled, *paPoslis
295d0 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
295e0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
295f0 2c 20 61 6e 64 20 2a 70 6e 54 6f 6b 65 6e 20 69  , and *pnToken i
29600 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
29610 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 20 69 6e  phrase tokens in
29620 2c 20 74 68 65 0a 2a 2a 20 70 68 72 61 73 65 20  , the.** phrase 
29630 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
29640 65 20 6f 66 20 74 68 65 20 4e 45 41 52 20 6f 70  e of the NEAR op
29650 65 72 61 74 6f 72 20 74 6f 20 70 50 68 72 61 73  erator to pPhras
29660 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  e. For example,.
29670 2a 2a 20 69 66 20 70 50 68 72 61 73 65 20 72 65  ** if pPhrase re
29680 66 65 72 73 20 74 6f 20 74 68 65 20 22 64 65 66  fers to the "def
29690 20 67 68 69 22 20 70 68 72 61 73 65 2c 20 74 68   ghi" phrase, th
296a0 65 6e 20 2a 70 61 50 6f 73 6c 69 73 74 20 70 6f  en *paPoslist po
296b0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 70  ints to.** the p
296c0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 61 73 73  osition list ass
296d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 68 72  ociated with phr
296e0 61 73 65 20 22 61 62 63 22 2e 0a 2a 2a 0a 2a 2a  ase "abc"..**.**
296f0 20 41 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69   All positions i
29700 6e 20 74 68 65 20 70 50 68 72 61 73 65 20 70 6f  n the pPhrase po
29710 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74  sition list that
29720 20 61 72 65 20 6e 6f 74 20 73 75 66 66 69 63 69   are not suffici
29730 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73 65 20 74  ently.** close t
29740 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  o a position in 
29750 74 68 65 20 2a 70 61 50 6f 73 6c 69 73 74 20 70  the *paPoslist p
29760 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 61 72 65  osition list are
29770 20 72 65 6d 6f 76 65 64 2e 20 49 66 20 74 68 69   removed. If thi
29780 73 0a 2a 2a 20 6c 65 61 76 65 73 20 30 20 70 6f  s.** leaves 0 po
29790 73 69 74 69 6f 6e 73 2c 20 7a 65 72 6f 20 69 73  sitions, zero is
297a0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
297b0 77 69 73 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  wise, non-zero..
297c0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
297d0 75 72 6e 69 6e 67 2c 20 2a 70 61 50 6f 73 6c 69  urning, *paPosli
297e0 73 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  st is set to poi
297f0 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  nt to the positi
29800 6f 6e 20 6c 73 69 74 20 0a 2a 2a 20 61 73 73 6f  on lsit .** asso
29810 63 69 61 74 65 64 20 77 69 74 68 20 70 50 68 72  ciated with pPhr
29820 61 73 65 2e 20 41 6e 64 20 2a 70 6e 54 6f 6b 65  ase. And *pnToke
29830 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
29840 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
29850 20 69 6e 0a 2a 2a 20 70 50 68 72 61 73 65 2e 0a   in.** pPhrase..
29860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
29870 73 33 45 76 61 6c 4e 65 61 72 54 72 69 6d 28 0a  s3EvalNearTrim(.
29880 20 20 69 6e 74 20 6e 4e 65 61 72 2c 20 20 20 20    int nNear,    
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298a0 20 20 2f 2a 20 4e 45 41 52 20 64 69 73 74 61 6e    /* NEAR distan
298b0 63 65 2e 20 41 73 20 69 6e 20 22 4e 45 41 52 2f  ce. As in "NEAR/
298c0 6e 4e 65 61 72 22 2e 20 2a 2f 0a 20 20 63 68 61  nNear". */.  cha
298d0 72 20 2a 61 54 6d 70 2c 20 20 20 20 20 20 20 20  r *aTmp,        
298e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
298f0 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
29900 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  to use */.  char
29910 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c 20 20 20   **paPoslist,   
29920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
29930 4e 2f 4f 55 54 3a 20 50 6f 73 69 74 69 6f 6e 20  N/OUT: Position 
29940 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  list */.  int *p
29950 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
29960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
29970 4f 55 54 3a 20 54 6f 6b 65 6e 73 20 69 6e 20 70  OUT: Tokens in p
29980 68 72 61 73 65 20 6f 66 20 2a 70 61 50 6f 73 6c  hrase of *paPosl
29990 69 73 74 20 2a 2f 0a 20 20 46 74 73 33 50 68 72  ist */.  Fts3Phr
299a0 61 73 65 20 2a 70 50 68 72 61 73 65 20 20 20 20  ase *pPhrase    
299b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
299c0 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20 74 6f  phrase object to
299d0 20 74 72 69 6d 20 74 68 65 20 64 6f 63 6c 69 73   trim the doclis
299e0 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  t of */.){.  int
299f0 20 6e 50 61 72 61 6d 31 20 3d 20 6e 4e 65 61 72   nParam1 = nNear
29a00 20 2b 20 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b   + pPhrase->nTok
29a10 65 6e 3b 0a 20 20 69 6e 74 20 6e 50 61 72 61 6d  en;.  int nParam
29a20 32 20 3d 20 6e 4e 65 61 72 20 2b 20 2a 70 6e 54  2 = nNear + *pnT
29a30 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 4e 65 77  oken;.  int nNew
29a40 3b 0a 20 20 63 68 61 72 20 2a 70 32 3b 20 0a 20  ;.  char *p2; . 
29a50 20 63 68 61 72 20 2a 70 4f 75 74 3b 20 0a 20 20   char *pOut; .  
29a60 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
29a70 72 74 28 20 70 50 68 72 61 73 65 2d 3e 64 6f 63  rt( pPhrase->doc
29a80 6c 69 73 74 2e 70 4c 69 73 74 20 29 3b 0a 0a 20  list.pList );.. 
29a90 20 70 32 20 3d 20 70 4f 75 74 20 3d 20 70 50 68   p2 = pOut = pPh
29aa0 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
29ab0 69 73 74 3b 0a 20 20 72 65 73 20 3d 20 66 74 73  ist;.  res = fts
29ac0 33 50 6f 73 6c 69 73 74 4e 65 61 72 4d 65 72 67  3PoslistNearMerg
29ad0 65 28 0a 20 20 20 20 26 70 4f 75 74 2c 20 61 54  e(.    &pOut, aT
29ae0 6d 70 2c 20 6e 50 61 72 61 6d 31 2c 20 6e 50 61  mp, nParam1, nPa
29af0 72 61 6d 32 2c 20 70 61 50 6f 73 6c 69 73 74 2c  ram2, paPoslist,
29b00 20 26 70 32 0a 20 20 29 3b 0a 20 20 69 66 28 20   &p2.  );.  if( 
29b10 72 65 73 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20  res ){.    nNew 
29b20 3d 20 28 69 6e 74 29 28 70 4f 75 74 20 2d 20 70  = (int)(pOut - p
29b30 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
29b40 70 4c 69 73 74 29 20 2d 20 31 3b 0a 20 20 20 20  pList) - 1;.    
29b50 61 73 73 65 72 74 28 20 70 50 68 72 61 73 65 2d  assert( pPhrase-
29b60 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 5b 6e  >doclist.pList[n
29b70 4e 65 77 5d 3d 3d 27 5c 30 27 20 29 3b 0a 20 20  New]=='\0' );.  
29b80 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d    assert( nNew<=
29b90 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
29ba0 2e 6e 4c 69 73 74 20 26 26 20 6e 4e 65 77 3e 30  .nList && nNew>0
29bb0 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
29bc0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
29bd0 2e 70 4c 69 73 74 5b 6e 4e 65 77 5d 2c 20 30 2c  .pList[nNew], 0,
29be0 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
29bf0 74 2e 6e 4c 69 73 74 20 2d 20 6e 4e 65 77 29 3b  t.nList - nNew);
29c00 0a 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f  .    pPhrase->do
29c10 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20 6e 4e  clist.nList = nN
29c20 65 77 3b 0a 20 20 20 20 2a 70 61 50 6f 73 6c 69  ew;.    *paPosli
29c30 73 74 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f  st = pPhrase->do
29c40 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20  clist.pList;.   
29c50 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 70 50 68 72   *pnToken = pPhr
29c60 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a 20 20 7d  ase->nToken;.  }
29c70 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ..  return res;.
29c80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
29c90 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
29ca0 70 20 69 66 20 2a 70 52 63 20 69 73 20 6f 74 68  p if *pRc is oth
29cb0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29cc0 4b 20 77 68 65 6e 20 69 74 20 69 73 20 63 61 6c  K when it is cal
29cd0 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  led..** Otherwis
29ce0 65 2c 20 69 74 20 61 64 76 61 6e 63 65 73 20 74  e, it advances t
29cf0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
29d00 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
29d10 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  nd argument to.*
29d20 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  * point to the n
29d30 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
29d40 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29d50 2e 20 45 78 70 72 65 73 73 69 6f 6e 73 20 69 74  . Expressions it
29d60 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
29d70 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 73 20 69   matching rows i
29d80 6e 20 64 6f 63 69 64 20 6f 72 64 65 72 2e 20 41  n docid order. A
29d90 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 69  scending order i
29da0 66 20 46 74 73 33 43 75 72 73 6f 72 2e 62 44 65  f Fts3Cursor.bDe
29db0 73 63 20 69 73 20 7a 65 72 6f 2c 0a 2a 2a 20 6f  sc is zero,.** o
29dc0 72 20 64 65 73 63 65 6e 64 69 6e 67 20 69 66 20  r descending if 
29dd0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  it is non-zero..
29de0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
29df0 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69  r occurs, *pRc i
29e00 73 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69  s set to an SQLi
29e10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
29e20 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20  therwise, if.** 
29e30 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
29e40 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
29e50 6c 65 73 20 69 6e 20 70 45 78 70 72 20 61 72 65  les in pExpr are
29e60 20 73 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74   set:.**.**   Ft
29e70 73 33 45 78 70 72 2e 62 45 6f 66 20 20 20 20 20  s3Expr.bEof     
29e80 20 20 20 20 20 20 20 20 20 20 20 28 6e 6f 6e 2d             (non-
29e90 7a 65 72 6f 20 69 66 20 45 4f 46 20 2d 20 74 68  zero if EOF - th
29ea0 65 72 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 72  ere is no next r
29eb0 6f 77 29 0a 2a 2a 20 20 20 46 74 73 33 45 78 70  ow).**   Fts3Exp
29ec0 72 2e 69 44 6f 63 69 64 20 20 20 20 20 20 20 20  r.iDocid        
29ed0 20 20 20 20 20 20 28 76 61 6c 69 64 20 69 66 20        (valid if 
29ee0 62 45 6f 66 3d 3d 30 2e 20 54 68 65 20 64 6f 63  bEof==0. The doc
29ef0 69 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72  id of the next r
29f00 6f 77 29 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow).**.** If the
29f10 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
29f20 66 20 74 79 70 65 20 46 54 53 51 55 45 52 59 5f  f type FTSQUERY_
29f30 50 48 52 41 53 45 2c 20 61 6e 64 20 74 68 65 20  PHRASE, and the 
29f40 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
29f50 74 0a 2a 2a 20 61 74 20 45 4f 46 2c 20 74 68 65  t.** at EOF, the
29f60 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
29f70 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 70 6f  variables are po
29f80 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
29f90 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 0a 2a   position list.*
29fa0 2a 20 66 6f 72 20 74 68 65 20 70 68 72 61 73 65  * for the phrase
29fb0 20 66 6f 72 20 74 68 65 20 76 69 73 69 74 65 64   for the visited
29fc0 20 72 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54   row:.**.**   FT
29fd0 73 33 45 78 70 72 2e 70 50 68 72 61 73 65 2d 3e  s3Expr.pPhrase->
29fe0 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 20 20  doclist.nList   
29ff0 20 20 20 20 20 28 6c 65 6e 67 74 68 20 6f 66 20       (length of 
2a000 70 4c 69 73 74 20 69 6e 20 62 79 74 65 73 29 0a  pList in bytes).
2a010 2a 2a 20 20 20 46 54 73 33 45 78 70 72 2e 70 50  **   FTs3Expr.pP
2a020 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
2a030 4c 69 73 74 20 20 20 20 20 20 20 20 28 70 6f 69  List        (poi
2a040 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
2a050 20 6c 69 73 74 29 0a 2a 2a 0a 2a 2a 20 49 74 20   list).**.** It 
2a060 73 61 79 73 20 61 62 6f 76 65 20 74 68 61 74 20  says above that 
2a070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  this function ad
2a080 76 61 6e 63 65 73 20 74 68 65 20 65 78 70 72 65  vances the expre
2a090 73 73 69 6f 6e 20 74 6f 20 74 68 65 20 6e 65 78  ssion to the nex
2a0a0 74 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f  t.** matching ro
2a0b0 77 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  w. This is usual
2a0c0 6c 79 20 74 72 75 65 2c 20 62 75 74 20 74 68 65  ly true, but the
2a0d0 72 65 20 61 72 65 20 74 68 65 20 66 6f 6c 6c 6f  re are the follo
2a0e0 77 69 6e 67 20 65 78 63 65 70 74 69 6f 6e 73 3a  wing exceptions:
2a0f0 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 44 65 66 65  .**.**   1. Defe
2a100 72 72 65 64 20 74 6f 6b 65 6e 73 20 61 72 65 20  rred tokens are 
2a110 6e 6f 74 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61  not taken into a
2a120 63 63 6f 75 6e 74 2e 20 49 66 20 61 20 70 68 72  ccount. If a phr
2a130 61 73 65 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  ase consists.** 
2a140 20 20 20 20 20 65 6e 74 69 72 65 6c 79 20 6f 66       entirely of
2a150 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
2a160 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
2a170 74 6f 20 6d 61 74 63 68 20 65 76 65 72 79 20 72  to match every r
2a180 6f 77 20 69 6e 0a 2a 2a 20 20 20 20 20 20 74 68  ow in.**      th
2a190 65 20 64 62 2e 20 49 6e 20 74 68 69 73 20 63 61  e db. In this ca
2a1a0 73 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  se the position-
2a1b0 6c 69 73 74 20 69 73 20 6e 6f 74 20 70 6f 70 75  list is not popu
2a1c0 6c 61 74 65 64 20 61 74 20 61 6c 6c 2e 20 0a 2a  lated at all. .*
2a1d0 2a 0a 2a 2a 20 20 20 20 20 20 4f 72 2c 20 69 66  *.**      Or, if
2a1e0 20 61 20 70 68 72 61 73 65 20 63 6f 6e 74 61 69   a phrase contai
2a1f0 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  ns one or more d
2a200 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 61  eferred tokens a
2a210 6e 64 20 6f 6e 65 20 6f 72 0a 2a 2a 20 20 20 20  nd one or.**    
2a220 20 20 6d 6f 72 65 20 6e 6f 6e 2d 64 65 66 65 72    more non-defer
2a230 72 65 64 20 74 6f 6b 65 6e 73 2c 20 74 68 65 6e  red tokens, then
2a240 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2a250 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
2a260 68 65 20 0a 2a 2a 20 20 20 20 20 20 6e 65 78 74  he .**      next
2a270 20 70 6f 73 73 69 62 6c 65 20 6d 61 74 63 68 2c   possible match,
2a280 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 6f 6e 6c   considering onl
2a290 79 20 6e 6f 6e 2d 64 65 66 65 72 72 65 64 20 74  y non-deferred t
2a2a0 6f 6b 65 6e 73 2e 20 49 6e 20 6f 74 68 65 72 0a  okens. In other.
2a2b0 2a 2a 20 20 20 20 20 20 77 6f 72 64 73 2c 20 69  **      words, i
2a2c0 66 20 74 68 65 20 70 68 72 61 73 65 20 69 73 20  f the phrase is 
2a2d0 22 41 20 42 20 43 22 2c 20 61 6e 64 20 22 42 22  "A B C", and "B"
2a2e0 20 69 73 20 64 65 66 65 72 72 65 64 2c 20 74 68   is deferred, th
2a2f0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
2a300 20 20 20 20 20 69 73 20 61 64 76 61 6e 63 65 64       is advanced
2a310 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
2a320 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
2a330 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 22 41  n instance of "A
2a340 20 2a 20 43 22 2c 20 0a 2a 2a 20 20 20 20 20 20   * C", .**      
2a350 77 68 65 72 65 20 22 2a 22 20 6d 61 79 20 6d 61  where "*" may ma
2a360 74 63 68 20 61 6e 79 20 73 69 6e 67 6c 65 20 74  tch any single t
2a370 6f 6b 65 6e 2e 20 54 68 65 20 70 6f 73 69 74 69  oken. The positi
2a380 6f 6e 20 6c 69 73 74 20 69 6e 20 74 68 69 73 20  on list in this 
2a390 63 61 73 65 0a 2a 2a 20 20 20 20 20 20 69 73 20  case.**      is 
2a3a0 70 6f 70 75 6c 61 74 65 64 20 61 73 20 66 6f 72  populated as for
2a3b0 20 22 41 20 2a 20 43 22 20 62 65 66 6f 72 65 20   "A * C" before 
2a3c0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2a3d0 20 20 20 32 2e 20 4e 45 41 52 20 69 73 20 74 72     2. NEAR is tr
2a3e0 65 61 74 65 64 20 61 73 20 41 4e 44 2e 20 49 66  eated as AND. If
2a3f0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2a400 69 73 20 22 78 20 4e 45 41 52 20 79 22 2c 20 69  is "x NEAR y", i
2a410 74 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 61 64  t is .**      ad
2a420 76 61 6e 63 65 64 20 74 6f 20 70 6f 69 6e 74 20  vanced to point 
2a430 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  to the next row 
2a440 74 68 61 74 20 6d 61 74 63 68 65 73 20 22 78 20  that matches "x 
2a450 41 4e 44 20 79 22 2e 0a 2a 2a 20 0a 2a 2a 20 53  AND y"..** .** S
2a460 65 65 20 73 71 6c 69 74 65 33 46 74 73 33 45 76  ee sqlite3Fts3Ev
2a470 61 6c 54 65 73 74 44 65 66 65 72 72 65 64 28 29  alTestDeferred()
2a480 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20   for details on 
2a490 74 65 73 74 69 6e 67 20 69 66 20 61 20 72 6f 77  testing if a row
2a4a0 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 20   is.** really a 
2a4b0 6d 61 74 63 68 2c 20 74 61 6b 69 6e 67 20 69 6e  match, taking in
2a4c0 74 6f 20 61 63 63 6f 75 6e 74 20 64 65 66 65 72  to account defer
2a4d0 72 65 64 20 74 6f 6b 65 6e 73 20 61 6e 64 20 4e  red tokens and N
2a4e0 45 41 52 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a  EAR operators..*
2a4f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2a500 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 0a 20  s3EvalNextRow(. 
2a510 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73   Fts3Cursor *pCs
2a520 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2a530 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72 20 68   /* FTS Cursor h
2a540 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45  andle */.  Fts3E
2a550 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
2a560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2a570 70 72 2e 20 74 6f 20 61 64 76 61 6e 63 65 20 74  pr. to advance t
2a580 6f 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  o next matching 
2a590 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  row */.  int *pR
2a5a0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2a5c0 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
2a5d0 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  /.){.  if( *pRc=
2a5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a5f0 20 20 69 6e 74 20 62 44 65 73 63 44 6f 63 6c 69    int bDescDocli
2a600 73 74 20 3d 20 70 43 73 72 2d 3e 62 44 65 73 63  st = pCsr->bDesc
2a610 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  ;         /* Use
2a620 64 20 62 79 20 44 4f 43 49 44 5f 43 4d 50 28 29  d by DOCID_CMP()
2a630 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 20 20 61 73   macro */.    as
2a640 73 65 72 74 28 20 70 45 78 70 72 2d 3e 62 45 6f  sert( pExpr->bEo
2a650 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78 70  f==0 );.    pExp
2a660 72 2d 3e 62 53 74 61 72 74 20 3d 20 31 3b 0a 0a  r->bStart = 1;..
2a670 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
2a680 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  r->eType ){.    
2a690 20 20 63 61 73 65 20 46 54 53 51 55 45 52 59 5f    case FTSQUERY_
2a6a0 4e 45 41 52 3a 0a 20 20 20 20 20 20 63 61 73 65  NEAR:.      case
2a6b0 20 46 54 53 51 55 45 52 59 5f 41 4e 44 3a 20 7b   FTSQUERY_AND: {
2a6c0 0a 20 20 20 20 20 20 20 20 46 74 73 33 45 78 70  .        Fts3Exp
2a6d0 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
2a6e0 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
2a6f0 20 46 74 73 33 45 78 70 72 20 2a 70 52 69 67 68   Fts3Expr *pRigh
2a700 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
2a710 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
2a720 74 28 20 21 70 4c 65 66 74 2d 3e 62 44 65 66 65  t( !pLeft->bDefe
2a730 72 72 65 64 20 7c 7c 20 21 70 52 69 67 68 74 2d  rred || !pRight-
2a740 3e 62 44 65 66 65 72 72 65 64 20 29 3b 0a 0a 20  >bDeferred );.. 
2a750 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
2a760 2d 3e 62 44 65 66 65 72 72 65 64 20 29 7b 0a 20  ->bDeferred ){. 
2a770 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 48 53 20           /* LHS 
2a780 69 73 20 65 6e 74 69 72 65 6c 79 20 64 65 66 65  is entirely defe
2a790 72 72 65 64 2e 20 53 6f 20 77 65 20 61 73 73 75  rred. So we assu
2a7a0 6d 65 20 69 74 20 6d 61 74 63 68 65 73 20 65 76  me it matches ev
2a7b0 65 72 79 20 72 6f 77 2e 0a 20 20 20 20 20 20 20  ery row..       
2a7c0 20 20 20 2a 2a 20 41 64 76 61 6e 63 65 20 74 68     ** Advance th
2a7d0 65 20 52 48 53 20 69 74 65 72 61 74 6f 72 20 74  e RHS iterator t
2a7e0 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
2a7f0 72 6f 77 20 76 69 73 69 74 65 64 2e 20 2a 2f 0a  row visited. */.
2a800 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
2a810 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2a820 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
2a830 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2a840 44 6f 63 69 64 20 3d 20 70 52 69 67 68 74 2d 3e  Docid = pRight->
2a850 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
2a860 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20    pExpr->bEof = 
2a870 70 52 69 67 68 74 2d 3e 62 45 6f 66 3b 0a 20 20  pRight->bEof;.  
2a880 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a890 70 52 69 67 68 74 2d 3e 62 44 65 66 65 72 72 65  pRight->bDeferre
2a8a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  d ){.          /
2a8b0 2a 20 52 48 53 20 69 73 20 65 6e 74 69 72 65 6c  * RHS is entirel
2a8c0 79 20 64 65 66 65 72 72 65 64 2e 20 53 6f 20 77  y deferred. So w
2a8d0 65 20 61 73 73 75 6d 65 20 69 74 20 6d 61 74 63  e assume it matc
2a8e0 68 65 73 20 65 76 65 72 79 20 72 6f 77 2e 0a 20  hes every row.. 
2a8f0 20 20 20 20 20 20 20 20 20 2a 2a 20 41 64 76 61           ** Adva
2a900 6e 63 65 20 74 68 65 20 4c 48 53 20 69 74 65 72  nce the LHS iter
2a910 61 74 6f 72 20 74 6f 20 66 69 6e 64 20 74 68 65  ator to find the
2a920 20 6e 65 78 74 20 72 6f 77 20 76 69 73 69 74 65   next row visite
2a930 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
2a940 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2a950 70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63  pCsr, pLeft, pRc
2a960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  );.          pEx
2a970 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65  pr->iDocid = pLe
2a980 66 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20  ft->iDocid;.    
2a990 20 20 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f        pExpr->bEo
2a9a0 66 20 3d 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3b  f = pLeft->bEof;
2a9b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 69            /* Nei
2a9d0 74 68 65 72 20 74 68 65 20 52 48 53 20 6f 72 20  ther the RHS or 
2a9e0 4c 48 53 20 61 72 65 20 64 65 66 65 72 72 65 64  LHS are deferred
2a9f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  . */.          f
2aa00 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70  ts3EvalNextRow(p
2aa10 43 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29  Csr, pLeft, pRc)
2aa20 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  ;.          fts3
2aa30 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2aa40 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a  , pRight, pRc);.
2aa50 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2aa60 20 21 70 4c 65 66 74 2d 3e 62 45 6f 66 20 26 26   !pLeft->bEof &&
2aa70 20 21 70 52 69 67 68 74 2d 3e 62 45 6f 66 20 26   !pRight->bEof &
2aa80 26 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  & *pRc==SQLITE_O
2aa90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2aaa0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2aab0 44 69 66 66 20 3d 20 44 4f 43 49 44 5f 43 4d 50  Diff = DOCID_CMP
2aac0 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c 20  (pLeft->iDocid, 
2aad0 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 29 3b  pRight->iDocid);
2aae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2aaf0 20 69 44 69 66 66 3d 3d 30 20 29 20 62 72 65 61   iDiff==0 ) brea
2ab00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  k;.            i
2ab10 66 28 20 69 44 69 66 66 3c 30 20 29 7b 0a 20 20  f( iDiff<0 ){.  
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33              fts3
2ab30 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2ab40 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20  , pLeft, pRc);. 
2ab50 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
2ab60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ab70 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2ab80 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52  pCsr, pRight, pR
2ab90 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2aba0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2abb0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2abc0 44 6f 63 69 64 20 3d 20 70 4c 65 66 74 2d 3e 69  Docid = pLeft->i
2abd0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Docid;.         
2abe0 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 28   pExpr->bEof = (
2abf0 70 4c 65 66 74 2d 3e 62 45 6f 66 20 7c 7c 20 70  pLeft->bEof || p
2ac00 52 69 67 68 74 2d 3e 62 45 6f 66 29 3b 0a 20 20  Right->bEof);.  
2ac10 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
2ac20 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
2ac30 52 59 5f 4e 45 41 52 20 26 26 20 70 45 78 70 72  RY_NEAR && pExpr
2ac40 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ->bEof ){.      
2ac50 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
2ac60 2d 3e 70 50 68 72 61 73 65 20 26 26 20 70 52 69  ->pPhrase && pRi
2ac70 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f  ght->pPhrase->do
2ac80 63 6c 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20 20  clist.aAll ){.  
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73 33              Fts3
2aca0 44 6f 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20 26  Doclist *pDl = &
2acb0 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d  pRight->pPhrase-
2acc0 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  >doclist;.      
2acd0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
2ace0 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  pRc==SQLITE_OK &
2acf0 26 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 3d 3d  & pRight->bEof==
2ad00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ad10 20 20 20 20 20 6d 65 6d 73 65 74 28 70 44 6c 2d       memset(pDl-
2ad20 3e 70 4c 69 73 74 2c 20 30 2c 20 70 44 6c 2d 3e  >pList, 0, pDl->
2ad30 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  nList);.        
2ad40 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2ad50 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52  NextRow(pCsr, pR
2ad60 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  ight, pRc);.    
2ad70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ad80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ad90 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
2ada0 3e 70 50 68 72 61 73 65 20 26 26 20 70 4c 65 66  >pPhrase && pLef
2adb0 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  t->pPhrase->docl
2adc0 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20 20 20 20  ist.aAll ){.    
2add0 20 20 20 20 20 20 20 20 20 20 46 74 73 33 44 6f            Fts3Do
2ade0 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20 26 70 4c  clist *pDl = &pL
2adf0 65 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f  eft->pPhrase->do
2ae00 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
2ae10 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 52 63       while( *pRc
2ae20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2ae30 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b  Left->bEof==0 ){
2ae40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ae50 20 6d 65 6d 73 65 74 28 70 44 6c 2d 3e 70 4c 69   memset(pDl->pLi
2ae60 73 74 2c 20 30 2c 20 70 44 6c 2d 3e 6e 4c 69 73  st, 0, pDl->nLis
2ae70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2ae80 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74      fts3EvalNext
2ae90 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c  Row(pCsr, pLeft,
2aea0 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20   pRc);.         
2aeb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2aec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2aed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2aee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2aef0 7d 0a 20 20 0a 20 20 20 20 20 20 63 61 73 65 20  }.  .      case 
2af00 46 54 53 51 55 45 52 59 5f 4f 52 3a 20 7b 0a 20  FTSQUERY_OR: {. 
2af10 20 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20         Fts3Expr 
2af20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
2af30 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 46  pLeft;.        F
2af40 74 73 33 45 78 70 72 20 2a 70 52 69 67 68 74 20  ts3Expr *pRight 
2af50 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
2af60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2af70 5f 69 6e 74 36 34 20 69 43 6d 70 20 3d 20 44 4f  _int64 iCmp = DO
2af80 43 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d 3e 69  CID_CMP(pLeft->i
2af90 44 6f 63 69 64 2c 20 70 52 69 67 68 74 2d 3e 69  Docid, pRight->i
2afa0 44 6f 63 69 64 29 3b 0a 0a 20 20 20 20 20 20 20  Docid);..       
2afb0 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2afc0 62 53 74 61 72 74 20 7c 7c 20 70 4c 65 66 74 2d  bStart || pLeft-
2afd0 3e 69 44 6f 63 69 64 3d 3d 70 52 69 67 68 74 2d  >iDocid==pRight-
2afe0 3e 69 44 6f 63 69 64 20 29 3b 0a 20 20 20 20 20  >iDocid );.     
2aff0 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
2b000 74 2d 3e 62 53 74 61 72 74 20 7c 7c 20 70 4c 65  t->bStart || pLe
2b010 66 74 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 69 67  ft->iDocid==pRig
2b020 68 74 2d 3e 69 44 6f 63 69 64 20 29 3b 0a 0a 20  ht->iDocid );.. 
2b030 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68         if( pRigh
2b040 74 2d 3e 62 45 6f 66 20 7c 7c 20 28 70 4c 65 66  t->bEof || (pLef
2b050 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 69 43  t->bEof==0 && iC
2b060 6d 70 3c 30 29 20 29 7b 0a 20 20 20 20 20 20 20  mp<0) ){.       
2b070 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
2b080 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20  ow(pCsr, pLeft, 
2b090 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  pRc);.        }e
2b0a0 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 62  lse if( pLeft->b
2b0b0 45 6f 66 20 7c 7c 20 28 70 52 69 67 68 74 2d 3e  Eof || (pRight->
2b0c0 62 45 6f 66 3d 3d 30 20 26 26 20 69 43 6d 70 3e  bEof==0 && iCmp>
2b0d0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2b0e0 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2b0f0 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52  pCsr, pRight, pR
2b100 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  c);.        }els
2b110 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
2b120 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2b130 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a  r, pLeft, pRc);.
2b140 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45 76            fts3Ev
2b150 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20  alNextRow(pCsr, 
2b160 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
2b170 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2b180 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 3d 20 28   pExpr->bEof = (
2b190 70 4c 65 66 74 2d 3e 62 45 6f 66 20 26 26 20 70  pLeft->bEof && p
2b1a0 52 69 67 68 74 2d 3e 62 45 6f 66 29 3b 0a 20 20  Right->bEof);.  
2b1b0 20 20 20 20 20 20 69 43 6d 70 20 3d 20 44 4f 43        iCmp = DOC
2b1c0 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d 3e 69 44  ID_CMP(pLeft->iD
2b1d0 6f 63 69 64 2c 20 70 52 69 67 68 74 2d 3e 69 44  ocid, pRight->iD
2b1e0 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ocid);.        i
2b1f0 66 28 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 20  f( pRight->bEof 
2b200 7c 7c 20 28 70 4c 65 66 74 2d 3e 62 45 6f 66 3d  || (pLeft->bEof=
2b210 3d 30 20 26 26 20 20 69 43 6d 70 3c 30 29 20 29  =0 &&  iCmp<0) )
2b220 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
2b230 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66  r->iDocid = pLef
2b240 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20  t->iDocid;.     
2b250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b260 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69      pExpr->iDoci
2b270 64 20 3d 20 70 52 69 67 68 74 2d 3e 69 44 6f 63  d = pRight->iDoc
2b280 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  id;.        }.. 
2b290 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2b2a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
2b2b0 65 20 46 54 53 51 55 45 52 59 5f 4e 4f 54 3a 20  e FTSQUERY_NOT: 
2b2c0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 45 78  {.        Fts3Ex
2b2d0 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
2b2e0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
2b2f0 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 69 67    Fts3Expr *pRig
2b300 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
2b310 68 74 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ht;..        if(
2b320 20 70 52 69 67 68 74 2d 3e 62 53 74 61 72 74 3d   pRight->bStart=
2b330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b340 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2b350 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52  pCsr, pRight, pR
2b360 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  c);.          as
2b370 73 65 72 74 28 20 2a 70 52 63 21 3d 53 51 4c 49  sert( *pRc!=SQLI
2b380 54 45 5f 4f 4b 20 7c 7c 20 70 52 69 67 68 74 2d  TE_OK || pRight-
2b390 3e 62 53 74 61 72 74 20 29 3b 0a 20 20 20 20 20  >bStart );.     
2b3a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
2b3b0 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43  s3EvalNextRow(pC
2b3c0 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29 3b  sr, pLeft, pRc);
2b3d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
2b3e0 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  ft->bEof==0 ){. 
2b3f0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2b400 21 2a 70 52 63 20 0a 20 20 20 20 20 20 20 20 20  !*pRc .         
2b410 20 20 20 20 20 26 26 20 21 70 52 69 67 68 74 2d       && !pRight-
2b420 3e 62 45 6f 66 20 0a 20 20 20 20 20 20 20 20 20  >bEof .         
2b430 20 20 20 20 20 26 26 20 44 4f 43 49 44 5f 43 4d       && DOCID_CM
2b440 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 2c  P(pLeft->iDocid,
2b450 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 29   pRight->iDocid)
2b460 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 29 7b  >0 .          ){
2b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2b480 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2b490 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b  r, pRight, pRc);
2b4a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
2b4c0 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70  Expr->iDocid = p
2b4d0 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20  Left->iDocid;.  
2b4e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f        pExpr->bEo
2b4f0 66 20 3d 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3b  f = pLeft->bEof;
2b500 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2b510 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
2b520 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
2b530 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50    Fts3Phrase *pP
2b540 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70  hrase = pExpr->p
2b550 50 68 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20  Phrase;.        
2b560 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61  fts3EvalInvalida
2b570 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72 61 73  tePoslist(pPhras
2b580 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 63  e);.        *pRc
2b590 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61 73   = fts3EvalPhras
2b5a0 65 4e 65 78 74 28 70 43 73 72 2c 20 70 50 68 72  eNext(pCsr, pPhr
2b5b0 61 73 65 2c 20 26 70 45 78 70 72 2d 3e 62 45 6f  ase, &pExpr->bEo
2b5c0 66 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  f);.        pExp
2b5d0 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70 50 68 72  r->iDocid = pPhr
2b5e0 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 69 44 6f  ase->doclist.iDo
2b5f0 63 69 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65  cid;.        bre
2b600 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2b610 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
2b620 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51  f *pRc is not SQ
2b630 4c 49 54 45 5f 4f 4b 2c 20 6f 72 20 69 66 20 70  LITE_OK, or if p
2b640 45 78 70 72 20 69 73 20 6e 6f 74 20 74 68 65 20  Expr is not the 
2b650 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 61 20 4e  root node of a N
2b660 45 41 52 0a 2a 2a 20 63 6c 75 73 74 65 72 2c 20  EAR.** cluster, 
2b670 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2b680 6f 6e 20 72 65 74 75 72 6e 73 20 31 20 69 6d 6d  on returns 1 imm
2b690 65 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ediately..**.** 
2b6a0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63 68  Otherwise, it ch
2b6b0 65 63 6b 73 20 69 66 20 74 68 65 20 63 75 72 72  ecks if the curr
2b6c0 65 6e 74 20 72 6f 77 20 72 65 61 6c 6c 79 20 64  ent row really d
2b6d0 6f 65 73 20 6d 61 74 63 68 20 74 68 65 20 4e 45  oes match the NE
2b6e0 41 52 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  AR .** expressio
2b6f0 6e 2c 20 75 73 69 6e 67 20 74 68 65 20 64 61 74  n, using the dat
2b700 61 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  a currently stor
2b710 65 64 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69  ed in the positi
2b720 6f 6e 20 6c 69 73 74 73 20 0a 2a 2a 20 28 46 74  on lists .** (Ft
2b730 73 33 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2e  s3Expr->pPhrase.
2b740 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 2f 6e 4c  doclist.pList/nL
2b750 69 73 74 29 20 66 6f 72 20 65 61 63 68 20 70 68  ist) for each ph
2b760 72 61 73 65 20 69 6e 20 74 68 65 20 65 78 70 72  rase in the expr
2b770 65 73 73 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  ession. .**.** I
2b780 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
2b790 77 20 69 73 20 61 20 6d 61 74 63 68 2c 20 74 68  w is a match, th
2b7a0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
2b7b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b7c0 65 61 63 68 0a 2a 2a 20 70 68 72 61 73 65 20 69  each.** phrase i
2b7d0 6e 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65  n the NEAR expre
2b7e0 73 73 69 6f 6e 20 69 73 20 65 64 69 74 65 64 20  ssion is edited 
2b7f0 69 6e 20 70 6c 61 63 65 20 74 6f 20 63 6f 6e 74  in place to cont
2b800 61 69 6e 20 6f 6e 6c 79 20 74 68 6f 73 65 0a 2a  ain only those.*
2b810 2a 20 70 68 72 61 73 65 20 69 6e 73 74 61 6e 63  * phrase instanc
2b820 65 73 20 73 75 66 66 69 63 69 65 6e 74 6c 79 20  es sufficiently 
2b830 63 6c 6f 73 65 20 74 6f 20 74 68 65 69 72 20 70  close to their p
2b840 65 65 72 73 20 74 6f 20 73 61 74 69 73 66 79 20  eers to satisfy 
2b850 61 6c 6c 20 4e 45 41 52 0a 2a 2a 20 63 6f 6e 73  all NEAR.** cons
2b860 74 72 61 69 6e 74 73 2e 20 49 6e 20 74 68 69 73  traints. In this
2b870 20 63 61 73 65 20 69 74 20 72 65 74 75 72 6e 73   case it returns
2b880 20 31 2e 20 49 66 20 74 68 65 20 4e 45 41 52 20   1. If the NEAR 
2b890 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20  expression does 
2b8a0 6e 6f 74 20 0a 2a 2a 20 6d 61 74 63 68 20 74 68  not .** match th
2b8b0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2c 20 30  e current row, 0
2b8c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
2b8d0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  e position lists
2b8e0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 0a   may or may not.
2b8f0 2a 2a 20 62 65 20 65 64 69 74 65 64 20 69 66 20  ** be edited if 
2b900 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
2b910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2b920 33 45 76 61 6c 4e 65 61 72 54 65 73 74 28 46 74  3EvalNearTest(Ft
2b930 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  s3Expr *pExpr, i
2b940 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74 20  nt *pRc){.  int 
2b950 72 65 73 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54  res = 1;..  /* T
2b960 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2b970 63 6b 20 72 75 6e 73 20 69 66 20 70 45 78 70 72  ck runs if pExpr
2b980 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
2b990 61 20 4e 45 41 52 20 71 75 65 72 79 2e 0a 20 20  a NEAR query..  
2b9a0 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
2b9b0 74 68 65 20 71 75 65 72 79 3a 0a 20 20 2a 2a 0a  the query:.  **.
2b9c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 22 77 22    **         "w"
2b9d0 20 4e 45 41 52 20 22 78 22 20 4e 45 41 52 20 22   NEAR "x" NEAR "
2b9e0 79 22 20 4e 45 41 52 20 22 7a 22 0a 20 20 2a 2a  y" NEAR "z".  **
2b9f0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 72  .  ** which is r
2ba00 65 70 72 65 73 65 6e 74 65 64 20 69 6e 20 74 72  epresented in tr
2ba10 65 65 20 66 6f 72 6d 20 61 73 3a 0a 20 20 2a 2a  ee form as:.  **
2ba20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20      |.  **      
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 20 20 20 20 2b 2d 2d 4e 45 41 52 2d 2d 2b 20 20      +--NEAR--+  
2ba70 20 20 20 20 3c 2d 2d 20 72 6f 6f 74 20 6f 66 20      <-- root of 
2ba80 4e 45 41 52 20 71 75 65 72 79 0a 20 20 2a 2a 20  NEAR query.  ** 
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
2bab0 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20    |.  **        
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
2bad0 4e 45 41 52 2d 2d 2b 20 20 20 22 7a 22 0a 20 20  NEAR--+   "z".  
2bae0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2baf0 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
2bb00 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  |.  **          
2bb10 20 20 20 20 20 20 2b 2d 2d 4e 45 41 52 2d 2d 2b        +--NEAR--+
2bb20 20 20 20 22 79 22 0a 20 20 2a 2a 20 20 20 20 20     "y".  **     
2bb30 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
2bb40 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20      |.  **      
2bb50 20 20 20 20 20 20 20 20 20 22 77 22 20 20 20 20           "w"    
2bb60 20 20 22 78 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20    "x".  **.  ** 
2bb70 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 63  The right-hand c
2bb80 68 69 6c 64 20 6f 66 20 61 20 4e 45 41 52 20 6e  hild of a NEAR n
2bb90 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ode is always a 
2bba0 70 68 72 61 73 65 2e 20 54 68 65 20 0a 20 20 2a  phrase. The .  *
2bbb0 2a 20 6c 65 66 74 2d 68 61 6e 64 20 63 68 69 6c  * left-hand chil
2bbc0 64 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  d may be either 
2bbd0 61 20 70 68 72 61 73 65 20 6f 72 20 61 20 4e 45  a phrase or a NE
2bbe0 41 52 20 6e 6f 64 65 2e 20 54 68 65 72 65 20 61  AR node. There a
2bbf0 72 65 0a 20 20 2a 2a 20 6e 6f 20 65 78 63 65 70  re.  ** no excep
2bc00 74 69 6f 6e 73 20 74 6f 20 74 68 69 73 20 2d 20  tions to this - 
2bc10 69 74 27 73 20 74 68 65 20 77 61 79 20 74 68 65  it's the way the
2bc20 20 70 61 72 73 65 72 20 69 6e 20 66 74 73 33 5f   parser in fts3_
2bc30 65 78 70 72 2e 63 20 77 6f 72 6b 73 2e 0a 20 20  expr.c works..  
2bc40 2a 2f 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  */.  if( *pRc==S
2bc50 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
2bc60 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
2bc70 53 51 55 45 52 59 5f 4e 45 41 52 20 0a 20 20 20  SQUERY_NEAR .   
2bc80 26 26 20 70 45 78 70 72 2d 3e 62 45 6f 66 3d 3d  && pExpr->bEof==
2bc90 30 0a 20 20 20 26 26 20 28 70 45 78 70 72 2d 3e  0.   && (pExpr->
2bca0 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 45  pParent==0 || pE
2bcb0 78 70 72 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54  xpr->pParent->eT
2bcc0 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 4e 45  ype!=FTSQUERY_NE
2bcd0 41 52 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73  AR).  ){.    Fts
2bce0 33 45 78 70 72 20 2a 70 3b 20 0a 20 20 20 20 69  3Expr *p; .    i
2bcf0 6e 74 20 6e 54 6d 70 20 3d 20 30 3b 20 20 20 20  nt nTmp = 0;    
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd10 42 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  Bytes of temp sp
2bd20 61 63 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ace */.    char 
2bd30 2a 61 54 6d 70 3b 20 20 20 20 20 20 20 20 20 20  *aTmp;          
2bd40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2bd50 20 73 70 61 63 65 20 66 6f 72 20 50 6f 73 6c 69   space for Posli
2bd60 73 74 4e 65 61 72 4d 65 72 67 65 28 29 20 2a 2f  stNearMerge() */
2bd70 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
2bd80 65 20 74 65 6d 70 6f 72 61 72 79 20 77 6f 72 6b  e temporary work
2bd90 69 6e 67 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ing space. */.  
2bda0 20 20 66 6f 72 28 70 3d 70 45 78 70 72 3b 20 70    for(p=pExpr; p
2bdb0 2d 3e 70 4c 65 66 74 3b 20 70 3d 70 2d 3e 70 4c  ->pLeft; p=p->pL
2bdc0 65 66 74 29 7b 0a 20 20 20 20 20 20 6e 54 6d 70  eft){.      nTmp
2bdd0 20 2b 3d 20 70 2d 3e 70 52 69 67 68 74 2d 3e 70   += p->pRight->p
2bde0 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2bdf0 6e 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nList;.    }.   
2be00 20 6e 54 6d 70 20 2b 3d 20 70 2d 3e 70 50 68 72   nTmp += p->pPhr
2be10 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69  ase->doclist.nLi
2be20 73 74 3b 0a 20 20 20 20 69 66 28 20 6e 54 6d 70  st;.    if( nTmp
2be30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
2be40 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
2be50 0a 20 20 20 20 20 20 61 54 6d 70 20 3d 20 73 71  .      aTmp = sq
2be60 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 6d  lite3_malloc(nTm
2be70 70 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  p*2);.      if( 
2be80 21 61 54 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  !aTmp ){.       
2be90 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
2bea0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  OMEM;.        re
2beb0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  s = 0;.      }el
2bec0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
2bed0 20 2a 61 50 6f 73 6c 69 73 74 20 3d 20 70 2d 3e   *aPoslist = p->
2bee0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
2bef0 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
2bf00 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 70 2d 3e  int nToken = p->
2bf10 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
2bf20 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 3d  ..        for(p=
2bf30 70 2d 3e 70 50 61 72 65 6e 74 3b 72 65 73 20 26  p->pParent;res &
2bf40 26 20 70 20 26 26 20 70 2d 3e 65 54 79 70 65 3d  & p && p->eType=
2bf50 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3b 20  =FTSQUERY_NEAR; 
2bf60 70 3d 70 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20  p=p->pParent){. 
2bf70 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72           Fts3Phr
2bf80 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
2bf90 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73  ->pRight->pPhras
2bfa0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e;.          int
2bfb0 20 6e 4e 65 61 72 20 3d 20 70 2d 3e 6e 4e 65 61   nNear = p->nNea
2bfc0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  r;.          res
2bfd0 20 3d 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54   = fts3EvalNearT
2bfe0 72 69 6d 28 6e 4e 65 61 72 2c 20 61 54 6d 70 2c  rim(nNear, aTmp,
2bff0 20 26 61 50 6f 73 6c 69 73 74 2c 20 26 6e 54 6f   &aPoslist, &nTo
2c000 6b 65 6e 2c 20 70 50 68 72 61 73 65 29 3b 0a 20  ken, pPhrase);. 
2c010 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2c020 20 20 61 50 6f 73 6c 69 73 74 20 3d 20 70 45 78    aPoslist = pEx
2c030 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68 72  pr->pRight->pPhr
2c040 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69  ase->doclist.pLi
2c050 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b  st;.        nTok
2c060 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  en = pExpr->pRig
2c070 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f  ht->pPhrase->nTo
2c080 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
2c090 28 70 3d 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  (p=pExpr->pLeft;
2c0a0 20 70 20 26 26 20 72 65 73 3b 20 70 3d 70 2d 3e   p && res; p=p->
2c0b0 70 4c 65 66 74 29 7b 0a 20 20 20 20 20 20 20 20  pLeft){.        
2c0c0 20 20 69 6e 74 20 6e 4e 65 61 72 3b 0a 20 20 20    int nNear;.   
2c0d0 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73         Fts3Phras
2c0e0 65 20 2a 70 50 68 72 61 73 65 3b 0a 20 20 20 20  e *pPhrase;.    
2c0f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2c100 3e 70 50 61 72 65 6e 74 20 26 26 20 70 2d 3e 70  >pParent && p->p
2c110 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d 70  Parent->pLeft==p
2c120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e   );.          nN
2c130 65 61 72 20 3d 20 70 2d 3e 70 50 61 72 65 6e 74  ear = p->pParent
2c140 2d 3e 6e 4e 65 61 72 3b 0a 20 20 20 20 20 20 20  ->nNear;.       
2c150 20 20 20 70 50 68 72 61 73 65 20 3d 20 28 0a 20     pPhrase = (. 
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2c170 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
2c180 4e 45 41 52 20 3f 20 70 2d 3e 70 52 69 67 68 74  NEAR ? p->pRight
2c190 2d 3e 70 50 68 72 61 73 65 20 3a 20 70 2d 3e 70  ->pPhrase : p->p
2c1a0 50 68 72 61 73 65 0a 20 20 20 20 20 20 20 20 20  Phrase.         
2c1b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2c1c0 20 20 72 65 73 20 3d 20 66 74 73 33 45 76 61 6c    res = fts3Eval
2c1d0 4e 65 61 72 54 72 69 6d 28 6e 4e 65 61 72 2c 20  NearTrim(nNear, 
2c1e0 61 54 6d 70 2c 20 26 61 50 6f 73 6c 69 73 74 2c  aTmp, &aPoslist,
2c1f0 20 26 6e 54 6f 6b 65 6e 2c 20 70 50 68 72 61 73   &nToken, pPhras
2c200 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2c210 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
2c220 69 74 65 33 5f 66 72 65 65 28 61 54 6d 70 29 3b  ite3_free(aTmp);
2c230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2c240 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
2c250 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c260 20 69 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e   is a helper fun
2c270 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65  ction for sqlite
2c280 33 46 74 73 33 45 76 61 6c 54 65 73 74 44 65 66  3Fts3EvalTestDef
2c290 65 72 72 65 64 28 29 2e 0a 2a 2a 20 41 73 73 75  erred()..** Assu
2c2a0 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63  ming no error oc
2c2b0 63 75 72 73 20 6f 72 20 68 61 73 20 6f 63 63 75  curs or has occu
2c2c0 72 72 65 64 2c 20 49 74 20 72 65 74 75 72 6e 73  rred, It returns
2c2d0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2c2e0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
2c2f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2c300 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 61 74  ond argument mat
2c310 63 68 65 73 20 74 68 65 20 72 6f 77 20 74 68 61  ches the row tha
2c320 74 20 70 43 73 72 20 0a 2a 2a 20 63 75 72 72 65  t pCsr .** curre
2c330 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2c 20  ntly points to, 
2c340 6f 72 20 7a 65 72 6f 20 69 66 20 69 74 20 64 6f  or zero if it do
2c350 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
2c360 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 53 51 4c   *pRc is not SQL
2c370 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2c380 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c390 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2c3a0 6f 70 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  op..** If an err
2c3b0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
2c3c0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
2c3d0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52  is function, *pR
2c3e0 63 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  c is set to .** 
2c3f0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2c400 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2c410 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2c420 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
2c430 75 65 20 69 73 20 0a 2a 2a 20 75 6e 64 65 66 69  ue is .** undefi
2c440 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2c450 6e 74 20 66 74 73 33 45 76 61 6c 54 65 73 74 45  nt fts3EvalTestE
2c460 78 70 72 28 0a 20 20 46 74 73 33 43 75 72 73 6f  xpr(.  Fts3Curso
2c470 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
2c480 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 63 75         /* FTS cu
2c490 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  rsor handle */. 
2c4a0 20 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72   Fts3Expr *pExpr
2c4b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c4c0 20 2f 2a 20 45 78 70 72 20 74 6f 20 74 65 73 74   /* Expr to test
2c4d0 2e 20 4d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  . May or may not
2c4e0 20 62 65 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 69   be root. */.  i
2c4f0 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c510 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
2c520 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
2c530 20 62 48 69 74 20 3d 20 31 3b 20 20 20 20 20 20   bHit = 1;      
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c550 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
2c560 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
2c570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 77 69  TE_OK ){.    swi
2c580 74 63 68 28 20 70 45 78 70 72 2d 3e 65 54 79 70  tch( pExpr->eTyp
2c590 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
2c5a0 46 54 53 51 55 45 52 59 5f 4e 45 41 52 3a 0a 20  FTSQUERY_NEAR:. 
2c5b0 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45       case FTSQUE
2c5c0 52 59 5f 41 4e 44 3a 0a 20 20 20 20 20 20 20 20  RY_AND:.        
2c5d0 62 48 69 74 20 3d 20 28 0a 20 20 20 20 20 20 20  bHit = (.       
2c5e0 20 20 20 20 20 66 74 73 33 45 76 61 6c 54 65 73       fts3EvalTes
2c5f0 74 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70  tExpr(pCsr, pExp
2c600 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 0a 20  r->pLeft, pRc). 
2c610 20 20 20 20 20 20 20 20 26 26 20 66 74 73 33 45          && fts3E
2c620 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2c630 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2c640 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 20 26   pRc).         &
2c650 26 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 65  & fts3EvalNearTe
2c660 73 74 28 70 45 78 70 72 2c 20 70 52 63 29 0a 20  st(pExpr, pRc). 
2c670 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20         );..     
2c680 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4e 45 41     /* If the NEA
2c690 52 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65  R expression doe
2c6a0 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
2c6b0 72 6f 77 73 2c 20 7a 65 72 6f 20 74 68 65 20 64  rows, zero the d
2c6c0 6f 63 6c 69 73 74 20 66 6f 72 20 0a 20 20 20 20  oclist for .    
2c6d0 20 20 20 20 2a 2a 20 61 6c 6c 20 70 68 72 61 73      ** all phras
2c6e0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2c6f0 68 65 20 4e 45 41 52 2e 20 54 68 69 73 20 69 73  he NEAR. This is
2c700 20 62 65 63 61 75 73 65 20 74 68 65 20 73 6e 69   because the sni
2c710 70 70 65 74 28 29 2c 0a 20 20 20 20 20 20 20 20  ppet(),.        
2c720 2a 2a 20 6f 66 66 73 65 74 73 28 29 20 61 6e 64  ** offsets() and
2c730 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 66 75 6e   matchinfo() fun
2c740 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 73  ctions are not s
2c750 75 70 70 6f 73 65 64 20 74 6f 20 72 65 63 6f 67  upposed to recog
2c760 6e 69 7a 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  nize .        **
2c770 20 61 6e 79 20 69 6e 73 74 61 6e 63 65 73 20 6f   any instances o
2c780 66 20 70 68 72 61 73 65 73 20 74 68 61 74 20 61  f phrases that a
2c790 72 65 20 70 61 72 74 20 6f 66 20 75 6e 6d 61 74  re part of unmat
2c7a0 63 68 65 64 20 4e 45 41 52 20 71 75 65 72 69 65  ched NEAR querie
2c7b0 73 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 46  s. .        ** F
2c7c0 6f 72 20 65 78 61 6d 70 6c 65 20 69 66 20 74 68  or example if th
2c7d0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a 20  is expression:. 
2c7e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c7f0 20 20 2a 2a 20 20 20 20 2e 2e 2e 20 4d 41 54 43    **    ... MATC
2c800 48 20 27 61 20 4f 52 20 28 62 20 4e 45 41 52 20  H 'a OR (b NEAR 
2c810 63 29 27 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  c)'.        **. 
2c820 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 74         ** is mat
2c830 63 68 65 64 20 61 67 61 69 6e 73 74 20 61 20 72  ched against a r
2c840 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 3a 0a 20  ow containing:. 
2c850 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c860 20 20 2a 2a 20 20 20 20 20 20 20 20 27 61 20 62    **        'a b
2c870 20 64 20 65 27 0a 20 20 20 20 20 20 20 20 2a 2a   d e'.        **
2c880 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2c890 20 61 6e 79 20 73 6e 69 70 70 65 74 28 29 20 73   any snippet() s
2c8a0 68 6f 75 6c 64 20 6f 6e 79 20 68 69 67 68 6c 69  hould ony highli
2c8b0 67 68 74 20 74 68 65 20 22 61 22 20 74 65 72 6d  ght the "a" term
2c8c0 2c 20 6e 6f 74 20 74 68 65 20 22 62 22 0a 20 20  , not the "b".  
2c8d0 20 20 20 20 20 20 2a 2a 20 28 61 73 20 22 62 22        ** (as "b"
2c8e0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6e 6f   is part of a no
2c8f0 6e 2d 6d 61 74 63 68 69 6e 67 20 4e 45 41 52 20  n-matching NEAR 
2c900 63 6c 61 75 73 65 29 2e 0a 20 20 20 20 20 20 20  clause)..       
2c910 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2c920 62 48 69 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  bHit==0 .       
2c930 20 20 26 26 20 70 45 78 70 72 2d 3e 65 54 79 70    && pExpr->eTyp
2c940 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52  e==FTSQUERY_NEAR
2c950 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70   .         && (p
2c960 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Expr->pParent==0
2c970 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50 61 72 65   || pExpr->pPare
2c980 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55  nt->eType!=FTSQU
2c990 45 52 59 5f 4e 45 41 52 29 0a 20 20 20 20 20 20  ERY_NEAR).      
2c9a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46    ){.          F
2c9b0 74 73 33 45 78 70 72 20 2a 70 3b 0a 20 20 20 20  ts3Expr *p;.    
2c9c0 20 20 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70        for(p=pExp
2c9d0 72 3b 20 70 2d 3e 70 50 68 72 61 73 65 3d 3d 30  r; p->pPhrase==0
2c9e0 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20  ; p=p->pLeft){. 
2c9f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2ca00 2d 3e 70 52 69 67 68 74 2d 3e 69 44 6f 63 69 64  ->pRight->iDocid
2ca10 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20  ==pCsr->iPrevId 
2ca20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2ca30 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64   fts3EvalInvalid
2ca40 61 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e 70 52  atePoslist(p->pR
2ca50 69 67 68 74 2d 3e 70 50 68 72 61 73 65 29 3b 0a  ight->pPhrase);.
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ca70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca80 20 20 20 20 69 66 28 20 70 2d 3e 69 44 6f 63 69      if( p->iDoci
2ca90 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64  d==pCsr->iPrevId
2caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cab0 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61  fts3EvalInvalida
2cac0 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e 70 50 68  tePoslist(p->pPh
2cad0 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
2cae0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
2caf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
2cb00 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52      case FTSQUER
2cb10 59 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 20 20  Y_OR: {.        
2cb20 69 6e 74 20 62 48 69 74 31 20 3d 20 66 74 73 33  int bHit1 = fts3
2cb30 45 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73  EvalTestExpr(pCs
2cb40 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  r, pExpr->pLeft,
2cb50 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 69   pRc);.        i
2cb60 6e 74 20 62 48 69 74 32 20 3d 20 66 74 73 33 45  nt bHit2 = fts3E
2cb70 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2cb80 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2cb90 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62   pRc);.        b
2cba0 48 69 74 20 3d 20 62 48 69 74 31 20 7c 7c 20 62  Hit = bHit1 || b
2cbb0 48 69 74 32 3b 0a 20 20 20 20 20 20 20 20 62 72  Hit2;.        br
2cbc0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
2cbd0 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45 52      case FTSQUER
2cbe0 59 5f 4e 4f 54 3a 0a 20 20 20 20 20 20 20 20 62  Y_NOT:.        b
2cbf0 48 69 74 20 3d 20 28 0a 20 20 20 20 20 20 20 20  Hit = (.        
2cc00 20 20 20 20 66 74 73 33 45 76 61 6c 54 65 73 74      fts3EvalTest
2cc10 45 78 70 72 28 70 43 73 72 2c 20 70 45 78 70 72  Expr(pCsr, pExpr
2cc20 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 0a 20 20  ->pLeft, pRc).  
2cc30 20 20 20 20 20 20 20 26 26 20 21 66 74 73 33 45         && !fts3E
2cc40 76 61 6c 54 65 73 74 45 78 70 72 28 70 43 73 72  valTestExpr(pCsr
2cc50 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
2cc60 20 70 52 63 29 0a 20 20 20 20 20 20 20 20 29 3b   pRc).        );
2cc70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2cc80 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
2cc90 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
2cca0 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45  _DISABLE_FTS4_DE
2ccb0 46 45 52 52 45 44 0a 20 20 20 20 20 20 20 20 69  FERRED.        i
2ccc0 66 28 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72  f( pCsr->pDeferr
2ccd0 65 64 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  ed .         && 
2cce0 28 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 3d 3d  (pExpr->iDocid==
2ccf0 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20 7c 7c  pCsr->iPrevId ||
2cd00 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65   pExpr->bDeferre
2cd10 64 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  d).        ){.  
2cd20 20 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61          Fts3Phra
2cd30 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45  se *pPhrase = pE
2cd40 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20  xpr->pPhrase;.  
2cd50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cd60 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64  pExpr->bDeferred
2cd70 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 64 6f 63   || pPhrase->doc
2cd80 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74 3d 3d  list.bFreeList==
2cd90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
2cda0 66 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72  f( pExpr->bDefer
2cdb0 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  red ){.         
2cdc0 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c     fts3EvalInval
2cdd0 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68  idatePoslist(pPh
2cde0 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rase);.         
2cdf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52   }.          *pR
2ce00 63 20 3d 20 66 74 73 33 45 76 61 6c 44 65 66 65  c = fts3EvalDefe
2ce10 72 72 65 64 50 68 72 61 73 65 28 70 43 73 72 2c  rredPhrase(pCsr,
2ce20 20 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20   pPhrase);.     
2ce30 20 20 20 20 20 62 48 69 74 20 3d 20 28 70 50 68       bHit = (pPh
2ce40 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c  rase->doclist.pL
2ce50 69 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ist!=0);.       
2ce60 20 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64     pExpr->iDocid
2ce70 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64   = pCsr->iPrevId
2ce80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2ce90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
2cea0 0a 20 20 20 20 20 20 20 20 20 20 62 48 69 74 20  .          bHit 
2ceb0 3d 20 28 70 45 78 70 72 2d 3e 62 45 6f 66 3d 3d  = (pExpr->bEof==
2cec0 30 20 26 26 20 70 45 78 70 72 2d 3e 69 44 6f 63  0 && pExpr->iDoc
2ced0 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49  id==pCsr->iPrevI
2cee0 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
2cef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2cf00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2cf10 20 72 65 74 75 72 6e 20 62 48 69 74 3b 0a 7d 0a   return bHit;.}.
2cf20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2cf30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2cf40 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
2cf50 74 20 6f 66 20 65 61 63 68 20 78 4e 65 78 74 20  t of each xNext 
2cf60 6f 70 65 72 61 74 69 6f 6e 20 77 68 65 6e 0a 2a  operation when.*
2cf70 2a 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  * iterating thro
2cf80 75 67 68 20 74 68 65 20 72 65 73 75 6c 74 73 20  ugh the results 
2cf90 6f 66 20 61 20 66 75 6c 6c 2d 74 65 78 74 20 71  of a full-text q
2cfa0 75 65 72 79 2e 20 41 74 20 74 68 69 73 20 70 6f  uery. At this po
2cfb0 69 6e 74 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  int the.** curso
2cfc0 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 72 6f  r points to a ro
2cfd0 77 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  w that matches t
2cfe0 68 65 20 71 75 65 72 79 20 65 78 70 72 65 73 73  he query express
2cff0 69 6f 6e 2c 20 77 69 74 68 20 74 68 65 0a 2a 2a  ion, with the.**
2d000 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 76 65 61   following cavea
2d010 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 55 70  ts:.**.**   * Up
2d020 20 75 6e 74 69 6c 20 74 68 69 73 20 70 6f 69 6e   until this poin
2d030 74 2c 20 22 4e 45 41 52 22 20 6f 70 65 72 61 74  t, "NEAR" operat
2d040 6f 72 73 20 69 6e 20 74 68 65 20 65 78 70 72 65  ors in the expre
2d050 73 73 69 6f 6e 20 68 61 76 65 20 62 65 65 6e 0a  ssion have been.
2d060 2a 2a 20 20 20 20 20 74 72 65 61 74 65 64 20 61  **     treated a
2d070 73 20 22 41 4e 44 22 2e 0a 2a 2a 0a 2a 2a 20 20  s "AND"..**.**  
2d080 20 2a 20 44 65 66 65 72 72 65 64 20 74 6f 6b 65   * Deferred toke
2d090 6e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  ns have not yet 
2d0a0 62 65 65 6e 20 63 6f 6e 73 69 64 65 72 65 64 2e  been considered.
2d0b0 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
2d0c0 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
2d0d0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2d0e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2d0f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
2d100 72 65 74 75 72 6e 73 20 30 2e 20 4f 74 68 65 72  returns 0. Other
2d110 77 69 73 65 2c 20 69 74 20 74 65 73 74 73 20 77  wise, it tests w
2d120 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 66  hether or not af
2d130 74 65 72 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ter considering 
2d140 4e 45 41 52 0a 2a 2a 20 6f 70 65 72 61 74 6f 72  NEAR.** operator
2d150 73 20 61 6e 64 20 64 65 66 65 72 72 65 64 20 74  s and deferred t
2d160 6f 6b 65 6e 73 20 74 68 65 20 63 75 72 72 65 6e  okens the curren
2d170 74 20 72 6f 77 20 69 73 20 73 74 69 6c 6c 20 61  t row is still a
2d180 20 6d 61 74 63 68 20 66 6f 72 20 74 68 65 0a 2a   match for the.*
2d190 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 49 74  * expression. It
2d1a0 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 62 6f   returns 1 if bo
2d1b0 74 68 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  th of the follow
2d1c0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
2d1d0 0a 2a 2a 20 20 20 31 2e 20 2a 70 52 63 20 69 73  .**   1. *pRc is
2d1e0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
2d1f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2d200 74 75 72 6e 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  turns, and.**.**
2d210 20 20 20 32 2e 20 41 66 74 65 72 20 73 63 61 6e     2. After scan
2d220 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
2d230 20 46 54 53 20 74 61 62 6c 65 20 72 6f 77 20 66   FTS table row f
2d240 6f 72 20 74 68 65 20 64 65 66 65 72 72 65 64 20  or the deferred 
2d250 74 6f 6b 65 6e 73 2c 0a 2a 2a 20 20 20 20 20 20  tokens,.**      
2d260 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
2d270 20 74 68 61 74 20 74 68 65 20 72 6f 77 20 64 6f   that the row do
2d280 65 73 20 2a 6e 6f 74 2a 20 6d 61 74 63 68 20 74  es *not* match t
2d290 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  he query..**.** 
2d2a0 4f 72 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  Or, if no error 
2d2b0 6f 63 63 75 72 73 20 61 6e 64 20 69 74 20 73 65  occurs and it se
2d2c0 65 6d 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ems the current 
2d2d0 72 6f 77 20 64 6f 65 73 20 6d 61 74 63 68 20 74  row does match t
2d2e0 68 65 20 46 54 53 0a 2a 2a 20 71 75 65 72 79 2c  he FTS.** query,
2d2f0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e   return 0..*/.in
2d300 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61  t sqlite3Fts3Eva
2d310 6c 54 65 73 74 44 65 66 65 72 72 65 64 28 46 74  lTestDeferred(Ft
2d320 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2d330 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74  int *pRc){.  int
2d340 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20 20 69 6e   rc = *pRc;.  in
2d350 74 20 62 4d 69 73 73 20 3d 20 30 3b 0a 20 20 69  t bMiss = 0;.  i
2d360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d370 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
2d380 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
2d390 6d 6f 72 65 20 64 65 66 65 72 72 65 64 20 74 6f  more deferred to
2d3a0 6b 65 6e 73 2c 20 6c 6f 61 64 20 74 68 65 20 63  kens, load the c
2d3b0 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 74 6f 0a  urrent row into.
2d3c0 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e      ** memory an
2d3d0 64 20 73 63 61 6e 20 69 74 20 74 6f 20 64 65 74  d scan it to det
2d3e0 65 72 6d 69 6e 65 20 74 68 65 20 70 6f 73 69 74  ermine the posit
2d3f0 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 65 61 63  ion list for eac
2d400 68 20 64 65 66 65 72 72 65 64 0a 20 20 20 20 2a  h deferred.    *
2d410 2a 20 74 6f 6b 65 6e 2e 20 54 68 65 6e 2c 20 73  * token. Then, s
2d420 65 65 20 69 66 20 74 68 69 73 20 72 6f 77 20 69  ee if this row i
2d430 73 20 72 65 61 6c 6c 79 20 61 20 6d 61 74 63 68  s really a match
2d440 2c 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 64 65  , considering de
2d450 66 65 72 72 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ferred.    ** to
2d460 6b 65 6e 73 20 61 6e 64 20 4e 45 41 52 20 6f 70  kens and NEAR op
2d470 65 72 61 74 6f 72 73 20 28 6e 65 69 74 68 65 72  erators (neither
2d480 20 6f 66 20 77 68 69 63 68 20 77 65 72 65 20 74   of which were t
2d490 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f 75 6e  aken into accoun
2d4a0 74 0a 20 20 20 20 2a 2a 20 65 61 72 6c 69 65 72  t.    ** earlier
2d4b0 2c 20 62 79 20 66 74 73 33 45 76 61 6c 4e 65 78  , by fts3EvalNex
2d4c0 74 52 6f 77 28 29 29 2e 20 0a 20 20 20 20 2a 2f  tRow()). .    */
2d4d0 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70  .    if( pCsr->p
2d4e0 44 65 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20  Deferred ){.    
2d4f0 20 20 72 63 20 3d 20 66 74 73 33 43 75 72 73 6f    rc = fts3Curso
2d500 72 53 65 65 6b 28 30 2c 20 70 43 73 72 29 3b 0a  rSeek(0, pCsr);.
2d510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
2d540 74 73 33 43 61 63 68 65 44 65 66 65 72 72 65 64  ts3CacheDeferred
2d550 44 6f 63 6c 69 73 74 73 28 70 43 73 72 29 3b 0a  Doclists(pCsr);.
2d560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d570 20 20 62 4d 69 73 73 20 3d 20 28 30 3d 3d 66 74    bMiss = (0==ft
2d580 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70  s3EvalTestExpr(p
2d590 43 73 72 2c 20 70 43 73 72 2d 3e 70 45 78 70 72  Csr, pCsr->pExpr
2d5a0 2c 20 26 72 63 29 29 3b 0a 0a 20 20 20 20 2f 2a  , &rc));..    /*
2d5b0 20 46 72 65 65 20 74 68 65 20 70 6f 73 69 74 69   Free the positi
2d5c0 6f 6e 2d 6c 69 73 74 73 20 61 63 63 75 6d 75 6c  on-lists accumul
2d5d0 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 64 65  ated for each de
2d5e0 66 65 72 72 65 64 20 74 6f 6b 65 6e 20 61 62 6f  ferred token abo
2d5f0 76 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ve. */.    sqlit
2d600 65 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72  e3Fts3FreeDeferr
2d610 65 64 44 6f 63 6c 69 73 74 73 28 70 43 73 72 29  edDoclists(pCsr)
2d620 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  ;.    *pRc = rc;
2d630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
2d640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d650 62 4d 69 73 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bMiss);.}../*.**
2d660 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
2d670 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74 20 74 68  next document th
2d680 61 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 46  at matches the F
2d690 54 53 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  TS expression in
2d6a0 0a 2a 2a 20 46 74 73 33 43 75 72 73 6f 72 2e 70  .** Fts3Cursor.p
2d6b0 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Expr..*/.static 
2d6c0 69 6e 74 20 66 74 73 33 45 76 61 6c 4e 65 78 74  int fts3EvalNext
2d6d0 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73  (Fts3Cursor *pCs
2d6e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2d6f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d700 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d710 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  Code */.  Fts3Ex
2d720 70 72 20 2a 70 45 78 70 72 20 3d 20 70 43 73 72  pr *pExpr = pCsr
2d730 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ->pExpr;.  asser
2d740 74 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d  t( pCsr->isEof==
2d750 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
2d760 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 73 72 2d  ==0 ){.    pCsr-
2d770 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  >isEof = 1;.  }e
2d780 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
2d790 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 73      if( pCsr->is
2d7a0 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29  RequireSeek==0 )
2d7b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d7c0 33 5f 72 65 73 65 74 28 70 43 73 72 2d 3e 70 53  3_reset(pCsr->pS
2d7d0 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tmt);.      }.  
2d7e0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2d7f0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
2d800 43 73 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29  Csr->pStmt)==0 )
2d810 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61 6c  ;.      fts3Eval
2d820 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 45  NextRow(pCsr, pE
2d830 78 70 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  xpr, &rc);.     
2d840 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 70   pCsr->isEof = p
2d850 45 78 70 72 2d 3e 62 45 6f 66 3b 0a 20 20 20 20  Expr->bEof;.    
2d860 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72    pCsr->isRequir
2d870 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20 20  eSeek = 1;.     
2d880 20 70 43 73 72 2d 3e 69 73 4d 61 74 63 68 69 6e   pCsr->isMatchin
2d890 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b 0a 20 20  foNeeded = 1;.  
2d8a0 20 20 20 20 70 43 73 72 2d 3e 69 50 72 65 76 49      pCsr->iPrevI
2d8b0 64 20 3d 20 70 45 78 70 72 2d 3e 69 44 6f 63 69  d = pExpr->iDoci
2d8c0 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  d;.    }while( p
2d8d0 43 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20 26 26  Csr->isEof==0 &&
2d8e0 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
2d8f0 54 65 73 74 44 65 66 65 72 72 65 64 28 70 43 73  TestDeferred(pCs
2d900 72 2c 20 26 72 63 29 20 29 3b 0a 20 20 7d 0a 0a  r, &rc) );.  }..
2d910 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2d920 65 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74  e cursor is past
2d930 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2d940 64 6f 63 69 64 20 72 61 6e 67 65 20 73 70 65 63  docid range spec
2d950 69 66 69 65 64 0a 20 20 2a 2a 20 62 79 20 46 74  ified.  ** by Ft
2d960 73 33 43 75 72 73 6f 72 2e 69 4d 69 6e 44 6f 63  s3Cursor.iMinDoc
2d970 69 64 2f 69 4d 61 78 44 6f 63 69 64 2e 20 49 66  id/iMaxDocid. If
2d980 20 73 6f 2c 20 73 65 74 20 74 68 65 20 45 4f 46   so, set the EOF
2d990 20 66 6c 61 67 2e 20 20 2a 2f 0a 20 20 69 66 28   flag.  */.  if(
2d9a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d9b0 26 20 28 0a 20 20 20 20 20 20 20 20 28 70 43 73  & (.        (pCs
2d9c0 72 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26 20 70  r->bDesc==0 && p
2d9d0 43 73 72 2d 3e 69 50 72 65 76 49 64 3e 70 43 73  Csr->iPrevId>pCs
2d9e0 72 2d 3e 69 4d 61 78 44 6f 63 69 64 29 0a 20 20  r->iMaxDocid).  
2d9f0 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 62 44 65     || (pCsr->bDe
2da00 73 63 21 3d 30 20 26 26 20 70 43 73 72 2d 3e 69  sc!=0 && pCsr->i
2da10 50 72 65 76 49 64 3c 70 43 73 72 2d 3e 69 4d 69  PrevId<pCsr->iMi
2da20 6e 44 6f 63 69 64 29 0a 20 20 29 29 7b 0a 20 20  nDocid).  )){.  
2da30 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
2da40 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
2da50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2da60 73 74 61 72 74 20 69 6e 74 65 72 61 74 69 6f 6e  start interation
2da70 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
2da80 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 74 68  pExpr so that th
2da90 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 2a  e next call to.*
2daa0 2a 20 66 74 73 33 45 76 61 6c 4e 65 78 74 28 29  * fts3EvalNext()
2dab0 20 76 69 73 69 74 73 20 74 68 65 20 66 69 72 73   visits the firs
2dac0 74 20 72 6f 77 2e 20 44 6f 20 6e 6f 74 20 61 6c  t row. Do not al
2dad0 6c 6f 77 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  low incremental 
2dae0 0a 2a 2a 20 6c 6f 61 64 69 6e 67 20 6f 72 20 6d  .** loading or m
2daf0 65 72 67 69 6e 67 20 6f 66 20 70 68 72 61 73 65  erging of phrase
2db00 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 74 68   doclists for th
2db10 69 73 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is iteration..**
2db20 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f  .** If *pRc is o
2db30 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2db40 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
2db50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2db60 2c 20 69 74 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  , it is.** a no-
2db70 6f 70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  op. If an error 
2db80 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
2db90 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52  is function, *pR
2dba0 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 0a 2a  c is set to an.*
2dbb0 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
2dbc0 6f 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ode before retur
2dbd0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
2dbe0 76 6f 69 64 20 66 74 73 33 45 76 61 6c 52 65 73  void fts3EvalRes
2dbf0 74 61 72 74 28 0a 20 20 46 74 73 33 43 75 72 73  tart(.  Fts3Curs
2dc00 6f 72 20 2a 70 43 73 72 2c 0a 20 20 46 74 73 33  or *pCsr,.  Fts3
2dc10 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 69  Expr *pExpr,.  i
2dc20 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69 66 28  nt *pRc.){.  if(
2dc30 20 70 45 78 70 72 20 26 26 20 2a 70 52 63 3d 3d   pExpr && *pRc==
2dc40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dc50 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
2dc60 72 61 73 65 20 3d 20 70 45 78 70 72 2d 3e 70 50  rase = pExpr->pP
2dc70 68 72 61 73 65 3b 0a 0a 20 20 20 20 69 66 28 20  hrase;..    if( 
2dc80 70 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20 20  pPhrase ){.     
2dc90 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64   fts3EvalInvalid
2dca0 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72 61  atePoslist(pPhra
2dcb0 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  se);.      if( p
2dcc0 50 68 72 61 73 65 2d 3e 62 49 6e 63 72 20 29 7b  Phrase->bIncr ){
2dcd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2dce0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2dcf0 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b   i<pPhrase->nTok
2dd00 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  en; i++){.      
2dd10 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54 6f      Fts3PhraseTo
2dd20 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 70  ken *pToken = &p
2dd30 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69  Phrase->aToken[i
2dd40 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
2dd50 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70 44 65  ert( pToken->pDe
2dd60 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  ferred==0 );.   
2dd70 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65         if( pToke
2dd80 6e 2d 3e 70 53 65 67 63 73 72 20 29 7b 0a 20 20  n->pSegcsr ){.  
2dd90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dda0 33 46 74 73 33 4d 73 72 49 6e 63 72 52 65 73 74  3Fts3MsrIncrRest
2ddb0 61 72 74 28 70 54 6f 6b 65 6e 2d 3e 70 53 65 67  art(pToken->pSeg
2ddc0 63 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  csr);.          
2ddd0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2dde0 20 20 20 20 2a 70 52 63 20 3d 20 66 74 73 33 45      *pRc = fts3E
2ddf0 76 61 6c 50 68 72 61 73 65 53 74 61 72 74 28 70  valPhraseStart(p
2de00 43 73 72 2c 20 30 2c 20 70 50 68 72 61 73 65 29  Csr, 0, pPhrase)
2de10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2de20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
2de30 2e 70 4e 65 78 74 44 6f 63 69 64 20 3d 20 30 3b  .pNextDocid = 0;
2de40 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
2de50 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69 64 20 3d  doclist.iDocid =
2de60 20 30 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73   0;.      pPhras
2de70 65 2d 3e 70 4f 72 50 6f 73 6c 69 73 74 20 3d 20  e->pOrPoslist = 
2de80 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 45  0;.    }..    pE
2de90 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 30 3b  xpr->iDocid = 0;
2dea0 0a 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66  .    pExpr->bEof
2deb0 20 3d 20 30 3b 0a 20 20 20 20 70 45 78 70 72 2d   = 0;.    pExpr-
2dec0 3e 62 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20  >bStart = 0;..  
2ded0 20 20 66 74 73 33 45 76 61 6c 52 65 73 74 61 72    fts3EvalRestar
2dee0 74 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70  t(pCsr, pExpr->p
2def0 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20  Left, pRc);.    
2df00 66 74 73 33 45 76 61 6c 52 65 73 74 61 72 74 28  fts3EvalRestart(
2df10 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69  pCsr, pExpr->pRi
2df20 67 68 74 2c 20 70 52 63 29 3b 0a 20 20 7d 0a 7d  ght, pRc);.  }.}
2df30 0a 0a 2f 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c  ../*.** After al
2df40 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 46 74 73  locating the Fts
2df50 33 45 78 70 72 2e 61 4d 49 5b 5d 20 61 72 72 61  3Expr.aMI[] arra
2df60 79 20 66 6f 72 20 65 61 63 68 20 70 68 72 61 73  y for each phras
2df70 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 65 78 70  e in the .** exp
2df80 72 65 73 73 69 6f 6e 20 72 6f 6f 74 65 64 20 61  ression rooted a
2df90 74 20 70 45 78 70 72 2c 20 74 68 65 20 63 75 72  t pExpr, the cur
2dfa0 73 6f 72 20 69 74 65 72 61 74 65 73 20 74 68 72  sor iterates thr
2dfb0 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6d 61  ough all rows ma
2dfc0 74 63 68 65 64 0a 2a 2a 20 62 79 20 70 45 78 70  tched.** by pExp
2dfd0 72 2c 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  r, calling this 
2dfe0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
2dff0 68 20 72 6f 77 2e 20 54 68 69 73 20 66 75 6e 63  h row. This func
2e000 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 0a  tion increments.
2e010 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e  ** the values in
2e020 20 46 74 73 33 45 78 70 72 2e 61 4d 49 5b 5d 20   Fts3Expr.aMI[] 
2e030 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2e040 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
2e050 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66 6f 75 6e  urrently.** foun
2e060 64 20 69 6e 20 46 74 73 33 45 78 70 72 2e 70 50  d in Fts3Expr.pP
2e070 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70  hrase->doclist.p
2e080 4c 69 73 74 20 66 6f 72 20 65 61 63 68 20 6f 66  List for each of
2e090 20 74 68 65 20 70 68 72 61 73 65 20 0a 2a 2a 20   the phrase .** 
2e0a0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73  expression nodes
2e0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e0c0 20 66 74 73 33 45 76 61 6c 55 70 64 61 74 65 43   fts3EvalUpdateC
2e0d0 6f 75 6e 74 73 28 46 74 73 33 45 78 70 72 20 2a  ounts(Fts3Expr *
2e0e0 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
2e0f0 78 70 72 20 29 7b 0a 20 20 20 20 46 74 73 33 50  xpr ){.    Fts3P
2e100 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
2e110 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b   pExpr->pPhrase;
2e120 0a 20 20 20 20 69 66 28 20 70 50 68 72 61 73 65  .    if( pPhrase
2e130 20 26 26 20 70 50 68 72 61 73 65 2d 3e 64 6f 63   && pPhrase->doc
2e140 6c 69 73 74 2e 70 4c 69 73 74 20 29 7b 0a 20 20  list.pList ){.  
2e150 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30      int iCol = 0
2e160 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 20  ;.      char *p 
2e170 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  = pPhrase->docli
2e180 73 74 2e 70 4c 69 73 74 3b 0a 0a 20 20 20 20 20  st.pList;..     
2e190 20 61 73 73 65 72 74 28 20 2a 70 20 29 3b 0a 20   assert( *p );. 
2e1a0 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
2e1b0 0a 20 20 20 20 20 20 20 20 75 38 20 63 20 3d 20  .        u8 c = 
2e1c0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
2e1d0 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cnt = 0;.       
2e1e0 20 77 68 69 6c 65 28 20 30 78 46 45 20 26 20 28   while( 0xFE & (
2e1f0 2a 70 20 7c 20 63 29 20 29 7b 0a 20 20 20 20 20  *p | c) ){.     
2e200 20 20 20 20 20 69 66 28 20 28 63 26 30 78 38 30       if( (c&0x80
2e210 29 3d 3d 30 20 29 20 69 43 6e 74 2b 2b 3b 0a 20  )==0 ) iCnt++;. 
2e220 20 20 20 20 20 20 20 20 20 63 20 3d 20 2a 70 2b           c = *p+
2e230 2b 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20 20  + & 0x80;.      
2e240 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2e250 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20  aMI[iCol*3 + 1] 
2e260 3d 20 4e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75  = Number of occu
2e270 72 72 65 6e 63 65 73 0a 20 20 20 20 20 20 20 20  rrences.        
2e280 2a 2a 20 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20  ** aMI[iCol*3 + 
2e290 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20 72  2] = Number of r
2e2a0 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ows containing a
2e2b0 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73 74  t least one inst
2e2c0 61 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ance.        */.
2e2d0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
2e2e0 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 2b  MI[iCol*3 + 1] +
2e2f0 3d 20 69 43 6e 74 3b 0a 20 20 20 20 20 20 20 20  = iCnt;.        
2e300 70 45 78 70 72 2d 3e 61 4d 49 5b 69 43 6f 6c 2a  pExpr->aMI[iCol*
2e310 33 20 2b 20 32 5d 20 2b 3d 20 28 69 43 6e 74 3e  3 + 2] += (iCnt>
2e320 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2e330 2a 70 3d 3d 30 78 30 30 20 29 20 62 72 65 61 6b  *p==0x00 ) break
2e340 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20  ;.        p++;. 
2e350 20 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73 33         p += fts3
2e360 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 26  GetVarint32(p, &
2e370 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iCol);.      }. 
2e380 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 45 76     }..    fts3Ev
2e390 61 6c 55 70 64 61 74 65 43 6f 75 6e 74 73 28 70  alUpdateCounts(p
2e3a0 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
2e3b0 20 20 66 74 73 33 45 76 61 6c 55 70 64 61 74 65    fts3EvalUpdate
2e3c0 43 6f 75 6e 74 73 28 70 45 78 70 72 2d 3e 70 52  Counts(pExpr->pR
2e3d0 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2e3e0 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
2e3f0 45 78 70 72 20 6d 75 73 74 20 62 65 20 6f 66 20  Expr must be of 
2e400 74 79 70 65 20 46 54 53 51 55 45 52 59 5f 50 48  type FTSQUERY_PH
2e410 52 41 53 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  RASE..**.** If i
2e420 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2e430 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
2e440 6f 70 75 6c 61 74 65 64 2c 20 74 68 69 73 20 66  opulated, this f
2e450 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
2e460 73 20 61 6e 64 0a 2a 2a 20 70 6f 70 75 6c 61 74  s and.** populat
2e470 65 73 20 74 68 65 20 46 74 73 33 45 78 70 72 2e  es the Fts3Expr.
2e480 61 4d 49 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  aMI[] array for 
2e490 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2e4a0 2e 20 49 66 20 70 45 78 70 72 20 69 73 20 70 61  . If pExpr is pa
2e4b0 72 74 0a 2a 2a 20 6f 66 20 61 20 4e 45 41 52 20  rt.** of a NEAR 
2e4c0 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
2e4d0 20 69 74 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74   it also allocat
2e4e0 65 73 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 73  es and populates
2e4f0 20 74 68 65 20 73 61 6d 65 20 61 72 72 61 79 0a   the same array.
2e500 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 74 68 65 72  ** for all other
2e510 20 70 68 72 61 73 65 73 20 74 68 61 74 20 61 72   phrases that ar
2e520 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 4e 45  e part of the NE
2e530 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  AR expression..*
2e540 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2e550 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
2e560 65 20 61 4d 49 5b 5d 20 61 72 72 61 79 20 69 73  e aMI[] array is
2e570 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6c   successfully al
2e580 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 70  located and.** p
2e590 6f 70 75 6c 61 74 65 64 2e 20 4f 74 68 65 72 77  opulated. Otherw
2e5a0 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  ise, if an error
2e5b0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2e5c0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2e5d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2e5e0 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
2e5f0 6c 47 61 74 68 65 72 53 74 61 74 73 28 0a 20 20  lGatherStats(.  
2e600 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
2e610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e620 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  /* Cursor object
2e630 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a   */.  Fts3Expr *
2e640 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
2e650 20 20 20 20 20 20 2f 2a 20 46 54 53 51 55 45 52        /* FTSQUER
2e660 59 5f 50 48 52 41 53 45 20 65 78 70 72 65 73 73  Y_PHRASE express
2e670 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
2e680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2e690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2e6a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2e6b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2e6c0 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f  eType==FTSQUERY_
2e6d0 50 48 52 41 53 45 20 29 3b 0a 20 20 69 66 28 20  PHRASE );.  if( 
2e6e0 70 45 78 70 72 2d 3e 61 4d 49 3d 3d 30 20 29 7b  pExpr->aMI==0 ){
2e6f0 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20 2a  .    Fts3Table *
2e700 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c  pTab = (Fts3Tabl
2e710 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
2e720 56 74 61 62 3b 0a 20 20 20 20 46 74 73 33 45 78  Vtab;.    Fts3Ex
2e730 70 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20 20  pr *pRoot;      
2e740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2e750 74 20 6f 66 20 4e 45 41 52 20 65 78 70 72 65 73  t of NEAR expres
2e760 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 74 73 33  sion */.    Fts3
2e770 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
2e780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2e790 74 65 72 61 74 6f 72 20 75 73 65 64 20 66 6f 72  terator used for
2e7a0 20 73 65 76 65 72 61 6c 20 70 75 72 70 6f 73 65   several purpose
2e7b0 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65  s */..    sqlite
2e7c0 33 5f 69 6e 74 36 34 20 69 50 72 65 76 49 64 20  3_int64 iPrevId 
2e7d0 3d 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3b  = pCsr->iPrevId;
2e7e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
2e7f0 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 75  64 iDocid;.    u
2e800 38 20 62 45 6f 66 3b 0a 0a 20 20 20 20 2f 2a 20  8 bEof;..    /* 
2e810 46 69 6e 64 20 74 68 65 20 72 6f 6f 74 20 6f 66  Find the root of
2e820 20 74 68 65 20 4e 45 41 52 20 65 78 70 72 65 73   the NEAR expres
2e830 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 52 6f 6f  sion */.    pRoo
2e840 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 77  t = pExpr;.    w
2e850 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e 70 50 61  hile( pRoot->pPa
2e860 72 65 6e 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  rent && pRoot->p
2e870 50 61 72 65 6e 74 2d 3e 65 54 79 70 65 3d 3d 46  Parent->eType==F
2e880 54 53 51 55 45 52 59 5f 4e 45 41 52 20 29 7b 0a  TSQUERY_NEAR ){.
2e890 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 52        pRoot = pR
2e8a0 6f 6f 74 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  oot->pParent;.  
2e8b0 20 20 7d 0a 20 20 20 20 69 44 6f 63 69 64 20 3d    }.    iDocid =
2e8c0 20 70 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 3b 0a   pRoot->iDocid;.
2e8d0 20 20 20 20 62 45 6f 66 20 3d 20 70 52 6f 6f 74      bEof = pRoot
2e8e0 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 61 73 73 65  ->bEof;.    asse
2e8f0 72 74 28 20 70 52 6f 6f 74 2d 3e 62 53 74 61 72  rt( pRoot->bStar
2e900 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  t );..    /* All
2e910 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
2e920 74 68 65 20 61 4d 53 49 5b 5d 20 61 72 72 61 79  the aMSI[] array
2e930 20 6f 66 20 65 61 63 68 20 46 54 53 51 55 45 52   of each FTSQUER
2e940 59 5f 50 48 52 41 53 45 20 6e 6f 64 65 20 2a 2f  Y_PHRASE node */
2e950 0a 20 20 20 20 66 6f 72 28 70 3d 70 52 6f 6f 74  .    for(p=pRoot
2e960 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29  ; p; p=p->pLeft)
2e970 7b 0a 20 20 20 20 20 20 46 74 73 33 45 78 70 72  {.      Fts3Expr
2e980 20 2a 70 45 20 3d 20 28 70 2d 3e 65 54 79 70 65   *pE = (p->eType
2e990 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53  ==FTSQUERY_PHRAS
2e9a0 45 3f 70 3a 70 2d 3e 70 52 69 67 68 74 29 3b 0a  E?p:p->pRight);.
2e9b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2e9c0 2d 3e 61 4d 49 3d 3d 30 20 29 3b 0a 20 20 20 20  ->aMI==0 );.    
2e9d0 20 20 70 45 2d 3e 61 4d 49 20 3d 20 28 75 33 32    pE->aMI = (u32
2e9e0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
2e9f0 63 28 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20  c(pTab->nColumn 
2ea00 2a 20 33 20 2a 20 73 69 7a 65 6f 66 28 75 33 32  * 3 * sizeof(u32
2ea10 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ));.      if( !p
2ea20 45 2d 3e 61 4d 49 20 29 20 72 65 74 75 72 6e 20  E->aMI ) return 
2ea30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2ea40 20 20 20 20 6d 65 6d 73 65 74 28 70 45 2d 3e 61      memset(pE->a
2ea50 4d 49 2c 20 30 2c 20 70 54 61 62 2d 3e 6e 43 6f  MI, 0, pTab->nCo
2ea60 6c 75 6d 6e 20 2a 20 33 20 2a 20 73 69 7a 65 6f  lumn * 3 * sizeo
2ea70 66 28 75 33 32 29 29 3b 0a 20 20 20 20 7d 0a 0a  f(u32));.    }..
2ea80 20 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74      fts3EvalRest
2ea90 61 72 74 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c  art(pCsr, pRoot,
2eaa0 20 26 72 63 29 3b 0a 0a 20 20 20 20 77 68 69 6c   &rc);..    whil
2eab0 65 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d  e( pCsr->isEof==
2eac0 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 && rc==SQLITE_
2ead0 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20 64 6f 20  OK ){..      do 
2eae0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 73  {.        /* Ens
2eaf0 75 72 65 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e  ure the %_conten
2eb00 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  t statement is r
2eb10 65 73 65 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  eset. */.       
2eb20 20 69 66 28 20 70 43 73 72 2d 3e 69 73 52 65 71   if( pCsr->isReq
2eb30 75 69 72 65 53 65 65 6b 3d 3d 30 20 29 20 73 71  uireSeek==0 ) sq
2eb40 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72  lite3_reset(pCsr
2eb50 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
2eb60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2eb70 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 43 73  3_data_count(pCs
2eb80 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20 29 3b 0a  r->pStmt)==0 );.
2eb90 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61  .        /* Adva
2eba0 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
2ebb0 64 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  document */.    
2ebc0 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74      fts3EvalNext
2ebd0 52 6f 77 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c  Row(pCsr, pRoot,
2ebe0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 70   &rc);.        p
2ebf0 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20 70 52 6f  Csr->isEof = pRo
2ec00 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 20 20  ot->bEof;.      
2ec10 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 72    pCsr->isRequir
2ec20 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20 20 20 20  eSeek = 1;.     
2ec30 20 20 20 70 43 73 72 2d 3e 69 73 4d 61 74 63 68     pCsr->isMatch
2ec40 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b 0a  infoNeeded = 1;.
2ec50 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50          pCsr->iP
2ec60 72 65 76 49 64 20 3d 20 70 52 6f 6f 74 2d 3e 69  revId = pRoot->i
2ec70 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 7d 77 68  Docid;.      }wh
2ec80 69 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f 66  ile( pCsr->isEof
2ec90 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  ==0 .           
2eca0 26 26 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 3d  && pRoot->eType=
2ecb0 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 0a  =FTSQUERY_NEAR .
2ecc0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
2ecd0 6c 69 74 65 33 46 74 73 33 45 76 61 6c 54 65 73  lite3Fts3EvalTes
2ece0 74 44 65 66 65 72 72 65 64 28 70 43 73 72 2c 20  tDeferred(pCsr, 
2ecf0 26 72 63 29 20 0a 20 20 20 20 20 20 29 3b 0a 0a  &rc) .      );..
2ed00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ed10 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 73 72 2d  LITE_OK && pCsr-
2ed20 3e 69 73 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  >isEof==0 ){.   
2ed30 20 20 20 20 20 66 74 73 33 45 76 61 6c 55 70 64       fts3EvalUpd
2ed40 61 74 65 43 6f 75 6e 74 73 28 70 52 6f 6f 74 29  ateCounts(pRoot)
2ed50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ed60 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66  .    pCsr->isEof
2ed70 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e   = 0;.    pCsr->
2ed80 69 50 72 65 76 49 64 20 3d 20 69 50 72 65 76 49  iPrevId = iPrevI
2ed90 64 3b 0a 0a 20 20 20 20 69 66 28 20 62 45 6f 66  d;..    if( bEof
2eda0 20 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d   ){.      pRoot-
2edb0 3e 62 45 6f 66 20 3d 20 62 45 6f 66 3b 0a 20 20  >bEof = bEof;.  
2edc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2edd0 2a 20 43 61 75 74 69 6f 6e 3a 20 70 52 6f 6f 74  * Caution: pRoot
2ede0 20 6d 61 79 20 69 74 65 72 61 74 65 20 74 68 72   may iterate thr
2edf0 6f 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 61  ough docids in a
2ee00 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
2ee10 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ending.      ** 
2ee20 6f 72 64 65 72 2e 20 46 6f 72 20 74 68 69 73 20  order. For this 
2ee30 72 65 61 73 6f 6e 2c 20 65 76 65 6e 20 74 68 6f  reason, even tho
2ee40 75 67 68 20 69 74 20 73 65 65 6d 73 20 6d 6f 72  ugh it seems mor
2ee50 65 20 64 65 66 65 6e 73 69 76 65 2c 20 74 68 65  e defensive, the
2ee60 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6c 6f   .      ** do lo
2ee70 6f 70 20 63 61 6e 20 6e 6f 74 20 62 65 20 77 72  op can not be wr
2ee80 69 74 74 65 6e 3a 0a 20 20 20 20 20 20 2a 2a 0a  itten:.      **.
2ee90 20 20 20 20 20 20 2a 2a 20 20 20 64 6f 20 7b 2e        **   do {.
2eea0 2e 2e 7d 20 77 68 69 6c 65 28 20 70 52 6f 6f 74  ..} while( pRoot
2eeb0 2d 3e 69 44 6f 63 69 64 3c 69 44 6f 63 69 64 20  ->iDocid<iDocid 
2eec0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2eed0 20 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20   );.      */.   
2eee0 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74 61     fts3EvalResta
2eef0 72 74 28 70 43 73 72 2c 20 70 52 6f 6f 74 2c 20  rt(pCsr, pRoot, 
2ef00 26 72 63 29 3b 0a 20 20 20 20 20 20 64 6f 20 7b  &rc);.      do {
2ef10 0a 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61  .        fts3Eva
2ef20 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70  lNextRow(pCsr, p
2ef30 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  Root, &rc);.    
2ef40 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
2ef50 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  t->bEof==0 );.  
2ef60 20 20 20 20 7d 77 68 69 6c 65 28 20 70 52 6f 6f      }while( pRoo
2ef70 74 2d 3e 69 44 6f 63 69 64 21 3d 69 44 6f 63 69  t->iDocid!=iDoci
2ef80 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
2ef90 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OK );.    }.  }.
2efa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2efb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2efc0 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20 74  ion is used by t
2efd0 68 65 20 6d 61 74 63 68 69 6e 66 6f 28 29 20 6d  he matchinfo() m
2efe0 6f 64 75 6c 65 20 74 6f 20 71 75 65 72 79 20 61  odule to query a
2eff0 20 70 68 72 61 73 65 20 0a 2a 2a 20 65 78 70 72   phrase .** expr
2f000 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
2f010 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  the following in
2f020 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  formation:.**.**
2f030 20 20 20 31 2e 20 54 68 65 20 74 6f 74 61 6c 20     1. The total 
2f040 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72  number of occurr
2f050 65 6e 63 65 73 20 6f 66 20 74 68 65 20 70 68 72  ences of the phr
2f060 61 73 65 20 69 6e 20 65 61 63 68 20 63 6f 6c 75  ase in each colu
2f070 6d 6e 20 6f 66 20 0a 2a 2a 20 20 20 20 20 20 74  mn of .**      t
2f080 68 65 20 46 54 53 20 74 61 62 6c 65 20 28 63 6f  he FTS table (co
2f090 6e 73 69 64 65 72 69 6e 67 20 61 6c 6c 20 72 6f  nsidering all ro
2f0a0 77 73 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ws), and.**.**  
2f0b0 20 32 2e 20 46 6f 72 20 65 61 63 68 20 63 6f 6c   2. For each col
2f0c0 75 6d 6e 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  umn, the number 
2f0d0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
2f0e0 61 62 6c 65 20 66 6f 72 20 77 68 69 63 68 20 74  able for which t
2f0f0 68 65 0a 2a 2a 20 20 20 20 20 20 63 6f 6c 75 6d  he.**      colum
2f100 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  n contains at le
2f110 61 73 74 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  ast one instance
2f120 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 2e 0a   of the phrase..
2f130 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
2f140 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
2f150 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2f160 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 66  and the values f
2f170 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a  or each column.*
2f180 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  * written into t
2f190 68 65 20 61 72 72 61 79 20 61 69 4f 75 74 20 61  he array aiOut a
2f1a0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2f1b0 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20     aiOut[iCol*3 
2f1c0 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66  + 1] = Number of
2f1d0 20 6f 63 63 75 72 72 65 6e 63 65 73 0a 2a 2a 20   occurrences.** 
2f1e0 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b    aiOut[iCol*3 +
2f1f0 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20   2] = Number of 
2f200 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  rows containing 
2f210 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73  at least one ins
2f220 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 43 61 76 65  tance.**.** Cave
2f230 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ats:.**.**   * I
2f240 66 20 61 20 70 68 72 61 73 65 20 63 6f 6e 73 69  f a phrase consi
2f250 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
2f260 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c  deferred tokens,
2f270 20 74 68 65 6e 20 61 6c 6c 20 6f 75 74 70 75 74   then all output
2f280 20 0a 2a 2a 20 20 20 20 20 76 61 6c 75 65 73 20   .**     values 
2f290 61 72 65 20 73 65 74 20 74 6f 20 74 68 65 20 6e  are set to the n
2f2a0 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
2f2b0 74 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ts in the table.
2f2c0 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   In other.**    
2f2d0 20 77 6f 72 64 73 20 77 65 20 61 73 73 75 6d 65   words we assume
2f2e0 20 74 68 61 74 20 76 65 72 79 20 63 6f 6d 6d 6f   that very commo
2f2f0 6e 20 74 6f 6b 65 6e 73 20 6f 63 63 75 72 20 65  n tokens occur e
2f300 78 61 63 74 6c 79 20 6f 6e 63 65 20 69 6e 20 65  xactly once in e
2f310 61 63 68 20 0a 2a 2a 20 20 20 20 20 63 6f 6c 75  ach .**     colu
2f320 6d 6e 20 6f 66 20 65 61 63 68 20 72 6f 77 20 6f  mn of each row o
2f330 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2f340 2a 2a 20 20 20 2a 20 49 66 20 61 20 70 68 72 61  **   * If a phra
2f350 73 65 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  se contains some
2f360 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73   deferred tokens
2f370 20 28 61 6e 64 20 73 6f 6d 65 20 6e 6f 6e 2d 64   (and some non-d
2f380 65 66 65 72 72 65 64 20 0a 2a 2a 20 20 20 20 20  eferred .**     
2f390 74 6f 6b 65 6e 73 29 2c 20 63 6f 75 6e 74 20 74  tokens), count t
2f3a0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6f 63 63  he potential occ
2f3b0 75 72 72 65 6e 63 65 20 69 64 65 6e 74 69 66 69  urrence identifi
2f3c0 65 64 20 62 79 20 63 6f 6e 73 69 64 65 72 69 6e  ed by considerin
2f3d0 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6e 6f 6e  g.**     the non
2f3e0 2d 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73  -deferred tokens
2f3f0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74 75   instead of actu
2f400 61 6c 20 70 68 72 61 73 65 20 6f 63 63 75 72 72  al phrase occurr
2f410 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  ences..**.**   *
2f420 20 49 66 20 74 68 65 20 70 68 72 61 73 65 20 69   If the phrase i
2f430 73 20 70 61 72 74 20 6f 66 20 61 20 4e 45 41 52  s part of a NEAR
2f440 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
2f450 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65 20 69 6e  n only phrase in
2f460 73 74 61 6e 63 65 73 0a 2a 2a 20 20 20 20 20 74  stances.**     t
2f470 68 61 74 20 6d 65 65 74 20 74 68 65 20 4e 45 41  hat meet the NEA
2f480 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 72 65  R constraint are
2f490 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2f4a0 20 63 6f 75 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20   counts..*/.int 
2f4b0 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c 50  sqlite3Fts3EvalP
2f4c0 68 72 61 73 65 53 74 61 74 73 28 0a 20 20 46 74  hraseStats(.  Ft
2f4d0 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  s3Cursor *pCsr, 
2f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f4f0 20 46 54 53 20 63 75 72 73 6f 72 20 68 61 6e 64   FTS cursor hand
2f500 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78 70 72  le */.  Fts3Expr
2f510 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
2f520 20 20 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73          /* Phras
2f530 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
2f540 20 20 75 33 32 20 2a 61 69 4f 75 74 20 20 20 20    u32 *aiOut    
2f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f560 20 20 2f 2a 20 41 72 72 61 79 20 74 6f 20 77 72    /* Array to wr
2f570 69 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f  ite results into
2f580 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
2f590 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  ){.  Fts3Table *
2f5a0 70 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c  pTab = (Fts3Tabl
2f5b0 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70  e *)pCsr->base.p
2f5c0 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Vtab;.  int rc =
2f5d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2f5e0 74 20 69 43 6f 6c 3b 0a 0a 20 20 69 66 28 20 70  t iCol;..  if( p
2f5f0 45 78 70 72 2d 3e 62 44 65 66 65 72 72 65 64 20  Expr->bDeferred 
2f600 26 26 20 70 45 78 70 72 2d 3e 70 50 61 72 65 6e  && pExpr->pParen
2f610 74 2d 3e 65 54 79 70 65 21 3d 46 54 53 51 55 45  t->eType!=FTSQUE
2f620 52 59 5f 4e 45 41 52 20 29 7b 0a 20 20 20 20 61  RY_NEAR ){.    a
2f630 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 44 6f  ssert( pCsr->nDo
2f640 63 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  c>0 );.    for(i
2f650 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
2f660 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b  ->nColumn; iCol+
2f670 2b 29 7b 0a 20 20 20 20 20 20 61 69 4f 75 74 5b  +){.      aiOut[
2f680 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 3d 20 28 75  iCol*3 + 1] = (u
2f690 33 32 29 70 43 73 72 2d 3e 6e 44 6f 63 3b 0a 20  32)pCsr->nDoc;. 
2f6a0 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a       aiOut[iCol*
2f6b0 33 20 2b 20 32 5d 20 3d 20 28 75 33 32 29 70 43  3 + 2] = (u32)pC
2f6c0 73 72 2d 3e 6e 44 6f 63 3b 0a 20 20 20 20 7d 0a  sr->nDoc;.    }.
2f6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2f6e0 3d 20 66 74 73 33 45 76 61 6c 47 61 74 68 65 72  = fts3EvalGather
2f6f0 53 74 61 74 73 28 70 43 73 72 2c 20 70 45 78 70  Stats(pCsr, pExp
2f700 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
2f710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f720 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
2f730 2d 3e 61 4d 49 20 29 3b 0a 20 20 20 20 20 20 66  ->aMI );.      f
2f740 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
2f750 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pTab->nColumn; i
2f760 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2f770 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20 2b 20 31  aiOut[iCol*3 + 1
2f780 5d 20 3d 20 70 45 78 70 72 2d 3e 61 4d 49 5b 69  ] = pExpr->aMI[i
2f790 43 6f 6c 2a 33 20 2b 20 31 5d 3b 0a 20 20 20 20  Col*3 + 1];.    
2f7a0 20 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33      aiOut[iCol*3
2f7b0 20 2b 20 32 5d 20 3d 20 70 45 78 70 72 2d 3e 61   + 2] = pExpr->a
2f7c0 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 32 5d 3b 0a  MI[iCol*3 + 2];.
2f7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f7e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2f7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
2f800 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 70 61  ression pExpr pa
2f810 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2f820 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
2f830 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
2f840 6d 75 73 74 20 62 65 20 6f 66 20 74 79 70 65 20  must be of type 
2f850 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 2e  FTSQUERY_PHRASE.
2f860 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
2f870 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
2f880 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 20 70  ther NULL or a p
2f890 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
2f8a0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
2f8b0 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74   a position-list
2f8c0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
2f8d0 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20 74  occurrences of t
2f8e0 68 65 20 70 68 72 61 73 65 20 69 6e 20 63 6f 6c  he phrase in col
2f8f0 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 6f 66 20 74  umn iCol.** of t
2f900 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20  he current row. 
2f910 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
2f920 69 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 72 65  ifically, the re
2f930 74 75 72 6e 65 64 20 62 75 66 66 65 72 20 63 6f  turned buffer co
2f940 6e 74 61 69 6e 73 20 31 20 76 61 72 69 6e 74 20  ntains 1 varint 
2f950 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 6f 63 63  for each .** occ
2f960 75 72 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70  urrence of the p
2f970 68 72 61 73 65 20 69 6e 20 74 68 65 20 63 6f 6c  hrase in the col
2f980 75 6d 6e 2c 20 73 74 6f 72 65 64 20 75 73 69 6e  umn, stored usin
2f990 67 20 74 68 65 20 6e 6f 72 6d 61 6c 20 28 64 65  g the normal (de
2f9a0 6c 74 61 2b 32 29 20 0a 2a 2a 20 63 6f 6d 70 72  lta+2) .** compr
2f9b0 65 73 73 69 6f 6e 20 61 6e 64 20 69 73 20 74 65  ession and is te
2f9c0 72 6d 69 6e 61 74 65 64 20 62 79 20 65 69 74 68  rminated by eith
2f9d0 65 72 20 61 6e 20 30 78 30 31 20 6f 72 20 30 78  er an 0x01 or 0x
2f9e0 30 30 20 62 79 74 65 2e 20 46 6f 72 20 65 78 61  00 byte. For exa
2f9f0 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74 68 65 20  mple,.** if the 
2fa00 72 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e  requested column
2fa10 20 63 6f 6e 74 61 69 6e 73 20 22 61 20 62 20 58   contains "a b X
2fa20 20 63 20 64 20 58 20 58 22 20 61 6e 64 20 74 68   c d X X" and th
2fa30 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 0a  e position-list.
2fa40 2a 2a 20 66 6f 72 20 27 58 27 20 69 73 20 72 65  ** for 'X' is re
2fa50 71 75 65 73 74 65 64 2c 20 74 68 65 20 62 75 66  quested, the buf
2fa60 66 65 72 20 72 65 74 75 72 6e 65 64 20 6d 61 79  fer returned may
2fa70 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20   contain:.**.** 
2fa80 20 20 20 20 30 78 30 34 20 30 78 30 35 20 30 78      0x04 0x05 0x
2fa90 30 33 20 30 78 30 31 20 20 20 6f 72 20 20 20 30  03 0x01   or   0
2faa0 78 30 34 20 30 78 30 35 20 30 78 30 33 20 30 78  x04 0x05 0x03 0x
2fab0 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  00.**.** This fu
2fac0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 72 65 67  nction works reg
2fad0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2fae0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 68  er or not the ph
2faf0 72 61 73 65 20 69 73 20 64 65 66 65 72 72 65 64  rase is deferred
2fb00 2c 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  ,.** incremental
2fb10 2c 20 6f 72 20 6e 65 69 74 68 65 72 2e 0a 2a 2f  , or neither..*/
2fb20 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2fb30 45 76 61 6c 50 68 72 61 73 65 50 6f 73 6c 69 73  EvalPhrasePoslis
2fb40 74 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  t(.  Fts3Cursor 
2fb50 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
2fb60 20 20 20 20 20 2f 2a 20 46 54 53 33 20 63 75 72       /* FTS3 cur
2fb70 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
2fb80 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c  Fts3Expr *pExpr,
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fba0 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 72 65 74  /* Phrase to ret
2fbb0 75 72 6e 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  urn doclist for 
2fbc0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbe0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
2fbf0 6f 20 72 65 74 75 72 6e 20 70 6f 73 69 74 69 6f  o return positio
2fc00 6e 20 6c 69 73 74 20 66 6f 72 20 2a 2f 0a 20 20  n list for */.  
2fc10 63 68 61 72 20 2a 2a 70 70 4f 75 74 20 20 20 20  char **ppOut    
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc30 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
2fc40 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  to position list
2fc50 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 50 68 72   */.){.  Fts3Phr
2fc60 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d 20 70  ase *pPhrase = p
2fc70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20  Expr->pPhrase;. 
2fc80 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
2fc90 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
2fca0 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
2fcb0 3b 0a 20 20 63 68 61 72 20 2a 70 49 74 65 72 3b  ;.  char *pIter;
2fcc0 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20 20  .  int iThis;.  
2fcd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44  sqlite3_int64 iD
2fce0 6f 63 69 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ocid;..  /* If t
2fcf0 68 69 73 20 70 68 72 61 73 65 20 69 73 20 61 70  his phrase is ap
2fd00 70 6c 69 65 73 20 73 70 65 63 69 66 69 63 61 6c  plies specifical
2fd10 6c 79 20 74 6f 20 73 6f 6d 65 20 63 6f 6c 75 6d  ly to some colum
2fd20 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 0a 20 20  n other than .  
2fd30 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  ** column iCol, 
2fd40 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70 6f  return a NULL po
2fd50 69 6e 74 65 72 2e 20 20 2a 2f 0a 20 20 2a 70 70  inter.  */.  *pp
2fd60 4f 75 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Out = 0;.  asser
2fd70 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
2fd80 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pTab->nColumn
2fd90 20 29 3b 0a 20 20 69 66 28 20 28 70 50 68 72 61   );.  if( (pPhra
2fda0 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  se->iColumn<pTab
2fdb0 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 50 68  ->nColumn && pPh
2fdc0 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  rase->iColumn!=i
2fdd0 43 6f 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Col) ){.    retu
2fde0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2fdf0 7d 0a 0a 20 20 69 44 6f 63 69 64 20 3d 20 70 45  }..  iDocid = pE
2fe00 78 70 72 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 70  xpr->iDocid;.  p
2fe10 49 74 65 72 20 3d 20 70 50 68 72 61 73 65 2d 3e  Iter = pPhrase->
2fe20 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 20  doclist.pList;. 
2fe30 20 69 66 28 20 69 44 6f 63 69 64 21 3d 70 43 73   if( iDocid!=pCs
2fe40 72 2d 3e 69 50 72 65 76 49 64 20 7c 7c 20 70 45  r->iPrevId || pE
2fe50 78 70 72 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20  xpr->bEof ){.   
2fe60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2fe70 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 62 44 65  _OK;.    int bDe
2fe80 73 63 44 6f 63 6c 69 73 74 20 3d 20 70 54 61 62  scDoclist = pTab
2fe90 2d 3e 62 44 65 73 63 49 64 78 3b 20 20 20 20 20  ->bDescIdx;     
2fea0 20 2f 2a 20 46 6f 72 20 44 4f 43 49 44 5f 43 4d   /* For DOCID_CM
2feb0 50 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 20 20 69  P macro */.    i
2fec0 6e 74 20 62 4f 72 20 3d 20 30 3b 0a 20 20 20 20  nt bOr = 0;.    
2fed0 75 38 20 62 54 72 65 65 45 6f 66 20 3d 20 30 3b  u8 bTreeEof = 0;
2fee0 0a 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70  .    Fts3Expr *p
2fef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff00 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
2ff10 65 72 61 74 65 20 66 72 6f 6d 20 70 45 78 70 72  erate from pExpr
2ff20 20 74 6f 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20   to root */.    
2ff30 46 74 73 33 45 78 70 72 20 2a 70 4e 65 61 72 3b  Fts3Expr *pNear;
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ff50 20 4d 6f 73 74 20 73 65 6e 69 6f 72 20 4e 45 41   Most senior NEA
2ff60 52 20 61 6e 63 65 73 74 6f 72 20 28 6f 72 20 70  R ancestor (or p
2ff70 45 78 70 72 29 20 2a 2f 0a 20 20 20 20 69 6e 74  Expr) */.    int
2ff80 20 62 4d 61 74 63 68 3b 0a 0a 20 20 20 20 2f 2a   bMatch;..    /*
2ff90 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 70   Check if this p
2ffa0 68 72 61 73 65 20 64 65 73 63 65 6e 64 73 20 66  hrase descends f
2ffb0 72 6f 6d 20 61 6e 20 4f 52 20 65 78 70 72 65 73  rom an OR expres
2ffc0 73 69 6f 6e 20 6e 6f 64 65 2e 20 49 66 20 6e 6f  sion node. If no
2ffd0 74 2c 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  t, .    ** retur
2ffe0 6e 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73  n NULL. Otherwis
2fff0 65 2c 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  e, the entry tha
30000 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
30010 20 64 6f 63 69 64 20 0a 20 20 20 20 2a 2a 20 70   docid .    ** p
30020 43 73 72 2d 3e 69 50 72 65 76 49 64 20 6d 61 79  Csr->iPrevId may
30030 20 6c 69 65 20 65 61 72 6c 69 65 72 20 69 6e 20   lie earlier in 
30040 74 68 65 20 64 6f 63 6c 69 73 74 20 62 75 66 66  the doclist buff
30050 65 72 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20  er. Or, if the. 
30060 20 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20     ** tree that 
30070 74 68 65 20 6e 6f 64 65 20 69 73 20 70 61 72 74  the node is part
30080 20 6f 66 20 68 61 73 20 62 65 65 6e 20 6d 61 72   of has been mar
30090 6b 65 64 20 61 73 20 45 4f 46 2c 20 62 75 74 20  ked as EOF, but 
300a0 74 68 65 20 6e 6f 64 65 0a 20 20 20 20 2a 2a 20  the node.    ** 
300b0 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 45 4f  itself is not EO
300c0 46 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 70  F, then it may p
300d0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 61 72 6c 69  oint to an earli
300e0 65 72 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20  er entry. */.   
300f0 20 70 4e 65 61 72 20 3d 20 70 45 78 70 72 3b 0a   pNear = pExpr;.
30100 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70 72 2d      for(p=pExpr-
30110 3e 70 50 61 72 65 6e 74 3b 20 70 3b 20 70 3d 70  >pParent; p; p=p
30120 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20 20 20 20  ->pParent){.    
30130 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
30140 46 54 53 51 55 45 52 59 5f 4f 52 20 29 20 62 4f  FTSQUERY_OR ) bO
30150 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
30160 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55   p->eType==FTSQU
30170 45 52 59 5f 4e 45 41 52 20 29 20 70 4e 65 61 72  ERY_NEAR ) pNear
30180 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
30190 70 2d 3e 62 45 6f 66 20 29 20 62 54 72 65 65 45  p->bEof ) bTreeE
301a0 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
301b0 20 20 69 66 28 20 62 4f 72 3d 3d 30 20 29 20 72    if( bOr==0 ) r
301c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
301d0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  ..    /* This is
301e0 20 74 68 65 20 64 65 73 63 65 6e 64 65 6e 74 20   the descendent 
301f0 6f 66 20 61 6e 20 4f 52 20 6e 6f 64 65 2e 20 49  of an OR node. I
30200 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63  n this case we c
30210 61 6e 6e 6f 74 20 75 73 65 0a 20 20 20 20 2a 2a  annot use.    **
30220 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
30230 70 68 72 61 73 65 2e 20 4c 6f 61 64 20 74 68 65  phrase. Load the
30240 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
30250 66 6f 72 20 74 68 65 20 70 68 72 61 73 65 0a 20  for the phrase. 
30260 20 20 20 2a 2a 20 69 6e 74 6f 20 6d 65 6d 6f 72     ** into memor
30270 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
30280 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 68 72   */.    if( pPhr
30290 61 73 65 2d 3e 62 49 6e 63 72 20 29 7b 0a 20 20  ase->bIncr ){.  
302a0 20 20 20 20 69 6e 74 20 62 45 6f 66 53 61 76 65      int bEofSave
302b0 20 3d 20 70 4e 65 61 72 2d 3e 62 45 6f 66 3b 0a   = pNear->bEof;.
302c0 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 52 65        fts3EvalRe
302d0 73 74 61 72 74 28 70 43 73 72 2c 20 70 4e 65 61  start(pCsr, pNea
302e0 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 77  r, &rc);.      w
302f0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
30300 5f 4f 4b 20 26 26 20 21 70 4e 65 61 72 2d 3e 62  _OK && !pNear->b
30310 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66  Eof ){.        f
30320 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70  ts3EvalNextRow(p
30330 43 73 72 2c 20 70 4e 65 61 72 2c 20 26 72 63 29  Csr, pNear, &rc)
30340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 45  ;.        if( bE
30350 6f 66 53 61 76 65 3d 3d 30 20 26 26 20 70 4e 65  ofSave==0 && pNe
30360 61 72 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63  ar->iDocid==iDoc
30370 69 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  id ) break;.    
30380 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
30390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
303a0 7c 7c 20 70 50 68 72 61 73 65 2d 3e 62 49 6e 63  || pPhrase->bInc
303b0 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  r==0 );.    }.  
303c0 20 20 69 66 28 20 62 54 72 65 65 45 6f 66 20 29    if( bTreeEof )
303d0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72  {.      while( r
303e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
303f0 21 70 4e 65 61 72 2d 3e 62 45 6f 66 20 29 7b 0a  !pNear->bEof ){.
30400 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
30410 4e 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4e  NextRow(pCsr, pN
30420 65 61 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ear, &rc);.     
30430 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
30440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30450 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
30460 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
30470 20 66 6f 72 28 70 3d 70 4e 65 61 72 3b 20 70 3b   for(p=pNear; p;
30480 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b 0a 20 20   p=p->pLeft){.  
30490 20 20 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b      u8 bEof = 0;
304a0 0a 20 20 20 20 20 20 46 74 73 33 45 78 70 72 20  .      Fts3Expr 
304b0 2a 70 54 65 73 74 20 3d 20 70 3b 0a 20 20 20 20  *pTest = p;.    
304c0 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50    Fts3Phrase *pP
304d0 68 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  h;.      assert(
304e0 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46   pTest->eType==F
304f0 54 53 51 55 45 52 59 5f 4e 45 41 52 20 7c 7c 20  TSQUERY_NEAR || 
30500 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54  pTest->eType==FT
30510 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 3b  SQUERY_PHRASE );
30520 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 73 74  .      if( pTest
30530 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
30540 59 5f 4e 45 41 52 20 29 20 70 54 65 73 74 20 3d  Y_NEAR ) pTest =
30550 20 70 54 65 73 74 2d 3e 70 52 69 67 68 74 3b 0a   pTest->pRight;.
30560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
30570 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  est->eType==FTSQ
30580 55 45 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20  UERY_PHRASE );. 
30590 20 20 20 20 20 70 50 68 20 3d 20 70 54 65 73 74       pPh = pTest
305a0 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20 20 20 20  ->pPhrase;..    
305b0 20 20 70 49 74 65 72 20 3d 20 70 50 68 2d 3e 70    pIter = pPh->p
305c0 4f 72 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20  OrPoslist;.     
305d0 20 69 44 6f 63 69 64 20 3d 20 70 50 68 2d 3e 69   iDocid = pPh->i
305e0 4f 72 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 69  OrDocid;.      i
305f0 66 28 20 70 43 73 72 2d 3e 62 44 65 73 63 3d 3d  f( pCsr->bDesc==
30600 62 44 65 73 63 44 6f 63 6c 69 73 74 20 29 7b 0a  bDescDoclist ){.
30610 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20 21          bEof = !
30620 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c  pPh->doclist.nAl
30630 6c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 28  l ||.          (
30640 70 49 74 65 72 20 3e 3d 20 28 70 50 68 2d 3e 64  pIter >= (pPh->d
30650 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 2b 20 70 50  oclist.aAll + pP
30660 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 29  h->doclist.nAll)
30670 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
30680 28 20 28 70 49 74 65 72 3d 3d 30 20 7c 7c 20 44  ( (pIter==0 || D
30690 4f 43 49 44 5f 43 4d 50 28 69 44 6f 63 69 64 2c  OCID_CMP(iDocid,
306a0 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 29 3c   pCsr->iPrevId)<
306b0 30 20 29 20 26 26 20 62 45 6f 66 3d 3d 30 20 29  0 ) && bEof==0 )
306c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
306d0 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 4e 65  te3Fts3DoclistNe
306e0 78 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt(.            
306f0 20 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20    bDescDoclist, 
30700 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c  pPh->doclist.aAl
30710 6c 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e  l, pPh->doclist.
30720 6e 41 6c 6c 2c 20 0a 20 20 20 20 20 20 20 20 20  nAll, .         
30730 20 20 20 20 20 26 70 49 74 65 72 2c 20 26 69 44       &pIter, &iD
30740 6f 63 69 64 2c 20 26 62 45 6f 66 0a 20 20 20 20  ocid, &bEof.    
30750 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
30760 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
30770 20 20 20 20 20 20 20 20 62 45 6f 66 20 3d 20 21          bEof = !
30780 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c  pPh->doclist.nAl
30790 6c 20 7c 7c 20 28 70 49 74 65 72 20 26 26 20 70  l || (pIter && p
307a0 49 74 65 72 3c 3d 70 50 68 2d 3e 64 6f 63 6c 69  Iter<=pPh->docli
307b0 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20 20 20 20  st.aAll);.      
307c0 20 20 77 68 69 6c 65 28 20 28 70 49 74 65 72 3d    while( (pIter=
307d0 3d 30 20 7c 7c 20 44 4f 43 49 44 5f 43 4d 50 28  =0 || DOCID_CMP(
307e0 69 44 6f 63 69 64 2c 20 70 43 73 72 2d 3e 69 50  iDocid, pCsr->iP
307f0 72 65 76 49 64 29 3e 30 20 29 20 26 26 20 62 45  revId)>0 ) && bE
30800 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
30810 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20     int dummy;.  
30820 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
30830 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 0a  ts3DoclistPrev(.
30840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 44                bD
30850 65 73 63 44 6f 63 6c 69 73 74 2c 20 70 50 68 2d  escDoclist, pPh-
30860 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c 20 70  >doclist.aAll, p
30870 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c  Ph->doclist.nAll
30880 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
30890 20 26 70 49 74 65 72 2c 20 26 69 44 6f 63 69 64   &pIter, &iDocid
308a0 2c 20 26 64 75 6d 6d 79 2c 20 26 62 45 6f 66 0a  , &dummy, &bEof.
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b                );
308c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
308d0 20 7d 0a 20 20 20 20 20 20 70 50 68 2d 3e 70 4f   }.      pPh->pO
308e0 72 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72  rPoslist = pIter
308f0 3b 0a 20 20 20 20 20 20 70 50 68 2d 3e 69 4f 72  ;.      pPh->iOr
30900 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a  Docid = iDocid;.
30910 20 20 20 20 20 20 69 66 28 20 62 45 6f 66 20 7c        if( bEof |
30920 7c 20 69 44 6f 63 69 64 21 3d 70 43 73 72 2d 3e  | iDocid!=pCsr->
30930 69 50 72 65 76 49 64 20 29 20 62 4d 61 74 63 68  iPrevId ) bMatch
30940 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
30950 20 69 66 28 20 62 4d 61 74 63 68 20 29 7b 0a 20   if( bMatch ){. 
30960 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 50 68       pIter = pPh
30970 72 61 73 65 2d 3e 70 4f 72 50 6f 73 6c 69 73 74  rase->pOrPoslist
30980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30990 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
309a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 49    }.  }.  if( pI
309b0 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
309c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
309d0 28 20 2a 70 49 74 65 72 3d 3d 30 78 30 31 20 29  ( *pIter==0x01 )
309e0 7b 0a 20 20 20 20 70 49 74 65 72 2b 2b 3b 0a 20  {.    pIter++;. 
309f0 20 20 20 70 49 74 65 72 20 2b 3d 20 66 74 73 33     pIter += fts3
30a00 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  GetVarint32(pIte
30a10 72 2c 20 26 69 54 68 69 73 29 3b 0a 20 20 7d 65  r, &iThis);.  }e
30a20 6c 73 65 7b 0a 20 20 20 20 69 54 68 69 73 20 3d  lse{.    iThis =
30a30 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
30a40 20 69 54 68 69 73 3c 69 43 6f 6c 20 29 7b 0a 20   iThis<iCol ){. 
30a50 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
30a60 74 43 6f 70 79 28 30 2c 20 26 70 49 74 65 72 29  tCopy(0, &pIter)
30a70 3b 0a 20 20 20 20 69 66 28 20 2a 70 49 74 65 72  ;.    if( *pIter
30a80 3d 3d 30 78 30 30 20 29 20 72 65 74 75 72 6e 20  ==0x00 ) return 
30a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70  SQLITE_OK;.    p
30aa0 49 74 65 72 2b 2b 3b 0a 20 20 20 20 70 49 74 65  Iter++;.    pIte
30ab0 72 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69  r += fts3GetVari
30ac0 6e 74 33 32 28 70 49 74 65 72 2c 20 26 69 54 68  nt32(pIter, &iTh
30ad0 69 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  is);.  }.  if( *
30ae0 70 49 74 65 72 3d 3d 30 78 30 30 20 29 7b 0a 20  pIter==0x00 ){. 
30af0 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
30b00 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 28 28  }..  *ppOut = ((
30b10 69 43 6f 6c 3d 3d 69 54 68 69 73 29 3f 70 49 74  iCol==iThis)?pIt
30b20 65 72 3a 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  er:0);.  return 
30b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
30b40 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 63 6f 6d  .** Free all com
30b50 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68 65 20 46  ponents of the F
30b60 74 73 33 50 68 72 61 73 65 20 73 74 72 75 63 74  ts3Phrase struct
30b70 75 72 65 20 74 68 61 74 20 77 65 72 65 20 61 6c  ure that were al
30b80 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
30b90 65 20 65 76 61 6c 20 6d 6f 64 75 6c 65 2e 20 53  e eval module. S
30ba0 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
30bb0 73 20 6d 65 61 6e 73 20 74 6f 20 66 72 65 65 3a  s means to free:
30bc0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 63  .**.**   * the c
30bd0 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 68 72 61  ontents of pPhra
30be0 73 65 2d 3e 64 6f 63 6c 69 73 74 2c 20 61 6e 64  se->doclist, and
30bf0 0a 2a 2a 20 20 20 2a 20 61 6e 79 20 46 74 73 33  .**   * any Fts3
30c00 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 6f  MultiSegReader o
30c10 62 6a 65 63 74 73 20 68 65 6c 64 20 62 79 20 70  bjects held by p
30c20 68 72 61 73 65 20 74 6f 6b 65 6e 73 2e 0a 2a 2f  hrase tokens..*/
30c30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
30c40 33 45 76 61 6c 50 68 72 61 73 65 43 6c 65 61 6e  3EvalPhraseClean
30c50 75 70 28 46 74 73 33 50 68 72 61 73 65 20 2a 70  up(Fts3Phrase *p
30c60 50 68 72 61 73 65 29 7b 0a 20 20 69 66 28 20 70  Phrase){.  if( p
30c70 50 68 72 61 73 65 20 29 7b 0a 20 20 20 20 69 6e  Phrase ){.    in
30c80 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
30c90 5f 66 72 65 65 28 70 50 68 72 61 73 65 2d 3e 64  _free(pPhrase->d
30ca0 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20  oclist.aAll);.  
30cb0 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69    fts3EvalInvali
30cc0 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68 72  datePoslist(pPhr
30cd0 61 73 65 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ase);.    memset
30ce0 28 26 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  (&pPhrase->docli
30cf0 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  st, 0, sizeof(Ft
30d00 73 33 44 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20  s3Doclist));.   
30d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 68 72   for(i=0; i<pPhr
30d20 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b  ase->nToken; i++
30d30 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67  ){.      fts3Seg
30d40 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65 65  ReaderCursorFree
30d50 28 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65 6e  (pPhrase->aToken
30d60 5b 69 5d 2e 70 53 65 67 63 73 72 29 3b 0a 20 20  [i].pSegcsr);.  
30d70 20 20 20 20 70 50 68 72 61 73 65 2d 3e 61 54 6f      pPhrase->aTo
30d80 6b 65 6e 5b 69 5d 2e 70 53 65 67 63 73 72 20 3d  ken[i].pSegcsr =
30d90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
30da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ../*.** Return S
30db0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
30dc0 41 42 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  AB..*/.#ifdef SQ
30dd0 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73  LITE_DEBUG.int s
30de0 71 6c 69 74 65 33 46 74 73 33 43 6f 72 72 75 70  qlite3Fts3Corrup
30df0 74 28 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  t(){.  return SQ
30e00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
30e10 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  B;.}.#endif..#if
30e20 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a 2f 2a   !SQLITE_CORE./*
30e30 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 41  .** Initialize A
30e40 50 49 20 70 6f 69 6e 74 65 72 20 74 61 62 6c 65  PI pointer table
30e50 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  , if required..*
30e60 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  /.#ifdef _WIN32.
30e70 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
30e80 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74  port).#endif.int
30e90 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 69 6e   sqlite3_fts3_in
30ea0 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  it(.  sqlite3 *d
30eb0 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  b, .  char **pzE
30ec0 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73  rrMsg,.  const s
30ed0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
30ee0 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53  nes *pApi.){.  S
30ef0 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
30f00 49 4e 49 54 32 28 70 41 70 69 29 0a 20 20 72 65  INIT2(pApi).  re
30f10 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 33  turn sqlite3Fts3
30f20 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64  Init(db);.}.#end
30f30 69 66 0a 0a 23 65 6e 64 69 66 0a                 if..#endif.