/ Hex Artifact Content
Login

Artifact e028eb13432f108d2e22cded019fc980700e4e00:


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 0a 2a  }.#endif.}../*.*
c950: 2a 20 53 65 74 20 74 68 65 20 53 51 4c 49 54 45  * Set the SQLITE
c960: 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51  _INDEX_SCAN_UNIQ
c970: 55 45 20 66 6c 61 67 20 69 6e 20 70 49 64 78 49  UE flag in pIdxI
c980: 6e 66 6f 2d 3e 66 6c 61 67 73 2e 20 55 6e 6c 65  nfo->flags. Unle
c990: 73 73 20 74 68 69 73 0a 2a 2a 20 65 78 74 65 6e  ss this.** exten
c9a0: 73 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  sion is currentl
c9b0: 79 20 62 65 69 6e 67 20 75 73 65 64 20 62 79 20  y being used by 
c9c0: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  a version of SQL
c9d0: 69 74 65 20 74 6f 6f 20 6f 6c 64 20 74 6f 0a 2a  ite too old to.*
c9e0: 2a 20 73 75 70 70 6f 72 74 20 69 6e 64 65 78 2d  * support index-
c9f0: 69 6e 66 6f 20 66 6c 61 67 73 2e 20 49 6e 20 74  info flags. In t
ca00: 68 61 74 20 63 61 73 65 20 74 68 69 73 20 66 75  hat case this fu
ca10: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
ca20: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
ca30: 64 20 66 74 73 33 53 65 74 55 6e 69 71 75 65 46  d fts3SetUniqueF
ca40: 6c 61 67 28 73 71 6c 69 74 65 33 5f 69 6e 64 65  lag(sqlite3_inde
ca50: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
ca60: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45  ){.#if SQLITE_VE
ca70: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30  RSION_NUMBER>=30
ca80: 30 38 30 31 32 0a 20 20 69 66 28 20 73 71 6c 69  08012.  if( sqli
ca90: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
caa0: 75 6d 62 65 72 28 29 3e 3d 33 30 30 38 30 31 32  umber()>=3008012
cab0: 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
cac0: 2d 3e 69 64 78 46 6c 61 67 73 20 7c 3d 20 53 51  ->idxFlags |= SQ
cad0: 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f  LITE_INDEX_SCAN_
cae0: 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 23 65 6e 64  UNIQUE;.  }.#end
caf0: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6d 70  if.}../* .** Imp
cb00: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
cb10: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
cb20: 74 68 6f 64 20 66 6f 72 20 46 54 53 33 20 74 61  thod for FTS3 ta
cb30: 62 6c 65 73 2e 20 54 68 65 72 65 0a 2a 2a 20 61  bles. There.** a
cb40: 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c  re three possibl
cb50: 65 20 73 74 72 61 74 65 67 69 65 73 2c 20 69 6e  e strategies, in
cb60: 20 6f 72 64 65 72 20 6f 66 20 70 72 65 66 65 72   order of prefer
cb70: 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  ence:.**.**   1.
cb80: 20 44 69 72 65 63 74 20 6c 6f 6f 6b 75 70 20 62   Direct lookup b
cb90: 79 20 72 6f 77 69 64 20 6f 72 20 64 6f 63 69 64  y rowid or docid
cba0: 2e 20 0a 2a 2a 20 20 20 32 2e 20 46 75 6c 6c 2d  . .**   2. Full-
cbb0: 74 65 78 74 20 73 65 61 72 63 68 20 75 73 69 6e  text search usin
cbc0: 67 20 61 20 4d 41 54 43 48 20 6f 70 65 72 61 74  g a MATCH operat
cbd0: 6f 72 20 6f 6e 20 61 20 6e 6f 6e 2d 64 6f 63 69  or on a non-doci
cbe0: 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 33  d column..**   3
cbf0: 2e 20 4c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  . Linear scan of
cc00: 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65   %_content table
cc10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc20: 66 74 73 33 42 65 73 74 49 6e 64 65 78 4d 65 74  fts3BestIndexMet
cc30: 68 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  hod(sqlite3_vtab
cc40: 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
cc50: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
cc60: 66 6f 29 7b 0a 20 20 46 74 73 33 54 61 62 6c 65  fo){.  Fts3Table
cc70: 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65   *p = (Fts3Table
cc80: 20 2a 29 70 56 54 61 62 3b 0a 20 20 69 6e 74 20   *)pVTab;.  int 
cc90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ccb0: 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
ccc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 73 20   */.  int iCons 
ccd0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
cce0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
ccf0: 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20  f constraint to 
cd00: 75 73 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 4c  use */..  int iL
cd10: 61 6e 67 69 64 43 6f 6e 73 20 3d 20 2d 31 3b 20  angidCons = -1; 
cd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
cd30: 65 78 20 6f 66 20 6c 61 6e 67 69 64 3d 78 20 63  ex of langid=x c
cd40: 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 70 72  onstraint, if pr
cd50: 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  esent */.  int i
cd60: 44 6f 63 69 64 47 65 20 3d 20 2d 31 3b 20 20 20  DocidGe = -1;   
cd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
cd80: 64 65 78 20 6f 66 20 64 6f 63 69 64 3e 3d 78 20  dex of docid>=x 
cd90: 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 70  constraint, if p
cda0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
cdb0: 69 44 6f 63 69 64 4c 65 20 3d 20 2d 31 3b 20 20  iDocidLe = -1;  
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cdd0: 6e 64 65 78 20 6f 66 20 64 6f 63 69 64 3c 3d 78  ndex of docid<=x
cde0: 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66 20   constraint, if 
cdf0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
ce00: 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 42 79 20   iIdx;..  /* By 
ce10: 64 65 66 61 75 6c 74 20 75 73 65 20 61 20 66 75  default use a fu
ce20: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 54  ll table scan. T
ce30: 68 69 73 20 69 73 20 61 6e 20 65 78 70 65 6e 73  his is an expens
ce40: 69 76 65 20 6f 70 74 69 6f 6e 2c 0a 20 20 2a 2a  ive option,.  **
ce50: 20 73 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75   so search throu
ce60: 67 68 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  gh the constrain
ce70: 74 73 20 74 6f 20 73 65 65 20 69 66 20 61 20 6d  ts to see if a m
ce80: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 0a 20  ore efficient . 
ce90: 20 2a 2a 20 73 74 72 61 74 65 67 79 20 69 73 20   ** strategy is 
cea0: 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
ceb0: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d   pInfo->idxNum =
cec0: 20 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53   FTS3_FULLSCAN_S
ced0: 45 41 52 43 48 3b 0a 20 20 70 49 6e 66 6f 2d 3e  EARCH;.  pInfo->
cee0: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
cef0: 35 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28 69  5000000;.  for(i
cf00: 3d 30 3b 20 69 3c 70 49 6e 66 6f 2d 3e 6e 43 6f  =0; i<pInfo->nCo
cf10: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
cf20: 20 20 20 20 69 6e 74 20 62 44 6f 63 69 64 3b 20      int bDocid; 
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
cf50: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 6e  constraint is on
cf60: 20 64 6f 63 69 64 20 2a 2f 0a 20 20 20 20 73 74   docid */.    st
cf70: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
cf80: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
cf90: 43 6f 6e 73 20 3d 20 26 70 49 6e 66 6f 2d 3e 61  Cons = &pInfo->a
cfa0: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 3b 0a 20  Constraint[i];. 
cfb0: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 75 73     if( pCons->us
cfc0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
cfd0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d   if( pCons->op==
cfe0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
cff0: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 7b  STRAINT_MATCH ){
d000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72  .        /* Ther
d010: 65 20 65 78 69 73 74 73 20 61 6e 20 75 6e 75 73  e exists an unus
d020: 61 62 6c 65 20 4d 41 54 43 48 20 63 6f 6e 73 74  able MATCH const
d030: 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  raint. This mean
d040: 73 20 74 68 61 74 20 69 66 0a 20 20 20 20 20 20  s that if.      
d050: 20 20 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72    ** the planner
d060: 20 64 6f 65 73 20 65 6c 65 63 74 20 74 6f 20 75   does elect to u
d070: 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
d080: 66 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 70  f this call as p
d090: 61 72 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  art.        ** o
d0a0: 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71 75  f the overall qu
d0b0: 65 72 79 20 70 6c 61 6e 20 74 68 65 20 75 73 65  ery plan the use
d0c0: 72 20 77 69 6c 6c 20 73 65 65 20 61 6e 20 22 75  r will see an "u
d0d0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 0a 20 20 20  nable to use.   
d0e0: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
d0f0: 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65   MATCH in the re
d100: 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 22  quested context"
d110: 20 65 72 72 6f 72 2e 20 54 6f 20 64 69 73 63 6f   error. To disco
d120: 75 72 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  urage.        **
d130: 20 74 68 69 73 2c 20 72 65 74 75 72 6e 20 61 20   this, return a 
d140: 76 65 72 79 20 68 69 67 68 20 63 6f 73 74 20 68  very high cost h
d150: 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ere.  */.       
d160: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d   pInfo->idxNum =
d170: 20 46 54 53 33 5f 46 55 4c 4c 53 43 41 4e 5f 53   FTS3_FULLSCAN_S
d180: 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70  EARCH;.        p
d190: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
d1a0: 6f 73 74 20 3d 20 31 65 35 30 3b 0a 20 20 20 20  ost = 1e50;.    
d1b0: 20 20 20 20 66 74 73 33 53 65 74 45 73 74 69 6d      fts3SetEstim
d1c0: 61 74 65 64 52 6f 77 73 28 70 49 6e 66 6f 2c 20  atedRows(pInfo, 
d1d0: 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
d1e0: 31 29 20 3c 3c 20 35 30 29 3b 0a 20 20 20 20 20  1) << 50);.     
d1f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d200: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
d210: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
d220: 20 7d 0a 0a 20 20 20 20 62 44 6f 63 69 64 20 3d   }..    bDocid =
d230: 20 28 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e   (pCons->iColumn
d240: 3c 30 20 7c 7c 20 70 43 6f 6e 73 2d 3e 69 43 6f  <0 || pCons->iCo
d250: 6c 75 6d 6e 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e  lumn==p->nColumn
d260: 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 64  +1);..    /* A d
d270: 69 72 65 63 74 20 6c 6f 6f 6b 75 70 20 6f 6e 20  irect lookup on 
d280: 74 68 65 20 72 6f 77 69 64 20 6f 72 20 64 6f 63  the rowid or doc
d290: 69 64 20 63 6f 6c 75 6d 6e 2e 20 41 73 73 69 67  id column. Assig
d2a0: 6e 20 61 20 63 6f 73 74 20 6f 66 20 31 2e 30 2e  n a cost of 1.0.
d2b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 43 6f 6e   */.    if( iCon
d2c0: 73 3c 30 20 26 26 20 70 43 6f 6e 73 2d 3e 6f 70  s<0 && pCons->op
d2d0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
d2e0: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 26 26 20  ONSTRAINT_EQ && 
d2f0: 62 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20  bDocid ){.      
d300: 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  pInfo->idxNum = 
d310: 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52 43  FTS3_DOCID_SEARC
d320: 48 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  H;.      pInfo->
d330: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
d340: 31 2e 30 3b 0a 20 20 20 20 20 20 69 43 6f 6e 73  1.0;.      iCons
d350: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = i;.    }..   
d360: 20 2f 2a 20 41 20 4d 41 54 43 48 20 63 6f 6e 73   /* A MATCH cons
d370: 74 72 61 69 6e 74 2e 20 55 73 65 20 61 20 66 75  traint. Use a fu
d380: 6c 6c 2d 74 65 78 74 20 73 65 61 72 63 68 2e 0a  ll-text search..
d390: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
d3a0: 20 74 68 65 72 65 20 69 73 20 6d 6f 72 65 20 74   there is more t
d3b0: 68 61 6e 20 6f 6e 65 20 4d 41 54 43 48 20 63 6f  han one MATCH co
d3c0: 6e 73 74 72 61 69 6e 74 20 61 76 61 69 6c 61 62  nstraint availab
d3d0: 6c 65 2c 20 75 73 65 20 74 68 65 20 66 69 72 73  le, use the firs
d3e0: 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 63  t.    ** one enc
d3f0: 6f 75 6e 74 65 72 65 64 2e 20 49 66 20 74 68 65  ountered. If the
d400: 72 65 20 69 73 20 62 6f 74 68 20 61 20 4d 41 54  re is both a MAT
d410: 43 48 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  CH constraint an
d420: 64 20 61 20 64 69 72 65 63 74 0a 20 20 20 20 2a  d a direct.    *
d430: 2a 20 72 6f 77 69 64 2f 64 6f 63 69 64 20 6c 6f  * rowid/docid lo
d440: 6f 6b 75 70 2c 20 70 72 65 66 65 72 20 74 68 65  okup, prefer the
d450: 20 4d 41 54 43 48 20 73 74 72 61 74 65 67 79 2e   MATCH strategy.
d460: 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 65 76   This is done ev
d470: 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67  en .    ** thoug
d480: 68 20 74 68 65 20 72 6f 77 69 64 2f 64 6f 63 69  h the rowid/doci
d490: 64 20 6c 6f 6f 6b 75 70 20 69 73 20 66 61 73 74  d lookup is fast
d4a0: 65 72 20 74 68 61 6e 20 61 20 4d 41 54 43 48 20  er than a MATCH 
d4b0: 71 75 65 72 79 2c 20 73 65 6c 65 63 74 69 6e 67  query, selecting
d4c0: 0a 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64  .    ** it would
d4d0: 20 6c 65 61 64 20 74 6f 20 61 6e 20 22 75 6e 61   lead to an "una
d4e0: 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74  ble to use funct
d4f0: 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65  ion MATCH in the
d500: 20 72 65 71 75 65 73 74 65 64 20 0a 20 20 20 20   requested .    
d510: 2a 2a 20 63 6f 6e 74 65 78 74 22 20 65 72 72 6f  ** context" erro
d520: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
d530: 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c  ( pCons->op==SQL
d540: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
d550: 41 49 4e 54 5f 4d 41 54 43 48 20 0a 20 20 20 20  AINT_MATCH .    
d560: 20 26 26 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75   && pCons->iColu
d570: 6d 6e 3e 3d 30 20 26 26 20 70 43 6f 6e 73 2d 3e  mn>=0 && pCons->
d580: 69 43 6f 6c 75 6d 6e 3c 3d 70 2d 3e 6e 43 6f 6c  iColumn<=p->nCol
d590: 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  umn.    ){.     
d5a0: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d   pInfo->idxNum =
d5b0: 20 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53   FTS3_FULLTEXT_S
d5c0: 45 41 52 43 48 20 2b 20 70 43 6f 6e 73 2d 3e 69  EARCH + pCons->i
d5d0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49  Column;.      pI
d5e0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
d5f0: 73 74 20 3d 20 32 2e 30 3b 0a 20 20 20 20 20 20  st = 2.0;.      
d600: 69 43 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 7d  iCons = i;.    }
d610: 0a 0a 20 20 20 20 2f 2a 20 45 71 75 61 6c 69 74  ..    /* Equalit
d620: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  y constraint on 
d630: 74 68 65 20 6c 61 6e 67 69 64 20 63 6f 6c 75 6d  the langid colum
d640: 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 6f  n */.    if( pCo
d650: 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  ns->op==SQLITE_I
d660: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
d670: 45 51 20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e  EQ .     && pCon
d680: 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 6e  s->iColumn==p->n
d690: 43 6f 6c 75 6d 6e 20 2b 20 32 0a 20 20 20 20 29  Column + 2.    )
d6a0: 7b 0a 20 20 20 20 20 20 69 4c 61 6e 67 69 64 43  {.      iLangidC
d6b0: 6f 6e 73 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a  ons = i;.    }..
d6c0: 20 20 20 20 69 66 28 20 62 44 6f 63 69 64 20 29      if( bDocid )
d6d0: 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20  {.      switch( 
d6e0: 70 43 6f 6e 73 2d 3e 6f 70 20 29 7b 0a 20 20 20  pCons->op ){.   
d6f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
d700: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
d710: 54 5f 47 45 3a 0a 20 20 20 20 20 20 20 20 63 61  T_GE:.        ca
d720: 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  se SQLITE_INDEX_
d730: 43 4f 4e 53 54 52 41 49 4e 54 5f 47 54 3a 0a 20  CONSTRAINT_GT:. 
d740: 20 20 20 20 20 20 20 20 20 69 44 6f 63 69 64 47           iDocidG
d750: 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  e = i;.         
d760: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
d770: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
d780: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
d790: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
d7a0: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
d7b0: 54 52 41 49 4e 54 5f 4c 54 3a 0a 20 20 20 20 20  TRAINT_LT:.     
d7c0: 20 20 20 20 20 69 44 6f 63 69 64 4c 65 20 3d 20       iDocidLe = 
d7d0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  i;.          bre
d7e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d7f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75  }.  }..  /* If u
d800: 73 69 6e 67 20 61 20 64 6f 63 69 64 3d 3f 20 6f  sing a docid=? o
d810: 72 20 72 6f 77 69 64 3d 3f 20 73 74 72 61 74 65  r rowid=? strate
d820: 67 79 2c 20 73 65 74 20 74 68 65 20 55 4e 49 51  gy, set the UNIQ
d830: 55 45 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 69 66  UE flag. */.  if
d840: 28 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3d  ( pInfo->idxNum=
d850: 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52  =FTS3_DOCID_SEAR
d860: 43 48 20 29 20 66 74 73 33 53 65 74 55 6e 69 71  CH ) fts3SetUniq
d870: 75 65 46 6c 61 67 28 70 49 6e 66 6f 29 3b 0a 0a  ueFlag(pInfo);..
d880: 20 20 69 49 64 78 20 3d 20 31 3b 0a 20 20 69 66    iIdx = 1;.  if
d890: 28 20 69 43 6f 6e 73 3e 3d 30 20 29 7b 0a 20 20  ( iCons>=0 ){.  
d8a0: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72    pInfo->aConstr
d8b0: 61 69 6e 74 55 73 61 67 65 5b 69 43 6f 6e 73 5d  aintUsage[iCons]
d8c0: 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 49 64  .argvIndex = iId
d8d0: 78 2b 2b 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  x++;.    pInfo->
d8e0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
d8f0: 5b 69 43 6f 6e 73 5d 2e 6f 6d 69 74 20 3d 20 31  [iCons].omit = 1
d900: 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 69 4c 61  ;.  } .  if( iLa
d910: 6e 67 69 64 43 6f 6e 73 3e 3d 30 20 29 7b 0a 20  ngidCons>=0 ){. 
d920: 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d     pInfo->idxNum
d930: 20 7c 3d 20 46 54 53 33 5f 48 41 56 45 5f 4c 41   |= FTS3_HAVE_LA
d940: 4e 47 49 44 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  NGID;.    pInfo-
d950: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
d960: 65 5b 69 4c 61 6e 67 69 64 43 6f 6e 73 5d 2e 61  e[iLangidCons].a
d970: 72 67 76 49 6e 64 65 78 20 3d 20 69 49 64 78 2b  rgvIndex = iIdx+
d980: 2b 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 69 44  +;.  } .  if( iD
d990: 6f 63 69 64 47 65 3e 3d 30 20 29 7b 0a 20 20 20  ocidGe>=0 ){.   
d9a0: 20 70 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 7c   pInfo->idxNum |
d9b0: 3d 20 46 54 53 33 5f 48 41 56 45 5f 44 4f 43 49  = FTS3_HAVE_DOCI
d9c0: 44 5f 47 45 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  D_GE;.    pInfo-
d9d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
d9e0: 65 5b 69 44 6f 63 69 64 47 65 5d 2e 61 72 67 76  e[iDocidGe].argv
d9f0: 49 6e 64 65 78 20 3d 20 69 49 64 78 2b 2b 3b 0a  Index = iIdx++;.
da00: 20 20 7d 20 0a 20 20 69 66 28 20 69 44 6f 63 69    } .  if( iDoci
da10: 64 4c 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49  dLe>=0 ){.    pI
da20: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 7c 3d 20 46  nfo->idxNum |= F
da30: 54 53 33 5f 48 41 56 45 5f 44 4f 43 49 44 5f 4c  TS3_HAVE_DOCID_L
da40: 45 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  E;.    pInfo->aC
da50: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
da60: 44 6f 63 69 64 4c 65 5d 2e 61 72 67 76 49 6e 64  DocidLe].argvInd
da70: 65 78 20 3d 20 69 49 64 78 2b 2b 3b 0a 20 20 7d  ex = iIdx++;.  }
da80: 20 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65   ..  /* Regardle
da90: 73 73 20 6f 66 20 74 68 65 20 73 74 72 61 74 65  ss of the strate
daa0: 67 79 20 73 65 6c 65 63 74 65 64 2c 20 46 54 53  gy selected, FTS
dab0: 20 63 61 6e 20 64 65 6c 69 76 65 72 20 72 6f 77   can deliver row
dac0: 73 20 69 6e 20 72 6f 77 69 64 20 28 6f 72 0a 20  s in rowid (or. 
dad0: 20 2a 2a 20 64 6f 63 69 64 29 20 6f 72 64 65 72   ** docid) order
dae0: 2e 20 42 6f 74 68 20 61 73 63 65 6e 64 69 6e 67  . Both ascending
daf0: 20 61 6e 64 20 64 65 73 63 65 6e 64 69 6e 67 20   and descending 
db00: 61 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 0a 20  are possible. . 
db10: 20 2a 2f 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d   */.  if( pInfo-
db20: 3e 6e 4f 72 64 65 72 42 79 3d 3d 31 20 29 7b 0a  >nOrderBy==1 ){.
db30: 20 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74      struct sqlit
db40: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
db50: 20 2a 70 4f 72 64 65 72 20 3d 20 26 70 49 6e 66   *pOrder = &pInf
db60: 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 3b 0a  o->aOrderBy[0];.
db70: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 2d 3e      if( pOrder->
db80: 69 43 6f 6c 75 6d 6e 3c 30 20 7c 7c 20 70 4f 72  iColumn<0 || pOr
db90: 64 65 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 2d  der->iColumn==p-
dba0: 3e 6e 43 6f 6c 75 6d 6e 2b 31 20 29 7b 0a 20 20  >nColumn+1 ){.  
dbb0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 2d 3e      if( pOrder->
dbc0: 64 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  desc ){.        
dbd0: 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  pInfo->idxStr = 
dbe0: 22 44 45 53 43 22 3b 0a 20 20 20 20 20 20 7d 65  "DESC";.      }e
dbf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
dc00: 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 22 41 53  fo->idxStr = "AS
dc10: 43 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C";.      }.    
dc20: 20 20 70 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79    pInfo->orderBy
dc30: 43 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 0a 20 20  Consumed = 1;.  
dc40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
dc50: 74 28 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d  t( p->pSegments=
dc60: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
dc70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
dc80: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
dc90: 6e 20 6f 66 20 78 4f 70 65 6e 20 6d 65 74 68 6f  n of xOpen metho
dca0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
dcb0: 20 66 74 73 33 4f 70 65 6e 4d 65 74 68 6f 64 28   fts3OpenMethod(
dcc0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
dcd0: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  Tab, sqlite3_vta
dce0: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 73 72  b_cursor **ppCsr
dcf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
dd00: 62 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 20  b_cursor *pCsr; 
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd20: 20 41 6c 6c 6f 63 61 74 65 64 20 63 75 72 73 6f   Allocated curso
dd30: 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50  r */..  UNUSED_P
dd40: 41 52 41 4d 45 54 45 52 28 70 56 54 61 62 29 3b  ARAMETER(pVTab);
dd50: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
dd60: 61 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65  a buffer large e
dd70: 6e 6f 75 67 68 20 66 6f 72 20 61 6e 20 46 74 73  nough for an Fts
dd80: 33 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  3Cursor structur
dd90: 65 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61  e. If the.  ** a
dda0: 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65  llocation succee
ddb0: 64 73 2c 20 7a 65 72 6f 20 69 74 20 61 6e 64 20  ds, zero it and 
ddc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ddd0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 20 20  . Otherwise, .  
dde0: 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
ddf0: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 72 65 74 75  tion fails, retu
de00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
de10: 0a 20 20 2a 2f 0a 20 20 2a 70 70 43 73 72 20 3d  .  */.  *ppCsr =
de20: 20 70 43 73 72 20 3d 20 28 73 71 6c 69 74 65 33   pCsr = (sqlite3
de30: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 29 73  _vtab_cursor *)s
de40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
de50: 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72 29  zeof(Fts3Cursor)
de60: 29 3b 0a 20 20 69 66 28 20 21 70 43 73 72 20 29  );.  if( !pCsr )
de70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
de80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
de90: 20 6d 65 6d 73 65 74 28 70 43 73 72 2c 20 30 2c   memset(pCsr, 0,
dea0: 20 73 69 7a 65 6f 66 28 46 74 73 33 43 75 72 73   sizeof(Fts3Curs
deb0: 6f 72 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  or));.  return S
dec0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ded0: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72  ** Close the cur
dee0: 73 6f 72 2e 20 20 46 6f 72 20 61 64 64 69 74 69  sor.  For additi
def0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
df00: 20 73 65 65 20 74 68 65 20 64 6f 63 75 6d 65 6e   see the documen
df10: 74 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 68 65  tation.** on the
df20: 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 6f   xClose method o
df30: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
df40: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
df50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
df60: 33 43 6c 6f 73 65 4d 65 74 68 6f 64 28 73 71 6c  3CloseMethod(sql
df70: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
df80: 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 46 74   *pCursor){.  Ft
df90: 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  s3Cursor *pCsr =
dfa0: 20 28 46 74 73 33 43 75 72 73 6f 72 20 2a 29 70   (Fts3Cursor *)p
dfb0: 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
dfc0: 28 20 28 28 46 74 73 33 54 61 62 6c 65 20 2a 29  ( ((Fts3Table *)
dfd0: 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
dfe0: 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20  )->pSegments==0 
dff0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
e000: 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d  alize(pCsr->pStm
e010: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  t);.  sqlite3Fts
e020: 33 45 78 70 72 46 72 65 65 28 70 43 73 72 2d 3e  3ExprFree(pCsr->
e030: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
e040: 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65  3Fts3FreeDeferre
e050: 64 54 6f 6b 65 6e 73 28 70 43 73 72 29 3b 0a 20  dTokens(pCsr);. 
e060: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
e070: 73 72 2d 3e 61 44 6f 63 6c 69 73 74 29 3b 0a 20  sr->aDoclist);. 
e080: 20 73 71 6c 69 74 65 33 46 74 73 33 4d 49 42 75   sqlite3Fts3MIBu
e090: 66 66 65 72 46 72 65 65 28 70 43 73 72 2d 3e 70  fferFree(pCsr->p
e0a0: 4d 49 42 75 66 66 65 72 29 3b 0a 20 20 61 73 73  MIBuffer);.  ass
e0b0: 65 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65  ert( ((Fts3Table
e0c0: 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
e0d0: 74 61 62 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d  tab)->pSegments=
e0e0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
e0f0: 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72 65  free(pCsr);.  re
e100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e110: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 43 73 72  }../*.** If pCsr
e120: 2d 3e 70 53 74 6d 74 20 68 61 73 20 6e 6f 74 20  ->pStmt has not 
e130: 62 65 65 6e 20 70 72 65 70 61 72 65 64 20 28 69  been prepared (i
e140: 2e 65 2e 20 69 66 20 70 43 73 72 2d 3e 70 53 74  .e. if pCsr->pSt
e150: 6d 74 3d 3d 30 29 2c 20 74 68 65 6e 0a 2a 2a 20  mt==0), then.** 
e160: 63 6f 6d 70 6f 73 65 20 61 6e 64 20 70 72 65 70  compose and prep
e170: 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61 74 65  are an SQL state
e180: 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  ment of the form
e190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 22 53 45 4c 45  :.**.**    "SELE
e1a0: 43 54 20 3c 63 6f 6c 75 6d 6e 73 3e 20 46 52 4f  CT <columns> FRO
e1b0: 4d 20 25 5f 63 6f 6e 74 65 6e 74 20 57 48 45 52  M %_content WHER
e1c0: 45 20 72 6f 77 69 64 20 3d 20 3f 22 0a 2a 2a 0a  E rowid = ?".**.
e1d0: 2a 2a 20 28 6f 72 20 74 68 65 20 65 71 75 69 76  ** (or the equiv
e1e0: 61 6c 65 6e 74 20 66 6f 72 20 61 20 63 6f 6e 74  alent for a cont
e1f0: 65 6e 74 3d 78 78 78 20 74 61 62 6c 65 29 20 61  ent=xxx table) a
e200: 6e 64 20 73 65 74 20 70 43 73 72 2d 3e 70 53 74  nd set pCsr->pSt
e210: 6d 74 20 74 6f 0a 2a 2a 20 69 74 2e 20 49 66 20  mt to.** it. If 
e220: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
e230: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
e240: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
e250: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
e260: 65 74 20 2a 70 70 53 74 6d 74 20 74 6f 20 70 6f  et *ppStmt to po
e270: 69 6e 74 20 74 6f 20 70 43 73 72 2d 3e 70 53 74  int to pCsr->pSt
e280: 6d 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  mt and return SQ
e290: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
e2a0: 69 63 20 69 6e 74 20 66 74 73 33 43 75 72 73 6f  ic int fts3Curso
e2b0: 72 53 65 65 6b 53 74 6d 74 28 46 74 73 33 43 75  rSeekStmt(Fts3Cu
e2c0: 72 73 6f 72 20 2a 70 43 73 72 2c 20 73 71 6c 69  rsor *pCsr, sqli
e2d0: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
e2e0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
e2f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
e300: 70 43 73 72 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  pCsr->pStmt==0 )
e310: 7b 0a 20 20 20 20 46 74 73 33 54 61 62 6c 65 20  {.    Fts3Table 
e320: 2a 70 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20  *p = (Fts3Table 
e330: 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
e340: 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ab;.    char *zS
e350: 71 6c 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  ql;.    zSql = s
e360: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
e370: 53 45 4c 45 43 54 20 25 73 20 57 48 45 52 45 20  SELECT %s WHERE 
e380: 72 6f 77 69 64 20 3d 20 3f 22 2c 20 70 2d 3e 7a  rowid = ?", p->z
e390: 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b 0a 20  ReadExprlist);. 
e3a0: 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 20 72     if( !zSql ) r
e3b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e3c0: 45 4d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  EM;.    rc = sql
e3d0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
e3e0: 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
e3f0: 20 26 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30   &pCsr->pStmt, 0
e400: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
e410: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
e420: 20 2a 70 70 53 74 6d 74 20 3d 20 70 43 73 72 2d   *ppStmt = pCsr-
e430: 3e 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 72 6e  >pStmt;.  return
e440: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f   rc;.}../*.** Po
e450: 73 69 74 69 6f 6e 20 74 68 65 20 70 43 73 72 2d  sition the pCsr-
e460: 3e 70 53 74 6d 74 20 73 74 61 74 65 6d 65 6e 74  >pStmt statement
e470: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6f   so that it is o
e480: 6e 20 74 68 65 20 72 6f 77 0a 2a 2a 20 6f 66 20  n the row.** of 
e490: 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
e4a0: 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
e4b0: 73 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63 68  s the last match
e4c0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  .  Return.** SQL
e4d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e4e0: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
e4f0: 6e 74 20 66 74 73 33 43 75 72 73 6f 72 53 65 65  nt fts3CursorSee
e500: 6b 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  k(sqlite3_contex
e510: 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 46 74 73  t *pContext, Fts
e520: 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a  3Cursor *pCsr){.
e530: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e540: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 73 72  E_OK;.  if( pCsr
e550: 2d 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b 20  ->isRequireSeek 
e560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
e570: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
e580: 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 43 75  .    rc = fts3Cu
e590: 72 73 6f 72 53 65 65 6b 53 74 6d 74 28 70 43 73  rsorSeekStmt(pCs
e5a0: 72 2c 20 26 70 53 74 6d 74 29 3b 0a 20 20 20 20  r, &pStmt);.    
e5b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e5c0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
e5d0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43  e3_bind_int64(pC
e5e0: 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 70 43  sr->pStmt, 1, pC
e5f0: 73 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a 20 20  sr->iPrevId);.  
e600: 20 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71 75      pCsr->isRequ
e610: 69 72 65 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20  ireSeek = 0;.   
e620: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f     if( SQLITE_RO
e630: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
e640: 70 43 73 72 2d 3e 70 53 74 6d 74 29 20 29 7b 0a  pCsr->pStmt) ){.
e650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e660: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
e670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
e680: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
e690: 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a  t(pCsr->pStmt);.
e6a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
e6b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 28 46  SQLITE_OK && ((F
e6c0: 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d  ts3Table *)pCsr-
e6d0: 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e 7a 43  >base.pVtab)->zC
e6e0: 6f 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a  ontentTbl==0 ){.
e6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
e700: 6e 6f 20 72 6f 77 20 77 61 73 20 66 6f 75 6e 64  no row was found
e710: 20 61 6e 64 20 6e 6f 20 65 72 72 6f 72 20 68 61   and no error ha
e720: 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  s occurred, then
e730: 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20   the %_content. 
e740: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
e750: 65 20 69 73 20 6d 69 73 73 69 6e 67 20 61 20 72  e is missing a r
e760: 6f 77 20 74 68 61 74 20 69 73 20 70 72 65 73 65  ow that is prese
e770: 6e 74 20 69 6e 20 74 68 65 20 66 75 6c 6c 2d 74  nt in the full-t
e780: 65 78 74 20 69 6e 64 65 78 2e 0a 20 20 20 20 20  ext index..     
e790: 20 20 20 20 20 2a 2a 20 54 68 65 20 64 61 74 61       ** The data
e7a0: 20 73 74 72 75 63 74 75 72 65 73 20 61 72 65 20   structures are 
e7b0: 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20  corrupt.  */.   
e7c0: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 5f         rc = FTS_
e7d0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20  CORRUPT_VTAB;.  
e7e0: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73          pCsr->is
e7f0: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Eof = 1;.       
e800: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e810: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
e820: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f  SQLITE_OK && pCo
e830: 6e 74 65 78 74 20 29 7b 0a 20 20 20 20 73 71 6c  ntext ){.    sql
e840: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
e850: 72 5f 63 6f 64 65 28 70 43 6f 6e 74 65 78 74 2c  r_code(pContext,
e860: 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
e870: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e880: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e890: 20 75 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73   used to process
e8a0: 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69   a single interi
e8b0: 6f 72 20 6e 6f 64 65 20 77 68 65 6e 20 73 65 61  or node when sea
e8c0: 72 63 68 69 6e 67 0a 2a 2a 20 61 20 62 2d 74 72  rching.** a b-tr
e8d0: 65 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6f 72  ee for a term or
e8e0: 20 74 65 72 6d 20 70 72 65 66 69 78 2e 20 54 68   term prefix. Th
e8f0: 65 20 6e 6f 64 65 20 64 61 74 61 20 69 73 20 70  e node data is p
e900: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 0a 2a  assed to this .*
e910: 2a 20 66 75 6e 63 74 69 6f 6e 20 76 69 61 20 74  * function via t
e920: 68 65 20 7a 4e 6f 64 65 2f 6e 4e 6f 64 65 20 70  he zNode/nNode p
e930: 61 72 61 6d 65 74 65 72 73 2e 20 54 68 65 20 74  arameters. The t
e940: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f  erm to search fo
e950: 72 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 69  r is.** passed i
e960: 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a  n zTerm/nTerm..*
e970: 2a 0a 2a 2a 20 49 66 20 70 69 46 69 72 73 74 20  *.** If piFirst 
e980: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
e990: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
e9a0: 73 65 74 73 20 2a 70 69 46 69 72 73 74 20 74 6f  sets *piFirst to
e9b0: 20 74 68 65 20 62 6c 6f 63 6b 69 64 0a 2a 2a 20   the blockid.** 
e9c0: 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  of the child nod
e9d0: 65 20 74 68 61 74 20 68 65 61 64 73 20 74 68 65  e that heads the
e9e0: 20 73 75 62 2d 74 72 65 65 20 74 68 61 74 20 6d   sub-tree that m
e9f0: 61 79 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74  ay contain the t
ea00: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 69  erm..**.** If pi
ea10: 4c 61 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Last is not NULL
ea20: 2c 20 74 68 65 6e 20 2a 70 69 4c 61 73 74 20 69  , then *piLast i
ea30: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 69 67  s set to the rig
ea40: 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6e 6f  ht-most child no
ea50: 64 65 0a 2a 2a 20 74 68 61 74 20 68 65 61 64 73  de.** that heads
ea60: 20 61 20 73 75 62 2d 74 72 65 65 20 74 68 61 74   a sub-tree that
ea70: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 74   may contain a t
ea80: 65 72 6d 20 66 6f 72 20 77 68 69 63 68 20 7a 54  erm for which zT
ea90: 65 72 6d 2f 6e 54 65 72 6d 20 69 73 0a 2a 2a 20  erm/nTerm is.** 
eaa0: 61 20 70 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a 20  a prefix..**.** 
eab0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
eac0: 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
ead0: 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
eae0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
eaf0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
eb00: 63 20 69 6e 74 20 66 74 73 33 53 63 61 6e 49 6e  c int fts3ScanIn
eb10: 74 65 72 69 6f 72 4e 6f 64 65 28 0a 20 20 63 6f  teriorNode(.  co
eb20: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c  nst char *zTerm,
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb40: 20 54 65 72 6d 20 74 6f 20 73 65 6c 65 63 74 20   Term to select 
eb50: 6c 65 61 76 65 73 20 66 6f 72 20 2a 2f 0a 20 20  leaves for */.  
eb60: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20  int nTerm,      
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
eb90: 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
eba0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ebb0: 7a 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  zNode,          
ebc0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
ebd0: 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74  ntaining segment
ebe0: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 2a   interior node *
ebf0: 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c 20 20  /.  int nNode,  
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
ec20: 75 66 66 65 72 20 61 74 20 7a 4e 6f 64 65 20 2a  uffer at zNode *
ec30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
ec40: 34 20 2a 70 69 46 69 72 73 74 2c 20 20 20 20 20  4 *piFirst,     
ec50: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 6c 65      /* OUT: Sele
ec60: 63 74 65 64 20 63 68 69 6c 64 20 6e 6f 64 65 20  cted child node 
ec70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
ec80: 36 34 20 2a 70 69 4c 61 73 74 20 20 20 20 20 20  64 *piLast      
ec90: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 6c       /* OUT: Sel
eca0: 65 63 74 65 64 20 63 68 69 6c 64 20 6e 6f 64 65  ected child node
ecb0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
ecc0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
ecd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ece0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  rn code */.  con
ecf0: 73 74 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20  st char *zCsr = 
ed00: 7a 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20  zNode;       /* 
ed10: 43 75 72 73 6f 72 20 74 6f 20 69 74 65 72 61 74  Cursor to iterat
ed20: 65 20 74 68 72 6f 75 67 68 20 6e 6f 64 65 20 2a  e through node *
ed30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ed40: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 4e 6f  zEnd = &zCsr[nNo
ed50: 64 65 5d 3b 2f 2a 20 45 6e 64 20 6f 66 20 69 6e  de];/* End of in
ed60: 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 75 66 66  terior node buff
ed70: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  er */.  char *zB
ed80: 75 66 66 65 72 20 3d 20 30 3b 20 20 20 20 20 20  uffer = 0;      
ed90: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
eda0: 72 20 74 6f 20 6c 6f 61 64 20 74 65 72 6d 73 20  r to load terms 
edb0: 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  into */.  int nA
edc0: 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20  lloc = 0;       
edd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ede0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 62  e of allocated b
edf0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  uffer */.  int i
ee00: 73 46 69 72 73 74 54 65 72 6d 20 3d 20 31 3b 20  sFirstTerm = 1; 
ee10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
ee20: 75 65 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ue when processi
ee30: 6e 67 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  ng first term on
ee40: 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
ee50: 65 33 5f 69 6e 74 36 34 20 69 43 68 69 6c 64 3b  e3_int64 iChild;
ee60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c             /* Bl
ee70: 6f 63 6b 20 69 64 20 6f 66 20 63 68 69 6c 64 20  ock id of child 
ee80: 6e 6f 64 65 20 74 6f 20 64 65 73 63 65 6e 64 20  node to descend 
ee90: 74 6f 20 2a 2f 0a 0a 20 20 2f 2a 20 53 6b 69 70  to */..  /* Skip
eea0: 20 6f 76 65 72 20 74 68 65 20 27 68 65 69 67 68   over the 'heigh
eeb0: 74 27 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f  t' varint that o
eec0: 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61  ccurs at the sta
eed0: 72 74 20 6f 66 20 65 76 65 72 79 20 0a 20 20 2a  rt of every .  *
eee0: 2a 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  * interior node.
eef0: 20 54 68 65 6e 20 6c 6f 61 64 20 74 68 65 20 62   Then load the b
ef00: 6c 6f 63 6b 69 64 20 6f 66 20 74 68 65 20 6c 65  lockid of the le
ef10: 66 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ft-child of the 
ef20: 62 2d 74 72 65 65 0a 20 20 2a 2a 20 6e 6f 64 65  b-tree.  ** node
ef30: 20 69 6e 74 6f 20 76 61 72 69 61 62 6c 65 20 69   into variable i
ef40: 43 68 69 6c 64 2e 20 20 0a 20 20 2a 2a 0a 20 20  Child.  .  **.  
ef50: 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 64  ** Even if the d
ef60: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 6f 6e  ata structure on
ef70: 20 64 69 73 6b 20 69 73 20 63 6f 72 72 75 70 74   disk is corrupt
ef80: 65 64 2c 20 74 68 69 73 20 28 72 65 61 64 69 6e  ed, this (readin
ef90: 67 20 74 77 6f 0a 20 20 2a 2a 20 76 61 72 69 6e  g two.  ** varin
efa0: 74 73 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ts from the buff
efb0: 65 72 29 20 64 6f 65 73 20 6e 6f 74 20 72 69 73  er) does not ris
efc0: 6b 20 61 6e 20 6f 76 65 72 72 65 61 64 2e 20 49  k an overread. I
efd0: 66 20 7a 4e 6f 64 65 20 69 73 20 61 0a 20 20 2a  f zNode is a.  *
efe0: 2a 20 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65  * root node, the
eff0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 63 6f 6d  n the buffer com
f000: 65 73 20 66 72 6f 6d 20 61 20 53 45 4c 45 43 54  es from a SELECT
f010: 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 51 4c 69   statement. SQLi
f020: 74 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74  te does.  ** not
f030: 20 6d 61 6b 65 20 74 68 69 73 20 67 75 61 72 61   make this guara
f040: 6e 74 65 65 20 65 78 70 6c 69 63 69 74 6c 79 2c  ntee explicitly,
f050: 20 62 75 74 20 69 6e 20 70 72 61 63 74 69 63 65   but in practice
f060: 20 74 68 65 72 65 20 61 72 65 20 61 6c 77 61 79   there are alway
f070: 73 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6d 6f  s.  ** either mo
f080: 72 65 20 74 68 61 6e 20 32 30 20 62 79 74 65 73  re than 20 bytes
f090: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
f0a0: 61 63 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ace following th
f0b0: 65 20 6e 4e 6f 64 65 20 62 79 74 65 73 20 6f 66  e nNode bytes of
f0c0: 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 2c 20  .  ** contents, 
f0d0: 6f 72 20 74 77 6f 20 7a 65 72 6f 20 62 79 74 65  or two zero byte
f0e0: 73 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 6e 6f  s. Or, if the no
f0f0: 64 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  de is read from 
f100: 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 0a 20  the %_segments. 
f110: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
f120: 74 68 65 72 65 20 61 72 65 20 61 6c 77 61 79 73  there are always
f130: 20 32 30 20 62 79 74 65 73 20 6f 66 20 7a 65 72   20 bytes of zer
f140: 6f 65 64 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c  oed padding foll
f150: 6f 77 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6e  owing the.  ** n
f160: 4e 6f 64 65 20 62 79 74 65 73 20 6f 66 20 63 6f  Node bytes of co
f170: 6e 74 65 6e 74 20 28 73 65 65 20 73 71 6c 69 74  ntent (see sqlit
f180: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28  e3Fts3ReadBlock(
f190: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 29 2e 0a  ) for details)..
f1a0: 20 20 2a 2f 0a 20 20 7a 43 73 72 20 2b 3d 20 73    */.  zCsr += s
f1b0: 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72  qlite3Fts3GetVar
f1c0: 69 6e 74 28 7a 43 73 72 2c 20 26 69 43 68 69 6c  int(zCsr, &iChil
f1d0: 64 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 73 71  d);.  zCsr += sq
f1e0: 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
f1f0: 6e 74 28 7a 43 73 72 2c 20 26 69 43 68 69 6c 64  nt(zCsr, &iChild
f200: 29 3b 0a 20 20 69 66 28 20 7a 43 73 72 3e 7a 45  );.  if( zCsr>zE
f210: 6e 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  nd ){.    return
f220: 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41   FTS_CORRUPT_VTA
f230: 42 3b 0a 20 20 7d 0a 20 20 0a 20 20 77 68 69 6c  B;.  }.  .  whil
f240: 65 28 20 7a 43 73 72 3c 7a 45 6e 64 20 26 26 20  e( zCsr<zEnd && 
f250: 28 70 69 46 69 72 73 74 20 7c 7c 20 70 69 4c 61  (piFirst || piLa
f260: 73 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  st) ){.    int c
f270: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
f280: 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 65 6d 63           /* memc
f290: 6d 70 28 29 20 72 65 73 75 6c 74 20 2a 2f 0a 20  mp() result */. 
f2a0: 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20     int nSuffix; 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
f2d0: 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 69   suffix */.    i
f2e0: 6e 74 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 20  nt nPrefix = 0; 
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f300: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65  Size of term pre
f310: 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  fix */.    int n
f320: 42 75 66 66 65 72 3b 20 20 20 20 20 20 20 20 20  Buffer;         
f330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
f340: 6c 20 74 65 72 6d 20 73 69 7a 65 20 2a 2f 0a 20  l term size */. 
f350: 20 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68   .    /* Load th
f360: 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 6e 20 74  e next term on t
f370: 68 65 20 6e 6f 64 65 20 69 6e 74 6f 20 7a 42 75  he node into zBu
f380: 66 66 65 72 2e 20 55 73 65 20 72 65 61 6c 6c 6f  ffer. Use reallo
f390: 63 28 29 20 74 6f 20 65 78 70 61 6e 64 0a 20 20  c() to expand.  
f3a0: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
f3b0: 20 7a 42 75 66 66 65 72 20 69 66 20 72 65 71 75   zBuffer if requ
f3c0: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ired.  */.    if
f3d0: 28 20 21 69 73 46 69 72 73 74 54 65 72 6d 20 29  ( !isFirstTerm )
f3e0: 7b 0a 20 20 20 20 20 20 7a 43 73 72 20 2b 3d 20  {.      zCsr += 
f3f0: 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
f400: 7a 43 73 72 2c 20 26 6e 50 72 65 66 69 78 29 3b  zCsr, &nPrefix);
f410: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 46 69 72  .    }.    isFir
f420: 73 74 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  stTerm = 0;.    
f430: 7a 43 73 72 20 2b 3d 20 66 74 73 33 47 65 74 56  zCsr += fts3GetV
f440: 61 72 69 6e 74 33 32 28 7a 43 73 72 2c 20 26 6e  arint32(zCsr, &n
f450: 53 75 66 66 69 78 29 3b 0a 20 20 20 20 0a 20 20  Suffix);.    .  
f460: 20 20 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20    if( nPrefix<0 
f470: 7c 7c 20 6e 53 75 66 66 69 78 3c 30 20 7c 7c 20  || nSuffix<0 || 
f480: 26 7a 43 73 72 5b 6e 53 75 66 66 69 78 5d 3e 7a  &zCsr[nSuffix]>z
f490: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  End ){.      rc 
f4a0: 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 54  = FTS_CORRUPT_VT
f4b0: 41 42 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  AB;.      goto f
f4c0: 69 6e 69 73 68 5f 73 63 61 6e 3b 0a 20 20 20 20  inish_scan;.    
f4d0: 7d 0a 20 20 20 20 69 66 28 20 6e 50 72 65 66 69  }.    if( nPrefi
f4e0: 78 2b 6e 53 75 66 66 69 78 3e 6e 41 6c 6c 6f 63  x+nSuffix>nAlloc
f4f0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
f500: 7a 4e 65 77 3b 0a 20 20 20 20 20 20 6e 41 6c 6c  zNew;.      nAll
f510: 6f 63 20 3d 20 28 6e 50 72 65 66 69 78 2b 6e 53  oc = (nPrefix+nS
f520: 75 66 66 69 78 29 20 2a 20 32 3b 0a 20 20 20 20  uffix) * 2;.    
f530: 20 20 7a 4e 65 77 20 3d 20 28 63 68 61 72 20 2a    zNew = (char *
f540: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
f550: 28 7a 42 75 66 66 65 72 2c 20 6e 41 6c 6c 6f 63  (zBuffer, nAlloc
f560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4e  );.      if( !zN
f570: 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
f580: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f590: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 69  .        goto fi
f5a0: 6e 69 73 68 5f 73 63 61 6e 3b 0a 20 20 20 20 20  nish_scan;.     
f5b0: 20 7d 0a 20 20 20 20 20 20 7a 42 75 66 66 65 72   }.      zBuffer
f5c0: 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = zNew;.    }. 
f5d0: 20 20 20 61 73 73 65 72 74 28 20 7a 42 75 66 66     assert( zBuff
f5e0: 65 72 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  er );.    memcpy
f5f0: 28 26 7a 42 75 66 66 65 72 5b 6e 50 72 65 66 69  (&zBuffer[nPrefi
f600: 78 5d 2c 20 7a 43 73 72 2c 20 6e 53 75 66 66 69  x], zCsr, nSuffi
f610: 78 29 3b 0a 20 20 20 20 6e 42 75 66 66 65 72 20  x);.    nBuffer 
f620: 3d 20 6e 50 72 65 66 69 78 20 2b 20 6e 53 75 66  = nPrefix + nSuf
f630: 66 69 78 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d  fix;.    zCsr +=
f640: 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20 20 2f   nSuffix;..    /
f650: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 65  * Compare the te
f660: 72 6d 20 77 65 20 61 72 65 20 73 65 61 72 63 68  rm we are search
f670: 69 6e 67 20 66 6f 72 20 77 69 74 68 20 74 68 65  ing for with the
f680: 20 74 65 72 6d 20 6a 75 73 74 20 6c 6f 61 64 65   term just loade
f690: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  d from.    ** th
f6a0: 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
f6b0: 20 49 66 20 74 68 65 20 73 70 65 63 69 66 69 65   If the specifie
f6c0: 64 20 74 65 72 6d 20 69 73 20 67 72 65 61 74 65  d term is greate
f6d0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  r than or equal.
f6e0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 65      ** to the te
f6f0: 72 6d 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  rm from the inte
f700: 72 69 6f 72 20 6e 6f 64 65 2c 20 74 68 65 6e 20  rior node, then 
f710: 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  all terms on the
f720: 20 73 75 62 2d 74 72 65 65 20 0a 20 20 20 20 2a   sub-tree .    *
f730: 2a 20 68 65 61 64 65 64 20 62 79 20 6e 6f 64 65  * headed by node
f740: 20 69 43 68 69 6c 64 20 61 72 65 20 73 6d 61 6c   iChild are smal
f750: 6c 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2e 20  ler than zTerm. 
f760: 4e 6f 20 6e 65 65 64 20 74 6f 20 73 65 61 72 63  No need to searc
f770: 68 20 0a 20 20 20 20 2a 2a 20 69 43 68 69 6c 64  h .    ** iChild
f780: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f790: 49 66 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  If the interior 
f7a0: 6e 6f 64 65 20 74 65 72 6d 20 69 73 20 6c 61 72  node term is lar
f7b0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65  ger than the spe
f7c0: 63 69 66 69 65 64 20 74 65 72 6d 2c 20 74 68 65  cified term, the
f7d0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 65  n.    ** the tre
f7e0: 65 20 68 65 61 64 65 64 20 62 79 20 69 43 68 69  e headed by iChi
f7f0: 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 74  ld may contain t
f800: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
f810: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6d  m..    */.    cm
f820: 70 20 3d 20 6d 65 6d 63 6d 70 28 7a 54 65 72 6d  p = memcmp(zTerm
f830: 2c 20 7a 42 75 66 66 65 72 2c 20 28 6e 42 75 66  , zBuffer, (nBuf
f840: 66 65 72 3e 6e 54 65 72 6d 20 3f 20 6e 54 65 72  fer>nTerm ? nTer
f850: 6d 20 3a 20 6e 42 75 66 66 65 72 29 29 3b 0a 20  m : nBuffer));. 
f860: 20 20 20 69 66 28 20 70 69 46 69 72 73 74 20 26     if( piFirst &
f870: 26 20 28 63 6d 70 3c 30 20 7c 7c 20 28 63 6d 70  & (cmp<0 || (cmp
f880: 3d 3d 30 20 26 26 20 6e 42 75 66 66 65 72 3e 6e  ==0 && nBuffer>n
f890: 54 65 72 6d 29 29 20 29 7b 0a 20 20 20 20 20 20  Term)) ){.      
f8a0: 2a 70 69 46 69 72 73 74 20 3d 20 69 43 68 69 6c  *piFirst = iChil
f8b0: 64 3b 0a 20 20 20 20 20 20 70 69 46 69 72 73 74  d;.      piFirst
f8c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
f8d0: 20 69 66 28 20 70 69 4c 61 73 74 20 26 26 20 63   if( piLast && c
f8e0: 6d 70 3c 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  mp<0 ){.      *p
f8f0: 69 4c 61 73 74 20 3d 20 69 43 68 69 6c 64 3b 0a  iLast = iChild;.
f900: 20 20 20 20 20 20 70 69 4c 61 73 74 20 3d 20 30        piLast = 0
f910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 43 68  ;.    }..    iCh
f920: 69 6c 64 2b 2b 3b 0a 20 20 7d 3b 0a 0a 20 20 69  ild++;.  };..  i
f930: 66 28 20 70 69 46 69 72 73 74 20 29 20 2a 70 69  f( piFirst ) *pi
f940: 46 69 72 73 74 20 3d 20 69 43 68 69 6c 64 3b 0a  First = iChild;.
f950: 20 20 69 66 28 20 70 69 4c 61 73 74 20 29 20 2a    if( piLast ) *
f960: 70 69 4c 61 73 74 20 3d 20 69 43 68 69 6c 64 3b  piLast = iChild;
f970: 0a 0a 20 66 69 6e 69 73 68 5f 73 63 61 6e 3a 0a  .. finish_scan:.
f980: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f990: 42 75 66 66 65 72 29 3b 0a 20 20 72 65 74 75 72  Buffer);.  retur
f9a0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
f9b0: 54 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  The buffer point
f9c0: 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e  ed to by argumen
f9d0: 74 20 7a 4e 6f 64 65 20 28 73 69 7a 65 20 6e 4e  t zNode (size nN
f9e0: 6f 64 65 20 62 79 74 65 73 29 20 63 6f 6e 74 61  ode bytes) conta
f9f0: 69 6e 73 20 61 6e 0a 2a 2a 20 69 6e 74 65 72 69  ins an.** interi
fa00: 6f 72 20 6e 6f 64 65 20 6f 66 20 61 20 62 2d 74  or node of a b-t
fa10: 72 65 65 20 73 65 67 6d 65 6e 74 2e 20 54 68 65  ree segment. The
fa20: 20 7a 54 65 72 6d 20 62 75 66 66 65 72 20 28 73   zTerm buffer (s
fa30: 69 7a 65 20 6e 54 65 72 6d 20 62 79 74 65 73 29  ize nTerm bytes)
fa40: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 74  .** contains a t
fa50: 65 72 6d 2e 20 54 68 69 73 20 66 75 6e 63 74 69  erm. This functi
fa60: 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20  on searches the 
fa70: 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 20  sub-tree headed 
fa80: 62 79 20 74 68 65 20 7a 4e 6f 64 65 0a 2a 2a 20  by the zNode.** 
fa90: 6e 6f 64 65 20 66 6f 72 20 74 68 65 20 72 61 6e  node for the ran
faa0: 67 65 20 6f 66 20 6c 65 61 66 20 6e 6f 64 65 73  ge of leaf nodes
fab0: 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69   that may contai
fac0: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
fad0: 74 65 72 6d 0a 2a 2a 20 6f 72 20 74 65 72 6d 73  term.** or terms
fae0: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73   for which the s
faf0: 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
fb00: 20 61 20 70 72 65 66 69 78 2e 0a 2a 2a 0a 2a 2a   a prefix..**.**
fb10: 20 49 66 20 70 69 4c 65 61 66 20 69 73 20 6e 6f   If piLeaf is no
fb20: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 69  t NULL, then *pi
fb30: 4c 65 61 66 20 69 73 20 73 65 74 20 74 6f 20 74  Leaf is set to t
fb40: 68 65 20 62 6c 6f 63 6b 69 64 20 6f 66 20 74 68  he blockid of th
fb50: 65 20 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  e .** left-most 
fb60: 6c 65 61 66 20 6e 6f 64 65 20 69 6e 20 74 68 65  leaf node in the
fb70: 20 74 72 65 65 20 74 68 61 74 20 6d 61 79 20 63   tree that may c
fb80: 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 63 69  ontain the speci
fb90: 66 69 65 64 20 74 65 72 6d 2e 0a 2a 2a 20 49 66  fied term..** If
fba0: 20 70 69 4c 65 61 66 32 20 69 73 20 6e 6f 74 20   piLeaf2 is not 
fbb0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 69 4c 65  NULL, then *piLe
fbc0: 61 66 32 20 69 73 20 73 65 74 20 74 6f 20 74 68  af2 is set to th
fbd0: 65 20 62 6c 6f 63 6b 69 64 20 6f 66 20 74 68 65  e blockid of the
fbe0: 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  .** right-most l
fbf0: 65 61 66 20 6e 6f 64 65 20 74 68 61 74 20 6d 61  eaf node that ma
fc00: 79 20 63 6f 6e 74 61 69 6e 20 61 20 74 65 72 6d  y contain a term
fc10: 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 73   for which the s
fc20: 70 65 63 69 66 69 65 64 0a 2a 2a 20 74 65 72 6d  pecified.** term
fc30: 20 69 73 20 61 20 70 72 65 66 69 78 2e 0a 2a 2a   is a prefix..**
fc40: 0a 2a 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62  .** It is possib
fc50: 6c 65 20 74 68 61 74 20 74 68 65 20 72 61 6e 67  le that the rang
fc60: 65 20 6f 66 20 72 65 74 75 72 6e 65 64 20 6c 65  e of returned le
fc70: 61 66 20 6e 6f 64 65 73 20 64 6f 65 73 20 6e 6f  af nodes does no
fc80: 74 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 74 68  t contain .** th
fc90: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
fca0: 20 6f 72 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   or any terms fo
fcb0: 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
fcc0: 70 72 65 66 69 78 2e 20 48 6f 77 65 76 65 72 2c  prefix. However,
fcd0: 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 65 67 6d   if the .** segm
fce0: 65 6e 74 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  ent does contain
fcf0: 20 61 6e 79 20 73 75 63 68 20 74 65 72 6d 73 2c   any such terms,
fd00: 20 74 68 65 79 20 61 72 65 20 73 74 6f 72 65 64   they are stored
fd10: 20 77 69 74 68 69 6e 20 74 68 65 20 69 64 65 6e   within the iden
fd20: 74 69 66 69 65 64 0a 2a 2a 20 72 61 6e 67 65 2e  tified.** range.
fd30: 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
fd40: 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 69 6e 73 70  nction only insp
fd50: 65 63 74 73 20 69 6e 74 65 72 69 6f 72 20 73 65  ects interior se
fd60: 67 6d 65 6e 74 20 6e 6f 64 65 73 20 28 61 6e 64  gment nodes (and
fd70: 0a 2a 2a 20 6e 65 76 65 72 20 6c 6f 61 64 73 20  .** never loads 
fd80: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 74 6f 20  leaf nodes into 
fd90: 6d 65 6d 6f 72 79 29 2c 20 69 74 20 69 73 20 6e  memory), it is n
fda0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 62  ot possible to b
fdb0: 65 20 73 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e sure..**.** If
fdc0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
fdd0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
fde0: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
fdf0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
fe00: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
fe10: 20 66 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28   fts3SelectLeaf(
fe20: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
fe50: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ble handle */.  
fe60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
fe70: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
fe80: 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 6c 65 63  /* Term to selec
fe90: 74 20 6c 65 61 76 65 73 20 66 6f 72 20 2a 2f 0a  t leaves for */.
fea0: 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20    int nTerm,    
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
fed0: 6d 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  m zTerm in bytes
fee0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fef0: 20 2a 7a 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *zNode,        
ff00: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
ff10: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65  containing segme
ff20: 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  nt interior node
ff30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 64 65 2c   */.  int nNode,
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ff60: 20 62 75 66 66 65 72 20 61 74 20 7a 4e 6f 64 65   buffer at zNode
ff70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
ff80: 74 36 34 20 2a 70 69 4c 65 61 66 2c 20 20 20 20  t64 *piLeaf,    
ff90: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 65        /* Selecte
ffa0: 64 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f 0a 20  d leaf node */. 
ffb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
ffc0: 70 69 4c 65 61 66 32 20 20 20 20 20 20 20 20 20  piLeaf2         
ffd0: 20 2f 2a 20 53 65 6c 65 63 74 65 64 20 6c 65 61   /* Selected lea
ffe0: 66 20 6e 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69  f node */.){.  i
fff0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10000 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
10010 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10020 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 3b 20  .  int iHeight; 
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20     /* Height of 
10050 74 68 69 73 20 6e 6f 64 65 20 69 6e 20 74 72 65  this node in tre
10060 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
10070 70 69 4c 65 61 66 20 7c 7c 20 70 69 4c 65 61 66  piLeaf || piLeaf
10080 32 20 29 3b 0a 0a 20 20 66 74 73 33 47 65 74 56  2 );..  fts3GetV
10090 61 72 69 6e 74 33 32 28 7a 4e 6f 64 65 2c 20 26  arint32(zNode, &
100a0 69 48 65 69 67 68 74 29 3b 0a 20 20 72 63 20 3d  iHeight);.  rc =
100b0 20 66 74 73 33 53 63 61 6e 49 6e 74 65 72 69 6f   fts3ScanInterio
100c0 72 4e 6f 64 65 28 7a 54 65 72 6d 2c 20 6e 54 65  rNode(zTerm, nTe
100d0 72 6d 2c 20 7a 4e 6f 64 65 2c 20 6e 4e 6f 64 65  rm, zNode, nNode
100e0 2c 20 70 69 4c 65 61 66 2c 20 70 69 4c 65 61 66  , piLeaf, piLeaf
100f0 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  2);.  assert( !p
10100 69 4c 65 61 66 32 20 7c 7c 20 21 70 69 4c 65 61  iLeaf2 || !piLea
10110 66 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  f || rc!=SQLITE_
10120 4f 4b 20 7c 7c 20 28 2a 70 69 4c 65 61 66 3c 3d  OK || (*piLeaf<=
10130 2a 70 69 4c 65 61 66 32 29 20 29 3b 0a 0a 20 20  *piLeaf2) );..  
10140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10150 4b 20 26 26 20 69 48 65 69 67 68 74 3e 31 20 29  K && iHeight>1 )
10160 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f  {.    char *zBlo
10170 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
10180 20 20 20 20 2f 2a 20 42 6c 6f 62 20 72 65 61 64      /* Blob read
10190 20 66 72 6f 6d 20 25 5f 73 65 67 6d 65 6e 74 73   from %_segments
101a0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e   table */.    in
101b0 74 20 6e 42 6c 6f 62 20 3d 20 30 3b 20 20 20 20  t nBlob = 0;    
101c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
101d0 69 7a 65 20 6f 66 20 7a 42 6c 6f 62 20 69 6e 20  ize of zBlob in 
101e0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 69 66  bytes */..    if
101f0 28 20 70 69 4c 65 61 66 20 26 26 20 70 69 4c 65  ( piLeaf && piLe
10200 61 66 32 20 26 26 20 28 2a 70 69 4c 65 61 66 21  af2 && (*piLeaf!
10210 3d 2a 70 69 4c 65 61 66 32 29 20 29 7b 0a 20 20  =*piLeaf2) ){.  
10220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10230 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 70 2c  Fts3ReadBlock(p,
10240 20 2a 70 69 4c 65 61 66 2c 20 26 7a 42 6c 6f 62   *piLeaf, &zBlob
10250 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20  , &nBlob, 0);.  
10260 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10280 20 72 63 20 3d 20 66 74 73 33 53 65 6c 65 63 74   rc = fts3Select
10290 4c 65 61 66 28 70 2c 20 7a 54 65 72 6d 2c 20 6e  Leaf(p, zTerm, n
102a0 54 65 72 6d 2c 20 7a 42 6c 6f 62 2c 20 6e 42 6c  Term, zBlob, nBl
102b0 6f 62 2c 20 70 69 4c 65 61 66 2c 20 30 29 3b 0a  ob, piLeaf, 0);.
102c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
102d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 6c 6f 62  lite3_free(zBlob
102e0 29 3b 0a 20 20 20 20 20 20 70 69 4c 65 61 66 20  );.      piLeaf 
102f0 3d 20 30 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  = 0;.      zBlob
10300 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
10310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10320 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
10330 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64   sqlite3Fts3Read
10340 42 6c 6f 63 6b 28 70 2c 20 70 69 4c 65 61 66 3f  Block(p, piLeaf?
10350 2a 70 69 4c 65 61 66 3a 2a 70 69 4c 65 61 66 32  *piLeaf:*piLeaf2
10360 2c 20 26 7a 42 6c 6f 62 2c 20 26 6e 42 6c 6f 62  , &zBlob, &nBlob
10370 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
10380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10390 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
103a0 66 74 73 33 53 65 6c 65 63 74 4c 65 61 66 28 70  fts3SelectLeaf(p
103b0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
103c0 7a 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 69  zBlob, nBlob, pi
103d0 4c 65 61 66 2c 20 70 69 4c 65 61 66 32 29 3b 0a  Leaf, piLeaf2);.
103e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
103f0 33 5f 66 72 65 65 28 7a 42 6c 6f 62 29 3b 0a 20  3_free(zBlob);. 
10400 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
10410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10420 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
10430 74 6f 20 63 72 65 61 74 65 20 64 65 6c 74 61 2d  to create delta-
10440 65 6e 63 6f 64 65 64 20 73 65 72 69 61 6c 69 7a  encoded serializ
10450 65 64 20 6c 69 73 74 73 20 6f 66 20 46 54 53 33  ed lists of FTS3
10460 20 0a 2a 2a 20 76 61 72 69 6e 74 73 2e 20 45 61   .** varints. Ea
10470 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ch call to this 
10480 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
10490 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74   a single varint
104a0 20 74 6f 20 61 20 6c 69 73 74 2e 0a 2a 2f 0a 73   to a list..*/.s
104b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 50  tatic void fts3P
104c0 75 74 44 65 6c 74 61 56 61 72 69 6e 74 28 0a 20  utDeltaVarint(. 
104d0 20 63 68 61 72 20 2a 2a 70 70 2c 20 20 20 20 20   char **pp,     
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 75 74 70   /* IN/OUT: Outp
10500 75 74 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ut pointer */.  
10510 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
10520 69 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  iPrev,          
10530 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69  /* IN/OUT: Previ
10540 6f 75 73 20 76 61 6c 75 65 20 77 72 69 74 74 65  ous value writte
10550 6e 20 74 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 73  n to list */.  s
10560 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
10570 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l              /
10580 2a 20 57 72 69 74 65 20 74 68 69 73 20 76 61 6c  * Write this val
10590 75 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 2a  ue to the list *
105a0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  /.){.  assert( i
105b0 56 61 6c 2d 2a 70 69 50 72 65 76 20 3e 20 30 20  Val-*piPrev > 0 
105c0 7c 7c 20 28 2a 70 69 50 72 65 76 3d 3d 30 20 26  || (*piPrev==0 &
105d0 26 20 69 56 61 6c 3d 3d 30 29 20 29 3b 0a 20 20  & iVal==0) );.  
105e0 2a 70 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  *pp += sqlite3Ft
105f0 73 33 50 75 74 56 61 72 69 6e 74 28 2a 70 70 2c  s3PutVarint(*pp,
10600 20 69 56 61 6c 2d 2a 70 69 50 72 65 76 29 3b 0a   iVal-*piPrev);.
10610 20 20 2a 70 69 50 72 65 76 20 3d 20 69 56 61 6c    *piPrev = iVal
10620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
10630 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
10640 20 63 61 6c 6c 65 64 2c 20 2a 70 70 50 6f 73 6c   called, *ppPosl
10650 69 73 74 20 69 73 20 61 73 73 75 6d 65 64 20 74  ist is assumed t
10660 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a  o point to the .
10670 2a 2a 20 73 74 61 72 74 20 6f 66 20 61 20 70 6f  ** start of a po
10680 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 20 41 66 74  sition-list. Aft
10690 65 72 20 69 74 20 72 65 74 75 72 6e 73 2c 20 2a  er it returns, *
106a0 70 70 50 6f 73 6c 69 73 74 20 70 6f 69 6e 74 73  ppPoslist points
106b0 20 74 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   to the.** first
106c0 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20   byte after the 
106d0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
106e0 2a 0a 2a 2a 20 41 20 70 6f 73 69 74 69 6f 6e 20  *.** A position 
106f0 6c 69 73 74 20 69 73 20 6c 69 73 74 20 6f 66 20  list is list of 
10700 70 6f 73 69 74 69 6f 6e 73 20 28 64 65 6c 74 61  positions (delta
10710 20 65 6e 63 6f 64 65 64 29 20 61 6e 64 20 63 6f   encoded) and co
10720 6c 75 6d 6e 73 20 66 6f 72 20 0a 2a 2a 20 61 20  lumns for .** a 
10730 73 69 6e 67 6c 65 20 64 6f 63 75 6d 65 6e 74 20  single document 
10740 72 65 63 6f 72 64 20 6f 66 20 61 20 64 6f 63 6c  record of a docl
10750 69 73 74 2e 20 20 53 6f 2c 20 69 6e 20 6f 74 68  ist.  So, in oth
10760 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 0a 2a  er words, this.*
10770 2a 20 72 6f 75 74 69 6e 65 20 61 64 76 61 6e 63  * routine advanc
10780 65 73 20 2a 70 70 50 6f 73 6c 69 73 74 20 73 6f  es *ppPoslist so
10790 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
107a0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69  to the next doci
107b0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  d in.** the docl
107c0 69 73 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 66  ist, or to the f
107d0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
107e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 6f  he end of the do
107f0 63 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  clist..**.** If 
10800 70 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  pp is not NULL, 
10810 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
10820 73 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  s of the positio
10830 6e 20 6c 69 73 74 20 61 72 65 20 63 6f 70 69 65  n list are copie
10840 64 0a 2a 2a 20 74 6f 20 2a 70 70 2e 20 2a 70 70  d.** to *pp. *pp
10850 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
10860 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
10870 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
10880 20 62 79 74 65 20 63 6f 70 69 65 64 0a 2a 2a 20   byte copied.** 
10890 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
108a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2f  tion returns..*/
108b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
108c0 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 63 68 61  3PoslistCopy(cha
108d0 72 20 2a 2a 70 70 2c 20 63 68 61 72 20 2a 2a 70  r **pp, char **p
108e0 70 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63 68 61  pPoslist){.  cha
108f0 72 20 2a 70 45 6e 64 20 3d 20 2a 70 70 50 6f 73  r *pEnd = *ppPos
10900 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20 3d  list;.  char c =
10910 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 65 6e   0;..  /* The en
10920 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 20  d of a position 
10930 6c 69 73 74 20 69 73 20 6d 61 72 6b 65 64 20 62  list is marked b
10940 79 20 61 20 7a 65 72 6f 20 65 6e 63 6f 64 65 64  y a zero encoded
10950 20 61 73 20 61 6e 20 46 54 53 33 20 0a 20 20 2a   as an FTS3 .  *
10960 2a 20 76 61 72 69 6e 74 2e 20 41 20 73 69 6e 67  * varint. A sing
10970 6c 65 20 50 4f 53 5f 45 4e 44 20 28 30 29 20 62  le POS_END (0) b
10980 79 74 65 2e 20 45 78 63 65 70 74 2c 20 69 66 20  yte. Except, if 
10990 74 68 65 20 30 20 62 79 74 65 20 69 73 20 70 72  the 0 byte is pr
109a0 65 63 65 64 65 64 20 62 79 0a 20 20 2a 2a 20 61  eceded by.  ** a
109b0 20 62 79 74 65 20 77 69 74 68 20 74 68 65 20 30   byte with the 0
109c0 78 38 30 20 62 69 74 20 73 65 74 2c 20 74 68 65  x80 bit set, the
109d0 6e 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  n it is not a va
109e0 72 69 6e 74 20 30 2c 20 62 75 74 20 74 68 65 20  rint 0, but the 
109f0 74 61 69 6c 0a 20 20 2a 2a 20 6f 66 20 73 6f 6d  tail.  ** of som
10a00 65 20 6f 74 68 65 72 2c 20 6d 75 6c 74 69 2d 62  e other, multi-b
10a10 79 74 65 2c 20 76 61 6c 75 65 2e 0a 20 20 2a 2a  yte, value..  **
10a20 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
10a30 69 6e 67 20 77 68 69 6c 65 2d 6c 6f 6f 70 20 6d  ing while-loop m
10a40 6f 76 65 73 20 70 45 6e 64 20 74 6f 20 70 6f 69  oves pEnd to poi
10a50 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
10a60 62 79 74 65 20 74 68 61 74 20 69 73 20 6e 6f 74  byte that is not
10a70 20 0a 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65   .  ** immediate
10a80 6c 79 20 70 72 65 63 65 64 65 64 20 62 79 20 61  ly preceded by a
10a90 20 62 79 74 65 20 77 69 74 68 20 74 68 65 20 30   byte with the 0
10aa0 78 38 30 20 62 69 74 20 73 65 74 2e 20 54 68 65  x80 bit set. The
10ab0 6e 20 69 6e 63 72 65 6d 65 6e 74 73 0a 20 20 2a  n increments.  *
10ac0 2a 20 70 45 6e 64 20 6f 6e 63 65 20 6d 6f 72 65  * pEnd once more
10ad0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
10ae0 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69  ts to the byte i
10af0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
10b00 77 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6c 61  wing the.  ** la
10b10 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 70  st byte in the p
10b20 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 20 20  osition-list..  
10b30 2a 2f 0a 20 20 77 68 69 6c 65 28 20 2a 70 45 6e  */.  while( *pEn
10b40 64 20 7c 20 63 20 29 7b 0a 20 20 20 20 63 20 3d  d | c ){.    c =
10b50 20 2a 70 45 6e 64 2b 2b 20 26 20 30 78 38 30 3b   *pEnd++ & 0x80;
10b60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
10b70 21 3d 30 20 26 26 20 28 2a 70 45 6e 64 29 3d 3d  !=0 && (*pEnd)==
10b80 30 20 29 3b 0a 20 20 7d 0a 20 20 70 45 6e 64 2b  0 );.  }.  pEnd+
10b90 2b 3b 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70  +;  /* Advance p
10ba0 61 73 74 20 74 68 65 20 50 4f 53 5f 45 4e 44 20  ast the POS_END 
10bb0 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
10bc0 2a 2f 0a 0a 20 20 69 66 28 20 70 70 20 29 7b 0a  */..  if( pp ){.
10bd0 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
10be0 29 28 70 45 6e 64 20 2d 20 2a 70 70 50 6f 73 6c  )(pEnd - *ppPosl
10bf0 69 73 74 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ist);.    char *
10c00 70 20 3d 20 2a 70 70 3b 0a 20 20 20 20 6d 65 6d  p = *pp;.    mem
10c10 63 70 79 28 70 2c 20 2a 70 70 50 6f 73 6c 69 73  cpy(p, *ppPoslis
10c20 74 2c 20 6e 29 3b 0a 20 20 20 20 70 20 2b 3d 20  t, n);.    p += 
10c30 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a  n;.    *pp = p;.
10c40 20 20 7d 0a 20 20 2a 70 70 50 6f 73 6c 69 73 74    }.  *ppPoslist
10c50 20 3d 20 70 45 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   = pEnd;.}../*.*
10c60 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
10c70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
10c80 2a 70 70 50 6f 73 6c 69 73 74 20 69 73 20 61 73  *ppPoslist is as
10c90 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  sumed to point t
10ca0 6f 20 74 68 65 20 0a 2a 2a 20 73 74 61 72 74 20  o the .** start 
10cb0 6f 66 20 61 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74  of a column-list
10cc0 2e 20 41 66 74 65 72 20 69 74 20 72 65 74 75 72  . After it retur
10cd0 6e 73 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 70  ns, *ppPoslist p
10ce0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
10cf0 74 6f 20 74 68 65 20 74 65 72 6d 69 6e 61 74 6f  to the terminato
10d00 72 20 28 50 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 72  r (POS_COLUMN or
10d10 20 50 4f 53 5f 45 4e 44 29 20 62 79 74 65 20 6f   POS_END) byte o
10d20 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73  f the column-lis
10d30 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6c 75 6d  t..**.** A colum
10d40 6e 2d 6c 69 73 74 20 69 73 20 6c 69 73 74 20 6f  n-list is list o
10d50 66 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20  f delta-encoded 
10d60 70 6f 73 69 74 69 6f 6e 73 20 66 6f 72 20 61 20  positions for a 
10d70 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  single column.**
10d80 20 77 69 74 68 69 6e 20 61 20 73 69 6e 67 6c 65   within a single
10d90 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 69 6e   document within
10da0 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 0a 2a   a doclist..**.*
10db0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73  * The column-lis
10dc0 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20  t is terminated 
10dd0 65 69 74 68 65 72 20 62 79 20 61 20 50 4f 53 5f  either by a POS_
10de0 43 4f 4c 55 4d 4e 20 76 61 72 69 6e 74 20 28 31  COLUMN varint (1
10df0 29 20 6f 72 0a 2a 2a 20 61 20 50 4f 53 5f 45 4e  ) or.** a POS_EN
10e00 44 20 76 61 72 69 6e 74 20 28 30 29 2e 20 20 54  D varint (0).  T
10e10 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 65 61 76  his routine leav
10e20 65 73 20 2a 70 70 50 6f 73 6c 69 73 74 20 70 6f  es *ppPoslist po
10e30 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 74 68 65  inting to.** the
10e40 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20 50   POS_COLUMN or P
10e50 4f 53 5f 45 4e 44 20 74 68 61 74 20 74 65 72 6d  OS_END that term
10e60 69 6e 61 74 65 73 20 74 68 65 20 63 6f 6c 75 6d  inates the colum
10e70 6e 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  n-list..**.** If
10e80 20 70 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   pp is not NULL,
10e90 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
10ea0 74 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ts of the column
10eb0 2d 6c 69 73 74 20 61 72 65 20 63 6f 70 69 65 64  -list are copied
10ec0 0a 2a 2a 20 74 6f 20 2a 70 70 2e 20 2a 70 70 20  .** to *pp. *pp 
10ed0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
10ee0 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
10ef0 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
10f00 62 79 74 65 20 63 6f 70 69 65 64 0a 2a 2a 20 62  byte copied.** b
10f10 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
10f20 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 20 54 68  ion returns.  Th
10f30 65 20 50 4f 53 5f 43 4f 4c 55 4d 4e 20 6f 72 20  e POS_COLUMN or 
10f40 50 4f 53 5f 45 4e 44 20 74 65 72 6d 69 6e 61 74  POS_END terminat
10f50 6f 72 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 70  or.** is not cop
10f60 69 65 64 20 69 6e 74 6f 20 2a 70 70 2e 0a 2a 2f  ied into *pp..*/
10f70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10f80 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28  3ColumnlistCopy(
10f90 63 68 61 72 20 2a 2a 70 70 2c 20 63 68 61 72 20  char **pp, char 
10fa0 2a 2a 70 70 50 6f 73 6c 69 73 74 29 7b 0a 20 20  **ppPoslist){.  
10fb0 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 2a 70 70  char *pEnd = *pp
10fc0 50 6f 73 6c 69 73 74 3b 0a 20 20 63 68 61 72 20  Poslist;.  char 
10fd0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 63  c = 0;..  /* A c
10fe0 6f 6c 75 6d 6e 2d 6c 69 73 74 20 69 73 20 74 65  olumn-list is te
10ff0 72 6d 69 6e 61 74 65 64 20 62 79 20 65 69 74 68  rminated by eith
11000 65 72 20 61 20 30 78 30 31 20 6f 72 20 30 78 30  er a 0x01 or 0x0
11010 30 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  0 byte that is. 
11020 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
11030 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 76 61 72  a multi-byte var
11040 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  int..  */.  whil
11050 65 28 20 30 78 46 45 20 26 20 28 2a 70 45 6e 64  e( 0xFE & (*pEnd
11060 20 7c 20 63 29 20 29 7b 0a 20 20 20 20 63 20 3d   | c) ){.    c =
11070 20 2a 70 45 6e 64 2b 2b 20 26 20 30 78 38 30 3b   *pEnd++ & 0x80;
11080 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
11090 21 3d 30 20 26 26 20 28 28 2a 70 45 6e 64 29 26  !=0 && ((*pEnd)&
110a0 30 78 66 65 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  0xfe)==0 );.  }.
110b0 20 20 69 66 28 20 70 70 20 29 7b 0a 20 20 20 20    if( pp ){.    
110c0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 45  int n = (int)(pE
110d0 6e 64 20 2d 20 2a 70 70 50 6f 73 6c 69 73 74 29  nd - *ppPoslist)
110e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
110f0 2a 70 70 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *pp;.    memcpy(
11100 70 2c 20 2a 70 70 50 6f 73 6c 69 73 74 2c 20 6e  p, *ppPoslist, n
11110 29 3b 0a 20 20 20 20 70 20 2b 3d 20 6e 3b 0a 20  );.    p += n;. 
11120 20 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 7d 0a     *pp = p;.  }.
11130 20 20 2a 70 70 50 6f 73 6c 69 73 74 20 3d 20 70    *ppPoslist = p
11140 45 6e 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61  End;.}../*.** Va
11150 6c 75 65 20 75 73 65 64 20 74 6f 20 73 69 67 6e  lue used to sign
11160 69 66 79 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ify the end of a
11170 6e 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e  n position-list.
11180 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
11190 63 61 75 73 65 0a 2a 2a 20 69 74 20 69 73 20 6e  cause.** it is n
111a0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68  ot possible to h
111b0 61 76 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 77  ave a document w
111c0 69 74 68 20 32 5e 33 31 20 74 65 72 6d 73 2e 0a  ith 2^31 terms..
111d0 2a 2f 0a 23 64 65 66 69 6e 65 20 50 4f 53 49 54  */.#define POSIT
111e0 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 30 78 37  ION_LIST_END 0x7
111f0 66 66 66 66 66 66 66 0a 0a 2f 2a 0a 2a 2a 20 54  fffffff../*.** T
11200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11210 75 73 65 64 20 74 6f 20 68 65 6c 70 20 70 61 72  used to help par
11220 73 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  se position-list
11230 73 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  s. When this fun
11240 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
11250 65 64 2c 20 2a 70 70 20 6d 61 79 20 70 6f 69 6e  ed, *pp may poin
11260 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
11270 66 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 6e  f the next varin
11280 74 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  t in the positio
11290 6e 2d 6c 69 73 74 0a 2a 2a 20 62 65 69 6e 67 20  n-list.** being 
112a0 70 61 72 73 65 64 2c 20 6f 72 20 69 74 20 6d 61  parsed, or it ma
112b0 79 20 70 6f 69 6e 74 20 74 6f 20 31 20 62 79 74  y point to 1 byt
112c0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
112d0 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
112e0 69 73 74 0a 2a 2a 20 28 69 6e 20 77 68 69 63 68  ist.** (in which
112f0 20 63 61 73 65 20 2a 2a 70 70 20 77 69 6c 6c 20   case **pp will 
11300 62 65 20 61 20 74 65 72 6d 69 6e 61 74 6f 72 20  be a terminator 
11310 62 79 74 65 73 20 50 4f 53 5f 45 4e 44 20 28 30  bytes POS_END (0
11320 29 20 6f 72 0a 2a 2a 20 28 31 29 29 2e 0a 2a 2a  ) or.** (1))..**
11330 0a 2a 2a 20 49 66 20 2a 70 70 20 70 6f 69 6e 74  .** If *pp point
11340 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
11350 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  f the current po
11360 73 69 74 69 6f 6e 2d 6c 69 73 74 2c 20 73 65 74  sition-list, set
11370 20 2a 70 69 20 74 6f 20 0a 2a 2a 20 50 4f 53 49   *pi to .** POSI
11380 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 20 61 6e  TION_LIST_END an
11390 64 20 72 65 74 75 72 6e 2e 20 4f 74 68 65 72 77  d return. Otherw
113a0 69 73 65 2c 20 72 65 61 64 20 74 68 65 20 6e 65  ise, read the ne
113b0 78 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 2a  xt varint from *
113c0 70 70 2c 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  pp,.** increment
113d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
113e0 75 65 20 6f 66 20 2a 70 69 20 62 79 20 74 68 65  ue of *pi by the
113f0 20 76 61 6c 75 65 20 72 65 61 64 2c 20 61 6e 64   value read, and
11400 20 73 65 74 20 2a 70 70 20 74 6f 0a 2a 2a 20 70   set *pp to.** p
11410 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  oint to the next
11420 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
11430 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 42  turning..**.** B
11440 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
11450 69 73 20 72 6f 75 74 69 6e 65 20 2a 70 69 20 6d  is routine *pi m
11460 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ust be initializ
11470 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
11480 6f 66 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  of.** the previo
11490 75 73 20 70 6f 73 69 74 69 6f 6e 2c 20 6f 72 20  us position, or 
114a0 7a 65 72 6f 20 69 66 20 77 65 20 61 72 65 20 72  zero if we are r
114b0 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
114c0 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 69 6e 20   position.** in 
114d0 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
114e0 74 2e 20 20 42 65 63 61 75 73 65 20 70 6f 73 69  t.  Because posi
114f0 74 69 6f 6e 73 20 61 72 65 20 64 65 6c 74 61 2d  tions are delta-
11500 65 6e 63 6f 64 65 64 2c 20 74 68 65 20 76 61 6c  encoded, the val
11510 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 72 65  ue.** of the pre
11520 76 69 6f 75 73 20 70 6f 73 69 74 69 6f 6e 20 69  vious position i
11530 73 20 6e 65 65 64 65 64 20 69 6e 20 6f 72 64 65  s needed in orde
11540 72 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  r to compute the
11550 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
11560 20 6e 65 78 74 20 70 6f 73 69 74 69 6f 6e 2e 0a   next position..
11570 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11580 74 73 33 52 65 61 64 4e 65 78 74 50 6f 73 28 0a  ts3ReadNextPos(.
11590 20 20 63 68 61 72 20 2a 2a 70 70 2c 20 20 20 20    char **pp,    
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74  /* IN/OUT: Point
115c0 65 72 20 69 6e 74 6f 20 70 6f 73 69 74 69 6f 6e  er into position
115d0 2d 6c 69 73 74 20 62 75 66 66 65 72 20 2a 2f 0a  -list buffer */.
115e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
115f0 2a 70 69 20 20 20 20 20 20 20 20 20 20 20 20 20  *pi             
11600 2f 2a 20 49 4e 2f 4f 55 54 3a 20 56 61 6c 75 65  /* IN/OUT: Value
11610 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 69 74   read from posit
11620 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  ion-list */.){. 
11630 20 69 66 28 20 28 2a 2a 70 70 29 26 30 78 46 45   if( (**pp)&0xFE
11640 20 29 7b 0a 20 20 20 20 66 74 73 33 47 65 74 44   ){.    fts3GetD
11650 65 6c 74 61 56 61 72 69 6e 74 28 70 70 2c 20 70  eltaVarint(pp, p
11660 69 29 3b 0a 20 20 20 20 2a 70 69 20 2d 3d 20 32  i);.    *pi -= 2
11670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
11680 70 69 20 3d 20 50 4f 53 49 54 49 4f 4e 5f 4c 49  pi = POSITION_LI
11690 53 54 5f 45 4e 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ST_END;.  }.}../
116a0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
116b0 72 20 69 43 6f 6c 20 69 73 20 6e 6f 74 20 30 2c  r iCol is not 0,
116c0 20 77 72 69 74 65 20 61 6e 20 50 4f 53 5f 43 4f   write an POS_CO
116d0 4c 55 4d 4e 20 28 31 29 20 62 79 74 65 20 66 6f  LUMN (1) byte fo
116e0 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 74 68 65  llowed by.** the
116f0 20 76 61 6c 75 65 20 6f 66 20 69 43 6f 6c 20 65   value of iCol e
11700 6e 63 6f 64 65 64 20 61 73 20 61 20 76 61 72 69  ncoded as a vari
11710 6e 74 20 74 6f 20 2a 70 70 2e 20 20 20 54 68 69  nt to *pp.   Thi
11720 73 20 77 69 6c 6c 20 73 74 61 72 74 20 61 20 6e  s will start a n
11730 65 77 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6c 69 73  ew.** column lis
11740 74 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 20 2a 70 70  t..**.** Set *pp
11750 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
11760 20 62 79 74 65 20 6a 75 73 74 20 61 66 74 65 72   byte just after
11770 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77   the last byte w
11780 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 0a 2a  ritten before .*
11790 2a 20 72 65 74 75 72 6e 69 6e 67 20 28 64 6f 20  * returning (do 
117a0 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 69 66  not modify it if
117b0 20 69 43 6f 6c 3d 3d 30 29 2e 20 52 65 74 75 72   iCol==0). Retur
117c0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
117d0 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 77  er of bytes.** w
117e0 72 69 74 74 65 6e 20 28 30 20 69 66 20 69 43 6f  ritten (0 if iCo
117f0 6c 3d 3d 30 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  l==0)..*/.static
11800 20 69 6e 74 20 66 74 73 33 50 75 74 43 6f 6c 4e   int fts3PutColN
11810 75 6d 62 65 72 28 63 68 61 72 20 2a 2a 70 70 2c  umber(char **pp,
11820 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   int iCol){.  in
11830 74 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  t n = 0;        
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11850 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
11860 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 66   written */.  if
11870 28 20 69 43 6f 6c 20 29 7b 0a 20 20 20 20 63 68  ( iCol ){.    ch
11880 61 72 20 2a 70 20 3d 20 2a 70 70 3b 20 20 20 20  ar *p = *pp;    
11890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
118a0 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 2a 2f  utput pointer */
118b0 0a 20 20 20 20 6e 20 3d 20 31 20 2b 20 73 71 6c  .    n = 1 + sql
118c0 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 6e  ite3Fts3PutVarin
118d0 74 28 26 70 5b 31 5d 2c 20 69 43 6f 6c 29 3b 0a  t(&p[1], iCol);.
118e0 20 20 20 20 2a 70 20 3d 20 30 78 30 31 3b 0a 20      *p = 0x01;. 
118f0 20 20 20 2a 70 70 20 3d 20 26 70 5b 6e 5d 3b 0a     *pp = &p[n];.
11900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
11910 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
11920 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74 77   the union of tw
11930 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  o position lists
11940 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 77 72  .  The output wr
11950 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
11960 70 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 70  p contains all p
11970 6f 73 69 74 69 6f 6e 73 20 6f 66 20 62 6f 74 68  ositions of both
11980 20 2a 70 70 31 20 61 6e 64 20 2a 70 70 32 20 69   *pp1 and *pp2 i
11990 6e 20 73 6f 72 74 65 64 0a 2a 2a 20 6f 72 64 65  n sorted.** orde
119a0 72 20 61 6e 64 20 77 69 74 68 20 61 6e 79 20 64  r and with any d
119b0 75 70 6c 69 63 61 74 65 73 20 72 65 6d 6f 76 65  uplicates remove
119c0 64 2e 20 20 41 6c 6c 20 70 6f 69 6e 74 65 72 73  d.  All pointers
119d0 20 61 72 65 0a 2a 2a 20 75 70 64 61 74 65 64 20   are.** updated 
119e0 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 20  appropriately.  
119f0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
11a00 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69  esponsible for i
11a10 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
11a20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
11a30 73 70 61 63 65 20 69 6e 20 2a 70 70 20 74 6f 20  space in *pp to 
11a40 68 6f 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74  hold the complet
11a50 65 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61  e output..*/.sta
11a60 74 69 63 20 76 6f 69 64 20 66 74 73 33 50 6f 73  tic void fts3Pos
11a70 6c 69 73 74 4d 65 72 67 65 28 0a 20 20 63 68 61  listMerge(.  cha
11a80 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  r **pp,         
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11aa0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
11ab0 0a 20 20 63 68 61 72 20 2a 2a 70 70 31 2c 20 20  .  char **pp1,  
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 20 2f 2a 20 4c 65 66 74 20 69 6e 70 75 74     /* Left input
11ae0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
11af0 2a 2a 70 70 32 20 20 20 20 20 20 20 20 20 20 20  **pp2           
11b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
11b10 67 68 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a  ght input list *
11b20 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d  /.){.  char *p =
11b30 20 2a 70 70 3b 0a 20 20 63 68 61 72 20 2a 70 31   *pp;.  char *p1
11b40 20 3d 20 2a 70 70 31 3b 0a 20 20 63 68 61 72 20   = *pp1;.  char 
11b50 2a 70 32 20 3d 20 2a 70 70 32 3b 0a 0a 20 20 77  *p2 = *pp2;..  w
11b60 68 69 6c 65 28 20 2a 70 31 20 7c 7c 20 2a 70 32  hile( *p1 || *p2
11b70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   ){.    int iCol
11b80 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  1;         /* Th
11b90 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
11ba0 20 69 6e 64 65 78 20 69 6e 20 70 70 31 20 2a 2f   index in pp1 */
11bb0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 32 3b 20  .    int iCol2; 
11bc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
11bd0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 69 6e  urrent column in
11be0 64 65 78 20 69 6e 20 70 70 32 20 2a 2f 0a 0a 20  dex in pp2 */.. 
11bf0 20 20 20 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f     if( *p1==POS_
11c00 43 4f 4c 55 4d 4e 20 29 20 66 74 73 33 47 65 74  COLUMN ) fts3Get
11c10 56 61 72 69 6e 74 33 32 28 26 70 31 5b 31 5d 2c  Varint32(&p1[1],
11c20 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20 65 6c   &iCol1);.    el
11c30 73 65 20 69 66 28 20 2a 70 31 3d 3d 50 4f 53 5f  se if( *p1==POS_
11c40 45 4e 44 20 29 20 69 43 6f 6c 31 20 3d 20 50 4f  END ) iCol1 = PO
11c50 53 49 54 49 4f 4e 5f 4c 49 53 54 5f 45 4e 44 3b  SITION_LIST_END;
11c60 0a 20 20 20 20 65 6c 73 65 20 69 43 6f 6c 31 20  .    else iCol1 
11c70 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70  = 0;..    if( *p
11c80 32 3d 3d 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 20  2==POS_COLUMN ) 
11c90 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28  fts3GetVarint32(
11ca0 26 70 32 5b 31 5d 2c 20 26 69 43 6f 6c 32 29 3b  &p2[1], &iCol2);
11cb0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 2a 70  .    else if( *p
11cc0 32 3d 3d 50 4f 53 5f 45 4e 44 20 29 20 69 43 6f  2==POS_END ) iCo
11cd0 6c 32 20 3d 20 50 4f 53 49 54 49 4f 4e 5f 4c 49  l2 = POSITION_LI
11ce0 53 54 5f 45 4e 44 3b 0a 20 20 20 20 65 6c 73 65  ST_END;.    else
11cf0 20 69 43 6f 6c 32 20 3d 20 30 3b 0a 0a 20 20 20   iCol2 = 0;..   
11d00 20 69 66 28 20 69 43 6f 6c 31 3d 3d 69 43 6f 6c   if( iCol1==iCol
11d10 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
11d20 65 33 5f 69 6e 74 36 34 20 69 31 20 3d 20 30 3b  e3_int64 i1 = 0;
11d30 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
11d40 6f 73 69 74 69 6f 6e 20 66 72 6f 6d 20 70 70 31  osition from pp1
11d50 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
11d60 33 5f 69 6e 74 36 34 20 69 32 20 3d 20 30 3b 20  3_int64 i2 = 0; 
11d70 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
11d80 73 69 74 69 6f 6e 20 66 72 6f 6d 20 70 70 32 20  sition from pp2 
11d90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11da0 5f 69 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30  _int64 iPrev = 0
11db0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
11dc0 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72  fts3PutColNumber
11dd0 28 26 70 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20  (&p, iCol1);.   
11de0 20 20 20 70 31 20 2b 3d 20 6e 3b 0a 20 20 20 20     p1 += n;.    
11df0 20 20 70 32 20 2b 3d 20 6e 3b 0a 0a 20 20 20 20    p2 += n;..    
11e00 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
11e10 6e 74 2c 20 62 6f 74 68 20 70 31 20 61 6e 64 20  nt, both p1 and 
11e20 70 32 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  p2 point to the 
11e30 73 74 61 72 74 20 6f 66 20 63 6f 6c 75 6d 6e 2d  start of column-
11e40 6c 69 73 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  lists.      ** f
11e50 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  or the same colu
11e60 6d 6e 20 28 74 68 65 20 63 6f 6c 75 6d 6e 20 77  mn (the column w
11e70 69 74 68 20 69 6e 64 65 78 20 69 43 6f 6c 31 20  ith index iCol1 
11e80 61 6e 64 20 69 43 6f 6c 32 29 2e 0a 20 20 20 20  and iCol2)..    
11e90 20 20 2a 2a 20 41 20 63 6f 6c 75 6d 6e 2d 6c 69    ** A column-li
11ea0 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
11eb0 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 64 65 6c  non-negative del
11ec0 74 61 2d 65 6e 63 6f 64 65 64 20 76 61 72 69 6e  ta-encoded varin
11ed0 74 73 2c 20 65 61 63 68 20 0a 20 20 20 20 20 20  ts, each .      
11ee0 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62  ** incremented b
11ef0 79 20 32 20 62 65 66 6f 72 65 20 62 65 69 6e 67  y 2 before being
11f00 20 73 74 6f 72 65 64 2e 20 45 61 63 68 20 6c 69   stored. Each li
11f10 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  st is terminated
11f20 20 62 79 20 61 0a 20 20 20 20 20 20 2a 2a 20 50   by a.      ** P
11f30 4f 53 5f 45 4e 44 20 28 30 29 20 6f 72 20 50 4f  OS_END (0) or PO
11f40 53 5f 43 4f 4c 55 4d 4e 20 28 31 29 2e 20 54 68  S_COLUMN (1). Th
11f50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
11f60 6b 20 6d 65 72 67 65 73 20 74 68 65 20 74 77 6f  k merges the two
11f70 20 6c 69 73 74 73 0a 20 20 20 20 20 20 2a 2a 20   lists.      ** 
11f80 61 6e 64 20 77 72 69 74 65 73 20 74 68 65 20 72  and writes the r
11f90 65 73 75 6c 74 73 20 74 6f 20 62 75 66 66 65 72  esults to buffer
11fa0 20 70 2e 20 70 20 69 73 20 6c 65 66 74 20 70 6f   p. p is left po
11fb0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 62 79  inting to the by
11fc0 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 66 74 65  te.      ** afte
11fd0 72 20 74 68 65 20 6c 69 73 74 20 77 72 69 74 74  r the list writt
11fe0 65 6e 2e 20 4e 6f 20 74 65 72 6d 69 6e 61 74 6f  en. No terminato
11ff0 72 20 28 50 4f 53 5f 45 4e 44 20 6f 72 20 50 4f  r (POS_END or PO
12000 53 5f 43 4f 4c 55 4d 4e 29 20 69 73 0a 20 20 20  S_COLUMN) is.   
12010 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
12020 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
12030 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 33     */.      fts3
12040 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26  GetDeltaVarint(&
12050 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 20 20  p1, &i1);.      
12060 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72 69  fts3GetDeltaVari
12070 6e 74 28 26 70 32 2c 20 26 69 32 29 3b 0a 20 20  nt(&p2, &i2);.  
12080 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
12090 20 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72   fts3PutDeltaVar
120a0 69 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20  int(&p, &iPrev, 
120b0 28 69 31 3c 69 32 29 20 3f 20 69 31 20 3a 20 69  (i1<i2) ? i1 : i
120c0 32 29 3b 20 0a 20 20 20 20 20 20 20 20 69 50 72  2); .        iPr
120d0 65 76 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20  ev -= 2;.       
120e0 20 69 66 28 20 69 31 3d 3d 69 32 20 29 7b 0a 20   if( i1==i2 ){. 
120f0 20 20 20 20 20 20 20 20 20 66 74 73 33 52 65 61           fts3Rea
12100 64 4e 65 78 74 50 6f 73 28 26 70 31 2c 20 26 69  dNextPos(&p1, &i
12110 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  1);.          ft
12120 73 33 52 65 61 64 4e 65 78 74 50 6f 73 28 26 70  s3ReadNextPos(&p
12130 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 20 20 20  2, &i2);.       
12140 20 7d 65 6c 73 65 20 69 66 28 20 69 31 3c 69 32   }else if( i1<i2
12150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
12160 73 33 52 65 61 64 4e 65 78 74 50 6f 73 28 26 70  s3ReadNextPos(&p
12170 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 20 20 20  1, &i1);.       
12180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12190 20 20 66 74 73 33 52 65 61 64 4e 65 78 74 50 6f    fts3ReadNextPo
121a0 73 28 26 70 32 2c 20 26 69 32 29 3b 0a 20 20 20  s(&p2, &i2);.   
121b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 77 68       }.      }wh
121c0 69 6c 65 28 20 69 31 21 3d 50 4f 53 49 54 49 4f  ile( i1!=POSITIO
121d0 4e 5f 4c 49 53 54 5f 45 4e 44 20 7c 7c 20 69 32  N_LIST_END || i2
121e0 21 3d 50 4f 53 49 54 49 4f 4e 5f 4c 49 53 54 5f  !=POSITION_LIST_
121f0 45 4e 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  END );.    }else
12200 20 69 66 28 20 69 43 6f 6c 31 3c 69 43 6f 6c 32   if( iCol1<iCol2
12210 20 29 7b 0a 20 20 20 20 20 20 70 31 20 2b 3d 20   ){.      p1 += 
12220 66 74 73 33 50 75 74 43 6f 6c 4e 75 6d 62 65 72  fts3PutColNumber
12230 28 26 70 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20  (&p, iCol1);.   
12240 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e 6c 69 73     fts3Columnlis
12250 74 43 6f 70 79 28 26 70 2c 20 26 70 31 29 3b 0a  tCopy(&p, &p1);.
12260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12270 20 70 32 20 2b 3d 20 66 74 73 33 50 75 74 43 6f   p2 += fts3PutCo
12280 6c 4e 75 6d 62 65 72 28 26 70 2c 20 69 43 6f 6c  lNumber(&p, iCol
12290 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 43 6f  2);.      fts3Co
122a0 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 26 70 2c  lumnlistCopy(&p,
122b0 20 26 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &p2);.    }.  }
122c0 0a 0a 20 20 2a 70 2b 2b 20 3d 20 50 4f 53 5f 45  ..  *p++ = POS_E
122d0 4e 44 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20  ND;.  *pp = p;. 
122e0 20 2a 70 70 31 20 3d 20 70 31 20 2b 20 31 3b 0a   *pp1 = p1 + 1;.
122f0 20 20 2a 70 70 32 20 3d 20 70 32 20 2b 20 31 3b    *pp2 = p2 + 1;
12300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
12310 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
12320 74 6f 20 6d 65 72 67 65 20 74 77 6f 20 70 6f 73  to merge two pos
12330 69 74 69 6f 6e 20 6c 69 73 74 73 20 69 6e 74 6f  ition lists into
12340 20 6f 6e 65 2e 20 57 68 65 6e 20 69 74 20 69 73   one. When it is
12350 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 2a 70 70 31  .** called, *pp1
12360 20 61 6e 64 20 2a 70 70 32 20 6d 75 73 74 20 62   and *pp2 must b
12370 6f 74 68 20 70 6f 69 6e 74 20 74 6f 20 70 6f 73  oth point to pos
12380 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 41 20 70  ition lists. A p
12390 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 73 0a  osition-list is.
123a0 2a 2a 20 74 68 65 20 70 61 72 74 20 6f 66 20 61  ** the part of a
123b0 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 66 6f   doclist that fo
123c0 6c 6c 6f 77 73 20 65 61 63 68 20 64 6f 63 75 6d  llows each docum
123d0 65 6e 74 20 69 64 2e 20 46 6f 72 20 65 78 61 6d  ent id. For exam
123e0 70 6c 65 2c 20 69 66 20 61 20 72 6f 77 0a 2a 2a  ple, if a row.**
123f0 20 63 6f 6e 74 61 69 6e 73 3a 0a 2a 2a 0a 2a 2a   contains:.**.**
12400 20 20 20 20 20 27 61 20 62 20 63 27 7c 27 78 20       'a b c'|'x 
12410 79 20 7a 27 7c 27 61 20 62 20 62 20 61 27 0a 2a  y z'|'a b b a'.*
12420 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 70 6f  *.** Then the po
12430 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
12440 74 68 69 73 20 72 6f 77 20 66 6f 72 20 74 6f 6b  this row for tok
12450 65 6e 20 27 62 27 20 77 6f 75 6c 64 20 63 6f 6e  en 'b' would con
12460 73 69 73 74 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20  sist of:.**.**  
12470 20 20 20 30 78 30 32 20 30 78 30 31 20 30 78 30     0x02 0x01 0x0
12480 32 20 30 78 30 33 20 30 78 30 33 20 30 78 30 30  2 0x03 0x03 0x00
12490 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
124a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
124b0 73 2c 20 62 6f 74 68 20 2a 70 70 31 20 61 6e 64  s, both *pp1 and
124c0 20 2a 70 70 32 20 61 72 65 20 6c 65 66 74 20 70   *pp2 are left p
124d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 2a  ointing to the.*
124e0 2a 20 62 79 74 65 20 66 6f 6c 6c 6f 77 69 6e 67  * byte following
124f0 20 74 68 65 20 30 78 30 30 20 74 65 72 6d 69 6e   the 0x00 termin
12500 61 74 6f 72 20 6f 66 20 74 68 65 69 72 20 72 65  ator of their re
12510 73 70 65 63 74 69 76 65 20 70 6f 73 69 74 69 6f  spective positio
12520 6e 20 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  n lists..**.** I
12530 66 20 69 73 53 61 76 65 4c 65 66 74 20 69 73 20  f isSaveLeft is 
12540 30 2c 20 61 6e 20 65 6e 74 72 79 20 69 73 20 61  0, an entry is a
12550 64 64 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  dded to the outp
12560 75 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ut position list
12570 20 66 6f 72 20 0a 2a 2a 20 65 61 63 68 20 70 6f   for .** each po
12580 73 69 74 69 6f 6e 20 69 6e 20 2a 70 70 32 20 66  sition in *pp2 f
12590 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20 65  or which there e
125a0 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  xists one or mor
125b0 65 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 0a 2a  e positions in.*
125c0 2a 20 2a 70 70 31 20 73 6f 20 74 68 61 74 20 28  * *pp1 so that (
125d0 70 6f 73 28 2a 70 70 32 29 3e 70 6f 73 28 2a 70  pos(*pp2)>pos(*p
125e0 70 31 29 20 26 26 20 70 6f 73 28 2a 70 70 32 29  p1) && pos(*pp2)
125f0 2d 70 6f 73 28 2a 70 70 31 29 3c 3d 6e 54 6f 6b  -pos(*pp1)<=nTok
12600 65 6e 29 2e 20 69 2e 65 2e 0a 2a 2a 20 77 68 65  en). i.e..** whe
12610 6e 20 74 68 65 20 2a 70 70 31 20 74 6f 6b 65 6e  n the *pp1 token
12620 20 61 70 70 65 61 72 73 20 62 65 66 6f 72 65 20   appears before 
12630 74 68 65 20 2a 70 70 32 20 74 6f 6b 65 6e 2c 20  the *pp2 token, 
12640 62 75 74 20 6e 6f 74 20 6d 6f 72 65 20 74 68 61  but not more tha
12650 6e 20 6e 54 6f 6b 65 6e 0a 2a 2a 20 73 6c 6f 74  n nToken.** slot
12660 73 20 62 65 66 6f 72 65 20 69 74 2e 0a 2a 2a 0a  s before it..**.
12670 2a 2a 20 65 2e 67 2e 20 6e 54 6f 6b 65 6e 3d 3d  ** e.g. nToken==
12680 31 20 73 65 61 72 63 68 65 73 20 66 6f 72 20 61  1 searches for a
12690 64 6a 61 63 65 6e 74 20 70 6f 73 69 74 69 6f 6e  djacent position
126a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
126b0 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61   fts3PoslistPhra
126c0 73 65 4d 65 72 67 65 28 0a 20 20 63 68 61 72 20  seMerge(.  char 
126d0 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
126e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
126f0 2f 4f 55 54 3a 20 50 72 65 61 6c 6c 6f 63 61 74  /OUT: Preallocat
12700 65 64 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ed output buffer
12710 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
12720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12730 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
12740 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
12750 6f 6b 65 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a  oken positions *
12760 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 4c 65  /.  int isSaveLe
12770 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
12780 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
12790 6c 65 66 74 20 70 6f 73 69 74 69 6f 6e 20 2a 2f  left position */
127a0 0a 20 20 69 6e 74 20 69 73 45 78 61 63 74 2c 20  .  int isExact, 
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 20 2f 2a 20 49 66 20 2a 70 70 31 20 69 73     /* If *pp1 is
127d0 20 65 78 61 63 74 6c 79 20 6e 54 6f 6b 65 6e 73   exactly nTokens
127e0 20 62 65 66 6f 72 65 20 2a 70 70 32 20 2a 2f 0a   before *pp2 */.
127f0 20 20 63 68 61 72 20 2a 2a 70 70 31 2c 20 20 20    char **pp1,   
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 65 66    /* IN/OUT: Lef
12820 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a  t input list */.
12830 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20 20 20    char **pp2    
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 67    /* IN/OUT: Rig
12860 68 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f  ht input list */
12870 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20  .){.  char *p = 
12880 2a 70 70 3b 0a 20 20 63 68 61 72 20 2a 70 31 20  *pp;.  char *p1 
12890 3d 20 2a 70 70 31 3b 0a 20 20 63 68 61 72 20 2a  = *pp1;.  char *
128a0 70 32 20 3d 20 2a 70 70 32 3b 0a 20 20 69 6e 74  p2 = *pp2;.  int
128b0 20 69 43 6f 6c 31 20 3d 20 30 3b 0a 20 20 69 6e   iCol1 = 0;.  in
128c0 74 20 69 43 6f 6c 32 20 3d 20 30 3b 0a 0a 20 20  t iCol2 = 0;..  
128d0 2f 2a 20 4e 65 76 65 72 20 73 65 74 20 62 6f 74  /* Never set bot
128e0 68 20 69 73 53 61 76 65 4c 65 66 74 20 61 6e 64  h isSaveLeft and
128f0 20 69 73 45 78 61 63 74 20 66 6f 72 20 74 68 65   isExact for the
12900 20 73 61 6d 65 20 69 6e 76 6f 63 61 74 69 6f 6e   same invocation
12910 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  . */.  assert( i
12920 73 53 61 76 65 4c 65 66 74 3d 3d 30 20 7c 7c 20  sSaveLeft==0 || 
12930 69 73 45 78 61 63 74 3d 3d 30 20 29 3b 0a 0a 20  isExact==0 );.. 
12940 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 26 26   assert( p!=0 &&
12950 20 2a 70 31 21 3d 30 20 26 26 20 2a 70 32 21 3d   *p1!=0 && *p2!=
12960 30 20 29 3b 0a 20 20 69 66 28 20 2a 70 31 3d 3d  0 );.  if( *p1==
12970 50 4f 53 5f 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20  POS_COLUMN ){ . 
12980 20 20 20 70 31 2b 2b 3b 0a 20 20 20 20 70 31 20     p1++;.    p1 
12990 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74  += fts3GetVarint
129a0 33 32 28 70 31 2c 20 26 69 43 6f 6c 31 29 3b 0a  32(p1, &iCol1);.
129b0 20 20 7d 0a 20 20 69 66 28 20 2a 70 32 3d 3d 50    }.  if( *p2==P
129c0 4f 53 5f 43 4f 4c 55 4d 4e 20 29 7b 20 0a 20 20  OS_COLUMN ){ .  
129d0 20 20 70 32 2b 2b 3b 0a 20 20 20 20 70 32 20 2b    p2++;.    p2 +
129e0 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33  = fts3GetVarint3
129f0 32 28 70 32 2c 20 26 69 43 6f 6c 32 29 3b 0a 20  2(p2, &iCol2);. 
12a00 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29   }..  while( 1 )
12a10 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 31 3d  {.    if( iCol1=
12a20 3d 69 43 6f 6c 32 20 29 7b 0a 20 20 20 20 20 20  =iCol2 ){.      
12a30 63 68 61 72 20 2a 70 53 61 76 65 20 3d 20 70 3b  char *pSave = p;
12a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
12a50 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a  nt64 iPrev = 0;.
12a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
12a70 74 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20  t64 iPos1 = 0;. 
12a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
12a90 36 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a 0a 20  64 iPos2 = 0;.. 
12aa0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 31 20 29       if( iCol1 )
12ab0 7b 0a 20 20 20 20 20 20 20 20 2a 70 2b 2b 20 3d  {.        *p++ =
12ac0 20 50 4f 53 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20   POS_COLUMN;.   
12ad0 20 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65       p += sqlite
12ae0 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 70  3Fts3PutVarint(p
12af0 2c 20 69 43 6f 6c 31 29 3b 0a 20 20 20 20 20 20  , iCol1);.      
12b00 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
12b10 20 2a 70 31 21 3d 50 4f 53 5f 45 4e 44 20 26 26   *p1!=POS_END &&
12b20 20 2a 70 31 21 3d 50 4f 53 5f 43 4f 4c 55 4d 4e   *p1!=POS_COLUMN
12b30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12b40 28 20 2a 70 32 21 3d 50 4f 53 5f 45 4e 44 20 26  ( *p2!=POS_END &
12b50 26 20 2a 70 32 21 3d 50 4f 53 5f 43 4f 4c 55 4d  & *p2!=POS_COLUM
12b60 4e 20 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47  N );.      fts3G
12b70 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26 70  etDeltaVarint(&p
12b80 31 2c 20 26 69 50 6f 73 31 29 3b 20 69 50 6f 73  1, &iPos1); iPos
12b90 31 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 66 74  1 -= 2;.      ft
12ba0 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
12bb0 28 26 70 32 2c 20 26 69 50 6f 73 32 29 3b 20 69  (&p2, &iPos2); i
12bc0 50 6f 73 32 20 2d 3d 20 32 3b 0a 0a 20 20 20 20  Pos2 -= 2;..    
12bd0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
12be0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 32 3d        if( iPos2=
12bf0 3d 69 50 6f 73 31 2b 6e 54 6f 6b 65 6e 20 0a 20  =iPos1+nToken . 
12c00 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 45 78          || (isEx
12c10 61 63 74 3d 3d 30 20 26 26 20 69 50 6f 73 32 3e  act==0 && iPos2>
12c20 69 50 6f 73 31 20 26 26 20 69 50 6f 73 32 3c 3d  iPos1 && iPos2<=
12c30 69 50 6f 73 31 2b 6e 54 6f 6b 65 6e 29 20 0a 20  iPos1+nToken) . 
12c40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
12c50 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12c60 34 20 69 53 61 76 65 3b 0a 20 20 20 20 20 20 20  4 iSave;.       
12c70 20 20 20 69 53 61 76 65 20 3d 20 69 73 53 61 76     iSave = isSav
12c80 65 4c 65 66 74 20 3f 20 69 50 6f 73 31 20 3a 20  eLeft ? iPos1 : 
12c90 69 50 6f 73 32 3b 0a 20 20 20 20 20 20 20 20 20  iPos2;.         
12ca0 20 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72   fts3PutDeltaVar
12cb0 69 6e 74 28 26 70 2c 20 26 69 50 72 65 76 2c 20  int(&p, &iPrev, 
12cc0 69 53 61 76 65 2b 32 29 3b 20 69 50 72 65 76 20  iSave+2); iPrev 
12cd0 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  -= 2;.          
12ce0 70 53 61 76 65 20 3d 20 30 3b 0a 20 20 20 20 20  pSave = 0;.     
12cf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29       assert( p )
12d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12d10 20 20 20 20 69 66 28 20 28 21 69 73 53 61 76 65      if( (!isSave
12d20 4c 65 66 74 20 26 26 20 69 50 6f 73 32 3c 3d 28  Left && iPos2<=(
12d30 69 50 6f 73 31 2b 6e 54 6f 6b 65 6e 29 29 20 7c  iPos1+nToken)) |
12d40 7c 20 69 50 6f 73 32 3c 3d 69 50 6f 73 31 20 29  | iPos2<=iPos1 )
12d50 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
12d60 28 2a 70 32 26 30 78 46 45 29 3d 3d 30 20 29 20  (*p2&0xFE)==0 ) 
12d70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12d80 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61 72   fts3GetDeltaVar
12d90 69 6e 74 28 26 70 32 2c 20 26 69 50 6f 73 32 29  int(&p2, &iPos2)
12da0 3b 20 69 50 6f 73 32 20 2d 3d 20 32 3b 0a 20 20  ; iPos2 -= 2;.  
12db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12dc0 20 20 20 20 20 20 20 69 66 28 20 28 2a 70 31 26         if( (*p1&
12dd0 30 78 46 45 29 3d 3d 30 20 29 20 62 72 65 61 6b  0xFE)==0 ) break
12de0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 33  ;.          fts3
12df0 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 28 26  GetDeltaVarint(&
12e00 70 31 2c 20 26 69 50 6f 73 31 29 3b 20 69 50 6f  p1, &iPos1); iPo
12e10 73 31 20 2d 3d 20 32 3b 0a 20 20 20 20 20 20 20  s1 -= 2;.       
12e20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
12e30 20 20 69 66 28 20 70 53 61 76 65 20 29 7b 0a 20    if( pSave ){. 
12e40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12e50 70 20 26 26 20 70 20 29 3b 0a 20 20 20 20 20 20  p && p );.      
12e60 20 20 70 20 3d 20 70 53 61 76 65 3b 0a 20 20 20    p = pSave;.   
12e70 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 33     }..      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 66 74  , &p1);.      ft
12ea0 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79  s3ColumnlistCopy
12eb0 28 30 2c 20 26 70 32 29 3b 0a 20 20 20 20 20 20  (0, &p2);.      
12ec0 61 73 73 65 72 74 28 20 28 2a 70 31 26 30 78 46  assert( (*p1&0xF
12ed0 45 29 3d 3d 30 20 26 26 20 28 2a 70 32 26 30 78  E)==0 && (*p2&0x
12ee0 46 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  FE)==0 );.      
12ef0 69 66 28 20 30 3d 3d 2a 70 31 20 7c 7c 20 30 3d  if( 0==*p1 || 0=
12f00 3d 2a 70 32 20 29 20 62 72 65 61 6b 3b 0a 0a 20  =*p2 ) break;.. 
12f10 20 20 20 20 20 70 31 2b 2b 3b 0a 20 20 20 20 20       p1++;.     
12f20 20 70 31 20 2b 3d 20 66 74 73 33 47 65 74 56 61   p1 += fts3GetVa
12f30 72 69 6e 74 33 32 28 70 31 2c 20 26 69 43 6f 6c  rint32(p1, &iCol
12f40 31 29 3b 0a 20 20 20 20 20 20 70 32 2b 2b 3b 0a  1);.      p2++;.
12f50 20 20 20 20 20 20 70 32 20 2b 3d 20 66 74 73 33        p2 += fts3
12f60 47 65 74 56 61 72 69 6e 74 33 32 28 70 32 2c 20  GetVarint32(p2, 
12f70 26 69 43 6f 6c 32 29 3b 0a 20 20 20 20 7d 0a 0a  &iCol2);.    }..
12f80 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70      /* Advance p
12f90 6f 69 6e 74 65 72 20 70 31 20 6f 72 20 70 32 20  ointer p1 or p2 
12fa0 28 77 68 69 63 68 65 76 65 72 20 63 6f 72 72 65  (whichever corre
12fb0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 73 6d  sponds to the sm
12fc0 61 6c 6c 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  aller of.    ** 
12fd0 69 43 6f 6c 31 20 61 6e 64 20 69 43 6f 6c 32 29  iCol1 and iCol2)
12fe0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
12ff0 74 73 20 74 6f 20 65 69 74 68 65 72 20 74 68 65  ts to either the
13000 20 30 78 30 30 20 74 68 61 74 20 6d 61 72 6b 73   0x00 that marks
13010 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
13020 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
13030 6c 69 73 74 2c 20 6f 72 20 74 68 65 20 30 78 30  list, or the 0x0
13040 31 20 74 68 61 74 20 70 72 65 63 65 64 65 73 20  1 that precedes 
13050 74 68 65 20 6e 65 78 74 20 0a 20 20 20 20 2a 2a  the next .    **
13060 20 63 6f 6c 75 6d 6e 2d 6e 75 6d 62 65 72 20 69   column-number i
13070 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  n the position l
13080 69 73 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ist. .    */.   
13090 20 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 31 3c   else if( iCol1<
130a0 69 43 6f 6c 32 20 29 7b 0a 20 20 20 20 20 20 66  iCol2 ){.      f
130b0 74 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70  ts3ColumnlistCop
130c0 79 28 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20  y(0, &p1);.     
130d0 20 69 66 28 20 30 3d 3d 2a 70 31 20 29 20 62 72   if( 0==*p1 ) br
130e0 65 61 6b 3b 0a 20 20 20 20 20 20 70 31 2b 2b 3b  eak;.      p1++;
130f0 0a 20 20 20 20 20 20 70 31 20 2b 3d 20 66 74 73  .      p1 += fts
13100 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 31 2c  3GetVarint32(p1,
13110 20 26 69 43 6f 6c 31 29 3b 0a 20 20 20 20 7d 65   &iCol1);.    }e
13120 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 33 43  lse{.      fts3C
13130 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c  olumnlistCopy(0,
13140 20 26 70 32 29 3b 0a 20 20 20 20 20 20 69 66 28   &p2);.      if(
13150 20 30 3d 3d 2a 70 32 20 29 20 62 72 65 61 6b 3b   0==*p2 ) break;
13160 0a 20 20 20 20 20 20 70 32 2b 2b 3b 0a 20 20 20  .      p2++;.   
13170 20 20 20 70 32 20 2b 3d 20 66 74 73 33 47 65 74     p2 += fts3Get
13180 56 61 72 69 6e 74 33 32 28 70 32 2c 20 26 69 43  Varint32(p2, &iC
13190 6f 6c 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ol2);.    }.  }.
131a0 0a 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f  .  fts3PoslistCo
131b0 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20 66 74  py(0, &p2);.  ft
131c0 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c  s3PoslistCopy(0,
131d0 20 26 70 31 29 3b 0a 20 20 2a 70 70 31 20 3d 20   &p1);.  *pp1 = 
131e0 70 31 3b 0a 20 20 2a 70 70 32 20 3d 20 70 32 3b  p1;.  *pp2 = p2;
131f0 0a 20 20 69 66 28 20 2a 70 70 3d 3d 70 20 29 7b  .  if( *pp==p ){
13200 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13210 20 7d 0a 20 20 2a 70 2b 2b 20 3d 20 30 78 30 30   }.  *p++ = 0x00
13220 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a 20 20 72  ;.  *pp = p;.  r
13230 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
13240 2a 20 4d 65 72 67 65 20 74 77 6f 20 70 6f 73 69  * Merge two posi
13250 74 69 6f 6e 2d 6c 69 73 74 73 20 61 73 20 72 65  tion-lists as re
13260 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4e 45  quired by the NE
13270 41 52 20 6f 70 65 72 61 74 6f 72 2e 20 54 68 65  AR operator. The
13280 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 73   argument.** pos
13290 69 74 69 6f 6e 20 6c 69 73 74 73 20 63 6f 72 72  ition lists corr
132a0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 6c 65  espond to the le
132b0 66 74 20 61 6e 64 20 72 69 67 68 74 20 70 68 72  ft and right phr
132c0 61 73 65 73 20 6f 66 20 61 6e 20 65 78 70 72 65  ases of an expre
132d0 73 73 69 6f 6e 20 0a 2a 2a 20 6c 69 6b 65 3a 0a  ssion .** like:.
132e0 2a 2a 0a 2a 2a 20 20 20 20 20 22 70 68 72 61 73  **.**     "phras
132f0 65 20 31 22 20 4e 45 41 52 20 22 70 68 72 61 73  e 1" NEAR "phras
13300 65 20 6e 75 6d 62 65 72 20 32 22 0a 2a 2a 0a 2a  e number 2".**.*
13310 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * Position list 
13320 2a 70 70 31 20 63 6f 72 72 65 73 70 6f 6e 64 73  *pp1 corresponds
13330 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
13340 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 4e 45  d side of the NE
13350 41 52 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  AR .** expressio
13360 6e 20 61 6e 64 20 2a 70 70 32 20 74 6f 20 74 68  n and *pp2 to th
13370 65 20 72 69 67 68 74 2e 20 41 73 20 75 73 75 61  e right. As usua
13380 6c 2c 20 74 68 65 20 69 6e 64 65 78 65 73 20 69  l, the indexes i
13390 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 0a  n the position .
133a0 2a 2a 20 6c 69 73 74 73 20 61 72 65 20 74 68 65  ** lists are the
133b0 20 6f 66 66 73 65 74 73 20 6f 66 20 74 68 65 20   offsets of the 
133c0 6c 61 73 74 20 74 6f 6b 65 6e 20 69 6e 20 65 61  last token in ea
133d0 63 68 20 70 68 72 61 73 65 20 28 74 6f 6b 65 6e  ch phrase (token
133e0 73 20 22 31 22 20 61 6e 64 20 22 32 22 20 0a 2a  s "1" and "2" .*
133f0 2a 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * in the example
13400 20 61 62 6f 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 54   above)..**.** T
13410 68 65 20 6f 75 74 70 75 74 20 70 6f 73 69 74 69  he output positi
13420 6f 6e 20 6c 69 73 74 20 2d 20 77 72 69 74 74 65  on list - writte
13430 6e 20 74 6f 20 2a 70 70 20 2d 20 69 73 20 61 20  n to *pp - is a 
13440 63 6f 70 79 20 6f 66 20 2a 70 70 32 20 77 69 74  copy of *pp2 wit
13450 68 20 74 68 6f 73 65 0a 2a 2a 20 65 6e 74 72 69  h those.** entri
13460 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  es that are not 
13470 73 75 66 66 69 63 69 65 6e 74 6c 79 20 4e 45 41  sufficiently NEA
13480 52 20 65 6e 74 72 69 65 73 20 69 6e 20 2a 70 70  R entries in *pp
13490 31 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74  1 removed..*/.st
134a0 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 6f 73  atic int fts3Pos
134b0 6c 69 73 74 4e 65 61 72 4d 65 72 67 65 28 0a 20  listNearMerge(. 
134c0 20 63 68 61 72 20 2a 2a 70 70 2c 20 20 20 20 20   char **pp,     
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
134f0 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 54 6d  r */.  char *aTm
13500 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13510 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
13520 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
13530 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 69 67 68 74   */.  int nRight
13540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13550 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
13560 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
13570 6f 6b 65 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a  oken positions *
13580 2f 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 20 20  /.  int nLeft,  
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 64      /* Maximum d
135b0 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 6f 6b  ifference in tok
135c0 65 6e 20 70 6f 73 69 74 69 6f 6e 73 20 2a 2f 0a  en positions */.
135d0 20 20 63 68 61 72 20 2a 2a 70 70 31 2c 20 20 20    char **pp1,   
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4c 65 66    /* IN/OUT: Lef
13600 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f 0a  t input list */.
13610 20 20 63 68 61 72 20 2a 2a 70 70 32 20 20 20 20    char **pp2    
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13630 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 67    /* IN/OUT: Rig
13640 68 74 20 69 6e 70 75 74 20 6c 69 73 74 20 2a 2f  ht input list */
13650 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 31 20 3d  .){.  char *p1 =
13660 20 2a 70 70 31 3b 0a 20 20 63 68 61 72 20 2a 70   *pp1;.  char *p
13670 32 20 3d 20 2a 70 70 32 3b 0a 0a 20 20 63 68 61  2 = *pp2;..  cha
13680 72 20 2a 70 54 6d 70 31 20 3d 20 61 54 6d 70 3b  r *pTmp1 = aTmp;
13690 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 32 3b 0a  .  char *pTmp2;.
136a0 20 20 63 68 61 72 20 2a 61 54 6d 70 32 3b 0a 20    char *aTmp2;. 
136b0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 0a 0a 20   int res = 1;.. 
136c0 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72 61   fts3PoslistPhra
136d0 73 65 4d 65 72 67 65 28 26 70 54 6d 70 31 2c 20  seMerge(&pTmp1, 
136e0 6e 52 69 67 68 74 2c 20 30 2c 20 30 2c 20 70 70  nRight, 0, 0, pp
136f0 31 2c 20 70 70 32 29 3b 0a 20 20 61 54 6d 70 32  1, pp2);.  aTmp2
13700 20 3d 20 70 54 6d 70 32 20 3d 20 70 54 6d 70 31   = pTmp2 = pTmp1
13710 3b 0a 20 20 2a 70 70 31 20 3d 20 70 31 3b 0a 20  ;.  *pp1 = p1;. 
13720 20 2a 70 70 32 20 3d 20 70 32 3b 0a 20 20 66 74   *pp2 = p2;.  ft
13730 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d  s3PoslistPhraseM
13740 65 72 67 65 28 26 70 54 6d 70 32 2c 20 6e 4c 65  erge(&pTmp2, nLe
13750 66 74 2c 20 31 2c 20 30 2c 20 70 70 32 2c 20 70  ft, 1, 0, pp2, p
13760 70 31 29 3b 0a 20 20 69 66 28 20 70 54 6d 70 31  p1);.  if( pTmp1
13770 21 3d 61 54 6d 70 20 26 26 20 70 54 6d 70 32 21  !=aTmp && pTmp2!
13780 3d 61 54 6d 70 32 20 29 7b 0a 20 20 20 20 66 74  =aTmp2 ){.    ft
13790 73 33 50 6f 73 6c 69 73 74 4d 65 72 67 65 28 70  s3PoslistMerge(p
137a0 70 2c 20 26 61 54 6d 70 2c 20 26 61 54 6d 70 32  p, &aTmp, &aTmp2
137b0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
137c0 54 6d 70 31 21 3d 61 54 6d 70 20 29 7b 0a 20 20  Tmp1!=aTmp ){.  
137d0 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f 70    fts3PoslistCop
137e0 79 28 70 70 2c 20 26 61 54 6d 70 29 3b 0a 20 20  y(pp, &aTmp);.  
137f0 7d 65 6c 73 65 20 69 66 28 20 70 54 6d 70 32 21  }else if( pTmp2!
13800 3d 61 54 6d 70 32 20 29 7b 0a 20 20 20 20 66 74  =aTmp2 ){.    ft
13810 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 70 70  s3PoslistCopy(pp
13820 2c 20 26 61 54 6d 70 32 29 3b 0a 20 20 7d 65 6c  , &aTmp2);.  }el
13830 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 30 3b  se{.    res = 0;
13840 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
13850 65 73 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e  es;.}../* .** An
13860 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
13870 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
13880 65 64 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65  ed to merge toge
13890 74 68 65 72 20 74 68 65 20 28 70 6f 74 65 6e 74  ther the (potent
138a0 69 61 6c 6c 79 0a 2a 2a 20 6c 61 72 67 65 20 6e  ially.** large n
138b0 75 6d 62 65 72 20 6f 66 29 20 64 6f 63 6c 69 73  umber of) doclis
138c0 74 73 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ts for each term
138d0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 20   that matches a 
138e0 70 72 65 66 69 78 20 71 75 65 72 79 2e 0a 2a 2a  prefix query..**
138f0 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 20 66 74   See function ft
13900 73 33 54 65 72 6d 53 65 6c 65 63 74 4d 65 72 67  s3TermSelectMerg
13910 65 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  e() for details.
13920 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
13930 63 74 20 54 65 72 6d 53 65 6c 65 63 74 20 54 65  ct TermSelect Te
13940 72 6d 53 65 6c 65 63 74 3b 0a 73 74 72 75 63 74  rmSelect;.struct
13950 20 54 65 72 6d 53 65 6c 65 63 74 20 7b 0a 20 20   TermSelect {.  
13960 63 68 61 72 20 2a 61 61 4f 75 74 70 75 74 5b 31  char *aaOutput[1
13970 36 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  6];             
13980 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6f 75 74 70  /* Malloc'd outp
13990 75 74 20 62 75 66 66 65 72 73 20 2a 2f 0a 20 20  ut buffers */.  
139a0 69 6e 74 20 61 6e 4f 75 74 70 75 74 5b 31 36 5d  int anOutput[16]
139b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
139c0 2f 2a 20 53 69 7a 65 20 65 61 63 68 20 6f 75 74  /* Size each out
139d0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
139e0 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tes */.};../*.**
139f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
13a00 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61  s used to read a
13a10 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
13a20 72 6f 6d 20 61 20 62 75 66 66 65 72 2e 20 50 61  rom a buffer. Pa
13a30 72 61 6d 65 74 65 72 0a 2a 2a 20 70 45 6e 64 20  rameter.** pEnd 
13a40 70 6f 69 6e 74 73 20 31 20 62 79 74 65 20 70 61  points 1 byte pa
13a50 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
13a60 65 20 62 75 66 66 65 72 2e 20 57 68 65 6e 20 74  e buffer. When t
13a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
13a80 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 66 20 2a 70  ** called, if *p
13a90 70 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64  p points to pEnd
13aa0 20 6f 72 20 67 72 65 61 74 65 72 2c 20 74 68 65   or greater, the
13ab0 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
13ac0 20 62 75 66 66 65 72 0a 2a 2a 20 68 61 73 20 62   buffer.** has b
13ad0 65 65 6e 20 72 65 61 63 68 65 64 2e 20 49 6e 20  een reached. In 
13ae0 74 68 69 73 20 63 61 73 65 20 2a 70 70 20 69 73  this case *pp is
13af0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 74 68   set to 0 and th
13b00 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
13b10 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 70  ns..**.** If *pp
13b20 20 64 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20   does not point 
13b30 74 6f 20 6f 72 20 70 61 73 74 20 70 45 6e 64 2c  to or past pEnd,
13b40 20 74 68 65 6e 20 61 20 73 69 6e 67 6c 65 20 76   then a single v
13b50 61 72 69 6e 74 20 69 73 20 72 65 61 64 0a 2a 2a  arint is read.**
13b60 20 66 72 6f 6d 20 2a 70 70 2e 20 2a 70 70 20 69   from *pp. *pp i
13b70 73 20 74 68 65 6e 20 73 65 74 20 74 6f 20 70 6f  s then set to po
13b80 69 6e 74 20 31 20 62 79 74 65 20 70 61 73 74 20  int 1 byte past 
13b90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
13ba0 65 61 64 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  ead varint..**.*
13bb0 2a 20 49 66 20 62 44 65 73 63 49 64 78 20 69 73  * If bDescIdx is
13bc0 20 66 61 6c 73 65 2c 20 74 68 65 20 76 61 6c 75   false, the valu
13bd0 65 20 72 65 61 64 20 69 73 20 61 64 64 65 64 20  e read is added 
13be0 74 6f 20 2a 70 56 61 6c 20 62 65 66 6f 72 65 20  to *pVal before 
13bf0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 49 66  returning..** If
13c00 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65   it is true, the
13c10 20 76 61 6c 75 65 20 72 65 61 64 20 69 73 20 73   value read is s
13c20 75 62 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  ubtracted from *
13c30 70 56 61 6c 20 62 65 66 6f 72 65 20 74 68 69 73  pVal before this
13c40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
13c50 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  turns..*/.static
13c60 20 76 6f 69 64 20 66 74 73 33 47 65 74 44 65 6c   void fts3GetDel
13c70 74 61 56 61 72 69 6e 74 33 28 0a 20 20 63 68 61  taVarint3(.  cha
13c80 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20  r **pp,         
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ca0 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 20 74 6f  IN/OUT: Point to
13cb0 20 72 65 61 64 20 76 61 72 69 6e 74 20 66 72 6f   read varint fro
13cc0 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 45 6e  m */.  char *pEn
13cd0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
13ce0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
13cf0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
13d00 20 62 44 65 73 63 49 64 78 2c 20 20 20 20 20 20   bDescIdx,      
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d20 54 72 75 65 20 69 66 20 64 6f 63 69 64 73 20 61  True if docids a
13d30 72 65 20 64 65 73 63 65 6e 64 69 6e 67 20 2a 2f  re descending */
13d40 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
13d50 20 2a 70 56 61 6c 20 20 20 20 20 20 20 20 20 20   *pVal          
13d60 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e     /* IN/OUT: In
13d70 74 65 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 29  teger value */.)
13d80 7b 0a 20 20 69 66 28 20 2a 70 70 3e 3d 70 45 6e  {.  if( *pp>=pEn
13d90 64 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  d ){.    *pp = 0
13da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
13db0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
13dc0 6c 3b 0a 20 20 20 20 2a 70 70 20 2b 3d 20 73 71  l;.    *pp += sq
13dd0 6c 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69  lite3Fts3GetVari
13de0 6e 74 28 2a 70 70 2c 20 26 69 56 61 6c 29 3b 0a  nt(*pp, &iVal);.
13df0 20 20 20 20 69 66 28 20 62 44 65 73 63 49 64 78      if( bDescIdx
13e00 20 29 7b 0a 20 20 20 20 20 20 2a 70 56 61 6c 20   ){.      *pVal 
13e10 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 7d 65 6c  -= iVal;.    }el
13e20 73 65 7b 0a 20 20 20 20 20 20 2a 70 56 61 6c 20  se{.      *pVal 
13e30 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 7d 0a 20  += iVal;.    }. 
13e40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
13e50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
13e60 64 20 74 6f 20 77 72 69 74 65 20 61 20 73 69 6e  d to write a sin
13e70 67 6c 65 20 76 61 72 69 6e 74 20 74 6f 20 61 20  gle varint to a 
13e80 62 75 66 66 65 72 2e 20 54 68 65 20 76 61 72 69  buffer. The vari
13e90 6e 74 0a 2a 2a 20 69 73 20 77 72 69 74 74 65 6e  nt.** is written
13ea0 20 74 6f 20 2a 70 70 2e 20 42 65 66 6f 72 65 20   to *pp. Before 
13eb0 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 70 20 69  returning, *pp i
13ec0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 31  s set to point 1
13ed0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a   byte past the.*
13ee0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 76 61 6c  * end of the val
13ef0 75 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  ue written..**.*
13f00 2a 20 49 66 20 2a 70 62 46 69 72 73 74 20 69 73  * If *pbFirst is
13f10 20 7a 65 72 6f 20 77 68 65 6e 20 74 68 69 73 20   zero when this 
13f20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13f30 65 64 2c 20 74 68 65 20 76 61 6c 75 65 20 77 72  ed, the value wr
13f40 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68 65 20  itten to.** the 
13f50 62 75 66 66 65 72 20 69 73 20 74 68 61 74 20 6f  buffer is that o
13f60 66 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 6c  f parameter iVal
13f70 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 62 46  . .**.** If *pbF
13f80 69 72 73 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  irst is non-zero
13f90 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
13fa0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
13fb0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a  hen the value .*
13fc0 2a 20 77 72 69 74 74 65 6e 20 69 73 20 65 69 74  * written is eit
13fd0 68 65 72 20 28 69 56 61 6c 2d 2a 70 69 50 72 65  her (iVal-*piPre
13fe0 76 29 20 28 69 66 20 62 44 65 73 63 49 64 78 20  v) (if bDescIdx 
13ff0 69 73 20 7a 65 72 6f 29 20 6f 72 20 28 2a 70 69  is zero) or (*pi
14000 50 72 65 76 2d 69 56 61 6c 29 0a 2a 2a 20 28 69  Prev-iVal).** (i
14010 66 20 62 44 65 73 63 49 64 78 20 69 73 20 6e 6f  f bDescIdx is no
14020 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 42  n-zero)..**.** B
14030 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
14040 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
14050 6c 77 61 79 73 20 73 65 74 73 20 2a 70 62 46 69  lways sets *pbFi
14060 72 73 74 20 74 6f 20 31 20 61 6e 64 20 2a 70 69  rst to 1 and *pi
14070 50 72 65 76 0a 2a 2a 20 74 6f 20 74 68 65 20 76  Prev.** to the v
14080 61 6c 75 65 20 6f 66 20 70 61 72 61 6d 65 74 65  alue of paramete
14090 72 20 69 56 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  r iVal..*/.stati
140a0 63 20 76 6f 69 64 20 66 74 73 33 50 75 74 44 65  c void fts3PutDe
140b0 6c 74 61 56 61 72 69 6e 74 33 28 0a 20 20 63 68  ltaVarint3(.  ch
140c0 61 72 20 2a 2a 70 70 2c 20 20 20 20 20 20 20 20  ar **pp,        
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
140e0 20 49 4e 2f 4f 55 54 3a 20 4f 75 74 70 75 74 20   IN/OUT: Output 
140f0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
14100 20 62 44 65 73 63 49 64 78 2c 20 20 20 20 20 20   bDescIdx,      
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14120 54 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64  True for descend
14130 69 6e 67 20 64 6f 63 69 64 73 20 2a 2f 0a 20 20  ing docids */.  
14140 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
14150 69 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20  iPrev,          
14160 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69  /* IN/OUT: Previ
14170 6f 75 73 20 76 61 6c 75 65 20 77 72 69 74 74 65  ous value writte
14180 6e 20 74 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69  n to list */.  i
14190 6e 74 20 2a 70 62 46 69 72 73 74 2c 20 20 20 20  nt *pbFirst,    
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
141b0 2a 20 49 4e 2f 4f 55 54 3a 20 54 72 75 65 20 61  * IN/OUT: True a
141c0 66 74 65 72 20 66 69 72 73 74 20 69 6e 74 20 77  fter first int w
141d0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 73 71 6c 69  ritten */.  sqli
141e0 74 65 33 5f 69 6e 74 36 34 20 69 56 61 6c 20 20  te3_int64 iVal  
141f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
14200 72 69 74 65 20 74 68 69 73 20 76 61 6c 75 65 20  rite this value 
14210 74 6f 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 29  to the list */.)
14220 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
14230 34 20 69 57 72 69 74 65 3b 0a 20 20 69 66 28 20  4 iWrite;.  if( 
14240 62 44 65 73 63 49 64 78 3d 3d 30 20 7c 7c 20 2a  bDescIdx==0 || *
14250 70 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20  pbFirst==0 ){.  
14260 20 20 69 57 72 69 74 65 20 3d 20 69 56 61 6c 20    iWrite = iVal 
14270 2d 20 2a 70 69 50 72 65 76 3b 0a 20 20 7d 65 6c  - *piPrev;.  }el
14280 73 65 7b 0a 20 20 20 20 69 57 72 69 74 65 20 3d  se{.    iWrite =
14290 20 2a 70 69 50 72 65 76 20 2d 20 69 56 61 6c 3b   *piPrev - iVal;
142a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 2a  .  }.  assert( *
142b0 70 62 46 69 72 73 74 20 7c 7c 20 2a 70 69 50 72  pbFirst || *piPr
142c0 65 76 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ev==0 );.  asser
142d0 74 28 20 2a 70 62 46 69 72 73 74 3d 3d 30 20 7c  t( *pbFirst==0 |
142e0 7c 20 69 57 72 69 74 65 3e 30 20 29 3b 0a 20 20  | iWrite>0 );.  
142f0 2a 70 70 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  *pp += sqlite3Ft
14300 73 33 50 75 74 56 61 72 69 6e 74 28 2a 70 70 2c  s3PutVarint(*pp,
14310 20 69 57 72 69 74 65 29 3b 0a 20 20 2a 70 69 50   iWrite);.  *piP
14320 72 65 76 20 3d 20 69 56 61 6c 3b 0a 20 20 2a 70  rev = iVal;.  *p
14330 62 46 69 72 73 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  bFirst = 1;.}...
14340 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
14350 20 69 73 20 75 73 65 64 20 62 79 20 76 61 72 69   is used by vari
14360 6f 75 73 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ous functions th
14370 61 74 20 6d 65 72 67 65 20 64 6f 63 6c 69 73 74  at merge doclist
14380 73 2e 20 54 68 65 20 74 77 6f 0a 2a 2a 20 61 72  s. The two.** ar
14390 67 75 6d 65 6e 74 73 20 61 72 65 20 36 34 2d 62  guments are 64-b
143a0 69 74 20 64 6f 63 69 64 20 76 61 6c 75 65 73 2e  it docid values.
143b0 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   If the value of
143c0 20 74 68 65 20 73 74 61 63 6b 20 76 61 72 69 61   the stack varia
143d0 62 6c 65 0a 2a 2a 20 62 44 65 73 63 44 6f 63 6c  ble.** bDescDocl
143e0 69 73 74 20 69 73 20 30 20 77 68 65 6e 20 74 68  ist is 0 when th
143f0 69 73 20 6d 61 63 72 6f 20 69 73 20 69 6e 76 6f  is macro is invo
14400 6b 65 64 2c 20 74 68 65 6e 20 69 74 20 72 65 74  ked, then it ret
14410 75 72 6e 73 20 28 69 31 2d 69 32 29 2e 20 0a 2a  urns (i1-i2). .*
14420 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 28 69 32  * Otherwise, (i2
14430 2d 69 31 29 2e 0a 2a 2a 0a 2a 2a 20 55 73 69 6e  -i1)..**.** Usin
14440 67 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  g this makes it 
14450 65 61 73 69 65 72 20 74 6f 20 77 72 69 74 65 20  easier to write 
14460 63 6f 64 65 20 74 68 61 74 20 63 61 6e 20 6d 65  code that can me
14470 72 67 65 20 64 6f 63 6c 69 73 74 73 20 74 68 61  rge doclists tha
14480 74 20 61 72 65 0a 2a 2a 20 73 6f 72 74 65 64 20  t are.** sorted 
14490 69 6e 20 65 69 74 68 65 72 20 61 73 63 65 6e 64  in either ascend
144a0 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e  ing or descendin
144b0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  g order..*/.#def
144c0 69 6e 65 20 44 4f 43 49 44 5f 43 4d 50 28 69 31  ine DOCID_CMP(i1
144d0 2c 20 69 32 29 20 28 28 62 44 65 73 63 44 6f 63  , i2) ((bDescDoc
144e0 6c 69 73 74 3f 2d 31 3a 31 29 20 2a 20 28 69 31  list?-1:1) * (i1
144f0 2d 69 32 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  -i2))../*.** Thi
14500 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
14510 61 6e 20 22 4f 52 22 20 6d 65 72 67 65 20 6f 66  an "OR" merge of
14520 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 28 6f   two doclists (o
14530 75 74 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 61  utput contains a
14540 6c 6c 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 73 20  ll.** positions 
14550 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 65 69 74  contained in eit
14560 68 65 72 20 61 72 67 75 6d 65 6e 74 20 64 6f 63  her argument doc
14570 6c 69 73 74 29 2e 20 49 66 20 74 68 65 20 64 6f  list). If the do
14580 63 69 64 73 20 69 6e 20 74 68 65 20 0a 2a 2a 20  cids in the .** 
14590 69 6e 70 75 74 20 64 6f 63 6c 69 73 74 73 20 61  input doclists a
145a0 72 65 20 73 6f 72 74 65 64 20 69 6e 20 61 73 63  re sorted in asc
145b0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20 70 61  ending order, pa
145c0 72 61 6d 65 74 65 72 20 62 44 65 73 63 44 6f 63  rameter bDescDoc
145d0 6c 69 73 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  list.** should b
145e0 65 20 66 61 6c 73 65 2e 20 49 66 20 74 68 65 79  e false. If they
145f0 20 61 72 65 20 73 6f 72 74 65 64 20 69 6e 20 61   are sorted in a
14600 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c 20  scending order, 
14610 69 74 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  it should be.** 
14620 70 61 73 73 65 64 20 61 20 6e 6f 6e 2d 7a 65 72  passed a non-zer
14630 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  o value..**.** I
14640 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
14650 73 2c 20 2a 70 61 4f 75 74 20 69 73 20 73 65 74  s, *paOut is set
14660 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 61 6e 20   to point at an 
14670 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 27 64  sqlite3_malloc'd
14680 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
14690 69 6e 69 6e 67 20 74 68 65 20 6f 75 74 70 75 74  ining the output
146a0 20 64 6f 63 6c 69 73 74 20 61 6e 64 20 53 51 4c   doclist and SQL
146b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
146c0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
146d0 0a 2a 2a 20 2a 70 6e 4f 75 74 20 69 73 20 73 65  .** *pnOut is se
146e0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
146f0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
14700 6f 75 74 70 75 74 20 64 6f 63 6c 69 73 74 2e 0a  output doclist..
14710 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14720 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
14730 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
14740 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
14750 6f 75 74 70 75 74 20 76 61 6c 75 65 73 0a 2a 2a  output values.**
14760 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
14770 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
14780 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44  static int fts3D
14790 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 0a 20  oclistOrMerge(. 
147a0 20 69 6e 74 20 62 44 65 73 63 44 6f 63 6c 69 73   int bDescDoclis
147b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
147c0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75   /* True if argu
147d0 6d 65 6e 74 73 20 61 72 65 20 64 65 73 63 20 2a  ments are desc *
147e0 2f 0a 20 20 63 68 61 72 20 2a 61 31 2c 20 69 6e  /.  char *a1, in
147f0 74 20 6e 31 2c 20 20 20 20 20 20 20 20 20 20 20  t n1,           
14800 20 20 20 20 2f 2a 20 46 69 72 73 74 20 64 6f 63      /* First doc
14810 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
14820 61 32 2c 20 69 6e 74 20 6e 32 2c 20 20 20 20 20  a2, int n2,     
14830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
14840 6f 6e 64 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20  ond doclist */. 
14850 20 63 68 61 72 20 2a 2a 70 61 4f 75 74 2c 20 69   char **paOut, i
14860 6e 74 20 2a 70 6e 4f 75 74 20 20 20 20 20 20 20  nt *pnOut       
14870 20 2f 2a 20 4f 55 54 3a 20 4d 61 6c 6c 6f 63 27   /* OUT: Malloc'
14880 64 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a  d doclist */.){.
14890 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
148a0 69 31 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i1 = 0;.  sqlite
148b0 33 5f 69 6e 74 36 34 20 69 32 20 3d 20 30 3b 0a  3_int64 i2 = 0;.
148c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
148d0 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 63 68 61  iPrev = 0;.  cha
148e0 72 20 2a 70 45 6e 64 31 20 3d 20 26 61 31 5b 6e  r *pEnd1 = &a1[n
148f0 31 5d 3b 0a 20 20 63 68 61 72 20 2a 70 45 6e 64  1];.  char *pEnd
14900 32 20 3d 20 26 61 32 5b 6e 32 5d 3b 0a 20 20 63  2 = &a2[n2];.  c
14910 68 61 72 20 2a 70 31 20 3d 20 61 31 3b 0a 20 20  har *p1 = a1;.  
14920 63 68 61 72 20 2a 70 32 20 3d 20 61 32 3b 0a 20  char *p2 = a2;. 
14930 20 63 68 61 72 20 2a 70 3b 0a 20 20 63 68 61 72   char *p;.  char
14940 20 2a 61 4f 75 74 3b 0a 20 20 69 6e 74 20 62 46   *aOut;.  int bF
14950 69 72 73 74 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  irstOut = 0;..  
14960 2a 70 61 4f 75 74 20 3d 20 30 3b 0a 20 20 2a 70  *paOut = 0;.  *p
14970 6e 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  nOut = 0;..  /* 
14980 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
14990 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2e 20 42  or the output. B
149a0 6f 74 68 20 74 68 65 20 69 6e 70 75 74 20 61 6e  oth the input an
149b0 64 20 6f 75 74 70 75 74 20 64 6f 63 6c 69 73 74  d output doclist
149c0 73 0a 20 20 2a 2a 20 61 72 65 20 64 65 6c 74 61  s.  ** are delta
149d0 20 65 6e 63 6f 64 65 64 2e 20 49 66 20 74 68 65   encoded. If the
149e0 79 20 61 72 65 20 69 6e 20 61 73 63 65 6e 64 69  y are in ascendi
149f0 6e 67 20 6f 72 64 65 72 20 28 62 44 65 73 63 44  ng order (bDescD
14a00 6f 63 6c 69 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a  oclist==0),.  **
14a10 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
14a20 64 6f 63 69 64 20 69 6e 20 65 61 63 68 20 6c 69  docid in each li
14a30 73 74 20 69 73 20 73 69 6d 70 6c 79 20 65 6e 63  st is simply enc
14a40 6f 64 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  oded as a varint
14a50 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 61 63 68 20  . For.  ** each 
14a60 73 75 62 73 65 71 75 65 6e 74 20 64 6f 63 69 64  subsequent docid
14a70 2c 20 74 68 65 20 76 61 72 69 6e 74 20 73 74 6f  , the varint sto
14a80 72 65 64 20 69 73 20 74 68 65 20 64 69 66 66 65  red is the diffe
14a90 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
14aa0 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 61  e.  ** current a
14ab0 6e 64 20 70 72 65 76 69 6f 75 73 20 64 6f 63 69  nd previous doci
14ac0 64 20 28 61 20 70 6f 73 69 74 69 76 65 20 6e 75  d (a positive nu
14ad0 6d 62 65 72 20 2d 20 73 69 6e 63 65 20 74 68 65  mber - since the
14ae0 20 6c 69 73 74 20 69 73 20 69 6e 0a 20 20 2a 2a   list is in.  **
14af0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
14b00 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  )..  **.  ** The
14b10 20 66 69 72 73 74 20 64 6f 63 69 64 20 77 72 69   first docid wri
14b20 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
14b30 75 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ut is therefore 
14b40 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 20 74 68  encoded using th
14b50 65 20 0a 20 20 2a 2a 20 73 61 6d 65 20 6e 75 6d  e .  ** same num
14b60 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 73 20  ber of bytes as 
14b70 69 74 20 69 73 20 69 6e 20 77 68 69 63 68 65 76  it is in whichev
14b80 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  er of the input 
14b90 6c 69 73 74 73 20 69 74 20 69 73 0a 20 20 2a 2a  lists it is.  **
14ba0 20 72 65 61 64 20 66 72 6f 6d 2e 20 41 6e 64 20   read from. And 
14bb0 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
14bc0 64 6f 63 69 64 20 72 65 61 64 20 66 72 6f 6d 20  docid read from 
14bd0 74 68 65 20 73 61 6d 65 20 69 6e 70 75 74 20 6c  the same input l
14be0 69 73 74 20 0a 20 20 2a 2a 20 63 6f 6e 73 75 6d  ist .  ** consum
14bf0 65 73 20 65 69 74 68 65 72 20 74 68 65 20 73 61  es either the sa
14c00 6d 65 20 6f 72 20 6c 65 73 73 20 62 79 74 65 73  me or less bytes
14c10 20 61 73 20 69 74 20 64 69 64 20 69 6e 20 74 68   as it did in th
14c20 65 20 69 6e 70 75 74 20 28 73 69 6e 63 65 0a 20  e input (since. 
14c30 20 2a 2a 20 74 68 65 20 64 69 66 66 65 72 65 6e   ** the differen
14c40 63 65 20 62 65 74 77 65 65 6e 20 69 74 20 61 6e  ce between it an
14c50 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 76  d the previous v
14c60 61 6c 75 65 20 69 6e 20 74 68 65 20 6f 75 74 70  alue in the outp
14c70 75 74 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  ut must.  ** be 
14c80 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
14c90 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
14ca0 75 61 6c 20 74 6f 20 74 68 65 20 64 65 6c 74 61  ual to the delta
14cb0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
14cc0 20 0a 20 20 2a 2a 20 74 68 65 20 69 6e 70 75 74   .  ** the input
14cd0 20 6c 69 73 74 29 2e 20 54 68 65 20 73 61 6d 65   list). The same
14ce0 20 61 72 67 75 6d 65 6e 74 20 61 70 70 6c 69 65   argument applie
14cf0 73 20 74 6f 20 61 6c 6c 20 62 75 74 20 74 68 65  s to all but the
14d00 20 66 69 72 73 74 20 64 6f 63 69 64 0a 20 20 2a   first docid.  *
14d10 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  * read from the 
14d20 27 6f 74 68 65 72 27 20 6c 69 73 74 2e 20 41 6e  'other' list. An
14d30 64 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  d to the content
14d40 73 20 6f 66 20 61 6c 6c 20 70 6f 73 69 74 69 6f  s of all positio
14d50 6e 20 6c 69 73 74 73 0a 20 20 2a 2a 20 74 68 61  n lists.  ** tha
14d60 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
14d70 20 61 6e 64 20 6d 65 72 67 65 64 20 66 72 6f 6d   and merged from
14d80 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
14d90 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2a 0a 20  e output..  **. 
14da0 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20   ** However, if 
14db0 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20  the first docid 
14dc0 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75  copied to the ou
14dd0 74 70 75 74 20 69 73 20 61 20 6e 65 67 61 74 69  tput is a negati
14de0 76 65 20 6e 75 6d 62 65 72 2c 0a 20 20 2a 2a 20  ve number,.  ** 
14df0 74 68 65 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  then the encodin
14e00 67 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 64  g of the first d
14e10 6f 63 69 64 20 66 72 6f 6d 20 74 68 65 20 27 6f  ocid from the 'o
14e20 74 68 65 72 27 20 69 6e 70 75 74 20 6c 69 73 74  ther' input list
14e30 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 6c 61 72   may.  ** be lar
14e40 67 65 72 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ger in the outpu
14e50 74 20 74 68 61 6e 20 69 74 20 77 61 73 20 69 6e  t than it was in
14e60 20 74 68 65 20 69 6e 70 75 74 20 28 73 69 6e 63   the input (sinc
14e70 65 20 74 68 65 20 64 65 6c 74 61 20 76 61 6c 75  e the delta valu
14e80 65 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  e.  ** may be a 
14e90 6c 61 72 67 65 72 20 70 6f 73 69 74 69 76 65 20  larger positive 
14ea0 69 6e 74 65 67 65 72 20 74 68 61 6e 20 74 68 65  integer than the
14eb0 20 61 63 74 75 61 6c 20 64 6f 63 69 64 29 2e 0a   actual docid)..
14ec0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 70    **.  ** The sp
14ed0 61 63 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  ace required to 
14ee0 73 74 6f 72 65 20 74 68 65 20 6f 75 74 70 75 74  store the output
14ef0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 74 68   is therefore th
14f00 65 20 73 75 6d 20 6f 66 20 74 68 65 0a 20 20 2a  e sum of the.  *
14f10 2a 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 74  * sizes of the t
14f20 77 6f 20 69 6e 70 75 74 73 2c 20 70 6c 75 73 20  wo inputs, plus 
14f30 65 6e 6f 75 67 68 20 73 70 61 63 65 20 66 6f 72  enough space for
14f40 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   exactly one of 
14f50 74 68 65 20 69 6e 70 75 74 0a 20 20 2a 2a 20 64  the input.  ** d
14f60 6f 63 69 64 73 20 74 6f 20 67 72 6f 77 2e 20 0a  ocids to grow. .
14f70 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 73 79 6d 65    **.  ** A syme
14f80 74 72 69 63 20 61 72 67 75 6d 65 6e 74 20 6d 61  tric argument ma
14f90 79 20 62 65 20 6d 61 64 65 20 69 66 20 74 68 65  y be made if the
14fa0 20 64 6f 63 6c 69 73 74 73 20 61 72 65 20 69 6e   doclists are in
14fb0 20 64 65 73 63 65 6e 64 69 6e 67 20 0a 20 20 2a   descending .  *
14fc0 2a 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20  * order..  */.  
14fd0 61 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aOut = sqlite3_m
14fe0 61 6c 6c 6f 63 28 6e 31 2b 6e 32 2b 46 54 53 33  alloc(n1+n2+FTS3
14ff0 5f 56 41 52 49 4e 54 5f 4d 41 58 2d 31 29 3b 0a  _VARINT_MAX-1);.
15000 20 20 69 66 28 20 21 61 4f 75 74 20 29 20 72 65    if( !aOut ) re
15010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15020 4d 3b 0a 0a 20 20 70 20 3d 20 61 4f 75 74 3b 0a  M;..  p = aOut;.
15030 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
15040 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e 64 31  rint3(&p1, pEnd1
15050 2c 20 30 2c 20 26 69 31 29 3b 0a 20 20 66 74 73  , 0, &i1);.  fts
15060 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3GetDeltaVarint3
15070 28 26 70 32 2c 20 70 45 6e 64 32 2c 20 30 2c 20  (&p2, pEnd2, 0, 
15080 26 69 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  &i2);.  while( p
15090 31 20 7c 7c 20 70 32 20 29 7b 0a 20 20 20 20 73  1 || p2 ){.    s
150a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 69  qlite3_int64 iDi
150b0 66 66 20 3d 20 44 4f 43 49 44 5f 43 4d 50 28 69  ff = DOCID_CMP(i
150c0 31 2c 20 69 32 29 3b 0a 0a 20 20 20 20 69 66 28  1, i2);..    if(
150d0 20 70 32 20 26 26 20 70 31 20 26 26 20 69 44 69   p2 && p1 && iDi
150e0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ff==0 ){.      f
150f0 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69 6e  ts3PutDeltaVarin
15100 74 33 28 26 70 2c 20 62 44 65 73 63 44 6f 63 6c  t3(&p, bDescDocl
15110 69 73 74 2c 20 26 69 50 72 65 76 2c 20 26 62 46  ist, &iPrev, &bF
15120 69 72 73 74 4f 75 74 2c 20 69 31 29 3b 0a 20 20  irstOut, i1);.  
15130 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 4d      fts3PoslistM
15140 65 72 67 65 28 26 70 2c 20 26 70 31 2c 20 26 70  erge(&p, &p1, &p
15150 32 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47 65  2);.      fts3Ge
15160 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70  tDeltaVarint3(&p
15170 31 2c 20 70 45 6e 64 31 2c 20 62 44 65 73 63 44  1, pEnd1, bDescD
15180 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b 0a 20 20  oclist, &i1);.  
15190 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74 61      fts3GetDelta
151a0 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70 45 6e  Varint3(&p2, pEn
151b0 64 32 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74  d2, bDescDoclist
151c0 2c 20 26 69 32 29 3b 0a 20 20 20 20 7d 65 6c 73  , &i2);.    }els
151d0 65 20 69 66 28 20 21 70 32 20 7c 7c 20 28 70 31  e if( !p2 || (p1
151e0 20 26 26 20 69 44 69 66 66 3c 30 29 20 29 7b 0a   && iDiff<0) ){.
151f0 20 20 20 20 20 20 66 74 73 33 50 75 74 44 65 6c        fts3PutDel
15200 74 61 56 61 72 69 6e 74 33 28 26 70 2c 20 62 44  taVarint3(&p, bD
15210 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 50 72  escDoclist, &iPr
15220 65 76 2c 20 26 62 46 69 72 73 74 4f 75 74 2c 20  ev, &bFirstOut, 
15230 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 50  i1);.      fts3P
15240 6f 73 6c 69 73 74 43 6f 70 79 28 26 70 2c 20 26  oslistCopy(&p, &
15250 70 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33 47  p1);.      fts3G
15260 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28 26  etDeltaVarint3(&
15270 70 31 2c 20 70 45 6e 64 31 2c 20 62 44 65 73 63  p1, pEnd1, bDesc
15280 44 6f 63 6c 69 73 74 2c 20 26 69 31 29 3b 0a 20  Doclist, &i1);. 
15290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152a0 66 74 73 33 50 75 74 44 65 6c 74 61 56 61 72 69  fts3PutDeltaVari
152b0 6e 74 33 28 26 70 2c 20 62 44 65 73 63 44 6f 63  nt3(&p, bDescDoc
152c0 6c 69 73 74 2c 20 26 69 50 72 65 76 2c 20 26 62  list, &iPrev, &b
152d0 46 69 72 73 74 4f 75 74 2c 20 69 32 29 3b 0a 20  FirstOut, i2);. 
152e0 20 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74       fts3Poslist
152f0 43 6f 70 79 28 26 70 2c 20 26 70 32 29 3b 0a 20  Copy(&p, &p2);. 
15300 20 20 20 20 20 66 74 73 33 47 65 74 44 65 6c 74       fts3GetDelt
15310 61 56 61 72 69 6e 74 33 28 26 70 32 2c 20 70 45  aVarint3(&p2, pE
15320 6e 64 32 2c 20 62 44 65 73 63 44 6f 63 6c 69 73  nd2, bDescDoclis
15330 74 2c 20 26 69 32 29 3b 0a 20 20 20 20 7d 0a 20  t, &i2);.    }. 
15340 20 7d 0a 0a 20 20 2a 70 61 4f 75 74 20 3d 20 61   }..  *paOut = a
15350 4f 75 74 3b 0a 20 20 2a 70 6e 4f 75 74 20 3d 20  Out;.  *pnOut = 
15360 28 69 6e 74 29 28 70 2d 61 4f 75 74 29 3b 0a 20  (int)(p-aOut);. 
15370 20 61 73 73 65 72 74 28 20 2a 70 6e 4f 75 74 3c   assert( *pnOut<
15380 3d 6e 31 2b 6e 32 2b 46 54 53 33 5f 56 41 52 49  =n1+n2+FTS3_VARI
15390 4e 54 5f 4d 41 58 2d 31 20 29 3b 0a 20 20 72 65  NT_MAX-1 );.  re
153a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
153b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
153c0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 61 20 22 70  nction does a "p
153d0 68 72 61 73 65 22 20 6d 65 72 67 65 20 6f 66 20  hrase" merge of 
153e0 74 77 6f 20 64 6f 63 6c 69 73 74 73 2e 20 49 6e  two doclists. In
153f0 20 61 20 70 68 72 61 73 65 20 6d 65 72 67 65 2c   a phrase merge,
15400 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 63  .** the output c
15410 6f 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f  ontains a copy o
15420 66 20 65 61 63 68 20 70 6f 73 69 74 69 6f 6e 20  f each position 
15430 66 72 6f 6d 20 74 68 65 20 72 69 67 68 74 2d 68  from the right-h
15440 61 6e 64 20 69 6e 70 75 74 0a 2a 2a 20 64 6f 63  and input.** doc
15450 6c 69 73 74 20 66 6f 72 20 77 68 69 63 68 20 74  list for which t
15460 68 65 72 65 20 69 73 20 61 20 70 6f 73 69 74 69  here is a positi
15470 6f 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 68  on in the left-h
15480 61 6e 64 20 69 6e 70 75 74 20 64 6f 63 6c 69 73  and input doclis
15490 74 0a 2a 2a 20 65 78 61 63 74 6c 79 20 6e 44 69  t.** exactly nDi
154a0 73 74 20 74 6f 6b 65 6e 73 20 62 65 66 6f 72 65  st tokens before
154b0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   it..**.** If th
154c0 65 20 64 6f 63 69 64 73 20 69 6e 20 74 68 65 20  e docids in the 
154d0 69 6e 70 75 74 20 64 6f 63 6c 69 73 74 73 20 61  input doclists a
154e0 72 65 20 73 6f 72 74 65 64 20 69 6e 20 61 73 63  re sorted in asc
154f0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c 0a 2a 2a  ending order,.**
15500 20 70 61 72 61 6d 65 74 65 72 20 62 44 65 73 63   parameter bDesc
15510 44 6f 63 6c 69 73 74 20 73 68 6f 75 6c 64 20 62  Doclist should b
15520 65 20 66 61 6c 73 65 2e 20 49 66 20 74 68 65 79  e false. If they
15530 20 61 72 65 20 73 6f 72 74 65 64 20 69 6e 20 61   are sorted in a
15540 73 63 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 72 64  scending .** ord
15550 65 72 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  er, it should be
15560 20 70 61 73 73 65 64 20 61 20 6e 6f 6e 2d 7a 65   passed a non-ze
15570 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ro value..**.** 
15580 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 69  The right-hand i
15590 6e 70 75 74 20 64 6f 63 6c 69 73 74 20 69 73 20  nput doclist is 
155a0 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 74  overwritten by t
155b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
155c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
155d0 44 6f 63 6c 69 73 74 50 68 72 61 73 65 4d 65 72  DoclistPhraseMer
155e0 67 65 28 0a 20 20 69 6e 74 20 62 44 65 73 63 44  ge(.  int bDescD
155f0 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oclist,         
15600 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15610 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 64   arguments are d
15620 65 73 63 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69  esc */.  int nDi
15630 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
15640 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 74           /* Dist
15650 61 6e 63 65 20 66 72 6f 6d 20 6c 65 66 74 20 74  ance from left t
15660 6f 20 72 69 67 68 74 20 28 31 3d 61 64 6a 61 63  o right (1=adjac
15670 65 6e 74 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ent) */.  char *
15680 61 4c 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74  aLeft, int nLeft
15690 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66  ,         /* Lef
156a0 74 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 63  t doclist */.  c
156b0 68 61 72 20 2a 2a 70 61 52 69 67 68 74 2c 20 69  har **paRight, i
156c0 6e 74 20 2a 70 6e 52 69 67 68 74 20 20 20 20 2f  nt *pnRight    /
156d0 2a 20 49 4e 2f 4f 55 54 3a 20 52 69 67 68 74 2f  * IN/OUT: Right/
156e0 6f 75 74 70 75 74 20 64 6f 63 6c 69 73 74 20 2a  output doclist *
156f0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  /.){.  sqlite3_i
15700 6e 74 36 34 20 69 31 20 3d 20 30 3b 0a 20 20 73  nt64 i1 = 0;.  s
15710 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 32 20  qlite3_int64 i2 
15720 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
15730 6e 74 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a  nt64 iPrev = 0;.
15740 20 20 63 68 61 72 20 2a 61 52 69 67 68 74 20 3d    char *aRight =
15750 20 2a 70 61 52 69 67 68 74 3b 0a 20 20 63 68 61   *paRight;.  cha
15760 72 20 2a 70 45 6e 64 31 20 3d 20 26 61 4c 65 66  r *pEnd1 = &aLef
15770 74 5b 6e 4c 65 66 74 5d 3b 0a 20 20 63 68 61 72  t[nLeft];.  char
15780 20 2a 70 45 6e 64 32 20 3d 20 26 61 52 69 67 68   *pEnd2 = &aRigh
15790 74 5b 2a 70 6e 52 69 67 68 74 5d 3b 0a 20 20 63  t[*pnRight];.  c
157a0 68 61 72 20 2a 70 31 20 3d 20 61 4c 65 66 74 3b  har *p1 = aLeft;
157b0 0a 20 20 63 68 61 72 20 2a 70 32 20 3d 20 61 52  .  char *p2 = aR
157c0 69 67 68 74 3b 0a 20 20 63 68 61 72 20 2a 70 3b  ight;.  char *p;
157d0 0a 20 20 69 6e 74 20 62 46 69 72 73 74 4f 75 74  .  int bFirstOut
157e0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 4f   = 0;.  char *aO
157f0 75 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  ut;..  assert( n
15800 44 69 73 74 3e 30 20 29 3b 0a 20 20 69 66 28 20  Dist>0 );.  if( 
15810 62 44 65 73 63 44 6f 63 6c 69 73 74 20 29 7b 0a  bDescDoclist ){.
15820 20 20 20 20 61 4f 75 74 20 3d 20 73 71 6c 69 74      aOut = sqlit
15830 65 33 5f 6d 61 6c 6c 6f 63 28 2a 70 6e 52 69 67  e3_malloc(*pnRig
15840 68 74 20 2b 20 46 54 53 33 5f 56 41 52 49 4e 54  ht + FTS3_VARINT
15850 5f 4d 41 58 29 3b 0a 20 20 20 20 69 66 28 20 61  _MAX);.    if( a
15860 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
15870 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15880 7d 65 6c 73 65 7b 0a 20 20 20 20 61 4f 75 74 20  }else{.    aOut 
15890 3d 20 61 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20  = aRight;.  }.  
158a0 70 20 3d 20 61 4f 75 74 3b 0a 0a 20 20 66 74 73  p = aOut;..  fts
158b0 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33  3GetDeltaVarint3
158c0 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 30 2c 20  (&p1, pEnd1, 0, 
158d0 26 69 31 29 3b 0a 20 20 66 74 73 33 47 65 74 44  &i1);.  fts3GetD
158e0 65 6c 74 61 56 61 72 69 6e 74 33 28 26 70 32 2c  eltaVarint3(&p2,
158f0 20 70 45 6e 64 32 2c 20 30 2c 20 26 69 32 29 3b   pEnd2, 0, &i2);
15900 0a 0a 20 20 77 68 69 6c 65 28 20 70 31 20 26 26  ..  while( p1 &&
15910 20 70 32 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p2 ){.    sqlit
15920 65 33 5f 69 6e 74 36 34 20 69 44 69 66 66 20 3d  e3_int64 iDiff =
15930 20 44 4f 43 49 44 5f 43 4d 50 28 69 31 2c 20 69   DOCID_CMP(i1, i
15940 32 29 3b 0a 20 20 20 20 69 66 28 20 69 44 69 66  2);.    if( iDif
15950 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  f==0 ){.      ch
15960 61 72 20 2a 70 53 61 76 65 20 3d 20 70 3b 0a 20  ar *pSave = p;. 
15970 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
15980 36 34 20 69 50 72 65 76 53 61 76 65 20 3d 20 69  64 iPrevSave = i
15990 50 72 65 76 3b 0a 20 20 20 20 20 20 69 6e 74 20  Prev;.      int 
159a0 62 46 69 72 73 74 4f 75 74 53 61 76 65 20 3d 20  bFirstOutSave = 
159b0 62 46 69 72 73 74 4f 75 74 3b 0a 0a 20 20 20 20  bFirstOut;..    
159c0 20 20 66 74 73 33 50 75 74 44 65 6c 74 61 56 61    fts3PutDeltaVa
159d0 72 69 6e 74 33 28 26 70 2c 20 62 44 65 73 63 44  rint3(&p, bDescD
159e0 6f 63 6c 69 73 74 2c 20 26 69 50 72 65 76 2c 20  oclist, &iPrev, 
159f0 26 62 46 69 72 73 74 4f 75 74 2c 20 69 31 29 3b  &bFirstOut, i1);
15a00 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74  .      if( 0==ft
15a10 73 33 50 6f 73 6c 69 73 74 50 68 72 61 73 65 4d  s3PoslistPhraseM
15a20 65 72 67 65 28 26 70 2c 20 6e 44 69 73 74 2c 20  erge(&p, nDist, 
15a30 30 2c 20 31 2c 20 26 70 31 2c 20 26 70 32 29 20  0, 1, &p1, &p2) 
15a40 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  ){.        p = p
15a50 53 61 76 65 3b 0a 20 20 20 20 20 20 20 20 69 50  Save;.        iP
15a60 72 65 76 20 3d 20 69 50 72 65 76 53 61 76 65 3b  rev = iPrevSave;
15a70 0a 20 20 20 20 20 20 20 20 62 46 69 72 73 74 4f  .        bFirstO
15a80 75 74 20 3d 20 62 46 69 72 73 74 4f 75 74 53 61  ut = bFirstOutSa
15a90 76 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ve;.      }.    
15aa0 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
15ab0 72 69 6e 74 33 28 26 70 31 2c 20 70 45 6e 64 31  rint3(&p1, pEnd1
15ac0 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20  , bDescDoclist, 
15ad0 26 69 31 29 3b 0a 20 20 20 20 20 20 66 74 73 33  &i1);.      fts3
15ae0 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74 33 28  GetDeltaVarint3(
15af0 26 70 32 2c 20 70 45 6e 64 32 2c 20 62 44 65 73  &p2, pEnd2, bDes
15b00 63 44 6f 63 6c 69 73 74 2c 20 26 69 32 29 3b 0a  cDoclist, &i2);.
15b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 44      }else if( iD
15b20 69 66 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 66  iff<0 ){.      f
15b30 74 73 33 50 6f 73 6c 69 73 74 43 6f 70 79 28 30  ts3PoslistCopy(0
15b40 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 66 74  , &p1);.      ft
15b50 73 33 47 65 74 44 65 6c 74 61 56 61 72 69 6e 74  s3GetDeltaVarint
15b60 33 28 26 70 31 2c 20 70 45 6e 64 31 2c 20 62 44  3(&p1, pEnd1, bD
15b70 65 73 63 44 6f 63 6c 69 73 74 2c 20 26 69 31 29  escDoclist, &i1)
15b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15b90 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74 43 6f     fts3PoslistCo
15ba0 70 79 28 30 2c 20 26 70 32 29 3b 0a 20 20 20 20  py(0, &p2);.    
15bb0 20 20 66 74 73 33 47 65 74 44 65 6c 74 61 56 61    fts3GetDeltaVa
15bc0 72 69 6e 74 33 28 26 70 32 2c 20 70 45 6e 64 32  rint3(&p2, pEnd2
15bd0 2c 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20  , bDescDoclist, 
15be0 26 69 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &i2);.    }.  }.
15bf0 0a 20 20 2a 70 6e 52 69 67 68 74 20 3d 20 28 69  .  *pnRight = (i
15c00 6e 74 29 28 70 20 2d 20 61 4f 75 74 29 3b 0a 20  nt)(p - aOut);. 
15c10 20 69 66 28 20 62 44 65 73 63 44 6f 63 6c 69 73   if( bDescDoclis
15c20 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
15c30 5f 66 72 65 65 28 61 52 69 67 68 74 29 3b 0a 20  _free(aRight);. 
15c40 20 20 20 2a 70 61 52 69 67 68 74 20 3d 20 61 4f     *paRight = aO
15c50 75 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ut;.  }..  retur
15c60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15c70 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
15c80 4c 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  List points to a
15c90 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e   position list n
15ca0 4c 69 73 74 20 62 79 74 65 73 20 69 6e 20 73 69  List bytes in si
15cb0 7a 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ze. This.** func
15cc0 74 69 6f 6e 20 63 68 65 63 6b 73 20 74 6f 20 73  tion checks to s
15cd0 65 65 20 69 66 20 74 68 65 20 70 6f 73 69 74 69  ee if the positi
15ce0 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73  on list contains
15cf0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72   any entries for
15d00 0a 2a 2a 20 61 20 74 6f 6b 65 6e 20 69 6e 20 70  .** a token in p
15d10 6f 73 69 74 69 6f 6e 20 30 20 28 6f 66 20 61 6e  osition 0 (of an
15d20 79 20 63 6f 6c 75 6d 6e 29 2e 20 49 66 20 73 6f  y column). If so
15d30 2c 20 69 74 20 77 72 69 74 65 73 20 61 72 67 75  , it writes argu
15d40 6d 65 6e 74 20 69 44 65 6c 74 61 0a 2a 2a 20 74  ment iDelta.** t
15d50 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
15d60 66 65 72 20 70 4f 75 74 2c 20 66 6f 6c 6c 6f 77  fer pOut, follow
15d70 65 64 20 62 79 20 61 20 70 6f 73 69 74 69 6f 6e  ed by a position
15d80 20 6c 69 73 74 20 63 6f 6e 73 69 73 74 69 6e 67   list consisting
15d90 20 6f 6e 6c 79 0a 2a 2a 20 6f 66 20 74 68 65 20   only.** of the 
15da0 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 70 4c 69  entries from pLi
15db0 73 74 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 30  st at position 0
15dc0 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 64  , and terminated
15dd0 20 62 79 20 61 6e 20 30 78 30 30 20 62 79 74 65   by an 0x00 byte
15de0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
15df0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6e  eturned is the n
15e00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
15e10 72 69 74 74 65 6e 20 74 6f 20 70 4f 75 74 20 28  ritten to pOut (
15e20 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 69 6e 74 20  if any)..*/.int 
15e30 73 71 6c 69 74 65 33 46 74 73 33 46 69 72 73 74  sqlite3Fts3First
15e40 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65  Filter(.  sqlite
15e50 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 2c 20  3_int64 iDelta, 
15e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72            /* Var
15e70 69 6e 74 20 74 68 61 74 20 6d 61 79 20 62 65 20  int that may be 
15e80 77 72 69 74 74 65 6e 20 74 6f 20 70 4f 75 74 20  written to pOut 
15e90 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74  */.  char *pList
15ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15eb0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
15ec0 20 6c 69 73 74 20 28 6e 6f 20 30 78 30 30 20 74   list (no 0x00 t
15ed0 65 72 6d 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  erm) */.  int nL
15ee0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
15ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
15f00 65 20 6f 66 20 70 4c 69 73 74 20 69 6e 20 62 79  e of pList in by
15f10 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  tes */.  char *p
15f20 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
15f30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
15f40 65 20 6f 75 74 70 75 74 20 68 65 72 65 20 2a 2f  e output here */
15f50 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d  .){.  int nOut =
15f60 20 30 3b 0a 20 20 69 6e 74 20 62 57 72 69 74 74   0;.  int bWritt
15f70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
15f80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 6f 6e        /* True on
15f90 63 65 20 69 44 65 6c 74 61 20 68 61 73 20 62 65  ce iDelta has be
15fa0 65 6e 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  en written */.  
15fb0 63 68 61 72 20 2a 70 20 3d 20 70 4c 69 73 74 3b  char *p = pList;
15fc0 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20  .  char *pEnd = 
15fd0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 0a  &pList[nList];..
15fe0 20 20 69 66 28 20 2a 70 21 3d 30 78 30 31 20 29    if( *p!=0x01 )
15ff0 7b 0a 20 20 20 20 69 66 28 20 2a 70 3d 3d 30 78  {.    if( *p==0x
16000 30 32 20 29 7b 0a 20 20 20 20 20 20 6e 4f 75 74  02 ){.      nOut
16010 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50   += sqlite3Fts3P
16020 75 74 56 61 72 69 6e 74 28 26 70 4f 75 74 5b 6e  utVarint(&pOut[n
16030 4f 75 74 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  Out], iDelta);. 
16040 20 20 20 20 20 70 4f 75 74 5b 6e 4f 75 74 2b 2b       pOut[nOut++
16050 5d 20 3d 20 30 78 30 32 3b 0a 20 20 20 20 20 20  ] = 0x02;.      
16060 62 57 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20  bWritten = 1;.  
16070 20 20 7d 0a 20 20 20 20 66 74 73 33 43 6f 6c 75    }.    fts3Colu
16080 6d 6e 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  mnlistCopy(0, &p
16090 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
160a0 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d 3d 30   p<pEnd && *p==0
160b0 78 30 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  x01 ){.    sqlit
160c0 65 33 5f 69 6e 74 36 34 20 69 43 6f 6c 3b 0a 20  e3_int64 iCol;. 
160d0 20 20 20 70 2b 2b 3b 0a 20 20 20 20 70 20 2b 3d     p++;.    p +=
160e0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56   sqlite3Fts3GetV
160f0 61 72 69 6e 74 28 70 2c 20 26 69 43 6f 6c 29 3b  arint(p, &iCol);
16100 0a 20 20 20 20 69 66 28 20 2a 70 3d 3d 30 78 30  .    if( *p==0x0
16110 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  2 ){.      if( b
16120 57 72 69 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20  Written==0 ){.  
16130 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 71        nOut += sq
16140 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69  lite3Fts3PutVari
16150 6e 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d 2c 20  nt(&pOut[nOut], 
16160 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
16170 20 62 57 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20   bWritten = 1;. 
16180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
16190 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78 30 31  t[nOut++] = 0x01
161a0 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
161b0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61  sqlite3Fts3PutVa
161c0 72 69 6e 74 28 26 70 4f 75 74 5b 6e 4f 75 74 5d  rint(&pOut[nOut]
161d0 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70  , iCol);.      p
161e0 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 30 78  Out[nOut++] = 0x
161f0 30 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  02;.    }.    ft
16200 73 33 43 6f 6c 75 6d 6e 6c 69 73 74 43 6f 70 79  s3ColumnlistCopy
16210 28 30 2c 20 26 70 29 3b 0a 20 20 7d 0a 20 20 69  (0, &p);.  }.  i
16220 66 28 20 62 57 72 69 74 74 65 6e 20 29 7b 0a 20  f( bWritten ){. 
16230 20 20 20 70 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20     pOut[nOut++] 
16240 3d 20 30 78 30 30 3b 0a 20 20 7d 0a 0a 20 20 72  = 0x00;.  }..  r
16250 65 74 75 72 6e 20 6e 4f 75 74 3b 0a 7d 0a 0a 0a  eturn nOut;.}...
16260 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 61 6c 6c 20  /*.** Merge all 
16270 64 6f 63 6c 69 73 74 73 20 69 6e 20 74 68 65 20  doclists in the 
16280 54 65 72 6d 53 65 6c 65 63 74 2e 61 61 4f 75 74  TermSelect.aaOut
16290 70 75 74 5b 5d 20 61 72 72 61 79 20 69 6e 74 6f  put[] array into
162a0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 64 6f 63   a single.** doc
162b0 6c 69 73 74 20 73 74 6f 72 65 64 20 69 6e 20 54  list stored in T
162c0 65 72 6d 53 65 6c 65 63 74 2e 61 61 4f 75 74 70  ermSelect.aaOutp
162d0 75 74 5b 30 5d 2e 20 49 66 20 73 75 63 63 65 73  ut[0]. If succes
162e0 73 66 75 6c 2c 20 64 65 6c 65 74 65 20 61 6c 6c  sful, delete all
162f0 0a 2a 2a 20 6f 74 68 65 72 20 64 6f 63 6c 69 73  .** other doclis
16300 74 73 20 28 65 78 63 65 70 74 20 74 68 65 20 61  ts (except the a
16310 61 4f 75 74 70 75 74 5b 30 5d 20 6f 6e 65 29 20  aOutput[0] one) 
16320 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
16330 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  E_OK..**.** If a
16340 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
16350 72 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  rs, return SQLIT
16360 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
16370 20 63 61 73 65 20 69 74 20 69 73 0a 2a 2a 20 74   case it is.** t
16380 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
16390 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
163a0 74 6f 20 66 72 65 65 20 61 6e 79 20 64 6f 63 6c  to free any docl
163b0 69 73 74 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ists left in the
163c0 0a 2a 2a 20 54 65 72 6d 53 65 6c 65 63 74 2e 61  .** TermSelect.a
163d0 61 4f 75 74 70 75 74 5b 5d 20 61 72 72 61 79 2e  aOutput[] array.
163e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
163f0 74 73 33 54 65 72 6d 53 65 6c 65 63 74 46 69 6e  ts3TermSelectFin
16400 69 73 68 4d 65 72 67 65 28 46 74 73 33 54 61 62  ishMerge(Fts3Tab
16410 6c 65 20 2a 70 2c 20 54 65 72 6d 53 65 6c 65 63  le *p, TermSelec
16420 74 20 2a 70 54 53 29 7b 0a 20 20 63 68 61 72 20  t *pTS){.  char 
16430 2a 61 4f 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74  *aOut = 0;.  int
16440 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 69 6e 74   nOut = 0;.  int
16450 20 69 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74   i;..  /* Loop t
16460 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69  hrough the docli
16470 73 74 73 20 69 6e 20 74 68 65 20 61 61 4f 75 74  sts in the aaOut
16480 70 75 74 5b 5d 20 61 72 72 61 79 2e 20 4d 65 72  put[] array. Mer
16490 67 65 20 74 68 65 6d 20 61 6c 6c 0a 20 20 2a 2a  ge them all.  **
164a0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
164b0 6f 63 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 66  oclist..  */.  f
164c0 6f 72 28 69 3d 30 3b 20 69 3c 53 69 7a 65 6f 66  or(i=0; i<Sizeof
164d0 41 72 72 61 79 28 70 54 53 2d 3e 61 61 4f 75 74  Array(pTS->aaOut
164e0 70 75 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  put); i++){.    
164f0 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74 70 75  if( pTS->aaOutpu
16500 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 69 66  t[i] ){.      if
16510 28 20 21 61 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !aOut ){.     
16520 20 20 20 61 4f 75 74 20 3d 20 70 54 53 2d 3e 61     aOut = pTS->a
16530 61 4f 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20 20  aOutput[i];.    
16540 20 20 20 20 6e 4f 75 74 20 3d 20 70 54 53 2d 3e      nOut = pTS->
16550 61 6e 4f 75 74 70 75 74 5b 69 5d 3b 0a 20 20 20  anOutput[i];.   
16560 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70       pTS->aaOutp
16570 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ut[i] = 0;.     
16580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16590 69 6e 74 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20  int nNew;.      
165a0 20 20 63 68 61 72 20 2a 61 4e 65 77 3b 0a 0a 20    char *aNew;.. 
165b0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
165c0 66 74 73 33 44 6f 63 6c 69 73 74 4f 72 4d 65 72  fts3DoclistOrMer
165d0 67 65 28 70 2d 3e 62 44 65 73 63 49 64 78 2c 20  ge(p->bDescIdx, 
165e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 53  .            pTS
165f0 2d 3e 61 61 4f 75 74 70 75 74 5b 69 5d 2c 20 70  ->aaOutput[i], p
16600 54 53 2d 3e 61 6e 4f 75 74 70 75 74 5b 69 5d 2c  TS->anOutput[i],
16610 20 61 4f 75 74 2c 20 6e 4f 75 74 2c 20 26 61 4e   aOut, nOut, &aN
16620 65 77 2c 20 26 6e 4e 65 77 0a 20 20 20 20 20 20  ew, &nNew.      
16630 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
16640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16650 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
16660 74 65 33 5f 66 72 65 65 28 61 4f 75 74 29 3b 0a  te3_free(aOut);.
16670 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16680 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
16690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
166a0 66 72 65 65 28 70 54 53 2d 3e 61 61 4f 75 74 70  free(pTS->aaOutp
166b0 75 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ut[i]);.        
166c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 4f 75  sqlite3_free(aOu
166d0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 53 2d  t);.        pTS-
166e0 3e 61 61 4f 75 74 70 75 74 5b 69 5d 20 3d 20 30  >aaOutput[i] = 0
166f0 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d  ;.        aOut =
16700 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 6e   aNew;.        n
16710 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Out = nNew;.    
16720 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16730 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30   pTS->aaOutput[0
16740 5d 20 3d 20 61 4f 75 74 3b 0a 20 20 70 54 53 2d  ] = aOut;.  pTS-
16750 3e 61 6e 4f 75 74 70 75 74 5b 30 5d 20 3d 20 6e  >anOutput[0] = n
16760 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Out;.  return SQ
16770 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16780 2a 20 4d 65 72 67 65 20 74 68 65 20 64 6f 63 6c  * Merge the docl
16790 69 73 74 20 61 44 6f 63 6c 69 73 74 2f 6e 44 6f  ist aDoclist/nDo
167a0 63 6c 69 73 74 20 69 6e 74 6f 20 74 68 65 20 54  clist into the T
167b0 65 72 6d 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  ermSelect object
167c0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
167d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
167e0 2e 20 54 68 65 20 6d 65 72 67 65 20 69 73 20 61  . The merge is a
167f0 6e 20 22 4f 52 22 20 6d 65 72 67 65 20 28 73 65  n "OR" merge (se
16800 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 74  e function.** ft
16810 73 33 44 6f 63 6c 69 73 74 4f 72 4d 65 72 67 65  s3DoclistOrMerge
16820 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 29 2e  () for details).
16830 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
16840 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
16850 69 74 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ith the doclist 
16860 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 74 68  for each term th
16870 61 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 61 20  at matches.** a 
16880 71 75 65 72 69 65 64 20 70 72 65 66 69 78 2e 20  queried prefix. 
16890 49 74 20 6d 65 72 67 65 73 20 61 6c 6c 20 74 68  It merges all th
168a0 65 73 65 20 64 6f 63 6c 69 73 74 73 20 69 6e 74  ese doclists int
168b0 6f 20 6f 6e 65 2c 20 74 68 65 20 64 6f 63 6c 69  o one, the docli
168c0 73 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 73 70  st.** for the sp
168d0 65 63 69 66 69 65 64 20 70 72 65 66 69 78 2e 20  ecified prefix. 
168e0 53 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 20  Since there can 
168f0 62 65 20 61 20 76 65 72 79 20 6c 61 72 67 65 20  be a very large 
16900 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 64 6f 63  number of.** doc
16910 6c 69 73 74 73 20 74 6f 20 6d 65 72 67 65 2c 20  lists to merge, 
16920 74 68 65 20 6d 65 72 67 69 6e 67 20 69 73 20 64  the merging is d
16930 6f 6e 65 20 70 61 69 72 2d 77 69 73 65 20 75 73  one pair-wise us
16940 69 6e 67 20 74 68 65 20 54 65 72 6d 53 65 6c 65  ing the TermSele
16950 63 74 0a 2a 2a 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ct.** object..**
16960 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16970 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
16980 5f 4f 4b 20 69 66 20 74 68 65 20 6d 65 72 67 65  _OK if the merge
16990 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
169a0 6f 72 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20  or an.** SQLite 
169b0 65 72 72 6f 72 20 63 6f 64 65 20 28 53 51 4c 49  error code (SQLI
169c0 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20  TE_NOMEM) if an 
169d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
169e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
169f0 54 65 72 6d 53 65 6c 65 63 74 4d 65 72 67 65 28  TermSelectMerge(
16a00 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c  .  Fts3Table *p,
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 2f 2a 20 46 54 53 20 74 61 62 6c 65 20     /* FTS table 
16a30 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 54 65 72 6d  handle */.  Term
16a40 53 65 6c 65 63 74 20 2a 70 54 53 2c 20 20 20 20  Select *pTS,    
16a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16a60 65 72 6d 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  ermSelect object
16a70 20 74 6f 20 6d 65 72 67 65 20 69 6e 74 6f 20 2a   to merge into *
16a80 2f 0a 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69  /.  char *aDocli
16a90 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
16aa0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
16ab0 6f 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69  o doclist */.  i
16ac0 6e 74 20 6e 44 6f 63 6c 69 73 74 20 20 20 20 20  nt nDoclist     
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ae0 2a 20 53 69 7a 65 20 6f 66 20 61 44 6f 63 6c 69  * Size of aDocli
16af0 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  st in bytes */.)
16b00 7b 0a 20 20 69 66 28 20 70 54 53 2d 3e 61 61 4f  {.  if( pTS->aaO
16b10 75 74 70 75 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20  utput[0]==0 ){. 
16b20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
16b30 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
16b40 73 65 6c 65 63 74 65 64 2c 20 63 6f 70 79 20 74  selected, copy t
16b50 68 65 20 64 6f 63 6c 69 73 74 20 74 6f 20 74 68  he doclist to th
16b60 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
16b70 62 75 66 66 65 72 20 75 73 69 6e 67 20 6d 65 6d  buffer using mem
16b80 63 70 79 28 29 2e 20 0a 20 20 20 20 2a 2a 0a 20  cpy(). .    **. 
16b90 20 20 20 2a 2a 20 41 64 64 20 46 54 53 33 5f 56     ** Add FTS3_V
16ba0 41 52 49 4e 54 5f 4d 41 58 20 62 79 74 65 73 20  ARINT_MAX bytes 
16bb0 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
16bc0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
16bd0 65 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  e .    ** alloca
16be0 74 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 73 6f  tion. This is so
16bf0 20 61 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68   as to ensure th
16c00 61 74 20 74 68 65 20 62 75 66 66 65 72 20 69 73  at the buffer is
16c10 20 62 69 67 20 65 6e 6f 75 67 68 0a 20 20 20 20   big enough.    
16c20 2a 2a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 63  ** to hold the c
16c30 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 41  urrent doclist A
16c40 4e 44 27 64 20 77 69 74 68 20 61 6e 79 20 6f 74  ND'd with any ot
16c50 68 65 72 20 64 6f 63 6c 69 73 74 2e 20 49 66 20  her doclist. If 
16c60 74 68 65 0a 20 20 20 20 2a 2a 20 64 6f 63 6c 69  the.    ** docli
16c70 73 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  sts are stored i
16c80 6e 20 6f 72 64 65 72 3d 41 53 43 20 6f 72 64 65  n order=ASC orde
16c90 72 2c 20 74 68 69 73 20 70 61 64 64 69 6e 67 20  r, this padding 
16ca0 77 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 20 20 20  would not be.   
16cb0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 28 73 69   ** required (si
16cc0 6e 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nce the size of 
16cd0 5b 64 6f 63 6c 69 73 74 41 20 41 4e 44 20 64 6f  [doclistA AND do
16ce0 63 6c 69 73 74 42 5d 20 69 73 20 61 6c 77 61 79  clistB] is alway
16cf0 73 20 6c 65 73 73 0a 20 20 20 20 2a 2a 20 74 68  s less.    ** th
16d00 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
16d10 68 65 20 73 69 7a 65 20 6f 66 20 5b 64 6f 63 6c  he size of [docl
16d20 69 73 74 41 5d 20 69 6e 20 74 68 61 74 20 63 61  istA] in that ca
16d30 73 65 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  se). But this is
16d40 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 74 72 75 65  .    ** not true
16d50 20 66 6f 72 20 6f 72 64 65 72 3d 44 45 53 43 2e   for order=DESC.
16d60 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 20   For example, a 
16d70 64 6f 63 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  doclist containi
16d80 6e 67 20 28 31 2c 20 2d 31 29 20 0a 20 20 20 20  ng (1, -1) .    
16d90 2a 2a 20 6d 61 79 20 62 65 20 73 6d 61 6c 6c 65  ** may be smalle
16da0 72 20 74 68 61 6e 20 28 2d 31 29 2c 20 61 73 20  r than (-1), as 
16db0 69 6e 20 74 68 65 20 66 69 72 73 74 20 65 78 61  in the first exa
16dc0 6d 70 6c 65 20 74 68 65 20 2d 31 20 6d 61 79 20  mple the -1 may 
16dd0 62 65 20 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a  be stored.    **
16de0 20 61 73 20 61 20 73 69 6e 67 6c 65 2d 62 79 74   as a single-byt
16df0 65 20 64 65 6c 74 61 2c 20 77 68 65 72 65 61 73  e delta, whereas
16e00 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69   in the second i
16e10 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64  t must be stored
16e20 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 46 54 53   as a.    ** FTS
16e30 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 62 79 74  3_VARINT_MAX byt
16e40 65 20 76 61 72 69 6e 74 2e 0a 20 20 20 20 2a 2a  e varint..    **
16e50 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 20  .    ** Similar 
16e60 70 61 64 64 69 6e 67 20 69 73 20 61 64 64 65 64  padding is added
16e70 20 69 6e 20 74 68 65 20 66 74 73 33 44 6f 63 6c   in the fts3Docl
16e80 69 73 74 4f 72 4d 65 72 67 65 28 29 20 66 75 6e  istOrMerge() fun
16e90 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
16ea0 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
16eb0 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  0] = sqlite3_mal
16ec0 6c 6f 63 28 6e 44 6f 63 6c 69 73 74 20 2b 20 46  loc(nDoclist + F
16ed0 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2b  TS3_VARINT_MAX +
16ee0 20 31 29 3b 0a 20 20 20 20 70 54 53 2d 3e 61 6e   1);.    pTS->an
16ef0 4f 75 74 70 75 74 5b 30 5d 20 3d 20 6e 44 6f 63  Output[0] = nDoc
16f00 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 54  list;.    if( pT
16f10 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 20 29  S->aaOutput[0] )
16f20 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
16f30 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b 30 5d 2c  TS->aaOutput[0],
16f40 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   aDoclist, nDocl
16f50 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
16f60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16f70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
16f80 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
16f90 68 61 72 20 2a 61 4d 65 72 67 65 20 3d 20 61 44  har *aMerge = aD
16fa0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  oclist;.    int 
16fb0 6e 4d 65 72 67 65 20 3d 20 6e 44 6f 63 6c 69 73  nMerge = nDoclis
16fc0 74 3b 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 3b  t;.    int iOut;
16fd0 0a 0a 20 20 20 20 66 6f 72 28 69 4f 75 74 3d 30  ..    for(iOut=0
16fe0 3b 20 69 4f 75 74 3c 53 69 7a 65 6f 66 41 72 72  ; iOut<SizeofArr
16ff0 61 79 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74  ay(pTS->aaOutput
17000 29 3b 20 69 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  ); iOut++){.    
17010 20 20 69 66 28 20 70 54 53 2d 3e 61 61 4f 75 74    if( pTS->aaOut
17020 70 75 74 5b 69 4f 75 74 5d 3d 3d 30 20 29 7b 0a  put[iOut]==0 ){.
17030 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17040 69 4f 75 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  iOut>0 );.      
17050 20 20 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 5b    pTS->aaOutput[
17060 69 4f 75 74 5d 20 3d 20 61 4d 65 72 67 65 3b 0a  iOut] = aMerge;.
17070 20 20 20 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f          pTS->anO
17080 75 74 70 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d  utput[iOut] = nM
17090 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 62 72  erge;.        br
170a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
170b0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
170c0 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 69 6e  aNew;.        in
170d0 74 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 20 20 20  t nNew;..       
170e0 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 44 6f   int rc = fts3Do
170f0 63 6c 69 73 74 4f 72 4d 65 72 67 65 28 70 2d 3e  clistOrMerge(p->
17100 62 44 65 73 63 49 64 78 2c 20 61 4d 65 72 67 65  bDescIdx, aMerge
17110 2c 20 6e 4d 65 72 67 65 2c 20 0a 20 20 20 20 20  , nMerge, .     
17120 20 20 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75         pTS->aaOu
17130 74 70 75 74 5b 69 4f 75 74 5d 2c 20 70 54 53 2d  tput[iOut], pTS-
17140 3e 61 6e 4f 75 74 70 75 74 5b 69 4f 75 74 5d 2c  >anOutput[iOut],
17150 20 26 61 4e 65 77 2c 20 26 6e 4e 65 77 0a 20 20   &aNew, &nNew.  
17160 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
17170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17190 69 66 28 20 61 4d 65 72 67 65 21 3d 61 44 6f 63  if( aMerge!=aDoc
171a0 6c 69 73 74 20 29 20 73 71 6c 69 74 65 33 5f 66  list ) sqlite3_f
171b0 72 65 65 28 61 4d 65 72 67 65 29 3b 0a 20 20 20  ree(aMerge);.   
171c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
171d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
171e0 20 20 20 20 20 69 66 28 20 61 4d 65 72 67 65 21       if( aMerge!
171f0 3d 61 44 6f 63 6c 69 73 74 20 29 20 73 71 6c 69  =aDoclist ) sqli
17200 74 65 33 5f 66 72 65 65 28 61 4d 65 72 67 65 29  te3_free(aMerge)
17210 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17220 33 5f 66 72 65 65 28 70 54 53 2d 3e 61 61 4f 75  3_free(pTS->aaOu
17230 74 70 75 74 5b 69 4f 75 74 5d 29 3b 0a 20 20 20  tput[iOut]);.   
17240 20 20 20 20 20 70 54 53 2d 3e 61 61 4f 75 74 70       pTS->aaOutp
17250 75 74 5b 69 4f 75 74 5d 20 3d 20 30 3b 0a 20 20  ut[iOut] = 0;.  
17260 0a 20 20 20 20 20 20 20 20 61 4d 65 72 67 65 20  .        aMerge 
17270 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
17280 6e 4d 65 72 67 65 20 3d 20 6e 4e 65 77 3b 0a 20  nMerge = nNew;. 
17290 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 75 74         if( (iOut
172a0 2b 31 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79  +1)==SizeofArray
172b0 28 70 54 53 2d 3e 61 61 4f 75 74 70 75 74 29 20  (pTS->aaOutput) 
172c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 53  ){.          pTS
172d0 2d 3e 61 61 4f 75 74 70 75 74 5b 69 4f 75 74 5d  ->aaOutput[iOut]
172e0 20 3d 20 61 4d 65 72 67 65 3b 0a 20 20 20 20 20   = aMerge;.     
172f0 20 20 20 20 20 70 54 53 2d 3e 61 6e 4f 75 74 70       pTS->anOutp
17300 75 74 5b 69 4f 75 74 5d 20 3d 20 6e 4d 65 72 67  ut[iOut] = nMerg
17310 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
17320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17330 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17340 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  K;.}../*.** Appe
17350 6e 64 20 53 65 67 52 65 61 64 65 72 20 6f 62 6a  nd SegReader obj
17360 65 63 74 20 70 4e 65 77 20 74 6f 20 74 68 65 20  ect pNew to the 
17370 65 6e 64 20 6f 66 20 74 68 65 20 70 43 73 72 2d  end of the pCsr-
17380 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72  >apSegment[] arr
17390 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
173a0 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  t fts3SegReaderC
173b0 75 72 73 6f 72 41 70 70 65 6e 64 28 0a 20 20 46  ursorAppend(.  F
173c0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
173d0 72 20 2a 70 43 73 72 2c 20 0a 20 20 46 74 73 33  r *pCsr, .  Fts3
173e0 53 65 67 52 65 61 64 65 72 20 2a 70 4e 65 77 0a  SegReader *pNew.
173f0 29 7b 0a 20 20 69 66 28 20 28 70 43 73 72 2d 3e  ){.  if( (pCsr->
17400 6e 53 65 67 6d 65 6e 74 25 31 36 29 3d 3d 30 20  nSegment%16)==0 
17410 29 7b 0a 20 20 20 20 46 74 73 33 53 65 67 52 65  ){.    Fts3SegRe
17420 61 64 65 72 20 2a 2a 61 70 4e 65 77 3b 0a 20 20  ader **apNew;.  
17430 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
17440 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 2b 20  Csr->nSegment + 
17450 31 36 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 53  16)*sizeof(Fts3S
17460 65 67 52 65 61 64 65 72 2a 29 3b 0a 20 20 20 20  egReader*);.    
17470 61 70 4e 65 77 20 3d 20 28 46 74 73 33 53 65 67  apNew = (Fts3Seg
17480 52 65 61 64 65 72 20 2a 2a 29 73 71 6c 69 74 65  Reader **)sqlite
17490 33 5f 72 65 61 6c 6c 6f 63 28 70 43 73 72 2d 3e  3_realloc(pCsr->
174a0 61 70 53 65 67 6d 65 6e 74 2c 20 6e 42 79 74 65  apSegment, nByte
174b0 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
174c0 77 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  w ){.      sqlit
174d0 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46  e3Fts3SegReaderF
174e0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
174f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
17500 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
17510 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20  pCsr->apSegment 
17520 3d 20 61 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 70  = apNew;.  }.  p
17530 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 70  Csr->apSegment[p
17540 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 5d  Csr->nSegment++]
17550 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
17560 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17570 2f 2a 0a 2a 2a 20 41 64 64 20 73 65 67 2d 72 65  /*.** Add seg-re
17580 61 64 65 72 20 6f 62 6a 65 63 74 73 20 74 6f 20  ader objects to 
17590 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 67  the Fts3MultiSeg
175a0 52 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 61  Reader object pa
175b0 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 38  ssed as the.** 8
175c0 74 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  th argument..**.
175d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
175e0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
175f0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
17600 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
17610 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 6f 74 68  rror code.** oth
17620 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
17630 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 61  c int fts3SegRea
17640 64 65 72 43 75 72 73 6f 72 28 0a 20 20 46 74 73  derCursor(.  Fts
17650 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20  3Table *p,      
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17670 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c  FTS3 table handl
17680 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  e */.  int iLang
17690 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
176a0 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61         /* Langua
176b0 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
176c0 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
176d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
176e0 64 65 78 20 74 6f 20 73 65 61 72 63 68 20 28 66  dex to search (f
176f0 72 6f 6d 20 30 20 74 6f 20 70 2d 3e 6e 49 6e 64  rom 0 to p->nInd
17700 65 78 2d 31 29 20 2a 2f 0a 20 20 69 6e 74 20 69  ex-1) */.  int i
17710 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
17720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
17730 76 65 6c 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  vel of segments 
17740 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 63 6f 6e  to scan */.  con
17750 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17770 54 65 72 6d 20 74 6f 20 71 75 65 72 79 20 66 6f  Term to query fo
17780 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  r */.  int nTerm
17790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
177a0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
177b0 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
177c0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 50 72 65 66   */.  int isPref
177d0 69 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ix,             
177e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
177f0 72 20 61 20 70 72 65 66 69 78 20 73 65 61 72 63  r a prefix searc
17800 68 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 63 61  h */.  int isSca
17810 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
17820 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
17830 6f 20 73 63 61 6e 20 66 72 6f 6d 20 7a 54 65 72  o scan from zTer
17840 6d 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 46 74  m to EOF */.  Ft
17850 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
17860 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 2f 2a   *pCsr        /*
17870 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74   Cursor object t
17880 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b  o populate */.){
17890 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
178a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
178b0 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
178c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
178d0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
178e0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
178f0 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
17900 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
17910 2f 0a 20 20 69 6e 74 20 72 63 32 3b 20 20 20 20  /.  int rc2;    
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
17940 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 29   sqlite3_reset()
17950 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 69 4c 65   */..  /* If iLe
17960 76 65 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  vel is less than
17970 20 30 20 61 6e 64 20 74 68 69 73 20 69 73 20 6e   0 and this is n
17980 6f 74 20 61 20 73 63 61 6e 2c 20 69 6e 63 6c 75  ot a scan, inclu
17990 64 65 20 61 20 73 65 67 2d 72 65 61 64 65 72 20  de a seg-reader 
179a0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 65  .  ** for the pe
179b0 6e 64 69 6e 67 2d 74 65 72 6d 73 2e 20 49 66 20  nding-terms. If 
179c0 74 68 69 73 20 69 73 20 61 20 73 63 61 6e 2c 20  this is a scan, 
179d0 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 6d  then this call m
179e0 75 73 74 20 62 65 20 62 65 69 6e 67 0a 20 20 2a  ust be being.  *
179f0 2a 20 6d 61 64 65 20 62 79 20 61 6e 20 66 74 73  * made by an fts
17a00 34 61 75 78 20 6d 6f 64 75 6c 65 2c 20 6e 6f 74  4aux module, not
17a10 20 61 6e 20 46 54 53 20 74 61 62 6c 65 2e 20 49   an FTS table. I
17a20 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c  n this case call
17a30 69 6e 67 0a 20 20 2a 2a 20 46 74 73 33 53 65 67  ing.  ** Fts3Seg
17a40 52 65 61 64 65 72 50 65 6e 64 69 6e 67 20 6d 69  ReaderPending mi
17a50 67 68 74 20 73 65 67 66 61 75 6c 74 2c 20 61 73  ght segfault, as
17a60 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
17a70 75 72 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  ures used by .  
17a80 2a 2a 20 66 74 73 34 61 75 78 20 61 72 65 20 6e  ** fts4aux are n
17a90 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 70 6f  ot completely po
17aa0 70 75 6c 61 74 65 64 2e 20 53 6f 20 69 74 27 73  pulated. So it's
17ab0 20 65 61 73 69 65 73 74 20 74 6f 20 66 69 6c 74   easiest to filt
17ac0 65 72 20 74 68 65 73 65 0a 20 20 2a 2a 20 63 61  er these.  ** ca
17ad0 6c 6c 73 20 6f 75 74 20 68 65 72 65 2e 20 20 2a  lls out here.  *
17ae0 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30  /.  if( iLevel<0
17af0 20 26 26 20 70 2d 3e 61 49 6e 64 65 78 20 29 7b   && p->aIndex ){
17b00 0a 20 20 20 20 46 74 73 33 53 65 67 52 65 61 64  .    Fts3SegRead
17b10 65 72 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20  er *pSeg = 0;.  
17b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17b30 73 33 53 65 67 52 65 61 64 65 72 50 65 6e 64 69  s3SegReaderPendi
17b40 6e 67 28 70 2c 20 69 49 6e 64 65 78 2c 20 7a 54  ng(p, iIndex, zT
17b50 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50 72  erm, nTerm, isPr
17b60 65 66 69 78 7c 7c 69 73 53 63 61 6e 2c 20 26 70  efix||isScan, &p
17b70 53 65 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Seg);.    if( rc
17b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
17b90 53 65 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Seg ){.      rc 
17ba0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43  = fts3SegReaderC
17bb0 75 72 73 6f 72 41 70 70 65 6e 64 28 70 43 73 72  ursorAppend(pCsr
17bc0 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20  , pSeg);.    }. 
17bd0 20 7d 0a 0a 20 20 69 66 28 20 69 4c 65 76 65 6c   }..  if( iLevel
17be0 21 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52  !=FTS3_SEGCURSOR
17bf0 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 20 20 20  _PENDING ){.    
17c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17c10 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17c20 73 71 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65  sqlite3Fts3AllSe
17c30 67 64 69 72 73 28 70 2c 20 69 4c 61 6e 67 69 64  gdirs(p, iLangid
17c40 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c  , iIndex, iLevel
17c50 2c 20 26 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d  , &pStmt);.    }
17c60 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
17c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
17c80 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20 3d 20  LITE_ROW==(rc = 
17c90 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
17ca0 6d 74 29 29 20 29 7b 0a 20 20 20 20 20 20 46 74  mt)) ){.      Ft
17cb0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65  s3SegReader *pSe
17cc0 67 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  g = 0;..      /*
17cd0 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 73   Read the values
17ce0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
17cf0 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 6c 6f 63   SELECT into loc
17d00 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 2a 2f  al variables. */
17d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
17d20 6e 74 36 34 20 69 53 74 61 72 74 42 6c 6f 63 6b  nt64 iStartBlock
17d30 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
17d40 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31  n_int64(pStmt, 1
17d50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17d60 5f 69 6e 74 36 34 20 69 4c 65 61 76 65 73 45 6e  _int64 iLeavesEn
17d70 64 42 6c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  dBlock = sqlite3
17d80 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
17d90 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 73  tmt, 2);.      s
17da0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e  qlite3_int64 iEn
17db0 64 42 6c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  dBlock = sqlite3
17dc0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
17dd0 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  tmt, 3);.      i
17de0 6e 74 20 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74  nt nRoot = sqlit
17df0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
17e00 70 53 74 6d 74 2c 20 34 29 3b 0a 20 20 20 20 20  pStmt, 4);.     
17e10 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 52 6f   char const *zRo
17e20 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ot = sqlite3_col
17e30 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
17e40 34 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  4);..      /* If
17e50 20 7a 54 65 72 6d 20 69 73 20 6e 6f 74 20 4e 55   zTerm is not NU
17e60 4c 4c 2c 20 61 6e 64 20 74 68 69 73 20 73 65 67  LL, and this seg
17e70 6d 65 6e 74 20 69 73 20 6e 6f 74 20 73 74 6f 72  ment is not stor
17e80 65 64 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 69  ed entirely on i
17e90 74 73 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74  ts.      ** root
17ea0 20 6e 6f 64 65 2c 20 74 68 65 20 72 61 6e 67 65   node, the range
17eb0 20 6f 66 20 6c 65 61 76 65 73 20 73 63 61 6e 6e   of leaves scann
17ec0 65 64 20 63 61 6e 20 62 65 20 72 65 64 75 63 65  ed can be reduce
17ed0 64 2e 20 44 6f 20 74 68 69 73 2e 20 2a 2f 0a 20  d. Do this. */. 
17ee0 20 20 20 20 20 69 66 28 20 69 53 74 61 72 74 42       if( iStartB
17ef0 6c 6f 63 6b 20 26 26 20 7a 54 65 72 6d 20 29 7b  lock && zTerm ){
17f00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17f10 5f 69 6e 74 36 34 20 2a 70 69 20 3d 20 28 69 73  _int64 *pi = (is
17f20 50 72 65 66 69 78 20 3f 20 26 69 4c 65 61 76 65  Prefix ? &iLeave
17f30 73 45 6e 64 42 6c 6f 63 6b 20 3a 20 30 29 3b 0a  sEndBlock : 0);.
17f40 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
17f50 33 53 65 6c 65 63 74 4c 65 61 66 28 70 2c 20 7a  3SelectLeaf(p, z
17f60 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 7a 52 6f  Term, nTerm, zRo
17f70 6f 74 2c 20 6e 52 6f 6f 74 2c 20 26 69 53 74 61  ot, nRoot, &iSta
17f80 72 74 42 6c 6f 63 6b 2c 20 70 69 29 3b 0a 20 20  rtBlock, pi);.  
17f90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17fa0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
17fb0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 20  inished;.       
17fc0 20 69 66 28 20 69 73 50 72 65 66 69 78 3d 3d 30   if( isPrefix==0
17fd0 20 26 26 20 69 73 53 63 61 6e 3d 3d 30 20 29 20   && isScan==0 ) 
17fe0 69 4c 65 61 76 65 73 45 6e 64 42 6c 6f 63 6b 20  iLeavesEndBlock 
17ff0 3d 20 69 53 74 61 72 74 42 6c 6f 63 6b 3b 0a 20  = iStartBlock;. 
18000 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 72       }. .      r
18010 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53  c = sqlite3Fts3S
18020 65 67 52 65 61 64 65 72 4e 65 77 28 70 43 73 72  egReaderNew(pCsr
18030 2d 3e 6e 53 65 67 6d 65 6e 74 2b 31 2c 20 0a 20  ->nSegment+1, . 
18040 20 20 20 20 20 20 20 20 20 28 69 73 50 72 65 66           (isPref
18050 69 78 3d 3d 30 20 26 26 20 69 73 53 63 61 6e 3d  ix==0 && isScan=
18060 3d 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 69  =0),.          i
18070 53 74 61 72 74 42 6c 6f 63 6b 2c 20 69 4c 65 61  StartBlock, iLea
18080 76 65 73 45 6e 64 42 6c 6f 63 6b 2c 20 0a 20 20  vesEndBlock, .  
18090 20 20 20 20 20 20 20 20 69 45 6e 64 42 6c 6f 63          iEndBloc
180a0 6b 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c  k, zRoot, nRoot,
180b0 20 26 70 53 65 67 0a 20 20 20 20 20 20 29 3b 0a   &pSeg.      );.
180c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
180d0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66  LITE_OK ) goto f
180e0 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 20 20 72  inished;.      r
180f0 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 65  c = fts3SegReade
18100 72 43 75 72 73 6f 72 41 70 70 65 6e 64 28 70 43  rCursorAppend(pC
18110 73 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  sr, pSeg);.    }
18120 0a 20 20 7d 0a 0a 20 66 69 6e 69 73 68 65 64 3a  .  }.. finished:
18130 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
18140 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
18150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18160 44 4f 4e 45 20 29 20 72 63 20 3d 20 72 63 32 3b  DONE ) rc = rc2;
18170 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
18180 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
18190 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66   cursor object f
181a0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
181b0 6f 75 67 68 20 61 20 66 75 6c 6c 2d 74 65 78 74  ough a full-text
181c0 20 69 6e 64 65 78 20 6f 72 20 61 20 0a 2a 2a 20   index or a .** 
181d0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 74 68 65  single level the
181e0 72 65 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rein..*/.int sql
181f0 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65  ite3Fts3SegReade
18200 72 43 75 72 73 6f 72 28 0a 20 20 46 74 73 33 54  rCursor(.  Fts3T
18210 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20  able *p,        
18220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
18230 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  S3 table handle 
18240 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64  */.  int iLangid
18250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18260 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
18270 2d 69 64 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  -id to search */
18280 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 20  .  int iIndex,  
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73     /* Index to s
182b0 65 61 72 63 68 20 28 66 72 6f 6d 20 30 20 74 6f  earch (from 0 to
182c0 20 70 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f   p->nIndex-1) */
182d0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182f0 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73     /* Level of s
18300 65 67 6d 65 6e 74 73 20 74 6f 20 73 63 61 6e 20  egments to scan 
18310 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18320 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20  *zTerm,         
18330 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
18340 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
18350 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20  nt nTerm,       
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18370 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
18380 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
18390 74 20 69 73 50 72 65 66 69 78 2c 20 20 20 20 20  t isPrefix,     
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
183b0 20 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66   True for a pref
183c0 69 78 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  ix search */.  i
183d0 6e 74 20 69 73 53 63 61 6e 2c 20 20 20 20 20 20  nt isScan,      
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
183f0 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20 66  * True to scan f
18400 72 6f 6d 20 7a 54 65 72 6d 20 74 6f 20 45 4f 46  rom zTerm to EOF
18410 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53   */.  Fts3MultiS
18420 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 20  egReader *pCsr  
18430 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
18440 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
18450 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
18460 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 26 20 69  ( iIndex>=0 && i
18470 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20  Index<p->nIndex 
18480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  );.  assert( iLe
18490 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52  vel==FTS3_SEGCUR
184a0 53 4f 52 5f 41 4c 4c 0a 20 20 20 20 20 20 7c 7c  SOR_ALL.      ||
184b0 20 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53    iLevel==FTS3_S
184c0 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47  EGCURSOR_PENDING
184d0 20 0a 20 20 20 20 20 20 7c 7c 20 20 69 4c 65 76   .      ||  iLev
184e0 65 6c 3e 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73  el>=0.  );.  ass
184f0 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 33  ert( iLevel<FTS3
18500 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c  _SEGDIR_MAXLEVEL
18510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 46 54   );.  assert( FT
18520 53 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c  S3_SEGCURSOR_ALL
18530 3c 30 20 26 26 20 46 54 53 33 5f 53 45 47 43 55  <0 && FTS3_SEGCU
18540 52 53 4f 52 5f 50 45 4e 44 49 4e 47 3c 30 20 29  RSOR_PENDING<0 )
18550 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  ;.  assert( isPr
18560 65 66 69 78 3d 3d 30 20 7c 7c 20 69 73 53 63 61  efix==0 || isSca
18570 6e 3d 3d 30 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  n==0 );..  memse
18580 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65 6f  t(pCsr, 0, sizeo
18590 66 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65  f(Fts3MultiSegRe
185a0 61 64 65 72 29 29 3b 0a 20 20 72 65 74 75 72 6e  ader));.  return
185b0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 75   fts3SegReaderCu
185c0 72 73 6f 72 28 0a 20 20 20 20 20 20 70 2c 20 69  rsor(.      p, i
185d0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20  Langid, iIndex, 
185e0 69 4c 65 76 65 6c 2c 20 7a 54 65 72 6d 2c 20 6e  iLevel, zTerm, n
185f0 54 65 72 6d 2c 20 69 73 50 72 65 66 69 78 2c 20  Term, isPrefix, 
18600 69 73 53 63 61 6e 2c 20 70 43 73 72 0a 20 20 29  isScan, pCsr.  )
18610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 61 64  ;.}../*.** In ad
18620 64 69 74 69 6f 6e 20 74 6f 20 69 74 73 20 63 75  dition to its cu
18630 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
18640 69 6f 6e 2c 20 68 61 76 65 20 74 68 65 20 46 74  ion, have the Ft
18650 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72  s3MultiSegReader
18660 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
18670 65 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 61  e 4th argument a
18680 6c 73 6f 20 73 63 61 6e 20 74 68 65 20 64 6f 63  lso scan the doc
18690 6c 69 73 74 20 66 6f 72 20 74 65 72 6d 20 7a 54  list for term zT
186a0 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a  erm/nTerm..**.**
186b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
186c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
186d0 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72  or occurs, other
186e0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
186f0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
18700 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67  atic int fts3Seg
18710 52 65 61 64 65 72 43 75 72 73 6f 72 41 64 64 5a  ReaderCursorAddZ
18720 65 72 6f 28 0a 20 20 46 74 73 33 54 61 62 6c 65  ero(.  Fts3Table
18730 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
18740 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 76 69         /* FTS vi
18750 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64  rtual table hand
18760 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  le */.  int iLan
18770 67 69 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  gid,.  const cha
18780 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20  r *zTerm,       
18790 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74         /* Term t
187a0 6f 20 73 63 61 6e 20 64 6f 63 6c 69 73 74 20 6f  o scan doclist o
187b0 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  f */.  int nTerm
187c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
187d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
187e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 54 65   of bytes in zTe
187f0 72 6d 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74  rm */.  Fts3Mult
18800 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72  iSegReader *pCsr
18810 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 4d          /* Fts3M
18820 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 6f  ultiSegReader to
18830 20 6d 6f 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20   modify */.){.  
18840 72 65 74 75 72 6e 20 66 74 73 33 53 65 67 52 65  return fts3SegRe
18850 61 64 65 72 43 75 72 73 6f 72 28 70 2c 20 0a 20  aderCursor(p, . 
18860 20 20 20 20 20 69 4c 61 6e 67 69 64 2c 20 30 2c       iLangid, 0,
18870 20 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f   FTS3_SEGCURSOR_
18880 41 4c 4c 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  ALL, zTerm, nTer
18890 6d 2c 20 30 2c 20 30 2c 70 43 73 72 0a 20 20 29  m, 0, 0,pCsr.  )
188a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
188b0 61 6e 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  an Fts3MultiSegR
188c0 65 61 64 65 72 20 74 6f 20 73 63 61 6e 20 74 68  eader to scan th
188d0 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 65  e doclist for te
188e0 72 6d 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20  rm zTerm/nTerm. 
188f0 4f 72 2c 0a 2a 2a 20 69 66 20 69 73 50 72 65 66  Or,.** if isPref
18900 69 78 20 69 73 20 74 72 75 65 2c 20 74 6f 20 73  ix is true, to s
18910 63 61 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20  can the doclist 
18920 66 6f 72 20 61 6c 6c 20 74 65 72 6d 73 20 66 6f  for all terms fo
18930 72 20 77 68 69 63 68 20 0a 2a 2a 20 7a 54 65 72  r which .** zTer
18940 6d 2f 6e 54 65 72 6d 20 69 73 20 61 20 70 72 65  m/nTerm is a pre
18950 66 69 78 2e 20 49 66 20 73 75 63 63 65 73 73 66  fix. If successf
18960 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
18970 45 5f 4f 4b 20 61 6e 64 20 77 72 69 74 65 0a 2a  E_OK and write.*
18980 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
18990 68 65 20 6e 65 77 20 46 74 73 33 4d 75 6c 74 69  he new Fts3Multi
189a0 53 65 67 52 65 61 64 65 72 20 74 6f 20 2a 70 70  SegReader to *pp
189b0 53 65 67 63 73 72 2e 20 4f 74 68 65 72 77 69 73  Segcsr. Otherwis
189c0 65 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20  e, return.** an 
189d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
189e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74  e..**.** It is t
189f0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
18a00 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
18a10 74 6f 20 66 72 65 65 20 74 68 69 73 20 6f 62 6a  to free this obj
18a20 65 63 74 20 62 79 20 65 76 65 6e 74 75 61 6c 6c  ect by eventuall
18a30 79 0a 2a 2a 20 70 61 73 73 69 6e 67 20 69 74 20  y.** passing it 
18a40 74 6f 20 66 74 73 33 53 65 67 52 65 61 64 65 72  to fts3SegReader
18a50 43 75 72 73 6f 72 46 72 65 65 28 29 20 0a 2a 2a  CursorFree() .**
18a60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
18a70 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
18a80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74  error occurs, ot
18a90 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
18aa0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
18ab0 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   Output paramete
18ac0 72 20 2a 70 70 53 65 67 63 73 72 20 69 73 20 73  r *ppSegcsr is s
18ad0 65 74 20 74 6f 20 30 20 69 66 20 61 6e 20 65 72  et to 0 if an er
18ae0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
18af0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 65  tatic int fts3Te
18b00 72 6d 53 65 67 52 65 61 64 65 72 43 75 72 73 6f  rmSegReaderCurso
18b10 72 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  r(.  Fts3Cursor 
18b20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
18b30 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
18b40 74 61 62 6c 65 20 63 75 72 73 6f 72 20 68 61 6e  table cursor han
18b50 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
18b60 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20  har *zTerm,     
18b70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 72 6d           /* Term
18b80 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
18b90 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  .  int nTerm,   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
18bc0 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
18bd0 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 2c 20    int isPrefix, 
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
18c00 70 72 65 66 69 78 20 73 65 61 72 63 68 20 2a 2f  prefix search */
18c10 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52  .  Fts3MultiSegR
18c20 65 61 64 65 72 20 2a 2a 70 70 53 65 67 63 73 72  eader **ppSegcsr
18c30 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63     /* OUT: Alloc
18c40 61 74 65 64 20 73 65 67 2d 72 65 61 64 65 72 20  ated seg-reader 
18c50 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  cursor */.){.  F
18c60 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
18c70 72 20 2a 70 53 65 67 63 73 72 3b 20 20 20 20 2f  r *pSegcsr;    /
18c80 2a 20 4f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  * Object to allo
18c90 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
18ca0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
18cb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 20 20 20 20  LITE_NOMEM;     
18cc0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
18cd0 6f 64 65 20 2a 2f 0a 0a 20 20 70 53 65 67 63 73  ode */..  pSegcs
18ce0 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
18cf0 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 33 4d 75  oc(sizeof(Fts3Mu
18d00 6c 74 69 53 65 67 52 65 61 64 65 72 29 29 3b 0a  ltiSegReader));.
18d10 20 20 69 66 28 20 70 53 65 67 63 73 72 20 29 7b    if( pSegcsr ){
18d20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18d30 69 6e 74 20 62 46 6f 75 6e 64 20 3d 20 30 3b 20  int bFound = 0; 
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d50 20 54 72 75 65 20 6f 6e 63 65 20 61 6e 20 69 6e   True once an in
18d60 64 65 78 20 68 61 73 20 62 65 65 6e 20 66 6f 75  dex has been fou
18d70 6e 64 20 2a 2f 0a 20 20 20 20 46 74 73 33 54 61  nd */.    Fts3Ta
18d80 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
18d90 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73 65  ble *)pCsr->base
18da0 2e 70 56 74 61 62 3b 0a 0a 20 20 20 20 69 66 28  .pVtab;..    if(
18db0 20 69 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20   isPrefix ){.   
18dc0 20 20 20 66 6f 72 28 69 3d 31 3b 20 62 46 6f 75     for(i=1; bFou
18dd0 6e 64 3d 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 49  nd==0 && i<p->nI
18de0 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ndex; i++){.    
18df0 20 20 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65      if( p->aInde
18e00 78 5b 69 5d 2e 6e 50 72 65 66 69 78 3d 3d 6e 54  x[i].nPrefix==nT
18e10 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  erm ){.         
18e20 20 62 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20   bFound = 1;.   
18e30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18e40 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
18e50 43 75 72 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e  Cursor(p, pCsr->
18e60 69 4c 61 6e 67 69 64 2c 20 0a 20 20 20 20 20 20  iLangid, .      
18e70 20 20 20 20 20 20 20 20 69 2c 20 46 54 53 33 5f          i, FTS3_
18e80 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a  SEGCURSOR_ALL, z
18e90 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 30 2c 20  Term, nTerm, 0, 
18ea0 30 2c 20 70 53 65 67 63 73 72 0a 20 20 20 20 20  0, pSegcsr.     
18eb0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
18ec0 20 20 70 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b    pSegcsr->bLook
18ed0 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  up = 1;.        
18ee0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
18ef0 20 66 6f 72 28 69 3d 31 3b 20 62 46 6f 75 6e 64   for(i=1; bFound
18f00 3d 3d 30 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64  ==0 && i<p->nInd
18f10 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ex; i++){.      
18f20 20 20 69 66 28 20 70 2d 3e 61 49 6e 64 65 78 5b    if( p->aIndex[
18f30 69 5d 2e 6e 50 72 65 66 69 78 3d 3d 6e 54 65 72  i].nPrefix==nTer
18f40 6d 2b 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  m+1 ){.         
18f50 20 62 46 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20   bFound = 1;.   
18f60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
18f70 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72  te3Fts3SegReader
18f80 43 75 72 73 6f 72 28 70 2c 20 70 43 73 72 2d 3e  Cursor(p, pCsr->
18f90 69 4c 61 6e 67 69 64 2c 20 0a 20 20 20 20 20 20  iLangid, .      
18fa0 20 20 20 20 20 20 20 20 69 2c 20 46 54 53 33 5f          i, FTS3_
18fb0 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a  SEGCURSOR_ALL, z
18fc0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 31 2c 20  Term, nTerm, 1, 
18fd0 30 2c 20 70 53 65 67 63 73 72 0a 20 20 20 20 20  0, pSegcsr.     
18fe0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
18ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19010 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52     rc = fts3SegR
19020 65 61 64 65 72 43 75 72 73 6f 72 41 64 64 5a 65  eaderCursorAddZe
19030 72 6f 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ro(.            
19040 20 20 20 20 70 2c 20 70 43 73 72 2d 3e 69 4c 61      p, pCsr->iLa
19050 6e 67 69 64 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  ngid, zTerm, nTe
19060 72 6d 2c 20 70 53 65 67 63 73 72 0a 20 20 20 20  rm, pSegcsr.    
19070 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
19080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
190a0 20 20 20 20 69 66 28 20 62 46 6f 75 6e 64 3d 3d      if( bFound==
190b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
190c0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65  sqlite3Fts3SegRe
190d0 61 64 65 72 43 75 72 73 6f 72 28 70 2c 20 70 43  aderCursor(p, pC
190e0 73 72 2d 3e 69 4c 61 6e 67 69 64 2c 20 0a 20 20  sr->iLangid, .  
190f0 20 20 20 20 20 20 20 20 30 2c 20 46 54 53 33 5f          0, FTS3_
19100 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 2c 20 7a  SEGCURSOR_ALL, z
19110 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 69 73 50  Term, nTerm, isP
19120 72 65 66 69 78 2c 20 30 2c 20 70 53 65 67 63 73  refix, 0, pSegcs
19130 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  r.      );.     
19140 20 70 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75   pSegcsr->bLooku
19150 70 20 3d 20 21 69 73 50 72 65 66 69 78 3b 0a 20  p = !isPrefix;. 
19160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 53     }.  }..  *ppS
19170 65 67 63 73 72 20 3d 20 70 53 65 67 63 73 72 3b  egcsr = pSegcsr;
19180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19190 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 20 46  ./*.** Free an F
191a0 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
191b0 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  r allocated by f
191c0 74 73 33 54 65 72 6d 53 65 67 52 65 61 64 65 72  ts3TermSegReader
191d0 43 75 72 73 6f 72 28 29 2e 0a 2a 2f 0a 73 74 61  Cursor()..*/.sta
191e0 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67  tic void fts3Seg
191f0 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65 65  ReaderCursorFree
19200 28 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61  (Fts3MultiSegRea
19210 64 65 72 20 2a 70 53 65 67 63 73 72 29 7b 0a 20  der *pSegcsr){. 
19220 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52   sqlite3Fts3SegR
19230 65 61 64 65 72 46 69 6e 69 73 68 28 70 53 65 67  eaderFinish(pSeg
19240 63 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  csr);.  sqlite3_
19250 66 72 65 65 28 70 53 65 67 63 73 72 29 3b 0a 7d  free(pSegcsr);.}
19260 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
19270 63 74 69 6f 6e 20 72 65 74 72 69 65 76 65 73 20  ction retrieves 
19280 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  the doclist for 
19290 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
192a0 72 6d 20 28 6f 72 20 74 65 72 6d 0a 2a 2a 20 70  rm (or term.** p
192b0 72 65 66 69 78 29 20 66 72 6f 6d 20 74 68 65 20  refix) from the 
192c0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
192d0 74 69 63 20 69 6e 74 20 66 74 73 33 54 65 72 6d  tic int fts3Term
192e0 53 65 6c 65 63 74 28 0a 20 20 46 74 73 33 54 61  Select(.  Fts3Ta
192f0 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ble *p,         
19300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
19310 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c  tual table handl
19320 65 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73  e */.  Fts3Phras
19330 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 2c 20 20 20  eToken *pTok,   
19340 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20         /* Token 
19350 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
19360 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 71    /* Column to q
19390 75 65 72 79 20 28 6f 72 20 2d 76 65 20 66 6f 72  uery (or -ve for
193a0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 29 20 2a 2f   all columns) */
193b0 0a 20 20 69 6e 74 20 2a 70 6e 4f 75 74 2c 20 20  .  int *pnOut,  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
193e0 6f 66 20 62 75 66 66 65 72 20 61 74 20 2a 70 70  of buffer at *pp
193f0 4f 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  Out */.  char **
19400 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
19410 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
19420 20 4d 61 6c 6c 6f 63 65 64 20 72 65 73 75 6c 74   Malloced result
19430 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
19440 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19470 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67  /.  Fts3MultiSeg
19480 52 65 61 64 65 72 20 2a 70 53 65 67 63 73 72 3b  Reader *pSegcsr;
19490 20 20 20 20 2f 2a 20 53 65 67 2d 72 65 61 64 65      /* Seg-reade
194a0 72 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 69  r cursor for thi
194b0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 54 65 72 6d  s term */.  Term
194c0 53 65 6c 65 63 74 20 74 73 63 3b 20 20 20 20 20  Select tsc;     
194d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
194e0 62 6a 65 63 74 20 66 6f 72 20 70 61 69 72 2d 77  bject for pair-w
194f0 69 73 65 20 64 6f 63 6c 69 73 74 20 6d 65 72 67  ise doclist merg
19500 69 6e 67 20 2a 2f 0a 20 20 46 74 73 33 53 65 67  ing */.  Fts3Seg
19510 46 69 6c 74 65 72 20 66 69 6c 74 65 72 3b 20 20  Filter filter;  
19520 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
19530 65 6e 74 20 74 65 72 6d 20 66 69 6c 74 65 72 20  ent term filter 
19540 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
19550 0a 0a 20 20 70 53 65 67 63 73 72 20 3d 20 70 54  ..  pSegcsr = pT
19560 6f 6b 2d 3e 70 53 65 67 63 73 72 3b 0a 20 20 6d  ok->pSegcsr;.  m
19570 65 6d 73 65 74 28 26 74 73 63 2c 20 30 2c 20 73  emset(&tsc, 0, s
19580 69 7a 65 6f 66 28 54 65 72 6d 53 65 6c 65 63 74  izeof(TermSelect
19590 29 29 3b 0a 0a 20 20 66 69 6c 74 65 72 2e 66 6c  ));..  filter.fl
195a0 61 67 73 20 3d 20 46 54 53 33 5f 53 45 47 4d 45  ags = FTS3_SEGME
195b0 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 59 20  NT_IGNORE_EMPTY 
195c0 7c 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52  | FTS3_SEGMENT_R
195d0 45 51 55 49 52 45 5f 50 4f 53 0a 20 20 20 20 20  EQUIRE_POS.     
195e0 20 20 20 7c 20 28 70 54 6f 6b 2d 3e 69 73 50 72     | (pTok->isPr
195f0 65 66 69 78 20 3f 20 46 54 53 33 5f 53 45 47 4d  efix ? FTS3_SEGM
19600 45 4e 54 5f 50 52 45 46 49 58 20 3a 20 30 29 0a  ENT_PREFIX : 0).
19610 20 20 20 20 20 20 20 20 7c 20 28 70 54 6f 6b 2d          | (pTok-
19620 3e 62 46 69 72 73 74 20 3f 20 46 54 53 33 5f 53  >bFirst ? FTS3_S
19630 45 47 4d 45 4e 54 5f 46 49 52 53 54 20 3a 20 30  EGMENT_FIRST : 0
19640 29 0a 20 20 20 20 20 20 20 20 7c 20 28 69 43 6f  ).        | (iCo
19650 6c 75 6d 6e 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  lumn<p->nColumn 
19660 3f 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43  ? FTS3_SEGMENT_C
19670 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 20 3a 20 30  OLUMN_FILTER : 0
19680 29 3b 0a 20 20 66 69 6c 74 65 72 2e 69 43 6f 6c  );.  filter.iCol
19690 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 66 69   = iColumn;.  fi
196a0 6c 74 65 72 2e 7a 54 65 72 6d 20 3d 20 70 54 6f  lter.zTerm = pTo
196b0 6b 2d 3e 7a 3b 0a 20 20 66 69 6c 74 65 72 2e 6e  k->z;.  filter.n
196c0 54 65 72 6d 20 3d 20 70 54 6f 6b 2d 3e 6e 3b 0a  Term = pTok->n;.
196d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
196e0 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61 72  ts3SegReaderStar
196f0 74 28 70 2c 20 70 53 65 67 63 73 72 2c 20 26 66  t(p, pSegcsr, &f
19700 69 6c 74 65 72 29 3b 0a 20 20 77 68 69 6c 65 28  ilter);.  while(
19710 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20   SQLITE_OK==rc. 
19720 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52       && SQLITE_R
19730 4f 57 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OW==(rc = sqlite
19740 33 46 74 73 33 53 65 67 52 65 61 64 65 72 53 74  3Fts3SegReaderSt
19750 65 70 28 70 2c 20 70 53 65 67 63 73 72 29 29 20  ep(p, pSegcsr)) 
19760 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  .  ){.    rc = f
19770 74 73 33 54 65 72 6d 53 65 6c 65 63 74 4d 65 72  ts3TermSelectMer
19780 67 65 28 70 2c 20 26 74 73 63 2c 20 70 53 65 67  ge(p, &tsc, pSeg
19790 63 73 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70  csr->aDoclist, p
197a0 53 65 67 63 73 72 2d 3e 6e 44 6f 63 6c 69 73 74  Segcsr->nDoclist
197b0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
197c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
197d0 20 20 20 72 63 20 3d 20 66 74 73 33 54 65 72 6d     rc = fts3Term
197e0 53 65 6c 65 63 74 46 69 6e 69 73 68 4d 65 72 67  SelectFinishMerg
197f0 65 28 70 2c 20 26 74 73 63 29 3b 0a 20 20 7d 0a  e(p, &tsc);.  }.
19800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19810 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 4f 75  _OK ){.    *ppOu
19820 74 20 3d 20 74 73 63 2e 61 61 4f 75 74 70 75 74  t = tsc.aaOutput
19830 5b 30 5d 3b 0a 20 20 20 20 2a 70 6e 4f 75 74 20  [0];.    *pnOut 
19840 3d 20 74 73 63 2e 61 6e 4f 75 74 70 75 74 5b 30  = tsc.anOutput[0
19850 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
19860 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
19870 3d 30 3b 20 69 3c 53 69 7a 65 6f 66 41 72 72 61  =0; i<SizeofArra
19880 79 28 74 73 63 2e 61 61 4f 75 74 70 75 74 29 3b  y(tsc.aaOutput);
19890 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
198a0 69 74 65 33 5f 66 72 65 65 28 74 73 63 2e 61 61  ite3_free(tsc.aa
198b0 4f 75 74 70 75 74 5b 69 5d 29 3b 0a 20 20 20 20  Output[i]);.    
198c0 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 33 53 65 67  }.  }..  fts3Seg
198d0 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65 65  ReaderCursorFree
198e0 28 70 53 65 67 63 73 72 29 3b 0a 20 20 70 54 6f  (pSegcsr);.  pTo
198f0 6b 2d 3e 70 53 65 67 63 73 72 20 3d 20 30 3b 0a  k->pSegcsr = 0;.
19900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19910 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19920 69 6f 6e 20 63 6f 75 6e 74 73 20 74 68 65 20 74  ion counts the t
19930 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 64  otal number of d
19940 6f 63 69 64 73 20 69 6e 20 74 68 65 20 64 6f 63  ocids in the doc
19950 6c 69 73 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  list stored.** i
19960 6e 20 62 75 66 66 65 72 20 61 4c 69 73 74 5b 5d  n buffer aList[]
19970 2c 20 73 69 7a 65 20 6e 4c 69 73 74 20 62 79 74  , size nList byt
19980 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
19990 20 69 73 50 6f 73 6c 69 73 74 20 61 72 67 75 6d   isPoslist argum
199a0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
199b0 6e 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  n it is assumed 
199c0 74 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74  that the doclist
199d0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  .** contains a p
199e0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 6c  osition-list fol
199f0 6c 6f 77 69 6e 67 20 65 61 63 68 20 64 6f 63 69  lowing each doci
19a00 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  d. Otherwise, it
19a10 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74   is assumed.** t
19a20 68 61 74 20 74 68 65 20 64 6f 63 6c 69 73 74 20  hat the doclist 
19a30 69 73 20 73 69 6d 70 6c 79 20 61 20 6c 69 73 74  is simply a list
19a40 20 6f 66 20 64 6f 63 69 64 73 20 73 74 6f 72 65   of docids store
19a50 64 20 61 73 20 64 65 6c 74 61 20 65 6e 63 6f 64  d as delta encod
19a60 65 64 20 0a 2a 2a 20 76 61 72 69 6e 74 73 2e 0a  ed .** varints..
19a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
19a80 73 33 44 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f  s3DoclistCountDo
19a90 63 69 64 73 28 63 68 61 72 20 2a 61 4c 69 73 74  cids(char *aList
19aa0 2c 20 69 6e 74 20 6e 4c 69 73 74 29 7b 0a 20 20  , int nList){.  
19ab0 69 6e 74 20 6e 44 6f 63 20 3d 20 30 3b 20 20 20  int nDoc = 0;   
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ad0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
19ae0 2a 2f 0a 20 20 69 66 28 20 61 4c 69 73 74 20 29  */.  if( aList )
19af0 7b 0a 20 20 20 20 63 68 61 72 20 2a 61 45 6e 64  {.    char *aEnd
19b00 20 3d 20 26 61 4c 69 73 74 5b 6e 4c 69 73 74 5d   = &aList[nList]
19b10 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ;   /* Pointer t
19b20 6f 20 6f 6e 65 20 62 79 74 65 20 61 66 74 65 72  o one byte after
19b30 20 45 4f 46 20 2a 2f 0a 20 20 20 20 63 68 61 72   EOF */.    char
19b40 20 2a 70 20 3d 20 61 4c 69 73 74 3b 20 20 20 20   *p = aList;    
19b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
19b60 73 6f 72 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  sor */.    while
19b70 28 20 70 3c 61 45 6e 64 20 29 7b 0a 20 20 20 20  ( p<aEnd ){.    
19b80 20 20 6e 44 6f 63 2b 2b 3b 0a 20 20 20 20 20 20    nDoc++;.      
19b90 77 68 69 6c 65 28 20 28 2a 70 2b 2b 29 26 30 78  while( (*p++)&0x
19ba0 38 30 20 29 3b 20 20 20 20 20 2f 2a 20 53 6b 69  80 );     /* Ski
19bb0 70 20 64 6f 63 69 64 20 76 61 72 69 6e 74 20 2a  p docid varint *
19bc0 2f 0a 20 20 20 20 20 20 66 74 73 33 50 6f 73 6c  /.      fts3Posl
19bd0 69 73 74 43 6f 70 79 28 30 2c 20 26 70 29 3b 20  istCopy(0, &p); 
19be0 20 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 70    /* Skip over p
19bf0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
19c00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
19c10 75 72 6e 20 6e 44 6f 63 3b 0a 7d 0a 0a 2f 2a 0a  urn nDoc;.}../*.
19c20 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
19c30 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
19c40 74 20 72 6f 77 20 69 6e 20 74 68 65 20 25 5f 63  t row in the %_c
19c50 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 74 68 61  ontent table tha
19c60 74 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  t.** matches the
19c70 20 73 65 61 72 63 68 20 63 72 69 74 65 72 69 61   search criteria
19c80 2e 20 20 46 6f 72 20 61 20 4d 41 54 43 48 20 73  .  For a MATCH s
19c90 65 61 72 63 68 2c 20 74 68 69 73 20 77 69 6c 6c  earch, this will
19ca0 20 62 65 0a 2a 2a 20 74 68 65 20 6e 65 78 74 20   be.** the next 
19cb0 72 6f 77 20 74 68 61 74 20 6d 61 74 63 68 65 73  row that matches
19cc0 2e 20 46 6f 72 20 61 20 66 75 6c 6c 2d 74 61 62  . For a full-tab
19cd0 6c 65 20 73 63 61 6e 2c 20 74 68 69 73 20 77 69  le scan, this wi
19ce0 6c 6c 20 62 65 0a 2a 2a 20 73 69 6d 70 6c 79 20  ll be.** simply 
19cf0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
19d00 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61  the %_content ta
19d10 62 6c 65 2e 20 20 46 6f 72 20 61 20 64 6f 63 69  ble.  For a doci
19d20 64 20 6c 6f 6f 6b 75 70 2c 0a 2a 2a 20 74 68 69  d lookup,.** thi
19d30 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79  s routine simply
19d40 20 73 65 74 73 20 74 68 65 20 45 4f 46 20 66 6c   sets the EOF fl
19d50 61 67 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ag..**.** Return
19d60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 6e 6f   SQLITE_OK if no
19d70 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
19d80 2e 20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  .  SQLITE_OK is 
19d90 72 65 74 75 72 6e 65 64 0a 2a 2a 20 65 76 65 6e  returned.** even
19da0 20 69 66 20 77 65 20 72 65 61 63 68 20 65 6e 64   if we reach end
19db0 2d 6f 66 2d 66 69 6c 65 2e 20 20 54 68 65 20 66  -of-file.  The f
19dc0 74 73 33 45 6f 66 4d 65 74 68 6f 64 28 29 20 77  ts3EofMethod() w
19dd0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 0a 2a 2a  ill be called.**
19de0 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 74 6f   subsequently to
19df0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
19e00 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 45 4f 46  er or not an EOF
19e10 20 77 61 73 20 68 69 74 2e 0a 2a 2f 0a 73 74 61   was hit..*/.sta
19e20 74 69 63 20 69 6e 74 20 66 74 73 33 4e 65 78 74  tic int fts3Next
19e30 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f 76  Method(sqlite3_v
19e40 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  tab_cursor *pCur
19e50 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sor){.  int rc;.
19e60 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
19e70 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f 72  sr = (Fts3Cursor
19e80 20 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 69 66   *)pCursor;.  if
19e90 28 20 70 43 73 72 2d 3e 65 53 65 61 72 63 68 3d  ( pCsr->eSearch=
19ea0 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41 52  =FTS3_DOCID_SEAR
19eb0 43 48 20 7c 7c 20 70 43 73 72 2d 3e 65 53 65 61  CH || pCsr->eSea
19ec0 72 63 68 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43  rch==FTS3_FULLSC
19ed0 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a 20 20 20  AN_SEARCH ){.   
19ee0 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 21   if( SQLITE_ROW!
19ef0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43  =sqlite3_step(pC
19f00 73 72 2d 3e 70 53 74 6d 74 29 20 29 7b 0a 20 20  sr->pStmt) ){.  
19f10 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20      pCsr->isEof 
19f20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
19f30 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 43  sqlite3_reset(pC
19f40 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  sr->pStmt);.    
19f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 73  }else{.      pCs
19f60 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 73 71 6c  r->iPrevId = sql
19f70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
19f80 34 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30  4(pCsr->pStmt, 0
19f90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
19fa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
19fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
19fc0 20 66 74 73 33 45 76 61 6c 4e 65 78 74 28 28 46   fts3EvalNext((F
19fd0 74 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ts3Cursor *)pCur
19fe0 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  sor);.  }.  asse
19ff0 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20  rt( ((Fts3Table 
1a000 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
1a010 61 62 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d  ab)->pSegments==
1a020 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
1a030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
1a040 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 63 6f 70  ollowing are cop
1a050 69 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 49  ied from sqliteI
1a060 6e 74 2e 68 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  nt.h..**.** Cons
1a070 74 61 6e 74 73 20 66 6f 72 20 74 68 65 20 6c 61  tants for the la
1a080 72 67 65 73 74 20 61 6e 64 20 73 6d 61 6c 6c 65  rgest and smalle
1a090 73 74 20 70 6f 73 73 69 62 6c 65 20 36 34 2d 62  st possible 64-b
1a0a0 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
1a0b0 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 6d 61 63  rs..** These mac
1a0c0 72 6f 73 20 61 72 65 20 64 65 73 69 67 6e 65 64  ros are designed
1a0d0 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74   to work correct
1a0e0 6c 79 20 6f 6e 20 62 6f 74 68 20 33 32 2d 62 69  ly on both 32-bi
1a0f0 74 20 61 6e 64 20 36 34 2d 62 69 74 0a 2a 2a 20  t and 64-bit.** 
1a100 63 6f 6d 70 69 6c 65 72 73 2e 0a 2a 2f 0a 23 69  compilers..*/.#i
1a110 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41  fndef SQLITE_AMA
1a120 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69  LGAMATION.# defi
1a130 6e 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34  ne LARGEST_INT64
1a140 20 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28    (0xffffffff|((
1a150 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
1a160 78 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29  x7fffffff)<<32))
1a170 0a 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45  .# define SMALLE
1a180 53 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69  ST_INT64 (((sqli
1a190 74 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20  te3_int64)-1) - 
1a1a0 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23  LARGEST_INT64).#
1a1b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
1a1c0 74 68 65 20 6e 75 6d 65 72 69 63 20 74 79 70 65  the numeric type
1a1d0 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 70 56 61   of argument pVa
1a1e0 6c 20 69 73 20 22 69 6e 74 65 67 65 72 22 2c 20  l is "integer", 
1a1f0 74 68 65 6e 20 72 65 74 75 72 6e 20 69 74 0a 2a  then return it.*
1a200 2a 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61  * converted to a
1a210 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
1a220 6e 74 65 67 65 72 2e 20 4f 74 68 65 72 77 69 73  nteger. Otherwis
1a230 65 2c 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  e, return a copy
1a240 20 6f 66 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e   of.** the secon
1a250 64 20 70 61 72 61 6d 65 74 65 72 2c 20 69 44 65  d parameter, iDe
1a260 66 61 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  fault..*/.static
1a270 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 66   sqlite3_int64 f
1a280 74 73 33 44 6f 63 69 64 52 61 6e 67 65 28 73 71  ts3DocidRange(sq
1a290 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
1a2a0 6c 2c 20 69 36 34 20 69 44 65 66 61 75 6c 74 29  l, i64 iDefault)
1a2b0 7b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  {.  if( pVal ){.
1a2c0 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20      int eType = 
1a2d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 6e 75  sqlite3_value_nu
1a2e0 6d 65 72 69 63 5f 74 79 70 65 28 70 56 61 6c 29  meric_type(pVal)
1a2f0 3b 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ;.    if( eType=
1a300 3d 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20  =SQLITE_INTEGER 
1a310 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a320 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
1a330 74 36 34 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  t64(pVal);.    }
1a340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44  .  }.  return iD
1a350 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  efault;.}../*.**
1a360 20 54 68 69 73 20 69 73 20 74 68 65 20 78 46 69   This is the xFi
1a370 6c 74 65 72 20 69 6e 74 65 72 66 61 63 65 20 66  lter interface f
1a380 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  or the virtual t
1a390 61 62 6c 65 2e 20 20 53 65 65 0a 2a 2a 20 74 68  able.  See.** th
1a3a0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1a3b0 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 64  xFilter method d
1a3c0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72  ocumentation for
1a3d0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 69   additional.** i
1a3e0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nformation..**.*
1a3f0 2a 20 49 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53  * If idxNum==FTS
1a400 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43  3_FULLSCAN_SEARC
1a410 48 20 74 68 65 6e 20 64 6f 20 61 20 66 75 6c 6c  H then do a full
1a420 20 74 61 62 6c 65 20 73 63 61 6e 20 61 67 61 69   table scan agai
1a430 6e 73 74 0a 2a 2a 20 74 68 65 20 25 5f 63 6f 6e  nst.** the %_con
1a440 74 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tent table..**.*
1a450 2a 20 49 66 20 69 64 78 4e 75 6d 3d 3d 46 54 53  * If idxNum==FTS
1a460 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20 74  3_DOCID_SEARCH t
1a470 68 65 6e 20 64 6f 20 61 20 64 6f 63 69 64 20 6c  hen do a docid l
1a480 6f 6f 6b 75 70 20 66 6f 72 20 61 20 73 69 6e 67  ookup for a sing
1a490 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  le entry.** in t
1a4a0 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62  he %_content tab
1a4b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 64 78  le..**.** If idx
1a4c0 4e 75 6d 3e 3d 46 54 53 33 5f 46 55 4c 4c 54 45  Num>=FTS3_FULLTE
1a4d0 58 54 5f 53 45 41 52 43 48 20 74 68 65 6e 20 75  XT_SEARCH then u
1a4e0 73 65 20 74 68 65 20 66 75 6c 6c 20 74 65 78 74  se the full text
1a4f0 20 69 6e 64 65 78 2e 20 20 54 68 65 0a 2a 2a 20   index.  The.** 
1a500 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
1a510 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
1a520 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
1a530 6f 72 20 69 73 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  or is column.** 
1a540 6e 75 6d 62 65 72 20 69 64 78 4e 75 6d 2d 46 54  number idxNum-FT
1a550 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53 45 41 52  S3_FULLTEXT_SEAR
1a560 43 48 2c 20 30 20 69 6e 64 65 78 65 64 2e 20 20  CH, 0 indexed.  
1a570 61 72 67 76 5b 30 5d 20 69 73 20 74 68 65 20 72  argv[0] is the r
1a580 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64  ight-hand.** sid
1a590 65 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  e of the MATCH o
1a5a0 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
1a5b0 69 63 20 69 6e 74 20 66 74 73 33 46 69 6c 74 65  ic int fts3Filte
1a5c0 72 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c 69 74  rMethod(.  sqlit
1a5d0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
1a5e0 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a 20 54 68  pCursor,   /* Th
1a5f0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
1a600 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a  r this query */.
1a610 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 20 20    int idxNum,   
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 2f 2a 20 53 74 72 61 74 65 67 79 20 69 6e    /* Strategy in
1a640 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
1a650 68 61 72 20 2a 69 64 78 53 74 72 2c 20 20 20 20  har *idxStr,    
1a660 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
1a670 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  ed */.  int nVal
1a680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a690 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a6a0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
1a6b0 20 61 70 56 61 6c 20 2a 2f 0a 20 20 73 71 6c 69   apVal */.  sqli
1a6c0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
1a6d0 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  l           /* A
1a6e0 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68 65  rguments for the
1a6f0 20 69 6e 64 65 78 69 6e 67 20 73 63 68 65 6d 65   indexing scheme
1a700 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
1a720 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a740 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
1a750 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 25  used to access %
1a760 5f 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e  _content */.  in
1a770 74 20 65 53 65 61 72 63 68 3b 0a 20 20 46 74 73  t eSearch;.  Fts
1a780 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73  3Table *p = (Fts
1a790 33 54 61 62 6c 65 20 2a 29 70 43 75 72 73 6f 72  3Table *)pCursor
1a7a0 2d 3e 70 56 74 61 62 3b 0a 20 20 46 74 73 33 43  ->pVtab;.  Fts3C
1a7b0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 46  ursor *pCsr = (F
1a7c0 74 73 33 43 75 72 73 6f 72 20 2a 29 70 43 75 72  ts3Cursor *)pCur
1a7d0 73 6f 72 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  sor;..  sqlite3_
1a7e0 76 61 6c 75 65 20 2a 70 43 6f 6e 73 20 3d 20 30  value *pCons = 0
1a7f0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d  ;       /* The M
1a800 41 54 43 48 20 6f 72 20 72 6f 77 69 64 20 63 6f  ATCH or rowid co
1a810 6e 73 74 72 61 69 6e 74 2c 20 69 66 20 61 6e 79  nstraint, if any
1a820 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
1a830 6c 75 65 20 2a 70 4c 61 6e 67 69 64 20 3d 20 30  lue *pLangid = 0
1a840 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 6c 61  ;     /* The "la
1a850 6e 67 69 64 20 3d 20 3f 22 20 63 6f 6e 73 74 72  ngid = ?" constr
1a860 61 69 6e 74 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  aint, if any */.
1a870 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1a880 2a 70 44 6f 63 69 64 47 65 20 3d 20 30 3b 20 20  *pDocidGe = 0;  
1a890 20 20 2f 2a 20 54 68 65 20 22 64 6f 63 69 64 20    /* The "docid 
1a8a0 3e 3d 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74  >= ?" constraint
1a8b0 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 73 71  , if any */.  sq
1a8c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44 6f  lite3_value *pDo
1a8d0 63 69 64 4c 65 20 3d 20 30 3b 20 20 20 20 2f 2a  cidLe = 0;    /*
1a8e0 20 54 68 65 20 22 64 6f 63 69 64 20 3c 3d 20 3f   The "docid <= ?
1a8f0 22 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 69 66  " constraint, if
1a900 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 69 49   any */.  int iI
1a910 64 78 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  dx;..  UNUSED_PA
1a920 52 41 4d 45 54 45 52 28 69 64 78 53 74 72 29 3b  RAMETER(idxStr);
1a930 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1a940 54 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 65 53  TER(nVal);..  eS
1a950 65 61 72 63 68 20 3d 20 28 69 64 78 4e 75 6d 20  earch = (idxNum 
1a960 26 20 30 78 30 30 30 30 46 46 46 46 29 3b 0a 20  & 0x0000FFFF);. 
1a970 20 61 73 73 65 72 74 28 20 65 53 65 61 72 63 68   assert( eSearch
1a980 3e 3d 30 20 26 26 20 65 53 65 61 72 63 68 3c 3d  >=0 && eSearch<=
1a990 28 46 54 53 33 5f 46 55 4c 4c 54 45 58 54 5f 53  (FTS3_FULLTEXT_S
1a9a0 45 41 52 43 48 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e  EARCH+p->nColumn
1a9b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1a9c0 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29  ->pSegments==0 )
1a9d0 3b 0a 0a 20 20 2f 2a 20 43 6f 6c 6c 65 63 74 20  ;..  /* Collect 
1a9e0 61 72 67 75 6d 65 6e 74 73 20 69 6e 74 6f 20 6c  arguments into l
1a9f0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 2a  ocal variables *
1aa00 2f 0a 20 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  /.  iIdx = 0;.  
1aa10 69 66 28 20 65 53 65 61 72 63 68 21 3d 46 54 53  if( eSearch!=FTS
1aa20 33 5f 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43  3_FULLSCAN_SEARC
1aa30 48 20 29 20 70 43 6f 6e 73 20 3d 20 61 70 56 61  H ) pCons = apVa
1aa40 6c 5b 69 49 64 78 2b 2b 5d 3b 0a 20 20 69 66 28  l[iIdx++];.  if(
1aa50 20 69 64 78 4e 75 6d 20 26 20 46 54 53 33 5f 48   idxNum & FTS3_H
1aa60 41 56 45 5f 4c 41 4e 47 49 44 20 29 20 70 4c 61  AVE_LANGID ) pLa
1aa70 6e 67 69 64 20 3d 20 61 70 56 61 6c 5b 69 49 64  ngid = apVal[iId
1aa80 78 2b 2b 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e  x++];.  if( idxN
1aa90 75 6d 20 26 20 46 54 53 33 5f 48 41 56 45 5f 44  um & FTS3_HAVE_D
1aaa0 4f 43 49 44 5f 47 45 20 29 20 70 44 6f 63 69 64  OCID_GE ) pDocid
1aab0 47 65 20 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b  Ge = apVal[iIdx+
1aac0 2b 5d 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d  +];.  if( idxNum
1aad0 20 26 20 46 54 53 33 5f 48 41 56 45 5f 44 4f 43   & FTS3_HAVE_DOC
1aae0 49 44 5f 4c 45 20 29 20 70 44 6f 63 69 64 4c 65  ID_LE ) pDocidLe
1aaf0 20 3d 20 61 70 56 61 6c 5b 69 49 64 78 2b 2b 5d   = apVal[iIdx++]
1ab00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  ;.  assert( iIdx
1ab10 3d 3d 6e 56 61 6c 20 29 3b 0a 0a 20 20 2f 2a 20  ==nVal );..  /* 
1ab20 49 6e 20 63 61 73 65 20 74 68 65 20 63 75 72 73  In case the curs
1ab30 6f 72 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  or has been used
1ab40 20 62 65 66 6f 72 65 2c 20 63 6c 65 61 72 20 69   before, clear i
1ab50 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 73 71 6c 69  t now. */.  sqli
1ab60 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73  te3_finalize(pCs
1ab70 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c  r->pStmt);.  sql
1ab80 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 2d 3e  ite3_free(pCsr->
1ab90 61 44 6f 63 6c 69 73 74 29 3b 0a 20 20 73 71 6c  aDoclist);.  sql
1aba0 69 74 65 33 46 74 73 33 4d 49 42 75 66 66 65 72  ite3Fts3MIBuffer
1abb0 46 72 65 65 28 70 43 73 72 2d 3e 70 4d 49 42 75  Free(pCsr->pMIBu
1abc0 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ffer);.  sqlite3
1abd0 46 74 73 33 45 78 70 72 46 72 65 65 28 70 43 73  Fts3ExprFree(pCs
1abe0 72 2d 3e 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d  r->pExpr);.  mem
1abf0 73 65 74 28 26 70 43 75 72 73 6f 72 5b 31 5d 2c  set(&pCursor[1],
1ac00 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 33 43   0, sizeof(Fts3C
1ac10 75 72 73 6f 72 29 2d 73 69 7a 65 6f 66 28 73 71  ursor)-sizeof(sq
1ac20 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1ac30 72 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  r));..  /* Set t
1ac40 68 65 20 6c 6f 77 65 72 20 61 6e 64 20 75 70 70  he lower and upp
1ac50 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 64 6f 63  er bounds on doc
1ac60 69 64 73 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ids to return */
1ac70 0a 20 20 70 43 73 72 2d 3e 69 4d 69 6e 44 6f 63  .  pCsr->iMinDoc
1ac80 69 64 20 3d 20 66 74 73 33 44 6f 63 69 64 52 61  id = fts3DocidRa
1ac90 6e 67 65 28 70 44 6f 63 69 64 47 65 2c 20 53 4d  nge(pDocidGe, SM
1aca0 41 4c 4c 45 53 54 5f 49 4e 54 36 34 29 3b 0a 20  ALLEST_INT64);. 
1acb0 20 70 43 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64   pCsr->iMaxDocid
1acc0 20 3d 20 66 74 73 33 44 6f 63 69 64 52 61 6e 67   = fts3DocidRang
1acd0 65 28 70 44 6f 63 69 64 4c 65 2c 20 4c 41 52 47  e(pDocidLe, LARG
1ace0 45 53 54 5f 49 4e 54 36 34 29 3b 0a 0a 20 20 69  EST_INT64);..  i
1acf0 66 28 20 69 64 78 53 74 72 20 29 7b 0a 20 20 20  f( idxStr ){.   
1ad00 20 70 43 73 72 2d 3e 62 44 65 73 63 20 3d 20 28   pCsr->bDesc = (
1ad10 69 64 78 53 74 72 5b 30 5d 3d 3d 27 44 27 29 3b  idxStr[0]=='D');
1ad20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
1ad30 73 72 2d 3e 62 44 65 73 63 20 3d 20 70 2d 3e 62  sr->bDesc = p->b
1ad40 44 65 73 63 49 64 78 3b 0a 20 20 7d 0a 20 20 70  DescIdx;.  }.  p
1ad50 43 73 72 2d 3e 65 53 65 61 72 63 68 20 3d 20 28  Csr->eSearch = (
1ad60 69 31 36 29 65 53 65 61 72 63 68 3b 0a 0a 20 20  i16)eSearch;..  
1ad70 69 66 28 20 65 53 65 61 72 63 68 21 3d 46 54 53  if( eSearch!=FTS
1ad80 33 5f 44 4f 43 49 44 5f 53 45 41 52 43 48 20 26  3_DOCID_SEARCH &
1ad90 26 20 65 53 65 61 72 63 68 21 3d 46 54 53 33 5f  & eSearch!=FTS3_
1ada0 46 55 4c 4c 53 43 41 4e 5f 53 45 41 52 43 48 20  FULLSCAN_SEARCH 
1adb0 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
1adc0 3d 20 65 53 65 61 72 63 68 2d 46 54 53 33 5f 46  = eSearch-FTS3_F
1add0 55 4c 4c 54 45 58 54 5f 53 45 41 52 43 48 3b 0a  ULLTEXT_SEARCH;.
1ade0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1adf0 7a 51 75 65 72 79 20 3d 20 28 63 6f 6e 73 74 20  zQuery = (const 
1ae00 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76  char *)sqlite3_v
1ae10 61 6c 75 65 5f 74 65 78 74 28 70 43 6f 6e 73 29  alue_text(pCons)
1ae20 3b 0a 0a 20 20 20 20 69 66 28 20 7a 51 75 65 72  ;..    if( zQuer
1ae30 79 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 5f  y==0 && sqlite3_
1ae40 76 61 6c 75 65 5f 74 79 70 65 28 70 43 6f 6e 73  value_type(pCons
1ae50 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )!=SQLITE_NULL )
1ae60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1ae70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ae80 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 69 4c   }..    pCsr->iL
1ae90 61 6e 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 69  angid = 0;.    i
1aea0 66 28 20 70 4c 61 6e 67 69 64 20 29 20 70 43 73  f( pLangid ) pCs
1aeb0 72 2d 3e 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c  r->iLangid = sql
1aec0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 70  ite3_value_int(p
1aed0 4c 61 6e 67 69 64 29 3b 0a 0a 20 20 20 20 61 73  Langid);..    as
1aee0 73 65 72 74 28 20 70 2d 3e 62 61 73 65 2e 7a 45  sert( p->base.zE
1aef0 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rrMsg==0 );.    
1af00 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
1af10 45 78 70 72 50 61 72 73 65 28 70 2d 3e 70 54 6f  ExprParse(p->pTo
1af20 6b 65 6e 69 7a 65 72 2c 20 70 43 73 72 2d 3e 69  kenizer, pCsr->i
1af30 4c 61 6e 67 69 64 2c 0a 20 20 20 20 20 20 20 20  Langid,.        
1af40 70 2d 3e 61 7a 43 6f 6c 75 6d 6e 2c 20 70 2d 3e  p->azColumn, p->
1af50 62 46 74 73 34 2c 20 70 2d 3e 6e 43 6f 6c 75 6d  bFts4, p->nColum
1af60 6e 2c 20 69 43 6f 6c 2c 20 7a 51 75 65 72 79 2c  n, iCol, zQuery,
1af70 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 45 78 70   -1, &pCsr->pExp
1af80 72 2c 20 0a 20 20 20 20 20 20 20 20 26 70 2d 3e  r, .        &p->
1af90 62 61 73 65 2e 7a 45 72 72 4d 73 67 0a 20 20 20  base.zErrMsg.   
1afa0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
1afb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1afc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1afd0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 66 74    }..    rc = ft
1afe0 73 33 45 76 61 6c 53 74 61 72 74 28 70 43 73 72  s3EvalStart(pCsr
1aff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
1b000 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 73 65 28  s3SegmentsClose(
1b010 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  p);.    if( rc!=
1b020 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b030 72 6e 20 72 63 3b 0a 20 20 20 20 70 43 73 72 2d  rn rc;.    pCsr-
1b040 3e 70 4e 65 78 74 49 64 20 3d 20 70 43 73 72 2d  >pNextId = pCsr-
1b050 3e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 70  >aDoclist;.    p
1b060 43 73 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 30  Csr->iPrevId = 0
1b070 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1b080 69 6c 65 20 61 20 53 45 4c 45 43 54 20 73 74 61  ile a SELECT sta
1b090 74 65 6d 65 6e 74 20 66 6f 72 20 74 68 69 73 20  tement for this 
1b0a0 63 75 72 73 6f 72 2e 20 46 6f 72 20 61 20 66 75  cursor. For a fu
1b0b0 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e 2c 20 74  ll-table-scan, t
1b0c0 68 65 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  he.  ** statemen
1b0d0 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
1b0e0 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20  all rows of the 
1b0f0 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e  %_content table.
1b100 20 46 6f 72 20 61 0a 20 20 2a 2a 20 66 75 6c 6c   For a.  ** full
1b110 2d 74 65 78 74 20 71 75 65 72 79 20 6f 72 20 64  -text query or d
1b120 6f 63 69 64 20 6c 6f 6f 6b 75 70 2c 20 74 68 65  ocid lookup, the
1b130 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 72 69   statement retri
1b140 65 76 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  eves a single.  
1b150 2a 2a 20 72 6f 77 20 62 79 20 64 6f 63 69 64 2e  ** row by docid.
1b160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 53 65 61  .  */.  if( eSea
1b170 72 63 68 3d 3d 46 54 53 33 5f 46 55 4c 4c 53 43  rch==FTS3_FULLSC
1b180 41 4e 5f 53 45 41 52 43 48 20 29 7b 0a 20 20 20  AN_SEARCH ){.   
1b190 20 69 66 28 20 70 44 6f 63 69 64 47 65 20 7c 7c   if( pDocidGe ||
1b1a0 20 70 44 6f 63 69 64 4c 65 20 29 7b 0a 20 20 20   pDocidLe ){.   
1b1b0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1b1c0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1b1d0 20 20 20 20 20 22 53 45 4c 45 43 54 20 25 73 20       "SELECT %s 
1b1e0 57 48 45 52 45 20 72 6f 77 69 64 20 42 45 54 57  WHERE rowid BETW
1b1f0 45 45 4e 20 25 6c 6c 64 20 41 4e 44 20 25 6c 6c  EEN %lld AND %ll
1b200 64 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  d ORDER BY rowid
1b210 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1b220 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74  p->zReadExprlist
1b230 2c 20 70 43 73 72 2d 3e 69 4d 69 6e 44 6f 63 69  , pCsr->iMinDoci
1b240 64 2c 20 70 43 73 72 2d 3e 69 4d 61 78 44 6f 63  d, pCsr->iMaxDoc
1b250 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 28 70  id,.          (p
1b260 43 73 72 2d 3e 62 44 65 73 63 20 3f 20 22 44 45  Csr->bDesc ? "DE
1b270 53 43 22 20 3a 20 22 41 53 43 22 29 0a 20 20 20  SC" : "ASC").   
1b280 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
1b290 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
1b2a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1b2b0 45 4c 45 43 54 20 25 73 20 4f 52 44 45 52 20 42  ELECT %s ORDER B
1b2c0 59 20 72 6f 77 69 64 20 25 73 22 2c 20 0a 20 20  Y rowid %s", .  
1b2d0 20 20 20 20 20 20 20 20 70 2d 3e 7a 52 65 61 64          p->zRead
1b2e0 45 78 70 72 6c 69 73 74 2c 20 28 70 43 73 72 2d  Exprlist, (pCsr-
1b2f0 3e 62 44 65 73 63 20 3f 20 22 44 45 53 43 22 20  >bDesc ? "DESC" 
1b300 3a 20 22 41 53 43 22 29 0a 20 20 20 20 20 20 29  : "ASC").      )
1b310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b320 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  zSql ){.      rc
1b330 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1b340 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
1b350 6c 2c 20 2d 31 2c 20 26 70 43 73 72 2d 3e 70 53  l, -1, &pCsr->pS
1b360 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  tmt, 0);.      s
1b370 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1b380 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1b390 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b3a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
1b3b0 65 6c 73 65 20 69 66 28 20 65 53 65 61 72 63 68  else if( eSearch
1b3c0 3d 3d 46 54 53 33 5f 44 4f 43 49 44 5f 53 45 41  ==FTS3_DOCID_SEA
1b3d0 52 43 48 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  RCH ){.    rc = 
1b3e0 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 53 74  fts3CursorSeekSt
1b3f0 6d 74 28 70 43 73 72 2c 20 26 70 43 73 72 2d 3e  mt(pCsr, &pCsr->
1b400 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
1b410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b420 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b430 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
1b440 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 2c 20 70  Csr->pStmt, 1, p
1b450 43 6f 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Cons);.    }.  }
1b460 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1b470 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b480 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 33  ;..  return fts3
1b490 4e 65 78 74 4d 65 74 68 6f 64 28 70 43 75 72 73  NextMethod(pCurs
1b4a0 6f 72 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54  or);.}../* .** T
1b4b0 68 69 73 20 69 73 20 74 68 65 20 78 45 6f 66 20  his is the xEof 
1b4c0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
1b4d0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 53 51 4c  rtual table. SQL
1b4e0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 0a  ite calls this .
1b4f0 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ** routine to fi
1b500 6e 64 20 6f 75 74 20 69 66 20 69 74 20 68 61 73  nd out if it has
1b510 20 72 65 61 63 68 65 64 20 74 68 65 20 65 6e 64   reached the end
1b520 20 6f 66 20 61 20 72 65 73 75 6c 74 20 73 65 74   of a result set
1b530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b540 66 74 73 33 45 6f 66 4d 65 74 68 6f 64 28 73 71  fts3EofMethod(sq
1b550 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1b560 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20 72  r *pCursor){.  r
1b570 65 74 75 72 6e 20 28 28 46 74 73 33 43 75 72 73  eturn ((Fts3Curs
1b580 6f 72 20 2a 29 70 43 75 72 73 6f 72 29 2d 3e 69  or *)pCursor)->i
1b590 73 45 6f 66 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  sEof;.}../* .** 
1b5a0 54 68 69 73 20 69 73 20 74 68 65 20 78 52 6f 77  This is the xRow
1b5b0 69 64 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 53  id method. The S
1b5c0 51 4c 69 74 65 20 63 6f 72 65 20 63 61 6c 6c 73  QLite core calls
1b5d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
1b5e0 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74 68 65  .** retrieve the
1b5f0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
1b600 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1b610 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 66 74  e result set. ft
1b620 73 33 0a 2a 2a 20 65 78 70 6f 73 65 73 20 25 5f  s3.** exposes %_
1b630 63 6f 6e 74 65 6e 74 2e 64 6f 63 69 64 20 61 73  content.docid as
1b640 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
1b650 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1b660 2e 20 54 68 65 0a 2a 2a 20 72 6f 77 69 64 20 73  . The.** rowid s
1b670 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1b680 20 74 6f 20 2a 70 52 6f 77 69 64 2e 0a 2a 2f 0a   to *pRowid..*/.
1b690 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 52  static int fts3R
1b6a0 6f 77 69 64 4d 65 74 68 6f 64 28 73 71 6c 69 74  owidMethod(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 73 71 6c 69 74 65 5f  pCursor, sqlite_
1b6d0 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a  int64 *pRowid){.
1b6e0 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43    Fts3Cursor *pC
1b6f0 73 72 20 3d 20 28 46 74 73 33 43 75 72 73 6f 72  sr = (Fts3Cursor
1b700 20 2a 29 20 70 43 75 72 73 6f 72 3b 0a 20 20 2a   *) pCursor;.  *
1b710 70 52 6f 77 69 64 20 3d 20 70 43 73 72 2d 3e 69  pRowid = pCsr->i
1b720 50 72 65 76 49 64 3b 0a 20 20 72 65 74 75 72 6e  PrevId;.  return
1b730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b740 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  * .** This is th
1b750 65 20 78 43 6f 6c 75 6d 6e 20 6d 65 74 68 6f 64  e xColumn method
1b760 2c 20 63 61 6c 6c 65 64 20 62 79 20 53 51 4c 69  , called by SQLi
1b770 74 65 20 74 6f 20 72 65 71 75 65 73 74 20 61 20  te to request a 
1b780 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68  value from.** th
1b790 65 20 72 6f 77 20 74 68 61 74 20 74 68 65 20 73  e row that the s
1b7a0 75 70 70 6c 69 65 64 20 63 75 72 73 6f 72 20 63  upplied cursor c
1b7b0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1b7c0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 3a 0a 2a 2a  to..**.** If:.**
1b7d0 0a 2a 2a 20 20 20 28 69 43 6f 6c 20 3c 20 20 70  .**   (iCol <  p
1b7e0 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 20 20 2d 3e 20  ->nColumn)   -> 
1b7f0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
1b800 20 69 43 6f 6c 27 74 68 20 75 73 65 72 20 63 6f   iCol'th user co
1b810 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 28 69 43 6f 6c  lumn..**   (iCol
1b820 20 3d 3d 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 29 20   == p->nColumn) 
1b830 20 20 2d 3e 20 4d 61 67 69 63 20 63 6f 6c 75 6d    -> Magic colum
1b840 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
1b850 6e 61 6d 65 20 61 73 20 74 68 65 20 74 61 62 6c  name as the tabl
1b860 65 2e 0a 2a 2a 20 20 20 28 69 43 6f 6c 20 3d 3d  e..**   (iCol ==
1b870 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 20 2d   p->nColumn+1) -
1b880 3e 20 44 6f 63 69 64 20 63 6f 6c 75 6d 6e 0a 2a  > Docid column.*
1b890 2a 20 20 20 28 69 43 6f 6c 20 3d 3d 20 70 2d 3e  *   (iCol == p->
1b8a0 6e 43 6f 6c 75 6d 6e 2b 32 29 20 2d 3e 20 4c 61  nColumn+2) -> La
1b8b0 6e 67 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  ngid column.*/.s
1b8c0 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 43 6f  tatic int fts3Co
1b8d0 6c 75 6d 6e 4d 65 74 68 6f 64 28 0a 20 20 73 71  lumnMethod(.  sq
1b8e0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1b8f0 72 20 2a 70 43 75 72 73 6f 72 2c 20 20 20 2f 2a  r *pCursor,   /*
1b900 20 43 75 72 73 6f 72 20 74 6f 20 72 65 74 72 69   Cursor to retri
1b910 65 76 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 2a  eve value from *
1b920 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  /.  sqlite3_cont
1b930 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
1b940 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
1b950 6f 72 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  or sqlite3_resul
1b960 74 5f 78 78 78 28 29 20 63 61 6c 6c 73 20 2a 2f  t_xxx() calls */
1b970 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
1b9a0 6f 6c 75 6d 6e 20 74 6f 20 72 65 61 64 20 76 61  olumn to read va
1b9b0 6c 75 65 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20  lue from */.){. 
1b9c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b9d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1b9e0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1b9f0 2a 2f 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  */.  Fts3Cursor 
1ba00 2a 70 43 73 72 20 3d 20 28 46 74 73 33 43 75 72  *pCsr = (Fts3Cur
1ba10 73 6f 72 20 2a 29 20 70 43 75 72 73 6f 72 3b 0a  sor *) pCursor;.
1ba20 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 20 3d    Fts3Table *p =
1ba30 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
1ba40 75 72 73 6f 72 2d 3e 70 56 74 61 62 3b 0a 0a 20  ursor->pVtab;.. 
1ba50 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76   /* The column v
1ba60 61 6c 75 65 20 73 75 70 70 6c 69 65 64 20 62 79  alue supplied by
1ba70 20 53 51 4c 69 74 65 20 6d 75 73 74 20 62 65 20   SQLite must be 
1ba80 69 6e 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 61  in range. */.  a
1ba90 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
1baa0 26 20 69 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75  & iCol<=p->nColu
1bab0 6d 6e 2b 32 20 29 3b 0a 0a 20 20 69 66 28 20 69  mn+2 );..  if( i
1bac0 43 6f 6c 3d 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b  Col==p->nColumn+
1bad0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  1 ){.    /* This
1bae0 20 63 61 6c 6c 20 69 73 20 61 20 72 65 71 75 65   call is a reque
1baf0 73 74 20 66 6f 72 20 74 68 65 20 22 64 6f 63 69  st for the "doci
1bb00 64 22 20 63 6f 6c 75 6d 6e 2e 20 53 69 6e 63 65  d" column. Since
1bb10 20 22 64 6f 63 69 64 22 20 69 73 20 61 6e 20 0a   "docid" is an .
1bb20 20 20 20 20 2a 2a 20 61 6c 69 61 73 20 66 6f 72      ** alias for
1bb30 20 22 72 6f 77 69 64 22 2c 20 75 73 65 20 74 68   "rowid", use th
1bb40 65 20 78 52 6f 77 69 64 28 29 20 6d 65 74 68 6f  e xRowid() metho
1bb50 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
1bb60 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
1bb70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1bb80 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73  _int64(pCtx, pCs
1bb90 72 2d 3e 69 50 72 65 76 49 64 29 3b 0a 20 20 7d  r->iPrevId);.  }
1bba0 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 3d 3d 70  else if( iCol==p
1bbb0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
1bbc0 20 2f 2a 20 54 68 65 20 65 78 74 72 61 20 63 6f   /* The extra co
1bbd0 6c 75 6d 6e 20 77 68 6f 73 65 20 6e 61 6d 65 20  lumn whose name 
1bbe0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1bbf0 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  he table..    **
1bc00 20 52 65 74 75 72 6e 20 61 20 62 6c 6f 62 20 77   Return a blob w
1bc10 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
1bc20 72 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  r to the cursor.
1bc30 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1bc40 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 70 43 74  _result_blob(pCt
1bc50 78 2c 20 26 70 43 73 72 2c 20 73 69 7a 65 6f 66  x, &pCsr, sizeof
1bc60 28 70 43 73 72 29 2c 20 53 51 4c 49 54 45 5f 54  (pCsr), SQLITE_T
1bc70 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
1bc80 73 65 20 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e  se if( iCol==p->
1bc90 6e 43 6f 6c 75 6d 6e 2b 32 20 26 26 20 70 43 73  nColumn+2 && pCs
1bca0 72 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20  r->pExpr ){.    
1bcb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
1bcc0 6e 74 36 34 28 70 43 74 78 2c 20 70 43 73 72 2d  nt64(pCtx, pCsr-
1bcd0 3e 69 4c 61 6e 67 69 64 29 3b 0a 20 20 7d 65 6c  >iLangid);.  }el
1bce0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
1bcf0 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 20  equested column 
1bd00 69 73 20 65 69 74 68 65 72 20 61 20 75 73 65 72  is either a user
1bd10 20 63 6f 6c 75 6d 6e 20 28 6f 6e 65 20 74 68 61   column (one tha
1bd20 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
1bd30 2a 2a 20 69 6e 64 65 78 65 64 20 64 61 74 61 29  ** indexed data)
1bd40 2c 20 6f 72 20 74 68 65 20 6c 61 6e 67 75 61 67  , or the languag
1bd50 65 2d 69 64 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f  e-id column.  */
1bd60 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 43 75  .    rc = fts3Cu
1bd70 72 73 6f 72 53 65 65 6b 28 30 2c 20 70 43 73 72  rsorSeek(0, pCsr
1bd80 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1bd90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bda0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 2d 3e     if( iCol==p->
1bdb0 6e 43 6f 6c 75 6d 6e 2b 32 20 29 7b 0a 20 20 20  nColumn+2 ){.   
1bdc0 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 69 64       int iLangid
1bdd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
1bde0 28 20 70 2d 3e 7a 4c 61 6e 67 75 61 67 65 69 64  ( p->zLanguageid
1bdf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4c   ){.          iL
1be00 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  angid = sqlite3_
1be10 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 73 72 2d  column_int(pCsr-
1be20 3e 70 53 74 6d 74 2c 20 70 2d 3e 6e 43 6f 6c 75  >pStmt, p->nColu
1be30 6d 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  mn+1);.        }
1be40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1be50 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 74 78  _result_int(pCtx
1be60 2c 20 69 4c 61 6e 67 69 64 29 3b 0a 20 20 20 20  , iLangid);.    
1be70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1be80 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
1be90 43 73 72 2d 3e 70 53 74 6d 74 29 3e 28 69 43 6f  Csr->pStmt)>(iCo
1bea0 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  l+1) ){.        
1beb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
1bec0 61 6c 75 65 28 70 43 74 78 2c 20 73 71 6c 69 74  alue(pCtx, sqlit
1bed0 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
1bee0 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f  pCsr->pStmt, iCo
1bef0 6c 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l+1));.      }. 
1bf00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1bf10 72 74 28 20 28 28 46 74 73 33 54 61 62 6c 65 20  rt( ((Fts3Table 
1bf20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74  *)pCsr->base.pVt
1bf30 61 62 29 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d  ab)->pSegments==
1bf40 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
1bf50 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
1bf60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
1bf70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1bf80 6f 66 20 74 68 65 20 78 55 70 64 61 74 65 20 63  of the xUpdate c
1bf90 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
1bfa0 0a 2a 2a 20 46 54 53 33 20 76 69 72 74 75 61 6c  .** FTS3 virtual
1bfb0 20 74 61 62 6c 65 73 2e 20 49 74 20 69 73 20 69   tables. It is i
1bfc0 6e 76 6f 6b 65 64 20 62 79 20 53 51 4c 69 74 65  nvoked by SQLite
1bfd0 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
1bfe0 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 73   is to be.** ins
1bff0 65 72 74 65 64 2c 20 75 70 64 61 74 65 64 20 6f  erted, updated o
1c000 72 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  r deleted..*/.st
1c010 61 74 69 63 20 69 6e 74 20 66 74 73 33 55 70 64  atic int fts3Upd
1c020 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 73 71 6c  ateMethod(.  sql
1c030 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1c040 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1c050 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61  Virtual table ha
1c060 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ndle */.  int nA
1c070 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
1c080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c090 65 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72  e of argument ar
1c0a0 72 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ray */.  sqlite3
1c0b0 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20  _value **apVal, 
1c0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
1c0d0 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  y of arguments *
1c0e0 2f 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  /.  sqlite_int64
1c0f0 20 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20 20   *pRowid        
1c100 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20      /* OUT: The 
1c110 61 66 66 65 63 74 65 64 20 28 6f 72 20 65 66 66  affected (or eff
1c120 65 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a  ected) rowid */.
1c130 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1c140 74 65 33 46 74 73 33 55 70 64 61 74 65 4d 65 74  te3Fts3UpdateMet
1c150 68 6f 64 28 70 56 74 61 62 2c 20 6e 41 72 67 2c  hod(pVtab, nArg,
1c160 20 61 70 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b   apVal, pRowid);
1c170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1c180 65 6e 74 61 74 69 6f 6e 20 6f 66 20 78 53 79 6e  entation of xSyn
1c190 63 28 29 20 6d 65 74 68 6f 64 2e 20 46 6c 75 73  c() method. Flus
1c1a0 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
1c1b0 66 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65  f the pending-te
1c1c0 72 6d 73 0a 2a 2a 20 68 61 73 68 2d 74 61 62 6c  rms.** hash-tabl
1c1d0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1c1e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c1f0 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 28   fts3SyncMethod(
1c200 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1c210 74 61 62 29 7b 0a 0a 20 20 2f 2a 20 46 6f 6c 6c  tab){..  /* Foll
1c220 6f 77 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  owing an increme
1c230 6e 74 61 6c 2d 6d 65 72 67 65 20 6f 70 65 72 61  ntal-merge opera
1c240 74 69 6f 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  tion, assuming t
1c250 68 61 74 20 74 68 65 20 69 6e 70 75 74 0a 20 20  hat the input.  
1c260 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20  ** segments are 
1c270 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63  not completely c
1c280 6f 6e 73 75 6d 65 64 20 28 74 68 65 20 75 73 75  onsumed (the usu
1c290 61 6c 20 63 61 73 65 29 2c 20 74 68 65 79 20 61  al case), they a
1c2a0 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
1c2b0 69 6e 20 70 6c 61 63 65 20 74 6f 20 72 65 6d 6f  in place to remo
1c2c0 76 65 20 74 68 65 20 65 6e 74 72 69 65 73 20 74  ve the entries t
1c2d0 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  hat have already
1c2e0 20 62 65 65 6e 20 6d 65 72 67 65 64 2e 20 54 68   been merged. Th
1c2f0 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
1c300 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 6c 65   updating the le
1c310 61 66 20 62 6c 6f 63 6b 20 74 68 61 74 20 63 6f  af block that co
1c320 6e 74 61 69 6e 73 20 74 68 65 20 73 6d 61 6c 6c  ntains the small
1c330 65 73 74 20 75 6e 6d 65 72 67 65 64 0a 20 20 2a  est unmerged.  *
1c340 2a 20 65 6e 74 72 79 20 61 6e 64 20 65 61 63 68  * entry and each
1c350 20 62 6c 6f 63 6b 20 28 69 66 20 61 6e 79 29 20   block (if any) 
1c360 62 65 74 77 65 65 6e 20 74 68 65 20 6c 65 61 66  between the leaf
1c370 20 61 6e 64 20 74 68 65 20 72 6f 6f 74 20 6e 6f   and the root no
1c380 64 65 2e 20 53 6f 0a 20 20 2a 2a 20 69 66 20 74  de. So.  ** if t
1c390 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
1c3a0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 62   input segment b
1c3b0 2d 74 72 65 65 73 20 69 73 20 4e 2c 20 61 6e 64  -trees is N, and
1c3c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 0a   input segments.
1c3d0 20 20 2a 2a 20 61 72 65 20 6d 65 72 67 65 64 20    ** are merged 
1c3e0 65 69 67 68 74 20 61 74 20 61 20 74 69 6d 65 2c  eight at a time,
1c3f0 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 69 6e   updating the in
1c400 70 75 74 20 73 65 67 6d 65 6e 74 73 20 61 74 20  put segments at 
1c410 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  the end.  ** of 
1c420 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d  an incremental-m
1c430 65 72 67 65 20 72 65 71 75 69 72 65 73 20 77 72  erge requires wr
1c440 69 74 69 6e 67 20 28 38 2a 28 31 2b 4e 29 29 20  iting (8*(1+N)) 
1c450 62 6c 6f 63 6b 73 2e 20 4e 20 69 73 20 75 73 75  blocks. N is usu
1c460 61 6c 6c 79 0a 20 20 2a 2a 20 73 6d 61 6c 6c 20  ally.  ** small 
1c470 2d 20 6f 66 74 65 6e 20 62 65 74 77 65 65 6e 20  - often between 
1c480 30 20 61 6e 64 20 32 2e 20 53 6f 20 74 68 65 20  0 and 2. So the 
1c490 6f 76 65 72 68 65 61 64 20 6f 66 20 74 68 65 20  overhead of the 
1c4a0 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 2a 2a  incremental.  **
1c4b0 20 6d 65 72 67 65 20 69 73 20 73 6f 6d 65 77 68   merge is somewh
1c4c0 65 72 65 20 62 65 74 77 65 65 6e 20 38 20 61 6e  ere between 8 an
1c4d0 64 20 32 34 20 62 6c 6f 63 6b 73 2e 20 54 6f 20  d 24 blocks. To 
1c4e0 61 76 6f 69 64 20 74 68 69 73 20 6f 76 65 72 68  avoid this overh
1c4f0 65 61 64 0a 20 20 2a 2a 20 64 77 61 72 66 69 6e  ead.  ** dwarfin
1c500 67 20 74 68 65 20 61 63 74 75 61 6c 20 70 72 6f  g the actual pro
1c510 64 75 63 74 69 76 65 20 77 6f 72 6b 20 61 63 63  ductive work acc
1c520 6f 6d 70 6c 69 73 68 65 64 2c 20 74 68 65 20 69  omplished, the i
1c530 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
1c540 0a 20 20 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 74  .  ** is only at
1c550 74 65 6d 70 74 65 64 20 69 66 20 69 74 20 77 69  tempted if it wi
1c560 6c 6c 20 77 72 69 74 65 20 61 74 20 6c 65 61 73  ll write at leas
1c570 74 20 36 34 20 6c 65 61 66 20 62 6c 6f 63 6b 73  t 64 leaf blocks
1c580 2e 20 48 65 6e 63 65 0a 20 20 2a 2a 20 6e 4d 69  . Hence.  ** nMi
1c590 6e 4d 65 72 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  nMerge..  **.  *
1c5a0 2a 20 4f 66 20 63 6f 75 72 73 65 2c 20 75 70 64  * Of course, upd
1c5b0 61 74 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ating the input 
1c5c0 73 65 67 6d 65 6e 74 73 20 61 6c 73 6f 20 69 6e  segments also in
1c5d0 76 6f 6c 76 65 73 20 64 65 6c 65 74 69 6e 67 20  volves deleting 
1c5e0 61 20 62 75 6e 63 68 0a 20 20 2a 2a 20 6f 66 20  a bunch.  ** of 
1c5f0 62 6c 6f 63 6b 73 20 66 72 6f 6d 20 74 68 65 20  blocks from the 
1c600 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 2e 20  segments table. 
1c610 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
1c620 63 6f 6e 73 69 64 65 72 65 64 20 6f 76 65 72 68  considered overh
1c630 65 61 64 0a 20 20 2a 2a 20 61 73 20 69 74 20 77  ead.  ** as it w
1c640 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 72 65 71  ould also be req
1c650 75 69 72 65 64 20 62 79 20 61 20 63 72 69 73 69  uired by a crisi
1c660 73 2d 6d 65 72 67 65 20 74 68 61 74 20 75 73 65  s-merge that use
1c670 64 20 74 68 65 20 73 61 6d 65 20 69 6e 70 75 74  d the same input
1c680 20 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 2e   .  ** segments.
1c690 0a 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 33  .  */.  const u3
1c6a0 32 20 6e 4d 69 6e 4d 65 72 67 65 20 3d 20 36 34  2 nMinMerge = 64
1c6b0 3b 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d  ;       /* Minim
1c6c0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 69 6e 63  um amount of inc
1c6d0 72 2d 6d 65 72 67 65 20 77 6f 72 6b 20 74 6f 20  r-merge work to 
1c6e0 64 6f 20 2a 2f 0a 0a 20 20 46 74 73 33 54 61 62  do */..  Fts3Tab
1c6f0 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
1c700 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74  le*)pVtab;.  int
1c710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1c720 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75  3PendingTermsFlu
1c730 73 68 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  sh(p);..  if( rc
1c740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
1c750 26 26 20 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 28  && p->nLeafAdd>(
1c760 6e 4d 69 6e 4d 65 72 67 65 2f 31 36 29 20 0a 20  nMinMerge/16) . 
1c770 20 20 26 26 20 70 2d 3e 6e 41 75 74 6f 69 6e 63    && p->nAutoinc
1c780 72 6d 65 72 67 65 20 26 26 20 70 2d 3e 6e 41 75  rmerge && p->nAu
1c790 74 6f 69 6e 63 72 6d 65 72 67 65 21 3d 30 78 66  toincrmerge!=0xf
1c7a0 66 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  f.  ){.    int m
1c7b0 78 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20  xLevel = 0;     
1c7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1c7d0 6d 75 6d 20 72 65 6c 61 74 69 76 65 20 6c 65 76  mum relative lev
1c7e0 65 6c 20 76 61 6c 75 65 20 69 6e 20 64 62 20 2a  el value in db *
1c7f0 2f 0a 20 20 20 20 69 6e 74 20 41 3b 20 20 20 20  /.    int A;    
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 20 2f 2a 20 49 6e 63 72 2d 6d 65 72 67      /* Incr-merg
1c820 65 20 70 61 72 61 6d 65 74 65 72 20 41 20 2a 2f  e parameter A */
1c830 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
1c840 65 33 46 74 73 33 4d 61 78 4c 65 76 65 6c 28 70  e3Fts3MaxLevel(p
1c850 2c 20 26 6d 78 4c 65 76 65 6c 29 3b 0a 20 20 20  , &mxLevel);.   
1c860 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1c870 49 54 45 5f 4f 4b 20 7c 7c 20 6d 78 4c 65 76 65  ITE_OK || mxLeve
1c880 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 41 20 3d 20  l==0 );.    A = 
1c890 70 2d 3e 6e 4c 65 61 66 41 64 64 20 2a 20 6d 78  p->nLeafAdd * mx
1c8a0 4c 65 76 65 6c 3b 0a 20 20 20 20 41 20 2b 3d 20  Level;.    A += 
1c8b0 28 41 2f 32 29 3b 0a 20 20 20 20 69 66 28 20 41  (A/2);.    if( A
1c8c0 3e 28 69 6e 74 29 6e 4d 69 6e 4d 65 72 67 65 20  >(int)nMinMerge 
1c8d0 29 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ) rc = sqlite3Ft
1c8e0 73 33 49 6e 63 72 6d 65 72 67 65 28 70 2c 20 41  s3Incrmerge(p, A
1c8f0 2c 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65  , p->nAutoincrme
1c900 72 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rge);.  }.  sqli
1c910 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43  te3Fts3SegmentsC
1c920 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lose(p);.  retur
1c930 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1c940 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
1c950 79 20 75 6e 6b 6e 6f 77 6e 20 77 68 65 74 68 65  y unknown whethe
1c960 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 46 54 53  r or not the FTS
1c970 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 25 5f   table has an %_
1c980 73 74 61 74 0a 2a 2a 20 74 61 62 6c 65 20 28 69  stat.** table (i
1c990 66 20 70 2d 3e 62 48 61 73 53 74 61 74 3d 3d 32  f p->bHasStat==2
1c9a0 29 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ), attempt to de
1c9b0 74 65 72 6d 69 6e 65 20 74 68 69 73 20 28 73 65  termine this (se
1c9c0 74 20 70 2d 3e 62 48 61 73 53 74 61 74 0a 2a 2a  t p->bHasStat.**
1c9d0 20 74 6f 20 30 20 6f 72 20 31 29 2e 20 52 65 74   to 0 or 1). Ret
1c9e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1c9f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
1ca00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1ca10 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72  code.** if an er
1ca20 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
1ca30 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65  tatic int fts3Se
1ca40 74 48 61 73 53 74 61 74 28 46 74 73 33 54 61 62  tHasStat(Fts3Tab
1ca50 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  le *p){.  int rc
1ca60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ca70 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 3d  if( p->bHasStat=
1ca80 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
1ca90 63 68 61 72 20 2a 7a 46 6d 74 20 3d 22 53 45 4c  char *zFmt ="SEL
1caa0 45 43 54 20 31 20 46 52 4f 4d 20 25 51 2e 73 71  ECT 1 FROM %Q.sq
1cab0 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
1cac0 45 20 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 5f 73  E tbl_name='%q_s
1cad0 74 61 74 27 22 3b 0a 20 20 20 20 63 68 61 72 20  tat'";.    char 
1cae0 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
1caf0 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 70 2d  mprintf(zFmt, p-
1cb00 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  >zDb, p->zName);
1cb10 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
1cb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1cb30 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1cb40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1cb50 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1cb60 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
1cb70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
1cb80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cb90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1cba0 74 20 62 48 61 73 53 74 61 74 20 3d 20 28 73 71  t bHasStat = (sq
1cbb0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1cbc0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 29 3b 0a  )==SQLITE_ROW);.
1cbd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1cbe0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
1cbf0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  tmt);.        if
1cc00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cc10 29 20 70 2d 3e 62 48 61 73 53 74 61 74 20 3d 20  ) p->bHasStat = 
1cc20 62 48 61 73 53 74 61 74 3b 0a 20 20 20 20 20 20  bHasStat;.      
1cc30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
1cc40 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1cc50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1cc60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1cc70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cc80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cc90 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1cca0 66 20 78 42 65 67 69 6e 28 29 20 6d 65 74 68 6f  f xBegin() metho
1ccb0 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d. .*/.static in
1ccc0 74 20 66 74 73 33 42 65 67 69 6e 4d 65 74 68 6f  t fts3BeginMetho
1ccd0 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  d(sqlite3_vtab *
1cce0 70 56 74 61 62 29 7b 0a 20 20 46 74 73 33 54 61  pVtab){.  Fts3Ta
1ccf0 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61  ble *p = (Fts3Ta
1cd00 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e  ble*)pVtab;.  UN
1cd10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1cd20 56 74 61 62 29 3b 0a 20 20 61 73 73 65 72 74 28  Vtab);.  assert(
1cd30 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3d 3d 30   p->pSegments==0
1cd40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1cd50 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
1cd60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1cd70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
1cd80 31 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  1 );.  TESTONLY(
1cd90 20 70 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f   p->inTransactio
1cda0 6e 20 3d 20 31 20 29 3b 0a 20 20 54 45 53 54 4f  n = 1 );.  TESTO
1cdb0 4e 4c 59 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f  NLY( p->mxSavepo
1cdc0 69 6e 74 20 3d 20 2d 31 3b 20 29 3b 0a 20 20 70  int = -1; );.  p
1cdd0 2d 3e 6e 4c 65 61 66 41 64 64 20 3d 20 30 3b 0a  ->nLeafAdd = 0;.
1cde0 20 20 72 65 74 75 72 6e 20 66 74 73 33 53 65 74    return fts3Set
1cdf0 48 61 73 53 74 61 74 28 70 29 3b 0a 7d 0a 0a 2f  HasStat(p);.}../
1ce00 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
1ce10 69 6f 6e 20 6f 66 20 78 43 6f 6d 6d 69 74 28 29  ion of xCommit()
1ce20 20 6d 65 74 68 6f 64 2e 20 54 68 69 73 20 69 73   method. This is
1ce30 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 63 6f   a no-op. The co
1ce40 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 74 68 65  ntents of.** the
1ce50 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68   pending-terms h
1ce60 61 73 68 2d 74 61 62 6c 65 20 68 61 76 65 20 61  ash-table have a
1ce70 6c 72 65 61 64 79 20 62 65 65 6e 20 66 6c 75 73  lready been flus
1ce80 68 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61 74  hed into the dat
1ce90 61 62 61 73 65 0a 2a 2a 20 62 79 20 66 74 73 33  abase.** by fts3
1cea0 53 79 6e 63 4d 65 74 68 6f 64 28 29 2e 0a 2a 2f  SyncMethod()..*/
1ceb0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1cec0 43 6f 6d 6d 69 74 4d 65 74 68 6f 64 28 73 71 6c  CommitMethod(sql
1ced0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
1cee0 29 7b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 46  ){.  TESTONLY( F
1cef0 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46  ts3Table *p = (F
1cf00 74 73 33 54 61 62 6c 65 2a 29 70 56 74 61 62 20  ts3Table*)pVtab 
1cf10 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1cf20 4d 45 54 45 52 28 70 56 74 61 62 29 3b 0a 20 20  METER(pVtab);.  
1cf30 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64  assert( p->nPend
1cf40 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ingData==0 );.  
1cf50 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1cf60 6e 73 61 63 74 69 6f 6e 21 3d 30 20 29 3b 0a 20  nsaction!=0 );. 
1cf70 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 65 67   assert( p->pSeg
1cf80 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 20 54 45  ments==0 );.  TE
1cf90 53 54 4f 4e 4c 59 28 20 70 2d 3e 69 6e 54 72 61  STONLY( p->inTra
1cfa0 6e 73 61 63 74 69 6f 6e 20 3d 20 30 20 29 3b 0a  nsaction = 0 );.
1cfb0 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e 6d    TESTONLY( p->m
1cfc0 78 53 61 76 65 70 6f 69 6e 74 20 3d 20 2d 31 3b  xSavepoint = -1;
1cfd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
1cfe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1cff0 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
1d000 6f 66 20 78 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  of xRollback(). 
1d010 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
1d020 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64  ents of the pend
1d030 69 6e 67 2d 74 65 72 6d 73 0a 2a 2a 20 68 61 73  ing-terms.** has
1d040 68 2d 74 61 62 6c 65 2e 20 41 6e 79 20 63 68 61  h-table. Any cha
1d050 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
1d060 20 64 61 74 61 62 61 73 65 20 61 72 65 20 72 65   database are re
1d070 76 65 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  verted by SQLite
1d080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d090 66 74 73 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68  fts3RollbackMeth
1d0a0 6f 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  od(sqlite3_vtab 
1d0b0 2a 70 56 74 61 62 29 7b 0a 20 20 46 74 73 33 54  *pVtab){.  Fts3T
1d0c0 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
1d0d0 61 62 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 73  able*)pVtab;.  s
1d0e0 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e  qlite3Fts3Pendin
1d0f0 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a  gTermsClear(p);.
1d100 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1d110 72 61 6e 73 61 63 74 69 6f 6e 21 3d 30 20 29 3b  ransaction!=0 );
1d120 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70 2d 3e  .  TESTONLY( p->
1d130 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1d140 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
1d150 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20   p->mxSavepoint 
1d160 3d 20 2d 31 3b 20 29 3b 0a 20 20 72 65 74 75 72  = -1; );.  retur
1d170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d180 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63 61 6c 6c 65  /*.** When calle
1d190 64 2c 20 2a 70 70 50 6f 73 6c 69 73 74 20 6d 75  d, *ppPoslist mu
1d1a0 73 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  st point to the 
1d1b0 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
1d1c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a   following the.*
1d1d0 2a 20 65 6e 64 20 6f 66 20 61 20 70 6f 73 69 74  * end of a posit
1d1e0 69 6f 6e 2d 6c 69 73 74 2e 20 69 2e 65 2e 20 28  ion-list. i.e. (
1d1f0 20 28 2a 70 70 50 6f 73 6c 69 73 74 29 5b 2d 31   (*ppPoslist)[-1
1d200 5d 3d 3d 50 4f 53 5f 45 4e 44 20 29 2e 20 54 68  ]==POS_END ). Th
1d210 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d  is function.** m
1d220 6f 76 65 73 20 2a 70 70 50 6f 73 6c 69 73 74 20  oves *ppPoslist 
1d230 73 6f 20 74 68 61 74 20 69 74 20 69 6e 73 74 65  so that it inste
1d240 61 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ad points to the
1d250 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
1d260 68 65 0a 2a 2a 20 73 61 6d 65 20 70 6f 73 69 74  he.** same posit
1d270 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
1d280 74 69 63 20 76 6f 69 64 20 66 74 73 33 52 65 76  tic void fts3Rev
1d290 65 72 73 65 50 6f 73 6c 69 73 74 28 63 68 61 72  ersePoslist(char
1d2a0 20 2a 70 53 74 61 72 74 2c 20 63 68 61 72 20 2a   *pStart, char *
1d2b0 2a 70 70 50 6f 73 6c 69 73 74 29 7b 0a 20 20 63  *ppPoslist){.  c
1d2c0 68 61 72 20 2a 70 20 3d 20 26 28 2a 70 70 50 6f  har *p = &(*ppPo
1d2d0 73 6c 69 73 74 29 5b 2d 32 5d 3b 0a 20 20 63 68  slist)[-2];.  ch
1d2e0 61 72 20 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ar c = 0;..  /* 
1d2f0 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70  Skip backwards p
1d300 61 73 73 65 64 20 61 6e 79 20 74 72 61 69 6c 69  assed any traili
1d310 6e 67 20 30 78 30 30 20 62 79 74 65 73 20 61 64  ng 0x00 bytes ad
1d320 64 65 64 20 62 79 20 4e 65 61 72 54 72 69 6d 28  ded by NearTrim(
1d330 29 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3e  ) */.  while( p>
1d340 70 53 74 61 72 74 20 26 26 20 28 63 3d 2a 70 2d  pStart && (c=*p-
1d350 2d 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  -)==0 );..  /* S
1d360 65 61 72 63 68 20 62 61 63 6b 77 61 72 64 73 20  earch backwards 
1d370 66 6f 72 20 61 20 76 61 72 69 6e 74 20 77 69 74  for a varint wit
1d380 68 20 76 61 6c 75 65 20 7a 65 72 6f 20 28 74 68  h value zero (th
1d390 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 65  e end of the pre
1d3a0 76 69 6f 75 73 20 0a 20 20 2a 2a 20 70 6f 73 6c  vious .  ** posl
1d3b0 69 73 74 29 2e 20 54 68 69 73 20 69 73 20 61 6e  ist). This is an
1d3c0 20 30 78 30 30 20 62 79 74 65 20 70 72 65 63 65   0x00 byte prece
1d3d0 64 65 64 20 62 79 20 73 6f 6d 65 20 62 79 74 65  ded by some byte
1d3e0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
1d3f0 20 2a 2a 20 68 61 76 65 20 74 68 65 20 30 78 38   ** have the 0x8
1d400 30 20 62 69 74 20 73 65 74 2e 20 20 2a 2f 0a 20  0 bit set.  */. 
1d410 20 77 68 69 6c 65 28 20 70 3e 70 53 74 61 72 74   while( p>pStart
1d420 20 26 26 20 28 2a 70 20 26 20 30 78 38 30 29 20   && (*p & 0x80) 
1d430 7c 20 63 20 29 7b 20 0a 20 20 20 20 63 20 3d 20  | c ){ .    c = 
1d440 2a 70 2d 2d 3b 20 0a 20 20 7d 0a 20 20 61 73 73  *p--; .  }.  ass
1d450 65 72 74 28 20 70 3d 3d 70 53 74 61 72 74 20 7c  ert( p==pStart |
1d460 7c 20 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  | c==0 );..  /* 
1d470 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 20  At this point p 
1d480 70 6f 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70  points to that p
1d490 72 65 63 65 64 69 6e 67 20 62 79 74 65 20 77 69  receding byte wi
1d4a0 74 68 6f 75 74 20 74 68 65 20 30 78 38 30 20 62  thout the 0x80 b
1d4b0 69 74 0a 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20  it.  ** set. So 
1d4c0 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74 61 72  to find the star
1d4d0 74 20 6f 66 20 74 68 65 20 70 6f 73 6c 69 73 74  t of the poslist
1d4e0 2c 20 73 6b 69 70 20 66 6f 72 77 61 72 64 20 32  , skip forward 2
1d4f0 20 62 79 74 65 73 20 74 68 65 6e 0a 20 20 2a 2a   bytes then.  **
1d500 20 6f 76 65 72 20 61 20 76 61 72 69 6e 74 2e 20   over a varint. 
1d510 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 72 6d 61  .  **.  ** Norma
1d520 6c 6c 79 2e 20 54 68 65 20 6f 74 68 65 72 20 63  lly. The other c
1d530 61 73 65 20 69 73 20 74 68 61 74 20 70 3d 3d 70  ase is that p==p
1d540 53 74 61 72 74 20 61 6e 64 20 74 68 65 20 70 6f  Start and the po
1d550 73 6c 69 73 74 20 74 6f 20 72 65 74 75 72 6e 0a  slist to return.
1d560 20 20 2a 2a 20 69 73 20 74 68 65 20 66 69 72 73    ** is the firs
1d570 74 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  t in the doclist
1d580 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 64  . In this case d
1d590 6f 20 6e 6f 74 20 73 6b 69 70 20 66 6f 72 77 61  o not skip forwa
1d5a0 72 64 20 32 20 62 79 74 65 73 2e 0a 20 20 2a 2a  rd 2 bytes..  **
1d5b0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74   The second part
1d5c0 20 6f 66 20 74 68 65 20 69 66 20 63 6f 6e 64 69   of the if condi
1d5d0 74 69 6f 6e 20 28 63 3d 3d 30 20 26 26 20 2a 70  tion (c==0 && *p
1d5e0 70 50 6f 73 6c 69 73 74 3e 26 70 5b 32 5d 29 0a  pPoslist>&p[2]).
1d5f0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
1d600 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 72 65   for cases where
1d610 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
1d620 6f 66 20 61 20 64 6f 63 6c 69 73 74 20 61 6e 64  of a doclist and
1d630 20 74 68 65 0a 20 20 2a 2a 20 64 6f 63 6c 69 73   the.  ** doclis
1d640 74 20 69 73 20 65 6d 70 74 79 2e 20 46 6f 72 20  t is empty. For 
1d650 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1d660 66 69 72 73 74 20 64 6f 63 69 64 20 69 73 20 31  first docid is 1
1d670 30 2c 20 61 20 64 6f 63 6c 69 73 74 0a 20 20 2a  0, a doclist.  *
1d680 2a 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69  * that begins wi
1d690 74 68 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  th:.  **.  **   
1d6a0 30 78 30 41 20 30 78 30 30 20 3c 6e 65 78 74 20  0x0A 0x00 <next 
1d6b0 64 6f 63 69 64 20 64 65 6c 74 61 20 76 61 72 69  docid delta vari
1d6c0 6e 74 3e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nt>.  */.  if( p
1d6d0 3e 70 53 74 61 72 74 20 7c 7c 20 28 63 3d 3d 30  >pStart || (c==0
1d6e0 20 26 26 20 2a 70 70 50 6f 73 6c 69 73 74 3e 26   && *ppPoslist>&
1d6f0 70 5b 32 5d 29 20 29 7b 20 70 20 3d 20 26 70 5b  p[2]) ){ p = &p[
1d700 32 5d 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 2a  2]; }.  while( *
1d710 70 2b 2b 26 30 78 38 30 20 29 3b 0a 20 20 2a 70  p++&0x80 );.  *p
1d720 70 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 7d 0a  pPoslist = p;.}.
1d730 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
1d740 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  nction used by t
1d750 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1d760 6e 20 6f 66 20 74 68 65 20 6f 76 65 72 6c 6f 61  n of the overloa
1d770 64 65 64 20 73 6e 69 70 70 65 74 28 29 2c 0a 2a  ded snippet(),.*
1d780 2a 20 6f 66 66 73 65 74 73 28 29 20 61 6e 64 20  * offsets() and 
1d790 6f 70 74 69 6d 69 7a 65 28 29 20 53 51 4c 20 66  optimize() SQL f
1d7a0 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
1d7b0 49 66 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  If the value pas
1d7c0 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 64  sed as the third
1d7d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 62   argument is a b
1d7e0 6c 6f 62 20 6f 66 20 73 69 7a 65 0a 2a 2a 20 73  lob of size.** s
1d7f0 69 7a 65 6f 66 28 46 74 73 33 43 75 72 73 6f 72  izeof(Fts3Cursor
1d800 2a 29 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f  *), then the blo
1d810 62 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 63  b contents are c
1d820 6f 70 69 65 64 20 74 6f 20 74 68 65 20 0a 2a 2a  opied to the .**
1d830 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1d840 20 2a 70 70 43 73 72 20 61 6e 64 20 53 51 4c 49   *ppCsr and SQLI
1d850 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d860 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
1d870 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
1d880 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
1d890 63 6f 6e 74 65 78 74 20 70 43 6f 6e 74 65 78 74  context pContext
1d8a0 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f   and SQLITE_ERRO
1d8b0 52 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 0a  R returned. The.
1d8c0 2a 2a 20 73 74 72 69 6e 67 20 70 61 73 73 65 64  ** string passed
1d8d0 20 76 69 61 20 7a 46 75 6e 63 20 69 73 20 75 73   via zFunc is us
1d8e0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
1d8f0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
1d900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d910 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67 28 0a  ts3FunctionArg(.
1d920 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1d930 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20 20  t *pContext,    
1d940 20 20 2f 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f    /* SQL functio
1d950 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
1d960 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d970 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
1d980 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
1d990 6e 61 6d 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  name */.  sqlite
1d9a0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20  3_value *pVal,  
1d9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 72 67            /* arg
1d9c0 76 5b 30 5d 20 70 61 73 73 65 64 20 74 6f 20 66  v[0] passed to f
1d9d0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 46 74 73  unction */.  Fts
1d9e0 33 43 75 72 73 6f 72 20 2a 2a 70 70 43 73 72 20  3Cursor **ppCsr 
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da00 4f 55 54 3a 20 53 74 6f 72 65 20 63 75 72 73 6f  OUT: Store curso
1da10 72 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  r handle here */
1da20 0a 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72  .){.  Fts3Cursor
1da30 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 73 71   *pRet;.  if( sq
1da40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
1da50 28 70 56 61 6c 29 21 3d 53 51 4c 49 54 45 5f 42  (pVal)!=SQLITE_B
1da60 4c 4f 42 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74  LOB .   || sqlit
1da70 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
1da80 56 61 6c 29 21 3d 73 69 7a 65 6f 66 28 46 74 73  Val)!=sizeof(Fts
1da90 33 43 75 72 73 6f 72 20 2a 29 0a 20 20 29 7b 0a  3Cursor *).  ){.
1daa0 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
1dab0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1dac0 28 22 69 6c 6c 65 67 61 6c 20 66 69 72 73 74 20  ("illegal first 
1dad0 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 73 22 2c  argument to %s",
1dae0 20 7a 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c   zFunc);.    sql
1daf0 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
1db00 72 28 70 43 6f 6e 74 65 78 74 2c 20 7a 45 72 72  r(pContext, zErr
1db10 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
1db20 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
1db30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1db40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6d 65  _ERROR;.  }.  me
1db50 6d 63 70 79 28 26 70 52 65 74 2c 20 73 71 6c 69  mcpy(&pRet, sqli
1db60 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
1db70 56 61 6c 29 2c 20 73 69 7a 65 6f 66 28 46 74 73  Val), sizeof(Fts
1db80 33 43 75 72 73 6f 72 20 2a 29 29 3b 0a 20 20 2a  3Cursor *));.  *
1db90 70 70 43 73 72 20 3d 20 70 52 65 74 3b 0a 20 20  ppCsr = pRet;.  
1dba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dbb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1dbc0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1dbd0 20 73 6e 69 70 70 65 74 28 29 20 66 75 6e 63 74   snippet() funct
1dbe0 69 6f 6e 20 66 6f 72 20 46 54 53 33 0a 2a 2f 0a  ion for FTS3.*/.
1dbf0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33  static void fts3
1dc00 53 6e 69 70 70 65 74 46 75 6e 63 28 0a 20 20 73  SnippetFunc(.  s
1dc10 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1dc20 70 43 6f 6e 74 65 78 74 2c 20 20 20 20 20 20 2f  pContext,      /
1dc30 2a 20 53 51 4c 69 74 65 20 66 75 6e 63 74 69 6f  * SQLite functio
1dc40 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
1dc50 2f 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 20 20 20  /.  int nVal,   
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
1dc80 70 56 61 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  pVal[] array */.
1dc90 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1dca0 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
1dcb0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
1dcc0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
1dcd0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
1dce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dcf0 2f 2a 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65  /* Cursor handle
1dd00 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
1dd10 61 70 56 61 6c 5b 30 5d 20 2a 2f 0a 20 20 63 6f  apVal[0] */.  co
1dd20 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74  nst char *zStart
1dd30 20 3d 20 22 3c 62 3e 22 3b 0a 20 20 63 6f 6e 73   = "<b>";.  cons
1dd40 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 22  t char *zEnd = "
1dd50 3c 2f 62 3e 22 3b 0a 20 20 63 6f 6e 73 74 20 63  </b>";.  const c
1dd60 68 61 72 20 2a 7a 45 6c 6c 69 70 73 69 73 20 3d  har *zEllipsis =
1dd70 20 22 3c 62 3e 2e 2e 2e 3c 2f 62 3e 22 3b 0a 20   "<b>...</b>";. 
1dd80 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
1dd90 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 31    int nToken = 1
1dda0 35 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5;              
1ddb0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 6e 75 6d    /* Default num
1ddc0 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e  ber of tokens in
1ddd0 20 73 6e 69 70 70 65 74 20 2a 2f 0a 0a 20 20 2f   snippet */..  /
1dde0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1ddf0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 61 72 67  at least one arg
1de00 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
1de10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 28 6f  this function (o
1de20 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 74 68  therwise.  ** th
1de30 65 20 6e 6f 6e 2d 6f 76 65 72 6c 6f 61 64 65 64  e non-overloaded
1de40 20 76 65 72 73 69 6f 6e 20 77 6f 75 6c 64 20 68   version would h
1de50 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ave been called 
1de60 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
1de70 6f 6e 65 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  one)..  */.  ass
1de80 65 72 74 28 20 6e 56 61 6c 3e 3d 31 20 29 3b 0a  ert( nVal>=1 );.
1de90 0a 20 20 69 66 28 20 6e 56 61 6c 3e 36 20 29 7b  .  if( nVal>6 ){
1dea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1deb0 75 6c 74 5f 65 72 72 6f 72 28 70 43 6f 6e 74 65  ult_error(pConte
1dec0 78 74 2c 20 0a 20 20 20 20 20 20 20 20 22 77 72  xt, .        "wr
1ded0 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
1dee0 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
1def0 69 6f 6e 20 73 6e 69 70 70 65 74 28 29 22 2c 20  ion snippet()", 
1df00 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
1df10 0a 20 20 7d 0a 20 20 69 66 28 20 66 74 73 33 46  .  }.  if( fts3F
1df20 75 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f 6e 74  unctionArg(pCont
1df30 65 78 74 2c 20 22 73 6e 69 70 70 65 74 22 2c 20  ext, "snippet", 
1df40 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73 72 29  apVal[0], &pCsr)
1df50 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 73 77   ) return;..  sw
1df60 69 74 63 68 28 20 6e 56 61 6c 20 29 7b 0a 20 20  itch( nVal ){.  
1df70 20 20 63 61 73 65 20 36 3a 20 6e 54 6f 6b 65 6e    case 6: nToken
1df80 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1df90 5f 69 6e 74 28 61 70 56 61 6c 5b 35 5d 29 3b 0a  _int(apVal[5]);.
1dfa0 20 20 20 20 63 61 73 65 20 35 3a 20 69 43 6f 6c      case 5: iCol
1dfb0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
1dfc0 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d 29 3b 0a  _int(apVal[4]);.
1dfd0 20 20 20 20 63 61 73 65 20 34 3a 20 7a 45 6c 6c      case 4: zEll
1dfe0 69 70 73 69 73 20 3d 20 28 63 6f 6e 73 74 20 63  ipsis = (const c
1dff0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1e000 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 33 5d  ue_text(apVal[3]
1e010 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7a  );.    case 3: z
1e020 45 6e 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  End = (const cha
1e030 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1e040 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
1e050 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7a 53 74  .    case 2: zSt
1e060 61 72 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  art = (const cha
1e070 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1e080 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b  _text(apVal[1]);
1e090 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 45 6c 6c  .  }.  if( !zEll
1e0a0 69 70 73 69 73 20 7c 7c 20 21 7a 45 6e 64 20 7c  ipsis || !zEnd |
1e0b0 7c 20 21 7a 53 74 61 72 74 20 29 7b 0a 20 20 20  | !zStart ){.   
1e0c0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1e0d0 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 6f 6e  error_nomem(pCon
1e0e0 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  text);.  }else i
1e0f0 66 28 20 6e 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a  f( nToken==0 ){.
1e100 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1e110 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74 65 78 74  lt_text(pContext
1e120 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , "", -1, SQLITE
1e130 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73  _STATIC);.  }els
1e140 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  e if( SQLITE_OK=
1e150 3d 66 74 73 33 43 75 72 73 6f 72 53 65 65 6b 28  =fts3CursorSeek(
1e160 70 43 6f 6e 74 65 78 74 2c 20 70 43 73 72 29 20  pContext, pCsr) 
1e170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1e180 73 33 53 6e 69 70 70 65 74 28 70 43 6f 6e 74 65  s3Snippet(pConte
1e190 78 74 2c 20 70 43 73 72 2c 20 7a 53 74 61 72 74  xt, pCsr, zStart
1e1a0 2c 20 7a 45 6e 64 2c 20 7a 45 6c 6c 69 70 73 69  , zEnd, zEllipsi
1e1b0 73 2c 20 69 43 6f 6c 2c 20 6e 54 6f 6b 65 6e 29  s, iCol, nToken)
1e1c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1e1d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1e1e0 20 74 68 65 20 6f 66 66 73 65 74 73 28 29 20 66   the offsets() f
1e1f0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 46 54 53 33  unction for FTS3
1e200 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e210 66 74 73 33 4f 66 66 73 65 74 73 46 75 6e 63 28  fts3OffsetsFunc(
1e220 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1e230 78 74 20 2a 70 43 6f 6e 74 65 78 74 2c 20 20 20  xt *pContext,   
1e240 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 75 6e     /* SQLite fun
1e250 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
1e260 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 6c  xt */.  int nVal
1e270 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e280 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e290 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72 61  of argument arra
1e2a0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  y */.  sqlite3_v
1e2b0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
1e2c0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1e2d0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1e2e0 29 7b 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20  ){.  Fts3Cursor 
1e2f0 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
1e300 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 68       /* Cursor h
1e310 61 6e 64 6c 65 20 70 61 73 73 65 64 20 74 68 72  andle passed thr
1e320 6f 75 67 68 20 61 70 56 61 6c 5b 30 5d 20 2a 2f  ough apVal[0] */
1e330 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1e340 45 54 45 52 28 6e 56 61 6c 29 3b 0a 0a 20 20 61  ETER(nVal);..  a
1e350 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d 31 20 29  ssert( nVal==1 )
1e360 3b 0a 20 20 69 66 28 20 66 74 73 33 46 75 6e 63  ;.  if( fts3Func
1e370 74 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65 78 74  tionArg(pContext
1e380 2c 20 22 6f 66 66 73 65 74 73 22 2c 20 61 70 56  , "offsets", apV
1e390 61 6c 5b 30 5d 2c 20 26 70 43 73 72 29 20 29 20  al[0], &pCsr) ) 
1e3a0 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
1e3b0 28 20 70 43 73 72 20 29 3b 0a 20 20 69 66 28 20  ( pCsr );.  if( 
1e3c0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 66 74 73 33 43  SQLITE_OK==fts3C
1e3d0 75 72 73 6f 72 53 65 65 6b 28 70 43 6f 6e 74 65  ursorSeek(pConte
1e3e0 78 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20 20  xt, pCsr) ){.   
1e3f0 20 73 71 6c 69 74 65 33 46 74 73 33 4f 66 66 73   sqlite3Fts3Offs
1e400 65 74 73 28 70 43 6f 6e 74 65 78 74 2c 20 70 43  ets(pContext, pC
1e410 73 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  sr);.  }.}../* .
1e420 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1e430 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  n of the special
1e440 20 6f 70 74 69 6d 69 7a 65 28 29 20 66 75 6e 63   optimize() func
1e450 74 69 6f 6e 20 66 6f 72 20 46 54 53 33 2e 20 54  tion for FTS3. T
1e460 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1e470 20 6d 65 72 67 65 73 20 61 6c 6c 20 73 65 67 6d   merges all segm
1e480 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
1e490 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  base to a single
1e4a0 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 20 45 78 61   segment..** Exa
1e4b0 6d 70 6c 65 20 75 73 61 67 65 20 69 73 3a 0a 2a  mple usage is:.*
1e4c0 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6f 70  *.**   SELECT op
1e4d0 74 69 6d 69 7a 65 28 74 29 20 46 52 4f 4d 20 74  timize(t) FROM t
1e4e0 20 4c 49 4d 49 54 20 31 3b 0a 2a 2a 0a 2a 2a 20   LIMIT 1;.**.** 
1e4f0 77 68 65 72 65 20 27 74 27 20 69 73 20 74 68 65  where 't' is the
1e500 20 6e 61 6d 65 20 6f 66 20 61 6e 20 46 54 53 33   name of an FTS3
1e510 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1e520 63 20 76 6f 69 64 20 66 74 73 33 4f 70 74 69 6d  c void fts3Optim
1e530 69 7a 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  izeFunc(.  sqlit
1e540 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e  e3_context *pCon
1e550 74 65 78 74 2c 20 20 20 20 20 20 2f 2a 20 53 51  text,      /* SQ
1e560 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 20 63 61  Lite function ca
1e570 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
1e580 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20  int nVal,       
1e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5a0 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d  /* Size of argum
1e5b0 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
1e5c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1e5d0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
1e5e0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
1e5f0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
1e600 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e620 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e630 20 46 74 73 33 54 61 62 6c 65 20 2a 70 3b 20 20   Fts3Table *p;  
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
1e660 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  e handle */.  Ft
1e670 73 33 43 75 72 73 6f 72 20 2a 70 43 75 72 73 6f  s3Cursor *pCurso
1e680 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
1e690 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 70   Cursor handle p
1e6a0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 61 70  assed through ap
1e6b0 56 61 6c 5b 30 5d 20 2a 2f 0a 0a 20 20 55 4e 55  Val[0] */..  UNU
1e6c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 56  SED_PARAMETER(nV
1e6d0 61 6c 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  al);..  assert( 
1e6e0 6e 56 61 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nVal==1 );.  if(
1e6f0 20 66 74 73 33 46 75 6e 63 74 69 6f 6e 41 72 67   fts3FunctionArg
1e700 28 70 43 6f 6e 74 65 78 74 2c 20 22 6f 70 74 69  (pContext, "opti
1e710 6d 69 7a 65 22 2c 20 61 70 56 61 6c 5b 30 5d 2c  mize", apVal[0],
1e720 20 26 70 43 75 72 73 6f 72 29 20 29 20 72 65 74   &pCursor) ) ret
1e730 75 72 6e 3b 0a 20 20 70 20 3d 20 28 46 74 73 33  urn;.  p = (Fts3
1e740 54 61 62 6c 65 20 2a 29 70 43 75 72 73 6f 72 2d  Table *)pCursor-
1e750 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 61  >base.pVtab;.  a
1e760 73 73 65 72 74 28 20 70 20 29 3b 0a 0a 20 20 72  ssert( p );..  r
1e770 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f  c = sqlite3Fts3O
1e780 70 74 69 6d 69 7a 65 28 70 29 3b 0a 0a 20 20 73  ptimize(p);..  s
1e790 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
1e7a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
1e7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1e7c0 65 73 75 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74  esult_text(pCont
1e7d0 65 78 74 2c 20 22 49 6e 64 65 78 20 6f 70 74 69  ext, "Index opti
1e7e0 6d 69 7a 65 64 22 2c 20 2d 31 2c 20 53 51 4c 49  mized", -1, SQLI
1e7f0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1e800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1e810 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 0a 20  e SQLITE_DONE:. 
1e820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
1e830 75 6c 74 5f 74 65 78 74 28 70 43 6f 6e 74 65 78  ult_text(pContex
1e840 74 2c 20 22 49 6e 64 65 78 20 61 6c 72 65 61 64  t, "Index alread
1e850 79 20 6f 70 74 69 6d 61 6c 22 2c 20 2d 31 2c 20  y optimal", -1, 
1e860 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1e870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e880 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1e890 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1e8a0 72 72 6f 72 5f 63 6f 64 65 28 70 43 6f 6e 74 65  rror_code(pConte
1e8b0 78 74 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 62  xt, rc);.      b
1e8c0 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
1e8d0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1e8e0 6e 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  n of the matchin
1e8f0 66 6f 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  fo() function fo
1e900 72 20 46 54 53 33 0a 2a 2f 0a 73 74 61 74 69 63  r FTS3.*/.static
1e910 20 76 6f 69 64 20 66 74 73 33 4d 61 74 63 68 69   void fts3Matchi
1e920 6e 66 6f 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  nfoFunc(.  sqlit
1e930 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 6f 6e  e3_context *pCon
1e940 74 65 78 74 2c 20 20 20 20 20 20 2f 2a 20 53 51  text,      /* SQ
1e950 4c 69 74 65 20 66 75 6e 63 74 69 6f 6e 20 63 61  Lite function ca
1e960 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
1e970 69 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20  int nVal,       
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 67 75 6d  /* Size of argum
1e9a0 65 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 73  ent array */.  s
1e9b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
1e9c0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
1e9d0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
1e9e0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ents */.){.  Fts
1e9f0 33 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20  3Cursor *pCsr;  
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea10 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 70 61  Cursor handle pa
1ea20 73 73 65 64 20 74 68 72 6f 75 67 68 20 61 70 56  ssed through apV
1ea30 61 6c 5b 30 5d 20 2a 2f 0a 20 20 61 73 73 65 72  al[0] */.  asser
1ea40 74 28 20 6e 56 61 6c 3d 3d 31 20 7c 7c 20 6e 56  t( nVal==1 || nV
1ea50 61 6c 3d 3d 32 20 29 3b 0a 20 20 69 66 28 20 53  al==2 );.  if( S
1ea60 51 4c 49 54 45 5f 4f 4b 3d 3d 66 74 73 33 46 75  QLITE_OK==fts3Fu
1ea70 6e 63 74 69 6f 6e 41 72 67 28 70 43 6f 6e 74 65  nctionArg(pConte
1ea80 78 74 2c 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c  xt, "matchinfo",
1ea90 20 61 70 56 61 6c 5b 30 5d 2c 20 26 70 43 73 72   apVal[0], &pCsr
1eaa0 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ) ){.    const c
1eab0 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20  har *zArg = 0;. 
1eac0 20 20 20 69 66 28 20 6e 56 61 6c 3e 31 20 29 7b     if( nVal>1 ){
1ead0 0a 20 20 20 20 20 20 7a 41 72 67 20 3d 20 28 63  .      zArg = (c
1eae0 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
1eaf0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1eb00 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 7d 0a  pVal[1]);.    }.
1eb10 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 4d      sqlite3Fts3M
1eb20 61 74 63 68 69 6e 66 6f 28 70 43 6f 6e 74 65 78  atchinfo(pContex
1eb30 74 2c 20 70 43 73 72 2c 20 7a 41 72 67 29 3b 0a  t, pCsr, zArg);.
1eb40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1eb50 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1eb60 65 6e 74 73 20 74 68 65 20 78 46 69 6e 64 46 75  ents the xFindFu
1eb70 6e 63 74 69 6f 6e 20 6d 65 74 68 6f 64 20 66 6f  nction method fo
1eb80 72 20 74 68 65 20 46 54 53 33 0a 2a 2a 20 76 69  r the FTS3.** vi
1eb90 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
1eba0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 46  static int fts3F
1ebb0 69 6e 64 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f  indFunctionMetho
1ebc0 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  d(.  sqlite3_vta
1ebd0 62 20 2a 70 56 74 61 62 2c 20 20 20 20 20 20 20  b *pVtab,       
1ebe0 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
1ebf0 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  table handle */.
1ec00 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
1ec30 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
1ec40 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ments */.  const
1ec50 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
1ec60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1ec70 6d 65 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  me of SQL functi
1ec80 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 2a  on */.  void (**
1ec90 70 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  pxFunc)(sqlite3_
1eca0 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
1ecb0 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 20 2f  ite3_value**), /
1ecc0 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
1ecd0 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41 72 67 20  .  void **ppArg 
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a     /* Unused */.
1ed00 29 7b 0a 20 20 73 74 72 75 63 74 20 4f 76 65 72  ){.  struct Over
1ed10 6c 6f 61 64 65 64 20 7b 0a 20 20 20 20 63 6f 6e  loaded {.    con
1ed20 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
1ed30 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63      void (*xFunc
1ed40 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
1ed50 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
1ed60 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 4f 76  alue**);.  } aOv
1ed70 65 72 6c 6f 61 64 5b 5d 20 3d 20 7b 0a 20 20 20  erload[] = {.   
1ed80 20 7b 20 22 73 6e 69 70 70 65 74 22 2c 20 66 74   { "snippet", ft
1ed90 73 33 53 6e 69 70 70 65 74 46 75 6e 63 20 7d 2c  s3SnippetFunc },
1eda0 0a 20 20 20 20 7b 20 22 6f 66 66 73 65 74 73 22  .    { "offsets"
1edb0 2c 20 66 74 73 33 4f 66 66 73 65 74 73 46 75 6e  , fts3OffsetsFun
1edc0 63 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 70 74 69  c },.    { "opti
1edd0 6d 69 7a 65 22 2c 20 66 74 73 33 4f 70 74 69 6d  mize", fts3Optim
1ede0 69 7a 65 46 75 6e 63 20 7d 2c 0a 20 20 20 20 7b  izeFunc },.    {
1edf0 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20 66 74   "matchinfo", ft
1ee00 73 33 4d 61 74 63 68 69 6e 66 6f 46 75 6e 63 20  s3MatchinfoFunc 
1ee10 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
1ee40 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
1ee50 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  /..  UNUSED_PARA
1ee60 4d 45 54 45 52 28 70 56 74 61 62 29 3b 0a 20 20  METER(pVtab);.  
1ee70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ee80 28 6e 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44  (nArg);.  UNUSED
1ee90 5f 50 41 52 41 4d 45 54 45 52 28 70 70 41 72 67  _PARAMETER(ppArg
1eea0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
1eeb0 3c 53 69 7a 65 6f 66 41 72 72 61 79 28 61 4f 76  <SizeofArray(aOv
1eec0 65 72 6c 6f 61 64 29 3b 20 69 2b 2b 29 7b 0a 20  erload); i++){. 
1eed0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
1eee0 61 6d 65 2c 20 61 4f 76 65 72 6c 6f 61 64 5b 69  ame, aOverload[i
1eef0 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
1ef00 20 20 20 20 20 2a 70 78 46 75 6e 63 20 3d 20 61       *pxFunc = a
1ef10 4f 76 65 72 6c 6f 61 64 5b 69 5d 2e 78 46 75 6e  Overload[i].xFun
1ef20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1ef30 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1ef40 2f 2a 20 4e 6f 20 66 75 6e 63 74 69 6f 6e 20 6f  /* No function o
1ef50 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1ef60 6e 61 6d 65 20 77 61 73 20 66 6f 75 6e 64 2e 20  name was found. 
1ef70 52 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72  Return 0. */.  r
1ef80 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1ef90 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1efa0 20 6f 66 20 46 54 53 33 20 78 52 65 6e 61 6d 65   of FTS3 xRename
1efb0 20 6d 65 74 68 6f 64 2e 20 52 65 6e 61 6d 65 20   method. Rename 
1efc0 61 6e 20 66 74 73 33 20 74 61 62 6c 65 2e 0a 2a  an fts3 table..*
1efd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1efe0 33 52 65 6e 61 6d 65 4d 65 74 68 6f 64 28 0a 20  3RenameMethod(. 
1eff0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
1f000 56 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  Vtab,           
1f010 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
1f020 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
1f030 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f050 20 4e 65 77 20 6e 61 6d 65 20 6f 66 20 74 61 62   New name of tab
1f060 6c 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54  le */.){.  Fts3T
1f070 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54  able *p = (Fts3T
1f080 61 62 6c 65 20 2a 29 70 56 74 61 62 3b 0a 20 20  able *)pVtab;.  
1f090 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1f0a0 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
1f0b0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1f0c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
1f0d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f0f0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20  eturn Code */.. 
1f100 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
1f110 74 20 69 74 20 6d 75 73 74 20 62 65 20 6b 6e 6f  t it must be kno
1f120 77 6e 20 69 66 20 74 68 65 20 25 5f 73 74 61 74  wn if the %_stat
1f130 20 74 61 62 6c 65 20 65 78 69 73 74 73 20 6f 72   table exists or
1f140 20 6e 6f 74 2e 0a 20 20 2a 2a 20 53 6f 20 62 48   not..  ** So bH
1f150 61 73 53 74 61 74 20 6d 61 79 20 6e 6f 74 20 62  asStat may not b
1f160 65 20 32 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e 2.  */.  rc = 
1f170 66 74 73 33 53 65 74 48 61 73 53 74 61 74 28 70  fts3SetHasStat(p
1f180 29 3b 0a 20 20 0a 20 20 2f 2a 20 41 73 20 69 74  );.  .  /* As it
1f190 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 65   happens, the pe
1f1a0 6e 64 69 6e 67 20 74 65 72 6d 73 20 74 61 62 6c  nding terms tabl
1f1b0 65 20 69 73 20 61 6c 77 61 79 73 20 65 6d 70 74  e is always empt
1f1c0 79 20 68 65 72 65 2e 20 54 68 69 73 20 69 73 0a  y here. This is.
1f1d0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 61 6e 20    ** because an 
1f1e0 22 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e  "ALTER TABLE REN
1f1f0 41 4d 45 20 54 41 42 4c 45 22 20 73 74 61 74 65  AME TABLE" state
1f200 6d 65 6e 74 20 69 6e 73 69 64 65 20 61 20 74 72  ment inside a tr
1f210 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
1f220 61 6c 77 61 79 73 20 6f 70 65 6e 73 20 61 20 73  always opens a s
1f230 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
1f240 74 69 6f 6e 2e 20 41 6e 64 20 74 68 65 20 78 53  tion. And the xS
1f250 61 76 65 70 6f 69 6e 74 28 29 20 6d 65 74 68 6f  avepoint() metho
1f260 64 20 0a 20 20 2a 2a 20 66 6c 75 73 68 65 73 20  d .  ** flushes 
1f270 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d  the pending term
1f280 73 20 74 61 62 6c 65 2e 20 42 75 74 20 6c 65 61  s table. But lea
1f290 76 65 20 74 68 65 20 28 6e 6f 2d 6f 70 29 20 63  ve the (no-op) c
1f2a0 61 6c 6c 20 74 6f 0a 20 20 2a 2a 20 50 65 6e 64  all to.  ** Pend
1f2b0 69 6e 67 54 65 72 6d 73 46 6c 75 73 68 28 29 20  ingTermsFlush() 
1f2c0 69 6e 20 69 6e 20 63 61 73 65 20 74 68 61 74 20  in in case that 
1f2d0 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
1f2e0 61 73 73 65 72 74 28 20 70 2d 3e 6e 50 65 6e 64  assert( p->nPend
1f2f0 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  ingData==0 );.  
1f300 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f310 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1f320 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67  lite3Fts3Pending
1f330 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20  TermsFlush(p);. 
1f340 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f   }..  if( p->zCo
1f350 6e 74 65 6e 74 54 62 6c 3d 3d 30 20 29 7b 0a 20  ntentTbl==0 ){. 
1f360 20 20 20 66 74 73 33 44 62 45 78 65 63 28 26 72     fts3DbExec(&r
1f370 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 22 41 4c  c, db,.      "AL
1f380 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25 71  TER TABLE %Q.'%q
1f390 5f 63 6f 6e 74 65 6e 74 27 20 20 52 45 4e 41 4d  _content'  RENAM
1f3a0 45 20 54 4f 20 27 25 71 5f 63 6f 6e 74 65 6e 74  E TO '%q_content
1f3b0 27 3b 22 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 44  ';",.      p->zD
1f3c0 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  b, p->zName, zNa
1f3d0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  me.    );.  }.. 
1f3e0 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73   if( p->bHasDocs
1f3f0 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33 44  ize ){.    fts3D
1f400 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
1f410 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c       "ALTER TABL
1f420 45 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65  E %Q.'%q_docsize
1f430 27 20 20 52 45 4e 41 4d 45 20 54 4f 20 27 25 71  '  RENAME TO '%q
1f440 5f 64 6f 63 73 69 7a 65 27 3b 22 2c 0a 20 20 20  _docsize';",.   
1f450 20 20 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e     p->zDb, p->zN
1f460 61 6d 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29  ame, zName.    )
1f470 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 62  ;.  }.  if( p->b
1f480 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 66  HasStat ){.    f
1f490 74 73 33 44 62 45 78 65 63 28 26 72 63 2c 20 64  ts3DbExec(&rc, d
1f4a0 62 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52 20  b,.      "ALTER 
1f4b0 54 41 42 4c 45 20 25 51 2e 27 25 71 5f 73 74 61  TABLE %Q.'%q_sta
1f4c0 74 27 20 20 52 45 4e 41 4d 45 20 54 4f 20 27 25  t'  RENAME TO '%
1f4d0 71 5f 73 74 61 74 27 3b 22 2c 0a 20 20 20 20 20  q_stat';",.     
1f4e0 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d   p->zDb, p->zNam
1f4f0 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  e, zName.    );.
1f500 20 20 7d 0a 20 20 66 74 73 33 44 62 45 78 65 63    }.  fts3DbExec
1f510 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 22 41  (&rc, db,.    "A
1f520 4c 54 45 52 20 54 41 42 4c 45 20 25 51 2e 27 25  LTER TABLE %Q.'%
1f530 71 5f 73 65 67 6d 65 6e 74 73 27 20 52 45 4e 41  q_segments' RENA
1f540 4d 45 20 54 4f 20 27 25 71 5f 73 65 67 6d 65 6e  ME TO '%q_segmen
1f550 74 73 27 3b 22 2c 0a 20 20 20 20 70 2d 3e 7a 44  ts';",.    p->zD
1f560 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  b, p->zName, zNa
1f570 6d 65 0a 20 20 29 3b 0a 20 20 66 74 73 33 44 62  me.  );.  fts3Db
1f580 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20  Exec(&rc, db,.  
1f590 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 25    "ALTER TABLE %
1f5a0 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 20 20  Q.'%q_segdir'   
1f5b0 52 45 4e 41 4d 45 20 54 4f 20 27 25 71 5f 73 65  RENAME TO '%q_se
1f5c0 67 64 69 72 27 3b 22 2c 0a 20 20 20 20 70 2d 3e  gdir';",.    p->
1f5d0 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a  zDb, p->zName, z
1f5e0 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 72 65 74 75  Name.  );.  retu
1f5f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f600 54 68 65 20 78 53 61 76 65 70 6f 69 6e 74 28 29  The xSavepoint()
1f610 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 46   method..**.** F
1f620 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
1f630 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
1f640 2d 74 65 72 6d 73 20 74 61 62 6c 65 20 74 6f 20  -terms table to 
1f650 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
1f660 69 6e 74 20 66 74 73 33 53 61 76 65 70 6f 69 6e  int fts3Savepoin
1f670 74 4d 65 74 68 6f 64 28 73 71 6c 69 74 65 33 5f  tMethod(sqlite3_
1f680 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69 6e 74  vtab *pVtab, int
1f690 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1f6a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f6b0 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
1f6c0 41 4d 45 54 45 52 28 69 53 61 76 65 70 6f 69 6e  AMETER(iSavepoin
1f6d0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  t);.  assert( ((
1f6e0 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61  Fts3Table *)pVta
1f6f0 62 29 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  b)->inTransactio
1f700 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  n );.  assert( (
1f710 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74  (Fts3Table *)pVt
1f720 61 62 29 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74  ab)->mxSavepoint
1f730 20 3c 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b   < iSavepoint );
1f740 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 28 28 46  .  TESTONLY( ((F
1f750 74 73 33 54 61 62 6c 65 20 2a 29 70 56 74 61 62  ts3Table *)pVtab
1f760 29 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d  )->mxSavepoint =
1f770 20 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20   iSavepoint );. 
1f780 20 69 66 28 20 28 28 46 74 73 33 54 61 62 6c 65   if( ((Fts3Table
1f790 20 2a 29 70 56 74 61 62 29 2d 3e 62 49 67 6e 6f   *)pVtab)->bIgno
1f7a0 72 65 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29  reSavepoint==0 )
1f7b0 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53  {.    rc = fts3S
1f7c0 79 6e 63 4d 65 74 68 6f 64 28 70 56 74 61 62 29  yncMethod(pVtab)
1f7d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f7e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
1f7f0 78 52 65 6c 65 61 73 65 28 29 20 6d 65 74 68 6f  xRelease() metho
1f800 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
1f810 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1f820 74 69 63 20 69 6e 74 20 66 74 73 33 52 65 6c 65  tic int fts3Rele
1f830 61 73 65 4d 65 74 68 6f 64 28 73 71 6c 69 74 65  aseMethod(sqlite
1f840 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 69  3_vtab *pVtab, i
1f850 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
1f860 20 20 54 45 53 54 4f 4e 4c 59 28 20 46 74 73 33    TESTONLY( Fts3
1f870 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74 73 33  Table *p = (Fts3
1f880 54 61 62 6c 65 2a 29 70 56 74 61 62 20 29 3b 0a  Table*)pVtab );.
1f890 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f8a0 45 52 28 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  ER(iSavepoint);.
1f8b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f8c0 45 52 28 70 56 74 61 62 29 3b 0a 20 20 61 73 73  ER(pVtab);.  ass
1f8d0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  ert( p->inTransa
1f8e0 63 74 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72  ction );.  asser
1f8f0 74 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e  t( p->mxSavepoin
1f900 74 20 3e 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  t >= iSavepoint 
1f910 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70  );.  TESTONLY( p
1f920 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20  ->mxSavepoint = 
1f930 69 53 61 76 65 70 6f 69 6e 74 2d 31 20 29 3b 0a  iSavepoint-1 );.
1f940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f950 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1f960 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 28 29 20 6d   xRollbackTo() m
1f970 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  ethod..**.** Dis
1f980 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
1f990 73 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  s of the pending
1f9a0 20 74 65 72 6d 73 20 74 61 62 6c 65 2e 0a 2a 2f   terms table..*/
1f9b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
1f9c0 52 6f 6c 6c 62 61 63 6b 54 6f 4d 65 74 68 6f 64  RollbackToMethod
1f9d0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
1f9e0 56 74 61 62 2c 20 69 6e 74 20 69 53 61 76 65 70  Vtab, int iSavep
1f9f0 6f 69 6e 74 29 7b 0a 20 20 46 74 73 33 54 61 62  oint){.  Fts3Tab
1fa00 6c 65 20 2a 70 20 3d 20 28 46 74 73 33 54 61 62  le *p = (Fts3Tab
1fa10 6c 65 2a 29 70 56 74 61 62 3b 0a 20 20 55 4e 55  le*)pVtab;.  UNU
1fa20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 53  SED_PARAMETER(iS
1fa30 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 61 73 73  avepoint);.  ass
1fa40 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 61  ert( p->inTransa
1fa50 63 74 69 6f 6e 20 29 3b 0a 20 20 61 73 73 65 72  ction );.  asser
1fa60 74 28 20 70 2d 3e 6d 78 53 61 76 65 70 6f 69 6e  t( p->mxSavepoin
1fa70 74 20 3e 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  t >= iSavepoint 
1fa80 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 70  );.  TESTONLY( p
1fa90 2d 3e 6d 78 53 61 76 65 70 6f 69 6e 74 20 3d 20  ->mxSavepoint = 
1faa0 69 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  iSavepoint );.  
1fab0 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69  sqlite3Fts3Pendi
1fac0 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b  ngTermsClear(p);
1fad0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fae0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  _OK;.}..static c
1faf0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
1fb00 75 6c 65 20 66 74 73 33 4d 6f 64 75 6c 65 20 3d  ule fts3Module =
1fb10 20 7b 0a 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e   {.  /* iVersion
1fb20 20 20 20 20 20 20 2a 2f 20 32 2c 0a 20 20 2f 2a        */ 2,.  /*
1fb30 20 78 43 72 65 61 74 65 20 20 20 20 20 20 20 2a   xCreate       *
1fb40 2f 20 66 74 73 33 43 72 65 61 74 65 4d 65 74 68  / fts3CreateMeth
1fb50 6f 64 2c 0a 20 20 2f 2a 20 78 43 6f 6e 6e 65 63  od,.  /* xConnec
1fb60 74 20 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6f  t      */ fts3Co
1fb70 6e 6e 65 63 74 4d 65 74 68 6f 64 2c 0a 20 20 2f  nnectMethod,.  /
1fb80 2a 20 78 42 65 73 74 49 6e 64 65 78 20 20 20 20  * xBestIndex    
1fb90 2a 2f 20 66 74 73 33 42 65 73 74 49 6e 64 65 78  */ fts3BestIndex
1fba0 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 44 69  Method,.  /* xDi
1fbb0 73 63 6f 6e 6e 65 63 74 20 20 20 2a 2f 20 66 74  sconnect   */ ft
1fbc0 73 33 44 69 73 63 6f 6e 6e 65 63 74 4d 65 74 68  s3DisconnectMeth
1fbd0 6f 64 2c 0a 20 20 2f 2a 20 78 44 65 73 74 72 6f  od,.  /* xDestro
1fbe0 79 20 20 20 20 20 20 2a 2f 20 66 74 73 33 44 65  y      */ fts3De
1fbf0 73 74 72 6f 79 4d 65 74 68 6f 64 2c 0a 20 20 2f  stroyMethod,.  /
1fc00 2a 20 78 4f 70 65 6e 20 20 20 20 20 20 20 20 20  * xOpen         
1fc10 2a 2f 20 66 74 73 33 4f 70 65 6e 4d 65 74 68 6f  */ fts3OpenMetho
1fc20 64 2c 0a 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20  d,.  /* xClose  
1fc30 20 20 20 20 20 20 2a 2f 20 66 74 73 33 43 6c 6f        */ fts3Clo
1fc40 73 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78  seMethod,.  /* x
1fc50 46 69 6c 74 65 72 20 20 20 20 20 20 20 2a 2f 20  Filter       */ 
1fc60 66 74 73 33 46 69 6c 74 65 72 4d 65 74 68 6f 64  fts3FilterMethod
1fc70 2c 0a 20 20 2f 2a 20 78 4e 65 78 74 20 20 20 20  ,.  /* xNext    
1fc80 20 20 20 20 20 2a 2f 20 66 74 73 33 4e 65 78 74       */ fts3Next
1fc90 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 45 6f  Method,.  /* xEo
1fca0 66 20 20 20 20 20 20 20 20 20 20 2a 2f 20 66 74  f          */ ft
1fcb0 73 33 45 6f 66 4d 65 74 68 6f 64 2c 0a 20 20 2f  s3EofMethod,.  /
1fcc0 2a 20 78 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  * xColumn       
1fcd0 2a 2f 20 66 74 73 33 43 6f 6c 75 6d 6e 4d 65 74  */ fts3ColumnMet
1fce0 68 6f 64 2c 0a 20 20 2f 2a 20 78 52 6f 77 69 64  hod,.  /* xRowid
1fcf0 20 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 52          */ fts3R
1fd00 6f 77 69 64 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a  owidMethod,.  /*
1fd10 20 78 55 70 64 61 74 65 20 20 20 20 20 20 20 2a   xUpdate       *
1fd20 2f 20 66 74 73 33 55 70 64 61 74 65 4d 65 74 68  / fts3UpdateMeth
1fd30 6f 64 2c 0a 20 20 2f 2a 20 78 42 65 67 69 6e 20  od,.  /* xBegin 
1fd40 20 20 20 20 20 20 20 2a 2f 20 66 74 73 33 42 65         */ fts3Be
1fd50 67 69 6e 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20  ginMethod,.  /* 
1fd60 78 53 79 6e 63 20 20 20 20 20 20 20 20 20 2a 2f  xSync         */
1fd70 20 66 74 73 33 53 79 6e 63 4d 65 74 68 6f 64 2c   fts3SyncMethod,
1fd80 0a 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 20 20  .  /* xCommit   
1fd90 20 20 20 20 2a 2f 20 66 74 73 33 43 6f 6d 6d 69      */ fts3Commi
1fda0 74 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 52  tMethod,.  /* xR
1fdb0 6f 6c 6c 62 61 63 6b 20 20 20 20 20 2a 2f 20 66  ollback     */ f
1fdc0 74 73 33 52 6f 6c 6c 62 61 63 6b 4d 65 74 68 6f  ts3RollbackMetho
1fdd0 64 2c 0a 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e  d,.  /* xFindFun
1fde0 63 74 69 6f 6e 20 2a 2f 20 66 74 73 33 46 69 6e  ction */ fts3Fin
1fdf0 64 46 75 6e 63 74 69 6f 6e 4d 65 74 68 6f 64 2c  dFunctionMethod,
1fe00 0a 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f  .  /* xRename */
1fe10 20 20 20 20 20 20 20 66 74 73 33 52 65 6e 61 6d         fts3Renam
1fe20 65 4d 65 74 68 6f 64 2c 0a 20 20 2f 2a 20 78 53  eMethod,.  /* xS
1fe30 61 76 65 70 6f 69 6e 74 20 20 20 20 2a 2f 20 66  avepoint    */ f
1fe40 74 73 33 53 61 76 65 70 6f 69 6e 74 4d 65 74 68  ts3SavepointMeth
1fe50 6f 64 2c 0a 20 20 2f 2a 20 78 52 65 6c 65 61 73  od,.  /* xReleas
1fe60 65 20 20 20 20 20 20 2a 2f 20 66 74 73 33 52 65  e      */ fts3Re
1fe70 6c 65 61 73 65 4d 65 74 68 6f 64 2c 0a 20 20 2f  leaseMethod,.  /
1fe80 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 20 20  * xRollbackTo   
1fe90 2a 2f 20 66 74 73 33 52 6f 6c 6c 62 61 63 6b 54  */ fts3RollbackT
1fea0 6f 4d 65 74 68 6f 64 2c 0a 7d 3b 0a 0a 2f 2a 0a  oMethod,.};../*.
1feb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1fec0 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
1fed0 73 20 74 68 65 20 6d 6f 64 75 6c 65 20 64 65 73  s the module des
1fee0 74 72 75 63 74 6f 72 20 28 63 61 6c 6c 65 64 20  tructor (called 
1fef0 77 68 65 6e 20 61 6e 0a 2a 2a 20 46 54 53 33 20  when an.** FTS3 
1ff00 65 6e 61 62 6c 65 64 20 64 61 74 61 62 61 73 65  enabled database
1ff10 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
1ff20 6c 6f 73 65 64 29 2e 20 49 74 20 66 72 65 65 73  losed). It frees
1ff30 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61   the memory.** a
1ff40 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1ff50 20 74 6f 6b 65 6e 69 7a 65 72 20 68 61 73 68 20   tokenizer hash 
1ff60 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1ff70 20 76 6f 69 64 20 68 61 73 68 44 65 73 74 72 6f   void hashDestro
1ff80 79 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 46 74  y(void *p){.  Ft
1ff90 73 33 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s3Hash *pHash = 
1ffa0 28 46 74 73 33 48 61 73 68 20 2a 29 70 3b 0a 20  (Fts3Hash *)p;. 
1ffb0 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73 68   sqlite3Fts3Hash
1ffc0 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
1ffd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 61  sqlite3_free(pHa
1ffe0 73 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  sh);.}../*.** Th
1fff0 65 20 66 74 73 33 20 62 75 69 6c 74 2d 69 6e 20  e fts3 built-in 
20000 74 6f 6b 65 6e 69 7a 65 72 73 20 2d 20 22 73 69  tokenizers - "si
20010 6d 70 6c 65 22 2c 20 22 70 6f 72 74 65 72 22 20  mple", "porter" 
20020 61 6e 64 20 22 69 63 75 22 2d 20 61 72 65 20 0a  and "icu"- are .
20030 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  ** implemented i
20040 6e 20 66 69 6c 65 73 20 66 74 73 33 5f 74 6f 6b  n files fts3_tok
20050 65 6e 69 7a 65 72 31 2e 63 2c 20 66 74 73 33 5f  enizer1.c, fts3_
20060 70 6f 72 74 65 72 2e 63 20 61 6e 64 20 66 74 73  porter.c and fts
20070 33 5f 69 63 75 2e 63 0a 2a 2a 20 72 65 73 70 65  3_icu.c.** respe
20080 63 74 69 76 65 6c 79 2e 20 54 68 65 20 66 6f 6c  ctively. The fol
20090 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 6f 72  lowing three for
200a0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
200b0 73 20 61 72 65 20 66 6f 72 20 66 75 6e 63 74 69  s are for functi
200c0 6f 6e 73 0a 2a 2a 20 64 65 63 6c 61 72 65 64 20  ons.** declared 
200d0 69 6e 20 74 68 65 73 65 20 66 69 6c 65 73 20 75  in these files u
200e0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
200f0 74 68 65 20 72 65 73 70 65 63 74 69 76 65 20 69  the respective i
20100 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
20110 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 73 71  **.** Calling sq
20120 6c 69 74 65 33 46 74 73 33 53 69 6d 70 6c 65 54  lite3Fts3SimpleT
20130 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 29  okenizerModule()
20140 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
20150 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
20160 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
20170 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 22 73   point to the "s
20180 69 6d 70 6c 65 22 20 74 6f 6b 65 6e 69 7a 65 72  imple" tokenizer
20190 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
201a0 0a 2a 2a 20 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a  .** And so on..*
201b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
201c0 73 33 53 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65  s3SimpleTokenize
201d0 72 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f  rModule(sqlite3_
201e0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
201f0 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65   const**ppModule
20200 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  );.void sqlite3F
20210 74 73 33 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  ts3PorterTokeniz
20220 65 72 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33  erModule(sqlite3
20230 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
20240 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c  e const**ppModul
20250 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
20260 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 33 5f  TE_DISABLE_FTS3_
20270 55 4e 49 43 4f 44 45 0a 76 6f 69 64 20 73 71 6c  UNICODE.void sql
20280 69 74 65 33 46 74 73 33 55 6e 69 63 6f 64 65 54  ite3Fts3UnicodeT
20290 6f 6b 65 6e 69 7a 65 72 28 73 71 6c 69 74 65 33  okenizer(sqlite3
202a0 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c  _tokenizer_modul
202b0 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c  e const**ppModul
202c0 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  e);.#endif.#ifde
202d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
202e0 49 43 55 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ICU.void sqlite3
202f0 46 74 73 33 49 63 75 54 6f 6b 65 6e 69 7a 65 72  Fts3IcuTokenizer
20300 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65 33 5f 74  Module(sqlite3_t
20310 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
20320 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75 6c 65 29  const**ppModule)
20330 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
20340 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
20350 74 73 33 20 65 78 74 65 6e 73 69 6f 6e 2e 20 49  ts3 extension. I
20360 66 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  f this extension
20370 20 69 73 20 62 75 69 6c 74 20 61 73 20 70 61 72   is built as par
20380 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69  t.** of the sqli
20390 74 65 20 6c 69 62 72 61 72 79 2c 20 74 68 65 6e  te library, then
203a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
203b0 73 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c  s called directl
203c0 79 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  y by.** SQLite. 
203d0 49 66 20 66 74 73 33 20 69 73 20 62 75 69 6c 74  If fts3 is built
203e0 20 61 73 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   as a dynamicall
203f0 79 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  y loadable exten
20400 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75  sion, this.** fu
20410 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20420 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
20430 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 29  extension_init()
20440 20 65 6e 74 72 79 20 70 6f 69 6e 74 2e 0a 2a 2f   entry point..*/
20450 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
20460 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Init(sqlite3 *db
20470 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20480 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 33 48  LITE_OK;.  Fts3H
20490 61 73 68 20 2a 70 48 61 73 68 20 3d 20 30 3b 0a  ash *pHash = 0;.
204a0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
204b0 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
204c0 20 2a 70 53 69 6d 70 6c 65 20 3d 20 30 3b 0a 20   *pSimple = 0;. 
204d0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
204e0 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
204f0 2a 70 50 6f 72 74 65 72 20 3d 20 30 3b 0a 23 69  *pPorter = 0;.#i
20500 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
20510 41 42 4c 45 5f 46 54 53 33 5f 55 4e 49 43 4f 44  ABLE_FTS3_UNICOD
20520 45 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  E.  const sqlite
20530 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
20540 6c 65 20 2a 70 55 6e 69 63 6f 64 65 20 3d 20 30  le *pUnicode = 0
20550 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
20560 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
20570 43 55 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  CU.  const sqlit
20580 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
20590 75 6c 65 20 2a 70 49 63 75 20 3d 20 30 3b 0a 20  ule *pIcu = 0;. 
205a0 20 73 71 6c 69 74 65 33 46 74 73 33 49 63 75 54   sqlite3Fts3IcuT
205b0 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 26  okenizerModule(&
205c0 70 49 63 75 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  pIcu);.#endif..#
205d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
205e0 53 41 42 4c 45 5f 46 54 53 33 5f 55 4e 49 43 4f  SABLE_FTS3_UNICO
205f0 44 45 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33  DE.  sqlite3Fts3
20600 55 6e 69 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 72  UnicodeTokenizer
20610 28 26 70 55 6e 69 63 6f 64 65 29 3b 0a 23 65 6e  (&pUnicode);.#en
20620 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
20630 54 45 5f 54 45 53 54 0a 20 20 72 63 20 3d 20 73  TE_TEST.  rc = s
20640 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 54 65  qlite3Fts3InitTe
20650 72 6d 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  rm(db);.  if( rc
20660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
20670 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
20680 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
20690 74 73 33 49 6e 69 74 41 75 78 28 64 62 29 3b 0a  ts3InitAux(db);.
206a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
206b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
206c0 0a 0a 20 20 73 71 6c 69 74 65 33 46 74 73 33 53  ..  sqlite3Fts3S
206d0 69 6d 70 6c 65 54 6f 6b 65 6e 69 7a 65 72 4d 6f  impleTokenizerMo
206e0 64 75 6c 65 28 26 70 53 69 6d 70 6c 65 29 3b 0a  dule(&pSimple);.
206f0 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 6f 72    sqlite3Fts3Por
20700 74 65 72 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  terTokenizerModu
20710 6c 65 28 26 70 50 6f 72 74 65 72 29 3b 0a 0a 20  le(&pPorter);.. 
20720 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
20730 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
20740 68 61 73 68 2d 74 61 62 6c 65 20 75 73 65 64 20  hash-table used 
20750 74 6f 20 73 74 6f 72 65 20 74 6f 6b 65 6e 69 7a  to store tokeniz
20760 65 72 73 2e 20 2a 2f 0a 20 20 70 48 61 73 68 20  ers. */.  pHash 
20770 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
20780 28 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68  (sizeof(Fts3Hash
20790 29 29 3b 0a 20 20 69 66 28 20 21 70 48 61 73 68  ));.  if( !pHash
207a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
207b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
207c0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  se{.    sqlite3F
207d0 74 73 33 48 61 73 68 49 6e 69 74 28 70 48 61 73  ts3HashInit(pHas
207e0 68 2c 20 46 54 53 33 5f 48 41 53 48 5f 53 54 52  h, FTS3_HASH_STR
207f0 49 4e 47 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  ING, 1);.  }..  
20800 2f 2a 20 4c 6f 61 64 20 74 68 65 20 62 75 69 6c  /* Load the buil
20810 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 73 20  t-in tokenizers 
20820 69 6e 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  into the hash ta
20830 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ble */.  if( rc=
20840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20850 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
20860 33 48 61 73 68 49 6e 73 65 72 74 28 70 48 61 73  3HashInsert(pHas
20870 68 2c 20 22 73 69 6d 70 6c 65 22 2c 20 37 2c 20  h, "simple", 7, 
20880 28 76 6f 69 64 20 2a 29 70 53 69 6d 70 6c 65 29  (void *)pSimple)
20890 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  .     || sqlite3
208a0 46 74 73 33 48 61 73 68 49 6e 73 65 72 74 28 70  Fts3HashInsert(p
208b0 48 61 73 68 2c 20 22 70 6f 72 74 65 72 22 2c 20  Hash, "porter", 
208c0 37 2c 20 28 76 6f 69 64 20 2a 29 70 50 6f 72 74  7, (void *)pPort
208d0 65 72 29 20 0a 0a 23 69 66 6e 64 65 66 20 53 51  er) ..#ifndef SQ
208e0 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53  LITE_DISABLE_FTS
208f0 33 5f 55 4e 49 43 4f 44 45 0a 20 20 20 20 20 7c  3_UNICODE.     |
20900 7c 20 73 71 6c 69 74 65 33 46 74 73 33 48 61 73  | sqlite3Fts3Has
20910 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 22  hInsert(pHash, "
20920 75 6e 69 63 6f 64 65 36 31 22 2c 20 31 30 2c 20  unicode61", 10, 
20930 28 76 6f 69 64 20 2a 29 70 55 6e 69 63 6f 64 65  (void *)pUnicode
20940 29 20 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  ) .#endif.#ifdef
20950 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
20960 43 55 0a 20 20 20 20 20 7c 7c 20 28 70 49 63 75  CU.     || (pIcu
20970 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 33 48   && sqlite3Fts3H
20980 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
20990 20 22 69 63 75 22 2c 20 34 2c 20 28 76 6f 69 64   "icu", 4, (void
209a0 20 2a 29 70 49 63 75 29 29 0a 23 65 6e 64 69 66   *)pIcu)).#endif
209b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
209c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
209d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
209e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
209f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20a00 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
20a10 71 6c 69 74 65 33 46 74 73 33 45 78 70 72 49 6e  qlite3Fts3ExprIn
20a20 69 74 54 65 73 74 49 6e 74 65 72 66 61 63 65 28  itTestInterface(
20a30 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
20a40 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
20a50 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
20a60 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68  rapper around th
20a70 65 20 68 61 73 68 2d 74 61 62 6c 65 20 61 6e 64  e hash-table and
20a80 20 6f 76 65 72 6c 6f 61 64 20 0a 20 20 2a 2a 20   overload .  ** 
20a90 74 68 65 20 74 77 6f 20 73 63 61 6c 61 72 20 66  the two scalar f
20aa0 75 6e 63 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  unctions. If thi
20ab0 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
20ac0 20 72 65 67 69 73 74 65 72 20 74 68 65 0a 20 20   register the.  
20ad0 2a 2a 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 73  ** module with s
20ae0 71 6c 69 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  qlite..  */.  if
20af0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
20b00 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  .   && SQLITE_OK
20b10 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46  ==(rc = sqlite3F
20b20 74 73 33 49 6e 69 74 48 61 73 68 54 61 62 6c 65  ts3InitHashTable
20b30 28 64 62 2c 20 70 48 61 73 68 2c 20 22 66 74 73  (db, pHash, "fts
20b40 33 5f 74 6f 6b 65 6e 69 7a 65 72 22 29 29 0a 20  3_tokenizer")). 
20b50 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d    && SQLITE_OK==
20b60 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76  (rc = sqlite3_ov
20b70 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
20b80 64 62 2c 20 22 73 6e 69 70 70 65 74 22 2c 20 2d  db, "snippet", -
20b90 31 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  1)).   && SQLITE
20ba0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
20bb0 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
20bc0 74 69 6f 6e 28 64 62 2c 20 22 6f 66 66 73 65 74  tion(db, "offset
20bd0 73 22 2c 20 31 29 29 0a 20 20 20 26 26 20 53 51  s", 1)).   && SQ
20be0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
20bf0 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
20c00 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6d 61  function(db, "ma
20c10 74 63 68 69 6e 66 6f 22 2c 20 31 29 29 0a 20 20  tchinfo", 1)).  
20c20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
20c30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 76 65  rc = sqlite3_ove
20c40 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 64  rload_function(d
20c50 62 2c 20 22 6d 61 74 63 68 69 6e 66 6f 22 2c 20  b, "matchinfo", 
20c60 32 29 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  2)).   && SQLITE
20c70 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
20c80 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
20c90 74 69 6f 6e 28 64 62 2c 20 22 6f 70 74 69 6d 69  tion(db, "optimi
20ca0 7a 65 22 2c 20 31 29 29 0a 20 20 29 7b 0a 20 20  ze", 1)).  ){.  
20cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
20cc0 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32 28  reate_module_v2(
20cd0 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
20ce0 73 33 22 2c 20 26 66 74 73 33 4d 6f 64 75 6c 65  s3", &fts3Module
20cf0 2c 20 28 76 6f 69 64 20 2a 29 70 48 61 73 68 2c  , (void *)pHash,
20d00 20 68 61 73 68 44 65 73 74 72 6f 79 0a 20 20 20   hashDestroy.   
20d10 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
20d20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
20d40 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 5f 76 32  create_module_v2
20d50 28 0a 20 20 20 20 20 20 20 20 20 20 64 62 2c 20  (.          db, 
20d60 22 66 74 73 34 22 2c 20 26 66 74 73 33 4d 6f 64  "fts4", &fts3Mod
20d70 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29 70 48 61  ule, (void *)pHa
20d80 73 68 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  sh, 0.      );. 
20d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
20da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20dc0 46 74 73 33 49 6e 69 74 54 6f 6b 28 64 62 2c 20  Fts3InitTok(db, 
20dd0 28 76 6f 69 64 20 2a 29 70 48 61 73 68 29 3b 0a  (void *)pHash);.
20de0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
20df0 20 72 63 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20   rc;.  }...  /* 
20e00 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
20e10 75 72 72 65 64 2e 20 44 65 6c 65 74 65 20 74 68  urred. Delete th
20e20 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  e hash table and
20e30 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
20e40 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 61 73 73  r code. */.  ass
20e50 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
20e60 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 48 61 73  OK );.  if( pHas
20e70 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
20e80 46 74 73 33 48 61 73 68 43 6c 65 61 72 28 70 48  Fts3HashClear(pH
20e90 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ash);.    sqlite
20ea0 33 5f 66 72 65 65 28 70 48 61 73 68 29 3b 0a 20  3_free(pHash);. 
20eb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
20ed0 65 20 61 6e 20 46 74 73 33 4d 75 6c 74 69 53 65  e an Fts3MultiSe
20ee0 67 52 65 61 64 65 72 20 66 6f 72 20 65 61 63 68  gReader for each
20ef0 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 65 78   token in the ex
20f00 70 72 65 73 73 69 6f 6e 20 68 65 61 64 65 64 0a  pression headed.
20f10 2a 2a 20 62 79 20 70 45 78 70 72 2e 20 0a 2a 2a  ** by pExpr. .**
20f20 0a 2a 2a 20 41 6e 20 46 74 73 33 53 65 67 52 65  .** An Fts3SegRe
20f30 61 64 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ader object is a
20f40 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 61 6e   cursor that can
20f50 20 73 65 65 6b 20 6f 72 20 73 63 61 6e 20 61 20   seek or scan a 
20f60 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 65 6e 74 72  range of.** entr
20f70 69 65 73 20 77 69 74 68 69 6e 20 61 20 73 69 6e  ies within a sin
20f80 67 6c 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  gle segment b-tr
20f90 65 65 2e 20 41 6e 20 46 74 73 33 4d 75 6c 74 69  ee. An Fts3Multi
20fa0 53 65 67 52 65 61 64 65 72 20 75 73 65 73 20 6d  SegReader uses m
20fb0 75 6c 74 69 70 6c 65 0a 2a 2a 20 46 74 73 33 53  ultiple.** Fts3S
20fc0 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73  egReader objects
20fd0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 74 6f 20 70   internally to p
20fe0 72 6f 76 69 64 65 20 61 6e 20 69 6e 74 65 72 66  rovide an interf
20ff0 61 63 65 20 74 6f 20 73 65 65 6b 20 6f 72 20 73  ace to seek or s
21000 63 61 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  can.** within th
21010 65 20 75 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  e union of all s
21020 65 67 6d 65 6e 74 73 20 6f 66 20 61 20 62 2d 74  egments of a b-t
21030 72 65 65 2e 20 48 65 6e 63 65 20 74 68 65 20 6e  ree. Hence the n
21040 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
21050 65 20 61 6c 6c 6f 63 61 74 65 64 20 46 74 73 33  e allocated Fts3
21060 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 6a  MultiSegReader j
21070 75 73 74 20 73 65 65 6b 73 20 74 6f 20 61 20 73  ust seeks to a s
21080 69 6e 67 6c 65 20 65 6e 74 72 79 20 69 6e 20 61  ingle entry in a
21090 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  .** segment b-tr
210a0 65 65 20 28 69 66 20 74 68 65 20 74 65 72 6d 20  ee (if the term 
210b0 69 73 20 6e 6f 74 20 61 20 70 72 65 66 69 78 20  is not a prefix 
210c0 6f 72 20 69 74 20 69 73 20 61 20 70 72 65 66 69  or it is a prefi
210d0 78 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74  x for which.** t
210e0 68 65 72 65 20 65 78 69 73 74 73 20 70 72 65 66  here exists pref
210f0 69 78 20 62 2d 74 72 65 65 20 6f 66 20 74 68 65  ix b-tree of the
21100 20 72 69 67 68 74 20 6c 65 6e 67 74 68 29 20 74   right length) t
21110 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 74 72  hen it may be tr
21120 61 76 65 72 73 65 64 0a 2a 2a 20 61 6e 64 20 6d  aversed.** and m
21130 65 72 67 65 64 20 69 6e 63 72 65 6d 65 6e 74 61  erged incrementa
21140 6c 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  lly. Otherwise, 
21150 69 74 20 68 61 73 20 74 6f 20 62 65 20 6d 65 72  it has to be mer
21160 67 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 2d 6d  ged into an in-m
21170 65 6d 6f 72 79 20 0a 2a 2a 20 64 6f 63 6c 69 73  emory .** doclis
21180 74 20 61 6e 64 20 74 68 65 6e 20 74 72 61 76 65  t and then trave
21190 72 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsed..*/.static 
211a0 76 6f 69 64 20 66 74 73 33 45 76 61 6c 41 6c 6c  void fts3EvalAll
211b0 6f 63 61 74 65 52 65 61 64 65 72 73 28 0a 20 20  ocateReaders(.  
211c0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
211d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
211e0 2f 2a 20 46 54 53 20 63 75 72 73 6f 72 20 68 61  /* FTS cursor ha
211f0 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  ndle */.  Fts3Ex
21200 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
21210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
21220 6f 63 61 74 65 20 72 65 61 64 65 72 73 20 66 6f  ocate readers fo
21230 72 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  r this expressio
21240 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 54 6f  n */.  int *pnTo
21250 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
21260 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
21270 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  otal number of t
21280 6f 6b 65 6e 73 20 69 6e 20 70 68 72 61 73 65 2e  okens in phrase.
21290 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4f 72 2c   */.  int *pnOr,
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
212c0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 4f 52  tal number of OR
212d0 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 2e 20   nodes in expr. 
212e0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20  */.  int *pRc   
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
21310 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b  Error code */.){
21320 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
21330 53 51 4c 49 54 45 5f 4f 4b 3d 3d 2a 70 52 63 20  SQLITE_OK==*pRc 
21340 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
21350 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
21360 59 5f 50 48 52 41 53 45 20 29 7b 0a 20 20 20 20  Y_PHRASE ){.    
21370 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
21380 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20 70 45 78 70  nt nToken = pExp
21390 72 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b  r->pPhrase->nTok
213a0 65 6e 3b 0a 20 20 20 20 20 20 2a 70 6e 54 6f 6b  en;.      *pnTok
213b0 65 6e 20 2b 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20  en += nToken;.  
213c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
213d0 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Token; i++){.   
213e0 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 54       Fts3PhraseT
213f0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26  oken *pToken = &
21400 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e  pExpr->pPhrase->
21410 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20 20 20 20 20  aToken[i];.     
21420 20 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33     int rc = fts3
21430 54 65 72 6d 53 65 67 52 65 61 64 65 72 43 75 72  TermSegReaderCur
21440 73 6f 72 28 70 43 73 72 2c 20 0a 20 20 20 20 20  sor(pCsr, .     
21450 20 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 7a         pToken->z
21460 2c 20 70 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 54 6f  , pToken->n, pTo
21470 6b 65 6e 2d 3e 69 73 50 72 65 66 69 78 2c 20 26  ken->isPrefix, &
21480 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 0a  pToken->pSegcsr.
21490 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
214a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
214b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
214c0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
214d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
214e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
214f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21500 45 78 70 72 2d 3e 70 50 68 72 61 73 65 2d 3e 69  Expr->pPhrase->i
21510 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3d 3d 30 20  DoclistToken==0 
21520 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
21530 70 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73  pPhrase->iDoclis
21540 74 54 6f 6b 65 6e 20 3d 20 2d 31 3b 0a 20 20 20  tToken = -1;.   
21550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
21560 6e 4f 72 20 2b 3d 20 28 70 45 78 70 72 2d 3e 65  nOr += (pExpr->e
21570 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f  Type==FTSQUERY_O
21580 52 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76  R);.      fts3Ev
21590 61 6c 41 6c 6c 6f 63 61 74 65 52 65 61 64 65 72  alAllocateReader
215a0 73 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70  s(pCsr, pExpr->p
215b0 4c 65 66 74 2c 20 70 6e 54 6f 6b 65 6e 2c 20 70  Left, pnToken, p
215c0 6e 4f 72 2c 20 70 52 63 29 3b 0a 20 20 20 20 20  nOr, pRc);.     
215d0 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63 61 74   fts3EvalAllocat
215e0 65 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70  eReaders(pCsr, p
215f0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 70 6e  Expr->pRight, pn
21600 54 6f 6b 65 6e 2c 20 70 6e 4f 72 2c 20 70 52 63  Token, pnOr, pRc
21610 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
21620 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  /*.** Arguments 
21630 70 4c 69 73 74 2f 6e 4c 69 73 74 20 63 6f 6e 74  pList/nList cont
21640 61 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ain the doclist 
21650 66 6f 72 20 74 6f 6b 65 6e 20 69 54 6f 6b 65 6e  for token iToken
21660 20 6f 66 20 70 68 72 61 73 65 20 70 2e 0a 2a 2a   of phrase p..**
21670 20 49 74 20 69 73 20 6d 65 72 67 65 64 20 69 6e   It is merged in
21680 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 6f 63 6c  to the main docl
21690 69 73 74 20 73 74 6f 72 65 64 20 69 6e 20 70 2d  ist stored in p-
216a0 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41  >doclist.aAll/nA
216b0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ll..**.** This f
216c0 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
216d0 74 68 61 74 20 70 4c 69 73 74 20 70 6f 69 6e 74  that pList point
216e0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 6c  s to a buffer al
216f0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a  located using.**
21700 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
21710 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ). This function
21720 20 74 61 6b 65 73 20 72 65 73 70 6f 6e 73 69 62   takes responsib
21730 69 6c 69 74 79 20 66 6f 72 20 65 76 65 6e 74 75  ility for eventu
21740 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 69 6e 67 20  ally.** freeing 
21750 74 68 65 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  the buffer..**.*
21760 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
21770 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
21780 73 73 66 75 6c 2c 20 6f 72 20 53 51 4c 49 54 45  ssful, or SQLITE
21790 5f 4e 4f 4d 45 4d 20 69 66 20 61 6e 20 65 72 72  _NOMEM if an err
217a0 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
217b0 61 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61  atic int fts3Eva
217c0 6c 50 68 72 61 73 65 4d 65 72 67 65 54 6f 6b 65  lPhraseMergeToke
217d0 6e 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a  n(.  Fts3Table *
217e0 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
217f0 20 20 20 20 20 2f 2a 20 46 54 53 20 54 61 62 6c       /* FTS Tabl
21800 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 46  e pointer */.  F
21810 74 73 33 50 68 72 61 73 65 20 2a 70 2c 20 20 20  ts3Phrase *p,   
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21830 2a 20 50 68 72 61 73 65 20 74 6f 20 6d 65 72 67  * Phrase to merg
21840 65 20 70 4c 69 73 74 2f 6e 4c 69 73 74 20 69 6e  e pList/nList in
21850 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 6b  to */.  int iTok
21860 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
21870 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e          /* Token
21880 20 70 4c 69 73 74 2f 6e 4c 69 73 74 20 63 6f 72   pList/nList cor
21890 72 65 73 70 6f 6e 64 73 20 74 6f 20 2a 2f 0a 20  responds to */. 
218a0 20 63 68 61 72 20 2a 70 4c 69 73 74 2c 20 20 20   char *pList,   
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
218d0 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oclist */.  int 
218e0 6e 4c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  nList           
218f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21900 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
21910 6e 20 70 4c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20  n pList */.){.  
21920 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21930 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54  OK;.  assert( iT
21940 6f 6b 65 6e 21 3d 70 2d 3e 69 44 6f 63 6c 69 73  oken!=p->iDoclis
21950 74 54 6f 6b 65 6e 20 29 3b 0a 0a 20 20 69 66 28  tToken );..  if(
21960 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
21970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
21980 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a  >doclist.aAll);.
21990 20 20 20 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61      p->doclist.a
219a0 41 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  All = 0;.    p->
219b0 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 20 3d 20 30  doclist.nAll = 0
219c0 3b 0a 20 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66  ;.  }..  else if
219d0 28 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b  ( p->iDoclistTok
219e0 65 6e 3c 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64  en<0 ){.    p->d
219f0 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 3d 20 70 4c  oclist.aAll = pL
21a00 69 73 74 3b 0a 20 20 20 20 70 2d 3e 64 6f 63 6c  ist;.    p->docl
21a10 69 73 74 2e 6e 41 6c 6c 20 3d 20 6e 4c 69 73 74  ist.nAll = nList
21a20 3b 0a 20 20 7d 0a 0a 20 20 65 6c 73 65 20 69 66  ;.  }..  else if
21a30 28 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c  ( p->doclist.aAl
21a40 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l==0 ){.    sqli
21a50 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 29 3b  te3_free(pList);
21a60 0a 20 20 7d 0a 0a 20 20 65 6c 73 65 20 7b 0a 20  .  }..  else {. 
21a70 20 20 20 63 68 61 72 20 2a 70 4c 65 66 74 3b 0a     char *pLeft;.
21a80 20 20 20 20 63 68 61 72 20 2a 70 52 69 67 68 74      char *pRight
21a90 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 3b  ;.    int nLeft;
21aa0 0a 20 20 20 20 69 6e 74 20 6e 52 69 67 68 74 3b  .    int nRight;
21ab0 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a  .    int nDiff;.
21ac0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44 6f 63  .    if( p->iDoc
21ad0 6c 69 73 74 54 6f 6b 65 6e 3c 69 54 6f 6b 65 6e  listToken<iToken
21ae0 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 66 74 20   ){.      pLeft 
21af0 3d 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c  = p->doclist.aAl
21b00 6c 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74 20 3d  l;.      nLeft =
21b10 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c   p->doclist.nAll
21b20 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
21b30 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 52   pList;.      nR
21b40 69 67 68 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ight = nList;.  
21b50 20 20 20 20 6e 44 69 66 66 20 3d 20 69 54 6f 6b      nDiff = iTok
21b60 65 6e 20 2d 20 70 2d 3e 69 44 6f 63 6c 69 73 74  en - p->iDoclist
21b70 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65  Token;.    }else
21b80 7b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  {.      pRight =
21b90 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c   p->doclist.aAll
21ba0 3b 0a 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d  ;.      nRight =
21bb0 20 70 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c   p->doclist.nAll
21bc0 3b 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20  ;.      pLeft = 
21bd0 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 6e 4c 65  pList;.      nLe
21be0 66 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  ft = nList;.    
21bf0 20 20 6e 44 69 66 66 20 3d 20 70 2d 3e 69 44 6f    nDiff = p->iDo
21c00 63 6c 69 73 74 54 6f 6b 65 6e 20 2d 20 69 54 6f  clistToken - iTo
21c10 6b 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ken;.    }..    
21c20 72 63 20 3d 20 66 74 73 33 44 6f 63 6c 69 73 74  rc = fts3Doclist
21c30 50 68 72 61 73 65 4d 65 72 67 65 28 0a 20 20 20  PhraseMerge(.   
21c40 20 20 20 20 20 70 54 61 62 2d 3e 62 44 65 73 63       pTab->bDesc
21c50 49 64 78 2c 20 6e 44 69 66 66 2c 20 70 4c 65 66  Idx, nDiff, pLef
21c60 74 2c 20 6e 4c 65 66 74 2c 20 26 70 52 69 67 68  t, nLeft, &pRigh
21c70 74 2c 20 26 6e 52 69 67 68 74 0a 20 20 20 20 29  t, &nRight.    )
21c80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21c90 65 65 28 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  ee(pLeft);.    p
21ca0 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 3d  ->doclist.aAll =
21cb0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 70 2d 3e   pRight;.    p->
21cc0 64 6f 63 6c 69 73 74 2e 6e 41 6c 6c 20 3d 20 6e  doclist.nAll = n
21cd0 52 69 67 68 74 3b 0a 20 20 7d 0a 0a 20 20 69 66  Right;.  }..  if
21ce0 28 20 69 54 6f 6b 65 6e 3e 70 2d 3e 69 44 6f 63  ( iToken>p->iDoc
21cf0 6c 69 73 74 54 6f 6b 65 6e 20 29 20 70 2d 3e 69  listToken ) p->i
21d00 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 20 3d 20 69  DoclistToken = i
21d10 54 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20  Token;.  return 
21d20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  rc;.}../*.** Loa
21d30 64 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  d the doclist fo
21d40 72 20 70 68 72 61 73 65 20 70 20 69 6e 74 6f 20  r phrase p into 
21d50 70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2f  p->doclist.aAll/
21d60 6e 41 6c 6c 2e 20 54 68 65 20 6c 6f 61 64 65 64  nAll. The loaded
21d70 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 64 6f 65 73   doclist.** does
21d80 20 6e 6f 74 20 74 61 6b 65 20 64 65 66 65 72 72   not take deferr
21d90 65 64 20 74 6f 6b 65 6e 73 20 69 6e 74 6f 20 61  ed tokens into a
21da0 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 53 51  ccount..**.** SQ
21db0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21dc0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
21dd0 6f 63 63 75 72 73 2c 20 6f 74 68 65 72 77 69 73  occurs, otherwis
21de0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
21df0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
21e00 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 50 68  c int fts3EvalPh
21e10 72 61 73 65 4c 6f 61 64 28 0a 20 20 46 74 73 33  raseLoad(.  Fts3
21e20 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
21e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21e40 54 53 20 43 75 72 73 6f 72 20 68 61 6e 64 6c 65  TS Cursor handle
21e50 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 73 65   */.  Fts3Phrase
21e60 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20 20   *p             
21e70 20 20 20 20 20 20 2f 2a 20 50 68 72 61 73 65 20        /* Phrase 
21e80 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
21e90 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  ts3Table *pTab =
21ea0 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70 43   (Fts3Table *)pC
21eb0 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a  sr->base.pVtab;.
21ec0 20 20 69 6e 74 20 69 54 6f 6b 65 6e 3b 0a 20 20    int iToken;.  
21ed0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21ee0 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 54 6f 6b 65  OK;..  for(iToke
21ef0 6e 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n=0; rc==SQLITE_
21f00 4f 4b 20 26 26 20 69 54 6f 6b 65 6e 3c 70 2d 3e  OK && iToken<p->
21f10 6e 54 6f 6b 65 6e 3b 20 69 54 6f 6b 65 6e 2b 2b  nToken; iToken++
21f20 29 7b 0a 20 20 20 20 46 74 73 33 50 68 72 61 73  ){.    Fts3Phras
21f30 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d  eToken *pToken =
21f40 20 26 70 2d 3e 61 54 6f 6b 65 6e 5b 69 54 6f 6b   &p->aToken[iTok
21f50 65 6e 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  en];.    assert(
21f60 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72   pToken->pDeferr
21f70 65 64 3d 3d 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d  ed==0 || pToken-
21f80 3e 70 53 65 67 63 73 72 3d 3d 30 20 29 3b 0a 0a  >pSegcsr==0 );..
21f90 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e      if( pToken->
21fa0 70 53 65 67 63 73 72 20 29 7b 0a 20 20 20 20 20  pSegcsr ){.     
21fb0 20 69 6e 74 20 6e 54 68 69 73 20 3d 20 30 3b 0a   int nThis = 0;.
21fc0 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 68 69        char *pThi
21fd0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
21fe0 3d 20 66 74 73 33 54 65 72 6d 53 65 6c 65 63 74  = fts3TermSelect
21ff0 28 70 54 61 62 2c 20 70 54 6f 6b 65 6e 2c 20 70  (pTab, pToken, p
22000 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 26 6e 54 68 69  ->iColumn, &nThi
22010 73 2c 20 26 70 54 68 69 73 29 3b 0a 20 20 20 20  s, &pThis);.    
22020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
22040 63 20 3d 20 66 74 73 33 45 76 61 6c 50 68 72 61  c = fts3EvalPhra
22050 73 65 4d 65 72 67 65 54 6f 6b 65 6e 28 70 54 61  seMergeToken(pTa
22060 62 2c 20 70 2c 20 69 54 6f 6b 65 6e 2c 20 70 54  b, p, iToken, pT
22070 68 69 73 2c 20 6e 54 68 69 73 29 3b 0a 20 20 20  his, nThis);.   
22080 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
22090 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 70  ssert( pToken->p
220a0 53 65 67 63 73 72 3d 3d 30 20 29 3b 0a 20 20 7d  Segcsr==0 );.  }
220b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
220c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
220d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
220e0 6f 6e 20 65 61 63 68 20 70 68 72 61 73 65 20 61  on each phrase a
220f0 66 74 65 72 20 74 68 65 20 70 6f 73 69 74 69 6f  fter the positio
22100 6e 20 6c 69 73 74 73 20 66 6f 72 0a 2a 2a 20 61  n lists for.** a
22110 6e 79 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  ny deferred toke
22120 6e 73 20 68 61 76 65 20 62 65 65 6e 20 6c 6f 61  ns have been loa
22130 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
22140 20 49 74 20 75 70 64 61 74 65 73 20 74 68 65 20   It updates the 
22150 70 68 72 61 73 65 73 0a 2a 2a 20 63 75 72 72 65  phrases.** curre
22160 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
22170 20 74 6f 20 69 6e 63 6c 75 64 65 20 6f 6e 6c 79   to include only
22180 20 74 68 6f 73 65 20 70 6f 73 69 74 69 6f 6e 73   those positions
22190 20 74 68 61 74 20 61 72 65 20 72 65 61 6c 6c 79   that are really
221a0 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  .** instances of
221b0 20 74 68 65 20 70 68 72 61 73 65 20 28 61 66 74   the phrase (aft
221c0 65 72 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 64  er considering d
221d0 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 29 2e  eferred tokens).
221e0 20 49 66 20 74 68 69 73 0a 2a 2a 20 6d 65 61 6e   If this.** mean
221f0 73 20 74 68 61 74 20 74 68 65 20 70 68 72 61 73  s that the phras
22200 65 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  e does not appea
22210 72 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  r in the current
22220 20 72 6f 77 2c 20 64 6f 63 6c 69 73 74 2e 70 4c   row, doclist.pL
22230 69 73 74 0a 2a 2a 20 61 6e 64 20 64 6f 63 6c 69  ist.** and docli
22240 73 74 2e 6e 4c 69 73 74 20 61 72 65 20 62 6f 74  st.nList are bot
22250 68 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  h zeroed..**.** 
22260 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
22270 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
22280 72 20 6f 63 63 75 72 73 2c 20 6f 74 68 65 72 77  r occurs, otherw
22290 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
222a0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
222b0 74 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c  tic int fts3Eval
222c0 44 65 66 65 72 72 65 64 50 68 72 61 73 65 28 46  DeferredPhrase(F
222d0 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ts3Cursor *pCsr,
222e0 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
222f0 72 61 73 65 29 7b 0a 20 20 69 6e 74 20 69 54 6f  rase){.  int iTo
22300 6b 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ken;            
22310 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
22320 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
22330 75 67 68 20 70 68 72 61 73 65 20 74 6f 6b 65 6e  ugh phrase token
22340 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 50 6f  s */.  char *aPo
22350 73 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  slist = 0;      
22360 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
22370 6f 6e 20 6c 69 73 74 20 66 6f 72 20 64 65 66 65  on list for defe
22380 72 72 65 64 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20  rred tokens */. 
22390 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 20 3d 20   int nPoslist = 
223a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
223b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
223c0 74 65 73 20 69 6e 20 61 50 6f 73 6c 69 73 74 20  tes in aPoslist 
223d0 2a 2f 0a 20 20 69 6e 74 20 69 50 72 65 76 20 3d  */.  int iPrev =
223e0 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
223f0 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 6e 75       /* Token nu
22400 6d 62 65 72 20 6f 66 20 70 72 65 76 69 6f 75 73  mber of previous
22410 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20   deferred token 
22420 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
22430 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 62  hrase->doclist.b
22440 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 3b 0a 0a  FreeList==0 );..
22450 20 20 66 6f 72 28 69 54 6f 6b 65 6e 3d 30 3b 20    for(iToken=0; 
22460 69 54 6f 6b 65 6e 3c 70 50 68 72 61 73 65 2d 3e  iToken<pPhrase->
22470 6e 54 6f 6b 65 6e 3b 20 69 54 6f 6b 65 6e 2b 2b  nToken; iToken++
22480 29 7b 0a 20 20 20 20 46 74 73 33 50 68 72 61 73  ){.    Fts3Phras
22490 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d  eToken *pToken =
224a0 20 26 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65   &pPhrase->aToke
224b0 6e 5b 69 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20 46  n[iToken];.    F
224c0 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e  ts3DeferredToken
224d0 20 2a 70 44 65 66 65 72 72 65 64 20 3d 20 70 54   *pDeferred = pT
224e0 6f 6b 65 6e 2d 3e 70 44 65 66 65 72 72 65 64 3b  oken->pDeferred;
224f0 0a 0a 20 20 20 20 69 66 28 20 70 44 65 66 65 72  ..    if( pDefer
22500 72 65 64 20 29 7b 0a 20 20 20 20 20 20 63 68 61  red ){.      cha
22510 72 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r *pList;.      
22520 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
22530 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
22540 33 46 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b  3Fts3DeferredTok
22550 65 6e 4c 69 73 74 28 70 44 65 66 65 72 72 65 64  enList(pDeferred
22560 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
22570 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
22580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
22590 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 69  urn rc;..      i
225a0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
225b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
225c0 72 65 65 28 61 50 6f 73 6c 69 73 74 29 3b 0a 20  ree(aPoslist);. 
225d0 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e         pPhrase->
225e0 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20  doclist.pList = 
225f0 30 3b 0a 20 20 20 20 20 20 20 20 70 50 68 72 61  0;.        pPhra
22600 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73  se->doclist.nLis
22610 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
22620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22630 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
22640 28 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 7b  ( aPoslist==0 ){
22650 0a 20 20 20 20 20 20 20 20 61 50 6f 73 6c 69 73  .        aPoslis
22660 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
22670 20 20 20 6e 50 6f 73 6c 69 73 74 20 3d 20 6e 4c     nPoslist = nL
22680 69 73 74 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73  ist;..      }els
22690 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
226a0 2a 61 4f 75 74 20 3d 20 70 4c 69 73 74 3b 0a 20  *aOut = pList;. 
226b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 31 20         char *p1 
226c0 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  = aPoslist;.    
226d0 20 20 20 20 63 68 61 72 20 2a 70 32 20 3d 20 61      char *p2 = a
226e0 4f 75 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  Out;..        as
226f0 73 65 72 74 28 20 69 50 72 65 76 3e 3d 30 20 29  sert( iPrev>=0 )
22700 3b 0a 20 20 20 20 20 20 20 20 66 74 73 33 50 6f  ;.        fts3Po
22710 73 6c 69 73 74 50 68 72 61 73 65 4d 65 72 67 65  slistPhraseMerge
22720 28 26 61 4f 75 74 2c 20 69 54 6f 6b 65 6e 2d 69  (&aOut, iToken-i
22730 50 72 65 76 2c 20 30 2c 20 31 2c 20 26 70 31 2c  Prev, 0, 1, &p1,
22740 20 26 70 32 29 3b 0a 20 20 20 20 20 20 20 20 73   &p2);.        s
22750 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73  qlite3_free(aPos
22760 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 61  list);.        a
22770 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b  Poslist = pList;
22780 0a 20 20 20 20 20 20 20 20 6e 50 6f 73 6c 69 73  .        nPoslis
22790 74 20 3d 20 28 69 6e 74 29 28 61 4f 75 74 20 2d  t = (int)(aOut -
227a0 20 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   aPoslist);.    
227b0 20 20 20 20 69 66 28 20 6e 50 6f 73 6c 69 73 74      if( nPoslist
227c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
227d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50   sqlite3_free(aP
227e0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
227f0 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c     pPhrase->docl
22800 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ist.pList = 0;. 
22810 20 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65           pPhrase
22820 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20  ->doclist.nList 
22830 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
22840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22860 20 7d 0a 20 20 20 20 20 20 69 50 72 65 76 20 3d   }.      iPrev =
22870 20 69 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20   iToken;.    }. 
22880 20 7d 0a 0a 20 20 69 66 28 20 69 50 72 65 76 3e   }..  if( iPrev>
22890 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d  =0 ){.    int nM
228a0 61 78 55 6e 64 65 66 65 72 72 65 64 20 3d 20 70  axUndeferred = p
228b0 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74  Phrase->iDoclist
228c0 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 6e  Token;.    if( n
228d0 4d 61 78 55 6e 64 65 66 65 72 72 65 64 3c 30 20  MaxUndeferred<0 
228e0 29 7b 0a 20 20 20 20 20 20 70 50 68 72 61 73 65  ){.      pPhrase
228f0 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20  ->doclist.pList 
22900 3d 20 61 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  = aPoslist;.    
22910 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69    pPhrase->docli
22920 73 74 2e 6e 4c 69 73 74 20 3d 20 6e 50 6f 73 6c  st.nList = nPosl
22930 69 73 74 3b 0a 20 20 20 20 20 20 70 50 68 72 61  ist;.      pPhra
22940 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63  se->doclist.iDoc
22950 69 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76  id = pCsr->iPrev
22960 49 64 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73  Id;.      pPhras
22970 65 2d 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65 65  e->doclist.bFree
22980 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  List = 1;.    }e
22990 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
229a0 44 69 73 74 61 6e 63 65 3b 0a 20 20 20 20 20 20  Distance;.      
229b0 63 68 61 72 20 2a 70 31 3b 0a 20 20 20 20 20 20  char *p1;.      
229c0 63 68 61 72 20 2a 70 32 3b 0a 20 20 20 20 20 20  char *p2;.      
229d0 63 68 61 72 20 2a 61 4f 75 74 3b 0a 0a 20 20 20  char *aOut;..   
229e0 20 20 20 69 66 28 20 6e 4d 61 78 55 6e 64 65 66     if( nMaxUndef
229f0 65 72 72 65 64 3e 69 50 72 65 76 20 29 7b 0a 20  erred>iPrev ){. 
22a00 20 20 20 20 20 20 20 70 31 20 3d 20 61 50 6f 73         p1 = aPos
22a10 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 32  list;.        p2
22a20 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   = pPhrase->docl
22a30 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ist.pList;.     
22a40 20 20 20 6e 44 69 73 74 61 6e 63 65 20 3d 20 6e     nDistance = n
22a50 4d 61 78 55 6e 64 65 66 65 72 72 65 64 20 2d 20  MaxUndeferred - 
22a60 69 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c  iPrev;.      }el
22a70 73 65 7b 0a 20 20 20 20 20 20 20 20 70 31 20 3d  se{.        p1 =
22a80 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73   pPhrase->doclis
22a90 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  t.pList;.       
22aa0 20 70 32 20 3d 20 61 50 6f 73 6c 69 73 74 3b 0a   p2 = aPoslist;.
22ab0 20 20 20 20 20 20 20 20 6e 44 69 73 74 61 6e 63          nDistanc
22ac0 65 20 3d 20 69 50 72 65 76 20 2d 20 6e 4d 61 78  e = iPrev - nMax
22ad0 55 6e 64 65 66 65 72 72 65 64 3b 0a 20 20 20 20  Undeferred;.    
22ae0 20 20 7d 0a 0a 20 20 20 20 20 20 61 4f 75 74 20    }..      aOut 
22af0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
22b00 33 5f 6d 61 6c 6c 6f 63 28 6e 50 6f 73 6c 69 73  3_malloc(nPoslis
22b10 74 2b 38 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t+8);.      if( 
22b20 21 61 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  !aOut ){.       
22b30 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50   sqlite3_free(aP
22b40 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
22b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22b60 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
22b70 20 20 20 20 0a 20 20 20 20 20 20 70 50 68 72 61      .      pPhra
22b80 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73  se->doclist.pLis
22b90 74 20 3d 20 61 4f 75 74 3b 0a 20 20 20 20 20 20  t = aOut;.      
22ba0 69 66 28 20 66 74 73 33 50 6f 73 6c 69 73 74 50  if( fts3PoslistP
22bb0 68 72 61 73 65 4d 65 72 67 65 28 26 61 4f 75 74  hraseMerge(&aOut
22bc0 2c 20 6e 44 69 73 74 61 6e 63 65 2c 20 30 2c 20  , nDistance, 0, 
22bd0 31 2c 20 26 70 31 2c 20 26 70 32 29 20 29 7b 0a  1, &p1, &p2) ){.
22be0 20 20 20 20 20 20 20 20 70 50 68 72 61 73 65 2d          pPhrase-
22bf0 3e 64 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69  >doclist.bFreeLi
22c00 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
22c10 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
22c20 2e 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 61  .nList = (int)(a
22c30 4f 75 74 20 2d 20 70 50 68 72 61 73 65 2d 3e 64  Out - pPhrase->d
22c40 6f 63 6c 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20  oclist.pList);. 
22c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22c60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22c70 28 61 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (aOut);.        
22c80 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
22c90 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  .pList = 0;.    
22ca0 20 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63      pPhrase->doc
22cb0 6c 69 73 74 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a  list.nList = 0;.
22cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
22cd0 6c 69 74 65 33 5f 66 72 65 65 28 61 50 6f 73 6c  lite3_free(aPosl
22ce0 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
22cf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22d00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
22d10 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22d20 74 6f 6b 65 6e 73 20 61 20 70 68 72 61 73 65 20  tokens a phrase 
22d30 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 63  may have to be c
22d40 6f 6e 73 69 64 65 72 65 64 20 66 6f 72 20 74 68  onsidered for th
22d50 65 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  e.** incremental
22d60 20 64 6f 63 6c 69 73 74 73 20 73 74 72 61 74 65   doclists strate
22d70 67 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  gy..*/.#define M
22d80 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54  AX_INCR_PHRASE_T
22d90 4f 4b 45 4e 53 20 34 0a 0a 2f 2a 0a 2a 2a 20 54  OKENS 4../*.** T
22da0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22db0 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 20  called for each 
22dc0 46 74 73 33 50 68 72 61 73 65 20 69 6e 20 61 20  Fts3Phrase in a 
22dd0 66 75 6c 6c 2d 74 65 78 74 20 71 75 65 72 79 20  full-text query 
22de0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 74  .** expression t
22df0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
22e00 20 6d 65 63 68 61 6e 69 73 6d 20 66 6f 72 20 72   mechanism for r
22e10 65 74 75 72 6e 69 6e 67 20 72 6f 77 73 2e 20 4f  eturning rows. O
22e20 6e 63 65 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  nce this.** func
22e30 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
22e40 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  lled successfull
22e50 79 20 6f 6e 20 61 6e 20 46 74 73 33 50 68 72 61  y on an Fts3Phra
22e60 73 65 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  se, it may be.**
22e70 20 75 73 65 64 20 77 69 74 68 20 66 74 73 33 45   used with fts3E
22e80 76 61 6c 50 68 72 61 73 65 4e 65 78 74 28 29 20  valPhraseNext() 
22e90 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
22ea0 67 68 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  gh the matching 
22eb0 64 6f 63 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  docids..**.** If
22ec0 20 70 61 72 61 6d 65 74 65 72 20 62 4f 70 74 4f   parameter bOptO
22ed0 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
22ee0 74 68 65 20 70 68 72 61 73 65 20 6d 61 79 20 28  the phrase may (
22ef0 6f 72 20 6d 61 79 20 6e 6f 74 29 20 75 73 65 20  or may not) use 
22f00 74 68 65 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  the.** increment
22f10 61 6c 20 6c 6f 61 64 69 6e 67 20 73 74 72 61 74  al loading strat
22f20 65 67 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  egy. Otherwise, 
22f30 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  the entire docli
22f40 73 74 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  st is loaded int
22f50 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68  o.** memory with
22f60 69 6e 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a  in this call..**
22f70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22f80 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
22f90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6f 74  error occurs, ot
22fa0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
22fb0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
22fc0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
22fd0 45 76 61 6c 50 68 72 61 73 65 53 74 61 72 74 28  EvalPhraseStart(
22fe0 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
22ff0 2c 20 69 6e 74 20 62 4f 70 74 4f 6b 2c 20 46 74  , int bOptOk, Ft
23000 73 33 50 68 72 61 73 65 20 2a 70 29 7b 0a 20 20  s3Phrase *p){.  
23010 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 20  Fts3Table *pTab 
23020 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 70  = (Fts3Table *)p
23030 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 3b  Csr->base.pVtab;
23040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23050 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
23060 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
23070 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   */.  int i;..  
23080 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  /* Determine if 
23090 64 6f 63 6c 69 73 74 73 20 6d 61 79 20 62 65 20  doclists may be 
230a0 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b  loaded from disk
230b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 2e 20   incrementally. 
230c0 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 70 6f 73  This is.  ** pos
230d0 73 69 62 6c 65 20 69 66 20 74 68 65 20 62 4f 70  sible if the bOp
230e0 74 4f 6b 20 61 72 67 75 6d 65 6e 74 20 69 73 20  tOk argument is 
230f0 74 72 75 65 2c 20 74 68 65 20 46 54 53 20 64 6f  true, the FTS do
23100 63 6c 69 73 74 73 20 77 69 6c 6c 20 62 65 0a 20  clists will be. 
23110 20 2a 2a 20 73 63 61 6e 6e 65 64 20 69 6e 20 66   ** scanned in f
23120 6f 72 77 61 72 64 20 6f 72 64 65 72 2c 20 61 6e  orward order, an
23130 64 20 74 68 65 20 70 68 72 61 73 65 20 63 6f 6e  d the phrase con
23140 73 69 73 74 73 20 6f 66 20 0a 20 20 2a 2a 20 4d  sists of .  ** M
23150 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54  AX_INCR_PHRASE_T
23160 4f 4b 45 4e 53 20 6f 72 20 66 65 77 65 72 20 74  OKENS or fewer t
23170 6f 6b 65 6e 73 2c 20 6e 6f 6e 65 20 6f 66 20 77  okens, none of w
23180 68 69 63 68 20 61 72 65 20 61 72 65 20 22 5e 66  hich are are "^f
23190 69 72 73 74 22 0a 20 20 2a 2a 20 74 6f 6b 65 6e  irst".  ** token
231a0 73 20 6f 72 20 70 72 65 66 69 78 20 74 6f 6b 65  s or prefix toke
231b0 6e 73 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 75  ns that cannot u
231c0 73 65 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65  se a prefix-inde
231d0 78 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 62 48 61  x.  */.  int bHa
231e0 76 65 49 6e 63 72 20 3d 20 30 3b 0a 20 20 69 6e  veIncr = 0;.  in
231f0 74 20 62 49 6e 63 72 4f 6b 20 3d 20 28 62 4f 70  t bIncrOk = (bOp
23200 74 4f 6b 20 0a 20 20 20 26 26 20 70 43 73 72 2d  tOk .   && pCsr-
23210 3e 62 44 65 73 63 3d 3d 70 54 61 62 2d 3e 62 44  >bDesc==pTab->bD
23220 65 73 63 49 64 78 20 0a 20 20 20 26 26 20 70 2d  escIdx .   && p-
23230 3e 6e 54 6f 6b 65 6e 3c 3d 4d 41 58 5f 49 4e 43  >nToken<=MAX_INC
23240 52 5f 50 48 52 41 53 45 5f 54 4f 4b 45 4e 53 20  R_PHRASE_TOKENS 
23250 26 26 20 70 2d 3e 6e 54 6f 6b 65 6e 3e 30 0a 23  && p->nToken>0.#
23260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23270 54 0a 20 20 20 26 26 20 70 54 61 62 2d 3e 62 4e  T.   && pTab->bN
23280 6f 49 6e 63 72 44 6f 63 6c 69 73 74 3d 3d 30 0a  oIncrDoclist==0.
23290 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 66 6f  #endif.  );.  fo
232a0 72 28 69 3d 30 3b 20 62 49 6e 63 72 4f 6b 3d 3d  r(i=0; bIncrOk==
232b0 31 20 26 26 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e  1 && i<p->nToken
232c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33  ; i++){.    Fts3
232d0 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 54 6f  PhraseToken *pTo
232e0 6b 65 6e 20 3d 20 26 70 2d 3e 61 54 6f 6b 65 6e  ken = &p->aToken
232f0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 6f  [i];.    if( pTo
23300 6b 65 6e 2d 3e 62 46 69 72 73 74 20 7c 7c 20 28  ken->bFirst || (
23310 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 21  pToken->pSegcsr!
23320 3d 30 20 26 26 20 21 70 54 6f 6b 65 6e 2d 3e 70  =0 && !pToken->p
23330 53 65 67 63 73 72 2d 3e 62 4c 6f 6f 6b 75 70 29  Segcsr->bLookup)
23340 20 29 7b 0a 20 20 20 20 20 20 62 49 6e 63 72 4f   ){.      bIncrO
23350 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  k = 0;.    }.   
23360 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65   if( pToken->pSe
23370 67 63 73 72 20 29 20 62 48 61 76 65 49 6e 63 72  gcsr ) bHaveIncr
23380 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 1;.  }..  if(
23390 20 62 49 6e 63 72 4f 6b 20 26 26 20 62 48 61 76   bIncrOk && bHav
233a0 65 49 6e 63 72 20 29 7b 0a 20 20 20 20 2f 2a 20  eIncr ){.    /* 
233b0 55 73 65 20 74 68 65 20 69 6e 63 72 65 6d 65 6e  Use the incremen
233c0 74 61 6c 20 61 70 70 72 6f 61 63 68 2e 20 2a 2f  tal approach. */
233d0 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
233e0 28 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3e 3d 20 70  (p->iColumn >= p
233f0 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20 3f 20 2d  Tab->nColumn ? -
23400 31 20 3a 20 70 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  1 : p->iColumn);
23410 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
23420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
23430 3c 70 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b 2b 29  <p->nToken; i++)
23440 7b 0a 20 20 20 20 20 20 46 74 73 33 50 68 72 61  {.      Fts3Phra
23450 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  seToken *pToken 
23460 3d 20 26 70 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 3b  = &p->aToken[i];
23470 0a 20 20 20 20 20 20 46 74 73 33 4d 75 6c 74 69  .      Fts3Multi
23480 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 67 63  SegReader *pSegc
23490 73 72 20 3d 20 70 54 6f 6b 65 6e 2d 3e 70 53 65  sr = pToken->pSe
234a0 67 63 73 72 3b 0a 20 20 20 20 20 20 69 66 28 20  gcsr;.      if( 
234b0 70 53 65 67 63 73 72 20 29 7b 0a 20 20 20 20 20  pSegcsr ){.     
234c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
234d0 74 73 33 4d 73 72 49 6e 63 72 53 74 61 72 74 28  ts3MsrIncrStart(
234e0 70 54 61 62 2c 20 70 53 65 67 63 73 72 2c 20 69  pTab, pSegcsr, i
234f0 43 6f 6c 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  Col, pToken->z, 
23500 70 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  pToken->n);.    
23510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d    }.    }.    p-
23520 3e 62 49 6e 63 72 20 3d 20 31 3b 0a 20 20 7d 65  >bIncr = 1;.  }e
23530 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  lse{.    /* Load
23540 20 74 68 65 20 66 75 6c 6c 20 64 6f 63 6c 69 73   the full doclis
23550 74 20 66 6f 72 20 74 68 65 20 70 68 72 61 73 65  t for the phrase
23560 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f   into memory. */
23570 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 45 76  .    rc = fts3Ev
23580 61 6c 50 68 72 61 73 65 4c 6f 61 64 28 70 43 73  alPhraseLoad(pCs
23590 72 2c 20 70 29 3b 0a 20 20 20 20 70 2d 3e 62 49  r, p);.    p->bI
235a0 6e 63 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ncr = 0;.  }..  
235b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
235c0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 6e 54 6f 6b  TE_OK || p->nTok
235d0 65 6e 3c 31 20 7c 7c 20 70 2d 3e 61 54 6f 6b 65  en<1 || p->aToke
235e0 6e 5b 30 5d 2e 70 53 65 67 63 73 72 3d 3d 30 20  n[0].pSegcsr==0 
235f0 7c 7c 20 70 2d 3e 62 49 6e 63 72 20 29 3b 0a 20  || p->bIncr );. 
23600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23610 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23620 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  on is used to it
23630 65 72 61 74 65 20 62 61 63 6b 77 61 72 64 73 20  erate backwards 
23640 28 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 74 6f  (from the end to
23650 20 73 74 61 72 74 29 20 0a 2a 2a 20 74 68 72 6f   start) .** thro
23660 75 67 68 20 64 6f 63 6c 69 73 74 73 2e 20 49 74  ugh doclists. It
23670 20 69 73 20 75 73 65 64 20 62 79 20 74 68 69 73   is used by this
23680 20 6d 6f 64 75 6c 65 20 74 6f 20 69 74 65 72 61   module to itera
23690 74 65 20 74 68 72 6f 75 67 68 20 70 68 72 61 73  te through phras
236a0 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 73 20 69 6e  e.** doclists in
236b0 20 72 65 76 65 72 73 65 20 61 6e 64 20 62 79 20   reverse and by 
236c0 74 68 65 20 66 74 73 33 5f 77 72 69 74 65 2e 63  the fts3_write.c
236d0 20 6d 6f 64 75 6c 65 20 74 6f 20 69 74 65 72 61   module to itera
236e0 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 70 65  te through.** pe
236f0 6e 64 69 6e 67 2d 74 65 72 6d 73 20 6c 69 73 74  nding-terms list
23700 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  s when writing t
23710 6f 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  o databases with
23720 20 22 6f 72 64 65 72 3d 64 65 73 63 22 2e 0a 2a   "order=desc"..*
23730 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74  *.** The doclist
23740 20 6d 61 79 20 62 65 20 73 6f 72 74 65 64 20 69   may be sorted i
23750 6e 20 61 73 63 65 6e 64 69 6e 67 20 28 70 61 72  n ascending (par
23760 61 6d 65 74 65 72 20 62 44 65 73 63 49 64 78 3d  ameter bDescIdx=
23770 3d 30 29 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65  =0) or .** desce
23780 6e 64 69 6e 67 20 28 70 61 72 61 6d 65 74 65 72  nding (parameter
23790 20 62 44 65 73 63 49 64 78 3d 3d 31 29 20 6f 72   bDescIdx==1) or
237a0 64 65 72 20 6f 66 20 64 6f 63 69 64 2e 20 52 65  der of docid. Re
237b0 67 61 72 64 6c 65 73 73 2c 20 74 68 69 73 0a 2a  gardless, this.*
237c0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 74 65 72 61  * function itera
237d0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  tes from the end
237e0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
237f0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
23800 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23810 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76  3Fts3DoclistPrev
23820 28 0a 20 20 69 6e 74 20 62 44 65 73 63 49 64 78  (.  int bDescIdx
23830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23840 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
23850 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20 64 65  he doclist is de
23860 73 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  sc */.  char *aD
23870 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oclist,         
23880 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
23890 65 72 20 74 6f 20 65 6e 74 69 72 65 20 64 6f 63  er to entire doc
238a0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  list */.  int nD
238b0 6f 63 6c 69 73 74 2c 20 20 20 20 20 20 20 20 20  oclist,         
238c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
238d0 67 74 68 20 6f 66 20 61 44 6f 63 6c 69 73 74 20  gth of aDoclist 
238e0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
238f0 61 72 20 2a 2a 70 70 49 74 65 72 2c 20 20 20 20  ar **ppIter,    
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23910 20 49 4e 2f 4f 55 54 3a 20 49 74 65 72 61 74 6f   IN/OUT: Iterato
23920 72 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73  r pointer */.  s
23930 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
23940 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 2f  Docid,         /
23950 2a 20 49 4e 2f 4f 55 54 3a 20 44 6f 63 69 64 20  * IN/OUT: Docid 
23960 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
23970 20 2a 70 6e 4c 69 73 74 2c 20 20 20 20 20 20 20   *pnList,       
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23990 4f 55 54 3a 20 4c 69 73 74 20 6c 65 6e 67 74 68  OUT: List length
239a0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
239b0 20 2a 70 62 45 6f 66 20 20 20 20 20 20 20 20 20   *pbEof         
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
239d0 20 4f 55 54 3a 20 45 6e 64 2d 6f 66 2d 66 69 6c   OUT: End-of-fil
239e0 65 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 63  e flag */.){.  c
239f0 68 61 72 20 2a 70 20 3d 20 2a 70 70 49 74 65 72  har *p = *ppIter
23a00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 44 6f  ;..  assert( nDo
23a10 63 6c 69 73 74 3e 30 20 29 3b 0a 20 20 61 73 73  clist>0 );.  ass
23a20 65 72 74 28 20 2a 70 62 45 6f 66 3d 3d 30 20 29  ert( *pbEof==0 )
23a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 7c 7c  ;.  assert( p ||
23a40 20 2a 70 69 44 6f 63 69 64 3d 3d 30 20 29 3b 0a   *piDocid==0 );.
23a50 20 20 61 73 73 65 72 74 28 20 21 70 20 7c 7c 20    assert( !p || 
23a60 28 70 3e 61 44 6f 63 6c 69 73 74 20 26 26 20 70  (p>aDoclist && p
23a70 3c 26 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c  <&aDoclist[nDocl
23a80 69 73 74 5d 29 20 29 3b 0a 0a 20 20 69 66 28 20  ist]) );..  if( 
23a90 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
23aa0 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64  te3_int64 iDocid
23ab0 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
23ac0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  pNext = 0;.    c
23ad0 68 61 72 20 2a 70 44 6f 63 69 64 20 3d 20 61 44  har *pDocid = aD
23ae0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 63 68 61 72  oclist;.    char
23af0 20 2a 70 45 6e 64 20 3d 20 26 61 44 6f 63 6c 69   *pEnd = &aDocli
23b00 73 74 5b 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20  st[nDoclist];.  
23b10 20 20 69 6e 74 20 69 4d 75 6c 20 3d 20 31 3b 0a    int iMul = 1;.
23b20 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 6f 63  .    while( pDoc
23b30 69 64 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  id<pEnd ){.     
23b40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
23b50 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 70 44 6f  Delta;.      pDo
23b60 63 69 64 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  cid += sqlite3Ft
23b70 73 33 47 65 74 56 61 72 69 6e 74 28 70 44 6f 63  s3GetVarint(pDoc
23b80 69 64 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20  id, &iDelta);.  
23b90 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 28 69      iDocid += (i
23ba0 4d 75 6c 20 2a 20 69 44 65 6c 74 61 29 3b 0a 20  Mul * iDelta);. 
23bb0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 44 6f       pNext = pDo
23bc0 63 69 64 3b 0a 20 20 20 20 20 20 66 74 73 33 50  cid;.      fts3P
23bd0 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  oslistCopy(0, &p
23be0 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 77 68  Docid);.      wh
23bf0 69 6c 65 28 20 70 44 6f 63 69 64 3c 70 45 6e 64  ile( pDocid<pEnd
23c00 20 26 26 20 2a 70 44 6f 63 69 64 3d 3d 30 20 29   && *pDocid==0 )
23c10 20 70 44 6f 63 69 64 2b 2b 3b 0a 20 20 20 20 20   pDocid++;.     
23c20 20 69 4d 75 6c 20 3d 20 28 62 44 65 73 63 49 64   iMul = (bDescId
23c30 78 20 3f 20 2d 31 20 3a 20 31 29 3b 0a 20 20 20  x ? -1 : 1);.   
23c40 20 7d 0a 0a 20 20 20 20 2a 70 6e 4c 69 73 74 20   }..    *pnList 
23c50 3d 20 28 69 6e 74 29 28 70 45 6e 64 20 2d 20 70  = (int)(pEnd - p
23c60 4e 65 78 74 29 3b 0a 20 20 20 20 2a 70 70 49 74  Next);.    *ppIt
23c70 65 72 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  er = pNext;.    
23c80 2a 70 69 44 6f 63 69 64 20 3d 20 69 44 6f 63 69  *piDocid = iDoci
23c90 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
23ca0 69 6e 74 20 69 4d 75 6c 20 3d 20 28 62 44 65 73  int iMul = (bDes
23cb0 63 49 64 78 20 3f 20 2d 31 20 3a 20 31 29 3b 0a  cIdx ? -1 : 1);.
23cc0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
23cd0 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 66 74  4 iDelta;.    ft
23ce0 73 33 47 65 74 52 65 76 65 72 73 65 56 61 72 69  s3GetReverseVari
23cf0 6e 74 28 26 70 2c 20 61 44 6f 63 6c 69 73 74 2c  nt(&p, aDoclist,
23d00 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 2a   &iDelta);.    *
23d10 70 69 44 6f 63 69 64 20 2d 3d 20 28 69 4d 75 6c  piDocid -= (iMul
23d20 20 2a 20 69 44 65 6c 74 61 29 3b 0a 0a 20 20 20   * iDelta);..   
23d30 20 69 66 28 20 70 3d 3d 61 44 6f 63 6c 69 73 74   if( p==aDoclist
23d40 20 29 7b 0a 20 20 20 20 20 20 2a 70 62 45 6f 66   ){.      *pbEof
23d50 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
23d60 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 53 61  .      char *pSa
23d70 76 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 66 74  ve = p;.      ft
23d80 73 33 52 65 76 65 72 73 65 50 6f 73 6c 69 73 74  s3ReversePoslist
23d90 28 61 44 6f 63 6c 69 73 74 2c 20 26 70 29 3b 0a  (aDoclist, &p);.
23da0 20 20 20 20 20 20 2a 70 6e 4c 69 73 74 20 3d 20        *pnList = 
23db0 28 69 6e 74 29 28 70 53 61 76 65 20 2d 20 70 29  (int)(pSave - p)
23dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 49  ;.    }.    *ppI
23dd0 74 65 72 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a  ter = p;.  }.}..
23de0 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65 20 66 6f  /*.** Iterate fo
23df0 72 77 61 72 64 73 20 74 68 72 6f 75 67 68 20 61  rwards through a
23e00 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69   doclist..*/.voi
23e10 64 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f 63  d sqlite3Fts3Doc
23e20 6c 69 73 74 4e 65 78 74 28 0a 20 20 69 6e 74 20  listNext(.  int 
23e30 62 44 65 73 63 49 64 78 2c 20 20 20 20 20 20 20  bDescIdx,       
23e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23e50 72 75 65 20 69 66 20 74 68 65 20 64 6f 63 6c 69  rue if the docli
23e60 73 74 20 69 73 20 64 65 73 63 20 2a 2f 0a 20 20  st is desc */.  
23e70 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20  char *aDoclist, 
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
23ea0 74 69 72 65 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  tire doclist */.
23eb0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 2c 20    int nDoclist, 
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ed0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 61    /* Length of a
23ee0 44 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  Doclist in bytes
23ef0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 49   */.  char **ppI
23f00 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
23f10 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
23f20 20 49 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 65   Iterator pointe
23f30 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  r */.  sqlite3_i
23f40 6e 74 36 34 20 2a 70 69 44 6f 63 69 64 2c 20 20  nt64 *piDocid,  
23f50 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
23f60 3a 20 44 6f 63 69 64 20 70 6f 69 6e 74 65 72 20  : Docid pointer 
23f70 2a 2f 0a 20 20 75 38 20 2a 70 62 45 6f 66 20 20  */.  u8 *pbEof  
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 6e 64       /* OUT: End
23fa0 2d 6f 66 2d 66 69 6c 65 20 66 6c 61 67 20 2a 2f  -of-file flag */
23fb0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20  .){.  char *p = 
23fc0 2a 70 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65  *ppIter;..  asse
23fd0 72 74 28 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29  rt( nDoclist>0 )
23fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 62 45  ;.  assert( *pbE
23ff0 6f 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  of==0 );.  asser
24000 74 28 20 70 20 7c 7c 20 2a 70 69 44 6f 63 69 64  t( p || *piDocid
24010 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24020 20 21 70 20 7c 7c 20 28 70 3e 3d 61 44 6f 63 6c   !p || (p>=aDocl
24030 69 73 74 20 26 26 20 70 3c 3d 26 61 44 6f 63 6c  ist && p<=&aDocl
24040 69 73 74 5b 6e 44 6f 63 6c 69 73 74 5d 29 20 29  ist[nDoclist]) )
24050 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  ;..  if( p==0 ){
24060 0a 20 20 20 20 70 20 3d 20 61 44 6f 63 6c 69 73  .    p = aDoclis
24070 74 3b 0a 20 20 20 20 70 20 2b 3d 20 73 71 6c 69  t;.    p += sqli
24080 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74  te3Fts3GetVarint
24090 28 70 2c 20 70 69 44 6f 63 69 64 29 3b 0a 20 20  (p, piDocid);.  
240a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 33 50  }else{.    fts3P
240b0 6f 73 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70  oslistCopy(0, &p
240c0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 3c  );.    while( p<
240d0 26 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69  &aDoclist[nDocli
240e0 73 74 5d 20 26 26 20 2a 70 3d 3d 30 20 29 20 70  st] && *p==0 ) p
240f0 2b 2b 3b 20 0a 20 20 20 20 69 66 28 20 70 3e 3d  ++; .    if( p>=
24100 26 61 44 6f 63 6c 69 73 74 5b 6e 44 6f 63 6c 69  &aDoclist[nDocli
24110 73 74 5d 20 29 7b 0a 20 20 20 20 20 20 2a 70 62  st] ){.      *pb
24120 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Eof = 1;.    }el
24130 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24140 33 5f 69 6e 74 36 34 20 69 56 61 72 3b 0a 20 20  3_int64 iVar;.  
24150 20 20 20 20 70 20 2b 3d 20 73 71 6c 69 74 65 33      p += sqlite3
24160 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 70 2c  Fts3GetVarint(p,
24170 20 26 69 56 61 72 29 3b 0a 20 20 20 20 20 20 2a   &iVar);.      *
24180 70 69 44 6f 63 69 64 20 2b 3d 20 28 28 62 44 65  piDocid += ((bDe
24190 73 63 49 64 78 20 3f 20 2d 31 20 3a 20 31 29 20  scIdx ? -1 : 1) 
241a0 2a 20 69 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  * iVar);.    }. 
241b0 20 7d 0a 0a 20 20 2a 70 70 49 74 65 72 20 3d 20   }..  *ppIter = 
241c0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  p;.}../*.** Adva
241d0 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
241e0 20 70 44 4c 20 74 6f 20 74 68 65 20 6e 65 78 74   pDL to the next
241f0 20 65 6e 74 72 79 20 69 6e 20 70 44 4c 2d 3e 61   entry in pDL->a
24200 41 6c 6c 2f 6e 41 6c 6c 2e 20 53 65 74 20 2a 70  All/nAll. Set *p
24210 62 45 6f 66 0a 2a 2a 20 74 6f 20 74 72 75 65 20  bEof.** to true 
24220 69 66 20 45 4f 46 20 69 73 20 72 65 61 63 68 65  if EOF is reache
24230 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
24240 64 20 66 74 73 33 45 76 61 6c 44 6c 50 68 72 61  d fts3EvalDlPhra
24250 73 65 4e 65 78 74 28 0a 20 20 46 74 73 33 54 61  seNext(.  Fts3Ta
24260 62 6c 65 20 2a 70 54 61 62 2c 0a 20 20 46 74 73  ble *pTab,.  Fts
24270 33 44 6f 63 6c 69 73 74 20 2a 70 44 4c 2c 0a 20  3Doclist *pDL,. 
24280 20 75 38 20 2a 70 62 45 6f 66 0a 29 7b 0a 20 20   u8 *pbEof.){.  
24290 63 68 61 72 20 2a 70 49 74 65 72 3b 20 20 20 20  char *pIter;    
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
242c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
242d0 67 68 20 61 41 6c 6c 20 2a 2f 0a 20 20 63 68 61  gh aAll */.  cha
242e0 72 20 2a 70 45 6e 64 20 3d 20 26 70 44 4c 2d 3e  r *pEnd = &pDL->
242f0 61 41 6c 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c 5d 3b  aAll[pDL->nAll];
24300 20 20 20 20 20 2f 2a 20 31 20 62 79 74 65 20 70       /* 1 byte p
24310 61 73 74 20 65 6e 64 20 6f 66 20 61 41 6c 6c 20  ast end of aAll 
24320 2a 2f 0a 20 0a 20 20 69 66 28 20 70 44 4c 2d 3e  */. .  if( pDL->
24330 70 4e 65 78 74 44 6f 63 69 64 20 29 7b 0a 20 20  pNextDocid ){.  
24340 20 20 70 49 74 65 72 20 3d 20 70 44 4c 2d 3e 70    pIter = pDL->p
24350 4e 65 78 74 44 6f 63 69 64 3b 0a 20 20 7d 65 6c  NextDocid;.  }el
24360 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 3d 20  se{.    pIter = 
24370 70 44 4c 2d 3e 61 41 6c 6c 3b 0a 20 20 7d 0a 0a  pDL->aAll;.  }..
24380 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e    if( pIter>=pEn
24390 64 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 68  d ){.    /* We h
243a0 61 76 65 20 61 6c 72 65 61 64 79 20 72 65 61 63  ave already reac
243b0 68 65 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  hed the end of t
243c0 68 69 73 20 64 6f 63 6c 69 73 74 2e 20 45 4f 46  his doclist. EOF
243d0 2e 20 2a 2f 0a 20 20 20 20 2a 70 62 45 6f 66 20  . */.    *pbEof 
243e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
243f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24400 69 44 65 6c 74 61 3b 0a 20 20 20 20 70 49 74 65  iDelta;.    pIte
24410 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33  r += sqlite3Fts3
24420 47 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  GetVarint(pIter,
24430 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69   &iDelta);.    i
24440 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64  f( pTab->bDescId
24450 78 3d 3d 30 20 7c 7c 20 70 44 4c 2d 3e 70 4e 65  x==0 || pDL->pNe
24460 78 74 44 6f 63 69 64 3d 3d 30 20 29 7b 0a 20 20  xtDocid==0 ){.  
24470 20 20 20 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20      pDL->iDocid 
24480 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 7d  += iDelta;.    }
24490 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 44 4c 2d  else{.      pDL-
244a0 3e 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74  >iDocid -= iDelt
244b0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 4c  a;.    }.    pDL
244c0 2d 3e 70 4c 69 73 74 20 3d 20 70 49 74 65 72 3b  ->pList = pIter;
244d0 0a 20 20 20 20 66 74 73 33 50 6f 73 6c 69 73 74  .    fts3Poslist
244e0 43 6f 70 79 28 30 2c 20 26 70 49 74 65 72 29 3b  Copy(0, &pIter);
244f0 0a 20 20 20 20 70 44 4c 2d 3e 6e 4c 69 73 74 20  .    pDL->nList 
24500 3d 20 28 69 6e 74 29 28 70 49 74 65 72 20 2d 20  = (int)(pIter - 
24510 70 44 4c 2d 3e 70 4c 69 73 74 29 3b 0a 0a 20 20  pDL->pList);..  
24520 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
24530 6f 69 6e 74 73 20 6a 75 73 74 20 70 61 73 74 20  oints just past 
24540 74 68 65 20 30 78 30 30 20 74 68 61 74 20 74 65  the 0x00 that te
24550 72 6d 69 6e 61 74 65 73 20 74 68 65 20 70 6f 73  rminates the pos
24560 69 74 69 6f 6e 2d 0a 20 20 20 20 2a 2a 20 6c 69  ition-.    ** li
24570 73 74 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 20  st for document 
24580 70 44 4c 2d 3e 69 44 6f 63 69 64 2e 20 48 6f 77  pDL->iDocid. How
24590 65 76 65 72 2c 20 69 66 20 74 68 69 73 20 70 6f  ever, if this po
245a0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 77 61 73 0a  sition-list was.
245b0 20 20 20 20 2a 2a 20 65 64 69 74 65 64 20 69 6e      ** edited in
245c0 20 70 6c 61 63 65 20 62 79 20 66 74 73 33 45 76   place by fts3Ev
245d0 61 6c 4e 65 61 72 54 72 69 6d 28 29 2c 20 74 68  alNearTrim(), th
245e0 65 6e 20 70 49 74 65 72 20 6d 61 79 20 6e 6f 74  en pIter may not
245f0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
24600 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 74   point to the st
24610 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
24620 64 6f 63 69 64 20 76 61 6c 75 65 2e 20 54 68 65  docid value. The
24630 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 20   following line 
24640 64 65 61 6c 73 0a 20 20 20 20 2a 2a 20 77 69 74  deals.    ** wit
24650 68 20 74 68 69 73 20 63 61 73 65 20 62 79 20 61  h this case by a
24660 64 76 61 6e 63 69 6e 67 20 70 49 74 65 72 20 70  dvancing pIter p
24670 61 73 74 20 74 68 65 20 7a 65 72 6f 2d 70 61 64  ast the zero-pad
24680 64 69 6e 67 20 61 64 64 65 64 20 62 79 0a 20 20  ding added by.  
24690 20 20 2a 2a 20 66 74 73 33 45 76 61 6c 4e 65 61    ** fts3EvalNea
246a0 72 54 72 69 6d 28 29 2e 20 20 2a 2f 0a 20 20 20  rTrim().  */.   
246b0 20 77 68 69 6c 65 28 20 70 49 74 65 72 3c 70 45   while( pIter<pE
246c0 6e 64 20 26 26 20 2a 70 49 74 65 72 3d 3d 30 20  nd && *pIter==0 
246d0 29 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 20 20  ) pIter++;..    
246e0 70 44 4c 2d 3e 70 4e 65 78 74 44 6f 63 69 64 20  pDL->pNextDocid 
246f0 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  = pIter;.    ass
24700 65 72 74 28 20 70 49 74 65 72 3e 3d 26 70 44 4c  ert( pIter>=&pDL
24710 2d 3e 61 41 6c 6c 5b 70 44 4c 2d 3e 6e 41 6c 6c  ->aAll[pDL->nAll
24720 5d 20 7c 7c 20 2a 70 49 74 65 72 20 29 3b 0a 20  ] || *pIter );. 
24730 20 20 20 2a 70 62 45 6f 66 20 3d 20 30 3b 0a 20     *pbEof = 0;. 
24740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70   }.}../*.** Help
24750 65 72 20 74 79 70 65 20 75 73 65 64 20 62 79 20  er type used by 
24760 66 74 73 33 45 76 61 6c 49 6e 63 72 50 68 72 61  fts3EvalIncrPhra
24770 73 65 4e 65 78 74 28 29 20 61 6e 64 20 69 6e 63  seNext() and inc
24780 72 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74  rPhraseTokenNext
24790 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ()..*/.typedef s
247a0 74 72 75 63 74 20 54 6f 6b 65 6e 44 6f 63 6c 69  truct TokenDocli
247b0 73 74 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 3b  st TokenDoclist;
247c0 0a 73 74 72 75 63 74 20 54 6f 6b 65 6e 44 6f 63  .struct TokenDoc
247d0 6c 69 73 74 20 7b 0a 20 20 69 6e 74 20 62 49 67  list {.  int bIg
247e0 6e 6f 72 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nore;.  sqlite3_
247f0 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 20 20  int64 iDocid;.  
24800 63 68 61 72 20 2a 70 4c 69 73 74 3b 0a 20 20 69  char *pList;.  i
24810 6e 74 20 6e 4c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a  nt nList;.};../*
24820 0a 2a 2a 20 54 6f 6b 65 6e 20 70 54 6f 6b 65 6e  .** Token pToken
24830 20 69 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   is an increment
24840 61 6c 6c 79 20 6c 6f 61 64 65 64 20 74 6f 6b 65  ally loaded toke
24850 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
24860 66 20 61 20 0a 2a 2a 20 6d 75 6c 74 69 2d 74 6f  f a .** multi-to
24870 6b 65 6e 20 70 68 72 61 73 65 2e 20 41 64 76 61  ken phrase. Adva
24880 6e 63 65 20 69 74 20 74 6f 20 74 68 65 20 6e 65  nce it to the ne
24890 78 74 20 6d 61 74 63 68 69 6e 67 20 64 6f 63 75  xt matching docu
248a0 6d 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 64  ment in the.** d
248b0 61 74 61 62 61 73 65 20 61 6e 64 20 70 6f 70 75  atabase and popu
248c0 6c 61 74 65 20 6f 75 74 70 75 74 20 76 61 72 69  late output vari
248d0 61 62 6c 65 20 2a 70 20 77 69 74 68 20 74 68 65  able *p with the
248e0 20 64 65 74 61 69 6c 73 20 6f 66 20 74 68 65 20   details of the 
248f0 6e 65 77 0a 2a 2a 20 65 6e 74 72 79 2e 20 4f 72  new.** entry. Or
24900 2c 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  , if the iterato
24910 72 20 68 61 73 20 72 65 61 63 68 65 64 20 45 4f  r has reached EO
24920 46 2c 20 73 65 74 20 2a 70 62 45 6f 66 20 74 6f  F, set *pbEof to
24930 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
24940 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
24950 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
24960 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
24970 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
24980 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  .** SQLITE_OK..*
24990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
249a0 72 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74  rPhraseTokenNext
249b0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  (.  Fts3Table *p
249c0 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
249d0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
249e0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  able handle */. 
249f0 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 50 68   Fts3Phrase *pPh
24a00 72 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  rase,           
24a10 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 20 61 64   /* Phrase to ad
24a20 76 61 6e 63 65 20 74 6f 6b 65 6e 20 6f 66 20 2a  vance token of *
24a30 2f 0a 20 20 69 6e 74 20 69 54 6f 6b 65 6e 2c 20  /.  int iToken, 
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 2f 2a 20 53 70 65 63 69 66 69 63 20      /* Specific 
24a60 74 6f 6b 65 6e 20 74 6f 20 61 64 76 61 6e 63 65  token to advance
24a70 20 2a 2f 0a 20 20 54 6f 6b 65 6e 44 6f 63 6c 69   */.  TokenDocli
24a80 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
24a90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6f        /* OUT: Do
24aa0 63 69 64 20 61 6e 64 20 64 6f 63 6c 69 73 74 20  cid and doclist 
24ab0 66 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  for new entry */
24ac0 0a 20 20 75 38 20 2a 70 62 45 6f 66 20 20 20 20  .  u8 *pbEof    
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
24af0 69 66 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  if iterator is a
24b00 74 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t EOF */.){.  in
24b10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24b20 3b 0a 0a 20 20 69 66 28 20 70 50 68 72 61 73 65  ;..  if( pPhrase
24b30 2d 3e 69 44 6f 63 6c 69 73 74 54 6f 6b 65 6e 3d  ->iDoclistToken=
24b40 3d 69 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61  =iToken ){.    a
24b50 73 73 65 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72  ssert( p->bIgnor
24b60 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
24b70 72 74 28 20 70 50 68 72 61 73 65 2d 3e 61 54 6f  rt( pPhrase->aTo
24b80 6b 65 6e 5b 69 54 6f 6b 65 6e 5d 2e 70 53 65 67  ken[iToken].pSeg
24b90 63 73 72 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  csr==0 );.    ft
24ba0 73 33 45 76 61 6c 44 6c 50 68 72 61 73 65 4e 65  s3EvalDlPhraseNe
24bb0 78 74 28 70 54 61 62 2c 20 26 70 50 68 72 61 73  xt(pTab, &pPhras
24bc0 65 2d 3e 64 6f 63 6c 69 73 74 2c 20 70 62 45 6f  e->doclist, pbEo
24bd0 66 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 73 74  f);.    p->pList
24be0 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c   = pPhrase->docl
24bf0 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 70  ist.pList;.    p
24c00 2d 3e 6e 4c 69 73 74 20 3d 20 70 50 68 72 61 73  ->nList = pPhras
24c10 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74  e->doclist.nList
24c20 3b 0a 20 20 20 20 70 2d 3e 69 44 6f 63 69 64 20  ;.    p->iDocid 
24c30 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  = pPhrase->docli
24c40 73 74 2e 69 44 6f 63 69 64 3b 0a 20 20 7d 65 6c  st.iDocid;.  }el
24c50 73 65 7b 0a 20 20 20 20 46 74 73 33 50 68 72 61  se{.    Fts3Phra
24c60 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20  seToken *pToken 
24c70 3d 20 26 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b  = &pPhrase->aTok
24c80 65 6e 5b 69 54 6f 6b 65 6e 5d 3b 0a 20 20 20 20  en[iToken];.    
24c90 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
24ca0 70 44 65 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a  pDeferred==0 );.
24cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
24cc0 65 6e 2d 3e 70 53 65 67 63 73 72 20 7c 7c 20 70  en->pSegcsr || p
24cd0 50 68 72 61 73 65 2d 3e 69 44 6f 63 6c 69 73 74  Phrase->iDoclist
24ce0 54 6f 6b 65 6e 3e 3d 30 20 29 3b 0a 20 20 20 20  Token>=0 );.    
24cf0 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 70 53 65 67  if( pToken->pSeg
24d00 63 73 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  csr ){.      ass
24d10 65 72 74 28 20 70 2d 3e 62 49 67 6e 6f 72 65 3d  ert( p->bIgnore=
24d20 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
24d30 20 73 71 6c 69 74 65 33 46 74 73 33 4d 73 72 49   sqlite3Fts3MsrI
24d40 6e 63 72 4e 65 78 74 28 0a 20 20 20 20 20 20 20  ncrNext(.       
24d50 20 20 20 70 54 61 62 2c 20 70 54 6f 6b 65 6e 2d     pTab, pToken-
24d60 3e 70 53 65 67 63 73 72 2c 20 26 70 2d 3e 69 44  >pSegcsr, &p->iD
24d70 6f 63 69 64 2c 20 26 70 2d 3e 70 4c 69 73 74 2c  ocid, &p->pList,
24d80 20 26 70 2d 3e 6e 4c 69 73 74 0a 20 20 20 20 20   &p->nList.     
24d90 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
24da0 3e 70 4c 69 73 74 3d 3d 30 20 29 20 2a 70 62 45  >pList==0 ) *pbE
24db0 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  of = 1;.    }els
24dc0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 62 49 67 6e  e{.      p->bIgn
24dd0 6f 72 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ore = 1;.    }. 
24de0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
24df0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  .}.../*.** The p
24e00 68 72 61 73 65 20 69 74 65 72 61 74 6f 72 20 70  hrase iterator p
24e10 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24e20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 3a 0a 2a 2a  ond argument:.**
24e30 0a 2a 2a 20 20 20 2a 20 66 65 61 74 75 72 65 73  .**   * features
24e40 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 6f   at least one to
24e50 6b 65 6e 20 74 68 61 74 20 75 73 65 73 20 61 6e  ken that uses an
24e60 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 64 6f 63   incremental doc
24e70 6c 69 73 74 2c 20 61 6e 64 20 0a 2a 2a 0a 2a 2a  list, and .**.**
24e80 20 20 20 2a 20 64 6f 65 73 20 6e 6f 74 20 63 6f     * does not co
24e90 6e 74 61 69 6e 20 61 6e 79 20 64 65 66 65 72 72  ntain any deferr
24ea0 65 64 20 74 6f 6b 65 6e 73 2e 0a 2a 2a 0a 2a 2a  ed tokens..**.**
24eb0 20 41 64 76 61 6e 63 65 20 69 74 20 74 6f 20 74   Advance it to t
24ec0 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
24ed0 20 64 6f 63 75 6d 6e 65 6e 74 20 69 6e 20 74 68   documnent in th
24ee0 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 70  e database and p
24ef0 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 46  opulate.** the F
24f00 74 73 33 44 6f 63 6c 69 73 74 2e 70 4c 69 73 74  ts3Doclist.pList
24f10 20 61 6e 64 20 6e 4c 69 73 74 20 66 69 65 6c 64   and nList field
24f20 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
24f30 72 65 20 69 73 20 6e 6f 20 22 6e 65 78 74 22 20  re is no "next" 
24f40 65 6e 74 72 79 20 61 6e 64 20 6e 6f 20 65 72 72  entry and no err
24f50 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
24f60 2a 70 62 45 6f 66 20 69 73 20 73 65 74 20 74 6f  *pbEof is set to
24f70 0a 2a 2a 20 31 20 62 65 66 6f 72 65 20 72 65 74  .** 1 before ret
24f80 75 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  urning. Otherwis
24f90 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  e, if no error o
24fa0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 69 74  ccurs and the it
24fb0 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 73 75 63  erator is.** suc
24fc0 63 65 73 73 66 75 6c 6c 79 20 61 64 76 61 6e 63  cessfully advanc
24fd0 65 64 2c 20 2a 70 62 45 6f 66 20 69 73 20 73 65  ed, *pbEof is se
24fe0 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t to 0..**.** If
24ff0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25000 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
25010 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
25020 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
25030 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
25040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
25050 73 33 45 76 61 6c 49 6e 63 72 50 68 72 61 73 65  s3EvalIncrPhrase
25060 4e 65 78 74 28 0a 20 20 46 74 73 33 43 75 72 73  Next(.  Fts3Curs
25070 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
25080 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 43          /* FTS C
25090 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a  ursor handle */.
250a0 20 20 46 74 73 33 50 68 72 61 73 65 20 2a 70 2c    Fts3Phrase *p,
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250c0 20 20 2f 2a 20 50 68 72 61 73 65 20 6f 62 6a 65    /* Phrase obje
250d0 63 74 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f  ct to advance to
250e0 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f 0a 20   next docid */. 
250f0 20 75 38 20 2a 70 62 45 6f 66 20 20 20 20 20 20   u8 *pbEof      
25100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25110 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
25120 31 20 69 66 20 45 4f 46 20 2a 2f 0a 29 7b 0a 20  1 if EOF */.){. 
25130 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25140 5f 4f 4b 3b 0a 20 20 46 74 73 33 44 6f 63 6c 69  _OK;.  Fts3Docli
25150 73 74 20 2a 70 44 4c 20 3d 20 26 70 2d 3e 64 6f  st *pDL = &p->do
25160 63 6c 69 73 74 3b 0a 20 20 46 74 73 33 54 61 62  clist;.  Fts3Tab
25170 6c 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33  le *pTab = (Fts3
25180 54 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61  Table *)pCsr->ba
25190 73 65 2e 70 56 74 61 62 3b 0a 20 20 75 38 20 62  se.pVtab;.  u8 b
251a0 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Eof = 0;..  /* T
251b0 68 69 73 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  his is only call
251c0 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
251d0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
251e0 70 68 72 61 73 65 20 68 61 73 20 61 74 20 6c 65  phrase has at le
251f0 61 73 74 0a 20 20 2a 2a 20 6f 6e 65 20 69 6e 63  ast.  ** one inc
25200 72 65 6d 65 6e 74 61 6c 20 74 6f 6b 65 6e 2e 20  remental token. 
25210 49 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  In which case th
25220 65 20 62 49 6e 63 72 20 66 6c 61 67 20 69 73 20  e bIncr flag is 
25230 73 65 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  set. */.  assert
25240 28 20 70 2d 3e 62 49 6e 63 72 3d 3d 31 20 29 3b  ( p->bIncr==1 );
25250 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 54 6f 6b 65  ..  if( p->nToke
25260 6e 3d 3d 31 20 26 26 20 70 2d 3e 62 49 6e 63 72  n==1 && p->bIncr
25270 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
25280 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 4e  ite3Fts3MsrIncrN
25290 65 78 74 28 70 54 61 62 2c 20 70 2d 3e 61 54 6f  ext(pTab, p->aTo
252a0 6b 65 6e 5b 30 5d 2e 70 53 65 67 63 73 72 2c 20  ken[0].pSegcsr, 
252b0 0a 20 20 20 20 20 20 20 20 26 70 44 4c 2d 3e 69  .        &pDL->i
252c0 44 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 70 4c 69  Docid, &pDL->pLi
252d0 73 74 2c 20 26 70 44 4c 2d 3e 6e 4c 69 73 74 0a  st, &pDL->nList.
252e0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
252f0 44 4c 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 62  DL->pList==0 ) b
25300 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Eof = 1;.  }else
25310 7b 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63 44  {.    int bDescD
25320 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 62  oclist = pCsr->b
25330 44 65 73 63 3b 0a 20 20 20 20 73 74 72 75 63 74  Desc;.    struct
25340 20 54 6f 6b 65 6e 44 6f 63 6c 69 73 74 20 61 5b   TokenDoclist a[
25350 4d 41 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f  MAX_INCR_PHRASE_
25360 54 4f 4b 45 4e 53 5d 3b 0a 0a 20 20 20 20 6d 65  TOKENS];..    me
25370 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
25380 66 28 61 29 29 3b 0a 20 20 20 20 61 73 73 65 72  f(a));.    asser
25390 74 28 20 70 2d 3e 6e 54 6f 6b 65 6e 3c 3d 4d 41  t( p->nToken<=MA
253a0 58 5f 49 4e 43 52 5f 50 48 52 41 53 45 5f 54 4f  X_INCR_PHRASE_TO
253b0 4b 45 4e 53 20 29 3b 0a 20 20 20 20 61 73 73 65  KENS );.    asse
253c0 72 74 28 20 70 2d 3e 69 44 6f 63 6c 69 73 74 54  rt( p->iDoclistT
253d0 6f 6b 65 6e 3c 4d 41 58 5f 49 4e 43 52 5f 50 48  oken<MAX_INCR_PH
253e0 52 41 53 45 5f 54 4f 4b 45 4e 53 20 29 3b 0a 0a  RASE_TOKENS );..
253f0 20 20 20 20 77 68 69 6c 65 28 20 62 45 6f 66 3d      while( bEof=
25400 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
25410 62 4d 61 78 53 65 74 20 3d 20 30 3b 0a 20 20 20  bMaxSet = 0;.   
25420 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
25430 20 69 4d 61 78 20 3d 20 30 3b 20 20 20 20 20 2f   iMax = 0;     /
25440 2a 20 4c 61 72 67 65 73 74 20 64 6f 63 69 64 20  * Largest docid 
25450 66 6f 72 20 61 6c 6c 20 69 74 65 72 61 74 6f 72  for all iterator
25460 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
25470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25480 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
25490 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
254a0 68 20 74 6f 6b 65 6e 73 20 2a 2f 0a 0a 20 20 20  h tokens */..   
254b0 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68     /* Advance th
254c0 65 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 65  e iterator for e
254d0 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
254e0 20 70 68 72 61 73 65 20 6f 6e 63 65 2e 20 2a 2f   phrase once. */
254f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
25500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25510 20 69 3c 70 2d 3e 6e 54 6f 6b 65 6e 20 26 26 20   i<p->nToken && 
25520 62 45 6f 66 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  bEof==0; i++){. 
25530 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
25540 50 68 72 61 73 65 54 6f 6b 65 6e 4e 65 78 74 28  PhraseTokenNext(
25550 70 54 61 62 2c 20 70 2c 20 69 2c 20 26 61 5b 69  pTab, p, i, &a[i
25560 5d 2c 20 26 62 45 6f 66 29 3b 0a 20 20 20 20 20  ], &bEof);.     
25570 20 20 20 69 66 28 20 61 5b 69 5d 2e 62 49 67 6e     if( a[i].bIgn
25580 6f 72 65 3d 3d 30 20 26 26 20 28 62 4d 61 78 53  ore==0 && (bMaxS
25590 65 74 3d 3d 30 20 7c 7c 20 44 4f 43 49 44 5f 43  et==0 || DOCID_C
255a0 4d 50 28 69 4d 61 78 2c 20 61 5b 69 5d 2e 69 44  MP(iMax, a[i].iD
255b0 6f 63 69 64 29 3c 30 29 20 29 7b 0a 20 20 20 20  ocid)<0) ){.    
255c0 20 20 20 20 20 20 69 4d 61 78 20 3d 20 61 5b 69        iMax = a[i
255d0 5d 2e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ].iDocid;.      
255e0 20 20 20 20 62 4d 61 78 53 65 74 20 3d 20 31 3b      bMaxSet = 1;
255f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25600 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
25610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
25620 7c 20 28 70 2d 3e 6e 54 6f 6b 65 6e 3e 3d 31 20  | (p->nToken>=1 
25630 26 26 20 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d 31  && a[p->nToken-1
25640 5d 2e 62 49 67 6e 6f 72 65 3d 3d 30 29 20 29 3b  ].bIgnore==0) );
25650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
25660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
25670 62 4d 61 78 53 65 74 20 29 3b 0a 0a 20 20 20 20  bMaxSet );..    
25680 20 20 2f 2a 20 4b 65 65 70 20 61 64 76 61 6e 63    /* Keep advanc
25690 69 6e 67 20 69 74 65 72 61 74 6f 72 73 20 75 6e  ing iterators un
256a0 74 69 6c 20 74 68 65 79 20 61 6c 6c 20 70 6f 69  til they all poi
256b0 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 64  nt to the same d
256c0 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  ocument */.     
256d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
256e0 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Token; i++){.   
256f0 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
25700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 6f  SQLITE_OK && bEo
25710 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  f==0 .          
25720 20 20 26 26 20 61 5b 69 5d 2e 62 49 67 6e 6f 72    && a[i].bIgnor
25730 65 3d 3d 30 20 26 26 20 44 4f 43 49 44 5f 43 4d  e==0 && DOCID_CM
25740 50 28 61 5b 69 5d 2e 69 44 6f 63 69 64 2c 20 69  P(a[i].iDocid, i
25750 4d 61 78 29 3c 30 20 0a 20 20 20 20 20 20 20 20  Max)<0 .        
25760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25770 3d 20 69 6e 63 72 50 68 72 61 73 65 54 6f 6b 65  = incrPhraseToke
25780 6e 4e 65 78 74 28 70 54 61 62 2c 20 70 2c 20 69  nNext(pTab, p, i
25790 2c 20 26 61 5b 69 5d 2c 20 26 62 45 6f 66 29 3b  , &a[i], &bEof);
257a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 44  .          if( D
257b0 4f 43 49 44 5f 43 4d 50 28 61 5b 69 5d 2e 69 44  OCID_CMP(a[i].iD
257c0 6f 63 69 64 2c 20 69 4d 61 78 29 3e 30 20 29 7b  ocid, iMax)>0 ){
257d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4d 61  .            iMa
257e0 78 20 3d 20 61 5b 69 5d 2e 69 44 6f 63 69 64 3b  x = a[i].iDocid;
257f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d  .            i =
25800 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
25810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25820 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
25830 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  k if the current
25840 20 65 6e 74 72 69 65 73 20 72 65 61 6c 6c 79 20   entries really 
25850 61 72 65 20 61 20 70 68 72 61 73 65 20 6d 61 74  are a phrase mat
25860 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ch */.      if( 
25870 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bEof==0 ){.     
25880 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30     int nList = 0
25890 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  ;.        int nB
258a0 79 74 65 20 3d 20 61 5b 70 2d 3e 6e 54 6f 6b 65  yte = a[p->nToke
258b0 6e 2d 31 5d 2e 6e 4c 69 73 74 3b 0a 20 20 20 20  n-1].nList;.    
258c0 20 20 20 20 63 68 61 72 20 2a 61 44 6f 63 6c 69      char *aDocli
258d0 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  st = sqlite3_mal
258e0 6c 6f 63 28 6e 42 79 74 65 2b 31 29 3b 0a 20 20  loc(nByte+1);.  
258f0 20 20 20 20 20 20 69 66 28 20 21 61 44 6f 63 6c        if( !aDocl
25900 69 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ist ) return SQL
25910 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
25920 20 20 20 6d 65 6d 63 70 79 28 61 44 6f 63 6c 69     memcpy(aDocli
25930 73 74 2c 20 61 5b 70 2d 3e 6e 54 6f 6b 65 6e 2d  st, a[p->nToken-
25940 31 5d 2e 70 4c 69 73 74 2c 20 6e 42 79 74 65 2b  1].pList, nByte+
25950 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  1);..        for
25960 28 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 54 6f 6b  (i=0; i<(p->nTok
25970 65 6e 2d 31 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  en-1); i++){.   
25980 20 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 2e         if( a[i].
25990 62 49 67 6e 6f 72 65 3d 3d 30 20 29 7b 0a 20 20  bIgnore==0 ){.  
259a0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
259b0 70 4c 20 3d 20 61 5b 69 5d 2e 70 4c 69 73 74 3b  pL = a[i].pList;
259c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
259d0 72 20 2a 70 52 20 3d 20 61 44 6f 63 6c 69 73 74  r *pR = aDoclist
259e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  ;.            ch
259f0 61 72 20 2a 70 4f 75 74 20 3d 20 61 44 6f 63 6c  ar *pOut = aDocl
25a00 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
25a10 20 69 6e 74 20 6e 44 69 73 74 20 3d 20 70 2d 3e   int nDist = p->
25a20 6e 54 6f 6b 65 6e 2d 31 2d 69 3b 0a 20 20 20 20  nToken-1-i;.    
25a30 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
25a40 3d 20 66 74 73 33 50 6f 73 6c 69 73 74 50 68 72  = fts3PoslistPhr
25a50 61 73 65 4d 65 72 67 65 28 26 70 4f 75 74 2c 20  aseMerge(&pOut, 
25a60 6e 44 69 73 74 2c 20 30 2c 20 31 2c 20 26 70 4c  nDist, 0, 1, &pL
25a70 2c 20 26 70 52 29 3b 0a 20 20 20 20 20 20 20 20  , &pR);.        
25a80 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
25a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25aa0 20 20 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74      nList = (int
25ab0 29 28 70 4f 75 74 20 2d 20 61 44 6f 63 6c 69 73  )(pOut - aDoclis
25ac0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  t);.          }.
25ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25ae0 20 20 69 66 28 20 69 3d 3d 28 70 2d 3e 6e 54 6f    if( i==(p->nTo
25af0 6b 65 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ken-1) ){.      
25b00 20 20 20 20 70 44 4c 2d 3e 69 44 6f 63 69 64 20      pDL->iDocid 
25b10 3d 20 69 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  = iMax;.        
25b20 20 20 70 44 4c 2d 3e 70 4c 69 73 74 20 3d 20 61    pDL->pList = a
25b30 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Doclist;.       
25b40 20 20 20 70 44 4c 2d 3e 6e 4c 69 73 74 20 3d 20     pDL->nList = 
25b50 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
25b60 20 70 44 4c 2d 3e 62 46 72 65 65 4c 69 73 74 20   pDL->bFreeList 
25b70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
25b80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
25b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25ba0 66 72 65 65 28 61 44 6f 63 6c 69 73 74 29 3b 0a  free(aDoclist);.
25bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25bc0 7d 0a 0a 20 20 2a 70 62 45 6f 66 20 3d 20 62 45  }..  *pbEof = bE
25bd0 6f 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  of;.  return rc;
25be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
25bf0 74 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 70 68  t to move the ph
25c00 72 61 73 65 20 69 74 65 72 61 74 6f 72 20 74 6f  rase iterator to
25c10 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
25c20 78 74 20 6d 61 74 63 68 69 6e 67 20 64 6f 63 69  xt matching doci
25c30 64 2e 20 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  d. .** If an err
25c40 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
25c50 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
25c60 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
25c70 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
25c80 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
25c90 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22 6e  f there is no "n
25ca0 65 78 74 22 20 65 6e 74 72 79 20 61 6e 64 20 6e  ext" entry and n
25cb0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
25cc0 74 68 65 6e 20 2a 70 62 45 6f 66 20 69 73 20 73  then *pbEof is s
25cd0 65 74 20 74 6f 0a 2a 2a 20 31 20 62 65 66 6f 72  et to.** 1 befor
25ce0 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f 74 68  e returning. Oth
25cf0 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 65 72  erwise, if no er
25d00 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
25d10 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a  he iterator is.*
25d20 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  * successfully a
25d30 64 76 61 6e 63 65 64 2c 20 2a 70 62 45 6f 66 20  dvanced, *pbEof 
25d40 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
25d50 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 45  static int fts3E
25d60 76 61 6c 50 68 72 61 73 65 4e 65 78 74 28 0a 20  valPhraseNext(. 
25d70 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73   Fts3Cursor *pCs
25d80 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
25d90 20 2f 2a 20 46 54 53 20 43 75 72 73 6f 72 20 68   /* FTS Cursor h
25da0 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 50  andle */.  Fts3P
25db0 68 72 61 73 65 20 2a 70 2c 20 20 20 20 20 20 20  hrase *p,       
25dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68             /* Ph
25dd0 72 61 73 65 20 6f 62 6a 65 63 74 20 74 6f 20 61  rase object to a
25de0 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 64  dvance to next d
25df0 6f 63 69 64 20 2a 2f 0a 20 20 75 38 20 2a 70 62  ocid */.  u8 *pb
25e00 45 6f 66 20 20 20 20 20 20 20 20 20 20 20 20 20  Eof             
25e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25e20 3a 20 53 65 74 20 74 6f 20 31 20 69 66 20 45 4f  : Set to 1 if EO
25e30 46 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  F */.){.  int rc
25e40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25e50 46 74 73 33 44 6f 63 6c 69 73 74 20 2a 70 44 4c  Fts3Doclist *pDL
25e60 20 3d 20 26 70 2d 3e 64 6f 63 6c 69 73 74 3b 0a   = &p->doclist;.
25e70 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61    Fts3Table *pTa
25e80 62 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a  b = (Fts3Table *
25e90 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61  )pCsr->base.pVta
25ea0 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 62 49 6e  b;..  if( p->bIn
25eb0 63 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  cr ){.    rc = f
25ec0 74 73 33 45 76 61 6c 49 6e 63 72 50 68 72 61 73  ts3EvalIncrPhras
25ed0 65 4e 65 78 74 28 70 43 73 72 2c 20 70 2c 20 70  eNext(pCsr, p, p
25ee0 62 45 6f 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  bEof);.  }else i
25ef0 66 28 20 70 43 73 72 2d 3e 62 44 65 73 63 21 3d  f( pCsr->bDesc!=
25f00 70 54 61 62 2d 3e 62 44 65 73 63 49 64 78 20 26  pTab->bDescIdx &
25f10 26 20 70 44 4c 2d 3e 6e 41 6c 6c 20 29 7b 0a 20  & pDL->nAll ){. 
25f20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 44 6f     sqlite3Fts3Do
25f30 63 6c 69 73 74 50 72 65 76 28 70 54 61 62 2d 3e  clistPrev(pTab->
25f40 62 44 65 73 63 49 64 78 2c 20 70 44 4c 2d 3e 61  bDescIdx, pDL->a
25f50 41 6c 6c 2c 20 70 44 4c 2d 3e 6e 41 6c 6c 2c 20  All, pDL->nAll, 
25f60 0a 20 20 20 20 20 20 20 20 26 70 44 4c 2d 3e 70  .        &pDL->p
25f70 4e 65 78 74 44 6f 63 69 64 2c 20 26 70 44 4c 2d  NextDocid, &pDL-
25f80 3e 69 44 6f 63 69 64 2c 20 26 70 44 4c 2d 3e 6e  >iDocid, &pDL->n
25f90 4c 69 73 74 2c 20 70 62 45 6f 66 0a 20 20 20 20  List, pbEof.    
25fa0 29 3b 0a 20 20 20 20 70 44 4c 2d 3e 70 4c 69 73  );.    pDL->pLis
25fb0 74 20 3d 20 70 44 4c 2d 3e 70 4e 65 78 74 44 6f  t = pDL->pNextDo
25fc0 63 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cid;.  }else{.  
25fd0 20 20 66 74 73 33 45 76 61 6c 44 6c 50 68 72 61    fts3EvalDlPhra
25fe0 73 65 4e 65 78 74 28 70 54 61 62 2c 20 70 44 4c  seNext(pTab, pDL
25ff0 2c 20 70 62 45 6f 66 29 3b 0a 20 20 7d 0a 0a 20  , pbEof);.  }.. 
26000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26010 2a 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  *.**.** If *pRc 
26020 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
26030 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
26040 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
26050 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
26060 20 4f 74 68 65 72 77 69 73 65 2c 20 66 74 73 33   Otherwise, fts3
26070 45 76 61 6c 50 68 72 61 73 65 53 74 61 72 74 28  EvalPhraseStart(
26080 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61  ) is called on a
26090 6c 6c 20 70 68 72 61 73 65 73 20 77 69 74 68 69  ll phrases withi
260a0 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  n the.** express
260b0 69 6f 6e 2e 20 41 6c 73 6f 20 74 68 65 20 46 74  ion. Also the Ft
260c0 73 33 45 78 70 72 2e 62 44 65 66 65 72 72 65 64  s3Expr.bDeferred
260d0 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
260e0 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 79   to true for any
260f0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
26100 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20 64 65  for which all de
26110 73 63 65 6e 64 65 6e 74 20 74 6f 6b 65 6e 73 20  scendent tokens 
26120 61 72 65 20 64 65 66 65 72 72 65 64 2e 0a 2a 2a  are deferred..**
26130 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
26140 20 62 4f 70 74 4f 6b 20 69 73 20 7a 65 72 6f 2c   bOptOk is zero,
26150 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
26160 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 0a  anteed that the.
26170 2a 2a 20 46 74 73 33 50 68 72 61 73 65 2e 64 6f  ** Fts3Phrase.do
26180 63 6c 69 73 74 2e 61 41 6c 6c 2f 6e 41 6c 6c 20  clist.aAll/nAll 
26190 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 61 69  variables contai
261a0 6e 20 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63  n the entire doc
261b0 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 65 61 63 68  list for.** each
261c0 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 65   phrase in the e
261d0 78 70 72 65 73 73 69 6f 6e 20 28 73 75 62 6a 65  xpression (subje
261e0 63 74 20 74 6f 20 64 65 66 65 72 72 65 64 20 74  ct to deferred t
261f0 6f 6b 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 29  oken processing)
26200 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 62 4f 70 74  ..** Or, if bOpt
26210 4f 6b 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Ok is non-zero, 
26220 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
26230 20 74 6f 6b 65 6e 73 20 77 69 74 68 69 6e 20 74   tokens within t
26240 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
26250 20 6d 61 79 20 62 65 20 6c 6f 61 64 65 64 20 69   may be loaded i
26260 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 2c 20 6d 65  ncrementally, me
26270 61 6e 69 6e 67 20 64 6f 63 6c 69 73 74 2e 61 41  aning doclist.aA
26280 6c 6c 2f 6e 41 6c 6c 20 69 73 20 6e 6f 74 20 61  ll/nAll is not a
26290 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
262a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
262b0 72 73 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  rs within this f
262c0 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73  unction, *pRc is
262d0 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74   set to an SQLit
262e0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
262f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
26300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26310 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 52 65   fts3EvalStartRe
26320 61 64 65 72 73 28 0a 20 20 46 74 73 33 43 75 72  aders(.  Fts3Cur
26330 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
26340 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
26350 43 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f  Cursor handle */
26360 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78  .  Fts3Expr *pEx
26370 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
26380 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
26390 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 70   to initialize p
263a0 68 72 61 73 65 73 20 69 6e 20 2a 2f 0a 20 20 69  hrases in */.  i
263b0 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20 20  nt *pRc         
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263d0 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
263e0 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  code */.){.  if(
263f0 20 70 45 78 70 72 20 26 26 20 53 51 4c 49 54 45   pExpr && SQLITE
26400 5f 4f 4b 3d 3d 2a 70 52 63 20 29 7b 0a 20 20 20  _OK==*pRc ){.   
26410 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54 79 70   if( pExpr->eTyp
26420 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41  e==FTSQUERY_PHRA
26430 53 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  SE ){.      int 
26440 6e 54 6f 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e  nToken = pExpr->
26450 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b  pPhrase->nToken;
26460 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  .      if( nToke
26470 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  n ){.        int
26480 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
26490 69 3d 30 3b 20 69 3c 6e 54 6f 6b 65 6e 3b 20 69  i=0; i<nToken; i
264a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
264b0 66 28 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73  f( pExpr->pPhras
264c0 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 2e 70 44 65  e->aToken[i].pDe
264d0 66 65 72 72 65 64 3d 3d 30 20 29 20 62 72 65 61  ferred==0 ) brea
264e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
264f0 20 20 20 20 20 70 45 78 70 72 2d 3e 62 44 65 66       pExpr->bDef
26500 65 72 72 65 64 20 3d 20 28 69 3d 3d 6e 54 6f 6b  erred = (i==nTok
26510 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  en);.      }.   
26520 20 20 20 2a 70 52 63 20 3d 20 66 74 73 33 45 76     *pRc = fts3Ev
26530 61 6c 50 68 72 61 73 65 53 74 61 72 74 28 70 43  alPhraseStart(pC
26540 73 72 2c 20 31 2c 20 70 45 78 70 72 2d 3e 70 50  sr, 1, pExpr->pP
26550 68 72 61 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  hrase);.    }els
26560 65 7b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  e{.      fts3Eva
26570 6c 53 74 61 72 74 52 65 61 64 65 72 73 28 70 43  lStartReaders(pC
26580 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  sr, pExpr->pLeft
26590 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 66 74  , pRc);.      ft
265a0 73 33 45 76 61 6c 53 74 61 72 74 52 65 61 64 65  s3EvalStartReade
265b0 72 73 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  rs(pCsr, pExpr->
265c0 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
265d0 20 20 20 20 70 45 78 70 72 2d 3e 62 44 65 66 65      pExpr->bDefe
265e0 72 72 65 64 20 3d 20 28 70 45 78 70 72 2d 3e 70  rred = (pExpr->p
265f0 4c 65 66 74 2d 3e 62 44 65 66 65 72 72 65 64 20  Left->bDeferred 
26600 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
26610 2d 3e 62 44 65 66 65 72 72 65 64 29 3b 0a 20 20  ->bDeferred);.  
26620 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
26630 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   An array of the
26640 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
26650 74 75 72 65 73 20 69 73 20 61 73 73 65 6d 62 6c  tures is assembl
26660 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
26670 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 6f 66 20  e process.** of 
26680 73 65 6c 65 63 74 69 6e 67 20 74 6f 6b 65 6e 73  selecting tokens
26690 20 74 6f 20 64 65 66 65 72 20 62 65 66 6f 72 65   to defer before
266a0 20 74 68 65 20 71 75 65 72 79 20 73 74 61 72 74   the query start
266b0 73 20 65 78 65 63 75 74 69 6e 67 20 28 61 73 20  s executing (as 
266c0 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 78  part.** of the x
266d0 46 69 6c 74 65 72 28 29 20 6d 65 74 68 6f 64 29  Filter() method)
266e0 2e 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  . There is one e
266f0 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 61 72  lement in the ar
26700 72 61 79 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ray for each.** 
26710 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 46 54 53  token in the FTS
26720 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
26730 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 64 69  ** Tokens are di
26740 76 69 64 65 64 20 69 6e 74 6f 20 41 4e 44 2f 4e  vided into AND/N
26750 45 41 52 20 63 6c 75 73 74 65 72 73 2e 20 41 6c  EAR clusters. Al
26760 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 61 20 63 6c  l tokens in a cl
26770 75 73 74 65 72 20 62 65 6c 6f 6e 67 0a 2a 2a 20  uster belong.** 
26780 74 6f 20 70 68 72 61 73 65 73 20 74 68 61 74 20  to phrases that 
26790 61 72 65 20 63 6f 6e 6e 65 63 74 65 64 20 6f 6e  are connected on
267a0 6c 79 20 62 79 20 41 4e 44 20 61 6e 64 20 4e 45  ly by AND and NE
267b0 41 52 20 6f 70 65 72 61 74 6f 72 73 20 28 6e 6f  AR operators (no
267c0 74 20 4f 52 20 6f 72 0a 2a 2a 20 4e 4f 54 29 2e  t OR or.** NOT).
267d0 20 57 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e   When determinin
267e0 67 20 74 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65  g tokens to defe
267f0 72 2c 20 65 61 63 68 20 41 4e 44 2f 4e 45 41 52  r, each AND/NEAR
26800 20 63 6c 75 73 74 65 72 20 69 73 20 63 6f 6e 73   cluster is cons
26810 69 64 65 72 65 64 0a 2a 2a 20 73 65 70 61 72 61  idered.** separa
26820 74 65 6c 79 2e 20 54 68 65 20 72 6f 6f 74 20 6f  tely. The root o
26830 66 20 61 20 74 6f 6b 65 6e 73 20 41 4e 44 2f 4e  f a tokens AND/N
26840 45 41 52 20 63 6c 75 73 74 65 72 20 69 73 20 73  EAR cluster is s
26850 74 6f 72 65 64 20 69 6e 20 0a 2a 2a 20 46 74 73  tored in .** Fts
26860 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 2e 70 52  3TokenAndCost.pR
26870 6f 6f 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  oot..*/.typedef 
26880 73 74 72 75 63 74 20 46 74 73 33 54 6f 6b 65 6e  struct Fts3Token
26890 41 6e 64 43 6f 73 74 20 46 74 73 33 54 6f 6b 65  AndCost Fts3Toke
268a0 6e 41 6e 64 43 6f 73 74 3b 0a 73 74 72 75 63 74  nAndCost;.struct
268b0 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73   Fts3TokenAndCos
268c0 74 20 7b 0a 20 20 46 74 73 33 50 68 72 61 73 65  t {.  Fts3Phrase
268d0 20 2a 70 50 68 72 61 73 65 3b 20 20 20 20 20 20   *pPhrase;      
268e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 68 72        /* The phr
268f0 61 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 62 65  ase the token be
26900 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  longs to */.  in
26910 74 20 69 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20  t iToken;       
26920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26930 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
26940 65 6e 20 69 6e 20 70 68 72 61 73 65 20 2a 2f 0a  en in phrase */.
26950 20 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65    Fts3PhraseToke
26960 6e 20 2a 70 54 6f 6b 65 6e 3b 20 20 20 20 20 20  n *pToken;      
26970 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 69    /* The token i
26980 74 73 65 6c 66 20 2a 2f 0a 20 20 46 74 73 33 45  tself */.  Fts3E
26990 78 70 72 20 2a 70 52 6f 6f 74 3b 20 20 20 20 20  xpr *pRoot;     
269a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
269b0 6f 74 20 6f 66 20 4e 45 41 52 2f 41 4e 44 20 63  ot of NEAR/AND c
269c0 6c 75 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  luster */.  int 
269d0 6e 4f 76 66 6c 3b 20 20 20 20 20 20 20 20 20 20  nOvfl;          
269e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
269f0 75 6d 62 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f  umber of overflo
26a00 77 20 70 61 67 65 73 20 74 6f 20 6c 6f 61 64 20  w pages to load 
26a10 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  doclist */.  int
26a20 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a40 54 68 65 20 63 6f 6c 75 6d 6e 20 74 68 65 20 74  The column the t
26a50 6f 6b 65 6e 20 6d 75 73 74 20 6d 61 74 63 68 20  oken must match 
26a60 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
26a70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
26a80 65 64 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 61  ed to populate a
26a90 6e 20 61 6c 6c 6f 63 61 74 65 64 20 46 74 73 33  n allocated Fts3
26aa0 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 61 72 72  TokenAndCost arr
26ab0 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  ay..**.** If *pR
26ac0 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
26ad0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
26ae0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
26af0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
26b00 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
26b10 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
26b20 20 64 75 72 69 6e 67 20 65 78 65 63 75 74 69 6f   during executio
26b30 6e 2c 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  n, *pRc is set t
26b40 6f 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65  o an.** SQLite e
26b50 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
26b60 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 45 76  atic void fts3Ev
26b70 61 6c 54 6f 6b 65 6e 43 6f 73 74 73 28 0a 20 20  alTokenCosts(.  
26b80 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72  Fts3Cursor *pCsr
26b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26ba0 2f 2a 20 46 54 53 20 43 75 72 73 6f 72 20 68 61  /* FTS Cursor ha
26bb0 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45 78  ndle */.  Fts3Ex
26bc0 70 72 20 2a 70 52 6f 6f 74 2c 20 20 20 20 20 20  pr *pRoot,      
26bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
26be0 74 20 6f 66 20 63 75 72 72 65 6e 74 20 41 4e 44  t of current AND
26bf0 2f 4e 45 41 52 20 63 6c 75 73 74 65 72 20 2a 2f  /NEAR cluster */
26c00 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78  .  Fts3Expr *pEx
26c10 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
26c20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
26c30 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a   to consider */.
26c40 20 20 46 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f    Fts3TokenAndCo
26c50 73 74 20 2a 2a 70 70 54 43 2c 20 20 20 20 20 20  st **ppTC,      
26c60 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 65    /* Write new e
26c70 6e 74 72 69 65 73 20 74 6f 20 2a 28 2a 70 70 54  ntries to *(*ppT
26c80 43 29 2b 2b 20 2a 2f 0a 20 20 46 74 73 33 45 78  C)++ */.  Fts3Ex
26c90 70 72 20 2a 2a 2a 70 70 4f 72 2c 20 20 20 20 20  pr ***ppOr,     
26ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
26cb0 74 65 20 6e 65 77 20 4f 52 20 72 6f 6f 74 20 74  te new OR root t
26cc0 6f 20 2a 28 2a 70 70 4f 72 29 2b 2b 20 2a 2f 0a  o *(*ppOr)++ */.
26cd0 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
26d00 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
26d10 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
26d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
26d30 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
26d40 51 55 45 52 59 5f 50 48 52 41 53 45 20 29 7b 0a  QUERY_PHRASE ){.
26d50 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65        Fts3Phrase
26d60 20 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78 70   *pPhrase = pExp
26d70 72 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20 20  r->pPhrase;.    
26d80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
26d90 6f 72 28 69 3d 30 3b 20 2a 70 52 63 3d 3d 53 51  or(i=0; *pRc==SQ
26da0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 50 68  LITE_OK && i<pPh
26db0 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20 69 2b  rase->nToken; i+
26dc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33  +){.        Fts3
26dd0 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54  TokenAndCost *pT
26de0 43 20 3d 20 28 2a 70 70 54 43 29 2b 2b 3b 0a 20  C = (*ppTC)++;. 
26df0 20 20 20 20 20 20 20 70 54 43 2d 3e 70 50 68 72         pTC->pPhr
26e00 61 73 65 20 3d 20 70 50 68 72 61 73 65 3b 0a 20  ase = pPhrase;. 
26e10 20 20 20 20 20 20 20 70 54 43 2d 3e 69 54 6f 6b         pTC->iTok
26e20 65 6e 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  en = i;.        
26e30 70 54 43 2d 3e 70 52 6f 6f 74 20 3d 20 70 52 6f  pTC->pRoot = pRo
26e40 6f 74 3b 0a 20 20 20 20 20 20 20 20 70 54 43 2d  ot;.        pTC-
26e50 3e 70 54 6f 6b 65 6e 20 3d 20 26 70 50 68 72 61  >pToken = &pPhra
26e60 73 65 2d 3e 61 54 6f 6b 65 6e 5b 69 5d 3b 0a 20  se->aToken[i];. 
26e70 20 20 20 20 20 20 20 70 54 43 2d 3e 69 43 6f 6c         pTC->iCol
26e80 20 3d 20 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c   = pPhrase->iCol
26e90 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  umn;.        *pR
26ea0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4d  c = sqlite3Fts3M
26eb0 73 72 4f 76 66 6c 28 70 43 73 72 2c 20 70 54 43  srOvfl(pCsr, pTC
26ec0 2d 3e 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73  ->pToken->pSegcs
26ed0 72 2c 20 26 70 54 43 2d 3e 6e 4f 76 66 6c 29 3b  r, &pTC->nOvfl);
26ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26ef0 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 65 54  se if( pExpr->eT
26f00 79 70 65 21 3d 46 54 53 51 55 45 52 59 5f 4e 4f  ype!=FTSQUERY_NO
26f10 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
26f20 74 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  t( pExpr->eType=
26f30 3d 46 54 53 51 55 45 52 59 5f 4f 52 0a 20 20 20  =FTSQUERY_OR.   
26f40 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
26f50 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45 52  ->eType==FTSQUER
26f60 59 5f 41 4e 44 0a 20 20 20 20 20 20 20 20 20 20  Y_AND.          
26f70 20 7c 7c 20 70 45 78 70 72 2d 3e 65 54 79 70 65   || pExpr->eType
26f80 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 0a  ==FTSQUERY_NEAR.
26f90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
26fa0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
26fb0 65 66 74 20 26 26 20 70 45 78 70 72 2d 3e 70 52  eft && pExpr->pR
26fc0 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 69 66  ight );.      if
26fd0 28 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d  ( pExpr->eType==
26fe0 46 54 53 51 55 45 52 59 5f 4f 52 20 29 7b 0a 20  FTSQUERY_OR ){. 
26ff0 20 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70         pRoot = p
27000 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
27010 20 20 20 20 20 2a 2a 70 70 4f 72 20 3d 20 70 52       **ppOr = pR
27020 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 28 2a 70  oot;.        (*p
27030 70 4f 72 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  pOr)++;.      }.
27040 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 54 6f        fts3EvalTo
27050 6b 65 6e 43 6f 73 74 73 28 70 43 73 72 2c 20 70  kenCosts(pCsr, p
27060 52 6f 6f 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  Root, pExpr->pLe
27070 66 74 2c 20 70 70 54 43 2c 20 70 70 4f 72 2c 20  ft, ppTC, ppOr, 
27080 70 52 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pRc);.      if( 
27090 70 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54  pExpr->eType==FT
270a0 53 51 55 45 52 59 5f 4f 52 20 29 7b 0a 20 20 20  SQUERY_OR ){.   
270b0 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 45 78       pRoot = pEx
270c0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
270d0 20 20 20 20 2a 2a 70 70 4f 72 20 3d 20 70 52 6f      **ppOr = pRo
270e0 6f 74 3b 0a 20 20 20 20 20 20 20 20 28 2a 70 70  ot;.        (*pp
270f0 4f 72 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Or)++;.      }. 
27100 20 20 20 20 20 66 74 73 33 45 76 61 6c 54 6f 6b       fts3EvalTok
27110 65 6e 43 6f 73 74 73 28 70 43 73 72 2c 20 70 52  enCosts(pCsr, pR
27120 6f 6f 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  oot, pExpr->pRig
27130 68 74 2c 20 70 70 54 43 2c 20 70 70 4f 72 2c 20  ht, ppTC, ppOr, 
27140 70 52 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRc);.    }.  }.
27150 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
27160 6e 65 20 74 68 65 20 61 76 65 72 61 67 65 20 64  ne the average d
27170 6f 63 75 6d 65 6e 74 20 28 72 6f 77 29 20 73 69  ocument (row) si
27180 7a 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  ze in pages. If 
27190 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 77  successful,.** w
271a0 72 69 74 65 20 74 68 69 73 20 76 61 6c 75 65 20  rite this value 
271b0 74 6f 20 2a 70 6e 50 61 67 65 20 61 6e 64 20 72  to *pnPage and r
271c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
271d0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
271e0 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  rn.** an SQLite 
271f0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
27200 2a 20 54 68 65 20 61 76 65 72 61 67 65 20 64 6f  * The average do
27210 63 75 6d 65 6e 74 20 73 69 7a 65 20 69 6e 20 70  cument size in p
27220 61 67 65 73 20 69 73 20 63 61 6c 63 75 6c 61 74  ages is calculat
27230 65 64 20 62 79 20 66 69 72 73 74 20 63 61 6c 63  ed by first calc
27240 75 6c 61 74 69 6e 67 20 0a 2a 2a 20 64 65 74 65  ulating .** dete
27250 72 6d 69 6e 69 6e 67 20 74 68 65 20 61 76 65 72  rmining the aver
27260 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  age size in byte
27270 73 2c 20 42 2e 20 49 66 20 42 20 69 73 20 6c 65  s, B. If B is le
27280 73 73 20 74 68 61 6e 20 74 68 65 20 61 6d 6f 75  ss than the amou
27290 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 20 74 68  nt.** of data th
272a0 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 61  at will fit on a
272b0 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 70 61 67   single leaf pag
272c0 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74  e of an intkey t
272d0 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 69 73 20  able in.** this 
272e0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
272f0 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 73 69  he average docsi
27300 7a 65 20 69 73 20 31 2e 20 4f 74 68 65 72 77 69  ze is 1. Otherwi
27310 73 65 2c 20 69 74 20 69 73 20 31 20 70 6c 75 73  se, it is 1 plus
27320 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
27330 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
27340 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 61 20 72   consumed by a r
27350 65 63 6f 72 64 20 42 20 62 79 74 65 73 20 69 6e  ecord B bytes in
27360 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
27370 20 69 6e 74 20 66 74 73 33 45 76 61 6c 41 76 65   int fts3EvalAve
27380 72 61 67 65 44 6f 63 73 69 7a 65 28 46 74 73 33  rageDocsize(Fts3
27390 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e  Cursor *pCsr, in
273a0 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69 66  t *pnPage){.  if
273b0 28 20 70 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3d  ( pCsr->nRowAvg=
273c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
273d0 20 61 76 65 72 61 67 65 20 64 6f 63 75 6d 65 6e   average documen
273e0 74 20 73 69 7a 65 2c 20 77 68 69 63 68 20 69 73  t size, which is
273f0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 61 6c   required to cal
27400 63 75 6c 61 74 65 20 74 68 65 20 63 6f 73 74 0a  culate the cost.
27410 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 64      ** of each d
27420 6f 63 6c 69 73 74 2c 20 68 61 73 20 6e 6f 74 20  oclist, has not 
27430 79 65 74 20 62 65 65 6e 20 64 65 74 65 72 6d 69  yet been determi
27440 6e 65 64 2e 20 52 65 61 64 20 74 68 65 20 72 65  ned. Read the re
27450 71 75 69 72 65 64 20 0a 20 20 20 20 2a 2a 20 64  quired .    ** d
27460 61 74 61 20 66 72 6f 6d 20 74 68 65 20 25 5f 73  ata from the %_s
27470 74 61 74 20 74 61 62 6c 65 20 74 6f 20 63 61 6c  tat table to cal
27480 63 75 6c 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  culate it..    *
27490 2a 0a 20 20 20 20 2a 2a 20 45 6e 74 72 79 20 30  *.    ** Entry 0
274a0 20 6f 66 20 74 68 65 20 25 5f 73 74 61 74 20 74   of the %_stat t
274b0 61 62 6c 65 20 69 73 20 61 20 62 6c 6f 62 20 63  able is a blob c
274c0 6f 6e 74 61 69 6e 69 6e 67 20 28 6e 43 6f 6c 2b  ontaining (nCol+
274d0 31 29 20 46 54 53 33 20 0a 20 20 20 20 2a 2a 20  1) FTS3 .    ** 
274e0 76 61 72 69 6e 74 73 2c 20 77 68 65 72 65 20 6e  varints, where n
274f0 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Col is the numbe
27500 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
27510 74 68 65 20 46 54 53 33 20 74 61 62 6c 65 2e 0a  the FTS3 table..
27520 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
27530 20 76 61 72 69 6e 74 20 69 73 20 74 68 65 20 6e   varint is the n
27540 75 6d 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e  umber of documen
27550 74 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ts currently sto
27560 72 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  red in.    ** th
27570 65 20 74 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c  e table. The fol
27580 6c 6f 77 69 6e 67 20 6e 43 6f 6c 20 76 61 72 69  lowing nCol vari
27590 6e 74 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  nts contain the 
275a0 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 0a  total amount of.
275b0 20 20 20 20 2a 2a 20 64 61 74 61 20 73 74 6f 72      ** data stor
275c0 65 64 20 69 6e 20 61 6c 6c 20 72 6f 77 73 20 6f  ed in all rows o
275d0 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66  f each column of
275e0 20 74 68 65 20 74 61 62 6c 65 2c 20 66 72 6f 6d   the table, from
275f0 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 74 6f 20   left.    ** to 
27600 72 69 67 68 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  right..    */.  
27610 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74    int rc;.    Ft
27620 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 74  s3Table *p = (Ft
27630 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62  s3Table*)pCsr->b
27640 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 73  ase.pVtab;.    s
27650 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
27660 6d 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  mt;.    sqlite3_
27670 69 6e 74 36 34 20 6e 44 6f 63 20 3d 20 30 3b 0a  int64 nDoc = 0;.
27680 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
27690 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20  4 nByte = 0;.   
276a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 45 6e   const char *pEn
276b0 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  d;.    const cha
276c0 72 20 2a 61 3b 0a 0a 20 20 20 20 72 63 20 3d 20  r *a;..    rc = 
276d0 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c 65 63  sqlite3Fts3Selec
276e0 74 44 6f 63 74 6f 74 61 6c 28 70 2c 20 26 70 53  tDoctotal(p, &pS
276f0 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tmt);.    if( rc
27700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
27710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 20 3d  turn rc;.    a =
27720 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27730 62 6c 6f 62 28 70 53 74 6d 74 2c 20 30 29 3b 0a  blob(pStmt, 0);.
27740 20 20 20 20 61 73 73 65 72 74 28 20 61 20 29 3b      assert( a );
27750 0a 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 61 5b  ..    pEnd = &a[
27760 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
27770 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 5d 3b  ytes(pStmt, 0)];
27780 0a 20 20 20 20 61 20 2b 3d 20 73 71 6c 69 74 65  .    a += sqlite
27790 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 61  3Fts3GetVarint(a
277a0 2c 20 26 6e 44 6f 63 29 3b 0a 20 20 20 20 77 68  , &nDoc);.    wh
277b0 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20  ile( a<pEnd ){. 
277c0 20 20 20 20 20 61 20 2b 3d 20 73 71 6c 69 74 65       a += sqlite
277d0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 61  3Fts3GetVarint(a
277e0 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  , &nByte);.    }
277f0 0a 20 20 20 20 69 66 28 20 6e 44 6f 63 3d 3d 30  .    if( nDoc==0
27800 20 7c 7c 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   || nByte==0 ){.
27810 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
27820 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
27830 20 20 72 65 74 75 72 6e 20 46 54 53 5f 43 4f 52    return FTS_COR
27840 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 20 20 7d  RUPT_VTAB;.    }
27850 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 44 6f 63  ..    pCsr->nDoc
27860 20 3d 20 6e 44 6f 63 3b 0a 20 20 20 20 70 43 73   = nDoc;.    pCs
27870 72 2d 3e 6e 52 6f 77 41 76 67 20 3d 20 28 69 6e  r->nRowAvg = (in
27880 74 29 28 28 28 6e 42 79 74 65 20 2f 20 6e 44 6f  t)(((nByte / nDo
27890 63 29 20 2b 20 70 2d 3e 6e 50 67 73 7a 29 20 2f  c) + p->nPgsz) /
278a0 20 70 2d 3e 6e 50 67 73 7a 29 3b 0a 20 20 20 20   p->nPgsz);.    
278b0 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 52  assert( pCsr->nR
278c0 6f 77 41 76 67 3e 30 20 29 3b 20 0a 20 20 20 20  owAvg>0 ); .    
278d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
278e0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  et(pStmt);.    i
278f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27900 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27910 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 70  }..  *pnPage = p
27920 43 73 72 2d 3e 6e 52 6f 77 41 76 67 3b 0a 20 20  Csr->nRowAvg;.  
27930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
27950 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27960 65 64 20 74 6f 20 73 65 6c 65 63 74 20 74 68 65  ed to select the
27970 20 74 6f 6b 65 6e 73 20 28 69 66 20 61 6e 79 29   tokens (if any)
27980 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 0a 2a   that will be .*
27990 2a 20 64 65 66 65 72 72 65 64 2e 20 54 68 65 20  * deferred. The 
279a0 61 72 72 61 79 20 61 54 43 5b 5d 20 68 61 73 20  array aTC[] has 
279b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6f 70  already been pop
279c0 75 6c 61 74 65 64 20 77 68 65 6e 20 74 68 69 73  ulated when this
279d0 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2e 0a 2a   is.** called..*
279e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
279f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  on is called onc
27a00 65 20 66 6f 72 20 65 61 63 68 20 41 4e 44 2f 4e  e for each AND/N
27a10 45 41 52 20 63 6c 75 73 74 65 72 20 69 6e 20 74  EAR cluster in t
27a20 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  he .** expressio
27a30 6e 2e 20 45 61 63 68 20 69 6e 76 6f 63 61 74 69  n. Each invocati
27a40 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
27a50 69 63 68 20 74 6f 6b 65 6e 73 20 74 6f 20 64 65  ich tokens to de
27a60 66 65 72 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  fer within.** th
27a70 65 20 63 6c 75 73 74 65 72 20 77 69 74 68 20 72  e cluster with r
27a80 6f 6f 74 20 6e 6f 64 65 20 70 52 6f 6f 74 2e 20  oot node pRoot. 
27a90 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
27aa0 76 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ve the definitio
27ab0 6e 0a 2a 2a 20 6f 66 20 73 74 72 75 63 74 20 46  n.** of struct F
27ac0 74 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20  ts3TokenAndCost 
27ad0 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73  for more details
27ae0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72  ..**.** If no er
27af0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
27b00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27b10 64 20 61 6e 64 20 73 71 6c 69 74 65 33 46 74 73  d and sqlite3Fts
27b20 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 0a 2a 2a  3DeferToken().**
27b30 20 63 61 6c 6c 65 64 20 6f 6e 20 65 61 63 68 20   called on each 
27b40 74 6f 6b 65 6e 20 74 6f 20 64 65 66 65 72 2e 20  token to defer. 
27b50 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
27b60 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
27b70 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
27b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
27b90 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65 66 65  s3EvalSelectDefe
27ba0 72 72 65 64 28 0a 20 20 46 74 73 33 43 75 72 73  rred(.  Fts3Curs
27bb0 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
27bc0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 43          /* FTS C
27bd0 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a 2f 0a  ursor handle */.
27be0 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 6f 6f    Fts3Expr *pRoo
27bf0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
27c00 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 74 6f    /* Consider to
27c10 6b 65 6e 73 20 77 69 74 68 20 74 68 69 73 20 72  kens with this r
27c20 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74  oot node */.  Ft
27c30 73 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a  s3TokenAndCost *
27c40 61 54 43 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  aTC,          /*
27c50 20 41 72 72 61 79 20 6f 66 20 65 78 70 72 65 73   Array of expres
27c60 73 69 6f 6e 20 74 6f 6b 65 6e 73 20 61 6e 64 20  sion tokens and 
27c70 63 6f 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  costs */.  int n
27c80 54 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TC              
27c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27ca0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
27cb0 69 6e 20 61 54 43 5b 5d 20 2a 2f 0a 29 7b 0a 20  in aTC[] */.){. 
27cc0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62   Fts3Table *pTab
27cd0 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29   = (Fts3Table *)
27ce0 70 43 73 72 2d 3e 62 61 73 65 2e 70 56 74 61 62  pCsr->base.pVtab
27cf0 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 53 69 7a 65  ;.  int nDocSize
27d00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27d10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27d20 20 70 61 67 65 73 20 70 65 72 20 64 6f 63 20 6c   pages per doc l
27d30 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72  oaded */.  int r
27d40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
27d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27d60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
27d70 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27d90 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
27da0 62 6c 65 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ble for various 
27db0 70 75 72 70 6f 73 65 73 20 2a 2f 0a 20 20 69 6e  purposes */.  in
27dc0 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 20 20 20 20  t nOvfl = 0;    
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27de0 20 54 6f 74 61 6c 20 6f 76 65 72 66 6c 6f 77 20   Total overflow 
27df0 70 61 67 65 73 20 75 73 65 64 20 62 79 20 64 6f  pages used by do
27e00 63 6c 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  clists */.  int 
27e10 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20  nToken = 0;     
27e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e30 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  otal number of t
27e40 6f 6b 65 6e 73 20 69 6e 20 63 6c 75 73 74 65 72  okens in cluster
27e50 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d 69 6e 45   */..  int nMinE
27e60 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
27e70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 69         /* The mi
27e80 6e 69 6d 75 6d 20 63 6f 75 6e 74 20 66 6f 72 20  nimum count for 
27e90 61 6e 79 20 70 68 72 61 73 65 20 73 6f 20 66 61  any phrase so fa
27ea0 72 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 61  r. */.  int nLoa
27eb0 64 34 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  d4 = 1;         
27ec0 20 20 20 20 20 20 20 20 2f 2a 20 28 50 68 72 61          /* (Phra
27ed0 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
27ee0 20 6c 6f 61 64 65 64 29 5e 34 2e 20 2a 2f 0a 0a   loaded)^4. */..
27ef0 20 20 2f 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20    /* Tokens are 
27f00 6e 65 76 65 72 20 64 65 66 65 72 72 65 64 20 66  never deferred f
27f10 6f 72 20 46 54 53 20 74 61 62 6c 65 73 20 63 72  or FTS tables cr
27f20 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
27f30 63 6f 6e 74 65 6e 74 3d 78 78 78 0a 20 20 2a 2a  content=xxx.  **
27f40 20 6f 70 74 69 6f 6e 2e 20 54 68 65 20 72 65 61   option. The rea
27f50 73 6f 6e 20 62 65 69 6e 67 20 74 68 61 74 20 69  son being that i
27f60 74 20 69 73 20 6e 6f 74 20 67 75 61 72 61 6e 74  t is not guarant
27f70 65 65 64 20 74 68 61 74 20 74 68 65 20 63 6f 6e  eed that the con
27f80 74 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 20  tent.  ** table 
27f90 61 63 74 75 61 6c 6c 79 20 63 6f 6e 74 61 69 6e  actually contain
27fa0 73 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 20  s the same data 
27fb0 61 73 20 74 68 65 20 69 6e 64 65 78 2e 20 54 6f  as the index. To
27fc0 20 70 72 65 76 65 6e 74 20 74 68 69 73 20 66 72   prevent this fr
27fd0 6f 6d 0a 20 20 2a 2a 20 63 61 75 73 69 6e 67 20  om.  ** causing 
27fe0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2c 20 74 68  any problems, th
27ff0 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  e deferred token
28000 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
28010 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
28020 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 63 6f   disabled for co
28030 6e 74 65 6e 74 3d 78 78 78 20 74 61 62 6c 65 73  ntent=xxx tables
28040 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d  . */.  if( pTab-
28050 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a  >zContentTbl ){.
28060 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28070 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
28080 43 6f 75 6e 74 20 74 68 65 20 74 6f 6b 65 6e 73  Count the tokens
28090 20 69 6e 20 74 68 69 73 20 41 4e 44 2f 4e 45 41   in this AND/NEA
280a0 52 20 63 6c 75 73 74 65 72 2e 20 49 66 20 6e 6f  R cluster. If no
280b0 6e 65 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73  ne of the doclis
280c0 74 73 0a 20 20 2a 2a 20 61 73 73 6f 63 69 61 74  ts.  ** associat
280d0 65 64 20 77 69 74 68 20 74 68 65 20 74 6f 6b 65  ed with the toke
280e0 6e 73 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76  ns spill onto ov
280f0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 6f 72  erflow pages, or
28100 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
28110 2a 20 6f 6e 6c 79 20 31 20 74 6f 6b 65 6e 2c 20  * only 1 token, 
28120 65 78 69 74 20 65 61 72 6c 79 2e 20 4e 6f 20 74  exit early. No t
28130 6f 6b 65 6e 73 20 74 6f 20 64 65 66 65 72 20 69  okens to defer i
28140 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
28150 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
28160 54 43 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  TC; ii++){.    i
28170 66 28 20 61 54 43 5b 69 69 5d 2e 70 52 6f 6f 74  f( aTC[ii].pRoot
28180 3d 3d 70 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  ==pRoot ){.     
28190 20 6e 4f 76 66 6c 20 2b 3d 20 61 54 43 5b 69 69   nOvfl += aTC[ii
281a0 5d 2e 6e 4f 76 66 6c 3b 0a 20 20 20 20 20 20 6e  ].nOvfl;.      n
281b0 54 6f 6b 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Token++;.    }. 
281c0 20 7d 0a 20 20 69 66 28 20 6e 4f 76 66 6c 3d 3d   }.  if( nOvfl==
281d0 30 20 7c 7c 20 6e 54 6f 6b 65 6e 3c 32 20 29 20  0 || nToken<2 ) 
281e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
281f0 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74  ;..  /* Obtain t
28200 68 65 20 61 76 65 72 61 67 65 20 64 6f 63 73 69  he average docsi
28210 7a 65 20 28 69 6e 20 70 61 67 65 73 29 2e 20 2a  ze (in pages). *
28220 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 45 76 61  /.  rc = fts3Eva
28230 6c 41 76 65 72 61 67 65 44 6f 63 73 69 7a 65 28  lAverageDocsize(
28240 70 43 73 72 2c 20 26 6e 44 6f 63 53 69 7a 65 29  pCsr, &nDocSize)
28250 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
28260 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 44 6f  SQLITE_OK || nDo
28270 63 53 69 7a 65 3e 30 20 29 3b 0a 0a 0a 20 20 2f  cSize>0 );...  /
28280 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
28290 68 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20  h all tokens in 
282a0 74 68 69 73 20 41 4e 44 2f 4e 45 41 52 20 63 6c  this AND/NEAR cl
282b0 75 73 74 65 72 2c 20 69 6e 20 61 73 63 65 6e 64  uster, in ascend
282c0 69 6e 67 20 6f 72 64 65 72 20 0a 20 20 2a 2a 20  ing order .  ** 
282d0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
282e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
282f0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6c 6f 61  that will be loa
28300 64 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72  ded by the pager
28310 20 6c 61 79 65 72 20 0a 20 20 2a 2a 20 74 6f 20   layer .  ** to 
28320 72 65 74 72 69 65 76 65 20 74 68 65 20 65 6e 74  retrieve the ent
28330 69 72 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20  ire doclist for 
28340 74 68 65 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 74  the token from t
28350 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
28360 65 78 2e 0a 20 20 2a 2a 20 4c 6f 61 64 20 74 68  ex..  ** Load th
28370 65 20 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 74  e doclists for t
28380 6f 6b 65 6e 73 20 74 68 61 74 20 61 72 65 20 65  okens that are e
28390 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ither:.  **.  **
283a0 20 20 20 61 2e 20 54 68 65 20 63 68 65 61 70 65     a. The cheape
283b0 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  st token in the 
283c0 65 6e 74 69 72 65 20 71 75 65 72 79 20 28 69 2e  entire query (i.
283d0 65 2e 20 74 68 65 20 6f 6e 65 20 76 69 73 69 74  e. the one visit
283e0 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 20  ed by the.  **  
283f0 20 20 20 20 66 69 72 73 74 20 69 74 65 72 61 74      first iterat
28400 69 6f 6e 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  ion of this loop
28410 29 2c 20 6f 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ), or.  **.  ** 
28420 20 20 62 2e 20 50 61 72 74 20 6f 66 20 61 20 6d    b. Part of a m
28430 75 6c 74 69 2d 74 6f 6b 65 6e 20 70 68 72 61 73  ulti-token phras
28440 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 66 74  e..  **.  ** Aft
28450 65 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 64 6f  er each token do
28460 63 6c 69 73 74 20 69 73 20 6c 6f 61 64 65 64 2c  clist is loaded,
28470 20 6d 65 72 67 65 20 69 74 20 77 69 74 68 20 74   merge it with t
28480 68 65 20 6f 74 68 65 72 73 20 66 72 6f 6d 20 74  he others from t
28490 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 70 68 72  he.  ** same phr
284a0 61 73 65 20 61 6e 64 20 63 6f 75 6e 74 20 74 68  ase and count th
284b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  e number of docu
284c0 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 20 6d  ments that the m
284d0 65 72 67 65 64 20 64 6f 63 6c 69 73 74 0a 20 20  erged doclist.  
284e0 2a 2a 20 63 6f 6e 74 61 69 6e 73 2e 20 53 65 74  ** contains. Set
284f0 20 76 61 72 69 61 62 6c 65 20 22 6e 4d 69 6e 45   variable "nMinE
28500 73 74 22 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c  st" to the small
28510 65 73 74 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f  est number of do
28520 63 75 6d 65 6e 74 73 20 69 6e 20 0a 20 20 2a 2a  cuments in .  **
28530 20 61 6e 79 20 70 68 72 61 73 65 20 64 6f 63 6c   any phrase docl
28540 69 73 74 20 66 6f 72 20 77 68 69 63 68 20 31 20  ist for which 1 
28550 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 20 64 6f  or more token do
28560 63 6c 69 73 74 73 20 68 61 76 65 20 62 65 65 6e  clists have been
28570 20 6c 6f 61 64 65 64 2e 0a 20 20 2a 2a 20 4c 65   loaded..  ** Le
28580 74 20 6e 4f 74 68 65 72 20 62 65 20 74 68 65 20  t nOther be the 
28590 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68 65 72 20  number of other 
285a0 70 68 72 61 73 65 73 20 66 6f 72 20 77 68 69 63  phrases for whic
285b0 68 20 69 74 20 69 73 20 63 65 72 74 61 69 6e 20  h it is certain 
285c0 74 68 61 74 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72  that.  ** one or
285d0 20 6d 6f 72 65 20 74 6f 6b 65 6e 73 20 77 69 6c   more tokens wil
285e0 6c 20 6e 6f 74 20 62 65 20 64 65 66 65 72 72 65  l not be deferre
285f0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  d..  **.  ** The
28600 6e 2c 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  n, for each toke
28610 6e 2c 20 64 65 66 65 72 20 69 74 20 69 66 20 6c  n, defer it if l
28620 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
28630 73 74 20 77 6f 75 6c 64 20 72 65 73 75 6c 74 20  st would result 
28640 69 6e 0a 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20  in.  ** loading 
28650 4e 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  N or more overfl
28660 6f 77 20 70 61 67 65 73 20 69 6e 74 6f 20 6d 65  ow pages into me
28670 6d 6f 72 79 2c 20 77 68 65 72 65 20 4e 20 69 73  mory, where N is
28680 20 63 6f 6d 70 75 74 65 64 20 61 73 3a 0a 20 20   computed as:.  
28690 2a 2a 0a 20 20 2a 2a 20 20 20 20 28 6e 4d 69 6e  **.  **    (nMin
286a0 45 73 74 20 2b 20 34 5e 6e 4f 74 68 65 72 20 2d  Est + 4^nOther -
286b0 20 31 29 20 2f 20 28 34 5e 6e 4f 74 68 65 72 29   1) / (4^nOther)
286c0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
286d0 3b 20 69 69 3c 6e 54 6f 6b 65 6e 20 26 26 20 72  ; ii<nToken && r
286e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
286f0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 43  ++){.    int iTC
28700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28710 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
28720 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
28730 68 20 61 54 43 5b 5d 20 61 72 72 61 79 2e 20 2a  h aTC[] array. *
28740 2f 0a 20 20 20 20 46 74 73 33 54 6f 6b 65 6e 41  /.    Fts3TokenA
28750 6e 64 43 6f 73 74 20 2a 70 54 43 20 3d 20 30 3b  ndCost *pTC = 0;
28760 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 63 68      /* Set to ch
28770 65 61 70 65 73 74 20 72 65 6d 61 69 6e 69 6e 67  eapest remaining
28780 20 74 6f 6b 65 6e 2e 20 2a 2f 0a 0a 20 20 20 20   token. */..    
28790 2f 2a 20 53 65 74 20 70 54 43 20 74 6f 20 70 6f  /* Set pTC to po
287a0 69 6e 74 20 74 6f 20 74 68 65 20 63 68 65 61 70  int to the cheap
287b0 65 73 74 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  est remaining to
287c0 6b 65 6e 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ken. */.    for(
287d0 69 54 43 3d 30 3b 20 69 54 43 3c 6e 54 43 3b 20  iTC=0; iTC<nTC; 
287e0 69 54 43 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  iTC++){.      if
287f0 28 20 61 54 43 5b 69 54 43 5d 2e 70 54 6f 6b 65  ( aTC[iTC].pToke
28800 6e 20 26 26 20 61 54 43 5b 69 54 43 5d 2e 70 52  n && aTC[iTC].pR
28810 6f 6f 74 3d 3d 70 52 6f 6f 74 20 0a 20 20 20 20  oot==pRoot .    
28820 20 20 20 26 26 20 28 21 70 54 43 20 7c 7c 20 61     && (!pTC || a
28830 54 43 5b 69 54 43 5d 2e 6e 4f 76 66 6c 3c 70 54  TC[iTC].nOvfl<pT
28840 43 2d 3e 6e 4f 76 66 6c 29 20 0a 20 20 20 20 20  C->nOvfl) .     
28850 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 43 20   ){.        pTC 
28860 3d 20 26 61 54 43 5b 69 54 43 5d 3b 0a 20 20 20  = &aTC[iTC];.   
28870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
28880 73 73 65 72 74 28 20 70 54 43 20 29 3b 0a 0a 20  ssert( pTC );.. 
28890 20 20 20 69 66 28 20 69 69 20 26 26 20 70 54 43     if( ii && pTC
288a0 2d 3e 6e 4f 76 66 6c 3e 3d 28 28 6e 4d 69 6e 45  ->nOvfl>=((nMinE
288b0 73 74 2b 28 6e 4c 6f 61 64 34 2f 34 29 2d 31 29  st+(nLoad4/4)-1)
288c0 2f 28 6e 4c 6f 61 64 34 2f 34 29 29 2a 6e 44 6f  /(nLoad4/4))*nDo
288d0 63 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  cSize ){.      /
288e0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
288f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
28900 6f 20 6c 6f 61 64 20 66 6f 72 20 74 68 69 73 20  o load for this 
28910 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 61  (and therefore a
28920 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73  ll.      ** subs
28930 65 71 75 65 6e 74 29 20 74 6f 6b 65 6e 73 20 69  equent) tokens i
28940 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
28950 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
28960 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20  ber of pages .  
28970 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
28980 20 62 65 20 6c 6f 61 64 65 64 20 69 66 20 61 6c   be loaded if al
28990 6c 20 73 75 62 73 65 71 75 65 6e 74 20 74 6f 6b  l subsequent tok
289a0 65 6e 73 20 61 72 65 20 64 65 66 65 72 72 65 64  ens are deferred
289b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
289c0 20 46 74 73 33 50 68 72 61 73 65 54 6f 6b 65 6e   Fts3PhraseToken
289d0 20 2a 70 54 6f 6b 65 6e 20 3d 20 70 54 43 2d 3e   *pToken = pTC->
289e0 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 72 63  pToken;.      rc
289f0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 44 65   = sqlite3Fts3De
28a00 66 65 72 54 6f 6b 65 6e 28 70 43 73 72 2c 20 70  ferToken(pCsr, p
28a10 54 6f 6b 65 6e 2c 20 70 54 43 2d 3e 69 43 6f 6c  Token, pTC->iCol
28a20 29 3b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67  );.      fts3Seg
28a30 52 65 61 64 65 72 43 75 72 73 6f 72 46 72 65 65  ReaderCursorFree
28a40 28 70 54 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72  (pToken->pSegcsr
28a50 29 3b 0a 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d  );.      pToken-
28a60 3e 70 53 65 67 63 73 72 20 3d 20 30 3b 0a 20 20  >pSegcsr = 0;.  
28a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
28a80 2a 20 53 65 74 20 6e 4c 6f 61 64 34 20 74 6f 20  * Set nLoad4 to 
28a90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 28 34 5e  the value of (4^
28aa0 6e 4f 74 68 65 72 29 20 66 6f 72 20 74 68 65 20  nOther) for the 
28ab0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
28ac0 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
28ad0 6f 72 2d 6c 6f 6f 70 2e 20 45 78 63 65 70 74 2c  or-loop. Except,
28ae0 20 6c 69 6d 69 74 20 74 68 65 20 76 61 6c 75 65   limit the value
28af0 20 74 6f 20 32 5e 32 34 20 74 6f 20 70 72 65 76   to 2^24 to prev
28b00 65 6e 74 20 69 74 20 66 72 6f 6d 20 0a 20 20 20  ent it from .   
28b10 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 69 6e     ** overflowin
28b20 67 20 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74  g the 32-bit int
28b30 65 67 65 72 20 69 74 20 69 73 20 73 74 6f 72 65  eger it is store
28b40 64 20 69 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 69  d in. */.      i
28b50 66 28 20 69 69 3c 31 32 20 29 20 6e 4c 6f 61 64  f( ii<12 ) nLoad
28b60 34 20 3d 20 6e 4c 6f 61 64 34 2a 34 3b 0a 0a 20  4 = nLoad4*4;.. 
28b70 20 20 20 20 20 69 66 28 20 69 69 3d 3d 30 20 7c       if( ii==0 |
28b80 7c 20 28 70 54 43 2d 3e 70 50 68 72 61 73 65 2d  | (pTC->pPhrase-
28b90 3e 6e 54 6f 6b 65 6e 3e 31 20 26 26 20 69 69 21  >nToken>1 && ii!
28ba0 3d 6e 54 6f 6b 65 6e 2d 31 29 20 29 7b 0a 20 20  =nToken-1) ){.  
28bb0 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20        /* Either 
28bc0 74 68 69 73 20 69 73 20 74 68 65 20 63 68 65 61  this is the chea
28bd0 70 65 73 74 20 74 6f 6b 65 6e 20 69 6e 20 74 68  pest token in th
28be0 65 20 65 6e 74 69 72 65 20 71 75 65 72 79 2c 20  e entire query, 
28bf0 6f 72 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  or it is.       
28c00 20 2a 2a 20 70 61 72 74 20 6f 66 20 61 20 6d 75   ** part of a mu
28c10 6c 74 69 2d 74 6f 6b 65 6e 20 70 68 72 61 73 65  lti-token phrase
28c20 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
28c30 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
28c40 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   will.        **
28c50 20 28 65 76 65 6e 74 75 61 6c 6c 79 29 20 62 65   (eventually) be
28c60 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
28c70 6f 72 79 2e 20 49 74 20 6d 61 79 20 61 73 20 77  ory. It may as w
28c80 65 6c 6c 20 62 65 20 6e 6f 77 2e 20 2a 2f 0a 20  ell be now. */. 
28c90 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73         Fts3Phras
28ca0 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d  eToken *pToken =
28cb0 20 70 54 43 2d 3e 70 54 6f 6b 65 6e 3b 0a 20 20   pTC->pToken;.  
28cc0 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20        int nList 
28cd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
28ce0 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  r *pList = 0;.  
28cf0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 54        rc = fts3T
28d00 65 72 6d 53 65 6c 65 63 74 28 70 54 61 62 2c 20  ermSelect(pTab, 
28d10 70 54 6f 6b 65 6e 2c 20 70 54 43 2d 3e 69 43 6f  pToken, pTC->iCo
28d20 6c 2c 20 26 6e 4c 69 73 74 2c 20 26 70 4c 69 73  l, &nList, &pLis
28d30 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
28d40 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28d50 4b 20 7c 7c 20 70 4c 69 73 74 3d 3d 30 20 29 3b  K || pList==0 );
28d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28d80 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
28d90 33 45 76 61 6c 50 68 72 61 73 65 4d 65 72 67 65  3EvalPhraseMerge
28da0 54 6f 6b 65 6e 28 0a 20 20 20 20 20 20 20 20 20  Token(.         
28db0 20 20 20 20 20 70 54 61 62 2c 20 70 54 43 2d 3e       pTab, pTC->
28dc0 70 50 68 72 61 73 65 2c 20 70 54 43 2d 3e 69 54  pPhrase, pTC->iT
28dd0 6f 6b 65 6e 2c 70 4c 69 73 74 2c 6e 4c 69 73 74  oken,pList,nList
28de0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
28df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28e00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28e10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
28e20 6e 74 20 6e 43 6f 75 6e 74 3b 0a 20 20 20 20 20  nt nCount;.     
28e30 20 20 20 20 20 6e 43 6f 75 6e 74 20 3d 20 66 74       nCount = ft
28e40 73 33 44 6f 63 6c 69 73 74 43 6f 75 6e 74 44 6f  s3DoclistCountDo
28e50 63 69 64 73 28 0a 20 20 20 20 20 20 20 20 20 20  cids(.          
28e60 20 20 20 20 70 54 43 2d 3e 70 50 68 72 61 73 65      pTC->pPhrase
28e70 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 2c 20  ->doclist.aAll, 
28e80 70 54 43 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f  pTC->pPhrase->do
28e90 63 6c 69 73 74 2e 6e 41 6c 6c 0a 20 20 20 20 20  clist.nAll.     
28ea0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28eb0 20 20 69 66 28 20 69 69 3d 3d 30 20 7c 7c 20 6e    if( ii==0 || n
28ec0 43 6f 75 6e 74 3c 6e 4d 69 6e 45 73 74 20 29 20  Count<nMinEst ) 
28ed0 6e 4d 69 6e 45 73 74 20 3d 20 6e 43 6f 75 6e 74  nMinEst = nCount
28ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28ef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 54    }.    }.    pT
28f00 43 2d 3e 70 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20  C->pToken = 0;. 
28f10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
28f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
28f30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
28f40 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  d from within th
28f50 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
28f60 2e 20 49 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  . It initializes
28f70 0a 2a 2a 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  .** the full-tex
28f80 74 20 71 75 65 72 79 20 63 75 72 72 65 6e 74 6c  t query currentl
28f90 79 20 73 74 6f 72 65 64 20 69 6e 20 70 43 73 72  y stored in pCsr
28fa0 2d 3e 70 45 78 70 72 2e 20 54 6f 20 69 74 65 72  ->pExpr. To iter
28fb0 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  ate through.** t
28fc0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 20  he results of a 
28fd0 71 75 65 72 79 2c 20 74 68 65 20 63 61 6c 6c 65  query, the calle
28fe0 72 20 64 6f 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  r does:.**.**   
28ff0 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 28 70   fts3EvalStart(p
29000 43 73 72 29 3b 0a 2a 2a 20 20 20 20 77 68 69 6c  Csr);.**    whil
29010 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
29020 66 74 73 33 45 76 61 6c 4e 65 78 74 28 70 43 73  fts3EvalNext(pCs
29030 72 29 3b 0a 2a 2a 20 20 20 20 20 20 69 66 28 20  r);.**      if( 
29040 70 43 73 72 2d 3e 62 45 6f 66 20 29 20 62 72 65  pCsr->bEof ) bre
29050 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 2e 2e 2e 20  ak;.**      ... 
29060 72 65 74 75 72 6e 20 72 6f 77 20 70 43 73 72 2d  return row pCsr-
29070 3e 69 50 72 65 76 49 64 20 74 6f 20 74 68 65 20  >iPrevId to the 
29080 63 61 6c 6c 65 72 20 2e 2e 2e 0a 2a 2a 20 20 20  caller ....**   
29090 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74   }.*/.static int
290a0 20 66 74 73 33 45 76 61 6c 53 74 61 72 74 28 46   fts3EvalStart(F
290b0 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ts3Cursor *pCsr)
290c0 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  {.  Fts3Table *p
290d0 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c 65  Tab = (Fts3Table
290e0 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
290f0 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tab;.  int rc = 
29100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
29110 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 69   nToken = 0;.  i
29120 6e 74 20 6e 4f 72 20 3d 20 30 3b 0a 0a 20 20 2f  nt nOr = 0;..  /
29130 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4d 75 6c  * Allocate a Mul
29140 74 69 53 65 67 52 65 61 64 65 72 20 66 6f 72 20  tiSegReader for 
29150 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68  each token in th
29160 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  e expression. */
29170 0a 20 20 66 74 73 33 45 76 61 6c 41 6c 6c 6f 63  .  fts3EvalAlloc
29180 61 74 65 52 65 61 64 65 72 73 28 70 43 73 72 2c  ateReaders(pCsr,
29190 20 70 43 73 72 2d 3e 70 45 78 70 72 2c 20 26 6e   pCsr->pExpr, &n
291a0 54 6f 6b 65 6e 2c 20 26 6e 4f 72 2c 20 26 72 63  Token, &nOr, &rc
291b0 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69  );..  /* Determi
291c0 6e 65 20 77 68 69 63 68 2c 20 69 66 20 61 6e 79  ne which, if any
291d0 2c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20  , tokens in the 
291e0 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c  expression shoul
291f0 64 20 62 65 20 64 65 66 65 72 72 65 64 2e 20 2a  d be deferred. *
29200 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29210 5f 44 49 53 41 42 4c 45 5f 46 54 53 34 5f 44 45  _DISABLE_FTS4_DE
29220 46 45 52 52 45 44 0a 20 20 69 66 28 20 72 63 3d  FERRED.  if( rc=
29230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 54  =SQLITE_OK && nT
29240 6f 6b 65 6e 3e 31 20 26 26 20 70 54 61 62 2d 3e  oken>1 && pTab->
29250 62 46 74 73 34 20 29 7b 0a 20 20 20 20 46 74 73  bFts4 ){.    Fts
29260 33 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 61  3TokenAndCost *a
29270 54 43 3b 0a 20 20 20 20 46 74 73 33 45 78 70 72  TC;.    Fts3Expr
29280 20 2a 2a 61 70 4f 72 3b 0a 20 20 20 20 61 54 43   **apOr;.    aTC
29290 20 3d 20 28 46 74 73 33 54 6f 6b 65 6e 41 6e 64   = (Fts3TokenAnd
292a0 43 6f 73 74 20 2a 29 73 71 6c 69 74 65 33 5f 6d  Cost *)sqlite3_m
292b0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 73  alloc(.        s
292c0 69 7a 65 6f 66 28 46 74 73 33 54 6f 6b 65 6e 41  izeof(Fts3TokenA
292d0 6e 64 43 6f 73 74 29 20 2a 20 6e 54 6f 6b 65 6e  ndCost) * nToken
292e0 0a 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28  .      + sizeof(
292f0 46 74 73 33 45 78 70 72 20 2a 29 20 2a 20 6e 4f  Fts3Expr *) * nO
29300 72 20 2a 20 32 0a 20 20 20 20 29 3b 0a 20 20 20  r * 2.    );.   
29310 20 61 70 4f 72 20 3d 20 28 46 74 73 33 45 78 70   apOr = (Fts3Exp
29320 72 20 2a 2a 29 26 61 54 43 5b 6e 54 6f 6b 65 6e  r **)&aTC[nToken
29330 5d 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 54 43  ];..    if( !aTC
29340 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
29350 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
29360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
29370 74 20 69 69 3b 0a 20 20 20 20 20 20 46 74 73 33  t ii;.      Fts3
29380 54 6f 6b 65 6e 41 6e 64 43 6f 73 74 20 2a 70 54  TokenAndCost *pT
29390 43 20 3d 20 61 54 43 3b 0a 20 20 20 20 20 20 46  C = aTC;.      F
293a0 74 73 33 45 78 70 72 20 2a 2a 70 70 4f 72 20 3d  ts3Expr **ppOr =
293b0 20 61 70 4f 72 3b 0a 0a 20 20 20 20 20 20 66 74   apOr;..      ft
293c0 73 33 45 76 61 6c 54 6f 6b 65 6e 43 6f 73 74 73  s3EvalTokenCosts
293d0 28 70 43 73 72 2c 20 30 2c 20 70 43 73 72 2d 3e  (pCsr, 0, pCsr->
293e0 70 45 78 70 72 2c 20 26 70 54 43 2c 20 26 70 70  pExpr, &pTC, &pp
293f0 4f 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  Or, &rc);.      
29400 6e 54 6f 6b 65 6e 20 3d 20 28 69 6e 74 29 28 70  nToken = (int)(p
29410 54 43 2d 61 54 43 29 3b 0a 20 20 20 20 20 20 6e  TC-aTC);.      n
29420 4f 72 20 3d 20 28 69 6e 74 29 28 70 70 4f 72 2d  Or = (int)(ppOr-
29430 61 70 4f 72 29 3b 0a 0a 20 20 20 20 20 20 69 66  apOr);..      if
29440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29450 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
29460 66 74 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65  fts3EvalSelectDe
29470 66 65 72 72 65 64 28 70 43 73 72 2c 20 30 2c 20  ferred(pCsr, 0, 
29480 61 54 43 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  aTC, nToken);.  
29490 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
294a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
294b0 20 69 69 3c 6e 4f 72 3b 20 69 69 2b 2b 29 7b 0a   ii<nOr; ii++){.
294c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
294d0 74 73 33 45 76 61 6c 53 65 6c 65 63 74 44 65 66  ts3EvalSelectDef
294e0 65 72 72 65 64 28 70 43 73 72 2c 20 61 70 4f 72  erred(pCsr, apOr
294f0 5b 69 69 5d 2c 20 61 54 43 2c 20 6e 54 6f 6b 65  [ii], aTC, nToke
29500 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n);.        }.  
29510 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
29520 69 74 65 33 5f 66 72 65 65 28 61 54 43 29 3b 0a  ite3_free(aTC);.
29530 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
29540 0a 0a 20 20 66 74 73 33 45 76 61 6c 53 74 61 72  ..  fts3EvalStar
29550 74 52 65 61 64 65 72 73 28 70 43 73 72 2c 20 70  tReaders(pCsr, p
29560 43 73 72 2d 3e 70 45 78 70 72 2c 20 26 72 63 29  Csr->pExpr, &rc)
29570 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
29580 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
29590 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
295a0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
295b0 20 70 68 72 61 73 65 20 70 50 68 72 61 73 65 2e   phrase pPhrase.
295c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
295d0 66 74 73 33 45 76 61 6c 49 6e 76 61 6c 69 64 61  fts3EvalInvalida
295e0 74 65 50 6f 73 6c 69 73 74 28 46 74 73 33 50 68  tePoslist(Fts3Ph
295f0 72 61 73 65 20 2a 70 50 68 72 61 73 65 29 7b 0a  rase *pPhrase){.
29600 20 20 69 66 28 20 70 50 68 72 61 73 65 2d 3e 64    if( pPhrase->d
29610 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73 74  oclist.bFreeList
29620 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29630 66 72 65 65 28 70 50 68 72 61 73 65 2d 3e 64 6f  free(pPhrase->do
29640 63 6c 69 73 74 2e 70 4c 69 73 74 29 3b 0a 20 20  clist.pList);.  
29650 7d 0a 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63  }.  pPhrase->doc
29660 6c 69 73 74 2e 70 4c 69 73 74 20 3d 20 30 3b 0a  list.pList = 0;.
29670 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69    pPhrase->docli
29680 73 74 2e 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20  st.nList = 0;.  
29690 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
296a0 2e 62 46 72 65 65 4c 69 73 74 20 3d 20 30 3b 0a  .bFreeList = 0;.
296b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
296c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
296d0 20 74 6f 20 65 64 69 74 20 74 68 65 20 70 6f 73   to edit the pos
296e0 69 74 69 6f 6e 20 6c 69 73 74 20 61 73 73 6f 63  ition list assoc
296f0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
29700 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74 20  e phrase object 
29710 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
29720 66 74 68 20 61 72 67 75 6d 65 6e 74 20 61 63 63  fth argument acc
29730 6f 72 64 69 6e 67 20 74 6f 20 61 20 4e 45 41 52  ording to a NEAR
29740 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 46  .** condition. F
29750 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
29760 2a 20 20 20 20 20 61 62 63 20 4e 45 41 52 2f 35  *     abc NEAR/5
29770 20 22 64 65 66 20 67 68 69 22 0a 2a 2a 0a 2a 2a   "def ghi".**.**
29780 20 50 61 72 61 6d 65 74 65 72 20 6e 4e 65 61 72   Parameter nNear
29790 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 4e   is passed the N
297a0 45 41 52 20 64 69 73 74 61 6e 63 65 20 6f 66 20  EAR distance of 
297b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 28  the expression (
297c0 35 20 69 6e 0a 2a 2a 20 74 68 65 20 65 78 61 6d  5 in.** the exam
297d0 70 6c 65 20 61 62 6f 76 65 29 2e 20 57 68 65 6e  ple above). When
297e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
297f0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 61 50 6f 73  s called, *paPos
29800 6c 69 73 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  list points to.*
29810 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
29820 69 73 74 2c 20 61 6e 64 20 2a 70 6e 54 6f 6b 65  ist, and *pnToke
29830 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
29840 6f 66 20 70 68 72 61 73 65 20 74 6f 6b 65 6e 73  of phrase tokens
29850 20 69 6e 2c 20 74 68 65 0a 2a 2a 20 70 68 72 61   in, the.** phra
29860 73 65 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  se on the other 
29870 73 69 64 65 20 6f 66 20 74 68 65 20 4e 45 41 52  side of the NEAR
29880 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 70 50 68   operator to pPh
29890 72 61 73 65 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rase. For exampl
298a0 65 2c 0a 2a 2a 20 69 66 20 70 50 68 72 61 73 65  e,.** if pPhrase
298b0 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 22   refers to the "
298c0 64 65 66 20 67 68 69 22 20 70 68 72 61 73 65 2c  def ghi" phrase,
298d0 20 74 68 65 6e 20 2a 70 61 50 6f 73 6c 69 73 74   then *paPoslist
298e0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
298f0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
29900 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
29910 70 68 72 61 73 65 20 22 61 62 63 22 2e 0a 2a 2a  phrase "abc"..**
29920 0a 2a 2a 20 41 6c 6c 20 70 6f 73 69 74 69 6f 6e  .** All position
29930 73 20 69 6e 20 74 68 65 20 70 50 68 72 61 73 65  s in the pPhrase
29940 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74   position list t
29950 68 61 74 20 61 72 65 20 6e 6f 74 20 73 75 66 66  hat are not suff
29960 69 63 69 65 6e 74 6c 79 0a 2a 2a 20 63 6c 6f 73  iciently.** clos
29970 65 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20  e to a position 
29980 69 6e 20 74 68 65 20 2a 70 61 50 6f 73 6c 69 73  in the *paPoslis
29990 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
299a0 61 72 65 20 72 65 6d 6f 76 65 64 2e 20 49 66 20  are removed. If 
299b0 74 68 69 73 0a 2a 2a 20 6c 65 61 76 65 73 20 30  this.** leaves 0
299c0 20 70 6f 73 69 74 69 6f 6e 73 2c 20 7a 65 72 6f   positions, zero
299d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
299e0 68 65 72 77 69 73 65 2c 20 6e 6f 6e 2d 7a 65 72  herwise, non-zer
299f0 6f 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  o..**.** Before 
29a00 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 61 50 6f  returning, *paPo
29a10 73 6c 69 73 74 20 69 73 20 73 65 74 20 74 6f 20  slist is set to 
29a20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73  point to the pos
29a30 69 74 69 6f 6e 20 6c 73 69 74 20 0a 2a 2a 20 61  ition lsit .** a
29a40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
29a50 50 68 72 61 73 65 2e 20 41 6e 64 20 2a 70 6e 54  Phrase. And *pnT
29a60 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74  oken is set to t
29a70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  he number of tok
29a80 65 6e 73 20 69 6e 0a 2a 2a 20 70 50 68 72 61 73  ens in.** pPhras
29a90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
29aa0 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 69   fts3EvalNearTri
29ab0 6d 28 0a 20 20 69 6e 74 20 6e 4e 65 61 72 2c 20  m(.  int nNear, 
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 20 20 20 20 2f 2a 20 4e 45 41 52 20 64 69 73       /* NEAR dis
29ae0 74 61 6e 63 65 2e 20 41 73 20 69 6e 20 22 4e 45  tance. As in "NE
29af0 41 52 2f 6e 4e 65 61 72 22 2e 20 2a 2f 0a 20 20  AR/nNear". */.  
29b00 63 68 61 72 20 2a 61 54 6d 70 2c 20 20 20 20 20  char *aTmp,     
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61  /* Temporary spa
29b30 63 65 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 63  ce to use */.  c
29b40 68 61 72 20 2a 2a 70 61 50 6f 73 6c 69 73 74 2c  har **paPoslist,
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b60 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 73 69 74 69  * IN/OUT: Positi
29b70 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  on list */.  int
29b80 20 2a 70 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20   *pnToken,      
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ba0 49 4e 2f 4f 55 54 3a 20 54 6f 6b 65 6e 73 20 69  IN/OUT: Tokens i
29bb0 6e 20 70 68 72 61 73 65 20 6f 66 20 2a 70 61 50  n phrase of *paP
29bc0 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 33  oslist */.  Fts3
29bd0 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
29be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29bf0 68 65 20 70 68 72 61 73 65 20 6f 62 6a 65 63 74  he phrase object
29c00 20 74 6f 20 74 72 69 6d 20 74 68 65 20 64 6f 63   to trim the doc
29c10 6c 69 73 74 20 6f 66 20 2a 2f 0a 29 7b 0a 20 20  list of */.){.  
29c20 69 6e 74 20 6e 50 61 72 61 6d 31 20 3d 20 6e 4e  int nParam1 = nN
29c30 65 61 72 20 2b 20 70 50 68 72 61 73 65 2d 3e 6e  ear + pPhrase->n
29c40 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 50 61  Token;.  int nPa
29c50 72 61 6d 32 20 3d 20 6e 4e 65 61 72 20 2b 20 2a  ram2 = nNear + *
29c60 70 6e 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e  pnToken;.  int n
29c70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 70 32 3b  New;.  char *p2;
29c80 20 0a 20 20 63 68 61 72 20 2a 70 4f 75 74 3b 20   .  char *pOut; 
29c90 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
29ca0 73 73 65 72 74 28 20 70 50 68 72 61 73 65 2d 3e  ssert( pPhrase->
29cb0 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 29 3b  doclist.pList );
29cc0 0a 0a 20 20 70 32 20 3d 20 70 4f 75 74 20 3d 20  ..  p2 = pOut = 
29cd0 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
29ce0 2e 70 4c 69 73 74 3b 0a 20 20 72 65 73 20 3d 20  .pList;.  res = 
29cf0 66 74 73 33 50 6f 73 6c 69 73 74 4e 65 61 72 4d  fts3PoslistNearM
29d00 65 72 67 65 28 0a 20 20 20 20 26 70 4f 75 74 2c  erge(.    &pOut,
29d10 20 61 54 6d 70 2c 20 6e 50 61 72 61 6d 31 2c 20   aTmp, nParam1, 
29d20 6e 50 61 72 61 6d 32 2c 20 70 61 50 6f 73 6c 69  nParam2, paPosli
29d30 73 74 2c 20 26 70 32 0a 20 20 29 3b 0a 20 20 69  st, &p2.  );.  i
29d40 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 4e  f( res ){.    nN
29d50 65 77 20 3d 20 28 69 6e 74 29 28 70 4f 75 74 20  ew = (int)(pOut 
29d60 2d 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  - pPhrase->docli
29d70 73 74 2e 70 4c 69 73 74 29 20 2d 20 31 3b 0a 20  st.pList) - 1;. 
29d80 20 20 20 61 73 73 65 72 74 28 20 70 50 68 72 61     assert( pPhra
29d90 73 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73  se->doclist.pLis
29da0 74 5b 6e 4e 65 77 5d 3d 3d 27 5c 30 27 20 29 3b  t[nNew]=='\0' );
29db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65  .    assert( nNe
29dc0 77 3c 3d 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  w<=pPhrase->docl
29dd0 69 73 74 2e 6e 4c 69 73 74 20 26 26 20 6e 4e 65  ist.nList && nNe
29de0 77 3e 30 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  w>0 );.    memse
29df0 74 28 26 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  t(&pPhrase->docl
29e00 69 73 74 2e 70 4c 69 73 74 5b 6e 4e 65 77 5d 2c  ist.pList[nNew],
29e10 20 30 2c 20 70 50 68 72 61 73 65 2d 3e 64 6f 63   0, pPhrase->doc
29e20 6c 69 73 74 2e 6e 4c 69 73 74 20 2d 20 6e 4e 65  list.nList - nNe
29e30 77 29 3b 0a 20 20 20 20 70 50 68 72 61 73 65 2d  w);.    pPhrase-
29e40 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74 20 3d  >doclist.nList =
29e50 20 6e 4e 65 77 3b 0a 20 20 20 20 2a 70 61 50 6f   nNew;.    *paPo
29e60 73 6c 69 73 74 20 3d 20 70 50 68 72 61 73 65 2d  slist = pPhrase-
29e70 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a  >doclist.pList;.
29e80 20 20 20 20 2a 70 6e 54 6f 6b 65 6e 20 3d 20 70      *pnToken = p
29e90 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 0a  Phrase->nToken;.
29ea0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
29eb0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
29ec0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
29ed0 6f 2d 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20  o-op if *pRc is 
29ee0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
29ef0 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20  E_OK when it is 
29f00 63 61 6c 6c 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  called..** Other
29f10 77 69 73 65 2c 20 69 74 20 61 64 76 61 6e 63 65  wise, it advance
29f20 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
29f30 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
29f40 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
29f50 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68  o.** point to th
29f60 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
29f70 72 6f 77 20 69 6e 20 74 68 65 20 64 61 74 61 62  row in the datab
29f80 61 73 65 2e 20 45 78 70 72 65 73 73 69 6f 6e 73  ase. Expressions
29f90 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
29fa0 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  .** matching row
29fb0 73 20 69 6e 20 64 6f 63 69 64 20 6f 72 64 65 72  s in docid order
29fc0 2e 20 41 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  . Ascending orde
29fd0 72 20 69 66 20 46 74 73 33 43 75 72 73 6f 72 2e  r if Fts3Cursor.
29fe0 62 44 65 73 63 20 69 73 20 7a 65 72 6f 2c 0a 2a  bDesc is zero,.*
29ff0 2a 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20  * or descending 
2a000 69 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  if it is non-zer
2a010 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  o..**.** If an e
2a020 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52  rror occurs, *pR
2a030 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53  c is set to an S
2a040 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2a050 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
2a060 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  ** successful, t
2a070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2a080 69 61 62 6c 65 73 20 69 6e 20 70 45 78 70 72 20  iables in pExpr 
2a090 61 72 65 20 73 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are set:.**.**  
2a0a0 20 46 74 73 33 45 78 70 72 2e 62 45 6f 66 20 20   Fts3Expr.bEof  
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2a0c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 45 4f 46 20 2d  on-zero if EOF -
2a0d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 78   there is no nex
2a0e0 74 20 72 6f 77 29 0a 2a 2a 20 20 20 46 74 73 33  t row).**   Fts3
2a0f0 45 78 70 72 2e 69 44 6f 63 69 64 20 20 20 20 20  Expr.iDocid     
2a100 20 20 20 20 20 20 20 20 20 28 76 61 6c 69 64 20           (valid 
2a110 69 66 20 62 45 6f 66 3d 3d 30 2e 20 54 68 65 20  if bEof==0. The 
2a120 64 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 78  docid of the nex
2a130 74 20 72 6f 77 29 0a 2a 2a 0a 2a 2a 20 49 66 20  t row).**.** If 
2a140 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
2a150 73 20 6f 66 20 74 79 70 65 20 46 54 53 51 55 45  s of type FTSQUE
2a160 52 59 5f 50 48 52 41 53 45 2c 20 61 6e 64 20 74  RY_PHRASE, and t
2a170 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
2a180 20 6e 6f 74 0a 2a 2a 20 61 74 20 45 4f 46 2c 20   not.** at EOF, 
2a190 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
2a1a0 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ng variables are
2a1b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
2a1c0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
2a1d0 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 70 68 72  t.** for the phr
2a1e0 61 73 65 20 66 6f 72 20 74 68 65 20 76 69 73 69  ase for the visi
2a1f0 74 65 64 20 72 6f 77 3a 0a 2a 2a 0a 2a 2a 20 20  ted row:.**.**  
2a200 20 46 54 73 33 45 78 70 72 2e 70 50 68 72 61 73   FTs3Expr.pPhras
2a210 65 2d 3e 64 6f 63 6c 69 73 74 2e 6e 4c 69 73 74  e->doclist.nList
2a220 20 20 20 20 20 20 20 20 28 6c 65 6e 67 74 68 20          (length 
2a230 6f 66 20 70 4c 69 73 74 20 69 6e 20 62 79 74 65  of pList in byte
2a240 73 29 0a 2a 2a 20 20 20 46 54 73 33 45 78 70 72  s).**   FTs3Expr
2a250 2e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73  .pPhrase->doclis
2a260 74 2e 70 4c 69 73 74 20 20 20 20 20 20 20 20 28  t.pList        (
2a270 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74  pointer to posit
2a280 69 6f 6e 20 6c 69 73 74 29 0a 2a 2a 0a 2a 2a 20  ion list).**.** 
2a290 49 74 20 73 61 79 73 20 61 62 6f 76 65 20 74 68  It says above th
2a2a0 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2a2b0 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 65 78   advances the ex
2a2c0 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 68 65 20  pression to the 
2a2d0 6e 65 78 74 0a 2a 2a 20 6d 61 74 63 68 69 6e 67  next.** matching
2a2e0 20 72 6f 77 2e 20 54 68 69 73 20 69 73 20 75 73   row. This is us
2a2f0 75 61 6c 6c 79 20 74 72 75 65 2c 20 62 75 74 20  ually true, but 
2a300 74 68 65 72 65 20 61 72 65 20 74 68 65 20 66 6f  there are the fo
2a310 6c 6c 6f 77 69 6e 67 20 65 78 63 65 70 74 69 6f  llowing exceptio
2a320 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 44  ns:.**.**   1. D
2a330 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 61  eferred tokens a
2a340 72 65 20 6e 6f 74 20 74 61 6b 65 6e 20 69 6e 74  re not taken int
2a350 6f 20 61 63 63 6f 75 6e 74 2e 20 49 66 20 61 20  o account. If a 
2a360 70 68 72 61 73 65 20 63 6f 6e 73 69 73 74 73 0a  phrase consists.
2a370 2a 2a 20 20 20 20 20 20 65 6e 74 69 72 65 6c 79  **      entirely
2a380 20 6f 66 20 64 65 66 65 72 72 65 64 20 74 6f 6b   of deferred tok
2a390 65 6e 73 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ens, it is assum
2a3a0 65 64 20 74 6f 20 6d 61 74 63 68 20 65 76 65 72  ed to match ever
2a3b0 79 20 72 6f 77 20 69 6e 0a 2a 2a 20 20 20 20 20  y row in.**     
2a3c0 20 74 68 65 20 64 62 2e 20 49 6e 20 74 68 69 73   the db. In this
2a3d0 20 63 61 73 65 20 74 68 65 20 70 6f 73 69 74 69   case the positi
2a3e0 6f 6e 2d 6c 69 73 74 20 69 73 20 6e 6f 74 20 70  on-list is not p
2a3f0 6f 70 75 6c 61 74 65 64 20 61 74 20 61 6c 6c 2e  opulated at all.
2a400 20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4f 72 2c   .**.**      Or,
2a410 20 69 66 20 61 20 70 68 72 61 73 65 20 63 6f 6e   if a phrase con
2a420 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
2a430 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e  e deferred token
2a440 73 20 61 6e 64 20 6f 6e 65 20 6f 72 0a 2a 2a 20  s and one or.** 
2a450 20 20 20 20 20 6d 6f 72 65 20 6e 6f 6e 2d 64 65       more non-de
2a460 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 2c 20 74  ferred tokens, t
2a470 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
2a480 6f 6e 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  on is advanced t
2a490 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 6e  o the .**      n
2a4a0 65 78 74 20 70 6f 73 73 69 62 6c 65 20 6d 61 74  ext possible mat
2a4b0 63 68 2c 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  ch, considering 
2a4c0 6f 6e 6c 79 20 6e 6f 6e 2d 64 65 66 65 72 72 65  only non-deferre
2a4d0 64 20 74 6f 6b 65 6e 73 2e 20 49 6e 20 6f 74 68  d tokens. In oth
2a4e0 65 72 0a 2a 2a 20 20 20 20 20 20 77 6f 72 64 73  er.**      words
2a4f0 2c 20 69 66 20 74 68 65 20 70 68 72 61 73 65 20  , if the phrase 
2a500 69 73 20 22 41 20 42 20 43 22 2c 20 61 6e 64 20  is "A B C", and 
2a510 22 42 22 20 69 73 20 64 65 66 65 72 72 65 64 2c  "B" is deferred,
2a520 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
2a530 2a 2a 20 20 20 20 20 20 69 73 20 61 64 76 61 6e  **      is advan
2a540 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
2a550 72 6f 77 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  row that contain
2a560 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
2a570 20 22 41 20 2a 20 43 22 2c 20 0a 2a 2a 20 20 20   "A * C", .**   
2a580 20 20 20 77 68 65 72 65 20 22 2a 22 20 6d 61 79     where "*" may
2a590 20 6d 61 74 63 68 20 61 6e 79 20 73 69 6e 67 6c   match any singl
2a5a0 65 20 74 6f 6b 65 6e 2e 20 54 68 65 20 70 6f 73  e token. The pos
2a5b0 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 74 68  ition list in th
2a5c0 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20  is case.**      
2a5d0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20  is populated as 
2a5e0 66 6f 72 20 22 41 20 2a 20 43 22 20 62 65 66 6f  for "A * C" befo
2a5f0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2a600 0a 2a 2a 20 20 20 32 2e 20 4e 45 41 52 20 69 73  .**   2. NEAR is
2a610 20 74 72 65 61 74 65 64 20 61 73 20 41 4e 44 2e   treated as AND.
2a620 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
2a630 6f 6e 20 69 73 20 22 78 20 4e 45 41 52 20 79 22  on is "x NEAR y"
2a640 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 20  , it is .**     
2a650 20 61 64 76 61 6e 63 65 64 20 74 6f 20 70 6f 69   advanced to poi
2a660 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72  nt to the next r
2a670 6f 77 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  ow that matches 
2a680 22 78 20 41 4e 44 20 79 22 2e 0a 2a 2a 20 0a 2a  "x AND y"..** .*
2a690 2a 20 53 65 65 20 73 71 6c 69 74 65 33 46 74 73  * See sqlite3Fts
2a6a0 33 45 76 61 6c 54 65 73 74 44 65 66 65 72 72 65  3EvalTestDeferre
2a6b0 64 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 20  d() for details 
2a6c0 6f 6e 20 74 65 73 74 69 6e 67 20 69 66 20 61 20  on testing if a 
2a6d0 72 6f 77 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  row is.** really
2a6e0 20 61 20 6d 61 74 63 68 2c 20 74 61 6b 69 6e 67   a match, taking
2a6f0 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 64 65   into account de
2a700 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 61 6e  ferred tokens an
2a710 64 20 4e 45 41 52 20 6f 70 65 72 61 74 6f 72 73  d NEAR operators
2a720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a730 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77   fts3EvalNextRow
2a740 28 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a  (.  Fts3Cursor *
2a750 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
2a760 20 20 20 20 2f 2a 20 46 54 53 20 43 75 72 73 6f      /* FTS Curso
2a770 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74  r handle */.  Ft
2a780 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20  s3Expr *pExpr,  
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a7a0 20 45 78 70 72 2e 20 74 6f 20 61 64 76 61 6e 63   Expr. to advanc
2a7b0 65 20 74 6f 20 6e 65 78 74 20 6d 61 74 63 68 69  e to next matchi
2a7c0 6e 67 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  ng row */.  int 
2a7d0 2a 70 52 63 20 20 20 20 20 20 20 20 20 20 20 20  *pRc            
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a7f0 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
2a800 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70  e */.){.  if( *p
2a810 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
2a820 0a 20 20 20 20 69 6e 74 20 62 44 65 73 63 44 6f  .    int bDescDo
2a830 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 62 44  clist = pCsr->bD
2a840 65 73 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  esc;         /* 
2a850 55 73 65 64 20 62 79 20 44 4f 43 49 44 5f 43 4d  Used by DOCID_CM
2a860 50 28 29 20 6d 61 63 72 6f 20 2a 2f 0a 20 20 20  P() macro */.   
2a870 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2a880 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70  bEof==0 );.    p
2a890 45 78 70 72 2d 3e 62 53 74 61 72 74 20 3d 20 31  Expr->bStart = 1
2a8a0 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ;..    switch( p
2a8b0 45 78 70 72 2d 3e 65 54 79 70 65 20 29 7b 0a 20  Expr->eType ){. 
2a8c0 20 20 20 20 20 63 61 73 65 20 46 54 53 51 55 45       case FTSQUE
2a8d0 52 59 5f 4e 45 41 52 3a 0a 20 20 20 20 20 20 63  RY_NEAR:.      c
2a8e0 61 73 65 20 46 54 53 51 55 45 52 59 5f 41 4e 44  ase FTSQUERY_AND
2a8f0 3a 20 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33  : {.        Fts3
2a900 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
2a910 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
2a920 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 52      Fts3Expr *pR
2a930 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
2a940 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
2a950 73 65 72 74 28 20 21 70 4c 65 66 74 2d 3e 62 44  sert( !pLeft->bD
2a960 65 66 65 72 72 65 64 20 7c 7c 20 21 70 52 69 67  eferred || !pRig
2a970 68 74 2d 3e 62 44 65 66 65 72 72 65 64 20 29 3b  ht->bDeferred );
2a980 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ..        if( pL
2a990 65 66 74 2d 3e 62 44 65 66 65 72 72 65 64 20 29  eft->bDeferred )
2a9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  {.          /* L
2a9b0 48 53 20 69 73 20 65 6e 74 69 72 65 6c 79 20 64  HS is entirely d
2a9c0 65 66 65 72 72 65 64 2e 20 53 6f 20 77 65 20 61  eferred. So we a
2a9d0 73 73 75 6d 65 20 69 74 20 6d 61 74 63 68 65 73  ssume it matches
2a9e0 20 65 76 65 72 79 20 72 6f 77 2e 0a 20 20 20 20   every row..    
2a9f0 20 20 20 20 20 20 2a 2a 20 41 64 76 61 6e 63 65        ** Advance
2aa00 20 74 68 65 20 52 48 53 20 69 74 65 72 61 74 6f   the RHS iterato
2aa10 72 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  r to find the ne
2aa20 78 74 20 72 6f 77 20 76 69 73 69 74 65 64 2e 20  xt row visited. 
2aa30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  */.          fts
2aa40 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2aa50 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b  r, pRight, pRc);
2aa60 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
2aa70 2d 3e 69 44 6f 63 69 64 20 3d 20 70 52 69 67 68  ->iDocid = pRigh
2aa80 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20  t->iDocid;.     
2aa90 20 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66       pExpr->bEof
2aaa0 20 3d 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 3b   = pRight->bEof;
2aab0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2aac0 66 28 20 70 52 69 67 68 74 2d 3e 62 44 65 66 65  f( pRight->bDefe
2aad0 72 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rred ){.        
2aae0 20 20 2f 2a 20 52 48 53 20 69 73 20 65 6e 74 69    /* RHS is enti
2aaf0 72 65 6c 79 20 64 65 66 65 72 72 65 64 2e 20 53  rely deferred. S
2ab00 6f 20 77 65 20 61 73 73 75 6d 65 20 69 74 20 6d  o we assume it m
2ab10 61 74 63 68 65 73 20 65 76 65 72 79 20 72 6f 77  atches every row
2ab20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41  ..          ** A
2ab30 64 76 61 6e 63 65 20 74 68 65 20 4c 48 53 20 69  dvance the LHS i
2ab40 74 65 72 61 74 6f 72 20 74 6f 20 66 69 6e 64 20  terator to find 
2ab50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 76 69 73  the next row vis
2ab60 69 74 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ited. */.       
2ab70 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
2ab80 6f 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20  ow(pCsr, pLeft, 
2ab90 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pRc);.          
2aba0 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20  pExpr->iDocid = 
2abb0 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3b 0a 20  pLeft->iDocid;. 
2abc0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2abd0 62 45 6f 66 20 3d 20 70 4c 65 66 74 2d 3e 62 45  bEof = pLeft->bE
2abe0 6f 66 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  of;.        }els
2abf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2ac00 4e 65 69 74 68 65 72 20 74 68 65 20 52 48 53 20  Neither the RHS 
2ac10 6f 72 20 4c 48 53 20 61 72 65 20 64 65 66 65 72  or LHS are defer
2ac20 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
2ac30 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f    fts3EvalNextRo
2ac40 77 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70  w(pCsr, pLeft, p
2ac50 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  Rc);.          f
2ac60 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70  ts3EvalNextRow(p
2ac70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63  Csr, pRight, pRc
2ac80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  );.          whi
2ac90 6c 65 28 20 21 70 4c 65 66 74 2d 3e 62 45 6f 66  le( !pLeft->bEof
2aca0 20 26 26 20 21 70 52 69 67 68 74 2d 3e 62 45 6f   && !pRight->bEo
2acb0 66 20 26 26 20 2a 70 52 63 3d 3d 53 51 4c 49 54  f && *pRc==SQLIT
2acc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2acd0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2ace0 34 20 69 44 69 66 66 20 3d 20 44 4f 43 49 44 5f  4 iDiff = DOCID_
2acf0 43 4d 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63 69  CMP(pLeft->iDoci
2ad00 64 2c 20 70 52 69 67 68 74 2d 3e 69 44 6f 63 69  d, pRight->iDoci
2ad10 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2ad20 69 66 28 20 69 44 69 66 66 3d 3d 30 20 29 20 62  if( iDiff==0 ) b
2ad30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2ad40 20 20 69 66 28 20 69 44 69 66 66 3c 30 20 29 7b    if( iDiff<0 ){
2ad50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
2ad60 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70  ts3EvalNextRow(p
2ad70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63 29  Csr, pLeft, pRc)
2ad80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
2ad90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2ada0 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
2adb0 6f 77 28 70 43 73 72 2c 20 70 52 69 67 68 74 2c  ow(pCsr, pRight,
2adc0 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20   pRc);.         
2add0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2ade0 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
2adf0 2d 3e 69 44 6f 63 69 64 20 3d 20 70 4c 65 66 74  ->iDocid = pLeft
2ae00 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ->iDocid;.      
2ae10 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20      pExpr->bEof 
2ae20 3d 20 28 70 4c 65 66 74 2d 3e 62 45 6f 66 20 7c  = (pLeft->bEof |
2ae30 7c 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 29 3b  | pRight->bEof);
2ae40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ae50 45 78 70 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53  Expr->eType==FTS
2ae60 51 55 45 52 59 5f 4e 45 41 52 20 26 26 20 70 45  QUERY_NEAR && pE
2ae70 78 70 72 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20  xpr->bEof ){.   
2ae80 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69           if( pRi
2ae90 67 68 74 2d 3e 70 50 68 72 61 73 65 20 26 26 20  ght->pPhrase && 
2aea0 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d  pRight->pPhrase-
2aeb0 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 29 7b  >doclist.aAll ){
2aec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
2aed0 74 73 33 44 6f 63 6c 69 73 74 20 2a 70 44 6c 20  ts3Doclist *pDl 
2aee0 3d 20 26 70 52 69 67 68 74 2d 3e 70 50 68 72 61  = &pRight->pPhra
2aef0 73 65 2d 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 20  se->doclist;.   
2af00 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
2af10 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
2af20 4b 20 26 26 20 70 52 69 67 68 74 2d 3e 62 45 6f  K && pRight->bEo
2af30 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
2af40 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
2af50 44 6c 2d 3e 70 4c 69 73 74 2c 20 30 2c 20 70 44  Dl->pList, 0, pD
2af60 6c 2d 3e 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  l->nList);.     
2af70 20 20 20 20 20 20 20 20 20 20 20 66 74 73 33 45             fts3E
2af80 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
2af90 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20   pRight, pRc);. 
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2afb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2afc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
2afd0 66 74 2d 3e 70 50 68 72 61 73 65 20 26 26 20 70  ft->pPhrase && p
2afe0 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d 3e 64  Left->pPhrase->d
2aff0 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 29 7b 0a 20  oclist.aAll ){. 
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73               Fts
2b010 33 44 6f 63 6c 69 73 74 20 2a 70 44 6c 20 3d 20  3Doclist *pDl = 
2b020 26 70 4c 65 66 74 2d 3e 70 50 68 72 61 73 65 2d  &pLeft->pPhrase-
2b030 3e 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  >doclist;.      
2b040 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
2b050 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  pRc==SQLITE_OK &
2b060 26 20 70 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30  & pLeft->bEof==0
2b070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b080 20 20 20 20 6d 65 6d 73 65 74 28 70 44 6c 2d 3e      memset(pDl->
2b090 70 4c 69 73 74 2c 20 30 2c 20 70 44 6c 2d 3e 6e  pList, 0, pDl->n
2b0a0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  List);.         
2b0b0 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e         fts3EvalN
2b0c0 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4c 65  extRow(pCsr, pLe
2b0d0 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20  ft, pRc);.      
2b0e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b100 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2b110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b120 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 63 61     }.  .      ca
2b130 73 65 20 46 54 53 51 55 45 52 59 5f 4f 52 3a 20  se FTSQUERY_OR: 
2b140 7b 0a 20 20 20 20 20 20 20 20 46 74 73 33 45 78  {.        Fts3Ex
2b150 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
2b160 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
2b170 20 20 46 74 73 33 45 78 70 72 20 2a 70 52 69 67    Fts3Expr *pRig
2b180 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
2b190 68 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ht;.        sqli
2b1a0 74 65 33 5f 69 6e 74 36 34 20 69 43 6d 70 20 3d  te3_int64 iCmp =
2b1b0 20 44 4f 43 49 44 5f 43 4d 50 28 70 4c 65 66 74   DOCID_CMP(pLeft
2b1c0 2d 3e 69 44 6f 63 69 64 2c 20 70 52 69 67 68 74  ->iDocid, pRight
2b1d0 2d 3e 69 44 6f 63 69 64 29 3b 0a 0a 20 20 20 20  ->iDocid);..    
2b1e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
2b1f0 74 2d 3e 62 53 74 61 72 74 20 7c 7c 20 70 4c 65  t->bStart || pLe
2b200 66 74 2d 3e 69 44 6f 63 69 64 3d 3d 70 52 69 67  ft->iDocid==pRig
2b210 68 74 2d 3e 69 44 6f 63 69 64 20 29 3b 0a 20 20  ht->iDocid );.  
2b220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
2b230 69 67 68 74 2d 3e 62 53 74 61 72 74 20 7c 7c 20  ight->bStart || 
2b240 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3d 3d 70  pLeft->iDocid==p
2b250 52 69 67 68 74 2d 3e 69 44 6f 63 69 64 20 29 3b  Right->iDocid );
2b260 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ..        if( pR
2b270 69 67 68 74 2d 3e 62 45 6f 66 20 7c 7c 20 28 70  ight->bEof || (p
2b280 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Left->bEof==0 &&
2b290 20 69 43 6d 70 3c 30 29 20 29 7b 0a 20 20 20 20   iCmp<0) ){.    
2b2a0 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e 65        fts3EvalNe
2b2b0 78 74 52 6f 77 28 70 43 73 72 2c 20 70 4c 65 66  xtRow(pCsr, pLef
2b2c0 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20  t, pRc);.       
2b2d0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
2b2e0 2d 3e 62 45 6f 66 20 7c 7c 20 28 70 52 69 67 68  ->bEof || (pRigh
2b2f0 74 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 69 43  t->bEof==0 && iC
2b300 6d 70 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 20  mp>0) ){.       
2b310 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
2b320 6f 77 28 70 43 73 72 2c 20 70 52 69 67 68 74 2c  ow(pCsr, pRight,
2b330 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   pRc);.        }
2b340 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b350 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2b360 70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70 52 63  pCsr, pLeft, pRc
2b370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
2b380 33 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73  3EvalNextRow(pCs
2b390 72 2c 20 70 52 69 67 68 74 2c 20 70 52 63 29 3b  r, pRight, pRc);
2b3a0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2b3b0 20 20 20 20 70 45 78 70 72 2d 3e 62 45 6f 66 20      pExpr->bEof 
2b3c0 3d 20 28 70 4c 65 66 74 2d 3e 62 45 6f 66 20 26  = (pLeft->bEof &
2b3d0 26 20 70 52 69 67 68 74 2d 3e 62 45 6f 66 29 3b  & pRight->bEof);
2b3e0 0a 20 20 20 20 20 20 20 20 69 43 6d 70 20 3d 20  .        iCmp = 
2b3f0 44 4f 43 49 44 5f 43 4d 50 28 70 4c 65 66 74 2d  DOCID_CMP(pLeft-
2b400 3e 69 44 6f 63 69 64 2c 20 70 52 69 67 68 74 2d  >iDocid, pRight-
2b410 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 20 20  >iDocid);.      
2b420 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 62 45    if( pRight->bE
2b430 6f 66 20 7c 7c 20 28 70 4c 65 66 74 2d 3e 62 45  of || (pLeft->bE
2b440 6f 66 3d 3d 30 20 26 26 20 20 69 43 6d 70 3c 30  of==0 &&  iCmp<0
2b450 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
2b460 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70  Expr->iDocid = p
2b470 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3b 0a 20 20  Left->iDocid;.  
2b480 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b490 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
2b4a0 6f 63 69 64 20 3d 20 70 52 69 67 68 74 2d 3e 69  ocid = pRight->i
2b4b0 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Docid;.        }
2b4c0 0a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ..        break;
2b4d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2b4e0 63 61 73 65 20 46 54 53 51 55 45 52 59 5f 4e 4f  case FTSQUERY_NO
2b4f0 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 46 74 73  T: {.        Fts
2b500 33 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70  3Expr *pLeft = p
2b510 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
2b520 20 20 20 20 20 46 74 73 33 45 78 70 72 20 2a 70       Fts3Expr *p
2b530 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
2b540 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 20 20  Right;..        
2b550 69 66 28 20 70 52 69 67 68 74 2d 3e 62 53 74 61  if( pRight->bSta
2b560 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rt==0 ){.       
2b570 20 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52     fts3EvalNextR
2b580 6f 77 28 70 43 73 72 2c 20 70 52 69 67 68 74 2c  ow(pCsr, pRight,
2b590 20 70 52 63 29 3b 0a 20 20 20 20 20 20 20 20 20   pRc);.         
2b5a0 20 61 73 73 65 72 74 28 20 2a 70 52 63 21 3d 53   assert( *pRc!=S
2b5b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52 69 67  QLITE_OK || pRig
2b5c0 68 74 2d 3e 62 53 74 61 72 74 20 29 3b 0a 20 20  ht->bStart );.  
2b5d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2b5e0 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77   fts3EvalNextRow
2b5f0 28 70 43 73 72 2c 20 70 4c 65 66 74 2c 20 70 52  (pCsr, pLeft, pR
2b600 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
2b610 70 4c 65 66 74 2d 3e 62 45 6f 66 3d 3d 30 20 29  pLeft->bEof==0 )
2b620 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2b630 65 28 20 21 2a 70 52 63 20 0a 20 20 20 20 20 20  e( !*pRc .      
2b640 20 20 20 20 20 20 20 20 26 26 20 21 70 52 69 67          && !pRig
2b650 68 74 2d 3e 62 45 6f 66 20 0a 20 20 20 20 20 20  ht->bEof .      
2b660 20 20 20 20 20 20 20 20 26 26 20 44 4f 43 49 44          && DOCID
2b670 5f 43 4d 50 28 70 4c 65 66 74 2d 3e 69 44 6f 63  _CMP(pLeft->iDoc
2b680 69 64 2c 20 70 52 69 67 68 74 2d 3e 69 44 6f 63  id, pRight->iDoc
2b690 69 64 29 3e 30 20 0a 20 20 20 20 20 20 20 20 20  id)>0 .         
2b6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b6b0 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f 77 28  fts3EvalNextRow(
2b6c0 70 43 73 72 2c 20 70 52 69 67 68 74 2c 20 70 52  pCsr, pRight, pR
2b6d0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  c);.          }.
2b6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b6f0 20 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 20    pExpr->iDocid 
2b700 3d 20 70 4c 65 66 74 2d 3e 69 44 6f 63 69 64 3b  = pLeft->iDocid;
2b710 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
2b720 62 45 6f 66 20 3d 20 70 4c 65 66 74 2d 3e 62 45  bEof = pLeft->bE
2b730 6f 66 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  of;.        brea
2b740 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
2b750 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
2b760 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20       Fts3Phrase 
2b770 2a 70 50 68 72 61 73 65 20 3d 20 70 45 78 70 72  *pPhrase = pExpr
2b780 2d 3e 70 50 68 72 61 73 65 3b 0a 20 20 20 20 20  ->pPhrase;.     
2b790 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c     fts3EvalInval
2b7a0 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50 68  idatePoslist(pPh
2b7b0 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  rase);.        *
2b7c0 70 52 63 20 3d 20 66 74 73 33 45 76 61 6c 50 68  pRc = fts3EvalPh
2b7d0 72 61 73 65 4e 65 78 74 28 70 43 73 72 2c 20 70  raseNext(pCsr, p
2b7e0 50 68 72 61 73 65 2c 20 26 70 45 78 70 72 2d 3e  Phrase, &pExpr->
2b7f0 62 45 6f 66 29 3b 0a 20 20 20 20 20 20 20 20 70  bEof);.        p
2b800 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d 20 70  Expr->iDocid = p
2b810 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2b820 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20  iDocid;.        
2b830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2b840 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2b850 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74  * If *pRc is not
2b860 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 6f 72 20 69   SQLITE_OK, or i
2b870 66 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20 74  f pExpr is not t
2b880 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20  he root node of 
2b890 61 20 4e 45 41 52 0a 2a 2a 20 63 6c 75 73 74 65  a NEAR.** cluste
2b8a0 72 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  r, then this fun
2b8b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 31 20  ction returns 1 
2b8c0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2a 0a  immediately..**.
2b8d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
2b8e0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 63   checks if the c
2b8f0 75 72 72 65 6e 74 20 72 6f 77 20 72 65 61 6c 6c  urrent row reall
2b900 79 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 65  y does match the
2b910 20 4e 45 41 52 20 0a 2a 2a 20 65 78 70 72 65 73   NEAR .** expres
2b920 73 69 6f 6e 2c 20 75 73 69 6e 67 20 74 68 65 20  sion, using the 
2b930 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 73  data currently s
2b940 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 73  tored in the pos
2b950 69 74 69 6f 6e 20 6c 69 73 74 73 20 0a 2a 2a 20  ition lists .** 
2b960 28 46 74 73 33 45 78 70 72 2d 3e 70 50 68 72 61  (Fts3Expr->pPhra
2b970 73 65 2e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  se.doclist.pList
2b980 2f 6e 4c 69 73 74 29 20 66 6f 72 20 65 61 63 68  /nList) for each
2b990 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20 65   phrase in the e
2b9a0 78 70 72 65 73 73 69 6f 6e 2e 20 0a 2a 2a 0a 2a  xpression. .**.*
2b9b0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2b9c0 20 72 6f 77 20 69 73 20 61 20 6d 61 74 63 68 2c   row is a match,
2b9d0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
2b9e0 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
2b9f0 74 68 20 65 61 63 68 0a 2a 2a 20 70 68 72 61 73  th each.** phras
2ba00 65 20 69 6e 20 74 68 65 20 4e 45 41 52 20 65 78  e in the NEAR ex
2ba10 70 72 65 73 73 69 6f 6e 20 69 73 20 65 64 69 74  pression is edit
2ba20 65 64 20 69 6e 20 70 6c 61 63 65 20 74 6f 20 63  ed in place to c
2ba30 6f 6e 74 61 69 6e 20 6f 6e 6c 79 20 74 68 6f 73  ontain only thos
2ba40 65 0a 2a 2a 20 70 68 72 61 73 65 20 69 6e 73 74  e.** phrase inst
2ba50 61 6e 63 65 73 20 73 75 66 66 69 63 69 65 6e 74  ances sufficient
2ba60 6c 79 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 69  ly close to thei
2ba70 72 20 70 65 65 72 73 20 74 6f 20 73 61 74 69 73  r peers to satis
2ba80 66 79 20 61 6c 6c 20 4e 45 41 52 0a 2a 2a 20 63  fy all NEAR.** c
2ba90 6f 6e 73 74 72 61 69 6e 74 73 2e 20 49 6e 20 74  onstraints. In t
2baa0 68 69 73 20 63 61 73 65 20 69 74 20 72 65 74 75  his case it retu
2bab0 72 6e 73 20 31 2e 20 49 66 20 74 68 65 20 4e 45  rns 1. If the NE
2bac0 41 52 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  AR expression do
2bad0 65 73 20 6e 6f 74 20 0a 2a 2a 20 6d 61 74 63 68  es not .** match
2bae0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
2baf0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
2bb00 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
2bb10 73 74 73 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  sts may or may n
2bb20 6f 74 0a 2a 2a 20 62 65 20 65 64 69 74 65 64 20  ot.** be edited 
2bb30 69 66 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  if 0 is returned
2bb40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bb50 66 74 73 33 45 76 61 6c 4e 65 61 72 54 65 73 74  fts3EvalNearTest
2bb60 28 46 74 73 33 45 78 70 72 20 2a 70 45 78 70 72  (Fts3Expr *pExpr
2bb70 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69  , int *pRc){.  i
2bb80 6e 74 20 72 65 73 20 3d 20 31 3b 0a 0a 20 20 2f  nt res = 1;..  /
2bb90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2bba0 62 6c 6f 63 6b 20 72 75 6e 73 20 69 66 20 70 45  block runs if pE
2bbb0 78 70 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  xpr is the root 
2bbc0 6f 66 20 61 20 4e 45 41 52 20 71 75 65 72 79 2e  of a NEAR query.
2bbd0 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  .  ** For exampl
2bbe0 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 20 20  e, the query:.  
2bbf0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2bc00 22 77 22 20 4e 45 41 52 20 22 78 22 20 4e 45 41  "w" NEAR "x" NEA
2bc10 52 20 22 79 22 20 4e 45 41 52 20 22 7a 22 0a 20  R "y" NEAR "z". 
2bc20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69   **.  ** which i
2bc30 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 69 6e  s represented in
2bc40 20 74 72 65 65 20 66 6f 72 6d 20 61 73 3a 0a 20   tree form as:. 
2bc50 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc70 20 20 20 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20         |.  **   
2bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc90 20 20 20 20 20 20 20 2b 2d 2d 4e 45 41 52 2d 2d         +--NEAR--
2bca0 2b 20 20 20 20 20 20 3c 2d 2d 20 72 6f 6f 74 20  +      <-- root 
2bcb0 6f 66 20 4e 45 41 52 20 71 75 65 72 79 0a 20 20  of NEAR query.  
2bcc0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
2bce0 20 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20       |.  **     
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd00 2b 2d 2d 4e 45 41 52 2d 2d 2b 20 20 20 22 7a 22  +--NEAR--+   "z"
2bd10 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2bd20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
2bd30 20 20 20 7c 0a 20 20 2a 2a 20 20 20 20 20 20 20     |.  **       
2bd40 20 20 20 20 20 20 20 20 20 2b 2d 2d 4e 45 41 52           +--NEAR
2bd50 2d 2d 2b 20 20 20 22 79 22 0a 20 20 2a 2a 20 20  --+   "y".  **  
2bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
2bd70 20 20 20 20 20 20 20 7c 0a 20 20 2a 2a 20 20 20         |.  **   
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 22 77 22 20              "w" 
2bd90 20 20 20 20 20 22 78 22 0a 20 20 2a 2a 0a 20 20       "x".  **.  
2bda0 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  ** The right-han
2bdb0 64 20 63 68 69 6c 64 20 6f 66 20 61 20 4e 45 41  d child of a NEA
2bdc0 52 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  R node is always
2bdd0 20 61 20 70 68 72 61 73 65 2e 20 54 68 65 20 0a   a phrase. The .
2bde0 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20 63    ** left-hand c
2bdf0 68 69 6c 64 20 6d 61 79 20 62 65 20 65 69 74 68  hild may be eith
2be00 65 72 20 61 20 70 68 72 61 73 65 20 6f 72 20 61  er a phrase or a
2be10 20 4e 45 41 52 20 6e 6f 64 65 2e 20 54 68 65 72   NEAR node. Ther
2be20 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f 20 65 78  e are.  ** no ex
2be30 63 65 70 74 69 6f 6e 73 20 74 6f 20 74 68 69 73  ceptions to this
2be40 20 2d 20 69 74 27 73 20 74 68 65 20 77 61 79 20   - it's the way 
2be50 74 68 65 20 70 61 72 73 65 72 20 69 6e 20 66 74  the parser in ft
2be60 73 33 5f 65 78 70 72 2e 63 20 77 6f 72 6b 73 2e  s3_expr.c works.
2be70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 52 63  .  */.  if( *pRc
2be80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
2be90 26 26 20 70 45 78 70 72 2d 3e 65 54 79 70 65 3d  && pExpr->eType=
2bea0 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20 0a  =FTSQUERY_NEAR .
2beb0 20 20 20 26 26 20 70 45 78 70 72 2d 3e 62 45 6f     && pExpr->bEo
2bec0 66 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 78 70  f==0.   && (pExp
2bed0 72 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c  r->pParent==0 ||
2bee0 20 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74 2d   pExpr->pParent-
2bef0 3e 65 54 79 70 65 21 3d 46 54 53 51 55 45 52 59  >eType!=FTSQUERY
2bf00 5f 4e 45 41 52 29 0a 20 20 29 7b 0a 20 20 20 20  _NEAR).  ){.    
2bf10 46 74 73 33 45 78 70 72 20 2a 70 3b 20 0a 20 20  Fts3Expr *p; .  
2bf20 20 20 69 6e 74 20 6e 54 6d 70 20 3d 20 30 3b 20    int nTmp = 0; 
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 2f 2a 20 42 79 74 65 73 20 6f 66 20 74 65 6d 70  /* Bytes of temp
2bf50 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 63 68   space */.    ch
2bf60 61 72 20 2a 61 54 6d 70 3b 20 20 20 20 20 20 20  ar *aTmp;       
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bf80 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 50 6f  emp space for Po
2bf90 73 6c 69 73 74 4e 65 61 72 4d 65 72 67 65 28 29  slistNearMerge()
2bfa0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   */..    /* Allo
2bfb0 63 61 74 65 20 74 65 6d 70 6f 72 61 72 79 20 77  cate temporary w
2bfc0 6f 72 6b 69 6e 67 20 73 70 61 63 65 2e 20 2a 2f  orking space. */
2bfd0 0a 20 20 20 20 66 6f 72 28 70 3d 70 45 78 70 72  .    for(p=pExpr
2bfe0 3b 20 70 2d 3e 70 4c 65 66 74 3b 20 70 3d 70 2d  ; p->pLeft; p=p-
2bff0 3e 70 4c 65 66 74 29 7b 0a 20 20 20 20 20 20 6e  >pLeft){.      n
2c000 54 6d 70 20 2b 3d 20 70 2d 3e 70 52 69 67 68 74  Tmp += p->pRight
2c010 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69  ->pPhrase->docli
2c020 73 74 2e 6e 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  st.nList;.    }.
2c030 20 20 20 20 6e 54 6d 70 20 2b 3d 20 70 2d 3e 70      nTmp += p->p
2c040 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2c050 6e 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 6e  nList;.    if( n
2c060 54 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tmp==0 ){.      
2c070 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  res = 0;.    }el
2c080 73 65 7b 0a 20 20 20 20 20 20 61 54 6d 70 20 3d  se{.      aTmp =
2c090 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2c0a0 6e 54 6d 70 2a 32 29 3b 0a 20 20 20 20 20 20 69  nTmp*2);.      i
2c0b0 66 28 20 21 61 54 6d 70 20 29 7b 0a 20 20 20 20  f( !aTmp ){.    
2c0c0 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
2c0d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2c0e0 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   res = 0;.      
2c0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
2c100 68 61 72 20 2a 61 50 6f 73 6c 69 73 74 20 3d 20  har *aPoslist = 
2c110 70 2d 3e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c  p->pPhrase->docl
2c120 69 73 74 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ist.pList;.     
2c130 20 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 3d 20     int nToken = 
2c140 70 2d 3e 70 50 68 72 61 73 65 2d 3e 6e 54 6f 6b  p->pPhrase->nTok
2c150 65 6e 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  en;..        for
2c160 28 70 3d 70 2d 3e 70 50 61 72 65 6e 74 3b 72 65  (p=p->pParent;re
2c170 73 20 26 26 20 70 20 26 26 20 70 2d 3e 65 54 79  s && p && p->eTy
2c180 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
2c190 52 3b 20 70 3d 70 2d 3e 70 50 61 72 65 6e 74 29  R; p=p->pParent)
2c1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33  {.          Fts3
2c1b0 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
2c1c0 3d 20 70 2d 3e 70 52 69 67 68 74 2d 3e 70 50 68  = p->pRight->pPh
2c1d0 72 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rase;.          
2c1e0 69 6e 74 20 6e 4e 65 61 72 20 3d 20 70 2d 3e 6e  int nNear = p->n
2c1f0 4e 65 61 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Near;.          
2c200 72 65 73 20 3d 20 66 74 73 33 45 76 61 6c 4e 65  res = fts3EvalNe
2c210 61 72 54 72 69 6d 28 6e 4e 65 61 72 2c 20 61 54  arTrim(nNear, aT
2c220 6d 70 2c 20 26 61 50 6f 73 6c 69 73 74 2c 20 26  mp, &aPoslist, &
2c230 6e 54 6f 6b 65 6e 2c 20 70 50 68 72 61 73 65 29  nToken, pPhrase)
2c240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2c250 20 20 20 20 20 61 50 6f 73 6c 69 73 74 20 3d 20       aPoslist = 
2c260 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
2c270 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2e  Phrase->doclist.
2c280 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 6e  pList;.        n
2c290 54 6f 6b 65 6e 20 3d 20 70 45 78 70 72 2d 3e 70  Token = pExpr->p
2c2a0 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65 2d 3e  Right->pPhrase->
2c2b0 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  nToken;.        
2c2c0 66 6f 72 28 70 3d 70 45 78 70 72 2d 3e 70 4c 65  for(p=pExpr->pLe
2c2d0 66 74 3b 20 70 20 26 26 20 72 65 73 3b 20 70 3d  ft; p && res; p=
2c2e0 70 2d 3e 70 4c 65 66 74 29 7b 0a 20 20 20 20 20  p->pLeft){.     
2c2f0 20 20 20 20 20 69 6e 74 20 6e 4e 65 61 72 3b 0a       int nNear;.
2c300 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50 68            Fts3Ph
2c310 72 61 73 65 20 2a 70 50 68 72 61 73 65 3b 0a 20  rase *pPhrase;. 
2c320 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c330 20 70 2d 3e 70 50 61 72 65 6e 74 20 26 26 20 70   p->pParent && p
2c340 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74  ->pParent->pLeft
2c350 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==p );.         
2c360 20 6e 4e 65 61 72 20 3d 20 70 2d 3e 70 50 61 72   nNear = p->pPar
2c370 65 6e 74 2d 3e 6e 4e 65 61 72 3b 0a 20 20 20 20  ent->nNear;.    
2c380 20 20 20 20 20 20 70 50 68 72 61 73 65 20 3d 20        pPhrase = 
2c390 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2c3a0 70 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  p->eType==FTSQUE
2c3b0 52 59 5f 4e 45 41 52 20 3f 20 70 2d 3e 70 52 69  RY_NEAR ? p->pRi
2c3c0 67 68 74 2d 3e 70 50 68 72 61 73 65 20 3a 20 70  ght->pPhrase : p
2c3d0 2d 3e 70 50 68 72 61 73 65 0a 20 20 20 20 20 20  ->pPhrase.      
2c3e0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2c3f0 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 33 45       res = fts3E
2c400 76 61 6c 4e 65 61 72 54 72 69 6d 28 6e 4e 65 61  valNearTrim(nNea
2c410 72 2c 20 61 54 6d 70 2c 20 26 61 50 6f 73 6c 69  r, aTmp, &aPosli
2c420 73 74 2c 20 26 6e 54 6f 6b 65 6e 2c 20 70 50 68  st, &nToken, pPh
2c430 72 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  rase);.        }
2c440 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 54 6d  sqlite3_free(aTm
2c460 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
2c470 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
2c480 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2c490 69 6f 6e 20 69 73 20 61 20 68 65 6c 70 65 72 20  ion is a helper 
2c4a0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 73 71 6c  function for sql
2c4b0 69 74 65 33 46 74 73 33 45 76 61 6c 54 65 73 74  ite3Fts3EvalTest
2c4c0 44 65 66 65 72 72 65 64 28 29 2e 0a 2a 2a 20 41  Deferred()..** A
2c4d0 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
2c4e0 20 6f 63 63 75 72 73 20 6f 72 20 68 61 73 20 6f   occurs or has o
2c4f0 63 63 75 72 72 65 64 2c 20 49 74 20 72 65 74 75  ccurred, It retu
2c500 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
2c510 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2c520 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  n passed as the 
2c530 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
2c540 6d 61 74 63 68 65 73 20 74 68 65 20 72 6f 77 20  matches the row 
2c550 74 68 61 74 20 70 43 73 72 20 0a 2a 2a 20 63 75  that pCsr .** cu
2c560 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
2c570 6f 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 69 74  o, or zero if it
2c580 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a   does not..**.**
2c590 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20   If *pRc is not 
2c5a0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74  SQLITE_OK when t
2c5b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c5c0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
2c5d0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 49 66 20 61 6e 20  no-op..** If an 
2c5e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
2c5f0 69 6e 67 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  ing execution of
2c600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2c610 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 0a  *pRc is set to .
2c620 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
2c630 74 65 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  te SQLite error 
2c640 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
2c650 73 65 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  se the returned 
2c660 76 61 6c 75 65 20 69 73 20 0a 2a 2a 20 75 6e 64  value is .** und
2c670 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2c680 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 54 65  c int fts3EvalTe
2c690 73 74 45 78 70 72 28 0a 20 20 46 74 73 33 43 75  stExpr(.  Fts3Cu
2c6a0 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20  rsor *pCsr,     
2c6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2c6c0 20 63 75 72 73 6f 72 20 68 61 6e 64 6c 65 20 2a   cursor handle *
2c6d0 2f 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45  /.  Fts3Expr *pE
2c6e0 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
2c6f0 20 20 20 20 2f 2a 20 45 78 70 72 20 74 6f 20 74      /* Expr to t
2c700 65 73 74 2e 20 4d 61 79 20 6f 72 20 6d 61 79 20  est. May or may 
2c710 6e 6f 74 20 62 65 20 72 6f 6f 74 2e 20 2a 2f 0a  not be root. */.
2c720 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20    int *pRc      
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c740 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
2c750 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20  or code */.){.  
2c760 69 6e 74 20 62 48 69 74 20 3d 20 31 3b 20 20 20  int bHit = 1;   
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c780 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
2c790 2a 2f 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  */.  if( *pRc==S
2c7a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c7b0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 65  switch( pExpr->e
2c7c0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
2c7d0 73 65 20 46 54 53 51 55 45 52 59 5f 4e 45 41 52  se FTSQUERY_NEAR
2c7e0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53  :.      case FTS
2c7f0 51 55 45 52 59 5f 41 4e 44 3a 0a 20 20 20 20 20  QUERY_AND:.     
2c800 20 20 20 62 48 69 74 20 3d 20 28 0a 20 20 20 20     bHit = (.    
2c810 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2c820 54 65 73 74 45 78 70 72 28 70 43 73 72 2c 20 70  TestExpr(pCsr, p
2c830 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63  Expr->pLeft, pRc
2c840 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 66 74  ).         && ft
2c850 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70  s3EvalTestExpr(p
2c860 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Csr, pExpr->pRig
2c870 68 74 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20  ht, pRc).       
2c880 20 20 26 26 20 66 74 73 33 45 76 61 6c 4e 65 61    && fts3EvalNea
2c890 72 54 65 73 74 28 70 45 78 70 72 2c 20 70 52 63  rTest(pExpr, pRc
2c8a0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20  ).        );..  
2c8b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2c8c0 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e 20  NEAR expression 
2c8d0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
2c8e0 6e 79 20 72 6f 77 73 2c 20 7a 65 72 6f 20 74 68  ny rows, zero th
2c8f0 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 0a 20  e doclist for . 
2c900 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 70 68         ** all ph
2c910 72 61 73 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  rases involved i
2c920 6e 20 74 68 65 20 4e 45 41 52 2e 20 54 68 69 73  n the NEAR. This
2c930 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
2c940 73 6e 69 70 70 65 74 28 29 2c 0a 20 20 20 20 20  snippet(),.     
2c950 20 20 20 2a 2a 20 6f 66 66 73 65 74 73 28 29 20     ** offsets() 
2c960 61 6e 64 20 6d 61 74 63 68 69 6e 66 6f 28 29 20  and matchinfo() 
2c970 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  functions are no
2c980 74 20 73 75 70 70 6f 73 65 64 20 74 6f 20 72 65  t supposed to re
2c990 63 6f 67 6e 69 7a 65 20 0a 20 20 20 20 20 20 20  cognize .       
2c9a0 20 2a 2a 20 61 6e 79 20 69 6e 73 74 61 6e 63 65   ** any instance
2c9b0 73 20 6f 66 20 70 68 72 61 73 65 73 20 74 68 61  s of phrases tha
2c9c0 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 75 6e  t are part of un
2c9d0 6d 61 74 63 68 65 64 20 4e 45 41 52 20 71 75 65  matched NEAR que
2c9e0 72 69 65 73 2e 20 0a 20 20 20 20 20 20 20 20 2a  ries. .        *
2c9f0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 20 69 66  * For example if
2ca00 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
2ca10 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2ca20 20 20 20 20 20 2a 2a 20 20 20 20 2e 2e 2e 20 4d       **    ... M
2ca30 41 54 43 48 20 27 61 20 4f 52 20 28 62 20 4e 45  ATCH 'a OR (b NE
2ca40 41 52 20 63 29 27 0a 20 20 20 20 20 20 20 20 2a  AR c)'.        *
2ca50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  *.        ** is 
2ca60 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20  matched against 
2ca70 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67  a row containing
2ca80 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2ca90 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 27       **        '
2caa0 61 20 62 20 64 20 65 27 0a 20 20 20 20 20 20 20  a b d e'.       
2cab0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
2cac0 68 65 6e 20 61 6e 79 20 73 6e 69 70 70 65 74 28  hen any snippet(
2cad0 29 20 73 68 6f 75 6c 64 20 6f 6e 79 20 68 69 67  ) should ony hig
2cae0 68 6c 69 67 68 74 20 74 68 65 20 22 61 22 20 74  hlight the "a" t
2caf0 65 72 6d 2c 20 6e 6f 74 20 74 68 65 20 22 62 22  erm, not the "b"
2cb00 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 61 73 20  .        ** (as 
2cb10 22 62 22 20 69 73 20 70 61 72 74 20 6f 66 20 61  "b" is part of a
2cb20 20 6e 6f 6e 2d 6d 61 74 63 68 69 6e 67 20 4e 45   non-matching NE
2cb30 41 52 20 63 6c 61 75 73 65 29 2e 0a 20 20 20 20  AR clause)..    
2cb40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2cb50 66 28 20 62 48 69 74 3d 3d 30 20 0a 20 20 20 20  f( bHit==0 .    
2cb60 20 20 20 20 20 26 26 20 70 45 78 70 72 2d 3e 65       && pExpr->e
2cb70 54 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e  Type==FTSQUERY_N
2cb80 45 41 52 20 0a 20 20 20 20 20 20 20 20 20 26 26  EAR .         &&
2cb90 20 28 70 45 78 70 72 2d 3e 70 50 61 72 65 6e 74   (pExpr->pParent
2cba0 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 70 50  ==0 || pExpr->pP
2cbb0 61 72 65 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54  arent->eType!=FT
2cbc0 53 51 55 45 52 59 5f 4e 45 41 52 29 0a 20 20 20  SQUERY_NEAR).   
2cbd0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2cbe0 20 20 46 74 73 33 45 78 70 72 20 2a 70 3b 0a 20    Fts3Expr *p;. 
2cbf0 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 3d 70           for(p=p
2cc00 45 78 70 72 3b 20 70 2d 3e 70 50 68 72 61 73 65  Expr; p->pPhrase
2cc10 3d 3d 30 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29  ==0; p=p->pLeft)
2cc20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2cc30 28 20 70 2d 3e 70 52 69 67 68 74 2d 3e 69 44 6f  ( p->pRight->iDo
2cc40 63 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76  cid==pCsr->iPrev
2cc50 49 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Id ){.          
2cc60 20 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61      fts3EvalInva
2cc70 6c 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 2d  lidatePoslist(p-
2cc80 3e 70 52 69 67 68 74 2d 3e 70 50 68 72 61 73 65  >pRight->pPhrase
2cc90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2cca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ccb0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 44         if( p->iD
2ccc0 6f 63 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65  ocid==pCsr->iPre
2ccd0 76 49 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  vId ){.         
2cce0 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61 6c     fts3EvalInval
2ccf0 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 2d 3e  idatePoslist(p->
2cd00 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20  pPhrase);.      
2cd10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2cd20 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2cd30 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 51  .      case FTSQ
2cd40 55 45 52 59 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  UERY_OR: {.     
2cd50 20 20 20 69 6e 74 20 62 48 69 74 31 20 3d 20 66     int bHit1 = f
2cd60 74 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28  ts3EvalTestExpr(
2cd70 70 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pCsr, pExpr->pLe
2cd80 66 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20  ft, pRc);.      
2cd90 20 20 69 6e 74 20 62 48 69 74 32 20 3d 20 66 74    int bHit2 = ft
2cda0 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70  s3EvalTestExpr(p
2cdb0 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Csr, pExpr->pRig
2cdc0 68 74 2c 20 70 52 63 29 3b 0a 20 20 20 20 20 20  ht, pRc);.      
2cdd0 20 20 62 48 69 74 20 3d 20 62 48 69 74 31 20 7c    bHit = bHit1 |
2cde0 7c 20 62 48 69 74 32 3b 0a 20 20 20 20 20 20 20  | bHit2;.       
2cdf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2ce00 0a 20 20 20 20 20 20 63 61 73 65 20 46 54 53 51  .      case FTSQ
2ce10 55 45 52 59 5f 4e 4f 54 3a 0a 20 20 20 20 20 20  UERY_NOT:.      
2ce20 20 20 62 48 69 74 20 3d 20 28 0a 20 20 20 20 20    bHit = (.     
2ce30 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 54         fts3EvalT
2ce40 65 73 74 45 78 70 72 28 70 43 73 72 2c 20 70 45  estExpr(pCsr, pE
2ce50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29  xpr->pLeft, pRc)
2ce60 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 66 74  .         && !ft
2ce70 73 33 45 76 61 6c 54 65 73 74 45 78 70 72 28 70  s3EvalTestExpr(p
2ce80 43 73 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Csr, pExpr->pRig
2ce90 68 74 2c 20 70 52 63 29 0a 20 20 20 20 20 20 20  ht, pRc).       
2cea0 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   );.        brea
2ceb0 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c  k;..      defaul
2cec0 74 3a 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  t: {.#ifndef SQL
2ced0 49 54 45 5f 44 49 53 41 42 4c 45 5f 46 54 53 34  ITE_DISABLE_FTS4
2cee0 5f 44 45 46 45 52 52 45 44 0a 20 20 20 20 20 20  _DEFERRED.      
2cef0 20 20 69 66 28 20 70 43 73 72 2d 3e 70 44 65 66    if( pCsr->pDef
2cf00 65 72 72 65 64 20 0a 20 20 20 20 20 20 20 20 20  erred .         
2cf10 26 26 20 28 70 45 78 70 72 2d 3e 69 44 6f 63 69  && (pExpr->iDoci
2cf20 64 3d 3d 70 43 73 72 2d 3e 69 50 72 65 76 49 64  d==pCsr->iPrevId
2cf30 20 7c 7c 20 70 45 78 70 72 2d 3e 62 44 65 66 65   || pExpr->bDefe
2cf40 72 72 65 64 29 0a 20 20 20 20 20 20 20 20 29 7b  rred).        ){
2cf50 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 50  .          Fts3P
2cf60 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20 3d  hrase *pPhrase =
2cf70 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65 3b   pExpr->pPhrase;
2cf80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2cf90 74 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72  t( pExpr->bDefer
2cfa0 72 65 64 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e  red || pPhrase->
2cfb0 64 6f 63 6c 69 73 74 2e 62 46 72 65 65 4c 69 73  doclist.bFreeLis
2cfc0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
2cfd0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 62 44 65    if( pExpr->bDe
2cfe0 66 65 72 72 65 64 20 29 7b 0a 20 20 20 20 20 20  ferred ){.      
2cff0 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 49 6e        fts3EvalIn
2d000 76 61 6c 69 64 61 74 65 50 6f 73 6c 69 73 74 28  validatePoslist(
2d010 70 50 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20  pPhrase);.      
2d020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d030 2a 70 52 63 20 3d 20 66 74 73 33 45 76 61 6c 44  *pRc = fts3EvalD
2d040 65 66 65 72 72 65 64 50 68 72 61 73 65 28 70 43  eferredPhrase(pC
2d050 73 72 2c 20 70 50 68 72 61 73 65 29 3b 0a 20 20  sr, pPhrase);.  
2d060 20 20 20 20 20 20 20 20 62 48 69 74 20 3d 20 28          bHit = (
2d070 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74  pPhrase->doclist
2d080 2e 70 4c 69 73 74 21 3d 30 29 3b 0a 20 20 20 20  .pList!=0);.    
2d090 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 6f        pExpr->iDo
2d0a0 63 69 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65  cid = pCsr->iPre
2d0b0 76 49 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  vId;.        }el
2d0c0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2d0d0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 62 48    {.          bH
2d0e0 69 74 20 3d 20 28 70 45 78 70 72 2d 3e 62 45 6f  it = (pExpr->bEo
2d0f0 66 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  f==0 && pExpr->i
2d100 44 6f 63 69 64 3d 3d 70 43 73 72 2d 3e 69 50 72  Docid==pCsr->iPr
2d110 65 76 49 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  evId);.        }
2d120 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2d130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d140 7d 0a 20 20 72 65 74 75 72 6e 20 62 48 69 74 3b  }.  return bHit;
2d150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2d160 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2d170 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2d180 70 61 72 74 20 6f 66 20 65 61 63 68 20 78 4e 65  part of each xNe
2d190 78 74 20 6f 70 65 72 61 74 69 6f 6e 20 77 68 65  xt operation whe
2d1a0 6e 0a 2a 2a 20 69 74 65 72 61 74 69 6e 67 20 74  n.** iterating t
2d1b0 68 72 6f 75 67 68 20 74 68 65 20 72 65 73 75 6c  hrough the resul
2d1c0 74 73 20 6f 66 20 61 20 66 75 6c 6c 2d 74 65 78  ts of a full-tex
2d1d0 74 20 71 75 65 72 79 2e 20 41 74 20 74 68 69 73  t query. At this
2d1e0 20 70 6f 69 6e 74 20 74 68 65 0a 2a 2a 20 63 75   point the.** cu
2d1f0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  rsor points to a
2d200 20 72 6f 77 20 74 68 61 74 20 6d 61 74 63 68 65   row that matche
2d210 73 20 74 68 65 20 71 75 65 72 79 20 65 78 70 72  s the query expr
2d220 65 73 73 69 6f 6e 2c 20 77 69 74 68 20 74 68 65  ession, with the
2d230 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  .** following ca
2d240 76 65 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  veats:.**.**   *
2d250 20 55 70 20 75 6e 74 69 6c 20 74 68 69 73 20 70   Up until this p
2d260 6f 69 6e 74 2c 20 22 4e 45 41 52 22 20 6f 70 65  oint, "NEAR" ope
2d270 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 65 78  rators in the ex
2d280 70 72 65 73 73 69 6f 6e 20 68 61 76 65 20 62 65  pression have be
2d290 65 6e 0a 2a 2a 20 20 20 20 20 74 72 65 61 74 65  en.**     treate
2d2a0 64 20 61 73 20 22 41 4e 44 22 2e 0a 2a 2a 0a 2a  d as "AND"..**.*
2d2b0 2a 20 20 20 2a 20 44 65 66 65 72 72 65 64 20 74  *   * Deferred t
2d2c0 6f 6b 65 6e 73 20 68 61 76 65 20 6e 6f 74 20 79  okens have not y
2d2d0 65 74 20 62 65 65 6e 20 63 6f 6e 73 69 64 65 72  et been consider
2d2e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  ed..**.** If *pR
2d2f0 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  c is not SQLITE_
2d300 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OK when this fun
2d310 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2d320 20 69 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a   it immediately.
2d330 2a 2a 20 72 65 74 75 72 6e 73 20 30 2e 20 4f 74  ** returns 0. Ot
2d340 68 65 72 77 69 73 65 2c 20 69 74 20 74 65 73 74  herwise, it test
2d350 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
2d360 20 61 66 74 65 72 20 63 6f 6e 73 69 64 65 72 69   after consideri
2d370 6e 67 20 4e 45 41 52 0a 2a 2a 20 6f 70 65 72 61  ng NEAR.** opera
2d380 74 6f 72 73 20 61 6e 64 20 64 65 66 65 72 72 65  tors and deferre
2d390 64 20 74 6f 6b 65 6e 73 20 74 68 65 20 63 75 72  d tokens the cur
2d3a0 72 65 6e 74 20 72 6f 77 20 69 73 20 73 74 69 6c  rent row is stil
2d3b0 6c 20 61 20 6d 61 74 63 68 20 66 6f 72 20 74 68  l a match for th
2d3c0 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  e.** expression.
2d3d0 20 49 74 20 72 65 74 75 72 6e 73 20 31 20 69 66   It returns 1 if
2d3e0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 66 6f 6c   both of the fol
2d3f0 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
2d400 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 2a 70 52 63  .**.**   1. *pRc
2d410 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68   is SQLITE_OK wh
2d420 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2d430 20 72 65 74 75 72 6e 73 2c 20 61 6e 64 0a 2a 2a   returns, and.**
2d440 0a 2a 2a 20 20 20 32 2e 20 41 66 74 65 72 20 73  .**   2. After s
2d450 63 61 6e 6e 69 6e 67 20 74 68 65 20 63 75 72 72  canning the curr
2d460 65 6e 74 20 46 54 53 20 74 61 62 6c 65 20 72 6f  ent FTS table ro
2d470 77 20 66 6f 72 20 74 68 65 20 64 65 66 65 72 72  w for the deferr
2d480 65 64 20 74 6f 6b 65 6e 73 2c 0a 2a 2a 20 20 20  ed tokens,.**   
2d490 20 20 20 69 74 20 69 73 20 64 65 74 65 72 6d 69     it is determi
2d4a0 6e 65 64 20 74 68 61 74 20 74 68 65 20 72 6f 77  ned that the row
2d4b0 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 6d 61 74 63   does *not* matc
2d4c0 68 20 74 68 65 20 71 75 65 72 79 2e 0a 2a 2a 0a  h the query..**.
2d4d0 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 65 72 72  ** Or, if no err
2d4e0 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 69 74  or occurs and it
2d4f0 20 73 65 65 6d 73 20 74 68 65 20 63 75 72 72 65   seems the curre
2d500 6e 74 20 72 6f 77 20 64 6f 65 73 20 6d 61 74 63  nt row does matc
2d510 68 20 74 68 65 20 46 54 53 0a 2a 2a 20 71 75 65  h the FTS.** que
2d520 72 79 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ry, return 0..*/
2d530 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33  .int sqlite3Fts3
2d540 45 76 61 6c 54 65 73 74 44 65 66 65 72 72 65 64  EvalTestDeferred
2d550 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73  (Fts3Cursor *pCs
2d560 72 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  r, int *pRc){.  
2d570 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 0a 20  int rc = *pRc;. 
2d580 20 69 6e 74 20 62 4d 69 73 73 20 3d 20 30 3b 0a   int bMiss = 0;.
2d590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d5a0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49  _OK ){..    /* I
2d5b0 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
2d5c0 6f 72 20 6d 6f 72 65 20 64 65 66 65 72 72 65 64  or more deferred
2d5d0 20 74 6f 6b 65 6e 73 2c 20 6c 6f 61 64 20 74 68   tokens, load th
2d5e0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e  e current row in
2d5f0 74 6f 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79  to.    ** memory
2d600 20 61 6e 64 20 73 63 61 6e 20 69 74 20 74 6f 20   and scan it to 
2d610 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 6f  determine the po
2d620 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  sition list for 
2d630 65 61 63 68 20 64 65 66 65 72 72 65 64 0a 20 20  each deferred.  
2d640 20 20 2a 2a 20 74 6f 6b 65 6e 2e 20 54 68 65 6e    ** token. Then
2d650 2c 20 73 65 65 20 69 66 20 74 68 69 73 20 72 6f  , see if this ro
2d660 77 20 69 73 20 72 65 61 6c 6c 79 20 61 20 6d 61  w is really a ma
2d670 74 63 68 2c 20 63 6f 6e 73 69 64 65 72 69 6e 67  tch, considering
2d680 20 64 65 66 65 72 72 65 64 0a 20 20 20 20 2a 2a   deferred.    **
2d690 20 74 6f 6b 65 6e 73 20 61 6e 64 20 4e 45 41 52   tokens and NEAR
2d6a0 20 6f 70 65 72 61 74 6f 72 73 20 28 6e 65 69 74   operators (neit
2d6b0 68 65 72 20 6f 66 20 77 68 69 63 68 20 77 65 72  her of which wer
2d6c0 65 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63  e taken into acc
2d6d0 6f 75 6e 74 0a 20 20 20 20 2a 2a 20 65 61 72 6c  ount.    ** earl
2d6e0 69 65 72 2c 20 62 79 20 66 74 73 33 45 76 61 6c  ier, by fts3Eval
2d6f0 4e 65 78 74 52 6f 77 28 29 29 2e 20 0a 20 20 20  NextRow()). .   
2d700 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 73 72   */.    if( pCsr
2d710 2d 3e 70 44 65 66 65 72 72 65 64 20 29 7b 0a 20  ->pDeferred ){. 
2d720 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 43 75       rc = fts3Cu
2d730 72 73 6f 72 53 65 65 6b 28 30 2c 20 70 43 73 72  rsorSeek(0, pCsr
2d740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2d750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d770 65 33 46 74 73 33 43 61 63 68 65 44 65 66 65 72  e3Fts3CacheDefer
2d780 72 65 64 44 6f 63 6c 69 73 74 73 28 70 43 73 72  redDoclists(pCsr
2d790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2d7a0 0a 20 20 20 20 62 4d 69 73 73 20 3d 20 28 30 3d  .    bMiss = (0=
2d7b0 3d 66 74 73 33 45 76 61 6c 54 65 73 74 45 78 70  =fts3EvalTestExp
2d7c0 72 28 70 43 73 72 2c 20 70 43 73 72 2d 3e 70 45  r(pCsr, pCsr->pE
2d7d0 78 70 72 2c 20 26 72 63 29 29 3b 0a 0a 20 20 20  xpr, &rc));..   
2d7e0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 70 6f 73   /* Free the pos
2d7f0 69 74 69 6f 6e 2d 6c 69 73 74 73 20 61 63 63 75  ition-lists accu
2d800 6d 75 6c 61 74 65 64 20 66 6f 72 20 65 61 63 68  mulated for each
2d810 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 20   deferred token 
2d820 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 73 71  above. */.    sq
2d830 6c 69 74 65 33 46 74 73 33 46 72 65 65 44 65 66  lite3Fts3FreeDef
2d840 65 72 72 65 64 44 6f 63 6c 69 73 74 73 28 70 43  erredDoclists(pC
2d850 73 72 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20  sr);.    *pRc = 
2d860 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
2d870 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
2d880 26 26 20 62 4d 69 73 73 29 3b 0a 7d 0a 0a 2f 2a  && bMiss);.}../*
2d890 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  .** Advance to t
2d8a0 68 65 20 6e 65 78 74 20 64 6f 63 75 6d 65 6e 74  he next document
2d8b0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
2d8c0 65 20 46 54 53 20 65 78 70 72 65 73 73 69 6f 6e  e FTS expression
2d8d0 20 69 6e 0a 2a 2a 20 46 74 73 33 43 75 72 73 6f   in.** Fts3Curso
2d8e0 72 2e 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  r.pExpr..*/.stat
2d8f0 69 63 20 69 6e 74 20 66 74 73 33 45 76 61 6c 4e  ic int fts3EvalN
2d900 65 78 74 28 46 74 73 33 43 75 72 73 6f 72 20 2a  ext(Fts3Cursor *
2d910 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  pCsr){.  int rc 
2d920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d930 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2d940 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn Code */.  Fts
2d950 33 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70  3Expr *pExpr = p
2d960 43 73 72 2d 3e 70 45 78 70 72 3b 0a 20 20 61 73  Csr->pExpr;.  as
2d970 73 65 72 74 28 20 70 43 73 72 2d 3e 69 73 45 6f  sert( pCsr->isEo
2d980 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45  f==0 );.  if( pE
2d990 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  xpr==0 ){.    pC
2d9a0 73 72 2d 3e 69 73 45 6f 66 20 3d 20 31 3b 0a 20  sr->isEof = 1;. 
2d9b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
2d9c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  .      if( pCsr-
2d9d0 3e 69 73 52 65 71 75 69 72 65 53 65 65 6b 3d 3d  >isRequireSeek==
2d9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2d9f0 69 74 65 33 5f 72 65 73 65 74 28 70 43 73 72 2d  ite3_reset(pCsr-
2da00 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  >pStmt);.      }
2da10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2da20 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
2da30 74 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3d 3d  t(pCsr->pStmt)==
2da40 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 33 45  0 );.      fts3E
2da50 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
2da60 20 70 45 78 70 72 2c 20 26 72 63 29 3b 0a 20 20   pExpr, &rc);.  
2da70 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20      pCsr->isEof 
2da80 3d 20 70 45 78 70 72 2d 3e 62 45 6f 66 3b 0a 20  = pExpr->bEof;. 
2da90 20 20 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71       pCsr->isReq
2daa0 75 69 72 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20  uireSeek = 1;.  
2dab0 20 20 20 20 70 43 73 72 2d 3e 69 73 4d 61 74 63      pCsr->isMatc
2dac0 68 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20 31 3b  hinfoNeeded = 1;
2dad0 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50 72  .      pCsr->iPr
2dae0 65 76 49 64 20 3d 20 70 45 78 70 72 2d 3e 69 44  evId = pExpr->iD
2daf0 6f 63 69 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ocid;.    }while
2db00 28 20 70 43 73 72 2d 3e 69 73 45 6f 66 3d 3d 30  ( pCsr->isEof==0
2db10 20 26 26 20 73 71 6c 69 74 65 33 46 74 73 33 45   && sqlite3Fts3E
2db20 76 61 6c 54 65 73 74 44 65 66 65 72 72 65 64 28  valTestDeferred(
2db30 70 43 73 72 2c 20 26 72 63 29 20 29 3b 0a 20 20  pCsr, &rc) );.  
2db40 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
2db50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
2db60 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2db70 68 65 20 64 6f 63 69 64 20 72 61 6e 67 65 20 73  he docid range s
2db80 70 65 63 69 66 69 65 64 0a 20 20 2a 2a 20 62 79  pecified.  ** by
2db90 20 46 74 73 33 43 75 72 73 6f 72 2e 69 4d 69 6e   Fts3Cursor.iMin
2dba0 44 6f 63 69 64 2f 69 4d 61 78 44 6f 63 69 64 2e  Docid/iMaxDocid.
2dbb0 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20   If so, set the 
2dbc0 45 4f 46 20 66 6c 61 67 2e 20 20 2a 2f 0a 20 20  EOF flag.  */.  
2dbd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dbe0 4b 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 28  K && (.        (
2dbf0 70 43 73 72 2d 3e 62 44 65 73 63 3d 3d 30 20 26  pCsr->bDesc==0 &
2dc00 26 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 3e  & pCsr->iPrevId>
2dc10 70 43 73 72 2d 3e 69 4d 61 78 44 6f 63 69 64 29  pCsr->iMaxDocid)
2dc20 0a 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e  .     || (pCsr->
2dc30 62 44 65 73 63 21 3d 30 20 26 26 20 70 43 73 72  bDesc!=0 && pCsr
2dc40 2d 3e 69 50 72 65 76 49 64 3c 70 43 73 72 2d 3e  ->iPrevId<pCsr->
2dc50 69 4d 69 6e 44 6f 63 69 64 29 0a 20 20 29 29 7b  iMinDocid).  )){
2dc60 0a 20 20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66  .    pCsr->isEof
2dc70 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
2dc80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2dc90 20 52 65 73 74 61 72 74 20 69 6e 74 65 72 61 74   Restart interat
2dca0 69 6f 6e 20 66 6f 72 20 65 78 70 72 65 73 73 69  ion for expressi
2dcb0 6f 6e 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  on pExpr so that
2dcc0 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2dcd0 6f 0a 2a 2a 20 66 74 73 33 45 76 61 6c 4e 65 78  o.** fts3EvalNex
2dce0 74 28 29 20 76 69 73 69 74 73 20 74 68 65 20 66  t() visits the f
2dcf0 69 72 73 74 20 72 6f 77 2e 20 44 6f 20 6e 6f 74  irst row. Do not
2dd00 20 61 6c 6c 6f 77 20 69 6e 63 72 65 6d 65 6e 74   allow increment
2dd10 61 6c 20 0a 2a 2a 20 6c 6f 61 64 69 6e 67 20 6f  al .** loading o
2dd20 72 20 6d 65 72 67 69 6e 67 20 6f 66 20 70 68 72  r merging of phr
2dd30 61 73 65 20 64 6f 63 6c 69 73 74 73 20 66 6f 72  ase doclists for
2dd40 20 74 68 69 73 20 69 74 65 72 61 74 69 6f 6e 2e   this iteration.
2dd50 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69  .**.** If *pRc i
2dd60 73 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  s other than SQL
2dd70 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
2dd80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2dd90 6c 65 64 2c 20 69 74 20 69 73 0a 2a 2a 20 61 20  led, it is.** a 
2dda0 6e 6f 2d 6f 70 2e 20 49 66 20 61 6e 20 65 72 72  no-op. If an err
2ddb0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
2ddc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2ddd0 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61  *pRc is set to a
2dde0 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  n.** SQLite erro
2ddf0 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20 72 65  r code before re
2de00 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
2de10 69 63 20 76 6f 69 64 20 66 74 73 33 45 76 61 6c  ic void fts3Eval
2de20 52 65 73 74 61 72 74 28 0a 20 20 46 74 73 33 43  Restart(.  Fts3C
2de30 75 72 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20 46  ursor *pCsr,.  F
2de40 74 73 33 45 78 70 72 20 2a 70 45 78 70 72 2c 0a  ts3Expr *pExpr,.
2de50 20 20 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20    int *pRc.){.  
2de60 69 66 28 20 70 45 78 70 72 20 26 26 20 2a 70 52  if( pExpr && *pR
2de70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2de80 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20 2a      Fts3Phrase *
2de90 70 50 68 72 61 73 65 20 3d 20 70 45 78 70 72 2d  pPhrase = pExpr-
2dea0 3e 70 50 68 72 61 73 65 3b 0a 0a 20 20 20 20 69  >pPhrase;..    i
2deb0 66 28 20 70 50 68 72 61 73 65 20 29 7b 0a 20 20  f( pPhrase ){.  
2dec0 20 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76 61      fts3EvalInva
2ded0 6c 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70 50  lidatePoslist(pP
2dee0 68 72 61 73 65 29 3b 0a 20 20 20 20 20 20 69 66  hrase);.      if
2def0 28 20 70 50 68 72 61 73 65 2d 3e 62 49 6e 63 72  ( pPhrase->bIncr
2df00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2df10 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
2df20 3d 30 3b 20 69 3c 70 50 68 72 61 73 65 2d 3e 6e  =0; i<pPhrase->n
2df30 54 6f 6b 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  Token; i++){.   
2df40 20 20 20 20 20 20 20 46 74 73 33 50 68 72 61 73         Fts3Phras
2df50 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d  eToken *pToken =
2df60 20 26 70 50 68 72 61 73 65 2d 3e 61 54 6f 6b 65   &pPhrase->aToke
2df70 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[i];.          
2df80 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2df90 70 44 65 66 65 72 72 65 64 3d 3d 30 20 29 3b 0a  pDeferred==0 );.
2dfa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
2dfb0 6f 6b 65 6e 2d 3e 70 53 65 67 63 73 72 20 29 7b  oken->pSegcsr ){
2dfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2dfd0 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 52  ite3Fts3MsrIncrR
2dfe0 65 73 74 61 72 74 28 70 54 6f 6b 65 6e 2d 3e 70  estart(pToken->p
2dff0 53 65 67 63 73 72 29 3b 0a 20 20 20 20 20 20 20  Segcsr);.       
2e000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e010 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 66 74         *pRc = ft
2e020 73 33 45 76 61 6c 50 68 72 61 73 65 53 74 61 72  s3EvalPhraseStar
2e030 74 28 70 43 73 72 2c 20 30 2c 20 70 50 68 72 61  t(pCsr, 0, pPhra
2e040 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
2e050 20 20 20 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c     pPhrase->docl
2e060 69 73 74 2e 70 4e 65 78 74 44 6f 63 69 64 20 3d  ist.pNextDocid =
2e070 20 30 3b 0a 20 20 20 20 20 20 70 50 68 72 61 73   0;.      pPhras
2e080 65 2d 3e 64 6f 63 6c 69 73 74 2e 69 44 6f 63 69  e->doclist.iDoci
2e090 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 68  d = 0;.      pPh
2e0a0 72 61 73 65 2d 3e 70 4f 72 50 6f 73 6c 69 73 74  rase->pOrPoslist
2e0b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
2e0c0 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 20 3d   pExpr->iDocid =
2e0d0 20 30 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 62   0;.    pExpr->b
2e0e0 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70 45 78  Eof = 0;.    pEx
2e0f0 70 72 2d 3e 62 53 74 61 72 74 20 3d 20 30 3b 0a  pr->bStart = 0;.
2e100 0a 20 20 20 20 66 74 73 33 45 76 61 6c 52 65 73  .    fts3EvalRes
2e110 74 61 72 74 28 70 43 73 72 2c 20 70 45 78 70 72  tart(pCsr, pExpr
2e120 2d 3e 70 4c 65 66 74 2c 20 70 52 63 29 3b 0a 20  ->pLeft, pRc);. 
2e130 20 20 20 66 74 73 33 45 76 61 6c 52 65 73 74 61     fts3EvalResta
2e140 72 74 28 70 43 73 72 2c 20 70 45 78 70 72 2d 3e  rt(pCsr, pExpr->
2e150 70 52 69 67 68 74 2c 20 70 52 63 29 3b 0a 20 20  pRight, pRc);.  
2e160 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 66 74 65 72  }.}../*.** After
2e170 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
2e180 46 74 73 33 45 78 70 72 2e 61 4d 49 5b 5d 20 61  Fts3Expr.aMI[] a
2e190 72 72 61 79 20 66 6f 72 20 65 61 63 68 20 70 68  rray for each ph
2e1a0 72 61 73 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  rase in the .** 
2e1b0 65 78 70 72 65 73 73 69 6f 6e 20 72 6f 6f 74 65  expression roote
2e1c0 64 20 61 74 20 70 45 78 70 72 2c 20 74 68 65 20  d at pExpr, the 
2e1d0 63 75 72 73 6f 72 20 69 74 65 72 61 74 65 73 20  cursor iterates 
2e1e0 74 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73  through all rows
2e1f0 20 6d 61 74 63 68 65 64 0a 2a 2a 20 62 79 20 70   matched.** by p
2e200 45 78 70 72 2c 20 63 61 6c 6c 69 6e 67 20 74 68  Expr, calling th
2e210 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  is function for 
2e220 65 61 63 68 20 72 6f 77 2e 20 54 68 69 73 20 66  each row. This f
2e230 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
2e240 74 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  ts.** the values
2e250 20 69 6e 20 46 74 73 33 45 78 70 72 2e 61 4d 49   in Fts3Expr.aMI
2e260 5b 5d 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  [] according to 
2e270 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
2e280 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 66  t currently.** f
2e290 6f 75 6e 64 20 69 6e 20 46 74 73 33 45 78 70 72  ound in Fts3Expr
2e2a0 2e 70 50 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73  .pPhrase->doclis
2e2b0 74 2e 70 4c 69 73 74 20 66 6f 72 20 65 61 63 68  t.pList for each
2e2c0 20 6f 66 20 74 68 65 20 70 68 72 61 73 65 20 0a   of the phrase .
2e2d0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ** expression no
2e2e0 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  des..*/.static v
2e2f0 6f 69 64 20 66 74 73 33 45 76 61 6c 55 70 64 61  oid fts3EvalUpda
2e300 74 65 43 6f 75 6e 74 73 28 46 74 73 33 45 78 70  teCounts(Fts3Exp
2e310 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2e320 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 46 74   pExpr ){.    Ft
2e330 73 33 50 68 72 61 73 65 20 2a 70 50 68 72 61 73  s3Phrase *pPhras
2e340 65 20 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61  e = pExpr->pPhra
2e350 73 65 3b 0a 20 20 20 20 69 66 28 20 70 50 68 72  se;.    if( pPhr
2e360 61 73 65 20 26 26 20 70 50 68 72 61 73 65 2d 3e  ase && pPhrase->
2e370 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74 20 29 7b  doclist.pList ){
2e380 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
2e390 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
2e3a0 2a 70 20 3d 20 70 50 68 72 61 73 65 2d 3e 64 6f  *p = pPhrase->do
2e3b0 63 6c 69 73 74 2e 70 4c 69 73 74 3b 0a 0a 20 20  clist.pList;..  
2e3c0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 20 29      assert( *p )
2e3d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 31  ;.      while( 1
2e3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 63   ){.        u8 c
2e3f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
2e400 74 20 69 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20  t iCnt = 0;.    
2e410 20 20 20 20 77 68 69 6c 65 28 20 30 78 46 45 20      while( 0xFE 
2e420 26 20 28 2a 70 20 7c 20 63 29 20 29 7b 0a 20 20  & (*p | c) ){.  
2e430 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26 30          if( (c&0
2e440 78 38 30 29 3d 3d 30 20 29 20 69 43 6e 74 2b 2b  x80)==0 ) iCnt++
2e450 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2e460 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a 20 20 20  *p++ & 0x80;.   
2e470 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2e480 2f 2a 20 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20  /* aMI[iCol*3 + 
2e490 31 5d 20 3d 20 4e 75 6d 62 65 72 20 6f 66 20 6f  1] = Number of o
2e4a0 63 63 75 72 72 65 6e 63 65 73 0a 20 20 20 20 20  ccurrences.     
2e4b0 20 20 20 2a 2a 20 61 4d 49 5b 69 43 6f 6c 2a 33     ** aMI[iCol*3
2e4c0 20 2b 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20 6f   + 2] = Number o
2e4d0 66 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e  f rows containin
2e4e0 67 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 69  g at least one i
2e4f0 6e 73 74 61 6e 63 65 0a 20 20 20 20 20 20 20 20  nstance.        
2e500 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
2e510 2d 3e 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 31  ->aMI[iCol*3 + 1
2e520 5d 20 2b 3d 20 69 43 6e 74 3b 0a 20 20 20 20 20  ] += iCnt;.     
2e530 20 20 20 70 45 78 70 72 2d 3e 61 4d 49 5b 69 43     pExpr->aMI[iC
2e540 6f 6c 2a 33 20 2b 20 32 5d 20 2b 3d 20 28 69 43  ol*3 + 2] += (iC
2e550 6e 74 3e 30 29 3b 0a 20 20 20 20 20 20 20 20 69  nt>0);.        i
2e560 66 28 20 2a 70 3d 3d 30 78 30 30 20 29 20 62 72  f( *p==0x00 ) br
2e570 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 2b 2b  eak;.        p++
2e580 3b 0a 20 20 20 20 20 20 20 20 70 20 2b 3d 20 66  ;.        p += f
2e590 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
2e5a0 2c 20 26 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  , &iCol);.      
2e5b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
2e5c0 33 45 76 61 6c 55 70 64 61 74 65 43 6f 75 6e 74  3EvalUpdateCount
2e5d0 73 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  s(pExpr->pLeft);
2e5e0 0a 20 20 20 20 66 74 73 33 45 76 61 6c 55 70 64  .    fts3EvalUpd
2e5f0 61 74 65 43 6f 75 6e 74 73 28 70 45 78 70 72 2d  ateCounts(pExpr-
2e600 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a  >pRight);.  }.}.
2e610 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
2e620 6e 20 70 45 78 70 72 20 6d 75 73 74 20 62 65 20  n pExpr must be 
2e630 6f 66 20 74 79 70 65 20 46 54 53 51 55 45 52 59  of type FTSQUERY
2e640 5f 50 48 52 41 53 45 2e 0a 2a 2a 0a 2a 2a 20 49  _PHRASE..**.** I
2e650 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
2e660 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  ady allocated an
2e670 64 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 69  d populated, thi
2e680 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
2e690 61 74 65 73 20 61 6e 64 0a 2a 2a 20 70 6f 70 75  ates and.** popu
2e6a0 6c 61 74 65 73 20 74 68 65 20 46 74 73 33 45 78  lates the Fts3Ex
2e6b0 70 72 2e 61 4d 49 5b 5d 20 61 72 72 61 79 20 66  pr.aMI[] array f
2e6c0 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  or expression pE
2e6d0 78 70 72 2e 20 49 66 20 70 45 78 70 72 20 69 73  xpr. If pExpr is
2e6e0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4e 45   part.** of a NE
2e6f0 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  AR expression, t
2e700 68 65 6e 20 69 74 20 61 6c 73 6f 20 61 6c 6c 6f  hen it also allo
2e710 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61  cates and popula
2e720 74 65 73 20 74 68 65 20 73 61 6d 65 20 61 72 72  tes the same arr
2e730 61 79 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 74  ay.** for all ot
2e740 68 65 72 20 70 68 72 61 73 65 73 20 74 68 61 74  her phrases that
2e750 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65   are part of the
2e760 20 4e 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e   NEAR expression
2e770 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2e780 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2e790 20 74 68 65 20 61 4d 49 5b 5d 20 61 72 72 61 79   the aMI[] array
2e7a0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
2e7b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 0a 2a   allocated and.*
2e7c0 2a 20 70 6f 70 75 6c 61 74 65 64 2e 20 4f 74 68  * populated. Oth
2e7d0 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72  erwise, if an er
2e7e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
2e7f0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2e800 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2e810 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33  .static int fts3
2e820 45 76 61 6c 47 61 74 68 65 72 53 74 61 74 73 28  EvalGatherStats(
2e830 0a 20 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70  .  Fts3Cursor *p
2e840 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
2e850 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a     /* Cursor obj
2e860 65 63 74 20 2a 2f 0a 20 20 46 74 73 33 45 78 70  ect */.  Fts3Exp
2e870 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
2e880 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 51           /* FTSQ
2e890 55 45 52 59 5f 50 48 52 41 53 45 20 65 78 70 72  UERY_PHRASE expr
2e8a0 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  ession */.){.  i
2e8b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e8c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2e8d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2e8e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
2e8f0 72 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51 55 45  r->eType==FTSQUE
2e900 52 59 5f 50 48 52 41 53 45 20 29 3b 0a 20 20 69  RY_PHRASE );.  i
2e910 66 28 20 70 45 78 70 72 2d 3e 61 4d 49 3d 3d 30  f( pExpr->aMI==0
2e920 20 29 7b 0a 20 20 20 20 46 74 73 33 54 61 62 6c   ){.    Fts3Tabl
2e930 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54  e *pTab = (Fts3T
2e940 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73  able *)pCsr->bas
2e950 65 2e 70 56 74 61 62 3b 0a 20 20 20 20 46 74 73  e.pVtab;.    Fts
2e960 33 45 78 70 72 20 2a 70 52 6f 6f 74 3b 20 20 20  3Expr *pRoot;   
2e970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e980 52 6f 6f 74 20 6f 66 20 4e 45 41 52 20 65 78 70  Root of NEAR exp
2e990 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 46  ression */.    F
2e9a0 74 73 33 45 78 70 72 20 2a 70 3b 20 20 20 20 20  ts3Expr *p;     
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e9c0 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
2e9d0 66 6f 72 20 73 65 76 65 72 61 6c 20 70 75 72 70  for several purp
2e9e0 6f 73 65 73 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  oses */..    sql
2e9f0 69 74 65 33 5f 69 6e 74 36 34 20 69 50 72 65 76  ite3_int64 iPrev
2ea00 49 64 20 3d 20 70 43 73 72 2d 3e 69 50 72 65 76  Id = pCsr->iPrev
2ea10 49 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  Id;.    sqlite3_
2ea20 69 6e 74 36 34 20 69 44 6f 63 69 64 3b 0a 20 20  int64 iDocid;.  
2ea30 20 20 75 38 20 62 45 6f 66 3b 0a 0a 20 20 20 20    u8 bEof;..    
2ea40 2f 2a 20 46 69 6e 64 20 74 68 65 20 72 6f 6f 74  /* Find the root
2ea50 20 6f 66 20 74 68 65 20 4e 45 41 52 20 65 78 70   of the NEAR exp
2ea60 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70  ression */.    p
2ea70 52 6f 6f 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Root = pExpr;.  
2ea80 20 20 77 68 69 6c 65 28 20 70 52 6f 6f 74 2d 3e    while( pRoot->
2ea90 70 50 61 72 65 6e 74 20 26 26 20 70 52 6f 6f 74  pParent && pRoot
2eaa0 2d 3e 70 50 61 72 65 6e 74 2d 3e 65 54 79 70 65  ->pParent->eType
2eab0 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20  ==FTSQUERY_NEAR 
2eac0 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  ){.      pRoot =
2ead0 20 70 52 6f 6f 74 2d 3e 70 50 61 72 65 6e 74 3b   pRoot->pParent;
2eae0 0a 20 20 20 20 7d 0a 20 20 20 20 69 44 6f 63 69  .    }.    iDoci
2eaf0 64 20 3d 20 70 52 6f 6f 74 2d 3e 69 44 6f 63 69  d = pRoot->iDoci
2eb00 64 3b 0a 20 20 20 20 62 45 6f 66 20 3d 20 70 52  d;.    bEof = pR
2eb10 6f 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20 20 61  oot->bEof;.    a
2eb20 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 62 53  ssert( pRoot->bS
2eb30 74 61 72 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  tart );..    /* 
2eb40 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
2eb50 6f 72 20 74 68 65 20 61 4d 53 49 5b 5d 20 61 72  or the aMSI[] ar
2eb60 72 61 79 20 6f 66 20 65 61 63 68 20 46 54 53 51  ray of each FTSQ
2eb70 55 45 52 59 5f 50 48 52 41 53 45 20 6e 6f 64 65  UERY_PHRASE node
2eb80 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 52   */.    for(p=pR
2eb90 6f 6f 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4c 65  oot; p; p=p->pLe
2eba0 66 74 29 7b 0a 20 20 20 20 20 20 46 74 73 33 45  ft){.      Fts3E
2ebb0 78 70 72 20 2a 70 45 20 3d 20 28 70 2d 3e 65 54  xpr *pE = (p->eT
2ebc0 79 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 50 48  ype==FTSQUERY_PH
2ebd0 52 41 53 45 3f 70 3a 70 2d 3e 70 52 69 67 68 74  RASE?p:p->pRight
2ebe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ebf0 20 70 45 2d 3e 61 4d 49 3d 3d 30 20 29 3b 0a 20   pE->aMI==0 );. 
2ec00 20 20 20 20 20 70 45 2d 3e 61 4d 49 20 3d 20 28       pE->aMI = (
2ec10 75 33 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  u32 *)sqlite3_ma
2ec20 6c 6c 6f 63 28 70 54 61 62 2d 3e 6e 43 6f 6c 75  lloc(pTab->nColu
2ec30 6d 6e 20 2a 20 33 20 2a 20 73 69 7a 65 6f 66 28  mn * 3 * sizeof(
2ec40 75 33 32 29 29 3b 0a 20 20 20 20 20 20 69 66 28  u32));.      if(
2ec50 20 21 70 45 2d 3e 61 4d 49 20 29 20 72 65 74 75   !pE->aMI ) retu
2ec60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2ec70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45  .      memset(pE
2ec80 2d 3e 61 4d 49 2c 20 30 2c 20 70 54 61 62 2d 3e  ->aMI, 0, pTab->
2ec90 6e 43 6f 6c 75 6d 6e 20 2a 20 33 20 2a 20 73 69  nColumn * 3 * si
2eca0 7a 65 6f 66 28 75 33 32 29 29 3b 0a 20 20 20 20  zeof(u32));.    
2ecb0 7d 0a 0a 20 20 20 20 66 74 73 33 45 76 61 6c 52  }..    fts3EvalR
2ecc0 65 73 74 61 72 74 28 70 43 73 72 2c 20 70 52 6f  estart(pCsr, pRo
2ecd0 6f 74 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 77  ot, &rc);..    w
2ece0 68 69 6c 65 28 20 70 43 73 72 2d 3e 69 73 45 6f  hile( pCsr->isEo
2ecf0 66 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  f==0 && rc==SQLI
2ed00 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 20 20  TE_OK ){..      
2ed10 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  do {.        /* 
2ed20 45 6e 73 75 72 65 20 74 68 65 20 25 5f 63 6f 6e  Ensure the %_con
2ed30 74 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69  tent statement i
2ed40 73 20 72 65 73 65 74 2e 20 2a 2f 0a 20 20 20 20  s reset. */.    
2ed50 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 73      if( pCsr->is
2ed60 52 65 71 75 69 72 65 53 65 65 6b 3d 3d 30 20 29  RequireSeek==0 )
2ed70 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
2ed80 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  Csr->pStmt);.   
2ed90 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2eda0 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
2edb0 70 43 73 72 2d 3e 70 53 74 6d 74 29 3d 3d 30 20  pCsr->pStmt)==0 
2edc0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
2edd0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
2ede0 78 74 20 64 6f 63 75 6d 65 6e 74 20 2a 2f 0a 20  xt document */. 
2edf0 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 4e         fts3EvalN
2ee00 65 78 74 52 6f 77 28 70 43 73 72 2c 20 70 52 6f  extRow(pCsr, pRo
2ee10 6f 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ot, &rc);.      
2ee20 20 20 70 43 73 72 2d 3e 69 73 45 6f 66 20 3d 20    pCsr->isEof = 
2ee30 70 52 6f 6f 74 2d 3e 62 45 6f 66 3b 0a 20 20 20  pRoot->bEof;.   
2ee40 20 20 20 20 20 70 43 73 72 2d 3e 69 73 52 65 71       pCsr->isReq
2ee50 75 69 72 65 53 65 65 6b 20 3d 20 31 3b 0a 20 20  uireSeek = 1;.  
2ee60 20 20 20 20 20 20 70 43 73 72 2d 3e 69 73 4d 61        pCsr->isMa
2ee70 74 63 68 69 6e 66 6f 4e 65 65 64 65 64 20 3d 20  tchinfoNeeded = 
2ee80 31 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  1;.        pCsr-
2ee90 3e 69 50 72 65 76 49 64 20 3d 20 70 52 6f 6f 74  >iPrevId = pRoot
2eea0 2d 3e 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20  ->iDocid;.      
2eeb0 7d 77 68 69 6c 65 28 20 70 43 73 72 2d 3e 69 73  }while( pCsr->is
2eec0 45 6f 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Eof==0 .        
2eed0 20 20 20 26 26 20 70 52 6f 6f 74 2d 3e 65 54 79     && pRoot->eTy
2eee0 70 65 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41  pe==FTSQUERY_NEA
2eef0 52 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  R .           &&
2ef00 20 73 71 6c 69 74 65 33 46 74 73 33 45 76 61 6c   sqlite3Fts3Eval
2ef10 54 65 73 74 44 65 66 65 72 72 65 64 28 70 43 73  TestDeferred(pCs
2ef20 72 2c 20 26 72 63 29 20 0a 20 20 20 20 20 20 29  r, &rc) .      )
2ef30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
2ef40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43  =SQLITE_OK && pC
2ef50 73 72 2d 3e 69 73 45 6f 66 3d 3d 30 20 29 7b 0a  sr->isEof==0 ){.
2ef60 20 20 20 20 20 20 20 20 66 74 73 33 45 76 61 6c          fts3Eval
2ef70 55 70 64 61 74 65 43 6f 75 6e 74 73 28 70 52 6f  UpdateCounts(pRo
2ef80 6f 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ot);.      }.   
2ef90 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 69 73   }..    pCsr->is
2efa0 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20 70 43 73  Eof = 0;.    pCs
2efb0 72 2d 3e 69 50 72 65 76 49 64 20 3d 20 69 50 72  r->iPrevId = iPr
2efc0 65 76 49 64 3b 0a 0a 20 20 20 20 69 66 28 20 62  evId;..    if( b
2efd0 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  Eof ){.      pRo
2efe0 6f 74 2d 3e 62 45 6f 66 20 3d 20 62 45 6f 66 3b  ot->bEof = bEof;
2eff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f000 20 20 2f 2a 20 43 61 75 74 69 6f 6e 3a 20 70 52    /* Caution: pR
2f010 6f 6f 74 20 6d 61 79 20 69 74 65 72 61 74 65 20  oot may iterate 
2f020 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20 69  through docids i
2f030 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
2f040 65 73 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20  escending.      
2f050 2a 2a 20 6f 72 64 65 72 2e 20 46 6f 72 20 74 68  ** order. For th
2f060 69 73 20 72 65 61 73 6f 6e 2c 20 65 76 65 6e 20  is reason, even 
2f070 74 68 6f 75 67 68 20 69 74 20 73 65 65 6d 73 20  though it seems 
2f080 6d 6f 72 65 20 64 65 66 65 6e 73 69 76 65 2c 20  more defensive, 
2f090 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 6f  the .      ** do
2f0a0 20 6c 6f 6f 70 20 63 61 6e 20 6e 6f 74 20 62 65   loop can not be
2f0b0 20 77 72 69 74 74 65 6e 3a 0a 20 20 20 20 20 20   written:.      
2f0c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 64 6f  **.      **   do
2f0d0 20 7b 2e 2e 2e 7d 20 77 68 69 6c 65 28 20 70 52   {...} while( pR
2f0e0 6f 6f 74 2d 3e 69 44 6f 63 69 64 3c 69 44 6f 63  oot->iDocid<iDoc
2f0f0 69 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  id && rc==SQLITE
2f100 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  _OK );.      */.
2f110 20 20 20 20 20 20 66 74 73 33 45 76 61 6c 52 65        fts3EvalRe
2f120 73 74 61 72 74 28 70 43 73 72 2c 20 70 52 6f 6f  start(pCsr, pRoo
2f130 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 64  t, &rc);.      d
2f140 6f 20 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33  o {.        fts3
2f150 45 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72  EvalNextRow(pCsr
2f160 2c 20 70 52 6f 6f 74 2c 20 26 72 63 29 3b 0a 20  , pRoot, &rc);. 
2f170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f180 52 6f 6f 74 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  Root->bEof==0 );
2f190 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70  .      }while( p
2f1a0 52 6f 6f 74 2d 3e 69 44 6f 63 69 64 21 3d 69 44  Root->iDocid!=iD
2f1b0 6f 63 69 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  ocid && rc==SQLI
2f1c0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20  TE_OK );.    }. 
2f1d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2f1f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
2f200 79 20 74 68 65 20 6d 61 74 63 68 69 6e 66 6f 28  y the matchinfo(
2f210 29 20 6d 6f 64 75 6c 65 20 74 6f 20 71 75 65 72  ) module to quer
2f220 79 20 61 20 70 68 72 61 73 65 20 0a 2a 2a 20 65  y a phrase .** e
2f230 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
2f240 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
2f250 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a   information:.**
2f260 0a 2a 2a 20 20 20 31 2e 20 54 68 65 20 74 6f 74  .**   1. The tot
2f270 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 63 63  al number of occ
2f280 75 72 72 65 6e 63 65 73 20 6f 66 20 74 68 65 20  urrences of the 
2f290 70 68 72 61 73 65 20 69 6e 20 65 61 63 68 20 63  phrase in each c
2f2a0 6f 6c 75 6d 6e 20 6f 66 20 0a 2a 2a 20 20 20 20  olumn of .**    
2f2b0 20 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 20    the FTS table 
2f2c0 28 63 6f 6e 73 69 64 65 72 69 6e 67 20 61 6c 6c  (considering all
2f2d0 20 72 6f 77 73 29 2c 20 61 6e 64 0a 2a 2a 0a 2a   rows), and.**.*
2f2e0 2a 20 20 20 32 2e 20 46 6f 72 20 65 61 63 68 20  *   2. For each 
2f2f0 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6e 75 6d 62  column, the numb
2f300 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
2f310 65 20 74 61 62 6c 65 20 66 6f 72 20 77 68 69 63  e table for whic
2f320 68 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 63 6f  h the.**      co
2f330 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 74  lumn contains at
2f340 20 6c 65 61 73 74 20 6f 6e 65 20 69 6e 73 74 61   least one insta
2f350 6e 63 65 20 6f 66 20 74 68 65 20 70 68 72 61 73  nce of the phras
2f360 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  e..**.** If no e
2f370 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
2f380 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2f390 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f3a0 73 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  s for each colum
2f3b0 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74  n.** written int
2f3c0 6f 20 74 68 65 20 61 72 72 61 79 20 61 69 4f 75  o the array aiOu
2f3d0 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  t as follows:.**
2f3e0 0a 2a 2a 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c  .**   aiOut[iCol
2f3f0 2a 33 20 2b 20 31 5d 20 3d 20 4e 75 6d 62 65 72  *3 + 1] = Number
2f400 20 6f 66 20 6f 63 63 75 72 72 65 6e 63 65 73 0a   of occurrences.
2f410 2a 2a 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a  **   aiOut[iCol*
2f420 33 20 2b 20 32 5d 20 3d 20 4e 75 6d 62 65 72 20  3 + 2] = Number 
2f430 6f 66 20 72 6f 77 73 20 63 6f 6e 74 61 69 6e 69  of rows containi
2f440 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ng at least one 
2f450 69 6e 73 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 43  instance.**.** C
2f460 61 76 65 61 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  aveats:.**.**   
2f470 2a 20 49 66 20 61 20 70 68 72 61 73 65 20 63 6f  * If a phrase co
2f480 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
2f490 6f 66 20 64 65 66 65 72 72 65 64 20 74 6f 6b 65  of deferred toke
2f4a0 6e 73 2c 20 74 68 65 6e 20 61 6c 6c 20 6f 75 74  ns, then all out
2f4b0 70 75 74 20 0a 2a 2a 20 20 20 20 20 76 61 6c 75  put .**     valu
2f4c0 65 73 20 61 72 65 20 73 65 74 20 74 6f 20 74 68  es are set to th
2f4d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 6f 63 75  e number of docu
2f4e0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74 61 62  ments in the tab
2f4f0 6c 65 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  le. In other.** 
2f500 20 20 20 20 77 6f 72 64 73 20 77 65 20 61 73 73      words we ass
2f510 75 6d 65 20 74 68 61 74 20 76 65 72 79 20 63 6f  ume that very co
2f520 6d 6d 6f 6e 20 74 6f 6b 65 6e 73 20 6f 63 63 75  mmon tokens occu
2f530 72 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 69  r exactly once i
2f540 6e 20 65 61 63 68 20 0a 2a 2a 20 20 20 20 20 63  n each .**     c
2f550 6f 6c 75 6d 6e 20 6f 66 20 65 61 63 68 20 72 6f  olumn of each ro
2f560 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  w of the table..
2f570 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 61 20 70  **.**   * If a p
2f580 68 72 61 73 65 20 63 6f 6e 74 61 69 6e 73 20 73  hrase contains s
2f590 6f 6d 65 20 64 65 66 65 72 72 65 64 20 74 6f 6b  ome deferred tok
2f5a0 65 6e 73 20 28 61 6e 64 20 73 6f 6d 65 20 6e 6f  ens (and some no
2f5b0 6e 2d 64 65 66 65 72 72 65 64 20 0a 2a 2a 20 20  n-deferred .**  
2f5c0 20 20 20 74 6f 6b 65 6e 73 29 2c 20 63 6f 75 6e     tokens), coun
2f5d0 74 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  t the potential 
2f5e0 6f 63 63 75 72 72 65 6e 63 65 20 69 64 65 6e 74  occurrence ident
2f5f0 69 66 69 65 64 20 62 79 20 63 6f 6e 73 69 64 65  ified by conside
2f600 72 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  ring.**     the 
2f610 6e 6f 6e 2d 64 65 66 65 72 72 65 64 20 74 6f 6b  non-deferred tok
2f620 65 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ens instead of a
2f630 63 74 75 61 6c 20 70 68 72 61 73 65 20 6f 63 63  ctual phrase occ
2f640 75 72 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  urrences..**.** 
2f650 20 20 2a 20 49 66 20 74 68 65 20 70 68 72 61 73    * If the phras
2f660 65 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 4e  e is part of a N
2f670 45 41 52 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  EAR expression, 
2f680 74 68 65 6e 20 6f 6e 6c 79 20 70 68 72 61 73 65  then only phrase
2f690 20 69 6e 73 74 61 6e 63 65 73 0a 2a 2a 20 20 20   instances.**   
2f6a0 20 20 74 68 61 74 20 6d 65 65 74 20 74 68 65 20    that meet the 
2f6b0 4e 45 41 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  NEAR constraint 
2f6c0 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  are included in 
2f6d0 74 68 65 20 63 6f 75 6e 74 73 2e 0a 2a 2f 0a 69  the counts..*/.i
2f6e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 45 76  nt sqlite3Fts3Ev
2f6f0 61 6c 50 68 72 61 73 65 53 74 61 74 73 28 0a 20  alPhraseStats(. 
2f700 20 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 73   Fts3Cursor *pCs
2f710 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2f720 20 2f 2a 20 46 54 53 20 63 75 72 73 6f 72 20 68   /* FTS cursor h
2f730 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 45  andle */.  Fts3E
2f740 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
2f750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 68             /* Ph
2f760 72 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  rase expression 
2f770 2a 2f 0a 20 20 75 33 32 20 2a 61 69 4f 75 74 20  */.  u32 *aiOut 
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f790 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 74 6f       /* Array to
2f7a0 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 69   write results i
2f7b0 6e 74 6f 20 28 73 65 65 20 61 62 6f 76 65 29 20  nto (see above) 
2f7c0 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 54 61 62 6c  */.){.  Fts3Tabl
2f7d0 65 20 2a 70 54 61 62 20 3d 20 28 46 74 73 33 54  e *pTab = (Fts3T
2f7e0 61 62 6c 65 20 2a 29 70 43 73 72 2d 3e 62 61 73  able *)pCsr->bas
2f7f0 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72  e.pVtab;.  int r
2f800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f810 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 69 66   int iCol;..  if
2f820 28 20 70 45 78 70 72 2d 3e 62 44 65 66 65 72 72  ( pExpr->bDeferr
2f830 65 64 20 26 26 20 70 45 78 70 72 2d 3e 70 50 61  ed && pExpr->pPa
2f840 72 65 6e 74 2d 3e 65 54 79 70 65 21 3d 46 54 53  rent->eType!=FTS
2f850 51 55 45 52 59 5f 4e 45 41 52 20 29 7b 0a 20 20  QUERY_NEAR ){.  
2f860 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
2f870 6e 44 6f 63 3e 30 20 29 3b 0a 20 20 20 20 66 6f  nDoc>0 );.    fo
2f880 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
2f890 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43  Tab->nColumn; iC
2f8a0 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 69 4f  ol++){.      aiO
2f8b0 75 74 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 20 3d  ut[iCol*3 + 1] =
2f8c0 20 28 75 33 32 29 70 43 73 72 2d 3e 6e 44 6f 63   (u32)pCsr->nDoc
2f8d0 3b 0a 20 20 20 20 20 20 61 69 4f 75 74 5b 69 43  ;.      aiOut[iC
2f8e0 6f 6c 2a 33 20 2b 20 32 5d 20 3d 20 28 75 33 32  ol*3 + 2] = (u32
2f8f0 29 70 43 73 72 2d 3e 6e 44 6f 63 3b 0a 20 20 20  )pCsr->nDoc;.   
2f900 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2f910 72 63 20 3d 20 66 74 73 33 45 76 61 6c 47 61 74  rc = fts3EvalGat
2f920 68 65 72 53 74 61 74 73 28 70 43 73 72 2c 20 70  herStats(pCsr, p
2f930 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 72  Expr);.    if( r
2f940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2f960 78 70 72 2d 3e 61 4d 49 20 29 3b 0a 20 20 20 20  xpr->aMI );.    
2f970 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
2f980 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pTab->nColumn
2f990 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
2f9a0 20 20 20 61 69 4f 75 74 5b 69 43 6f 6c 2a 33 20     aiOut[iCol*3 
2f9b0 2b 20 31 5d 20 3d 20 70 45 78 70 72 2d 3e 61 4d  + 1] = pExpr->aM
2f9c0 49 5b 69 43 6f 6c 2a 33 20 2b 20 31 5d 3b 0a 20  I[iCol*3 + 1];. 
2f9d0 20 20 20 20 20 20 20 61 69 4f 75 74 5b 69 43 6f         aiOut[iCo
2f9e0 6c 2a 33 20 2b 20 32 5d 20 3d 20 70 45 78 70 72  l*3 + 2] = pExpr
2f9f0 2d 3e 61 4d 49 5b 69 43 6f 6c 2a 33 20 2b 20 32  ->aMI[iCol*3 + 2
2fa00 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
2fa10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2fa20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2fa30 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
2fa40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2fa50 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
2fa60 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
2fa70 2a 2a 20 6d 75 73 74 20 62 65 20 6f 66 20 74 79  ** must be of ty
2fa80 70 65 20 46 54 53 51 55 45 52 59 5f 50 48 52 41  pe FTSQUERY_PHRA
2fa90 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  SE. .**.** The r
2faa0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
2fab0 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
2fac0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
2fad0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2fae0 0a 2a 2a 20 61 20 70 6f 73 69 74 69 6f 6e 2d 6c  .** a position-l
2faf0 69 73 74 20 69 6e 64 69 63 61 74 69 6e 67 20 74  ist indicating t
2fb00 68 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  he occurrences o
2fb10 66 20 74 68 65 20 70 68 72 61 73 65 20 69 6e 20  f the phrase in 
2fb20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 6f  column iCol.** o
2fb30 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
2fb40 77 2e 20 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  w. .**.** More s
2fb50 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
2fb60 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65 72   returned buffer
2fb70 20 63 6f 6e 74 61 69 6e 73 20 31 20 76 61 72 69   contains 1 vari
2fb80 6e 74 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20  nt for each .** 
2fb90 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 74 68  occurrence of th
2fba0 65 20 70 68 72 61 73 65 20 69 6e 20 74 68 65 20  e phrase in the 
2fbb0 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 64 20 75  column, stored u
2fbc0 73 69 6e 67 20 74 68 65 20 6e 6f 72 6d 61 6c 20  sing the normal 
2fbd0 28 64 65 6c 74 61 2b 32 29 20 0a 2a 2a 20 63 6f  (delta+2) .** co
2fbe0 6d 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 73  mpression and is
2fbf0 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 65   terminated by e
2fc00 69 74 68 65 72 20 61 6e 20 30 78 30 31 20 6f 72  ither an 0x01 or
2fc10 20 30 78 30 30 20 62 79 74 65 2e 20 46 6f 72 20   0x00 byte. For 
2fc20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 66 20 74  example,.** if t
2fc30 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
2fc40 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 22 61 20  umn contains "a 
2fc50 62 20 58 20 63 20 64 20 58 20 58 22 20 61 6e 64  b X c d X X" and
2fc60 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
2fc70 73 74 0a 2a 2a 20 66 6f 72 20 27 58 27 20 69 73  st.** for 'X' is
2fc80 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20   requested, the 
2fc90 62 75 66 66 65 72 20 72 65 74 75 72 6e 65 64 20  buffer returned 
2fca0 6d 61 79 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a  may contain:.**.
2fcb0 2a 2a 20 20 20 20 20 30 78 30 34 20 30 78 30 35  **     0x04 0x05
2fcc0 20 30 78 30 33 20 30 78 30 31 20 20 20 6f 72 20   0x03 0x01   or 
2fcd0 20 20 30 78 30 34 20 30 78 30 35 20 30 78 30 33    0x04 0x05 0x03
2fce0 20 30 78 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73   0x00.**.** This
2fcf0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
2fd00 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
2fd10 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2fd20 20 70 68 72 61 73 65 20 69 73 20 64 65 66 65 72   phrase is defer
2fd30 72 65 64 2c 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  red,.** incremen
2fd40 74 61 6c 2c 20 6f 72 20 6e 65 69 74 68 65 72 2e  tal, or neither.
2fd50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2fd60 74 73 33 45 76 61 6c 50 68 72 61 73 65 50 6f 73  ts3EvalPhrasePos
2fd70 6c 69 73 74 28 0a 20 20 46 74 73 33 43 75 72 73  list(.  Fts3Curs
2fd80 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
2fd90 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20          /* FTS3 
2fda0 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  cursor object */
2fdb0 0a 20 20 46 74 73 33 45 78 70 72 20 2a 70 45 78  .  Fts3Expr *pEx
2fdc0 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
2fdd0 20 20 20 2f 2a 20 50 68 72 61 73 65 20 74 6f 20     /* Phrase to 
2fde0 72 65 74 75 72 6e 20 64 6f 63 6c 69 73 74 20 66  return doclist f
2fdf0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2fe00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fe10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
2fe20 6e 20 74 6f 20 72 65 74 75 72 6e 20 70 6f 73 69  n to return posi
2fe30 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 2a 2f  tion list for */
2fe40 0a 20 20 63 68 61 72 20 2a 2a 70 70 4f 75 74 20  .  char **ppOut 
2fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe60 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
2fe70 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  er to position l
2fe80 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33  ist */.){.  Fts3
2fe90 50 68 72 61 73 65 20 2a 70 50 68 72 61 73 65 20  Phrase *pPhrase 
2fea0 3d 20 70 45 78 70 72 2d 3e 70 50 68 72 61 73 65  = pExpr->pPhrase
2feb0 3b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70  ;.  Fts3Table *p
2fec0 54 61 62 20 3d 20 28 46 74 73 33 54 61 62 6c 65  Tab = (Fts3Table
2fed0 20 2a 29 70 43 73 72 2d 3e 62 61 73 65 2e 70 56   *)pCsr->base.pV
2fee0 74 61 62 3b 0a 20 20 63 68 61 72 20 2a 70 49 74  tab;.  char *pIt
2fef0 65 72 3b 0a 20 20 69 6e 74 20 69 54 68 69 73 3b  er;.  int iThis;
2ff00 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2ff10 20 69 44 6f 63 69 64 3b 0a 0a 20 20 2f 2a 20 49   iDocid;..  /* I
2ff20 66 20 74 68 69 73 20 70 68 72 61 73 65 20 69 73  f this phrase is
2ff30 20 61 70 70 6c 69 65 73 20 73 70 65 63 69 66 69   applies specifi
2ff40 63 61 6c 6c 79 20 74 6f 20 73 6f 6d 65 20 63 6f  cally to some co
2ff50 6c 75 6d 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  lumn other than 
2ff60 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  .  ** column iCo
2ff70 6c 2c 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c  l, return a NULL
2ff80 20 70 6f 69 6e 74 65 72 2e 20 20 2a 2f 0a 20 20   pointer.  */.  
2ff90 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 61 73  *ppOut = 0;.  as
2ffa0 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
2ffb0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
2ffc0 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 28 70 50  umn );.  if( (pP
2ffd0 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  hrase->iColumn<p
2ffe0 54 61 62 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  Tab->nColumn && 
2fff0 70 50 68 72 61 73 65 2d 3e 69 43 6f 6c 75 6d 6e  pPhrase->iColumn
30000 21 3d 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 72  !=iCol) ){.    r
30010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30020 0a 20 20 7d 0a 0a 20 20 69 44 6f 63 69 64 20 3d  .  }..  iDocid =
30030 20 70 45 78 70 72 2d 3e 69 44 6f 63 69 64 3b 0a   pExpr->iDocid;.
30040 20 20 70 49 74 65 72 20 3d 20 70 50 68 72 61 73    pIter = pPhras
30050 65 2d 3e 64 6f 63 6c 69 73 74 2e 70 4c 69 73 74  e->doclist.pList
30060 3b 0a 20 20 69 66 28 20 69 44 6f 63 69 64 21 3d  ;.  if( iDocid!=
30070 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20 7c 7c  pCsr->iPrevId ||
30080 20 70 45 78 70 72 2d 3e 62 45 6f 66 20 29 7b 0a   pExpr->bEof ){.
30090 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
300a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
300b0 62 44 65 73 63 44 6f 63 6c 69 73 74 20 3d 20 70  bDescDoclist = p
300c0 54 61 62 2d 3e 62 44 65 73 63 49 64 78 3b 20 20  Tab->bDescIdx;  
300d0 20 20 20 20 2f 2a 20 46 6f 72 20 44 4f 43 49 44      /* For DOCID
300e0 5f 43 4d 50 20 6d 61 63 72 6f 20 2a 2f 0a 20 20  _CMP macro */.  
300f0 20 20 69 6e 74 20 62 4f 72 20 3d 20 30 3b 0a 20    int bOr = 0;. 
30100 20 20 20 75 38 20 62 54 72 65 65 45 6f 66 20 3d     u8 bTreeEof =
30110 20 30 3b 0a 20 20 20 20 46 74 73 33 45 78 70 72   0;.    Fts3Expr
30120 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
30130 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
30140 20 69 74 65 72 61 74 65 20 66 72 6f 6d 20 70 45   iterate from pE
30150 78 70 72 20 74 6f 20 72 6f 6f 74 20 2a 2f 0a 20  xpr to root */. 
30160 20 20 20 46 74 73 33 45 78 70 72 20 2a 70 4e 65     Fts3Expr *pNe
30170 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
30180 20 2f 2a 20 4d 6f 73 74 20 73 65 6e 69 6f 72 20   /* Most senior 
30190 4e 45 41 52 20 61 6e 63 65 73 74 6f 72 20 28 6f  NEAR ancestor (o
301a0 72 20 70 45 78 70 72 29 20 2a 2f 0a 20 20 20 20  r pExpr) */.    
301b0 69 6e 74 20 62 4d 61 74 63 68 3b 0a 0a 20 20 20  int bMatch;..   
301c0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
301d0 73 20 70 68 72 61 73 65 20 64 65 73 63 65 6e 64  s phrase descend
301e0 73 20 66 72 6f 6d 20 61 6e 20 4f 52 20 65 78 70  s from an OR exp
301f0 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 20 49 66  ression node. If
30200 20 6e 6f 74 2c 20 0a 20 20 20 20 2a 2a 20 72 65   not, .    ** re
30210 74 75 72 6e 20 4e 55 4c 4c 2e 20 4f 74 68 65 72  turn NULL. Other
30220 77 69 73 65 2c 20 74 68 65 20 65 6e 74 72 79 20  wise, the entry 
30230 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
30240 20 74 6f 20 64 6f 63 69 64 20 0a 20 20 20 20 2a   to docid .    *
30250 2a 20 70 43 73 72 2d 3e 69 50 72 65 76 49 64 20  * pCsr->iPrevId 
30260 6d 61 79 20 6c 69 65 20 65 61 72 6c 69 65 72 20  may lie earlier 
30270 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 62  in the doclist b
30280 75 66 66 65 72 2e 20 4f 72 2c 20 69 66 20 74 68  uffer. Or, if th
30290 65 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 74 68  e.    ** tree th
302a0 61 74 20 74 68 65 20 6e 6f 64 65 20 69 73 20 70  at the node is p
302b0 61 72 74 20 6f 66 20 68 61 73 20 62 65 65 6e 20  art of has been 
302c0 6d 61 72 6b 65 64 20 61 73 20 45 4f 46 2c 20 62  marked as EOF, b
302d0 75 74 20 74 68 65 20 6e 6f 64 65 0a 20 20 20 20  ut the node.    
302e0 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
302f0 20 45 4f 46 2c 20 74 68 65 6e 20 69 74 20 6d 61   EOF, then it ma
30300 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 61  y point to an ea
30310 72 6c 69 65 72 20 65 6e 74 72 79 2e 20 2a 2f 0a  rlier entry. */.
30320 20 20 20 20 70 4e 65 61 72 20 3d 20 70 45 78 70      pNear = pExp
30330 72 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 45 78  r;.    for(p=pEx
30340 70 72 2d 3e 70 50 61 72 65 6e 74 3b 20 70 3b 20  pr->pParent; p; 
30350 70 3d 70 2d 3e 70 50 61 72 65 6e 74 29 7b 0a 20  p=p->pParent){. 
30360 20 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70       if( p->eTyp
30370 65 3d 3d 46 54 53 51 55 45 52 59 5f 4f 52 20 29  e==FTSQUERY_OR )
30380 20 62 4f 72 20 3d 20 31 3b 0a 20 20 20 20 20 20   bOr = 1;.      
30390 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 46 54  if( p->eType==FT
303a0 53 51 55 45 52 59 5f 4e 45 41 52 20 29 20 70 4e  SQUERY_NEAR ) pN
303b0 65 61 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 69  ear = p;.      i
303c0 66 28 20 70 2d 3e 62 45 6f 66 20 29 20 62 54 72  f( p->bEof ) bTr
303d0 65 65 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  eeEof = 1;.    }
303e0 0a 20 20 20 20 69 66 28 20 62 4f 72 3d 3d 30 20  .    if( bOr==0 
303f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30400 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  OK;..    /* This
30410 20 69 73 20 74 68 65 20 64 65 73 63 65 6e 64 65   is the descende
30420 6e 74 20 6f 66 20 61 6e 20 4f 52 20 6e 6f 64 65  nt of an OR node
30430 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
30440 65 20 63 61 6e 6e 6f 74 20 75 73 65 0a 20 20 20  e cannot use.   
30450 20 2a 2a 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   ** an increment
30460 61 6c 20 70 68 72 61 73 65 2e 20 4c 6f 61 64 20  al phrase. Load 
30470 74 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  the entire docli
30480 73 74 20 66 6f 72 20 74 68 65 20 70 68 72 61 73  st for the phras
30490 65 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 6d 65  e.    ** into me
304a0 6d 6f 72 79 20 69 6e 20 74 68 69 73 20 63 61 73  mory in this cas
304b0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  e.  */.    if( p
304c0 50 68 72 61 73 65 2d 3e 62 49 6e 63 72 20 29 7b  Phrase->bIncr ){
304d0 0a 20 20 20 20 20 20 69 6e 74 20 62 45 6f 66 53  .      int bEofS
304e0 61 76 65 20 3d 20 70 4e 65 61 72 2d 3e 62 45 6f  ave = pNear->bEo
304f0 66 3b 0a 20 20 20 20 20 20 66 74 73 33 45 76 61  f;.      fts3Eva
30500 6c 52 65 73 74 61 72 74 28 70 43 73 72 2c 20 70  lRestart(pCsr, p
30510 4e 65 61 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  Near, &rc);.    
30520 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
30530 49 54 45 5f 4f 4b 20 26 26 20 21 70 4e 65 61 72  ITE_OK && !pNear
30540 2d 3e 62 45 6f 66 20 29 7b 0a 20 20 20 20 20 20  ->bEof ){.      
30550 20 20 66 74 73 33 45 76 61 6c 4e 65 78 74 52 6f    fts3EvalNextRo
30560 77 28 70 43 73 72 2c 20 70 4e 65 61 72 2c 20 26  w(pCsr, pNear, &
30570 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
30580 20 62 45 6f 66 53 61 76 65 3d 3d 30 20 26 26 20   bEofSave==0 && 
30590 70 4e 65 61 72 2d 3e 69 44 6f 63 69 64 3d 3d 69  pNear->iDocid==i
305a0 44 6f 63 69 64 20 29 20 62 72 65 61 6b 3b 0a 20  Docid ) break;. 
305b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
305c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
305d0 4f 4b 20 7c 7c 20 70 50 68 72 61 73 65 2d 3e 62  OK || pPhrase->b
305e0 49 6e 63 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Incr==0 );.    }
305f0 0a 20 20 20 20 69 66 28 20 62 54 72 65 65 45 6f  .    if( bTreeEo
30600 66 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  f ){.      while
30610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30620 26 26 20 21 70 4e 65 61 72 2d 3e 62 45 6f 66 20  && !pNear->bEof 
30630 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 33 45  ){.        fts3E
30640 76 61 6c 4e 65 78 74 52 6f 77 28 70 43 73 72 2c  valNextRow(pCsr,
30650 20 70 4e 65 61 72 2c 20 26 72 63 29 3b 0a 20 20   pNear, &rc);.  
30660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
30670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30680 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
30690 20 20 20 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a      bMatch = 1;.
306a0 20 20 20 20 66 6f 72 28 70 3d 70 4e 65 61 72 3b      for(p=pNear;
306b0 20 70 3b 20 70 3d 70 2d 3e 70 4c 65 66 74 29 7b   p; p=p->pLeft){
306c0 0a 20 20 20 20 20 20 75 38 20 62 45 6f 66 20 3d  .      u8 bEof =
306d0 20 30 3b 0a 20 20 20 20 20 20 46 74 73 33 45 78   0;.      Fts3Ex
306e0 70 72 20 2a 70 54 65 73 74 20 3d 20 70 3b 0a 20  pr *pTest = p;. 
306f0 20 20 20 20 20 46 74 73 33 50 68 72 61 73 65 20       Fts3Phrase 
30700 2a 70 50 68 3b 0a 20 20 20 20 20 20 61 73 73 65  *pPh;.      asse
30710 72 74 28 20 70 54 65 73 74 2d 3e 65 54 79 70 65  rt( pTest->eType
30720 3d 3d 46 54 53 51 55 45 52 59 5f 4e 45 41 52 20  ==FTSQUERY_NEAR 
30730 7c 7c 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d  || pTest->eType=
30740 3d 46 54 53 51 55 45 52 59 5f 50 48 52 41 53 45  =FTSQUERY_PHRASE
30750 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
30760 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46 54 53 51  est->eType==FTSQ
30770 55 45 52 59 5f 4e 45 41 52 20 29 20 70 54 65 73  UERY_NEAR ) pTes
30780 74 20 3d 20 70 54 65 73 74 2d 3e 70 52 69 67 68  t = pTest->pRigh
30790 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
307a0 20 70 54 65 73 74 2d 3e 65 54 79 70 65 3d 3d 46   pTest->eType==F
307b0 54 53 51 55 45 52 59 5f 50 48 52 41 53 45 20 29  TSQUERY_PHRASE )
307c0 3b 0a 20 20 20 20 20 20 70 50 68 20 3d 20 70 54  ;.      pPh = pT
307d0 65 73 74 2d 3e 70 50 68 72 61 73 65 3b 0a 0a 20  est->pPhrase;.. 
307e0 20 20 20 20 20 70 49 74 65 72 20 3d 20 70 50 68       pIter = pPh
307f0 2d 3e 70 4f 72 50 6f 73 6c 69 73 74 3b 0a 20 20  ->pOrPoslist;.  
30800 20 20 20 20 69 44 6f 63 69 64 20 3d 20 70 50 68      iDocid = pPh
30810 2d 3e 69 4f 72 44 6f 63 69 64 3b 0a 20 20 20 20  ->iOrDocid;.    
30820 20 20 69 66 28 20 70 43 73 72 2d 3e 62 44 65 73    if( pCsr->bDes
30830 63 3d 3d 62 44 65 73 63 44 6f 63 6c 69 73 74 20  c==bDescDoclist 
30840 29 7b 0a 20 20 20 20 20 20 20 20 62 45 6f 66 20  ){.        bEof 
30850 3d 20 21 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e  = !pPh->doclist.
30860 6e 41 6c 6c 20 7c 7c 0a 20 20 20 20 20 20 20 20  nAll ||.        
30870 20 20 28 70 49 74 65 72 20 3e 3d 20 28 70 50 68    (pIter >= (pPh
30880 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 20 2b  ->doclist.aAll +
30890 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e 41   pPh->doclist.nA
308a0 6c 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ll));.        wh
308b0 69 6c 65 28 20 28 70 49 74 65 72 3d 3d 30 20 7c  ile( (pIter==0 |
308c0 7c 20 44 4f 43 49 44 5f 43 4d 50 28 69 44 6f 63  | DOCID_CMP(iDoc
308d0 69 64 2c 20 70 43 73 72 2d 3e 69 50 72 65 76 49  id, pCsr->iPrevI
308e0 64 29 3c 30 20 29 20 26 26 20 62 45 6f 66 3d 3d  d)<0 ) && bEof==
308f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
30900 71 6c 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73  qlite3Fts3Doclis
30910 74 4e 65 78 74 28 0a 20 20 20 20 20 20 20 20 20  tNext(.         
30920 20 20 20 20 20 62 44 65 73 63 44 6f 63 6c 69 73       bDescDoclis
30930 74 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e  t, pPh->doclist.
30940 61 41 6c 6c 2c 20 70 50 68 2d 3e 64 6f 63 6c 69  aAll, pPh->docli
30950 73 74 2e 6e 41 6c 6c 2c 20 0a 20 20 20 20 20 20  st.nAll, .      
30960 20 20 20 20 20 20 20 20 26 70 49 74 65 72 2c 20          &pIter, 
30970 26 69 44 6f 63 69 64 2c 20 26 62 45 6f 66 0a 20  &iDocid, &bEof. 
30980 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
30990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
309a0 65 7b 0a 20 20 20 20 20 20 20 20 62 45 6f 66 20  e{.        bEof 
309b0 3d 20 21 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e  = !pPh->doclist.
309c0 6e 41 6c 6c 20 7c 7c 20 28 70 49 74 65 72 20 26  nAll || (pIter &
309d0 26 20 70 49 74 65 72 3c 3d 70 50 68 2d 3e 64 6f  & pIter<=pPh->do
309e0 63 6c 69 73 74 2e 61 41 6c 6c 29 3b 0a 20 20 20  clist.aAll);.   
309f0 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 49 74       while( (pIt
30a00 65 72 3d 3d 30 20 7c 7c 20 44 4f 43 49 44 5f 43  er==0 || DOCID_C
30a10 4d 50 28 69 44 6f 63 69 64 2c 20 70 43 73 72 2d  MP(iDocid, pCsr-
30a20 3e 69 50 72 65 76 49 64 29 3e 30 20 29 20 26 26  >iPrevId)>0 ) &&
30a30 20 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20   bEof==0 ){.    
30a40 20 20 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b        int dummy;
30a50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
30a60 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50 72 65  e3Fts3DoclistPre
30a70 76 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v(.             
30a80 20 62 44 65 73 63 44 6f 63 6c 69 73 74 2c 20 70   bDescDoclist, p
30a90 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c  Ph->doclist.aAll
30aa0 2c 20 70 50 68 2d 3e 64 6f 63 6c 69 73 74 2e 6e  , pPh->doclist.n
30ab0 41 6c 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  All, .          
30ac0 20 20 20 20 26 70 49 74 65 72 2c 20 26 69 44 6f      &pIter, &iDo
30ad0 63 69 64 2c 20 26 64 75 6d 6d 79 2c 20 26 62 45  cid, &dummy, &bE
30ae0 6f 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  of.             
30af0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
30b00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 68 2d      }.      pPh-
30b10 3e 70 4f 72 50 6f 73 6c 69 73 74 20 3d 20 70 49  >pOrPoslist = pI
30b20 74 65 72 3b 0a 20 20 20 20 20 20 70 50 68 2d 3e  ter;.      pPh->
30b30 69 4f 72 44 6f 63 69 64 20 3d 20 69 44 6f 63 69  iOrDocid = iDoci
30b40 64 3b 0a 20 20 20 20 20 20 69 66 28 20 62 45 6f  d;.      if( bEo
30b50 66 20 7c 7c 20 69 44 6f 63 69 64 21 3d 70 43 73  f || iDocid!=pCs
30b60 72 2d 3e 69 50 72 65 76 49 64 20 29 20 62 4d 61  r->iPrevId ) bMa
30b70 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tch = 0;.    }..
30b80 20 20 20 20 69 66 28 20 62 4d 61 74 63 68 20 29      if( bMatch )
30b90 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  {.      pIter = 
30ba0 70 50 68 72 61 73 65 2d 3e 70 4f 72 50 6f 73 6c  pPhrase->pOrPosl
30bb0 69 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ist;.    }else{.
30bc0 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b        pIter = 0;
30bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
30be0 20 70 49 74 65 72 3d 3d 30 20 29 20 72 65 74 75   pIter==0 ) retu
30bf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
30c00 20 69 66 28 20 2a 70 49 74 65 72 3d 3d 30 78 30   if( *pIter==0x0
30c10 31 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2b 2b  1 ){.    pIter++
30c20 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 66  ;.    pIter += f
30c30 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts3GetVarint32(p
30c40 49 74 65 72 2c 20 26 69 54 68 69 73 29 3b 0a 20  Iter, &iThis);. 
30c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 68 69   }else{.    iThi
30c60 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  s = 0;.  }.  whi
30c70 6c 65 28 20 69 54 68 69 73 3c 69 43 6f 6c 20 29  le( iThis<iCol )
30c80 7b 0a 20 20 20 20 66 74 73 33 43 6f 6c 75 6d 6e  {.    fts3Column
30c90 6c 69 73 74 43 6f 70 79 28 30 2c 20 26 70 49 74  listCopy(0, &pIt
30ca0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 49  er);.    if( *pI
30cb0 74 65 72 3d 3d 30 78 30 30 20 29 20 72 65 74 75  ter==0x00 ) retu
30cc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30cd0 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 20 20 70    pIter++;.    p
30ce0 49 74 65 72 20 2b 3d 20 66 74 73 33 47 65 74 56  Iter += fts3GetV
30cf0 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 26  arint32(pIter, &
30d00 69 54 68 69 73 29 3b 0a 20 20 7d 0a 20 20 69 66  iThis);.  }.  if
30d10 28 20 2a 70 49 74 65 72 3d 3d 30 78 30 30 20 29  ( *pIter==0x00 )
30d20 7b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b  {.    pIter = 0;
30d30 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d  .  }..  *ppOut =
30d40 20 28 28 69 43 6f 6c 3d 3d 69 54 68 69 73 29 3f   ((iCol==iThis)?
30d50 70 49 74 65 72 3a 30 29 3b 0a 20 20 72 65 74 75  pIter:0);.  retu
30d60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30d70 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
30d80 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 74 68  components of th
30d90 65 20 46 74 73 33 50 68 72 61 73 65 20 73 74 72  e Fts3Phrase str
30da0 75 63 74 75 72 65 20 74 68 61 74 20 77 65 72 65  ucture that were
30db0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
30dc0 20 74 68 65 20 65 76 61 6c 20 6d 6f 64 75 6c 65   the eval module
30dd0 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  . Specifically, 
30de0 74 68 69 73 20 6d 65 61 6e 73 20 74 6f 20 66 72  this means to fr
30df0 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ee:.**.**   * th
30e00 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
30e10 68 72 61 73 65 2d 3e 64 6f 63 6c 69 73 74 2c 20  hrase->doclist, 
30e20 61 6e 64 0a 2a 2a 20 20 20 2a 20 61 6e 79 20 46  and.**   * any F
30e30 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65  ts3MultiSegReade
30e40 72 20 6f 62 6a 65 63 74 73 20 68 65 6c 64 20 62  r objects held b
30e50 79 20 70 68 72 61 73 65 20 74 6f 6b 65 6e 73 2e  y phrase tokens.
30e60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30e70 46 74 73 33 45 76 61 6c 50 68 72 61 73 65 43 6c  Fts3EvalPhraseCl
30e80 65 61 6e 75 70 28 46 74 73 33 50 68 72 61 73 65  eanup(Fts3Phrase
30e90 20 2a 70 50 68 72 61 73 65 29 7b 0a 20 20 69 66   *pPhrase){.  if
30ea0 28 20 70 50 68 72 61 73 65 20 29 7b 0a 20 20 20  ( pPhrase ){.   
30eb0 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
30ec0 74 65 33 5f 66 72 65 65 28 70 50 68 72 61 73 65  te3_free(pPhrase
30ed0 2d 3e 64 6f 63 6c 69 73 74 2e 61 41 6c 6c 29 3b  ->doclist.aAll);
30ee0 0a 20 20 20 20 66 74 73 33 45 76 61 6c 49 6e 76  .    fts3EvalInv
30ef0 61 6c 69 64 61 74 65 50 6f 73 6c 69 73 74 28 70  alidatePoslist(p
30f00 50 68 72 61 73 65 29 3b 0a 20 20 20 20 6d 65 6d  Phrase);.    mem
30f10 73 65 74 28 26 70 50 68 72 61 73 65 2d 3e 64 6f  set(&pPhrase->do
30f20 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  clist, 0, sizeof
30f30 28 46 74 73 33 44 6f 63 6c 69 73 74 29 29 3b 0a  (Fts3Doclist));.
30f40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30f50 50 68 72 61 73 65 2d 3e 6e 54 6f 6b 65 6e 3b 20  Phrase->nToken; 
30f60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 33  i++){.      fts3
30f70 53 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 46  SegReaderCursorF
30f80 72 65 65 28 70 50 68 72 61 73 65 2d 3e 61 54 6f  ree(pPhrase->aTo
30f90 6b 65 6e 5b 69 5d 2e 70 53 65 67 63 73 72 29 3b  ken[i].pSegcsr);
30fa0 0a 20 20 20 20 20 20 70 50 68 72 61 73 65 2d 3e  .      pPhrase->
30fb0 61 54 6f 6b 65 6e 5b 69 5d 2e 70 53 65 67 63 73  aToken[i].pSegcs
30fc0 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = 0;.    }.  }
30fd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
30fe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
30ff0 5f 56 54 41 42 2e 0a 2a 2f 0a 23 69 66 64 65 66  _VTAB..*/.#ifdef
31000 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
31010 74 20 73 71 6c 69 74 65 33 46 74 73 33 43 6f 72  t sqlite3Fts3Cor
31020 72 75 70 74 28 29 7b 0a 20 20 72 65 74 75 72 6e  rupt(){.  return
31030 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31040 56 54 41 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  VTAB;.}.#endif..
31050 23 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45  #if !SQLITE_CORE
31060 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
31070 65 20 41 50 49 20 70 6f 69 6e 74 65 72 20 74 61  e API pointer ta
31080 62 6c 65 2c 20 69 66 20 72 65 71 75 69 72 65 64  ble, if required
31090 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e  ..*/.#ifdef _WIN
310a0 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
310b0 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
310c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33  int sqlite3_fts3
310d0 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
310e0 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a   *db, .  char **
310f0 70 7a 45 72 72 4d 73 67 2c 0a 20 20 63 6f 6e 73  pzErrMsg,.  cons
31100 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31110 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
31120 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
31130 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 0a 20  ON_INIT2(pApi). 
31140 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46   return sqlite3F
31150 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23  ts3Init(db);.}.#
31160 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 0a        endif..#endif.